-
Notifications
You must be signed in to change notification settings - Fork 860
Expand file tree
/
Copy pathpointerTracker.js
More file actions
123 lines (95 loc) · 3.6 KB
/
pointerTracker.js
File metadata and controls
123 lines (95 loc) · 3.6 KB
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
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const Gio = imports.gi.Gio;
const Main = imports.ui.main;
const Clutter = imports.gi.Clutter;
function PointerTracker(){
this._init();
}
PointerTracker.prototype = {
_init: function() {
let [lastPointerX, lastPointerY] = global.get_pointer();
this.hasMoved = function() {
let [pointerX, pointerY] = global.get_pointer();
try {
return !(pointerX == lastPointerX && pointerY == lastPointerY);
} finally {
[lastPointerX, lastPointerY] = [pointerX, pointerY];
}
};
this.getPosition = function() {
[lastPointerX, lastPointerY] = global.get_pointer();
return [lastPointerX, lastPointerY];
};
this.setPosition = function(x, y) {
let [pointerX, pointerY] = global.get_pointer();
const seat = Clutter.get_default_backend().get_default_seat();
seat.warp_pointer(Math.round(x), Math.round(y));
[lastPointerX, lastPointerY] = [pointerX, pointerY];
};
}
};
var PointerSwitcher = class {
constructor(wm) {
this.settings = new Gio.Settings({ schema_id: "org.cinnamon.desktop.keybindings" });
this.settings.connect("changed", (settings, key) => {
if (["pointer-next-monitor", "pointer-previous-monitor"].includes(key)) {
this.update_settings();
}
});
this.update_settings()
}
update_settings() {
Main.keybindingManager.addHotKeyArray(
"pointer-next-monitor",
this.settings.get_strv("pointer-next-monitor"),
() => this.next_monitor()
);
Main.keybindingManager.addHotKeyArray(
"pointer-previous-monitor",
this.settings.get_strv("pointer-previous-monitor"),
() => this.previous_monitor()
);
}
get_normalized_pointer_position_for_monitor(index) {
let [global_x, global_y, mods] = global.get_pointer();
const monitor = Main.layoutManager.monitors[index];
let rx = global_x - monitor.x;
let ry = global_y - monitor.y;
let nx = rx / monitor.width;
let ny = ry / monitor.height;
if (nx < 0 || nx > 1.0)
nx = 0.5;
if (ny < 0 || ny > 1.0)
ny = 0.5;
return [nx, ny];
}
get_real_pointer_position(index, nx, ny) {
const monitor = Main.layoutManager.monitors[index];
let real_x = (nx * monitor.width) + monitor.x;
let real_y = (ny * monitor.height) + monitor.y;
return [real_x, real_y];
}
next_monitor() {
const current = global.display.get_current_monitor();
const max = global.display.get_n_monitors() - 1;
const new_mon = current + 1 <= max ? current + 1 : 0;
this.move_from_to_monitor(current, new_mon);
}
previous_monitor() {
const current = global.display.get_current_monitor();
const max = global.display.get_n_monitors() - 1;
const new_mon = current - 1 >= 0 ? current - 1 : max;
this.move_from_to_monitor(current, new_mon);
}
move_from_to_monitor(from_i, to_i) {
const center = global.settings.get_boolean("center-warped-pointer")
let nx, ny;
if (global.settings.get_boolean("center-warped-pointer")) {
nx = ny = 0.5;
} else {
[nx, ny] = this.get_normalized_pointer_position_for_monitor(from_i);
}
let [x, y] = this.get_real_pointer_position(to_i, nx, ny);
global.set_pointer(x, y);
}
};