From c9128518fd8bc2c829b58e2cff45f93bc86aaa24 Mon Sep 17 00:00:00 2001 From: Jay Ta'ala Date: Wed, 17 Apr 2024 23:33:05 +1000 Subject: [PATCH 01/16] Cleanup topbar.js. --- topbar.js | 361 ++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 239 insertions(+), 122 deletions(-) diff --git a/topbar.js b/topbar.js index 1a1defed..8c68b5cc 100644 --- a/topbar.js +++ b/topbar.js @@ -13,7 +13,9 @@ import * as popupMenu from 'resource:///org/gnome/shell/ui/popupMenu.js'; import { Settings, Utils, Tiling, Navigator, Scratch } from './imports.js'; import { Easer } from './utils.js'; +// eslint-disable-next-line no-undef const workspaceManager = global.workspace_manager; +// eslint-disable-next-line no-undef const display = global.display; /* @@ -22,18 +24,6 @@ const display = global.display; export let panelBox = Main.layoutManager.panelBox; -// From https://developer.gnome.org/hig-book/unstable/design-color.html.en -const colors = [ - '#9DB8D2', '#7590AE', '#4B6983', '#314E6C', - '#EAE8E3', '#BAB5AB', '#807D74', '#565248', - '#C5D2C8', '#83A67F', '#5D7555', '#445632', - '#E0B6AF', '#C1665A', '#884631', '#663822', - '#ADA7C8', '#887FA3', '#625B81', '#494066', - '#EFE0CD', '#E0C39E', '#B39169', '#826647', - '#DF421E', '#990000', '#EED680', '#D1940C', - '#46A046', '#267726', '#ffffff', '#000000', -]; - export let menu, focusButton; let openPrefs, screenSignals, signals, gsettings; export function enable (extension) { @@ -70,7 +60,7 @@ export function enable (extension) { fixTopBar(); }); - signals.connect(gsettings, 'changed::disable-topbar-styling', (settings, key) => { + signals.connect(gsettings, 'changed::disable-topbar-styling', (_settings, _key) => { if (Settings.prefs.disable_topbar_styling) { removeStyles(); } @@ -79,18 +69,18 @@ export function enable (extension) { } }); - signals.connect(gsettings, 'changed::show-window-position-bar', (settings, key) => { + signals.connect(gsettings, 'changed::show-window-position-bar', (_settings, _key) => { const spaces = Tiling.spaces; spaces.setSpaceTopbarElementsVisible(); spaces.forEach(s => s.layout(false)); spaces.showWindowPositionBarChanged(); }); - signals.connect(gsettings, 'changed::show-workspace-indicator', (settings, key) => { + signals.connect(gsettings, 'changed::show-workspace-indicator', (_settings, _key) => { fixWorkspaceIndicator(); }); - signals.connect(gsettings, 'changed::show-focus-mode-icon', (settings, key) => { + signals.connect(gsettings, 'changed::show-focus-mode-icon', (_settings, _key) => { fixFocusModeIcon(); }); @@ -148,42 +138,6 @@ export function createButton(icon_name, accessible_name) { }); } -export function popupMenuEntryHelper(text) { - this.label = new St.Entry({ - text, - // While not a search entry, this looks much better - style_class: 'search-entry', - name: 'workspace-name-entry', - track_hover: true, - reactive: true, - can_focus: true, - }); - - this.label.set_style(` - width: 232px; - `); - - this.prevIcon = createButton('go-previous-symbolic', 'previous workspace setting'); - this.nextIcon = createButton('go-next-symbolic', 'next workspace setting'); - - this.nextIcon.connect('clicked', () => { - let space = Tiling.cycleWorkspaceSettings(-1); - this.label.text = space.name; - this.nextIcon.grab_key_focus(); - }); - this.prevIcon.connect('clicked', () => { - let space = Tiling.cycleWorkspaceSettings(1); - this.label.text = space.name; - this.prevIcon.grab_key_focus(); - }); - - this.actor.add_child(this.prevIcon); - this.actor.add_child(this.label); - this.actor.add_child(this.nextIcon); - this.actor.label_actor = this.label; - this.label.clutter_text.connect('activate', this.emit.bind(this, 'activate')); -} - // registerClass, breaking our somewhat lame registerClass polyfill. export const PopupMenuEntry = GObject.registerClass( class PopupMenuEntry extends popupMenu.PopupBaseMenuItem { @@ -195,72 +149,104 @@ export const PopupMenuEntry = GObject.registerClass( can_focus: false, }); - popupMenuEntryHelper.call(this, text); + this.label = new St.Entry({ + text, + // While not a search entry, this looks much better + style_class: 'search-entry', + name: 'workspace-name-entry', + track_hover: true, + reactive: true, + can_focus: true, + }); + + this.label.set_style(` + width: 232px; + `); + + this.prevIcon = createButton('go-previous-symbolic', 'previous workspace setting'); + this.nextIcon = createButton('go-next-symbolic', 'next workspace setting'); + + this.nextIcon.connect('clicked', () => { + let space = Tiling.cycleWorkspaceSettings(-1); + this.label.text = space.name; + this.nextIcon.grab_key_focus(); + }); + this.prevIcon.connect('clicked', () => { + let space = Tiling.cycleWorkspaceSettings(1); + this.label.text = space.name; + this.prevIcon.grab_key_focus(); + }); + + this.actor.add_child(this.prevIcon); + this.actor.add_child(this.label); + this.actor.add_child(this.nextIcon); + this.actor.label_actor = this.label; + this.label.clutter_text.connect('activate', this.emit.bind(this, 'activate')); } - activate(event) { + activate(_event) { this.label.grab_key_focus(); } - _onKeyFocusIn(actor) { + _onKeyFocusIn(_actor) { this.activate(); } }); -class Color { - constructor(color, container) { - this.container = container; - this.color = color; - this.actor = new St.Button(); - let icon = new St.Widget(); - this.actor.add_child(icon); - icon.set_style(`background: ${color}`); - icon.set_size(20, 20); - icon.set_position(4, 4); - this.actor.set_size(24, 24); - - this.actor.connect('clicked', this.clicked.bind(this)); - } - - clicked() { - this.container.entry.actor.text = this.color; - this.container.clicked(); - } -} - -class ColorEntry { - constructor(startColor) { - this.actor = new St.BoxLayout({ vertical: true }); - - let flowbox = new St.Widget(); - let flowLayout = new Clutter.FlowLayout(); - let flow = new St.Widget(); - flowbox.add_child(flow); - flow.layout_manager = flowLayout; - flow.width = 24 * 16; - for (let c of colors) { - flow.add_child(new Color(c, this).actor); - } - - this.entry = new PopupMenuEntry(startColor, 'Set color'); - this.entry.actor.clutter_text.connect( - 'text-changed', () => { - let color = this.entry.actor.text; - this.entry.actor.set_style(`color: ${color}; `); - }); - - this.entry.button.connect('clicked', this.clicked.bind(this)); - - this.actor.add_child(this.entry.actor); - this.actor.add_child(flowbox); - } - - clicked() { - let space = Tiling.spaces.activeSpace; - let color = this.entry.actor.text; - space.settings.set_string('color', color); - } -} +// class Color { +// constructor(color, container) { +// this.container = container; +// this.color = color; +// this.actor = new St.Button(); +// let icon = new St.Widget(); +// this.actor.add_child(icon); +// icon.set_style(`background: ${color}`); +// icon.set_size(20, 20); +// icon.set_position(4, 4); +// this.actor.set_size(24, 24); + +// this.actor.connect('clicked', this.clicked.bind(this)); +// } + +// clicked() { +// this.container.entry.actor.text = this.color; +// this.container.clicked(); +// } +// } + +// class ColorEntry { +// constructor(startColor) { +// this.actor = new St.BoxLayout({ vertical: true }); + +// let flowbox = new St.Widget(); +// let flowLayout = new Clutter.FlowLayout(); +// let flow = new St.Widget(); +// flowbox.add_child(flow); +// flow.layout_manager = flowLayout; +// flow.width = 24 * 16; +// for (let c of colors) { +// flow.add_child(new Color(c, this).actor); +// } + +// this.entry = new PopupMenuEntry(startColor, 'Set color'); +// this.entry.actor.clutter_text.connect( +// 'text-changed', () => { +// let color = this.entry.actor.text; +// this.entry.actor.set_style(`color: ${color}; `); +// }); + +// this.entry.button.connect('clicked', this.clicked.bind(this)); + +// this.actor.add_child(this.entry.actor); +// this.actor.add_child(flowbox); +// } + +// clicked() { +// let space = Tiling.spaces.activeSpace; +// let color = this.entry.actor.text; +// space.settings.set_string('color', color); +// } +// } /** * FocusMode icon class. @@ -304,13 +290,14 @@ export const FocusIcon = GObject.registerClass( _initToolTip() { const tt = new St.Label({ style_class: 'focus-button-tooltip' }); tt.hide(); + // eslint-disable-next-line no-undef global.stage.add_child(tt); - this.tooltip_parent.connect('enter-event', icon => { + this.tooltip_parent.connect('enter-event', _icon => { this._updateTooltipPosition(this.tooltip_x_point); this._updateTooltipText(); tt.show(); }); - this.tooltip_parent.connect('leave-event', (icon, event) => { + this.tooltip_parent.connect('leave-event', (_icon, _event) => { if (!this.has_pointer) { tt.hide(); } @@ -334,14 +321,20 @@ export const FocusIcon = GObject.registerClass( ` Window focus mode Current mode: ${mode}`); }; - if (this.mode === Tiling.FocusModes.DEFAULT) { + switch (this.mode) { + case Tiling.FocusModes.DEFAULT: markup('#6be67b', 'DEFAULT'); - } else if (this.mode === Tiling.FocusModes.CENTER) { + return; + case Tiling.FocusModes.CENTER: markup('#6be6cb', 'CENTER'); - } else if (this.mode === Tiling.FocusModes.EDGE) { + break; + case Tiling.FocusModes.EDGE: markup('#abe67b', 'EDGE'); - } else { + break; + default: + markup('#6be67b', 'DEFAULT'); this.tooltip.set_text(''); + break; } } @@ -352,13 +345,19 @@ Current mode: ${mode}`); setMode(mode) { mode = mode ?? Tiling.FocusModes.DEFAULT; this.mode = mode; - if (mode === Tiling.FocusModes.DEFAULT) { - this.gicon = this.gIconDefault; - } else if (mode === Tiling.FocusModes.CENTER) { + + switch (mode) { + case Tiling.FocusModes.CENTER: this.gicon = this.gIconCenter; - } else if (mode === Tiling.FocusModes.EDGE) { + break; + case Tiling.FocusModes.EDGE: this.gicon = this.gIconEdge; + break; + default: + this.gicon = this.gIconDefault; + break; } + this._updateTooltipText(); return this; } @@ -415,6 +414,122 @@ export const FocusButton = GObject.registerClass( } ); +export const OpenDirIcon = GObject.registerClass( + class OpenDirIcon extends St.Icon { + _init(properties = {}, tooltip_parent, tooltip_x_point = 0) { + super._init(properties); + this.reactive = true; + + // allow custom x position for tooltip + this.tooltip_parent = tooltip_parent ?? this; + this.tooltip_x_point = tooltip_x_point; + + // read in focus icons from resources folder + const pather = relativePath => GLib.uri_resolve_relative(import.meta.url, relativePath, GLib.UriFlags.NONE); + this.gIconDefault = Gio.icon_new_for_string(pather('./resources/focus-mode-default-symbolic.svg')); + this.gIconCenter = Gio.icon_new_for_string(pather('./resources/focus-mode-center-symbolic.svg')); + this.gIconEdge = Gio.icon_new_for_string(pather('./resources/focus-mode-edge-symbolic.svg')); + + this._initToolTip(); + this.setMode(); + + this.connect('button-press-event', () => { + if (this.clickFunction) { + this.clickFunction(); + } + }); + } + + /** + * Sets a function to be executed on click. + * @param {Function} clickFunction + * @returns + */ + setClickFunction(clickFunction) { + this.clickFunction = clickFunction; + return this; + } + + _initToolTip() { + const tt = new St.Label({ style_class: 'focus-button-tooltip' }); + tt.hide(); + // eslint-disable-next-line no-undef + global.stage.add_child(tt); + this.tooltip_parent.connect('enter-event', _icon => { + this._updateTooltipPosition(this.tooltip_x_point); + this._updateTooltipText(); + tt.show(); + }); + this.tooltip_parent.connect('leave-event', (_icon, _event) => { + if (!this.has_pointer) { + tt.hide(); + } + }); + this.tooltip = tt; + } + + /** + * Updates tooltip position relative to this button. + */ + _updateTooltipPosition(xpoint = 0) { + let point = this.apply_transform_to_point( + new Graphene.Point3D({ x: xpoint, y: 0 })); + this.tooltip.set_position(Math.max(0, point.x - 62), point.y + 34); + } + + _updateTooltipText() { + const markup = (color, mode) => { + this.tooltip.clutter_text + .set_markup( + ` Window focus mode +Current mode: ${mode}`); + }; + if (this.mode === Tiling.FocusModes.DEFAULT) { + markup('#6be67b', 'DEFAULT'); + } else if (this.mode === Tiling.FocusModes.CENTER) { + markup('#6be6cb', 'CENTER'); + } else if (this.mode === Tiling.FocusModes.EDGE) { + markup('#abe67b', 'EDGE'); + } else { + this.tooltip.set_text(''); + } + } + + /** + * Set the mode that this icon will display. + * @param {Tiling.FocusModes} mode + */ + setMode(mode) { + mode = mode ?? Tiling.FocusModes.DEFAULT; + this.mode = mode; + + switch (mode) { + case Tiling.FocusModes.CENTER: + this.gicon = this.gIconCenter; + break; + case Tiling.FocusModes.EDGE: + this.gicon = this.gIconEdge; + break; + default: + this.gicon = this.gIconDefault; + break; + } + + this._updateTooltipText(); + return this; + } + + /** + * Sets visibility of icon. + * @param {boolean} visible + */ + setVisible(visible = true) { + this.visible = visible; + return this; + } + } +); + export const WorkspaceMenu = GObject.registerClass( class WorkspaceMenu extends panelMenu.Button { _init() { @@ -435,11 +550,12 @@ export const WorkspaceMenu = GObject.registerClass( this.add_child(this.label); this.signals = new Utils.Signals(); + // eslint-disable-next-line no-undef this.signals.connect(global.window_manager, 'switch-workspace', this.workspaceSwitched.bind(this)); - this.menu.addMenuItem(new popupMenu.PopupSeparatorMenuItem(_('Workspace Settings'))); + this.menu.addMenuItem(new popupMenu.PopupSeparatorMenuItem('Workspace Settings')); this.entry = new PopupMenuEntry(this.label.text); this.menu.addMenuItem(this.entry); @@ -536,12 +652,13 @@ export const WorkspaceMenu = GObject.registerClass( this._enterbox = new Clutter.Actor({ reactive: true }); Main.uiGroup.add_child(this._enterbox); this._enterbox.set_position(panelBox.x, panelBox.y + panelBox.height + 20); + // eslint-disable-next-line no-undef this._enterbox.set_size(global.screen_width, global.screen_height); Main.layoutManager.trackChrome(this._enterbox); this._navigator.connect('destroy', this._finishWorkspaceSelect.bind(this)); - let id = this._enterbox.connect('enter-event', () => { + this._enterbox.connect('enter-event', () => { this._navigator.finish(); }); } @@ -567,7 +684,7 @@ export const WorkspaceMenu = GObject.registerClass( let spaces = Tiling.spaces; let active = spaces.activeSpace; - let [dx, dy] = event.get_scroll_delta(); + let [, dy] = event.get_scroll_delta(); dy *= active.height * 0.05; let t = event.get_time(); let v = -dy / (this.time - t); From ba09a6498a4fc3009df76ed3a6c4eb6cb86c7c7a Mon Sep 17 00:00:00 2001 From: Jay Ta'ala Date: Wed, 17 Apr 2024 23:57:40 +1000 Subject: [PATCH 02/16] Created simplified BaseIcon class. --- topbar.js | 58 +++++++++++++------------------------------------------ 1 file changed, 13 insertions(+), 45 deletions(-) diff --git a/topbar.js b/topbar.js index 8c68b5cc..1c9ba360 100644 --- a/topbar.js +++ b/topbar.js @@ -414,21 +414,20 @@ export const FocusButton = GObject.registerClass( } ); -export const OpenDirIcon = GObject.registerClass( - class OpenDirIcon extends St.Icon { - _init(properties = {}, tooltip_parent, tooltip_x_point = 0) { - super._init(properties); - this.reactive = true; +const BaseIcon = GObject.registerClass( + class BaseIcon extends St.Icon { + _init(props = {}, tooltipProps = {}, iconInit = _path => {} ) { + super._init(props); // allow custom x position for tooltip - this.tooltip_parent = tooltip_parent ?? this; - this.tooltip_x_point = tooltip_x_point; + this.tooltip_parent = tooltipProps?.parent ?? this; + this.tooltip_x_point = tooltipProps?.x_point ?? 0; + + this.reactive = true; // read in focus icons from resources folder - const pather = relativePath => GLib.uri_resolve_relative(import.meta.url, relativePath, GLib.UriFlags.NONE); - this.gIconDefault = Gio.icon_new_for_string(pather('./resources/focus-mode-default-symbolic.svg')); - this.gIconCenter = Gio.icon_new_for_string(pather('./resources/focus-mode-center-symbolic.svg')); - this.gIconEdge = Gio.icon_new_for_string(pather('./resources/focus-mode-edge-symbolic.svg')); + const path = extPath => GLib.uri_resolve_relative(import.meta.url, extPath, GLib.UriFlags.NONE); + iconInit(path); this._initToolTip(); this.setMode(); @@ -478,45 +477,14 @@ export const OpenDirIcon = GObject.registerClass( } _updateTooltipText() { - const markup = (color, mode) => { - this.tooltip.clutter_text - .set_markup( - ` Window focus mode -Current mode: ${mode}`); - }; - if (this.mode === Tiling.FocusModes.DEFAULT) { - markup('#6be67b', 'DEFAULT'); - } else if (this.mode === Tiling.FocusModes.CENTER) { - markup('#6be6cb', 'CENTER'); - } else if (this.mode === Tiling.FocusModes.EDGE) { - markup('#abe67b', 'EDGE'); - } else { - this.tooltip.set_text(''); - } + throw new Error(`please implement '_updateTooltipText' function`); } /** * Set the mode that this icon will display. - * @param {Tiling.FocusModes} mode */ - setMode(mode) { - mode = mode ?? Tiling.FocusModes.DEFAULT; - this.mode = mode; - - switch (mode) { - case Tiling.FocusModes.CENTER: - this.gicon = this.gIconCenter; - break; - case Tiling.FocusModes.EDGE: - this.gicon = this.gIconEdge; - break; - default: - this.gicon = this.gIconDefault; - break; - } - - this._updateTooltipText(); - return this; + setMode(_mode) { + throw new Error(`please implement 'setMode' function`); } /** From 8dfc01122063355cd15d3d1007c48ea7489c17a7 Mon Sep 17 00:00:00 2001 From: Jay Ta'ala Date: Thu, 18 Apr 2024 00:49:58 +1000 Subject: [PATCH 03/16] Implemented FocusIcon extending BaseIcon. --- topbar.js | 247 ++++++++++++++++++++---------------------------------- 1 file changed, 91 insertions(+), 156 deletions(-) diff --git a/topbar.js b/topbar.js index 1c9ba360..414031c0 100644 --- a/topbar.js +++ b/topbar.js @@ -248,28 +248,30 @@ export const PopupMenuEntry = GObject.registerClass( // } // } -/** - * FocusMode icon class. - */ -export const FocusIcon = GObject.registerClass( - class FocusIcon extends St.Icon { - _init(properties = {}, tooltip_parent, tooltip_x_point = 0) { - super._init(properties); - this.reactive = true; +const BaseIcon = GObject.registerClass( + class BaseIcon extends St.Icon { + _init( + props = {}, + tooltipProps = {}, + initIcons = () => {}, + updateTooltipText = () => {}, + setMode = _mode => {} + ) { + super._init(props); // allow custom x position for tooltip - this.tooltip_parent = tooltip_parent ?? this; - this.tooltip_x_point = tooltip_x_point; + this.tooltip_parent = tooltipProps?.parent ?? this; + this.tooltip_x_point = tooltipProps?.x_point ?? 0; - // read in focus icons from resources folder - const pather = relativePath => GLib.uri_resolve_relative(import.meta.url, relativePath, GLib.UriFlags.NONE); - this.gIconDefault = Gio.icon_new_for_string(pather('./resources/focus-mode-default-symbolic.svg')); - this.gIconCenter = Gio.icon_new_for_string(pather('./resources/focus-mode-center-symbolic.svg')); - this.gIconEdge = Gio.icon_new_for_string(pather('./resources/focus-mode-edge-symbolic.svg')); + initIcons(); - this._initToolTip(); - this.setMode(); + this.updateTooltipText = updateTooltipText; + this.initToolTip(); + this.setMode = setMode; + setMode(); + + this.reactive = true; this.connect('button-press-event', () => { if (this.clickFunction) { this.clickFunction(); @@ -277,24 +279,14 @@ export const FocusIcon = GObject.registerClass( }); } - /** - * Sets a function to be executed on click. - * @param {Function} clickFunction - * @returns - */ - setClickFunction(clickFunction) { - this.clickFunction = clickFunction; - return this; - } - - _initToolTip() { + initToolTip() { const tt = new St.Label({ style_class: 'focus-button-tooltip' }); tt.hide(); // eslint-disable-next-line no-undef global.stage.add_child(tt); this.tooltip_parent.connect('enter-event', _icon => { this._updateTooltipPosition(this.tooltip_x_point); - this._updateTooltipText(); + this.updateTooltipText(); tt.show(); }); this.tooltip_parent.connect('leave-event', (_icon, _event) => { @@ -314,51 +306,13 @@ export const FocusIcon = GObject.registerClass( this.tooltip.set_position(Math.max(0, point.x - 62), point.y + 34); } - _updateTooltipText() { - const markup = (color, mode) => { - this.tooltip.clutter_text - .set_markup( - ` Window focus mode -Current mode: ${mode}`); - }; - switch (this.mode) { - case Tiling.FocusModes.DEFAULT: - markup('#6be67b', 'DEFAULT'); - return; - case Tiling.FocusModes.CENTER: - markup('#6be6cb', 'CENTER'); - break; - case Tiling.FocusModes.EDGE: - markup('#abe67b', 'EDGE'); - break; - default: - markup('#6be67b', 'DEFAULT'); - this.tooltip.set_text(''); - break; - } - } - /** - * Set the mode that this icon will display. - * @param {Tiling.FocusModes} mode + * Sets a function to be executed on click. + * @param {Function} clickFunction + * @returns */ - setMode(mode) { - mode = mode ?? Tiling.FocusModes.DEFAULT; - this.mode = mode; - - switch (mode) { - case Tiling.FocusModes.CENTER: - this.gicon = this.gIconCenter; - break; - case Tiling.FocusModes.EDGE: - this.gicon = this.gIconEdge; - break; - default: - this.gicon = this.gIconDefault; - break; - } - - this._updateTooltipText(); + setClickFunction(clickFunction) { + this.clickFunction = clickFunction; return this; } @@ -373,6 +327,71 @@ Current mode: ${mode}`); } ); +/** + * FocusMode icon class. + */ +export const FocusIcon = GObject.registerClass( + class FocusIcon extends BaseIcon { + _init( + props = {}, + tooltipProps = {} + ) { + super._init( + props, + tooltipProps, + () => { + const pather = relativePath => GLib.uri_resolve_relative(import.meta.url, relativePath, GLib.UriFlags.NONE); + this.gIconDefault = Gio.icon_new_for_string(pather('./resources/focus-mode-default-symbolic.svg')); + this.gIconCenter = Gio.icon_new_for_string(pather('./resources/focus-mode-center-symbolic.svg')); + this.gIconEdge = Gio.icon_new_for_string(pather('./resources/focus-mode-edge-symbolic.svg')); + }, + () => { + const markup = (color, mode) => { + this.tooltip.clutter_text + .set_markup( + ` Window focus mode +Current mode: ${mode}`); + }; + switch (this.mode) { + case Tiling.FocusModes.DEFAULT: + markup('#6be67b', 'DEFAULT'); + return; + case Tiling.FocusModes.CENTER: + markup('#6be6cb', 'CENTER'); + break; + case Tiling.FocusModes.EDGE: + markup('#abe67b', 'EDGE'); + break; + default: + markup('#6be67b', 'DEFAULT'); + this.tooltip.set_text(''); + break; + } + }, + mode => { + mode = mode ?? Tiling.FocusModes.DEFAULT; + this.mode = mode; + + switch (mode) { + case Tiling.FocusModes.CENTER: + this.gicon = this.gIconCenter; + break; + case Tiling.FocusModes.EDGE: + this.gicon = this.gIconEdge; + break; + default: + this.gicon = this.gIconDefault; + break; + } + + this.updateTooltipText(); + return this; + } + ); + } + } +); + export const FocusButton = GObject.registerClass( class FocusButton extends panelMenu.Button { _init() { @@ -414,90 +433,6 @@ export const FocusButton = GObject.registerClass( } ); -const BaseIcon = GObject.registerClass( - class BaseIcon extends St.Icon { - _init(props = {}, tooltipProps = {}, iconInit = _path => {} ) { - super._init(props); - - // allow custom x position for tooltip - this.tooltip_parent = tooltipProps?.parent ?? this; - this.tooltip_x_point = tooltipProps?.x_point ?? 0; - - this.reactive = true; - - // read in focus icons from resources folder - const path = extPath => GLib.uri_resolve_relative(import.meta.url, extPath, GLib.UriFlags.NONE); - iconInit(path); - - this._initToolTip(); - this.setMode(); - - this.connect('button-press-event', () => { - if (this.clickFunction) { - this.clickFunction(); - } - }); - } - - /** - * Sets a function to be executed on click. - * @param {Function} clickFunction - * @returns - */ - setClickFunction(clickFunction) { - this.clickFunction = clickFunction; - return this; - } - - _initToolTip() { - const tt = new St.Label({ style_class: 'focus-button-tooltip' }); - tt.hide(); - // eslint-disable-next-line no-undef - global.stage.add_child(tt); - this.tooltip_parent.connect('enter-event', _icon => { - this._updateTooltipPosition(this.tooltip_x_point); - this._updateTooltipText(); - tt.show(); - }); - this.tooltip_parent.connect('leave-event', (_icon, _event) => { - if (!this.has_pointer) { - tt.hide(); - } - }); - this.tooltip = tt; - } - - /** - * Updates tooltip position relative to this button. - */ - _updateTooltipPosition(xpoint = 0) { - let point = this.apply_transform_to_point( - new Graphene.Point3D({ x: xpoint, y: 0 })); - this.tooltip.set_position(Math.max(0, point.x - 62), point.y + 34); - } - - _updateTooltipText() { - throw new Error(`please implement '_updateTooltipText' function`); - } - - /** - * Set the mode that this icon will display. - */ - setMode(_mode) { - throw new Error(`please implement 'setMode' function`); - } - - /** - * Sets visibility of icon. - * @param {boolean} visible - */ - setVisible(visible = true) { - this.visible = visible; - return this; - } - } -); - export const WorkspaceMenu = GObject.registerClass( class WorkspaceMenu extends panelMenu.Button { _init() { From 4353a679497a0ff447a1027dc12c5317353ee2e1 Mon Sep 17 00:00:00 2001 From: Jay Ta'ala Date: Thu, 18 Apr 2024 01:36:30 +1000 Subject: [PATCH 04/16] Added new symbolic icons for direction mode. Also replaced the edge one. --- resources/focus-mode-edge-symbolic.svg | 89 +++++++++++++++++++++++++- resources/open-direction-end.svg | 2 + resources/open-direction-left.svg | 2 + resources/open-direction-right.svg | 2 + resources/open-direction-start.svg | 2 + topbar.js | 3 - 6 files changed, 94 insertions(+), 6 deletions(-) create mode 100644 resources/open-direction-end.svg create mode 100644 resources/open-direction-left.svg create mode 100644 resources/open-direction-right.svg create mode 100644 resources/open-direction-start.svg diff --git a/resources/focus-mode-edge-symbolic.svg b/resources/focus-mode-edge-symbolic.svg index d0fa9a37..2faec5e9 100644 --- a/resources/focus-mode-edge-symbolic.svg +++ b/resources/focus-mode-edge-symbolic.svg @@ -1,4 +1,87 @@ - - - + + + + + + image/svg+xml + + + + + + + + + + + + + + diff --git a/resources/open-direction-end.svg b/resources/open-direction-end.svg new file mode 100644 index 00000000..5979a4ee --- /dev/null +++ b/resources/open-direction-end.svg @@ -0,0 +1,2 @@ + + diff --git a/resources/open-direction-left.svg b/resources/open-direction-left.svg new file mode 100644 index 00000000..6d6bf224 --- /dev/null +++ b/resources/open-direction-left.svg @@ -0,0 +1,2 @@ + + diff --git a/resources/open-direction-right.svg b/resources/open-direction-right.svg new file mode 100644 index 00000000..0722168d --- /dev/null +++ b/resources/open-direction-right.svg @@ -0,0 +1,2 @@ + + diff --git a/resources/open-direction-start.svg b/resources/open-direction-start.svg new file mode 100644 index 00000000..8046cdf9 --- /dev/null +++ b/resources/open-direction-start.svg @@ -0,0 +1,2 @@ + + diff --git a/topbar.js b/topbar.js index 414031c0..b649a3df 100644 --- a/topbar.js +++ b/topbar.js @@ -327,9 +327,6 @@ const BaseIcon = GObject.registerClass( } ); -/** - * FocusMode icon class. - */ export const FocusIcon = GObject.registerClass( class FocusIcon extends BaseIcon { _init( From e8b1e965ef3f8bd83685d932beaefbe801abe88e Mon Sep 17 00:00:00 2001 From: Jay Ta'ala Date: Thu, 18 Apr 2024 01:46:57 +1000 Subject: [PATCH 05/16] Standardised icon names. --- ...ter-symbolic.svg => focus-mode-center.svg} | 0 ...lt-symbolic.svg => focus-mode-default.svg} | 0 ...-edge-symbolic.svg => focus-mode-edge.svg} | 0 ...irection-end.svg => open-position-end.svg} | 0 ...ection-left.svg => open-position-left.svg} | 0 ...tion-right.svg => open-position-right.svg} | 0 ...tion-start.svg => open-position-start.svg} | 0 topbar.js | 128 ++++++++++++++++-- 8 files changed, 116 insertions(+), 12 deletions(-) rename resources/{focus-mode-center-symbolic.svg => focus-mode-center.svg} (100%) rename resources/{focus-mode-default-symbolic.svg => focus-mode-default.svg} (100%) rename resources/{focus-mode-edge-symbolic.svg => focus-mode-edge.svg} (100%) rename resources/{open-direction-end.svg => open-position-end.svg} (100%) rename resources/{open-direction-left.svg => open-position-left.svg} (100%) rename resources/{open-direction-right.svg => open-position-right.svg} (100%) rename resources/{open-direction-start.svg => open-position-start.svg} (100%) diff --git a/resources/focus-mode-center-symbolic.svg b/resources/focus-mode-center.svg similarity index 100% rename from resources/focus-mode-center-symbolic.svg rename to resources/focus-mode-center.svg diff --git a/resources/focus-mode-default-symbolic.svg b/resources/focus-mode-default.svg similarity index 100% rename from resources/focus-mode-default-symbolic.svg rename to resources/focus-mode-default.svg diff --git a/resources/focus-mode-edge-symbolic.svg b/resources/focus-mode-edge.svg similarity index 100% rename from resources/focus-mode-edge-symbolic.svg rename to resources/focus-mode-edge.svg diff --git a/resources/open-direction-end.svg b/resources/open-position-end.svg similarity index 100% rename from resources/open-direction-end.svg rename to resources/open-position-end.svg diff --git a/resources/open-direction-left.svg b/resources/open-position-left.svg similarity index 100% rename from resources/open-direction-left.svg rename to resources/open-position-left.svg diff --git a/resources/open-direction-right.svg b/resources/open-position-right.svg similarity index 100% rename from resources/open-direction-right.svg rename to resources/open-position-right.svg diff --git a/resources/open-direction-start.svg b/resources/open-position-start.svg similarity index 100% rename from resources/open-direction-start.svg rename to resources/open-position-start.svg diff --git a/topbar.js b/topbar.js index b649a3df..e2773baa 100644 --- a/topbar.js +++ b/topbar.js @@ -254,8 +254,8 @@ const BaseIcon = GObject.registerClass( props = {}, tooltipProps = {}, initIcons = () => {}, - updateTooltipText = () => {}, - setMode = _mode => {} + setMode = _mode => {}, + updateTooltipText = () => {} ) { super._init(props); @@ -265,12 +265,12 @@ const BaseIcon = GObject.registerClass( initIcons(); - this.updateTooltipText = updateTooltipText; - this.initToolTip(); - this.setMode = setMode; setMode(); + this.updateTooltipText = updateTooltipText; + this.initToolTip(); + this.reactive = true; this.connect('button-press-event', () => { if (this.clickFunction) { @@ -338,9 +338,28 @@ export const FocusIcon = GObject.registerClass( tooltipProps, () => { const pather = relativePath => GLib.uri_resolve_relative(import.meta.url, relativePath, GLib.UriFlags.NONE); - this.gIconDefault = Gio.icon_new_for_string(pather('./resources/focus-mode-default-symbolic.svg')); - this.gIconCenter = Gio.icon_new_for_string(pather('./resources/focus-mode-center-symbolic.svg')); - this.gIconEdge = Gio.icon_new_for_string(pather('./resources/focus-mode-edge-symbolic.svg')); + this.gIconDefault = Gio.icon_new_for_string(pather('./resources/focus-mode-default.svg')); + this.gIconCenter = Gio.icon_new_for_string(pather('./resources/focus-mode-center.svg')); + this.gIconEdge = Gio.icon_new_for_string(pather('./resources/focus-mode-edge.svg')); + }, + mode => { + mode = mode ?? Tiling.FocusModes.DEFAULT; + this.mode = mode; + + switch (mode) { + case Tiling.FocusModes.CENTER: + this.gicon = this.gIconCenter; + break; + case Tiling.FocusModes.EDGE: + this.gicon = this.gIconEdge; + break; + default: + this.gicon = this.gIconDefault; + break; + } + + this.updateTooltipText(); + return this; }, () => { const markup = (color, mode) => { @@ -365,6 +384,68 @@ Current mode: ${mode}`); break; } }, + ); + } + } +); + +export const FocusButton = GObject.registerClass( + class FocusButton extends panelMenu.Button { + _init() { + super._init(0.0, 'FocusMode'); + + this._icon = new FocusIcon({ + style_class: 'system-status-icon focus-mode-button', + }, this, -10); + + this.setFocusMode(); + this.add_child(this._icon); + this.connect('event', this._onClicked.bind(this)); + } + + /** + * Sets the focus mode with this button. + * @param {*} mode + */ + setFocusMode(mode) { + mode = mode ?? Tiling.FocusModes.DEFAULT; + this.focusMode = mode; + this._icon.setMode(mode); + return this; + } + + _onClicked(actor, event) { + if (Tiling.inPreview !== Tiling.PreviewMode.NONE || Main.overview.visible) { + return Clutter.EVENT_PROPAGATE; + } + + if (event.type() !== Clutter.EventType.TOUCH_BEGIN && + event.type() !== Clutter.EventType.BUTTON_PRESS) { + return Clutter.EVENT_PROPAGATE; + } + + Tiling.switchToNextFocusMode(); + return Clutter.EVENT_PROPAGATE; + } + } +); + +export const OpenPositionIcon = GObject.registerClass( + class OpenPositionIcon extends BaseIcon { + _init( + props = {}, + tooltipProps = {} + ) { + super._init( + props, + tooltipProps, + () => { + const pather = relativePath => GLib.uri_resolve_relative(import.meta.url, relativePath, GLib.UriFlags.NONE); + this.gIconRight = Gio.icon_new_for_string(pather('./resources/open-position-right.svg')); + this.gIconLeft = Gio.icon_new_for_string(pather('./resources/open-position-left.svg')); + this.gIconStart = Gio.icon_new_for_string(pather('./resources/open-position-start.svg')); + this.gIconEnd = Gio.icon_new_for_string(pather('./resources/open-position-end.svg')); + }, mode => { mode = mode ?? Tiling.FocusModes.DEFAULT; this.mode = mode; @@ -383,16 +464,39 @@ Current mode: ${mode}`); this.updateTooltipText(); return this; - } + }, + () => { + const markup = (color, mode) => { + this.tooltip.clutter_text + .set_markup( + ` Window focus mode +Current mode: ${mode}`); + }; + switch (this.mode) { + case Tiling.FocusModes.DEFAULT: + markup('#6be67b', 'DEFAULT'); + return; + case Tiling.FocusModes.CENTER: + markup('#6be6cb', 'CENTER'); + break; + case Tiling.FocusModes.EDGE: + markup('#abe67b', 'EDGE'); + break; + default: + markup('#6be67b', 'DEFAULT'); + this.tooltip.set_text(''); + break; + } + }, ); } } ); -export const FocusButton = GObject.registerClass( - class FocusButton extends panelMenu.Button { +export const OpenPositionButton = GObject.registerClass( + class OpenPositionButton extends panelMenu.Button { _init() { - super._init(0.0, 'FocusMode'); + super._init(0.0, 'OpenPosition'); this._icon = new FocusIcon({ style_class: 'system-status-icon focus-mode-button', From 0523f15cd3aa2c2bbf06912137a68c86b696fdff Mon Sep 17 00:00:00 2001 From: Jay Ta'ala Date: Thu, 18 Apr 2024 01:57:31 +1000 Subject: [PATCH 06/16] Implemented OpenPositionIcon. --- topbar.js | 40 +++++++++++++++++++++------------------- 1 file changed, 21 insertions(+), 19 deletions(-) diff --git a/topbar.js b/topbar.js index e2773baa..c0232841 100644 --- a/topbar.js +++ b/topbar.js @@ -383,7 +383,7 @@ Current mode: ${mode}`); this.tooltip.set_text(''); break; } - }, + } ); } } @@ -447,18 +447,21 @@ export const OpenPositionIcon = GObject.registerClass( this.gIconEnd = Gio.icon_new_for_string(pather('./resources/open-position-end.svg')); }, mode => { - mode = mode ?? Tiling.FocusModes.DEFAULT; + mode = mode ?? Settings.OpenWindowPositions.RIGHT; this.mode = mode; switch (mode) { - case Tiling.FocusModes.CENTER: - this.gicon = this.gIconCenter; + case Settings.OpenWindowPositions.LEFT: + this.gicon = this.gIconRight; break; - case Tiling.FocusModes.EDGE: - this.gicon = this.gIconEdge; + case Settings.OpenWindowPositions.START: + this.gicon = this.gIconStart; + break; + case Settings.OpenWindowPositions.END: + this.gicon = this.gIconEnd; break; default: - this.gicon = this.gIconDefault; + this.gicon = this.gIconRight; break; } @@ -466,28 +469,27 @@ export const OpenPositionIcon = GObject.registerClass( return this; }, () => { - const markup = (color, mode) => { + const markup = mode => { this.tooltip.clutter_text .set_markup( - ` Window focus mode -Current mode: ${mode}`); + ` Open Window Position +Current position: ${mode}`); }; switch (this.mode) { - case Tiling.FocusModes.DEFAULT: - markup('#6be67b', 'DEFAULT'); + case Settings.OpenWindowPositions.LEFT: + markup('LEFT'); return; - case Tiling.FocusModes.CENTER: - markup('#6be6cb', 'CENTER'); + case Settings.OpenWindowPositions.START: + markup('START'); break; - case Tiling.FocusModes.EDGE: - markup('#abe67b', 'EDGE'); + case Settings.OpenWindowPositions.END: + markup('END'); break; default: - markup('#6be67b', 'DEFAULT'); - this.tooltip.set_text(''); + markup('RIGHT'); break; } - }, + } ); } } From 0146b5cc821a9c60e8575695062662a385212a46 Mon Sep 17 00:00:00 2001 From: Jay Ta'ala Date: Thu, 18 Apr 2024 02:20:45 +1000 Subject: [PATCH 07/16] WIP: implementing. --- ...ter.svg => focus-mode-center-symbolic.svg} | 0 ...lt.svg => focus-mode-default-symbolic.svg} | 0 ...-edge.svg => focus-mode-edge-symbolic.svg} | 0 ...end.svg => open-position-end-symbolic.svg} | 0 ...ft.svg => open-position-left-symbolic.svg} | 0 ...t.svg => open-position-right-symbolic.svg} | 0 ...t.svg => open-position-start-symbolic.svg} | 0 tiling.js | 2 +- topbar.js | 64 +++++++++---------- 9 files changed, 33 insertions(+), 33 deletions(-) rename resources/{focus-mode-center.svg => focus-mode-center-symbolic.svg} (100%) rename resources/{focus-mode-default.svg => focus-mode-default-symbolic.svg} (100%) rename resources/{focus-mode-edge.svg => focus-mode-edge-symbolic.svg} (100%) rename resources/{open-position-end.svg => open-position-end-symbolic.svg} (100%) rename resources/{open-position-left.svg => open-position-left-symbolic.svg} (100%) rename resources/{open-position-right.svg => open-position-right-symbolic.svg} (100%) rename resources/{open-position-start.svg => open-position-start-symbolic.svg} (100%) diff --git a/resources/focus-mode-center.svg b/resources/focus-mode-center-symbolic.svg similarity index 100% rename from resources/focus-mode-center.svg rename to resources/focus-mode-center-symbolic.svg diff --git a/resources/focus-mode-default.svg b/resources/focus-mode-default-symbolic.svg similarity index 100% rename from resources/focus-mode-default.svg rename to resources/focus-mode-default-symbolic.svg diff --git a/resources/focus-mode-edge.svg b/resources/focus-mode-edge-symbolic.svg similarity index 100% rename from resources/focus-mode-edge.svg rename to resources/focus-mode-edge-symbolic.svg diff --git a/resources/open-position-end.svg b/resources/open-position-end-symbolic.svg similarity index 100% rename from resources/open-position-end.svg rename to resources/open-position-end-symbolic.svg diff --git a/resources/open-position-left.svg b/resources/open-position-left-symbolic.svg similarity index 100% rename from resources/open-position-left.svg rename to resources/open-position-left-symbolic.svg diff --git a/resources/open-position-right.svg b/resources/open-position-right-symbolic.svg similarity index 100% rename from resources/open-position-right.svg rename to resources/open-position-right-symbolic.svg diff --git a/resources/open-position-start.svg b/resources/open-position-start-symbolic.svg similarity index 100% rename from resources/open-position-start.svg rename to resources/open-position-start-symbolic.svg diff --git a/tiling.js b/tiling.js index 7fcff294..ef99f259 100644 --- a/tiling.js +++ b/tiling.js @@ -4730,7 +4730,7 @@ export function fitProportionally(values, targetSum) { let weights = values.map(v => v / sum); let fitted = Lib.zip(values, weights).map( - ([h, w]) => Math.round(targetSum * w) + ([_h, w]) => Math.round(targetSum * w) ); let r = targetSum - Lib.sum(fitted); fitted[0] += r; diff --git a/topbar.js b/topbar.js index c0232841..2fca0201 100644 --- a/topbar.js +++ b/topbar.js @@ -24,7 +24,7 @@ const display = global.display; export let panelBox = Main.layoutManager.panelBox; -export let menu, focusButton; +export let menu, focusButton, openPositionButton; let openPrefs, screenSignals, signals, gsettings; export function enable (extension) { openPrefs = () => extension.openPreferences(); @@ -37,9 +37,11 @@ export function enable (extension) { menu = new WorkspaceMenu(); focusButton = new FocusButton(); + openPositionButton = new OpenPositionButton(); Main.panel.addToStatusArea('WorkspaceMenu', menu, 1, 'left'); Main.panel.addToStatusArea('FocusButton', focusButton, 2, 'left'); + Main.panel.addToStatusArea('OpenPositionButton', openPositionButton, 3, 'left'); Tiling.spaces.forEach(s => { s.workspaceLabel.clutter_text.set_font_description(menu.label.clutter_text.font_description); @@ -103,6 +105,8 @@ export function disable() { signals = null; focusButton.destroy(); focusButton = null; + openPositionButton.destroy(); + openPositionButton = null; menu.destroy(); menu = null; Main.panel.statusArea.activities.show(); @@ -253,7 +257,7 @@ const BaseIcon = GObject.registerClass( _init( props = {}, tooltipProps = {}, - initIcons = () => {}, + init = () => {}, setMode = _mode => {}, updateTooltipText = () => {} ) { @@ -263,13 +267,13 @@ const BaseIcon = GObject.registerClass( this.tooltip_parent = tooltipProps?.parent ?? this; this.tooltip_x_point = tooltipProps?.x_point ?? 0; - initIcons(); - + // assign functions this.setMode = setMode; - setMode(); - this.updateTooltipText = updateTooltipText; + + init(); this.initToolTip(); + this.setMode(); this.reactive = true; this.connect('button-press-event', () => { @@ -338,9 +342,9 @@ export const FocusIcon = GObject.registerClass( tooltipProps, () => { const pather = relativePath => GLib.uri_resolve_relative(import.meta.url, relativePath, GLib.UriFlags.NONE); - this.gIconDefault = Gio.icon_new_for_string(pather('./resources/focus-mode-default.svg')); - this.gIconCenter = Gio.icon_new_for_string(pather('./resources/focus-mode-center.svg')); - this.gIconEdge = Gio.icon_new_for_string(pather('./resources/focus-mode-edge.svg')); + this.gIconDefault = Gio.icon_new_for_string(pather('./resources/focus-mode-default-symbolic.svg')); + this.gIconCenter = Gio.icon_new_for_string(pather('./resources/focus-mode-center-symbolic.svg')); + this.gIconEdge = Gio.icon_new_for_string(pather('./resources/focus-mode-edge-symbolic.svg')); }, mode => { mode = mode ?? Tiling.FocusModes.DEFAULT; @@ -396,7 +400,7 @@ export const FocusButton = GObject.registerClass( this._icon = new FocusIcon({ style_class: 'system-status-icon focus-mode-button', - }, this, -10); + }, { parent: this, x_point: -10 }); this.setFocusMode(); this.add_child(this._icon); @@ -441,10 +445,16 @@ export const OpenPositionIcon = GObject.registerClass( tooltipProps, () => { const pather = relativePath => GLib.uri_resolve_relative(import.meta.url, relativePath, GLib.UriFlags.NONE); - this.gIconRight = Gio.icon_new_for_string(pather('./resources/open-position-right.svg')); - this.gIconLeft = Gio.icon_new_for_string(pather('./resources/open-position-left.svg')); - this.gIconStart = Gio.icon_new_for_string(pather('./resources/open-position-start.svg')); - this.gIconEnd = Gio.icon_new_for_string(pather('./resources/open-position-end.svg')); + this.gIconRight = Gio.icon_new_for_string(pather('./resources/open-position-right-symbolic.svg')); + this.gIconLeft = Gio.icon_new_for_string(pather('./resources/open-position-left-symbolic.svg')); + this.gIconStart = Gio.icon_new_for_string(pather('./resources/open-position-start-symbolic.svg')); + this.gIconEnd = Gio.icon_new_for_string(pather('./resources/open-position-end-symbolic.svg')); + + // connection to update based on gsetting + signals.connect(gsettings, 'changed::open-window-position', (_settings, _key) => { + const mode = Settings.prefs.open_window_position; + this.setMode(mode); + }); }, mode => { mode = mode ?? Settings.OpenWindowPositions.RIGHT; @@ -452,7 +462,7 @@ export const OpenPositionIcon = GObject.registerClass( switch (mode) { case Settings.OpenWindowPositions.LEFT: - this.gicon = this.gIconRight; + this.gicon = this.gIconLeft; break; case Settings.OpenWindowPositions.START: this.gicon = this.gIconStart; @@ -500,37 +510,27 @@ export const OpenPositionButton = GObject.registerClass( _init() { super._init(0.0, 'OpenPosition'); - this._icon = new FocusIcon({ + this._icon = new OpenPositionIcon({ style_class: 'system-status-icon focus-mode-button', }, this, -10); - this.setFocusMode(); + this.setPositionMode(); this.add_child(this._icon); this.connect('event', this._onClicked.bind(this)); } /** - * Sets the focus mode with this button. + * Sets the position mode with this button. * @param {*} mode */ - setFocusMode(mode) { - mode = mode ?? Tiling.FocusModes.DEFAULT; - this.focusMode = mode; + setPositionMode(mode) { + mode = mode ?? Settings.OpenWindowPositions.RIGHT; + this.positionMode = mode; this._icon.setMode(mode); return this; } - _onClicked(actor, event) { - if (Tiling.inPreview !== Tiling.PreviewMode.NONE || Main.overview.visible) { - return Clutter.EVENT_PROPAGATE; - } - - if (event.type() !== Clutter.EventType.TOUCH_BEGIN && - event.type() !== Clutter.EventType.BUTTON_PRESS) { - return Clutter.EVENT_PROPAGATE; - } - - Tiling.switchToNextFocusMode(); + _onClicked(_actor, _event) { return Clutter.EVENT_PROPAGATE; } } From c5459a6425fe3767ec5a0ac15e09de4b5b1fdd0c Mon Sep 17 00:00:00 2001 From: Jay Ta'ala Date: Thu, 18 Apr 2024 10:21:03 +1000 Subject: [PATCH 08/16] Added click function to OpenPositionIcon. --- topbar.js | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/topbar.js b/topbar.js index 2fca0201..48eba750 100644 --- a/topbar.js +++ b/topbar.js @@ -455,6 +455,11 @@ export const OpenPositionIcon = GObject.registerClass( const mode = Settings.prefs.open_window_position; this.setMode(mode); }); + + // let's set out click function for this icon here + this.setClickFunction(() => { + switchToOpenPositionMode(); + }); }, mode => { mode = mode ?? Settings.OpenWindowPositions.RIGHT; @@ -482,7 +487,7 @@ export const OpenPositionIcon = GObject.registerClass( const markup = mode => { this.tooltip.clutter_text .set_markup( - ` Open Window Position + ` Open Window Position Current position: ${mode}`); }; switch (this.mode) { @@ -505,6 +510,21 @@ Current position: ${mode}`); } ); +/** + * Switches to the next focus mode for a space. + * @param {Space} space + */ +export function switchToOpenPositionMode() { + const numModes = Object.keys(Settings.OpenWindowPositions).length; + // for currMode we switch to 1-based to use it validly in remainder operation + const currMode = Object.values(Settings.OpenWindowPositions) + .indexOf(Settings.prefs.open_window_position) + 1; + const nextMode = currMode % numModes; + + // simply need to set gsettings and mode will be set and updated + gsettings.set_int('open-window-position', nextMode); +} + export const OpenPositionButton = GObject.registerClass( class OpenPositionButton extends panelMenu.Button { _init() { From 35f6c759d42105cf5751cc14d19652899a37784c Mon Sep 17 00:00:00 2001 From: Jay Ta'ala Date: Thu, 18 Apr 2024 19:51:19 +1000 Subject: [PATCH 09/16] WIP: add advanced options. --- Settings.ui | 143 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 143 insertions(+) diff --git a/Settings.ui b/Settings.ui index 8347208c..61920d28 100644 --- a/Settings.ui +++ b/Settings.ui @@ -1650,6 +1650,149 @@ + + + + + False + False + + + False + 12 + 12 + 6 + 6 + + + False + 12 + 1 + True + Availble options for the <i>open window position</i> button. + +Selected options will be cycled through when clicking the +button or using the <i>cycle through window open positions</i> +shortcut. + + 1 + 0 + + 0 + 0 + + + + + + False + none + + + + False + False + + + False + 6 + 6 + 4 + 4 + 5 + 12 + + + False + 1 + RIGHT + 0 + + 0 + 0 + + + + + + + 1 + 0 + + + + + + False + 1 + LEFT + 0 + + 0 + 1 + + + + + + + 1 + 1 + + + + + + False + 1 + START + 0 + + 0 + 2 + + + + + + + 1 + 2 + + + + + + False + 1 + END + 0 + + 0 + 3 + + + + + + + 1 + 3 + + + + + + + + + + + + + From b59a0eac554a6296dcd916c569b97f885a1467d5 Mon Sep 17 00:00:00 2001 From: Jay Ta'ala Date: Thu, 18 Apr 2024 20:35:40 +1000 Subject: [PATCH 10/16] Added options for cycling through window open positions. --- schemas/gschemas.compiled | Bin 9405 -> 9725 bytes ...gnome.shell.extensions.paperwm.gschema.xml | 12 ++++++++++++ 2 files changed, 12 insertions(+) diff --git a/schemas/gschemas.compiled b/schemas/gschemas.compiled index 8d97f6d12ebf87b7102554dd56c5183ad52fcad7..66aef6ae632a5a77fa5ccc193e1a436a5aa23290 100644 GIT binary patch delta 2492 zcmaJ?eQXp(9G#Y{9MIAN{qBAD4)>r-8C+ z{?P>ES9K*+XaytKNHl_Iz(hzZHUSmegkVSvhQ!3wKWa#T2rA-xdp*+l2a~*gZ{PfO zW_IQ`GiTP{eRg1=_OwR`PsN2Z1wx3fun-NRMH~Se5&KPl@2%`Sy_aREiZ zTwoqB|9@D3_flZ-43>b2@>!^auClil)@A)rc?6;BXAl7|1*BPsLN5mz02$!u^6*K! z3aaqVpIRik#UywdD0;``qEB53-|ZEm1cw79)kY3~X7u zvWpee<@n$__!jWme%BTH)Wz`KJ|Ug}UQy34rcb>PehYXb@Us7i(=oLNz5(t9Hm6Ql zjHhP&Uhr@hk5J@biWS4us2By01OGO;Z_uZ%fPW1<1xyUR;miKgcM;LX4gG|)Xa$i@E}lBA;dit=q##R9kUhL_mea=#t*1# z@j()706o^K1bu2R8v+jjd++`BJ$-6F{88{YaO$I{z4WQM_E*5SfU|buFnwzJ?hyJf z4+(K(&GcDTP;(}lz^j1f3oj`2sh7ZS0dD}Lit$VIskt;sumOzj?pwe=qb`Eq3qAyV zvHZnTjHl)cxvtr2`mG} z;m9%i)a;-I+y)eGs&kf@dOrMZ;3RP3o8^;?&+>&I>;d-!<0H-MSV7G-8w7s}bWdD# zl99R&{(104pzqpAXF$|Ux+(B=U}Ws`-`Nhe8~$zZU7+&AbB<5FKyZuKA(Lx6nHYFrL~k| z$W~10RC9GJopP>ONbzX5YGyQ4$tlI`(9%u-Pf{Ui_O4J34_8P3;0g2C6QY0*NsGqS zgwoZSk=vEn_6}3;O2=8jB3ZWXbG|GPQoHT)1?}Dbb+rn|kV}%ef2ZSmk8J3c<}|Gv4w+g< zGQ$Q@IEbi~L{vhLby;#skE^m4W7|&24Kf(Ew}re*dUSKUWhgOKj_IAc$;q@^0wYTw z)R~o0Omv1`>>;m@JDEkYqDkG zeoW2WCCAGQn^qJ8IE`=$2(b*P1+Yc17q&3}ayKJV3%SLeDFn_)u>vRo76N4e7nk=} zF~IxnVPFoBzw>IKdC&3I(4&V+=Ns9used-5&rt>nVjiR40fKIF6WQN{8d#m>Ea}zrKXuy-59Oi z=c%&G>b-^drMf^ZrClgK8%IKyl zZ&!D;BYAV%70Hr|pJyxejadULFb{it54aylnm4a<#i@Dq4uXe)`~^bI`{OY9G_dZG zHKmNF=J7iU9tWN&KDdiMwF~|v_%bkD@v#$6jd;Jf1~CQnSM_!918N?dx50NK_KNUZ F{{dCJ_c8zg delta 2338 zcmZXVYitx%9K~;;D+LODKuc-2-EO;;U0}j05Sth%5;P@%iBV$Xv(ugFcEaw=Iy2pE z39$H~kwlHfu>pC+8i~cGMiCP*W(gHZ-~-ZxNcusDiHWI+AW2EY2kJSOT@an*x97~c zcV_O~d*{EmH{~`C4%W8&h45FM&lL$FRyPZ=T(k=f8VwyA{joZ`3~}L@0WXWbMJKceoE>S~z?{AU`EKYC=tv%OnA6WkeiWJmBjca_Z zikQ<^WYI7M<7*J&xwR{M*+9P#c_Xw1G_@Q|GM65CJF+d{uV~3Mb9&B14>Scnnfk_N zPG5t35A;oN;=}dz%;_tU4@0v#{G9T-huJ{Sh6(6*z<6iXQ_SfXBfkYL4hV62=dQV& z33?y$a_A!<)NdeUO>+!*bhAnj;y(Mia9;k@+33|MvrS<%;|Zf3FsuK{@@ID z^&LMK`4qCcCLw;G9{G(qJ-?19v=wA8ho{Ebz>``ubU-`7)td+81@wGyA9N?!xHNi` z{pmT-LFj()Qs9Vu0eblrKu?3Q?LS;(e|p|$5_$#r-Yzai{+K+GYl-kSn6b4^t|k2( zTu_4IP!7@;FUZ|aUxz#jWj*t@G}UB>@dObzB2LCg>58M9j^P?qJ=9 z@}0YFBjy^GDVtWx<5Js!cX@o#Ci`U!Gi6&Thdsio6S2~|oi_B0g2(jQx{@}$?e!Je zBH3<4SnXIPSvB#&h!!v#ECnoLtep7bWx->G#CxJX2*JX~(!vVLgL|8mlvS9OmPL`( zcotX;Sdr&~N`T6o6|9mo00*)VGy;}nR!x@anSf;(TSC~n<60QI>bh#IM@d?mnou-D zO;~ZfXV{4pI_O$lS6m}um~olM`eO-Q$rzg3qd2b4S^0YX$HvuHyvzO??{a;>JKV5o zvD0H^(8<&wDT|9?nM#*x7kT5sXT0l8wWXq49@jC&n)l_LhcGzDO9k;^-C2V(Y>3GF zbX&1rheOmABW9W2jrxt%y^gMEdbiq}aB<(*wzzHenwqzyIWjA0m_|}fd9MW{d|Qm# zh-55#o0C#wx)QSzmhE_Z0wYz0SKOxecVVbp->~DY3WWSB?;ywQ8cAK=1V0mUNZxx* z0WQf6udKO2{r?!`T_Tp5=vSPWt-6?9!&C};M&2vj6~PvAjTq)UsoHTvZa%K(ePeZ2 zAlN&)ssXcL8`~|@y{|u)nEk!YK|hw=dor-(<-&08O&L4MZiNvjn4kR8I7&*l72C?N z3qMl%3CX3qJ71U>j1zmMNQAq*pZ&qg{IbT?l-y;w#v5yH;BLqDU6H+G%f0tQE3#4S z=h^s9*Fhf#J@(Bj+@18S^&QX`LE&$eo`0*I&_1x?;WcIKPtQM@-OvH>MCrjD%;}4f m4?>5);i`{he|q!}h+&wcU|`X%I4_`QK{*M{g*>z6t$zT+#^BQc diff --git a/schemas/org.gnome.shell.extensions.paperwm.gschema.xml b/schemas/org.gnome.shell.extensions.paperwm.gschema.xml index a372d9d5..7b22103d 100644 --- a/schemas/org.gnome.shell.extensions.paperwm.gschema.xml +++ b/schemas/org.gnome.shell.extensions.paperwm.gschema.xml @@ -509,6 +509,18 @@ 0 Sets the position to open a new window (e.g right of current window). RIGHT: 0, LEFT: 1, START: 2, END: 3 + + true + + + true + + + false + + + false + false From badd63bb304354f7a278c501e0d39485e207dceb Mon Sep 17 00:00:00 2001 From: Jay Ta'ala Date: Thu, 18 Apr 2024 21:14:45 +1000 Subject: [PATCH 11/16] Implemented cycling through only active positions. --- Settings.ui | 8 ++++---- prefs.js | 6 ++++++ settings.js | 2 ++ topbar.js | 49 ++++++++++++++++++++++++++++++++++++++++++------- 4 files changed, 54 insertions(+), 11 deletions(-) diff --git a/Settings.ui b/Settings.ui index 61920d28..3028fb2c 100644 --- a/Settings.ui +++ b/Settings.ui @@ -1716,7 +1716,7 @@ shortcut. - + 1 0 @@ -1736,7 +1736,7 @@ shortcut. - + 1 1 @@ -1756,7 +1756,7 @@ shortcut. - + 1 2 @@ -1776,7 +1776,7 @@ shortcut. - + 1 3 diff --git a/prefs.js b/prefs.js index 6d44c806..fd3b5c9a 100644 --- a/prefs.js +++ b/prefs.js @@ -271,6 +271,12 @@ class SettingsWidget { } }); + // plug up options + booleanStateChanged('open-window-position-option-right'); + booleanStateChanged('open-window-position-option-left'); + booleanStateChanged('open-window-position-option-start'); + booleanStateChanged('open-window-position-option-end'); + const scratchOverview = this.builder.get_object('scratch-in-overview'); if (this._settings.get_boolean('only-scratch-in-overview')) scratchOverview.set_active_id('only'); diff --git a/settings.js b/settings.js index 36151f54..8d524e27 100644 --- a/settings.js +++ b/settings.js @@ -42,6 +42,8 @@ export function enable(extension) { 'gesture-workspace-fingers', 'open-window-position', 'overview-ensure-viewport-animation', 'overview-min-windows-per-row', 'overview-max-window-scale', 'minimap-shade-opacity', 'selection-border-size', + 'open-window-position-option-right', 'open-window-position-option-left', + 'open-window-position-option-start', 'open-window-position-option-end', ] .forEach(k => setState(null, k)); prefs.__defineGetter__("minimum_margin", () => { diff --git a/topbar.js b/topbar.js index 48eba750..63c51a36 100644 --- a/topbar.js +++ b/topbar.js @@ -26,7 +26,28 @@ export let panelBox = Main.layoutManager.panelBox; export let menu, focusButton, openPositionButton; let openPrefs, screenSignals, signals, gsettings; +let activeOpenWindowPositions; + export function enable (extension) { + activeOpenWindowPositions = [ + { + mode: Settings.OpenWindowPositions.RIGHT, + active: () => Settings.prefs.open_window_position_option_right, + }, + { + mode: Settings.OpenWindowPositions.LEFT, + active: () => Settings.prefs.open_window_position_option_left, + }, + { + mode: Settings.OpenWindowPositions.START, + active: () => Settings.prefs.open_window_position_option_start, + }, + { + mode: Settings.OpenWindowPositions.END, + active: () => Settings.prefs.open_window_position_option_end, + }, + ]; + openPrefs = () => extension.openPreferences(); gsettings = extension.getSettings(); @@ -107,6 +128,7 @@ export function disable() { focusButton = null; openPositionButton.destroy(); openPositionButton = null; + activeOpenWindowPositions = null; menu.destroy(); menu = null; Main.panel.statusArea.activities.show(); @@ -458,7 +480,7 @@ export const OpenPositionIcon = GObject.registerClass( // let's set out click function for this icon here this.setClickFunction(() => { - switchToOpenPositionMode(); + switchToNextOpenPositionMode(); }); }, mode => { @@ -514,12 +536,25 @@ Current position: ${mode}`); * Switches to the next focus mode for a space. * @param {Space} space */ -export function switchToOpenPositionMode() { - const numModes = Object.keys(Settings.OpenWindowPositions).length; - // for currMode we switch to 1-based to use it validly in remainder operation - const currMode = Object.values(Settings.OpenWindowPositions) - .indexOf(Settings.prefs.open_window_position) + 1; - const nextMode = currMode % numModes; +export function switchToNextOpenPositionMode() { + const activeModes = activeOpenWindowPositions + .filter(m => m.active()) + .map(m => m.mode); + + // if activeModes are empty, do nothing + if (activeModes.length <= 0) { + return; + } + + const currMode = activeModes.indexOf(Settings.prefs.open_window_position) + 1; + // if current mode is -1, then set the mode to the first option + let nextMode; + if (currMode < 0) { + nextMode = activeModes[0]; + } + else { + nextMode = currMode % activeModes.length; + } // simply need to set gsettings and mode will be set and updated gsettings.set_int('open-window-position', nextMode); From 9fdbc6284864f25a3d63040d572d22eebebaea7f Mon Sep 17 00:00:00 2001 From: Jay Ta'ala Date: Thu, 18 Apr 2024 21:55:23 +1000 Subject: [PATCH 12/16] Fixed cycling algorithm. --- topbar.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/topbar.js b/topbar.js index 63c51a36..d9cd9f49 100644 --- a/topbar.js +++ b/topbar.js @@ -546,14 +546,15 @@ export function switchToNextOpenPositionMode() { return; } - const currMode = activeModes.indexOf(Settings.prefs.open_window_position) + 1; + const currIndex = activeModes.indexOf(Settings.prefs.open_window_position); // if current mode is -1, then set the mode to the first option let nextMode; - if (currMode < 0) { + if (currIndex < 0) { + console.log(`couldn't find`); nextMode = activeModes[0]; } else { - nextMode = currMode % activeModes.length; + nextMode = activeModes[(currIndex + 1) % activeModes.length]; } // simply need to set gsettings and mode will be set and updated @@ -569,7 +570,7 @@ export const OpenPositionButton = GObject.registerClass( style_class: 'system-status-icon focus-mode-button', }, this, -10); - this.setPositionMode(); + this.setPositionMode(Settings.prefs.open_window_position); this.add_child(this._icon); this.connect('event', this._onClicked.bind(this)); } From 59f6fdf3e437b43ebabf35b6d3b0ee1820e9b463 Mon Sep 17 00:00:00 2001 From: Jay Ta'ala Date: Thu, 18 Apr 2024 22:13:23 +1000 Subject: [PATCH 13/16] Added keybind (super+shift+w). --- keybindings.js | 6 +++++- prefsKeybinding.js | 1 + schemas/gschemas.compiled | Bin 9725 -> 9861 bytes ...gnome.shell.extensions.paperwm.gschema.xml | 5 +++++ 4 files changed, 11 insertions(+), 1 deletion(-) diff --git a/keybindings.js b/keybindings.js index afc28732..2221cca6 100644 --- a/keybindings.js +++ b/keybindings.js @@ -6,7 +6,8 @@ import * as Main from 'resource:///org/gnome/shell/ui/main.js'; import { Settings, Utils, Tiling, Navigator, - App, Scratch, LiveAltTab + App, Scratch, LiveAltTab, + Topbar } from './imports.js'; const Seat = Clutter.get_default_backend().get_default_seat(); @@ -222,6 +223,9 @@ export function setupActions(settings) { registerPaperAction("switch-focus-mode", Tiling.switchToNextFocusMode); + registerPaperAction("switch-open-window-position", + Topbar.switchToNextOpenPositionMode); + registerPaperAction("resize-h-inc", Tiling.resizeHInc, Meta.KeyBindingFlags.PER_WINDOW); diff --git a/prefsKeybinding.js b/prefsKeybinding.js index ccde6a56..d6f9c9bb 100644 --- a/prefsKeybinding.js +++ b/prefsKeybinding.js @@ -44,6 +44,7 @@ const actions = { 'live-alt-tab-scratch', 'live-alt-tab-scratch-backward', 'switch-focus-mode', + 'switch-open-window-position', 'move-left', 'move-right', 'move-up', diff --git a/schemas/gschemas.compiled b/schemas/gschemas.compiled index 66aef6ae632a5a77fa5ccc193e1a436a5aa23290..b0bf7f7c0b52c16a8efc2d80c31b0c71ad4cb27b 100644 GIT binary patch literal 9861 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 diff --git a/schemas/org.gnome.shell.extensions.paperwm.gschema.xml b/schemas/org.gnome.shell.extensions.paperwm.gschema.xml index 7b22103d..6c1fe8f3 100644 --- a/schemas/org.gnome.shell.extensions.paperwm.gschema.xml +++ b/schemas/org.gnome.shell.extensions.paperwm.gschema.xml @@ -167,6 +167,11 @@ Switch between Window Focus Modes (e.g. default, center) + + w']]]> + Switch between positions for creating windows (e.g. right, left) + + period']]]> Switch to the next window From 1ae466b31ba152fa3a442f0ca23aabf96c790bff Mon Sep 17 00:00:00 2001 From: Jay Ta'ala Date: Thu, 18 Apr 2024 22:56:11 +1000 Subject: [PATCH 14/16] Click fixes (now on button no icon). --- stylesheet.css | 6 ++++++ topbar.js | 14 +++++--------- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/stylesheet.css b/stylesheet.css index d79761f3..1757dbd8 100644 --- a/stylesheet.css +++ b/stylesheet.css @@ -25,6 +25,12 @@ NOTE: please update `./config/users.css` with any new styles added here. background-color: transparent; } +.open-position-icon { + icon-size: 22px; + padding: 0; + background-color: transparent; +} + .focus-button-tooltip { background-color: rgba(0, 0, 0, 0.8); padding: 8px; diff --git a/topbar.js b/topbar.js index d9cd9f49..d867b671 100644 --- a/topbar.js +++ b/topbar.js @@ -440,7 +440,7 @@ export const FocusButton = GObject.registerClass( return this; } - _onClicked(actor, event) { + _onClicked(_actor, event) { if (Tiling.inPreview !== Tiling.PreviewMode.NONE || Main.overview.visible) { return Clutter.EVENT_PROPAGATE; } @@ -477,11 +477,6 @@ export const OpenPositionIcon = GObject.registerClass( const mode = Settings.prefs.open_window_position; this.setMode(mode); }); - - // let's set out click function for this icon here - this.setClickFunction(() => { - switchToNextOpenPositionMode(); - }); }, mode => { mode = mode ?? Settings.OpenWindowPositions.RIGHT; @@ -567,12 +562,12 @@ export const OpenPositionButton = GObject.registerClass( super._init(0.0, 'OpenPosition'); this._icon = new OpenPositionIcon({ - style_class: 'system-status-icon focus-mode-button', - }, this, -10); + style_class: 'system-status-icon open-position-icon', + }, { parent: this, x_point: -10 }); this.setPositionMode(Settings.prefs.open_window_position); this.add_child(this._icon); - this.connect('event', this._onClicked.bind(this)); + this.connect('button-press-event', this._onClicked.bind(this)); } /** @@ -587,6 +582,7 @@ export const OpenPositionButton = GObject.registerClass( } _onClicked(_actor, _event) { + switchToNextOpenPositionMode(); return Clutter.EVENT_PROPAGATE; } } From d436c6b19e86c3e3f4512000786927535377fab9 Mon Sep 17 00:00:00 2001 From: Jay Ta'ala Date: Thu, 18 Apr 2024 23:09:19 +1000 Subject: [PATCH 15/16] Added option to settings to hide the open position icon. --- Settings.ui | 38 ++++++++++++++++++ prefs.js | 1 + schemas/gschemas.compiled | Bin 9861 -> 9933 bytes ...gnome.shell.extensions.paperwm.gschema.xml | 5 +++ settings.js | 6 +-- topbar.js | 9 +++++ 6 files changed, 56 insertions(+), 3 deletions(-) diff --git a/Settings.ui b/Settings.ui index 3028fb2c..86b1c6d3 100644 --- a/Settings.ui +++ b/Settings.ui @@ -1222,6 +1222,44 @@ + + + False + False + + + False + Shows/hides the open window position icon in TopBar + 12 + 12 + 6 + 6 + 32 + + + False + 1 + Show open window position icon + 1 + 0 + + 0 + 0 + + + + + + + 1 + 0 + + + + + + + False diff --git a/prefs.js b/prefs.js index fd3b5c9a..34c30e42 100644 --- a/prefs.js +++ b/prefs.js @@ -441,6 +441,7 @@ class SettingsWidget { intValueChanged('overview_min_windows_per_row_spin', 'overview-min-windows-per-row'); booleanStateChanged('show-focus-mode-icon'); + booleanStateChanged('show-open-position-icon'); booleanStateChanged('disable-topbar-styling', true); // disabled since opposite of gnome-pill // booleanSetState('show-workspace-indicator'); diff --git a/schemas/gschemas.compiled b/schemas/gschemas.compiled index b0bf7f7c0b52c16a8efc2d80c31b0c71ad4cb27b..54a69b2f8fcc874583e036493c291efb437ef2be 100644 GIT binary patch delta 2326 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 LI>=16uFd=daTw9P diff --git a/schemas/org.gnome.shell.extensions.paperwm.gschema.xml b/schemas/org.gnome.shell.extensions.paperwm.gschema.xml index 6c1fe8f3..1f835488 100644 --- a/schemas/org.gnome.shell.extensions.paperwm.gschema.xml +++ b/schemas/org.gnome.shell.extensions.paperwm.gschema.xml @@ -547,6 +547,11 @@ Show the focus mode icon in the topbar + + true + Show the open window position icon + + 0.25 Duration of animations in seconds diff --git a/settings.js b/settings.js index 8d524e27..98495d20 100644 --- a/settings.js +++ b/settings.js @@ -37,9 +37,9 @@ export function enable(extension) { 'swipe-sensitivity', 'swipe-friction', 'cycle-width-steps', 'cycle-height-steps', 'maximize-width-percent', 'minimap-scale', 'edge-preview-scale', 'window-switcher-preview-scale', 'winprops', 'show-workspace-indicator', - 'show-window-position-bar', 'show-focus-mode-icon', 'disable-topbar-styling', - 'default-focus-mode', 'gesture-enabled', 'gesture-horizontal-fingers', - 'gesture-workspace-fingers', 'open-window-position', + 'show-window-position-bar', 'show-focus-mode-icon', 'show-open-position-icon', + 'disable-topbar-styling', 'default-focus-mode', 'gesture-enabled', + 'gesture-horizontal-fingers', 'gesture-workspace-fingers', 'open-window-position', 'overview-ensure-viewport-animation', 'overview-min-windows-per-row', 'overview-max-window-scale', 'minimap-shade-opacity', 'selection-border-size', 'open-window-position-option-right', 'open-window-position-option-left', diff --git a/topbar.js b/topbar.js index d867b671..1a1e0aa6 100644 --- a/topbar.js +++ b/topbar.js @@ -70,6 +70,7 @@ export function enable (extension) { fixWorkspaceIndicator(); fixFocusModeIcon(); + fixOpenPositionIcon(); fixStyle(); screenSignals.push( @@ -107,6 +108,10 @@ export function enable (extension) { fixFocusModeIcon(); }); + signals.connect(gsettings, 'changed::show-open-position-icon', (_settings, _key) => { + fixOpenPositionIcon(); + }); + signals.connect(panelBox, 'show', () => { fixTopBar(); }); @@ -940,6 +945,10 @@ export function fixFocusModeIcon() { Tiling.spaces.forEach(s => s.showFocusModeIcon()); } +export function fixOpenPositionIcon() { + Settings.prefs.show_open_position_icon ? openPositionButton.show() : openPositionButton.hide(); +} + /** Override the activities label with the workspace name. let workspaceIndex = 0 From e0ec9cca5c95e33a2161b96d6764e4d5c7c0eed8 Mon Sep 17 00:00:00 2001 From: Jay Ta'ala Date: Fri, 19 Apr 2024 08:13:34 +1000 Subject: [PATCH 16/16] Cleanup. --- keybindings.js | 3 +-- topbar.js | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/keybindings.js b/keybindings.js index 2221cca6..8b182262 100644 --- a/keybindings.js +++ b/keybindings.js @@ -6,8 +6,7 @@ import * as Main from 'resource:///org/gnome/shell/ui/main.js'; import { Settings, Utils, Tiling, Navigator, - App, Scratch, LiveAltTab, - Topbar + App, Scratch, LiveAltTab, Topbar } from './imports.js'; const Seat = Clutter.get_default_backend().get_default_seat(); diff --git a/topbar.js b/topbar.js index 1a1e0aa6..9eb8c37e 100644 --- a/topbar.js +++ b/topbar.js @@ -533,8 +533,7 @@ Current position: ${mode}`); ); /** - * Switches to the next focus mode for a space. - * @param {Space} space + * Switches to the next position for opening new windows. */ export function switchToNextOpenPositionMode() { const activeModes = activeOpenWindowPositions