all repos — openbox @ b18e83e010a9dec95d42296751469aba0960bc5c

openbox fork - make it a bit more like ryudo

scripts/historyplacement.py (raw)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
##############################################################################
### The history window placement algorithm. ebind historyplacement.place   ###
### to the ob.EventAction.PlaceWindow event to use it.                     ###
##############################################################################

import windowplacement # fallback routines

##############################################################################
### Options for the historyplacement module:                               ###
###                                                                        ###
# fallback - The window placement algorithm that will be used when history ###
###          placement does not have a place for the window.               ###
fallback = windowplacement.random                                          ###
###                                                                        ###
# filename - The name of the file where history data will be stored. The   ###
###          number of the screen is appended onto this filename.          ###
filename = 'historydb'                                                     ###
###                                                                        ###
##############################################################################

import otk
import ob
import os
import string

_data = []

class _state:
    def __init__(self, appname, appclass, role, x, y):
        self.appname = appname
        self.appclass = appclass
        self.role = role
        self.x = x
        self.y = y
    def __eq__(self, other):
        if self.appname == other.appname and \
           self.appclass == other.appclass and \
           self.role == other.role:
            return 1
        return 0

def _load(data):
    file = open(os.environ['HOME']+'/.openbox/'+filename+"."+str(data.screen),
                'r')
    if file:
        print "loading: "
        # read data
        for line in file.readlines():
            line = line[:-1] # drop the '\n'
            try:
                print string.split(line, '\0')
                print line.count('\0')
                s = string.split(line, '\0')
                state = _state(s[0], s[1], s[2],
                               string.atoi(s[3]), string.atoi(s[4]))

                while len(_data)-1 < data.screen:
                    _data.append([])
                _data[data.screen].append(state)
                
                print "  "+s[0]+" "+s[1]+" "+s[2]
                print "     " + str(s[3]) + "," + str(s[4])
            except ValueError:
                print "ValueError"
                pass
            except IndexError:
                print "IndexError"
                pass
        print "DONE loading."
        file.close()

def _save(data):
    file = open(os.environ['HOME']+'/.openbox/'+filename+"."+str(data.screen),
                'w')
    if file:
        print "saving: "
        while len(_data)-1 < data.screen:
            _data.append([])
        for i in _data[data.screen]:
            file.write(i.appname + '\0' +
                       i.appclass + '\0' +
                       i.role + '\0' +
                       str(i.x) + '\0' +
                       str(i.y) + '\n')
            print "  "+i.appname+" "+i.appclass+" "+i.role
            print "     " + str(i.x) + "," + str(i.y)
        print "DONE saving."
        file.close()

def place(data):
    print "placing"
    if data.client:
        state = _state(data.client.appName(), data.client.appClass(),
                       data.client.role(), 0, 0)
        while len(_data)-1 < data.screen:
            _data.append([])
        print "looking for :"
        print "  " + state.appname
        print "  " + state.appclass
        print "  " + state.role
        try:
            i = _data[data.screen].index(state)
            print "got it"
            coords = _data[data.screen][i]
            print "Found in history ("+str(coords.x)+","+str(coords.y)+")"
            data.client.move(coords.x, coords.y)
        except ValueError:
            print "No match in history"
            fallback(data)

def _save_window(data):
    print "saving"
    if data.client:
        area = data.client.area()
        state = _state(data.client.appName(), data.client.appClass(),
                       data.client.role(), area.x(), area.y())
        while len(_data)-1 < data.screen:
            _data.append([])
        print "looking for :"
        print "  " + state.appname
        print "  " + state.appclass
        print "  " + state.role
        try:
            i = _data[data.screen].index(state)
            print "replacing"
            _data[data.screen][i] = state # replace it
        except ValueError:
            print "appending"
            _data[data.screen].append(state)

ob.ebind(ob.EventAction.CloseWindow, _save_window)
ob.ebind(ob.EventAction.Startup, _load)
ob.ebind(ob.EventAction.Shutdown, _save)

print "Loaded historyplacement.py"