-
Notifications
You must be signed in to change notification settings - Fork 4
/
extension.js
85 lines (71 loc) · 2.71 KB
/
extension.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
/* Light/Dark Theme Switcher
GNOME Shell extension
(c) Francois Thirioux 2022
License: GPLv3 */
const { Gio, GObject, St } = imports.gi;
const Main = imports.ui.main;
const PanelMenu = imports.ui.panelMenu;
var DEFAULT_SCHEME_NAME = 'default';
var LIGHT_SCHEME_NAME = 'prefer-light';
var DARK_SCHEME_NAME = 'prefer-dark';
var LIGHT_SCHEME_ICON = 'weather-clear-symbolic';
var DARK_SCHEME_ICON = 'weather-clear-night-symbolic';
var ThemeIndicator = GObject.registerClass(
class ThemeIndicator extends PanelMenu.Button {
_init() {
super._init(0.0, 'Theme Switcher');
this.hbox = new St.BoxLayout({visible: true, reactive: true, can_focus: true, track_hover: true});
this.icon = new St.Icon({style_class: 'system-status-icon'});
this.schema = Gio.Settings.new('org.gnome.desktop.interface');
switch (this.schema.get_string('color-scheme')) {
case LIGHT_SCHEME_NAME:
case DEFAULT_SCHEME_NAME:
this.icon.icon_name = LIGHT_SCHEME_ICON;
break;
case DARK_SCHEME_NAME:
this.icon.icon_name = DARK_SCHEME_ICON;
break;
default:
Main.notify("Theme switching error.");
}
this.hbox.add_child(this.icon);
this.add_child(this.hbox);
this.click = this.connect("button-release-event", this._toggle_theme.bind(this));
}
_toggle_theme() {
Main.layoutManager.screenTransition.run();
switch (this.schema.get_string('color-scheme')) {
case LIGHT_SCHEME_NAME:
case DEFAULT_SCHEME_NAME:
this.schema.set_string('color-scheme', DARK_SCHEME_NAME);
if (!this.schema.get_string('gtk-theme').endsWith("-dark")) {
this.schema.set_string('gtk-theme', this.schema.get_string('gtk-theme') + "-dark");
}
this.icon.icon_name = DARK_SCHEME_ICON;
break;
case DARK_SCHEME_NAME:
this.schema.set_string('color-scheme', DEFAULT_SCHEME_NAME);
if (this.schema.get_string('gtk-theme').endsWith("-dark")) {
this.schema.set_string('gtk-theme', this.schema.get_string('gtk-theme').slice(0,-5));
}
this.icon.icon_name = LIGHT_SCHEME_ICON;
break;
default:
Main.notify("Theme switching error.");
}
}
});
class Extension {
constructor() {
}
enable() {
this._theme_indicator = new ThemeIndicator();
Main.panel.addToStatusArea('theme-indicator', this._theme_indicator);
}
disable() {
this._theme_indicator.destroy();
}
}
function init() {
return new Extension();
}