Fix TeaTime not working with gnome-shell 3.35.90 and newer

This commit contains the minimum amount of changes for TeaTime to mostly
work with gnome-shell 3.35.90 and newer.

There is one big remaining issue after this, the fullscreen notifications
are not working anymore. Fixing this unfortunately is non trivial,
so I plan to remove it in a separate commit.

There are also some JS warnings, I will fix those in separate commits.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
This commit is contained in:
Hans de Goede 2020-02-17 16:08:12 +01:00
parent 5cb25b44eb
commit f02770da31
3 changed files with 105 additions and 83 deletions

View File

@ -4,6 +4,7 @@
*/ */
const Gio = imports.gi.Gio; const Gio = imports.gi.Gio;
const GObject = imports.gi.GObject;
const Mainloop = imports.mainloop; // timer const Mainloop = imports.mainloop; // timer
const Shell = imports.gi.Shell; const Shell = imports.gi.Shell;
const St = imports.gi.St; const St = imports.gi.St;
@ -130,9 +131,10 @@ class TeaTimeFullscreenNotification {
}; };
let PopupTeaMenuItem = GObject.registerClass(
class PopupTeaMenuItem extends PopupMenu.PopupBaseMenuItem { class PopupTeaMenuItem extends PopupMenu.PopupBaseMenuItem {
constructor(sTeaname, nBrewtime, params) { _init(sTeaname, nBrewtime, params) {
super(params); super._init(params);
this.tealabel = new St.Label({ this.tealabel = new St.Label({
text: sTeaname text: sTeaname
@ -162,14 +164,14 @@ class PopupTeaMenuItem extends PopupMenu.PopupBaseMenuItem {
} }
} }
} }
}; });
var TeaTime = class extends PanelMenu.Button { let TeaTime = GObject.registerClass(
class TeaTime extends PanelMenu.Button {
_init() {
super._init(1.0, "TeaTime");
constructor() { this.config_keys = Utils.GetConfigKeys();
super(null, "TeaTime");
this.myinit = function () {
this._settings = Utils.getSettings(); this._settings = Utils.getSettings();
@ -190,9 +192,9 @@ var TeaTime = class extends PanelMenu.Button {
this._idleTimeout = null; this._idleTimeout = null;
this._createMenu(); this._createMenu();
}; }
this._createMenu = function () { _createMenu() {
this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
this._settings.connect("changed::" + this.config_keys.steep_times, this._settings.connect("changed::" + this.config_keys.steep_times,
this._updateTeaList.bind(this)); this._updateTeaList.bind(this));
@ -230,8 +232,9 @@ var TeaTime = class extends PanelMenu.Button {
this.menu.addMenuItem(bottom); this.menu.addMenuItem(bottom);
this._updateTeaList(); this._updateTeaList();
}; }
this._updateTeaList = function (config, output) {
_updateTeaList(config, output) {
// make sure the menu is empty // make sure the menu is empty
this.teaItemCont.removeAll(); this.teaItemCont.removeAll();
@ -251,8 +254,9 @@ var TeaTime = class extends PanelMenu.Button {
}.bind(this)); }.bind(this));
this.teaItemCont.addMenuItem(menuItem); this.teaItemCont.addMenuItem(menuItem);
} }
}; }
this._updateCountdownType = function (config, output) {
_updateCountdownType(config, output) {
let bWantGraphicalCountdown = this._settings.get_boolean(this.config_keys.graphical_countdown); let bWantGraphicalCountdown = this._settings.get_boolean(this.config_keys.graphical_countdown);
if (bWantGraphicalCountdown != this._bGraphicalCountdown) { if (bWantGraphicalCountdown != this._bGraphicalCountdown) {
@ -267,8 +271,9 @@ var TeaTime = class extends PanelMenu.Button {
this._updateTimerDisplay(this._getRemainingSec()); this._updateTimerDisplay(this._getRemainingSec());
} // if timeout active } // if timeout active
} // value changed } // value changed
}; }
this._createCustomTimer = function (text, event) {
_createCustomTimer(text, event) {
if (event.get_key_symbol() == Clutter.KEY_Enter || if (event.get_key_symbol() == Clutter.KEY_Enter ||
event.get_key_symbol() == Clutter.KEY_Return || event.get_key_symbol() == Clutter.KEY_Return ||
event.get_key_symbol() == Clutter.KEY_KP_Enter) { event.get_key_symbol() == Clutter.KEY_KP_Enter) {
@ -297,8 +302,9 @@ var TeaTime = class extends PanelMenu.Button {
} }
this._customEntry.set_text(""); this._customEntry.set_text("");
} }
}; }
this._showNotification = function (subject, text) {
_showNotification(subject, text) {
let source = (Utils.isGnome34()) ? let source = (Utils.isGnome34()) ?
new MessageTray.Source(_("TeaTime applet")) : new MessageTray.Source(_("TeaTime applet")) :
new MessageTray.Source(_("TeaTime applet"), 'utilities-teatime'); new MessageTray.Source(_("TeaTime applet"), 'utilities-teatime');
@ -322,8 +328,9 @@ var TeaTime = class extends PanelMenu.Button {
let notification = new MessageTray.Notification(source, subject, text); let notification = new MessageTray.Notification(source, subject, text);
notification.setTransient(true); notification.setTransient(true);
source.notify(notification); source.notify(notification);
}; }
this._initCountdown = function (time) {
_initCountdown(time) {
this._startTime = new Date(); this._startTime = new Date();
this._stopTime = new Date(); this._stopTime = new Date();
this._cntdownStart = time; this._cntdownStart = time;
@ -346,26 +353,30 @@ var TeaTime = class extends PanelMenu.Button {
if (this._idleTimeout != null) Mainloop.source_remove(this._idleTimeout); if (this._idleTimeout != null) Mainloop.source_remove(this._idleTimeout);
this._idleTimeout = Mainloop.timeout_add_seconds(dt, this._doCountdown.bind(this)); this._idleTimeout = Mainloop.timeout_add_seconds(dt, this._doCountdown.bind(this));
}; }
this._stopCountdown = function () {
_stopCountdown() {
if (this._idleTimeout != null) Mainloop.source_remove(this._idleTimeout); if (this._idleTimeout != null) Mainloop.source_remove(this._idleTimeout);
this.actor.remove_actor(this._bGraphicalCountdown ? this.actor.remove_actor(this._bGraphicalCountdown ?
this._graphicalTimer : this._textualTimer); this._graphicalTimer : this._textualTimer);
this.actor.add_actor(this._logo); this.actor.add_actor(this._logo);
this._idleTimeout = null; this._idleTimeout = null;
}; }
this._getRemainingSec = function () {
_getRemainingSec() {
let a = new Date(); let a = new Date();
return (this._stopTime.getTime() - a.getTime()) * 1e-3; return (this._stopTime.getTime() - a.getTime()) * 1e-3;
}; }
this._updateTimerDisplay = function (remainingTime) {
_updateTimerDisplay(remainingTime) {
if (this._bGraphicalCountdown) { if (this._bGraphicalCountdown) {
this._graphicalTimer.setStatus((this._cntdownStart - remainingTime) / this._cntdownStart); this._graphicalTimer.setStatus((this._cntdownStart - remainingTime) / this._cntdownStart);
} else { } else {
this._textualTimer.text = Utils.formatTime(remainingTime); this._textualTimer.text = Utils.formatTime(remainingTime);
} }
}; }
this._doCountdown = function () {
_doCountdown() {
let remainingTime = this._getRemainingSec(); let remainingTime = this._getRemainingSec();
if (remainingTime <= 0) { if (remainingTime <= 0) {
@ -385,19 +396,22 @@ var TeaTime = class extends PanelMenu.Button {
this._updateTimerDisplay(remainingTime); this._updateTimerDisplay(remainingTime);
return true; // continue timer return true; // continue timer
} }
}; }
this._playSound = function () {
_playSound() {
let bPlayAlarmSound = this._settings.get_boolean(this.config_keys.use_alarm_sound); let bPlayAlarmSound = this._settings.get_boolean(this.config_keys.use_alarm_sound);
if (bPlayAlarmSound) { if (bPlayAlarmSound) {
Utils.playSound(this._settings.get_string(this.config_keys.alarm_sound)); Utils.playSound(this._settings.get_string(this.config_keys.alarm_sound));
} }
}; }
this._showPreferences = function () {
_showPreferences() {
const currExt = ExtensionUtils.getCurrentExtension(); const currExt = ExtensionUtils.getCurrentExtension();
imports.misc.util.spawn(["gnome-shell-extension-prefs", currExt.metadata['uuid']]); imports.misc.util.spawn(["gnome-shell-extension-prefs", currExt.metadata['uuid']]);
return 0; return 0;
}; }
this._onStyleChanged = function (actor) {
_onStyleChanged(actor) {
let themeNode = actor.get_theme_node(); let themeNode = actor.get_theme_node();
let color = themeNode.get_foreground_color() let color = themeNode.get_foreground_color()
let [bHasPadding, padding] = themeNode.lookup_length("-natural-hpadding", false); let [bHasPadding, padding] = themeNode.lookup_length("-natural-hpadding", false);
@ -421,11 +435,8 @@ var TeaTime = class extends PanelMenu.Button {
let scaling = Utils.getGlobalDisplayScaleFactor(); let scaling = Utils.getGlobalDisplayScaleFactor();
this._logo.setScaling(scaling); this._logo.setScaling(scaling);
this._graphicalTimer.setScaling(scaling); this._graphicalTimer.setScaling(scaling);
};
this.config_keys = Utils.GetConfigKeys();
this.myinit();
} }
}; });
function init(metadata) { function init(metadata) {
let theme = imports.gi.Gtk.IconTheme.get_default(); let theme = imports.gi.Gtk.IconTheme.get_default();
@ -442,4 +453,4 @@ function enable() {
function disable() { function disable() {
if (_TeaTime._idleTimeout != null) Mainloop.source_remove(_TeaTime._idleTimeout); if (_TeaTime._idleTimeout != null) Mainloop.source_remove(_TeaTime._idleTimeout);
_TeaTime.destroy(); _TeaTime.destroy();
}; }

View File

@ -10,19 +10,20 @@
* If there is a better way for that stuff, please let me know ;) * If there is a better way for that stuff, please let me know ;)
********************************************************************/ ********************************************************************/
const GObject = imports.gi.GObject;
const St = imports.gi.St; const St = imports.gi.St;
const Clutter = imports.gi.Clutter; const Clutter = imports.gi.Clutter;
const ExUt = imports.misc.extensionUtils; const ExUt = imports.misc.extensionUtils;
const Me = ExUt.getCurrentExtension(); const Me = ExUt.getCurrentExtension();
const Utils = Me.imports.utils; const Utils = Me.imports.utils;
var TwoColorIcon = class extends St.DrawingArea { var TwoColorIcon = GObject.registerClass(
constructor(size, drawingObject) { class TwoColorIcon extends St.DrawingArea {
super({ _init(size, drawingObject) {
super._init({
reactive: true, reactive: true,
style: 'padding: 0px 0px' style: 'padding: 0px 0px'
}); });
this.myinit = function () {
this._base_size = size; this._base_size = size;
//this.setScaling(Utils.getGlobalDisplayScaleFactor()); //this.setScaling(Utils.getGlobalDisplayScaleFactor());
@ -41,27 +42,32 @@ var TwoColorIcon = class extends St.DrawingArea {
}); });
this._secundaryColor = this._primaryColor; this._secundaryColor = this._primaryColor;
this._customStatus = null; this._customStatus = null;
}; }
this.setPadding = function (padding) {
setPadding(padding) {
this.margin_left = padding; this.margin_left = padding;
this.margin_right = padding; this.margin_right = padding;
}; }
this.setColor = function (primary, secundary) {
setColor(primary, secundary) {
this._primaryColor = primary; this._primaryColor = primary;
this._secundaryColor = secundary; this._secundaryColor = secundary;
this.queue_repaint(); this.queue_repaint();
}; }
this.setScaling = function (newScale) {
setScaling(newScale) {
this._default_scale = newScale; this._default_scale = newScale;
this.set_width(this._base_size * this._default_scale); this.set_width(this._base_size * this._default_scale);
this.set_height(this._base_size * this._default_scale); this.set_height(this._base_size * this._default_scale);
this.queue_repaint(); this.queue_repaint();
}; }
this.setStatus = function (newStatus) {
setStatus(newStatus) {
this._customStatus = newStatus; this._customStatus = newStatus;
this.queue_repaint(); this.queue_repaint();
}; }
this._drawIcon = function () {
_drawIcon() {
let cr = this.get_context(); let cr = this.get_context();
let orWdt = this._drawingObject.width; let orWdt = this._drawingObject.width;
let orHgt = this._drawingObject.height; let orHgt = this._drawingObject.height;
@ -85,10 +91,8 @@ var TwoColorIcon = class extends St.DrawingArea {
} catch (e) { } catch (e) {
// ignore // ignore
} }
};
this.myinit();
} }
}; });
var TeaPot = { var TeaPot = {
width: 484, width: 484,

View File

@ -22,9 +22,10 @@ const Columns = {
ADJUSTMENT: 2 ADJUSTMENT: 2
} }
var TeaTimePrefsWidget = class extends Gtk.Grid { var TeaTimePrefsWidget = GObject.registerClass(
constructor() { class TeaTimePrefsWidget extends Gtk.Grid {
super({ _init() {
super._init({
orientation: Gtk.Orientation.VERTICAL, orientation: Gtk.Orientation.VERTICAL,
column_homogeneous: false, column_homogeneous: false,
vexpand: true, vexpand: true,
@ -32,7 +33,8 @@ var TeaTimePrefsWidget = class extends Gtk.Grid {
row_spacing: 5 row_spacing: 5
}); });
this.myinit = function () { this.config_keys = Utils.GetConfigKeys();
this._tealist = new Gtk.ListStore(); this._tealist = new Gtk.ListStore();
this._tealist.set_column_types([ this._tealist.set_column_types([
GObject.TYPE_STRING, GObject.TYPE_STRING,
@ -51,8 +53,9 @@ var TeaTimePrefsWidget = class extends Gtk.Grid {
this._refresh(); this._refresh();
this._tealist.connect("row-changed", this._save.bind(this)); this._tealist.connect("row-changed", this._save.bind(this));
this._tealist.connect("row-deleted", this._save.bind(this)); this._tealist.connect("row-deleted", this._save.bind(this));
}; }
this._initWindow = function () {
_initWindow() {
let curRow = 0; let curRow = 0;
let labelFN = new Gtk.Label({ let labelFN = new Gtk.Label({
label: _("Fullscreen Notifications"), label: _("Fullscreen Notifications"),
@ -173,8 +176,9 @@ var TeaTimePrefsWidget = class extends Gtk.Grid {
}); });
this.removeButton.connect("clicked", this._removeSelectedTea.bind(this)); this.removeButton.connect("clicked", this._removeSelectedTea.bind(this));
this.toolbar.insert(this.removeButton, -1); this.toolbar.insert(this.removeButton, -1);
}; }
this._refresh = function () {
_refresh() {
// don't update the model if someone else is messing with the backend // don't update the model if someone else is messing with the backend
if (this._inhibitUpdate) if (this._inhibitUpdate)
return; return;
@ -205,8 +209,9 @@ var TeaTimePrefsWidget = class extends Gtk.Grid {
} }
this._inhibitUpdate = false; this._inhibitUpdate = false;
}; }
this._addTea = function () {
_addTea() {
let adj = new Gtk.Adjustment({ let adj = new Gtk.Adjustment({
lower: 1, lower: 1,
step_increment: 1, step_increment: 1,
@ -218,8 +223,9 @@ var TeaTimePrefsWidget = class extends Gtk.Grid {
this.treeview.set_cursor(this._tealist.get_path(item), this.treeview.set_cursor(this._tealist.get_path(item),
this.treeview.get_column(Columns.TEA_NAME), this.treeview.get_column(Columns.TEA_NAME),
true); true);
}; }
this._removeSelectedTea = function () {
_removeSelectedTea() {
let [selection, store] = this.treeview.get_selection().get_selected_rows(); let [selection, store] = this.treeview.get_selection().get_selected_rows();
let iters = []; let iters = [];
for (let i = 0; i < selection.length; ++i) { for (let i = 0; i < selection.length; ++i) {
@ -234,8 +240,9 @@ var TeaTimePrefsWidget = class extends Gtk.Grid {
}); });
this.treeview.get_selection().unselect_all(); this.treeview.get_selection().unselect_all();
}; }
this._saveFullscreenNotifications = function (sw, data) {
_saveFullscreenNotifications(sw, data) {
// don't update the backend if someone else is messing with the model // don't update the backend if someone else is messing with the model
if (this._inhibitUpdate) if (this._inhibitUpdate)
return; return;
@ -243,8 +250,9 @@ var TeaTimePrefsWidget = class extends Gtk.Grid {
this._settings.set_boolean(this.config_keys.fullscreen_notification, this._settings.set_boolean(this.config_keys.fullscreen_notification,
sw.active); sw.active);
this._inhibitUpdate = false; this._inhibitUpdate = false;
}; }
this._saveGraphicalCountdown = function (sw, data) {
_saveGraphicalCountdown(sw, data) {
// don't update the backend if someone else is messing with the model // don't update the backend if someone else is messing with the model
if (this._inhibitUpdate) if (this._inhibitUpdate)
return; return;
@ -252,8 +260,9 @@ var TeaTimePrefsWidget = class extends Gtk.Grid {
this._settings.set_boolean(this.config_keys.graphical_countdown, this._settings.set_boolean(this.config_keys.graphical_countdown,
sw.active); sw.active);
this._inhibitUpdate = false; this._inhibitUpdate = false;
}; }
this._saveUseAlarm = function (sw, data) {
_saveUseAlarm(sw, data) {
// don't update the backend if someone else is messing with the model // don't update the backend if someone else is messing with the model
if (this._inhibitUpdate) if (this._inhibitUpdate)
return; return;
@ -261,8 +270,9 @@ var TeaTimePrefsWidget = class extends Gtk.Grid {
this._settings.set_boolean(this.config_keys.use_alarm_sound, this._settings.set_boolean(this.config_keys.use_alarm_sound,
sw.active); sw.active);
this._inhibitUpdate = false; this._inhibitUpdate = false;
}; }
this._saveSoundFile = function (sw, data) {
_saveSoundFile(sw, data) {
// don't update the backend if someone else is messing with the model // don't update the backend if someone else is messing with the model
if (this._inhibitUpdate) if (this._inhibitUpdate)
return; return;
@ -279,8 +289,9 @@ var TeaTimePrefsWidget = class extends Gtk.Grid {
this._settings.set_string(this.config_keys.alarm_sound, alarm_sound); this._settings.set_string(this.config_keys.alarm_sound, alarm_sound);
this._inhibitUpdate = false; this._inhibitUpdate = false;
} }
}; }
this._save = function (store, path_, iter_) {
_save(store, path_, iter_) {
const GLib = imports.gi.GLib; const GLib = imports.gi.GLib;
// don't update the backend if someone else is messing with the model // don't update the backend if someone else is messing with the model
@ -302,12 +313,8 @@ var TeaTimePrefsWidget = class extends Gtk.Grid {
this._settings.set_value(this.config_keys.steep_times, settingsValue); this._settings.set_value(this.config_keys.steep_times, settingsValue);
this._inhibitUpdate = false; this._inhibitUpdate = false;
};
this.config_keys = Utils.GetConfigKeys();
this.myinit();
} }
}; });
function init() {} function init() {}