From bd0503927bd82032fa87763446bb2d70b43b22ff Mon Sep 17 00:00:00 2001 From: korei999 Date: Wed, 29 Nov 2023 21:59:00 +0200 Subject: [PATCH] apply vertile layout patch --- config.def.h | 10 +- dwl.c | 37 +++ keys.h | 242 ++++++++++++++++++ protocols/dwl-ipc-unstable-v2.xml | 181 +++++++++++++ ...lr-output-power-management-unstable-v1.xml | 128 +++++++++ 5 files changed, 593 insertions(+), 5 deletions(-) create mode 100644 keys.h create mode 100644 protocols/dwl-ipc-unstable-v2.xml create mode 100644 protocols/wlr-output-power-management-unstable-v1.xml diff --git a/config.def.h b/config.def.h index f6ac6e1..3096f0c 100644 --- a/config.def.h +++ b/config.def.h @@ -58,19 +58,19 @@ static const Layout layouts[] = { /* symbol arrange function */ { "[]=", tile }, { "[M]", monocle }, - // { "[v]", vertile }, + { "[v]", vertile }, { "><>", NULL } /* no layout function means floating behavior */ }; /* monitors */ /* NOTE: ALWAYS add a fallback rule, even if you are completely sure it won't be used */ static const MonitorRule monrules[] = { - /* name mfact nmaster scale layout rotate/reflect x y resx resy rate adaptive custom*/ - /* example of a HiDPI laptop monitor at 120Hz: - { "eDP-1", 0.5, 1, 2, &layouts[0], WL_OUTPUT_TRANSFORM_NORMAL, 0, 0, 0, 0, 120.000, 1, 0 }, + /* name mfact nmaster scale layout rotate/reflect x y */ + /* example of a HiDPI laptop monitor: + { "eDP-1", 0.5, 1, 2, &layouts[0], WL_OUTPUT_TRANSFORM_NORMAL, -1, -1 }, */ /* defaults */ - { NULL, 0.55, 1, 1, &layouts[0], WL_OUTPUT_TRANSFORM_NORMAL, 0, 0, 0, 0, 120.000999, 0, 0 }, + { NULL, 0.55, 1, 1, &layouts[0], WL_OUTPUT_TRANSFORM_NORMAL, -1, -1 }, }; diff --git a/dwl.c b/dwl.c index 95369af..6dabd42 100644 --- a/dwl.c +++ b/dwl.c @@ -334,6 +334,7 @@ static void startdrag(struct wl_listener *listener, void *data); static void tag(const Arg *arg); static void tagmon(const Arg *arg); static void tile(Monitor *m); +static void vertile(Monitor *m); static void togglebar(const Arg *arg); static void togglefloating(const Arg *arg); static void togglefullscreen(const Arg *arg); @@ -2698,6 +2699,42 @@ tile(Monitor *m) } } +void +vertile(Monitor *m) +{ + unsigned int i, n = 0, h, mh, my, ty, draw_borders = 1; + Client *c; + + wl_list_for_each(c, &clients, link) + if (VISIBLEON(c, m) && !c->isfloating) + n++; + if (n == 0) + return; + + if (n == smartborders) + draw_borders = 0; + + if (n > m->nmaster) + ty = mh = m->nmaster ? m->w.height * m->mfact : 0; + else + ty = mh = m->w.height; + i = my = 0; + wl_list_for_each(c, &clients, link) { + if (!VISIBLEON(c, m) || c->isfloating || c->isfullscreen) + continue; + if (i < m->nmaster) { + h = ( mh - my ) / (MIN(n, m->nmaster) - i); + resize(c, (struct wlr_box) { .x = m->w.x, .y = m->w.y + my, .width = m->w.width, .height = h }, 0); + my += c->geom.height; + } else { + h = ( m->w.height - ty ) / (n - i); + resize(c, (struct wlr_box) { .x = m->w.x, .y = m->w.y + ty, .width = m->w.width, .height = h }, 0); + ty += c->geom.height; + } + i++; + } +} + void togglebar(const Arg *arg) { DwlIpcOutput *ipc_output; diff --git a/keys.h b/keys.h new file mode 100644 index 0000000..e732f80 --- /dev/null +++ b/keys.h @@ -0,0 +1,242 @@ +/* You can use the macros within this file + * instead of search the keycodes yourself + * with wev or something like that + * Also probably you search this: + * Key_XF86AudioMute + * Key_XF86AudioLowerVolume + * Key_XF86AudioRaiseVolume + * Key_XF86MonBrightnessDown + * Key_XF86MonBrightnessUp +*/ + +#define Key_Escape 9 +#define Key_1 10 +#define Key_2 11 +#define Key_3 12 +#define Key_4 13 +#define Key_5 14 +#define Key_6 15 +#define Key_7 16 +#define Key_8 17 +#define Key_9 18 +#define Key_0 19 +#define Key_minus 20 +#define Key_equal 21 +#define Key_BackSpace 22 +#define Key_Tab 23 +#define Key_q 24 +#define Key_w 25 +#define Key_e 26 +#define Key_r 27 +#define Key_t 28 +#define Key_y 29 +#define Key_u 30 +#define Key_i 31 +#define Key_o 32 +#define Key_p 33 +#define Key_bracketleft 34 +#define Key_bracketright 35 +#define Key_Return 36 +#define Key_Control_L 37 +#define Key_a 38 +#define Key_s 39 +#define Key_d 40 +#define Key_f 41 +#define Key_g 42 +#define Key_h 43 +#define Key_j 44 +#define Key_k 45 +#define Key_l 46 +#define Key_semicolon 47 +#define Key_apostrophe 48 +#define Key_grave 49 +#define Key_Shift_L 50 +#define Key_backslash 51 +#define Key_z 52 +#define Key_x 53 +#define Key_c 54 +#define Key_v 55 +#define Key_b 56 +#define Key_n 57 +#define Key_m 58 +#define Key_comma 59 +#define Key_period 60 +#define Key_slash 61 +#define Key_Shift_R 62 +#define Key_KP_Multiply 63 +#define Key_Alt_L 64 +#define Key_space 65 +#define Key_Caps_Lock 66 +#define Key_F1 67 +#define Key_F2 68 +#define Key_F3 69 +#define Key_F4 70 +#define Key_F5 71 +#define Key_F6 72 +#define Key_F7 73 +#define Key_F8 74 +#define Key_F9 75 +#define Key_F10 76 +#define Key_Num_Lock 77 +#define Key_Scroll_Lock 78 +#define Key_KP_Home 79 +#define Key_KP_7 Key_KP_Home +#define Key_KP_Up 80 +#define Key_KP_8 Key_KP_Up +#define Key_KP_Prior 81 +#define Key_KP_9 Key_KP_Prior +#define Key_KP_Subtract 82 +#define Key_KP_Left 83 +#define Key_KP_4 Key_KP_Left +#define Key_KP_Begin 84 +#define Key_KP_5 Key_KP_Begin +#define Key_KP_Right 85 +#define Key_KP_6 Key_KP_Right +#define Key_KP_Add 86 +#define Key_KP_End 87 +#define Key_KP_1 Key_KP_End +#define Key_KP_Down 88 +#define Key_KP_2 Key_KP_Down +#define Key_KP_Next 89 +#define Key_KP_3 Key_KP_Next +#define Key_KP_Insert 90 +#define Key_KP_0 Key_KP_Insert +#define Key_KP_Delete 91 +#define Key_KP_Period Key_KP_Insert +#define Key_ISO_Level3_Shift 92 +#define Key_less 94 +#define Key_F11 95 +#define Key_F12 96 +#define Key_Katakana 98 +#define Key_Hiragana 99 +#define Key_Henkan_Mode 100 +#define Key_Hiragana_Katakana 101 +#define Key_Muhenkan 102 +#define Key_KP_Enter 104 +#define Key_Control_R 105 +#define Key_KP_Divide 106 +#define Key_Print 107 +#define Key_Alt_R 108 +#define Key_Linefeed 109 +#define Key_Home 110 +#define Key_Up 111 +#define Key_Prior 112 +#define Key_Left 113 +#define Key_Right 114 +#define Key_End 115 +#define Key_Down 116 +#define Key_Next 117 +#define Key_Insert 118 +#define Key_Delete 119 +#define Key_XF86AudioMute 121 +#define Key_XF86AudioLowerVolume 122 +#define Key_XF86AudioRaiseVolume 123 +#define Key_XF86PowerOff 124 +#define Key_KP_Equal 125 +#define Key_plusminus 126 +#define Key_Pause 127 +#define Key_XF86LaunchA 128 +#define Key_KP_Decimal 129 +#define Key_Hangul 130 +#define Key_Hangul_Hanja 131 +#define Key_Super_L 133 +#define Key_Super_R 134 +#define Key_Menu 135 +#define Key_Cancel 136 +#define Key_Redo 137 +#define Key_SunProps 138 +#define Key_Undo 139 +#define Key_SunFront 140 +#define Key_XF86Copy 141 +#define Key_XF86Open 142 +#define Key_XF86Paste 143 +#define Key_Find 144 +#define Key_XF86Cut 145 +#define Key_Help 146 +#define Key_XF86MenuKB 147 +#define Key_XF86Calculator 148 +#define Key_XF86Sleep 150 +#define Key_XF86WakeUp 151 +#define Key_XF86Explorer 152 +#define Key_XF86Send 153 +#define Key_XF86Xfer 155 +#define Key_XF86Launch1 156 +#define Key_XF86Launch2 157 +#define Key_XF86WWW 158 +#define Key_XF86DOS 159 +#define Key_XF86ScreenSaver 160 +#define Key_XF86RotateWindows 161 +#define Key_XF86TaskPane 162 +#define Key_XF86Mail 163 +#define Key_XF86Favorites 164 +#define Key_XF86MyComputer 165 +#define Key_XF86Back 166 +#define Key_XF86Forward 167 +#define Key_XF86Eject1 169 +#define Key_XF86Eject2 170 +#define Key_XF86AudioNext 171 +#define Key_XF86AudioPlay 172 +#define Key_XF86AudioPrev 173 +#define Key_XF86AudioStop 174 +#define Key_XF86AudioRecord 175 +#define Key_XF86AudioRewind 176 +#define Key_XF86Phone 177 +#define Key_XF86Tools 179 +#define Key_XF86HomePage 180 +#define Key_XF86Reload 181 +#define Key_XF86Close 182 +#define Key_XF86ScrollUp 185 +#define Key_XF86ScrollDown 186 +#define Key_parenleft 187 +#define Key_parenright 188 +#define Key_XF86New 189 +#define Key_Redo2 190 +#define Key_XF86Tools2 191 +#define Key_XF86Launch5 192 +#define Key_XF86Launch6 193 +#define Key_XF86Launch7 194 +#define Key_XF86Launch8 195 +#define Key_XF86Launch9 196 +#define Key_XF86AudioMicMute 198 +#define Key_XF86TouchpadToggle 199 +#define Key_XF86TouchpadOn 200 +#define Key_XF86TouchpadOff 201 +#define Key_Mode_switch 203 +#define Key_XF86AudioPlay2 208 +#define Key_XF86AudioPause 209 +#define Key_XF86Launch3 210 +#define Key_XF86Launch4 211 +#define Key_XF86LaunchB 212 +#define Key_XF86Suspend 213 +#define Key_XF86Close2 214 +#define Key_XF86AudioPlay3 215 +#define Key_XF86AudioForward 216 +#define Key_Print2 218 +#define Key_XF86WebCam 220 +#define Key_XF86AudioPreset 221 +#define Key_XF86Mail2 223 +#define Key_XF86Messenger 224 +#define Key_XF86Search 225 +#define Key_XF86Go 226 +#define Key_XF86Finance 227 +#define Key_XF86Game 228 +#define Key_XF86Shop 229 +#define Key_Cancel2 231 +#define Key_XF86MonBrightnessDown 232 +#define Key_XF86MonBrightnessUp 233 +#define Key_XF86AudioMedia 234 +#define Key_XF86Display 235 +#define Key_XF86KbdLightOnOff 236 +#define Key_XF86KbdBrightnessDown 237 +#define Key_XF86KbdBrightnessUp 238 +#define Key_XF86Send2 239 +#define Key_XF86Reply 240 +#define Key_XF86MailForward 241 +#define Key_XF86Save 242 +#define Key_XF86Documents 243 +#define Key_XF86Battery 244 +#define Key_XF86Bluetooth 245 +#define Key_XF86WLAN 246 +#define Key_XF86MonBrightnessCycle 251 +#define Key_XF86WWAN 254 +#define Key_XF86RFKill 255 diff --git a/protocols/dwl-ipc-unstable-v2.xml b/protocols/dwl-ipc-unstable-v2.xml new file mode 100644 index 0000000..0a6e7e5 --- /dev/null +++ b/protocols/dwl-ipc-unstable-v2.xml @@ -0,0 +1,181 @@ + + + + + This protocol allows clients to update and get updates from dwl. + + Warning! The protocol described in this file is experimental and + backward incompatible changes may be made. Backward compatible + changes may be added together with the corresponding interface + version bump. + Backward incompatible changes are done by bumping the version + number in the protocol and interface names and resetting the + interface version. Once the protocol is to be declared stable, + the 'z' prefix and the version number in the protocol and + interface names are removed and the interface version number is + reset. + + + + + This interface is exposed as a global in wl_registry. + + Clients can use this interface to get a dwl_ipc_output. + After binding the client will recieve the dwl_ipc_manager.tags and dwl_ipc_manager.layout events. + The dwl_ipc_manager.tags and dwl_ipc_manager.layout events expose tags and layouts to the client. + + + + + Indicates that the client will not the dwl_ipc_manager object anymore. + Objects created through this instance are not affected. + + + + + + Get a dwl_ipc_outout for the specified wl_output. + + + + + + + + This event is sent after binding. + A roundtrip after binding guarantees the client recieved all tags. + + + + + + + This event is sent after binding. + A roundtrip after binding guarantees the client recieved all layouts. + + + + + + + + Observe and control a dwl output. + + Events are double-buffered: + Clients should cache events and redraw when a dwl_ipc_output.frame event is sent. + + Request are not double-buffered: + The compositor will update immediately upon request. + + + + + + + + + + + Indicates to that the client no longer needs this dwl_ipc_output. + + + + + + Indicates the client should hide or show themselves. + If the client is visible then hide, if hidden then show. + + + + + + Indicates if the output is active. Zero is invalid, nonzero is valid. + + + + + + + Indicates that a tag has been updated. + + + + + + + + + + Indicates a new layout is selected. + + + + + + + Indicates the title has changed. + + + + + + + Indicates the appid has changed. + + + + + + + Indicates the layout has changed. Since layout symbols are dynamic. + As opposed to the zdwl_ipc_manager.layout event, this should take precendence when displaying. + You can ignore the zdwl_ipc_output.layout event. + + + + + + + Indicates that a sequence of status updates have finished and the client should redraw. + + + + + + + + + + + + The tags are updated as follows: + new_tags = (current_tags AND and_tags) XOR xor_tags + + + + + + + + + + + + + + Indicates if the selected client on this output is fullscreen. + + + + + + + Indicates if the selected client on this output is floating. + + + + + diff --git a/protocols/wlr-output-power-management-unstable-v1.xml b/protocols/wlr-output-power-management-unstable-v1.xml new file mode 100644 index 0000000..a977839 --- /dev/null +++ b/protocols/wlr-output-power-management-unstable-v1.xml @@ -0,0 +1,128 @@ + + + + Copyright © 2019 Purism SPC + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice (including the next + paragraph) shall be included in all copies or substantial portions of the + Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + + + + This protocol allows clients to control power management modes + of outputs that are currently part of the compositor space. The + intent is to allow special clients like desktop shells to power + down outputs when the system is idle. + + To modify outputs not currently part of the compositor space see + wlr-output-management. + + Warning! The protocol described in this file is experimental and + backward incompatible changes may be made. Backward compatible changes + may be added together with the corresponding interface version bump. + Backward incompatible changes are done by bumping the version number in + the protocol and interface names and resetting the interface version. + Once the protocol is to be declared stable, the 'z' prefix and the + version number in the protocol and interface names are removed and the + interface version number is reset. + + + + + This interface is a manager that allows creating per-output power + management mode controls. + + + + + Create a output power management mode control that can be used to + adjust the power management mode for a given output. + + + + + + + + All objects created by the manager will still remain valid, until their + appropriate destroy request has been called. + + + + + + + This object offers requests to set the power management mode of + an output. + + + + + + + + + + + + + + Set an output's power save mode to the given mode. The mode change + is effective immediately. If the output does not support the given + mode a failed event is sent. + + + + + + + Report the power management mode change of an output. + + The mode event is sent after an output changed its power + management mode. The reason can be a client using set_mode or the + compositor deciding to change an output's mode. + This event is also sent immediately when the object is created + so the client is informed about the current power management mode. + + + + + + + This event indicates that the output power management mode control + is no longer valid. This can happen for a number of reasons, + including: + - The output doesn't support power management + - Another client already has exclusive power management mode control + for this output + - The output disappeared + + Upon receiving this event, the client should destroy this object. + + + + + + Destroys the output power management mode control object. + + + +