From 6942df947f6a67e4bfd3ec91ed545938913cb8e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tor=20Hedin=20Br=C3=B8nner?= Date: Tue, 15 May 2018 16:09:55 +0200 Subject: [PATCH] Monitor preference changes Introduces `prefs.js` with simple `settings::change` signal handling. Also put workspace colors in the schema and draw them from there. --- extension.js | 2 +- minimap.js | 8 +- navigator.js | 6 +- prefs.js | 28 ++++++ schemas/gschemas.compiled | Bin 1900 -> 2125 bytes ....shell.extensions.org-scrollwm.gschema.xml | 8 ++ stackoverlay.js | 14 +-- tiling.js | 84 +++++++----------- 8 files changed, 86 insertions(+), 64 deletions(-) create mode 100644 prefs.js diff --git a/extension.js b/extension.js index 199f95e..11bf945 100644 --- a/extension.js +++ b/extension.js @@ -6,7 +6,7 @@ var modules = [ Extension.imports.liveAltTab, Extension.imports.utils, Extension.imports.stackoverlay, Extension.imports.app, Extension.imports.kludges, Extension.imports.topbar, - Extension.imports.navigator + Extension.imports.navigator, Extension.imports.prefs ]; var [ Tiling, Scratch, LiveAltTab, utils, StackOverlay, diff --git a/minimap.js b/minimap.js index 2f2a5b4..5633105 100644 --- a/minimap.js +++ b/minimap.js @@ -9,6 +9,8 @@ var Tiling = Extension.imports.tiling; var utils = Extension.imports.utils; var debug = utils.debug; +var prefs = Extension.imports.prefs.prefs; + var MINIMAP_SCALE = 0.15; function calcOffset(metaWindow) { @@ -96,7 +98,7 @@ class Minimap { actor.add_actor(label); actor.add_actor(clip); clip.add_actor(container); - clip.set_position(12 + Tiling.window_gap, 15 + 10); + clip.set_position(12 + prefs.window_gap, 15 + 10); highlight.y = clip.y - 10; } @@ -150,7 +152,7 @@ class Minimap { propagate_forward(i+1, Math.round(x + w + gap), gap); } - propagate_forward(0, 0, Tiling.window_gap); + propagate_forward(0, 0, prefs.window_gap); this.clip.width = Math.min(this.container.width, this.space.width - this.clip.x*2); this.actor.width = this.clip.width + this.clip.x*2; @@ -209,7 +211,7 @@ class Minimap { if (container.x > 0) container.x = 0; - let gap = Tiling.window_gap; + let gap = prefs.window_gap; highlight.x = clip.x + container.x + Math.round(selected.destinationX) - Math.round(gap/2); highlight.set_size(selected.width + gap, clip.height + 20); diff --git a/navigator.js b/navigator.js index d6a5a61..bbc18cd 100644 --- a/navigator.js +++ b/navigator.js @@ -18,6 +18,8 @@ var Tiling = Extension.imports.tiling; var utils = Extension.imports.utils; var debug = utils.debug; +var prefs = Extension.imports.prefs.prefs; + var scale = 0.9; var navigating = false; var workspaceMru = false; @@ -167,7 +169,7 @@ var PreviewedWindowNavigator = new Lang.Class({ let selected = space.selectedWindow; if (selected && selected.fullscreen) { - selected.clone.y = Main.panel.actor.height + Tiling.margin_tb; + selected.clone.y = Main.panel.actor.height + prefs.vertical_margin; } }); this.space.actor.scale_y = 1; @@ -182,7 +184,7 @@ var PreviewedWindowNavigator = new Lang.Class({ let selected = this.space.selectedWindow; if (selected && selected.fullscreen) { Tweener.addTween(selected.clone, { - y: Main.panel.actor.height + Tiling.margin_tb, + y: Main.panel.actor.height + prefs.vertical_margin, time: 0.25 }); } diff --git a/prefs.js b/prefs.js new file mode 100644 index 0000000..28fe76d --- /dev/null +++ b/prefs.js @@ -0,0 +1,28 @@ +var Extension = imports.misc.extensionUtils.extensions['paperwm@hedning:matrix.org']; +var settings = Extension.imports.convenience.getSettings(); +var utils = Extension.imports.utils; +var debug = utils.debug; + +var prefs = { + window_gap: settings.get_int('window-gap'), + vertical_margin: settings.get_int('vertical-margin'), + horizontal_margin: settings.get_int('horizontal-margin'), + workspace_colors: settings.get_strv('workspace-colors') +}; + +function setState(_, key) { + let value = settings.get_value(key); + let name = key.replace('-', '_'); + switch (value.get_type_string()) { + case 'i': + prefs[name] = settings.get_int(key); + break; + case 'as': + prefs[name] = settings.get_strv(key); + break; + } +} + +function init() { + settings.connect('changed', setState); +} diff --git a/schemas/gschemas.compiled b/schemas/gschemas.compiled index dbc76b16a31d0fbeeb405b0cab45e4fc22f3d908..f1e6d92d8b12ace720c9c5b7aa5e6c3f508db866 100644 GIT binary patch literal 2125 zcmaJ?U1%It6uwqdll~-Wo0@2_L>96e=p>u$?(A-fHM_~S5mE?^N`%&WclKs?=-ruN zX0n?UtwDU~i$D0#C-DzaP(;KRUj$L1B0l&cMIS3jvCtwdf}-em?%av)S{?ZK&U|z3 zx#ymH?w#Y0ao^@n$n-M;UXAS3j#vcu9AxZIJkhr$<#P)9wM!qoMs8#$*&=%meE3er z?f|=feX{PjO)(iXgp`wFBNR?xyG}5PPex$*u9WR2JXwn7?S5!}gkpCAcLTjZAFvDP z2L^z_F6_fQVMqgMGr}+s+_*YU@hHE8ti=|=CxFi{zp+3%*}I{yg3kd@^}P24>16jq zzW{y{h-*PMV@vEU@bAF&iy!_#64`s;-;2bDfmc6Uxkx(M`=O`74*`b`f88XV>;p6} zSOUppTjfdiF6bNJPk^oWpWh^ZvMK&I;GY3*fAK8oWDh`RJ&cV3?|xLPl1?`1X>bAf zetG`@>15vzeHDBf*zxG-Go+JE^ESX9aOKkZ8>Ev>_1OZy2;8iFd5Uzh2cf?XKE9K& zTQYfubh0VVD!2}O`t}1(ryWZ%g_jU)u?joY@7Qv_^BtwgNdMRhgQRI(CD)(>z?qB0=8RY z`t77$Z-lIWl#z4j*6UKxDc~5SJ!a=aUmmRl7WV{lBEP8b_hJ&10rjU|iTW9&`keZm zdK}A8X9C-RK8wyEofotPqqB4mKxbzUK<6j4F@MVr?5Y%c{t$(uNj+b*YqaP=p5$Rvt5kI&%FL*9Pt~2q zS(_G$-nMIDLuIVz_jNtD%Z-rI^#hj3OlK?RJWJ%v+)TE>64`9d%*?QaX=VyD;A}CQ zHcgf&%$R02kN2`!EM)MW&M)M%7`Kqm<#Kp0WX;Sp#?9o)1#mf2oHmOrkZdUE_fLU7ZT}Rea9yi@i8rdN6LsC9{wY<_S!W*M)p!RZ zdHdYy=BcsaaZ{!H@1Wi1S;t@3`8QnOKIb~vZrup0@R$obd!z#yr-h_Gp H-5P%Z)t~U* literal 1900 zcmaJ?O^6&t7%iilWL>kn*&laxF~rNx4A?U_31MCQiKws#$*M#VV@-EWPhm~>(A_hg z4JHQhYRD;gGI%kdh>91FK@AbfAs2~y3K3*ck{ry%T$1;yt2>Ua7QA`iysED6tFOMQ zdhQjOXc=X~wMFou!me*CMex|X5Vz5azBN1Mb?ARw`1}lq(XNT-#e3lCdxf|M94BEj zjN+bZrd?%BQys}vlQ%x{S^2Nu;;OhJ?gY) zp??j&2yAzn8%CD5A2SX$!F?7QqJS#Y5%w6E)QFAocP% zc`NNpUx}6VL0=`SE6-$!S$(RFQHNiW?NK?X{;qd*CtD4~!t&#yF4Kn5m{pq0%kWLn zD5ts3{BGrr9nOy*_jvN#Nl;@Ogz zx|*+u``Of&eTBNBbKk_N@^T#oabAt{OP^0m->rQ7VLRN#8sQMrm5UQO(Q&ozgF5VH zVsgoTFdB(xu9Kle|s5CpIgVk`D^xNvGNvf=$5^_TlVs9-MzfoRbAdKTtP#Gp#9N`v~LIe|HpZ% zf++J?B<+8X*PvXq%kV(#@t&{?w@wmUeC2%hoQ_tf`)o_GsNA_mF&|Qg>j?KF@0cQ& oxW4V%#P^2p3>(iJo<;i}@!i=C;Ciud7vCgYvG%><8#E2v0hjv8bN~PV diff --git a/schemas/org.gnome.shell.extensions.org-scrollwm.gschema.xml b/schemas/org.gnome.shell.extensions.org-scrollwm.gschema.xml index 3b3edc4..83980c4 100644 --- a/schemas/org.gnome.shell.extensions.org-scrollwm.gschema.xml +++ b/schemas/org.gnome.shell.extensions.org-scrollwm.gschema.xml @@ -22,6 +22,14 @@ Minimum gap between windows + + + Minimum gap between windows + + n']]]> diff --git a/stackoverlay.js b/stackoverlay.js index a15ed38..fea1291 100644 --- a/stackoverlay.js +++ b/stackoverlay.js @@ -10,6 +10,8 @@ var utils = Extension.imports.utils; var debug = utils.debug; var Minimap = Extension.imports.minimap; +var prefs = Extension.imports.prefs.prefs; + /* The stack overlay decorates the top stacked window with its icon and captures mouse input such that a mouse click only _activates_ the @@ -126,8 +128,8 @@ var StackOverlay = new Lang.Class({ let panelBox = Main.layoutManager.panelBox; - overlay.y = monitor.y + panelBox.height + Tiling.margin_tb; - overlay.height = this.monitor.height - panelBox.height - Tiling.margin_tb; + overlay.y = monitor.y + panelBox.height + Tiling.vertical_margin; + overlay.height = this.monitor.height - panelBox.height - Tiling.vertical_margin; overlay.width = Tiling.stack_margin; overlay.hide(); @@ -153,7 +155,7 @@ var StackOverlay = new Lang.Class({ } let iconMarginX = 2; - let iconSize = margin_lr; + let iconSize = horizontal_margin; let icon = createAppIcon(this.target, iconSize); this.icon = icon; @@ -188,7 +190,7 @@ var StackOverlay = new Lang.Class({ let actor = metaWindow.get_compositor_private(); let space = Tiling.spaces.spaceOfWindow(metaWindow); - overlay.y = this.monitor.y + Main.layoutManager.panelBox.height + Tiling.margin_tb; + overlay.y = this.monitor.y + Main.layoutManager.panelBox.height + Tiling.vertical_margin; // Note: Atm. this can be called when the windows are moving. Therefore // we must use destinationX and we might occationally get wrong y @@ -201,14 +203,14 @@ var StackOverlay = new Lang.Class({ let frame = neighbour.get_frame_rect(); overlay.x = this.monitor.x; - overlay.width = Math.max(0, frame.x - Tiling.window_gap); + overlay.width = Math.max(0, frame.x - prefs.window_gap); } else { let neighbour = space[space.indexOf(metaWindow) - 1]; if (!neighbour) return bail(); // Should normally have a neighbour. Bail! let frame = neighbour.get_frame_rect(); - overlay.x = frame.x + frame.width + Tiling.window_gap; + overlay.x = frame.x + frame.width + prefs.window_gap; overlay.width = Math.max(0, this.monitor.width - overlay.x); } diff --git a/tiling.js b/tiling.js index 62eee54..80196d0 100644 --- a/tiling.js +++ b/tiling.js @@ -25,13 +25,8 @@ var Navigator = Extension.imports.navigator; var ClickOverlay = Extension.imports.stackoverlay.ClickOverlay; var Me = Extension.imports.tiling; -var preferences = Extension.imports.convenience.getSettings(); -// Gap between windows -var window_gap = preferences.get_int('window-gap'); -// Top/bottom margin -var margin_tb = preferences.get_int('vertical-margin'); -// left/right margin -var margin_lr = preferences.get_int('horizontal-margin'); +var prefs = Extension.imports.prefs.prefs; + // How much the stack should protrude from the side var stack_margin = 75; // Minimum margin @@ -39,19 +34,6 @@ var minimumMargin = 15; var panelBox = Main.layoutManager.panelBox; -// From https://developer.gnome.org/hig-book/unstable/design-color.html.en -var 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' -]; -var color; - /** Scrolled and tiled per monitor workspace. @@ -121,13 +103,13 @@ class Space extends Array { actor.set_pivot_point(0.5, 0); - background.set_position(-8 - Math.round(window_gap/2), -4); + background.set_position(-8 - Math.round(prefs.window_gap/2), -4); + let color = prefs.workspace_colors[workspace.index() % prefs.workspace_colors.length]; background.set_style( - `background: ${colors[color]}; + `background: ${color}; box-shadow: 0px -10px 4px 2px black; box-shadow: 0px -4px 8px 0 rgba(0, 0, 0, .5); border-radius: 4px 4px 0 0;`); - color = (color + 4) % colors.length; this.selectedWindow = null; this.moving = false; @@ -176,10 +158,10 @@ class Space extends Array { monitor.width, monitor.height); - background.set_size(monitor.width + 8*2 + window_gap, monitor.height + 4); + background.set_size(monitor.width + 8*2 + prefs.window_gap, monitor.height + 4); cloneContainer.set_size(monitor.width, monitor.height); - cloneContainer.set_clip(-Math.round(window_gap/2), 0, monitor.width + window_gap, monitor.height); + cloneContainer.set_clip(-Math.round(prefs.window_gap/2), 0, monitor.width + prefs.window_gap, monitor.height); } /** @@ -620,8 +602,6 @@ function init() { function enable() { debug('#enable'); - color = 3; - global.window_manager[signals] = [ global.window_manager.connect( 'switch-workspace', @@ -865,11 +845,11 @@ function insertWindow(metaWindow, {existing}) { let frame = metaWindow.get_frame_rect(); position = {x: monitor.x + (monitor.width - frame.width)/2, - y: monitor.y + panelBox.height + margin_tb}; + y: monitor.y + panelBox.height + prefs.vertical_margin}; } else { let frame = space[index - 1].get_frame_rect(); - position = {x: monitor.x + frame.x + frame.width + window_gap, - y: monitor.y + panelBox.height + margin_tb}; + position = {x: monitor.x + frame.x + frame.width + prefs.window_gap, + y: monitor.y + panelBox.height + prefs.vertical_margin}; } debug("setting initial position", position) @@ -935,23 +915,23 @@ function ensureViewport(meta_window, space, force) { let frame = meta_window.get_frame_rect(); let width = Math.min(space.monitor.width - 2*minimumMargin, frame.width); meta_window.move_resize_frame(true, frame.x, frame.y, width, - space.height - panelBox.height - margin_tb); + space.height - panelBox.height - prefs.vertical_margin); // Use monitor relative coordinates. frame.x -= monitor.x; frame.y -= monitor.y; - space.selection.set_position(frame.x - Math.round(window_gap/2), + space.selection.set_position(frame.x - Math.round(prefs.window_gap/2), panelBox.height); - space.selection.set_size(frame.width + window_gap, space.height - panelBox.height); + space.selection.set_size(frame.width + prefs.window_gap, space.height - panelBox.height); let x = frame.x; - let y = panelBox.height + margin_tb; - let gap = window_gap; + let y = panelBox.height + prefs.vertical_margin; + let gap = prefs.window_gap; let required_width = space.reduce((length, meta_window) => { let frame = meta_window.get_frame_rect(); - return length + frame.width + window_gap; - }, -window_gap); + return length + frame.width + prefs.window_gap; + }, -prefs.window_gap); if (!Navigator.workspaceMru && (meta_window.fullscreen || meta_window.get_maximized() === Meta.MaximizeFlags.BOTH)) { x = frame.x; y = frame.y; @@ -968,16 +948,16 @@ function ensureViewport(meta_window, space, force) { } else if (index == space.length-1) { // Always align the first window to the display's right edge x = space.width - frame.width; - } else if (frame.width > space.width*0.9 - 2*(margin_lr + window_gap)) { + } else if (frame.width > space.width*0.9 - 2*(prefs.horizontal_margin + prefs.window_gap)) { // Consider the window to be wide and center it x = Math.round((space.width - frame.width)/2); } else if (frame.x + frame.width > space.width) { - // Align to the right margin_lr - x = space.width - margin_lr - frame.width; + // Align to the right prefs.horizontal_margin + x = space.width - prefs.horizontal_margin - frame.width; } else if (frame.x < 0) { - // Align to the left margin_lr - x = margin_lr; + // Align to the left prefs.horizontal_margin + x = prefs.horizontal_margin; } else if (frame.x + frame.width === space.width) { // When opening new windows at the end, in the background, we want to // show some minimup margin @@ -1006,9 +986,9 @@ function ensureViewport(meta_window, space, force) { let selectedFrame = space.selectedWindow.get_frame_rect(); Navigator.navigating && space.selection.show(); Tweener.addTween(space.selection, - {x: selectedFrame.x - Math.round(window_gap/2), + {x: selectedFrame.x - Math.round(prefs.window_gap/2), y: panelBox.height, - width: selectedFrame.width + window_gap, + width: selectedFrame.width + prefs.window_gap, height: space.height - panelBox.height, time: 0.25, transition: 'easeInOutQuad'}); @@ -1094,7 +1074,7 @@ function move_to(space, meta_window, { x, y, delay, transition, space.monitor.clickOverlay.reset(); - gap = gap || window_gap; + gap = gap || prefs.window_gap; propagateForward(space, index + 1, x + frame.width + gap, gap); propagateBackward(space, index - 1, x - gap, gap); } @@ -1106,7 +1086,7 @@ function propagateForward(space, n, x, gap) { } let meta_window = space[n]; let frame = meta_window.get_frame_rect(); - gap = gap || window_gap; + gap = gap || prefs.window_gap; let visible = true; // Check if we should start stacking windows @@ -1122,7 +1102,7 @@ function propagateForward(space, n, x, gap) { // Anchor scaling/animation on the left edge for windows positioned to the right, move(meta_window, space, - { x, y: panelBox.height + margin_tb, visible }); + { x, y: panelBox.height + prefs.vertical_margin, visible }); if (!visible && x < space.width) { space.monitor.clickOverlay.right.setTarget(meta_window); } @@ -1140,7 +1120,7 @@ function propagateBackward(space, n, x, gap) { } let meta_window = space[n]; let frame = meta_window.get_frame_rect(); - gap = gap || window_gap; + gap = gap || prefs.window_gap; // Check if the window is fully visible let visible = true; @@ -1156,7 +1136,7 @@ function propagateBackward(space, n, x, gap) { if (actor) { // Anchor on the right edge for windows positioned to the left. move(meta_window, space, - { x: x - frame.width, y: panelBox.height + margin_tb, visible }); + { x: x - frame.width, y: panelBox.height + prefs.vertical_margin, visible }); if (!visible && x > 0) { space.monitor.clickOverlay.left.setTarget(meta_window); } @@ -1179,8 +1159,8 @@ function sizeHandler(metaWindow) { move_to(space, metaWindow, {x: frame.x - monitor.x, y: frame.y - monitor.y, onComplete: () => space.emit('move-done')}); Tweener.removeTweens(space.selection); - space.selection.width = frame.width + window_gap; - space.selection.x = frame.x - Math.round(window_gap/2); + space.selection.width = frame.width + prefs.window_gap; + space.selection.x = frame.x - Math.round(prefs.window_gap/2); } // `MetaWindow::focus` handling @@ -1362,7 +1342,7 @@ function tileVisible(metaWindow) { let active = space.filter(isUnStacked); let requiredWidth = utils.sum(active.map(mw => mw.get_frame_rect().width)) - + (active.length-1)*window_gap + minimumMargin*2; + + (active.length-1)*prefs.window_gap + minimumMargin*2; let deficit = requiredWidth - primary.width; if (deficit > 0) { let perWindowReduction = Math.ceil(deficit/active.length);