diff --git a/resources/schemas/org.gnome.shell.extensions.tilingshell.gschema.xml b/resources/schemas/org.gnome.shell.extensions.tilingshell.gschema.xml index 196aeb3..5037aa3 100644 --- a/resources/schemas/org.gnome.shell.extensions.tilingshell.gschema.xml +++ b/resources/schemas/org.gnome.shell.extensions.tilingshell.gschema.xml @@ -32,16 +32,49 @@ Shows indicator Shows an indicator on top panel. - + + + 16 + Inner top gap + Gap at the top between windows + + + 16 + Inner bottom gap + Gap at the bottom between windows + + + 16 + Inner left gap + Gap on the left side between windows + + 16 - Inner gaps - Internal gaps between tiles in a layout. + Inner right gap + Gap on the right side between windows - + + 8 - Outer gaps - External gaps between the layout and the monitor borders. + Outer top gap + Gap between windows and top monitor border + + 8 + Outer bottom gap + Gap between windows and bottom monitor border + + + 8 + Outer left gap + Gap between windows and left monitor border + + + 8 + Outer right gap + Gap between windows and right monitor border + + true Span multiple tiles diff --git a/src/prefs.ts b/src/prefs.ts index 748f813..0c947db 100644 --- a/src/prefs.ts +++ b/src/prefs.ts @@ -60,20 +60,82 @@ export default class TilingShellExtensionPreferences extends ExtensionPreference ); appearenceGroup.add(showIndicatorRow); - const innerGapsRow = this._buildSpinButtonRow( - Settings.KEY_INNER_GAPS, - _('Inner gaps'), - _('Gaps between windows'), - ); + // Expandable inner gaps row (dropdown) + const innerGapsRow = new Adw.ExpanderRow({ + title: _('Inner gaps'), + subtitle: _('Gaps between windows'), + }); appearenceGroup.add(innerGapsRow); - const outerGapsRow = this._buildSpinButtonRow( - Settings.KEY_OUTER_GAPS, - _('Outer gaps'), - _('Gaps between a window and the monitor borders'), + // Inner gaps controls + innerGapsRow.add_row( + this._buildSpinButtonRow( + Settings.KEY_INNER_GAPS_LEFT, + _('Left'), + _('Gap on the left side between windows'), + ) ); + innerGapsRow.add_row( + this._buildSpinButtonRow( + Settings.KEY_INNER_GAPS_RIGHT, + _('Right'), + _('Gap on the right side between windows'), + ) + ); + innerGapsRow.add_row( + this._buildSpinButtonRow( + Settings.KEY_INNER_GAPS_TOP, + _('Top'), + _('Gap at the top between windows'), + ) + ); + innerGapsRow.add_row( + this._buildSpinButtonRow( + Settings.KEY_INNER_GAPS_BOTTOM, + _('Bottom'), + _('Gap at the bottom between windows'), + ) + ); + + // Expandable outer gaps row (dropdown) + const outerGapsRow = new Adw.ExpanderRow({ + title: _('Outer gaps'), + subtitle: _('Gaps between windows and monitor borders'), + }); appearenceGroup.add(outerGapsRow); + // Outer gaps controls + outerGapsRow.add_row( + this._buildSpinButtonRow( + Settings.KEY_OUTER_GAPS_LEFT, + _('Left'), + _('Gap between windows and left monitor border'), + ) + ); + outerGapsRow.add_row( + this._buildSpinButtonRow( + Settings.KEY_OUTER_GAPS_RIGHT, + _('Right'), + _('Gap between windows and right monitor border'), + ) + ); + outerGapsRow.add_row( + this._buildSpinButtonRow( + Settings.KEY_OUTER_GAPS_TOP, + _('Top'), + _('Gap between windows and top monitor border'), + ) + ); + outerGapsRow.add_row( + this._buildSpinButtonRow( + Settings.KEY_OUTER_GAPS_BOTTOM, + _('Bottom'), + _('Gap between windows and bottom monitor border'), + ) + ); + + + const blurRow = new Adw.ExpanderRow({ title: _('Blur (experimental feature)'), subtitle: _( diff --git a/src/settings/settings.ts b/src/settings/settings.ts index d925f61..fa0d899 100644 --- a/src/settings/settings.ts +++ b/src/settings/settings.ts @@ -101,8 +101,17 @@ export default class Settings { static KEY_OVERRIDE_WINDOW_MENU = 'override-window-menu'; static KEY_SNAP_ASSISTANT_THRESHOLD = 'snap-assistant-threshold'; static KEY_ENABLE_WINDOW_BORDER = 'enable-window-border'; - static KEY_INNER_GAPS = 'inner-gaps'; - static KEY_OUTER_GAPS = 'outer-gaps'; + + static KEY_INNER_GAPS_TOP = 'inner-gaps-top'; + static KEY_INNER_GAPS_BOTTOM = 'inner-gaps-bottom'; + static KEY_INNER_GAPS_LEFT = 'inner-gaps-left'; + static KEY_INNER_GAPS_RIGHT = 'inner-gaps-right'; + + static KEY_OUTER_GAPS_TOP = 'outer-gaps-top'; + static KEY_OUTER_GAPS_BOTTOM = 'outer-gaps-bottom'; + static KEY_OUTER_GAPS_LEFT = 'outer-gaps-left'; + static KEY_OUTER_GAPS_RIGHT = 'outer-gaps-right'; + static KEY_SNAP_ASSISTANT_ANIMATION_TIME = 'snap-assistant-animation-time'; static KEY_TILE_PREVIEW_ANIMATION_TIME = 'tile-preview-animation-time'; static KEY_SETTING_LAYOUTS_JSON = 'layouts-json'; @@ -226,20 +235,68 @@ export default class Settings { set_activationkey(Settings.KEY_TILING_SYSTEM_DEACTIVATION_KEY, val); } - static get INNER_GAPS(): number { - return get_unsigned_number(Settings.KEY_INNER_GAPS); + static get INNER_GAPS_TOP(): number { + return get_unsigned_number(Settings.KEY_INNER_GAPS_TOP); + } + + static set INNER_GAPS_TOP(val: number) { + set_unsigned_number(Settings.KEY_INNER_GAPS_TOP, val); + } + + static get INNER_GAPS_BOTTOM(): number { + return get_unsigned_number(Settings.KEY_INNER_GAPS_BOTTOM); + } + + static set INNER_GAPS_BOTTOM(val: number) { + set_unsigned_number(Settings.KEY_INNER_GAPS_BOTTOM, val); + } + + static get INNER_GAPS_LEFT(): number { + return get_unsigned_number(Settings.KEY_INNER_GAPS_LEFT); + } + + static set INNER_GAPS_LEFT(val: number) { + set_unsigned_number(Settings.KEY_INNER_GAPS_LEFT, val); + } + + static get INNER_GAPS_RIGHT(): number { + return get_unsigned_number(Settings.KEY_INNER_GAPS_RIGHT); } - static set INNER_GAPS(val: number) { - set_unsigned_number(Settings.KEY_INNER_GAPS, val); + static set INNER_GAPS_RIGHT(val: number) { + set_unsigned_number(Settings.KEY_INNER_GAPS_RIGHT, val); } - static get OUTER_GAPS(): number { - return get_unsigned_number(Settings.KEY_OUTER_GAPS); + static get OUTER_GAPS_TOP(): number { + return get_unsigned_number(Settings.KEY_OUTER_GAPS_TOP); } - static set OUTER_GAPS(val: number) { - set_unsigned_number(Settings.KEY_OUTER_GAPS, val); + static set OUTER_GAPS_TOP(val: number) { + set_unsigned_number(Settings.KEY_OUTER_GAPS_TOP, val); + } + + static get OUTER_GAPS_BOTTOM(): number { + return get_unsigned_number(Settings.KEY_OUTER_GAPS_BOTTOM); + } + + static set OUTER_GAPS_BOTTOM(val: number) { + set_unsigned_number(Settings.KEY_OUTER_GAPS_BOTTOM, val); + } + + static get OUTER_GAPS_LEFT(): number { + return get_unsigned_number(Settings.KEY_OUTER_GAPS_LEFT); + } + + static set OUTER_GAPS_LEFT(val: number) { + set_unsigned_number(Settings.KEY_OUTER_GAPS_LEFT, val); + } + + static get OUTER_GAPS_RIGHT(): number { + return get_unsigned_number(Settings.KEY_OUTER_GAPS_RIGHT); + } + + static set OUTER_GAPS_RIGHT(val: number) { + set_unsigned_number(Settings.KEY_OUTER_GAPS_RIGHT, val); } static get SPAN_MULTIPLE_TILES(): boolean { @@ -445,12 +502,16 @@ export default class Settings { right: number; } { // get the gaps settings and scale by scale factor - const value = this.INNER_GAPS * scaleFactor; + const valueTop = this.INNER_GAPS_TOP * scaleFactor; + const valueBottom = this.INNER_GAPS_BOTTOM * scaleFactor; + const valueLeft = this.INNER_GAPS_LEFT * scaleFactor; + const valueRight = this.INNER_GAPS_RIGHT * scaleFactor; + return { - top: value, - bottom: value, - left: value, - right: value, + top: valueTop, + bottom: valueBottom, + left: valueLeft, + right: valueRight, }; } @@ -461,12 +522,16 @@ export default class Settings { right: number; } { // get the gaps settings and scale by scale factor - const value = this.OUTER_GAPS * scaleFactor; + const valueTop = this.OUTER_GAPS_TOP * scaleFactor; + const valueBottom = this.OUTER_GAPS_BOTTOM * scaleFactor; + const valueLeft = this.OUTER_GAPS_LEFT * scaleFactor; + const valueRight = this.OUTER_GAPS_RIGHT * scaleFactor; + return { - top: value, - bottom: value, - left: value, - right: value, + top: valueTop, + bottom: valueBottom, + left: valueLeft, + right: valueRight, }; }