diff --git a/.gitlab/issue_templates/Bug.md b/.gitlab/issue_templates/Bug.md deleted file mode 100644 index 2caef4d..0000000 --- a/.gitlab/issue_templates/Bug.md +++ /dev/null @@ -1,49 +0,0 @@ -### Bug Description - - - -### Steps to Reproduce - - - -### What behavior did you observe? - - - -### What behavior did you expect? - - - -### Further Information - - - - - -### System Information - -- Operating System: -- GNOME Version: - -Enabled Extensions: - - diff --git a/data/ui/prefs-box-order-item-options-dialog.ui b/data/ui/prefs-box-order-item-options-dialog.ui deleted file mode 100644 index d953d24..0000000 --- a/data/ui/prefs-box-order-item-options-dialog.ui +++ /dev/null @@ -1,38 +0,0 @@ - - - - diff --git a/data/ui/prefs-box-order-item-row.ui b/data/ui/prefs-box-order-item-row.ui index dd06b32..0debab6 100644 --- a/data/ui/prefs-box-order-item-row.ui +++ b/data/ui/prefs-box-order-item-row.ui @@ -46,12 +46,6 @@ row.move-down -
- - Options - row.options - -
Forget diff --git a/docs/panel_49.0_2025-10-03.js b/docs/panel_49.0_2025-10-03.js deleted file mode 100644 index 449c038..0000000 --- a/docs/panel_49.0_2025-10-03.js +++ /dev/null @@ -1,321 +0,0 @@ -// My annotated and cut down js/ui/panel.js from gnome-shell/49.0. -// All annotations are what I guessed, interpreted and copied while reading the -// code and comparing to other panel.js versions and might be wrong. They are -// prefixed with "Annotation:" to indicate that they're my comments, not -// comments that orginally existed. - -// Taken from: https://gitlab.gnome.org/GNOME/gnome-shell/-/blob/49.0/js/ui/panel.js -// On: 2025-10-03 -// License: This code is licensed under GPLv2. - -// Taken from: https://gitlab.gnome.org/GNOME/gnome-shell/-/blob/49.0/js/ui/sessionMode.js -// On: 2025-10-03 -// License: This code is licensed under GPLv2. - -// I'm using the word "item" to refer to the thing, which gets added to the top -// (menu)bar / panel, where an item has a role/name and an indicator. - -// Annotation: [...] Cut out bunch of stuff here, which isn't relevant for this -// Extension. - -import Clutter from 'gi://Clutter'; - -// Annotation: [...] Cut out bunch of stuff here, which isn't relevant for this -// Extension. - -import GObject from 'gi://GObject'; - -// Annotation: [...] Cut out bunch of stuff here, which isn't relevant for this -// Extension. - -import St from 'gi://St'; - -// Annotation: [...] Cut out bunch of stuff here, which isn't relevant for this -// Extension. - -import * as CtrlAltTab from './ctrlAltTab.js'; - -// Annotation: [...] Cut out bunch of stuff here, which isn't relevant for this -// Extension. - -import * as PopupMenu from './popupMenu.js'; -import * as PanelMenu from './panelMenu.js'; - -// Annotation: [...] Cut out bunch of stuff here, which isn't relevant for this -// Extension. - -import * as Main from './main.js'; - -// Annotation: [...] Cut out bunch of stuff here, which isn't relevant for this -// Extension. - -import {DateMenuButton} from './dateMenu.js'; -import {ATIndicator} from './status/accessibility.js'; -import {InputSourceIndicator} from './status/keyboard.js'; -import {DwellClickIndicator} from './status/dwellClick.js'; -import {ScreenRecordingIndicator, ScreenSharingIndicator} from './status/remoteAccess.js'; - -// Annotation: [...] Cut out bunch of stuff here, which isn't relevant for this -// Extension. - -// Of note (for PANEL_ITEM_IMPLEMENTATIONS): -// const ActivitiesButton = [...] -// const QuickSettings = [...] -// Compared to panel_48.2_2025-06-08.js: AppMenuButton got removed. - -// Compared to panel_48.2_2025-06-08.js: AppMenuButton got removed. -const PANEL_ITEM_IMPLEMENTATIONS = { - 'activities': ActivitiesButton, - 'quickSettings': QuickSettings, - 'dateMenu': DateMenuButton, - 'a11y': ATIndicator, - 'keyboard': InputSourceIndicator, - 'dwellClick': DwellClickIndicator, - 'screenRecording': ScreenRecordingIndicator, - 'screenSharing': ScreenSharingIndicator, -}; - -export const Panel = GObject.registerClass( -class Panel extends St.Widget { - // Annotation: Initializes the top (menu)bar / panel. - // Does relevant stuff like: - // - Defining this._leftBox, this._centerBox and this._rightBox. - // - Finally calling this._updatePanel(). - // Compared to panel_48.2_2025-06-08.js: Nothing changed. - _init() { - super._init({ - name: 'panel', - reactive: true, - }); - - this.set_offscreen_redirect(Clutter.OffscreenRedirect.ALWAYS); - - this._sessionStyle = null; - - this.statusArea = {}; - - this.menuManager = new PopupMenu.PopupMenuManager(this); - - this._leftBox = new St.BoxLayout({name: 'panelLeft'}); - this.add_child(this._leftBox); - this._centerBox = new St.BoxLayout({name: 'panelCenter'}); - this.add_child(this._centerBox); - this._rightBox = new St.BoxLayout({name: 'panelRight'}); - this.add_child(this._rightBox); - - this.connect('button-press-event', this._onButtonPress.bind(this)); - this.connect('touch-event', this._onTouchEvent.bind(this)); - - Main.overview.connectObject('showing', - () => this.add_style_pseudo_class('overview'), - this); - Main.overview.connectObject('hiding', - () => this.remove_style_pseudo_class('overview'), - this); - - Main.layoutManager.panelBox.add_child(this); - Main.ctrlAltTabManager.addGroup(this, - _('Top Bar'), 'shell-focus-top-bar-symbolic', - {sortGroup: CtrlAltTab.SortGroup.TOP}); - - Main.sessionMode.connectObject('updated', - this._updatePanel.bind(this), - this); - - global.display.connectObject('workareas-changed', - () => this.queue_relayout(), - this); - this._updatePanel(); - } - - // Annotation: [...] Cut out bunch of stuff here, which isn't relevant for - // this Extension. - - // Annotation: Gets called by this._init() to populate the top (menu)bar / - // panel initially. - // - // It does the following relevant stuff: - // - Calls this._hideIndicators() - // - Calls this._updateBox() for this._leftBox, this._centerBox and - // this._rightBox with panel.left, panel.center and panel.right to - // populate the boxes with items defined in panel.left, panel.center and - // panel.right. - // - // panel.left, panel.center and panel.right get set via the line let panel - // = Main.sessionMode.panel, which uses the panel of Mains (js/ui/main.js) - // instance of SessionMode (js/ui/sessionMode.js). - // - // And in js/ui/sessionMode.js (49.0, 2025-10-03) you have different modes - // with different panel configuration. For example the "user" mode with: - // panel: { - // left: ['activities'], - // center: ['dateMenu'], - // right: ['screenRecording', 'screenSharing', 'dwellClick', 'a11y', 'keyboard', 'quickSettings'], - // } - // - // This way this function populates the top (menu)bar / panel with the - // default stuff you see on a fresh Gnome. - // - // Compared to panel_48.2_2025-06-08.js: Nothing changed. - _updatePanel() { - let panel = Main.sessionMode.panel; - this._hideIndicators(); - this._updateBox(panel.left, this._leftBox); - this._updateBox(panel.center, this._centerBox); - this._updateBox(panel.right, this._rightBox); - - if (panel.left.includes('dateMenu')) - Main.messageTray.bannerAlignment = Clutter.ActorAlign.START; - else if (panel.right.includes('dateMenu')) - Main.messageTray.bannerAlignment = Clutter.ActorAlign.END; - // Default to center if there is no dateMenu - else - Main.messageTray.bannerAlignment = Clutter.ActorAlign.CENTER; - - if (this._sessionStyle) - this.remove_style_class_name(this._sessionStyle); - - this._sessionStyle = Main.sessionMode.panelStyle; - if (this._sessionStyle) - this.add_style_class_name(this._sessionStyle); - } - - // Annotation: This function hides all items, which are in the top (menu)bar - // panel and in PANEL_ITEM_IMPLEMENTATIONS. - // - // Compared to panel_48.2_2025-06-08.js: Nothing changed. - _hideIndicators() { - for (let role in PANEL_ITEM_IMPLEMENTATIONS) { - let indicator = this.statusArea[role]; - if (!indicator) - continue; - indicator.container.hide(); - } - } - - // Annotation: This function takes a role (of an item) and returns a - // corresponding indicator, if either of two things are true: - // - The indicator is already in this.statusArea. - // Then it just returns the indicator by using this.statusArea. - // - The role is in PANEL_ITEM_IMPLEMENTATIONS. - // Then it creates a new indicator, adds it to this.statusArea and returns - // it. - // - // Compared to panel_48.2_2025-06-08.js: Nothing changed. - _ensureIndicator(role) { - let indicator = this.statusArea[role]; - if (!indicator) { - let constructor = PANEL_ITEM_IMPLEMENTATIONS[role]; - if (!constructor) { - // This icon is not implemented (this is a bug) - return null; - } - indicator = new constructor(this); - this.statusArea[role] = indicator; - } - return indicator; - } - - // Annotation: This function takes a list of items (or rather their roles) - // and adds the indicators of those items to a box (like this._leftBox) - // using this._ensureIndicator() to get the indicator corresponding to the - // given role. - // So only items with roles this._ensureIndicator() knows, get added. - // - // Compared to panel_48.2_2025-06-08.js: Nothing changed. - _updateBox(elements, box) { - let nChildren = box.get_n_children(); - - for (let i = 0; i < elements.length; i++) { - let role = elements[i]; - let indicator = this._ensureIndicator(role); - if (indicator == null) - continue; - - this._addToPanelBox(role, indicator, i + nChildren, box); - } - } - - // Annotation: This function adds the given item to the specified top - // (menu)bar / panel box and connects to "destroy" and "menu-set" events. - // - // It takes the following arguments: - // - role: The name of the item to add. - // - indicator: The indicator of the item to add. - // - position: Where in the box to add the item. - // - box: The box to add the item to. - // Can be one of the following: - // - this._leftBox - // - this._centerBox - // - this._rightBox - // - // Compared to panel_48.2_2025-06-08.js: Nothing changed. - _addToPanelBox(role, indicator, position, box) { - let container = indicator.container; - container.show(); - - let parent = container.get_parent(); - if (parent) - parent.remove_child(container); - - - box.insert_child_at_index(container, position); - this.statusArea[role] = indicator; - let destroyId = indicator.connect('destroy', emitter => { - delete this.statusArea[role]; - emitter.disconnect(destroyId); - }); - indicator.connect('menu-set', this._onMenuSet.bind(this)); - this._onMenuSet(indicator); - } - - // Annotation: This function allows you to add an item to the top (menu)bar - // / panel. - // While per default it adds the item to the status area (the right box of - // the top bar), you can specify the box and add the item to any of the - // three boxes of the top bar. - // To add an item to the top bar, you need to give its role and indicator. - // - // This function takes the following arguments: - // - role: A name for the item to add. - // - indicator: The indicator for the item to add (must be an instance of - // PanelMenu.Button). - // - position: Where in the box to add the item. - // - box: The box to add the item to. - // Can be one of the following: - // - "left": referring to this._leftBox - // - "center": referring to this._centerBox - // - "right": referring to this._rightBox - // These boxes are what you see in the top bar as the left, right and - // center sections. - // - // Finally this function just calls this._addToPanelBox() for the actual - // work, so it basically just makes sure the input to this._addToPanelBox() - // is correct. - // - // Compared to panel_48.2_2025-06-08.js: Nothing changed. - addToStatusArea(role, indicator, position, box) { - if (this.statusArea[role]) - throw new Error(`Extension point conflict: there is already a status indicator for role ${role}`); - - if (!(indicator instanceof PanelMenu.Button)) - throw new TypeError('Status indicator must be an instance of PanelMenu.Button'); - - position ??= 0; - let boxes = { - left: this._leftBox, - center: this._centerBox, - right: this._rightBox, - }; - let boxContainer = boxes[box] || this._rightBox; - this.statusArea[role] = indicator; - this._addToPanelBox(role, indicator, position, boxContainer); - return indicator; - } - - // Of note: - // _onMenuSet(indicator) { [...] } - - // Annotation: [...] Cut out bunch of stuff here, which isn't relevant for - // this Extension. -}); diff --git a/src/extension.ts b/src/extension.ts index 026de7e..4d99243 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -121,7 +121,18 @@ export default class TopBarOrganizerExtension extends Extension { const validBoxOrder = this._boxOrderManager.getValidBoxOrder(box); // Get the relevant box of `Main.panel`. - let panelBox = (Main.panel as CustomPanel)[`_${box}Box`]; + let panelBox; + switch (box) { + case "left": + panelBox = (Main.panel as CustomPanel)._leftBox; + break; + case "center": + panelBox = (Main.panel as CustomPanel)._centerBox; + break; + case "right": + panelBox = (Main.panel as CustomPanel)._rightBox; + break; + } /// Go through the items of the validBoxOrder and order the GNOME Shell /// top bar box accordingly. diff --git a/src/metadata.json b/src/metadata.json index 11b0cce..a12d4c0 100644 --- a/src/metadata.json +++ b/src/metadata.json @@ -2,8 +2,8 @@ "uuid": "top-bar-organizer@julian.gse.jsts.xyz", "name": "Top Bar Organizer", "description": "Organize the items of the top (menu)bar.", - "version": 15, - "shell-version": [ "45", "46", "47", "48", "49" ], + "version": 13, + "shell-version": [ "45", "46", "47", "48" ], "settings-schema": "org.gnome.shell.extensions.top-bar-organizer", "url": "https://gitlab.gnome.org/june/top-bar-organizer" } diff --git a/src/prefsModules/PrefsBoxOrderItemOptionsDialog.ts b/src/prefsModules/PrefsBoxOrderItemOptionsDialog.ts deleted file mode 100644 index 736a773..0000000 --- a/src/prefsModules/PrefsBoxOrderItemOptionsDialog.ts +++ /dev/null @@ -1,69 +0,0 @@ -"use strict"; - -import GObject from "gi://GObject"; -import Adw from "gi://Adw"; -import GLib from "gi://GLib"; -import type Gio from "gi://Gio"; -import type Gtk from "gi://Gtk"; - -import { ExtensionPreferences } from "resource:///org/gnome/Shell/Extensions/js/extensions/prefs.js"; - -export default class PrefsBoxOrderItemOptionsDialog extends Adw.Dialog { - static { - GObject.registerClass({ - GTypeName: "PrefsBoxOrderItemOptionsDialog", - Template: GLib.uri_resolve_relative(import.meta.url, "../ui/prefs-box-order-item-options-dialog.ui", GLib.UriFlags.NONE), - InternalChildren: [ - "visibility-row", - ], - }, this); - } - - declare _visibility_row: Adw.ComboRow; - #settings: Gio.Settings; - item: string; - - constructor(params = {}, item: string) { - super(params); - - // Associate `this` with an item. - this.item = item; - // Load the settings. - this.#settings = ExtensionPreferences.lookupByURL(import.meta.url)!.getSettings(); - - // Set the selected visibility row choice to the settings value. - const itemsToHide = new Set(this.#settings.get_strv("hide")); - const itemsToShow = new Set(this.#settings.get_strv("show")); - if (itemsToHide.has(this.item)) { - this._visibility_row.set_selected(1); - } else if (itemsToShow.has(this.item)) { - this._visibility_row.set_selected(2); - } else { - this._visibility_row.set_selected(0); - } - } - - onVisibilityRowSelectionChanged(): void { - const visibility = (this._visibility_row.get_selected_item() as Gtk.StringObject).get_string(); - const itemsToHide = new Set(this.#settings.get_strv("hide")); - const itemsToShow = new Set(this.#settings.get_strv("show")); - - switch (visibility) { - case "Forcefully Hide": - itemsToHide.add(this.item) - itemsToShow.delete(this.item); - break; - case "Forcefully Show": - itemsToHide.delete(this.item) - itemsToShow.add(this.item); - break; - case "Default": - itemsToHide.delete(this.item) - itemsToShow.delete(this.item); - break; - } - - this.#settings.set_strv("hide", Array.from(itemsToHide)); - this.#settings.set_strv("show", Array.from(itemsToShow)); - } -} diff --git a/src/prefsModules/PrefsBoxOrderItemRow.ts b/src/prefsModules/PrefsBoxOrderItemRow.ts index 3da4d6b..fa691f8 100644 --- a/src/prefsModules/PrefsBoxOrderItemRow.ts +++ b/src/prefsModules/PrefsBoxOrderItemRow.ts @@ -6,7 +6,6 @@ import GObject from "gi://GObject"; import Adw from "gi://Adw"; import GLib from "gi://GLib"; -import PrefsBoxOrderItemOptionsDialog from "./PrefsBoxOrderItemOptionsDialog.js"; import type PrefsBoxOrderListBox from "./PrefsBoxOrderListBox.js"; export default class PrefsBoxOrderItemRow extends Adw.ActionRow { @@ -26,15 +25,6 @@ export default class PrefsBoxOrderItemRow extends Adw.ActionRow { parentListBox.saveBoxOrderToSettings(); parentListBox.determineRowMoveActionEnable(); }); - this.install_action("row.options", null, (self, _actionName, _param) => { - const itemOptionsDialog = new PrefsBoxOrderItemOptionsDialog({ - // Get the title from self as the constructor of - // PrefsBoxOrderItemRow already processes the item name into a - // nice title. - title: (self as PrefsBoxOrderItemRow).get_title() - }, (self as PrefsBoxOrderItemRow).item); - itemOptionsDialog.present(self); - }); this.install_action("row.move-up", null, (self, _actionName, _param) => self.emit("move", "up")); this.install_action("row.move-down", null, (self, _actionName, _param) => self.emit("move", "down")); }