From d5a7c81895dc167d51d4c6bb02c259d4e15fbf24 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ole=20J=C3=B8rgen=20Br=C3=B8nner?= Date: Sat, 5 Jan 2019 12:38:28 +0100 Subject: [PATCH] keybindings: cycle window height `r` --- README.md | 1 + examples/keybindings.js | 50 ------------------ keybindings.js | 5 ++ prefs.js | 3 +- schemas/gschemas.compiled | Bin 4140 -> 4212 bytes ....shell.extensions.org-scrollwm.gschema.xml | 5 ++ tiling.js | 48 +++++++++++++++++ 7 files changed, 61 insertions(+), 51 deletions(-) diff --git a/README.md b/README.md index 4f82f1b..2604384 100644 --- a/README.md +++ b/README.md @@ -59,6 +59,7 @@ PaperWM doesn't handle attached modal dialogs very well, so it's best to turn it | SuperShiftTab or AltShiftTab | Cycle backwards through the most recently used windows | | SuperC | Center the active window horizontally | | SuperR | Resize the window (cycles through useful widths) | +| SuperShiftR | Resize the window (cycles through useful heights) | | SuperF | Maximize the width of a window | | SuperShiftF | Toggle fullscreen | | SuperReturn or SuperN | Create a new window from the active application | diff --git a/examples/keybindings.js b/examples/keybindings.js index 678d759..0b11c71 100644 --- a/examples/keybindings.js +++ b/examples/keybindings.js @@ -90,56 +90,6 @@ function showNavigator() { } -function cycleWindowHeight() { - Keybindings.bindkey("q", "cycle-height", cycleHeight, { activeInNavigator: true }); - - var Tiling = Extension.imports.tiling; - - function cycleHeight(metaWindow) { - const ratios = [1/3, 1/2, 2/3]; - - function findNext(tr) { - // Find the first ratio that is significantly bigger than 'tr' - for (let i = 0; i < ratios.length; i++) { - let r = ratios[i] - if (tr <= r) { - if (tr/r > 0.9) { - return (i+1) % ratios.length; - } else { - return i; - } - } - } - return 0; // cycle - } - - let space = Tiling.spaces.spaceOfWindow(metaWindow); - if (!space) - return; - - let i = space.indexOf(metaWindow); - - function allocate(column, available) { - available -= (column.length - 1) * Tiling.prefs.window_gap; - let frame = metaWindow.get_frame_rect(); - let r = frame.height / available; - let nextR = ratios[findNext(r)]; - return column.map(mw => { - if (mw === metaWindow) { - return Math.floor(available * nextR); - } else { - return Math.floor(available * (1-nextR)/(column.length-1)); - } - }); - } - - if (space[i].length > 1) { - space.layout(false, {customAllocators: {[i]: allocate}}); - } - } -} - - // listFreeBindings("").join("\n") function listFreeBindings(modifierString) { let free = []; diff --git a/keybindings.js b/keybindings.js index a1f5809..d80d3f8 100644 --- a/keybindings.js +++ b/keybindings.js @@ -118,6 +118,11 @@ function init() { Tiling), Meta.KeyBindingFlags.PER_WINDOW); + registerPaperAction("cycle-height", + dynamic_function_ref("cycleWindowHeight", + Tiling), + Meta.KeyBindingFlags.PER_WINDOW); + registerPaperAction("center-horizontally", dynamic_function_ref("centerWindowHorizontally", Tiling), diff --git a/prefs.js b/prefs.js index ac96c77..7fffc6d 100644 --- a/prefs.js +++ b/prefs.js @@ -164,7 +164,8 @@ class SettingsWidget { 'switch-first', 'switch-last', 'live-alt-tab', 'live-alt-tab-backward', 'move-left', 'move-right', 'move-up', 'move-down', 'slurp-in', 'barf-out', 'center-horizontally', - 'paper-toggle-fullscreen', 'toggle-maximize-width', 'cycle-width'] + 'paper-toggle-fullscreen', 'toggle-maximize-width', 'cycle-width', + 'cycle-height'] .forEach(k => { addKeybinding(windows.model.child_model, settings, k); }); diff --git a/schemas/gschemas.compiled b/schemas/gschemas.compiled index dbf515202df0e897d60a382b81f624edb69c76a0..2fb3064f6697c28f7e037ad70bd29efa64c76e3b 100644 GIT binary patch literal 4212 zcmb7HZEPIX6@AbcoH&i0#EA`okm3}tC1$tE(-yHveoX=TK!E#DI z=Mu3kN(e!F^uHBYsj(XJ+W^cfU<$ETV?87R*Tu#Q(1rV}F2L2ekFW{)wHnt!{`H*;*AltA= zfB*1~yU0`T0?&o}5&2U`J|$1R4SX504!m;WsT6tY>%kv`{0%UAb?-amsVjdVUnSmt zVvIa>+BpsR0r1`JpU22kZv}rA@;o4Od;US5`UddbR|wGyM0r4+c@Tp<4&3m`cRDzp zdMC!8gnR?&?XBNHp86{AXCSY+68yf8zDJ%q{ft3oftCMkf0?|}!B2pj23~*bokjB0 zH-Vpnd>XK~-g1UKb=o-z`8u%o`IZOBQ)fIEA-@D3x#I1o$y46~ehZT6PGHSrr`{q@ z{Yvm<$RohBFCABLqt3V;gZwSvf4Zo?i#p?T67n?gx!pTMJJk8T??Zk`ey1p^d7(2O zT9Lqefaw#Ved@G74QT-{{ku`>QPCdZqu+QW5tfT6x>`rBO#&yLB-ToO&QSdyV`!>mP&B3V$N9= z>u&8UJ<;QedK`ohC_ix-z&?l47MlUIY}FsxU%7XnC8@s2zS;?}SFQut57}SY53d2( zXW2v9Uy;^oe?eKPK8%z>oicZY&<^@}&*b{q=DhSkNB)ibc_fYgPL%{YRNDV=VRSSi zZmMh*gB=%;Dq+H~cJ>XcxY-tx%CrL`Fmw7{u6dh!sH0x1(wl}q`>Uv2#{A+uGIGe- zy6F{`j~@=<^dk-*hh}&zamaTXE9?_%EEQlBdo+Dh6o)Pi_DB zFXX9rgP(xB8Tj94zxywF>TAItge(J}6&4PVr``d64)QuU8=dK>^GwGN_#yCPxv-Ao zsdJA#2x$WwpM3RSO6BzK=S+@Zl^}c)cuPw6)~$18=L1@1&OUG zF!HYFgzXmV63g|ujy-Qgt=Mu54xY7So$vDb(sqU&#Vau*xChW~V>^XW+x7gOgcr8CI^(UZv}hXx>1*;FEv5j{f#nM`UB_oJEYP!jiv!Lh*<-WwZC zr_;C}N@bGU@ZLarbO>@ZncbGjik`uAHZd}e`;pP~$SB4oM>2!EMbEBnnM`_w?+xxA zfxYp>u4Hyxw03lFi6w@1PE1Z8ELZ1_K6p%3LF4FhDd!eso#|K=Gr%v25m@NV(RKPJ z5i2ak!0*45f0^5(6UbhRJ;g7ZK8noeVL=uUMyF_%j6hbZwi#e5#2?EMSb5WKL_e$} z#=rSY_09jK{DLf+HSC4l#Y&!ALt_iCnBND5b;_EI_HyPE>zMV-y5+^Q0c)8Yujrrh z>zhQp5evN5_%EfM$OdiS-*u!!j{lJC1(T5bfv5(kvj(Oi%fRl{zc|eC)K_496|x5W zYQyi_$x~--ABB7n7#rBGc`(|M_D-s5*Pmqxjw2Y z6ocpABp_jO@XZ+KiZ0F>^(g*3)87PS4lpWotrG5{Jy0QOSq Tpi%3{bK%=6dsQ{zea7`G4|mz3 literal 4140 zcmb7HYitx%7`-Zm@@#o_1;J{8ZVj`$bRXTCg0!?)BN#$OFd^32-Pzpm^4J?&*^Uj&~ALhZXE)YsJs5raMgJ^@&E zAyP1{k{0PJYK9T%8FDq#(Jj-7tXIpLy=h(KZf!WDn>pPqI2=oaZVcVKFdOz9080|{fChj*3veTBVgaxaSo+&7^|QeA&m1uz9t69< z*;OJ>o%UqtBj8Vg?+K0=_(Q z{1kQC3!taLd0_w1SGuXwX8%Lrr+|GAZ=cF{M7sw1F7Q`?vG|^2Y)^X{^kd*Nz*(cY zpE~U+(9ePA!I4W=oDEZ_&3QJ0qrk|Xr-!N2W+H;|Q1U>*XZ#Z*1b=q>C;M2h5pX)xQE^V|w2d#FJ5bu4wTl#@E z{SX4*1_XPRw%n`W-9U5m;8ONOo9o>RJ`1eTw;VJnn(+?kk4*}b1-g$sJ?HSNdg8v1+|LK0I)8@FL$%q$V z^B!+qwAue=unxTZS>LnlhxRP!BjC4y8P6U#LY?*`=zGCm0IL4^W7KKaK|com1#o^p zCH+8~{%6oI-d(FuFf_%<+Nzr^Duz0&*?3%Z^i>dSF8qgF&%QNZt z_d8a*wy`p6l}c(=>MQDb_aaR;TgyjhH@C~qvcp-7JE-T};+XMl1Otb1jEY@WbTjBw z_jNgioHb~U8^0R@yu$~}wl<(!6-ODg?5$2&&1y*`s?r}*_pwT`tMaU zfxccXX#E?@BGl|nV^F78Ol>GgwEnp8jc(<9zeLKaw+QqfMY4;^WEXXq?4o$oPj=BV zligq`x^*P2FjuJB%m-LokdkDrVC`YOVf|q};UzcfsC$BWd-3A$9^V)KUc5+@5#zaYPD_VetK2_| z@78?9Fc7txX3Ft`z8o2RdCZ5eQ_kYDArU<1#e+A!OQOP)gVa_KYqsNAi12Noj0b|XEv_?tTzW7I!hM)l%o zY>ZTsS~fp6B&s-sSOA@mXO z4&d$ga~bNiSvPlqcLPs8H{lp{+B~1^1%C(py>g>Loi^+8Iq-i#a1No(a|n|H&&^)y zRSK$~$LLcL)>}}2Y+KK1NV%?(wQSQXzj!aR$7+Y)%LyDgba;(t1kiZ91=t;w!5xGUbiJk>6m+LG`Hca zp72u`0Z`Dz!&Dc(ZR{`CvE2K`FdM|h#Fy1AeKR6QS z#QD(=rW$Mq+{dv;8-j?7-%5-R85L5&{cCZEw>kJ^m}3PO#|&~5zj-;|Q{eeH7^w4} s-^Tm2x$Z{r5+LvsZTcw;UItWy0P5AmK{eK~&xK>i-7BLB&(p8}1HDehDF6Tf diff --git a/schemas/org.gnome.shell.extensions.org-scrollwm.gschema.xml b/schemas/org.gnome.shell.extensions.org-scrollwm.gschema.xml index bde02a2..2be67e1 100644 --- a/schemas/org.gnome.shell.extensions.org-scrollwm.gschema.xml +++ b/schemas/org.gnome.shell.extensions.org-scrollwm.gschema.xml @@ -113,6 +113,11 @@ Cycle through useful window widths + + r']]]> + Cycle through useful window heights + + c']]]> Center window horizontally diff --git a/tiling.js b/tiling.js index 9123434..134b79b 100644 --- a/tiling.js +++ b/tiling.js @@ -2345,6 +2345,54 @@ function cycleWindowWidth(metaWindow) { metaWindow.move_resize_frame(true, nextX, frame.y, nextW, frame.height); } +function cycleWindowHeight(metaWindow) { + log("OMG") + const ratios = [1/3, 1/2, 2/3]; + + function findNext(tr) { + // Find the first ratio that is significantly bigger than 'tr' + for (let i = 0; i < ratios.length; i++) { + let r = ratios[i] + if (tr <= r) { + if (tr/r > 0.9) { + return (i+1) % ratios.length; + } else { + return i; + } + } + } + return 0; // cycle + } + + let space = spaces.spaceOfWindow(metaWindow); + if (!space) + return; + + let i = space.indexOf(metaWindow); + + // Fix `frame` outside `allocate` so the allocation wont change during + // fixpoint calculation. (could move more out, but then we'd have to + // calculate available manually) + let frame = metaWindow.get_frame_rect(); + + function allocate(column, available) { + available -= (column.length - 1) * prefs.window_gap; + let r = frame.height / available; + let nextR = ratios[findNext(r)]; + return column.map(mw => { + if (mw === metaWindow) { + return Math.floor(available * nextR); + } else { + return Math.floor(available * (1-nextR)/(column.length-1)); + } + }); + } + + if (space[i].length > 1) { + space.layout(false, {customAllocators: {[i]: allocate}}); + } +} + function activateNthWindow(n, space) { space = space || spaces.spaceOf(workspaceManager.get_active_workspace()); let nth = space[n][0];