From 66d79cc804760702ef1dfa6ba96ae2ee3d1f61d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gr=C3=A9gory=20Soutad=C3=A9?= Date: Sun, 26 Nov 2023 09:57:02 +0100 Subject: [PATCH] Update for Gnome Shell 45+ --- examples/gmail.py | 16 +++++++--- examples/picture.py | 7 ++--- extension.js | 74 ++++++++++++++++++++------------------------- metadata.json | 10 +++--- 4 files changed, 50 insertions(+), 57 deletions(-) diff --git a/examples/gmail.py b/examples/gmail.py index fbea2da..1de563b 100644 --- a/examples/gmail.py +++ b/examples/gmail.py @@ -23,6 +23,7 @@ from __future__ import print_function import os.path +import json from google.auth.transport.requests import Request from google.oauth2.credentials import Credentials @@ -37,7 +38,7 @@ creds = None def _initCreds(): global creds if creds: return - + # The file token.json stores the user's access and refresh tokens, and is # created automatically when the authorization flow completes for the first # time. @@ -53,15 +54,21 @@ def _initCreds(): creds = flow.run_local_server(port=0) # Save the credentials for the next run with open('token.json', 'w') as token: - token.write(creds.to_json()) - + data = {} + data['refresh_token'] = creds.refresh_token + data['client_id'] = creds.client_id + data['client_secret'] = creds.client_secret + data['token_uri'] = creds.token_uri + data['id_token'] = creds.id_token + token.write(json.dumps(data)) + def getUnreadMails(): """ Get number of unread threads (that may contain multiple messages) """ _initCreds() - + service = build('gmail', 'v1', credentials=creds) pageToken = '' threads = set() @@ -69,6 +76,7 @@ def getUnreadMails(): results = service.users().messages().list(userId='me', labelIds=['UNREAD'],\ includeSpamTrash=False, pageToken=pageToken)\ .execute() + if not 'messages' in results.keys(): continue threads = threads.union(set([k['threadId'] for k in results['messages']])) # Loop over all result pages (100 results per page by default) pageToken = results.get('nextPageToken', '') diff --git a/examples/picture.py b/examples/picture.py index 7ec55e9..d10d9e4 100755 --- a/examples/picture.py +++ b/examples/picture.py @@ -43,15 +43,12 @@ class PicturePopup(GenericMonitor): self.runMainLoop() def display_next_img(self): - filedata = urllib.request.urlopen('https://source.unsplash.com/random') - # Get redirected URL without parameters - url = filedata.url.split('?')[0] - filedata = urllib.request.urlopen(url + '?fit=max&width=500&height=500') + filedata = urllib.request.urlopen('https://picsum.photos/500/500') datatowrite = filedata.read() with open('/tmp/cat2.jpg', 'wb') as f: f.write(datatowrite) widget = GenericMonitorTextWidget('#%d' % self.imgs_idx, 'color:purple') - url_widget = GenericMonitorTextWidget(url, 'color:white;font-weight:bold', signals={'on-click':'signal'}) # No name here + url_widget = GenericMonitorTextWidget('random_pic', 'color:white;font-weight:bold', signals={'on-click':'signal'}) # No name here picture_widget = GenericMonitorPictureWidget('/tmp/cat2.jpg', name='NestedWidget', signals={'on-click':'signal'}) popup = GenericMonitorPopup([url_widget, picture_widget]) signals = { diff --git a/extension.js b/extension.js index d72ef1c..6eb2397 100644 --- a/extension.js +++ b/extension.js @@ -29,17 +29,17 @@ https://gitlab.gnome.org/GNOME/gnome-shell/-/blob/main/js/ui/panel.js */ -const St = imports.gi.St; -const Gio = imports.gi.Gio; -const GLib = imports.gi.GLib -const Main = imports.ui.main; -const Mainloop = imports.mainloop; -const Clutter = imports.gi.Clutter; -const PanelMenu = imports.ui.panelMenu; -const PopupMenu = imports.ui.popupMenu; -const GObject = imports.gi.GObject; -const Pixbuf = imports.gi.GdkPixbuf; -const Cogl = imports.gi.Cogl; +import * as Extension from 'resource:///org/gnome/shell/extensions/extension.js'; +import St from 'gi://St'; +import Gio from 'gi://Gio'; +import GLib from 'gi://GLib'; +import Clutter from 'gi://Clutter'; +import GObject from 'gi://GObject'; +import Pixbuf from 'gi://GdkPixbuf'; +import Cogl from 'gi://Cogl'; +import * as Main from 'resource:///org/gnome/shell/ui/main.js'; +import * as PanelMenu from 'resource:///org/gnome/shell/ui/panelMenu.js'; +import * as PopupMenu from 'resource:///org/gnome/shell/ui/popupMenu.js'; function hashGet(hash, key, defaultValue) { @@ -50,7 +50,7 @@ function hashGet(hash, key, defaultValue) { } function log(message) { - global.log('[GenericMontior]', message); + console.error('[GenericMontior]', message); } @@ -189,8 +189,9 @@ class SignalMgt { this.button = event.get_button(); this.nbClicks = 1; - let sourceId = Mainloop.timeout_add(this.dbus.ClutterSettings['double-click-time'], - this._doClickCallback.bind(this)); + let sourceId = GLib.timeout_add(GLib.G_PRIORITY_DEFAULT, + this.dbus.ClutterSettings['double-click-time'], + this._doClickCallback.bind(this)); this.timeouts.push(sourceId); } @@ -228,7 +229,7 @@ class MyPopupMenuItem extends PopupMenu.PopupBaseMenuItem { this.box.set_vertical(true); for (let widgetIndex in widgets) - this.box.add(widgets[widgetIndex]); + this.box.add_child(widgets[widgetIndex]); this.add_child(this.box); } @@ -555,14 +556,12 @@ class MonitorWidget extends PanelMenu.Button { // From https://github.com/ubuntu/gnome-shell-extension-appindicator/blob/master/interfaces.js // loads a xml file into an in-memory string -function loadInterfaceXml(filename) { - const extension = imports.misc.extensionUtils.getCurrentExtension(); - +function loadInterfaceXml(extension, filename) { const interfacesDir = extension.dir.get_child('.'); const file = interfacesDir.get_child(filename); - let [result, contents] = imports.gi.GLib.file_get_contents(file.get_path()); + let [result, contents] = GLib.file_get_contents(file.get_path()); if (result) { // HACK: The "" + trick is important as hell because file_get_contents returns @@ -580,11 +579,11 @@ function loadInterfaceXml(filename) { } class GenericMonitorDBUS { - constructor() { + constructor(extension) { this.monitor_groups = {}; this.actor_clicked = {}; this.ClutterSettings = Clutter.Settings.get_default(); - this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(loadInterfaceXml('dbus.xml'), this); + this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(loadInterfaceXml(extension, 'dbus.xml'), this); this._dbusImpl.export(Gio.DBus.session, '/com/soutade/GenericMonitor'); this._dbusImpl.emit_signal('onActivate', null); } @@ -799,30 +798,21 @@ class GenericMonitorDBUS { } } -class Extension { +export default class GenericMonitorExtension extends Extension.Extension { + constructor(...args) { + super(...args); + this.textDBusService = null; + } + enable() { - this.textDBusService = new GenericMonitorDBUS(); + this.textDBusService = new GenericMonitorDBUS(this); } disable() { - this.textDBusService.destructor(); - delete this.textDBusService; - } -} - -let extension = null; - -function init() { -} - -function enable() { - extension = new Extension(); - extension.enable(); -} - -function disable() { - if (extension) { - extension.disable(); - extension = null; + if (this.textDBusService !== null) { + this.textDBusService.destructor(); + delete this.textDBusService; + this.textDBusService = null; + } } } diff --git a/metadata.json b/metadata.json index 0d061ff..66ccd17 100644 --- a/metadata.json +++ b/metadata.json @@ -2,13 +2,11 @@ "uuid": "generic-monitor@gnome-shell-extensions", "name": "Generic Monitor", "description": "Display text & icon on systray using DBUS", - "version": "13", + "version": "14", "shell-version": [ - "44", - "43", - "42.3", - "42", - "41" + "47", + "46", + "45" ], "url": "http://indefero.soutade.fr/p/genericmonitor" }