forked from micheleg/dash-to-dock
-
Notifications
You must be signed in to change notification settings - Fork 0
/
utils.js
123 lines (103 loc) · 3.22 KB
/
utils.js
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
const Clutter = imports.gi.Clutter;
const Lang = imports.lang;
const St = imports.gi.St;
/**
* Simplify global signals and function injections handling
* abstract class
*/
const BasicHandler = new Lang.Class({
Name: 'DashToDock.BasicHandler',
_init: function() {
this._storage = new Object();
},
add: function(/* unlimited 3-long array arguments */) {
// Convert arguments object to array, concatenate with generic
let args = Array.concat('generic', Array.slice(arguments));
// Call addWithLabel with ags as if they were passed arguments
this.addWithLabel.apply(this, args);
},
destroy: function() {
for( let label in this._storage )
this.removeWithLabel(label);
},
addWithLabel: function(label /* plus unlimited 3-long array arguments*/) {
if (this._storage[label] == undefined)
this._storage[label] = new Array();
// Skip first element of the arguments
for (let i = 1; i < arguments.length; i++) {
this._storage[label].push( this._create(arguments[i]));
}
},
removeWithLabel: function(label) {
if (this._storage[label]) {
for (let i = 0; i < this._storage[label].length; i++)
this._remove(this._storage[label][i]);
delete this._storage[label];
}
},
// Virtual methods to be implemented by subclass
/**
* Create single element to be stored in the storage structure
*/
_create: function(item) {
throw new Error('no implementation of _create in ' + this);
},
/**
* Correctly delete single element
*/
_remove: function(item) {
throw new Error('no implementation of _remove in ' + this);
}
});
/**
* Manage global signals
*/
const GlobalSignalsHandler = new Lang.Class({
Name: 'DashToDock.GlobalSignalHandler',
Extends: BasicHandler,
_create: function(item) {
let object = item[0];
let event = item[1];
let callback = item[2]
let id = object.connect(event, callback);
return [object, id];
},
_remove: function(item) {
item[0].disconnect(item[1]);
}
});
/**
* Manage function injection: both instances and prototype can be overridden
* and restored
*/
const InjectionsHandler = new Lang.Class({
Name: 'DashToDock.InjectionsHandler',
Extends: BasicHandler,
_create: function(item) {
let object = item[0];
let name = item[1];
let injectedFunction = item[2];
let original = object[name];
object[name] = injectedFunction;
return [object, name, injectedFunction, original];
},
_remove: function(item) {
let object = item[0];
let name = item[1];
let original = item[3];
object[name] = original;
}
});
/**
* Return the actual position reverseing left and right in rtl
*/
function getPosition(settings) {
let position = settings.get_enum('dock-position');
if (Clutter.get_default_text_direction() == Clutter.TextDirection.RTL) {
if (position == St.Side.LEFT)
position = St.Side.RIGHT;
else if (position == St.Side.RIGHT)
position = St.Side.LEFT;
}
return position;
}