Skip to content

Commit 5f86086

Browse files
committed
keybindings: Cleanup media-keys, allow better control over when
they're valid by using ActionModes.
1 parent 1568ae0 commit 5f86086

3 files changed

Lines changed: 98 additions & 59 deletions

File tree

js/ui/cinnamonDBus.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -446,7 +446,7 @@ CinnamonDBus.prototype = {
446446
},
447447

448448
ToggleKeyboard: function() {
449-
Main.virtualKeyboardManager.manualToggle();
449+
Main.toggleKeyboard();
450450
},
451451

452452
GetMonitors: function() {

js/ui/keybindings.js

Lines changed: 89 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -18,28 +18,84 @@ const CUSTOM_KEYS_SCHEMA = "org.cinnamon.desktop.keybindings.custom-keybinding";
1818

1919
const MEDIA_KEYS_SCHEMA = "org.cinnamon.desktop.keybindings.media-keys";
2020

21-
const REPEATABLE_MEDIA_KEYS = [
22-
MK.VOLUME_UP,
23-
MK.VOLUME_UP_QUIET,
24-
MK.VOLUME_DOWN,
25-
MK.VOLUME_DOWN_QUIET,
26-
MK.SCREEN_BRIGHTNESS_UP,
27-
MK.SCREEN_BRIGHTNESS_DOWN,
28-
MK.KEYBOARD_BRIGHTNESS_UP,
29-
MK.KEYBOARD_BRIGHTNESS_DOWN,
30-
MK.REWIND,
31-
MK.FORWARD,
21+
const MEDIA_KEYS = [
22+
// Volume/audio
23+
{ key: MK.MUTE, mode: Cinnamon.ActionMode.ALL },
24+
{ key: MK.MUTE_QUIET, mode: Cinnamon.ActionMode.ALL },
25+
{ key: MK.VOLUME_UP, mode: Cinnamon.ActionMode.ALL, repeatable: true },
26+
{ key: MK.VOLUME_UP_QUIET, mode: Cinnamon.ActionMode.ALL, repeatable: true },
27+
{ key: MK.VOLUME_DOWN, mode: Cinnamon.ActionMode.ALL, repeatable: true },
28+
{ key: MK.VOLUME_DOWN_QUIET, mode: Cinnamon.ActionMode.ALL, repeatable: true },
29+
{ key: MK.MIC_MUTE, mode: Cinnamon.ActionMode.ALL },
30+
31+
// Disc/media
32+
{ key: MK.EJECT, mode: Cinnamon.ActionMode.ALL },
33+
{ key: MK.MEDIA, mode: Cinnamon.ActionMode.ALL },
34+
35+
// Playback
36+
{ key: MK.PLAY, mode: Cinnamon.ActionMode.ALL },
37+
{ key: MK.PAUSE, mode: Cinnamon.ActionMode.ALL },
38+
{ key: MK.STOP, mode: Cinnamon.ActionMode.ALL },
39+
{ key: MK.PREVIOUS, mode: Cinnamon.ActionMode.ALL },
40+
{ key: MK.NEXT, mode: Cinnamon.ActionMode.ALL },
41+
{ key: MK.REWIND, mode: Cinnamon.ActionMode.ALL, repeatable: true },
42+
{ key: MK.FORWARD, mode: Cinnamon.ActionMode.ALL, repeatable: true },
43+
{ key: MK.REPEAT, mode: Cinnamon.ActionMode.ALL },
44+
{ key: MK.RANDOM, mode: Cinnamon.ActionMode.ALL },
45+
46+
// Screenshots
47+
{ key: MK.SCREENSHOT, mode: Cinnamon.ActionMode.ALL },
48+
{ key: MK.SCREENSHOT_CLIP, mode: Cinnamon.ActionMode.NORMAL },
49+
{ key: MK.WINDOW_SCREENSHOT, mode: Cinnamon.ActionMode.NORMAL },
50+
{ key: MK.WINDOW_SCREENSHOT_CLIP, mode: Cinnamon.ActionMode.NORMAL },
51+
{ key: MK.AREA_SCREENSHOT, mode: Cinnamon.ActionMode.NORMAL },
52+
{ key: MK.AREA_SCREENSHOT_CLIP, mode: Cinnamon.ActionMode.NORMAL },
53+
54+
// Touchpad
55+
{ key: MK.TOUCHPAD, mode: Cinnamon.ActionMode.NORMAL },
56+
{ key: MK.TOUCHPAD_ON, mode: Cinnamon.ActionMode.NORMAL },
57+
{ key: MK.TOUCHPAD_OFF, mode: Cinnamon.ActionMode.NORMAL },
58+
59+
// Session
60+
{ key: MK.LOGOUT, mode: Cinnamon.ActionMode.NORMAL },
61+
{ key: MK.SHUTDOWN, mode: Cinnamon.ActionMode.NORMAL },
62+
{ key: MK.SUSPEND, mode: Cinnamon.ActionMode.NORMAL },
63+
{ key: MK.HIBERNATE, mode: Cinnamon.ActionMode.NORMAL },
64+
{ key: MK.SCREENSAVER, mode: Cinnamon.ActionMode.NORMAL },
65+
66+
// App launchers
67+
{ key: MK.HOME, mode: Cinnamon.ActionMode.NORMAL },
68+
{ key: MK.CALCULATOR, mode: Cinnamon.ActionMode.NORMAL },
69+
{ key: MK.SEARCH, mode: Cinnamon.ActionMode.NORMAL },
70+
{ key: MK.EMAIL, mode: Cinnamon.ActionMode.NORMAL },
71+
{ key: MK.HELP, mode: Cinnamon.ActionMode.NORMAL },
72+
{ key: MK.TERMINAL, mode: Cinnamon.ActionMode.NORMAL },
73+
{ key: MK.WWW, mode: Cinnamon.ActionMode.NORMAL },
74+
75+
// Display
76+
{ key: MK.ROTATE_VIDEO_LOCK, mode: Cinnamon.ActionMode.ALL },
77+
78+
// Accessibility
79+
{ key: MK.SCREENREADER, mode: Cinnamon.ActionMode.NORMAL },
80+
{ key: MK.ON_SCREEN_KEYBOARD, mode: Cinnamon.ActionMode.NORMAL |
81+
Cinnamon.ActionMode.POPUP |
82+
Cinnamon.ActionMode.UNLOCK_SCREEN |
83+
Cinnamon.ActionMode.SYSTEM_MODAL },
84+
{ key: MK.INCREASE_TEXT, mode: Cinnamon.ActionMode.NORMAL },
85+
{ key: MK.DECREASE_TEXT, mode: Cinnamon.ActionMode.NORMAL },
86+
{ key: MK.TOGGLE_CONTRAST, mode: Cinnamon.ActionMode.NORMAL },
87+
88+
// Brightness
89+
{ key: MK.SCREEN_BRIGHTNESS_UP, mode: Cinnamon.ActionMode.ALL, repeatable: true },
90+
{ key: MK.SCREEN_BRIGHTNESS_DOWN, mode: Cinnamon.ActionMode.ALL, repeatable: true },
91+
{ key: MK.KEYBOARD_BRIGHTNESS_UP, mode: Cinnamon.ActionMode.ALL, repeatable: true },
92+
{ key: MK.KEYBOARD_BRIGHTNESS_DOWN, mode: Cinnamon.ActionMode.ALL, repeatable: true },
93+
{ key: MK.KEYBOARD_BRIGHTNESS_TOGGLE, mode: Cinnamon.ActionMode.ALL },
94+
95+
// Battery
96+
{ key: MK.BATTERY, mode: Cinnamon.ActionMode.NORMAL },
3297
];
3398

34-
const OBSOLETE_MEDIA_KEYS = [
35-
MK.VIDEO_OUT,
36-
MK.ROTATE_VIDEO
37-
]
38-
39-
function is_obsolete_mk(key_enum) {
40-
return OBSOLETE_MEDIA_KEYS.includes(key_enum);
41-
};
42-
4399
const iface = "\
44100
<node> \
45101
<interface name='org.cinnamon.SettingsDaemon.KeybindingHandler'> \
@@ -360,46 +416,22 @@ KeybindingManager.prototype = {
360416
},
361417

362418
setup_media_keys: function() {
363-
// Media keys before SEPARATOR work in all modes (global keys)
364-
// These should work during lock screen, unlock dialog, etc.
365-
let globalModes = Cinnamon.ActionMode.NORMAL | Cinnamon.ActionMode.OVERVIEW |
366-
Cinnamon.ActionMode.LOCK_SCREEN | Cinnamon.ActionMode.UNLOCK_SCREEN |
367-
Cinnamon.ActionMode.SYSTEM_MODAL | Cinnamon.ActionMode.LOOKING_GLASS |
368-
Cinnamon.ActionMode.POPUP;
369-
370-
for (let i = 0; i < MK.SEPARATOR; i++) {
371-
if (is_obsolete_mk(i)) {
372-
continue;
373-
}
374-
375-
let flags = REPEATABLE_MEDIA_KEYS.includes(i)
376-
? Meta.KeyBindingFlags.NONE
377-
: Meta.KeyBindingFlags.IGNORE_AUTOREPEAT;
378-
379-
let bindings = this.media_key_settings.get_strv(CinnamonDesktop.desktop_get_media_key_string(i));
380-
this.addHotKeyArray("media-keys-" + i.toString(),
381-
bindings,
382-
Lang.bind(this, this.on_media_key_pressed, i),
383-
flags,
384-
globalModes);
385-
}
386-
387-
// Media keys after SEPARATOR only work in normal mode
388-
for (let i = MK.SEPARATOR + 1; i < MK.LAST; i++) {
389-
if (is_obsolete_mk(i)) {
390-
continue;
391-
}
392-
393-
let flags = REPEATABLE_MEDIA_KEYS.includes(i)
419+
for (const mk of MEDIA_KEYS) {
420+
let flags = mk.repeatable
394421
? Meta.KeyBindingFlags.NONE
395422
: Meta.KeyBindingFlags.IGNORE_AUTOREPEAT;
396423

397-
let bindings = this.media_key_settings.get_strv(CinnamonDesktop.desktop_get_media_key_string(i));
398-
this.addHotKeyArray("media-keys-" + i.toString(),
399-
bindings,
400-
Lang.bind(this, this.on_media_key_pressed, i),
401-
flags,
402-
Cinnamon.ActionMode.NORMAL);
424+
let bindings = this.media_key_settings.get_strv(
425+
CinnamonDesktop.desktop_get_media_key_string(mk.key)
426+
);
427+
428+
this.addHotKeyArray(
429+
"media-keys-" + mk.key.toString(),
430+
bindings,
431+
Lang.bind(this, this.on_media_key_pressed, mk.key),
432+
flags,
433+
mk.mode
434+
);
403435
}
404436
return true;
405437
},

js/ui/main.js

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -549,7 +549,7 @@ function start() {
549549
}
550550

551551
// Protect security-critical exported functions from being replaced by extensions.
552-
for (let fnName of ['lockScreen', 'screenShieldHideKeyboard']) {
552+
for (let fnName of ['lockScreen', 'screenShieldHideKeyboard', 'toggleKeyboard']) {
553553
Object.defineProperty(imports.ui.main, fnName, {
554554
value: imports.ui.main[fnName],
555555
writable: false,
@@ -1760,3 +1760,10 @@ function _doLock(awayMessage) {
17601760
function screenShieldHideKeyboard() {
17611761
_screenShield?._hideScreensaverKeyboard();
17621762
}
1763+
1764+
function toggleKeyboard() {
1765+
if (_screenShield?.visible)
1766+
_screenShield._toggleScreensaverKeyboard();
1767+
else
1768+
virtualKeyboardManager.manualToggle();
1769+
}

0 commit comments

Comments
 (0)