commit 49c9216f02c933fae96974feb1ceef225d58dd26
parent fdfe46e4f29146bfbdc638e3e4c3fda084bbebbc
Author: Dash Eclipse <dash@ezup.dev>
Date: Wed, 28 Oct 2020 12:28:42 +0000
New package: 2bwm
Diffstat:
2 files changed, 257 insertions(+), 0 deletions(-)
diff --git a/srcpkgs/2bwm/files/config.h b/srcpkgs/2bwm/files/config.h
@@ -0,0 +1,225 @@
+///---User configurable stuff---///
+///---Modifiers---///
+#define MOD XCB_MOD_MASK_4 /* Super/Windows key or check xmodmap(1) with -pm defined in /usr/include/xcb/xproto.h */
+///--Speed---///
+/* Move this many pixels when moving or resizing with keyboard unless the window has hints saying otherwise.
+ *0)move step slow 1)move step fast
+ *2)mouse slow 3)mouse fast */
+static const uint16_t movements[] = {20,40,15,400};
+/* resize by line like in mcwm -- jmbi */
+static const bool resize_by_line = true;
+/* the ratio used when resizing and keeping the aspect */
+static const float resize_keep_aspect_ratio= 1.03;
+///---Offsets---///
+/*0)offsetx 1)offsety
+ *2)maxwidth 3)maxheight */
+static const uint8_t offsets[] = {0,0,0,0}; /* 0, 35, 0, 24 */
+///---Colors---///
+/*0)focuscol 1)unfocuscol
+ *2)fixedcol 3)unkilcol
+ *4)fixedunkilcol 5)outerbordercol
+ *6)emptycol */
+static const char *colors[] = {"#35586c","#333333","#7a8c5c","#ff6666","#cc9933","#0d131a","#000000"};
+/* if this is set to true the inner border and outer borders colors will be swapped */
+static const bool inverted_colors = true;
+///---Cursor---///
+/* default position of the cursor:
+ * correct values are:
+ * TOP_LEFT, TOP_RIGHT, BOTTOM_LEFT, BOTTOM_RIGHT, MIDDLE
+ * All these are relative to the current window. */
+#define CURSOR_POSITION MIDDLE
+///---Borders---///
+/*0) Outer border size. If you put this negative it will be a square.
+ *1) Full borderwidth 2) Magnet border size
+ *3) Resize border size */
+static const uint8_t borders[] = {3,5,5,4};
+/* Windows that won't have a border.
+ * It uses substring comparison with what is found in the WM_NAME
+ * attribute of the window. You can test this using `xprop WM_NAME`
+ */
+#define LOOK_INTO "WM_NAME"
+static const char *ignore_names[] = {"bar", "xclock"};
+///--Menus and Programs---///
+static const char *termcmd[] = { "st", NULL };
+static const char *menucmd[] = { "dmenu_run", NULL };
+///--Custom foo---///
+static void halfandcentered(const Arg *arg)
+{
+ Arg arg2 = {.i=TWOBWM_MAXHALF_VERTICAL_LEFT};
+ maxhalf(&arg2);
+ Arg arg3 = {.i=TWOBWM_TELEPORT_CENTER};
+ teleport(&arg3);
+}
+///---Sloppy focus behavior---///
+/*
+ * Command to execute when switching from sloppy focus to click to focus
+ * The strings "Sloppy" and "Click" will be passed as the last argument
+ * If NULL this is ignored
+ */
+static const char *sloppy_switch_cmd[] = {};
+//static const char *sloppy_switch_cmd[] = { "notify-send", "toggle sloppy", NULL };
+static void toggle_sloppy(const Arg *arg)
+{
+ is_sloppy = !is_sloppy;
+ if (arg->com != NULL && LENGTH(arg->com) > 0) {
+ start(arg);
+ }
+}
+///---Shortcuts---///
+/* Check /usr/include/X11/keysymdef.h for the list of all keys
+ * 0x000000 is for no modkey
+ * If you are having trouble finding the right keycode use the `xev` to get it
+ * For example:
+ * KeyRelease event, serial 40, synthetic NO, window 0x1e00001,
+ * root 0x98, subw 0x0, time 211120530, (128,73), root:(855,214),
+ * state 0x10, keycode 171 (keysym 0x1008ff17, XF86AudioNext), same_screen YES,
+ * XLookupString gives 0 bytes:
+ * XFilterEvent returns: False
+ *
+ * The keycode here is keysym 0x1008ff17, so use 0x1008ff17
+ *
+ *
+ * For AZERTY keyboards XK_1...0 should be replaced by :
+ * DESKTOPCHANGE( XK_ampersand, 0)
+ * DESKTOPCHANGE( XK_eacute, 1)
+ * DESKTOPCHANGE( XK_quotedbl, 2)
+ * DESKTOPCHANGE( XK_apostrophe, 3)
+ * DESKTOPCHANGE( XK_parenleft, 4)
+ * DESKTOPCHANGE( XK_minus, 5)
+ * DESKTOPCHANGE( XK_egrave, 6)
+ * DESKTOPCHANGE( XK_underscore, 7)
+ * DESKTOPCHANGE( XK_ccedilla, 8)
+ * DESKTOPCHANGE( XK_agrave, 9)*
+ */
+#define DESKTOPCHANGE(K,N) \
+{ MOD , K, changeworkspace, {.i=N}}, \
+{ MOD |SHIFT, K, sendtoworkspace, {.i=N}},
+static key keys[] = {
+ /* modifier key function argument */
+ // Focus to next/previous window
+ { MOD , XK_Tab, focusnext, {.i=TWOBWM_FOCUS_NEXT}},
+ { MOD |SHIFT, XK_Tab, focusnext, {.i=TWOBWM_FOCUS_PREVIOUS}},
+ // Kill a window
+ { MOD , XK_q, deletewin, {}},
+ // Resize a window
+ { MOD |SHIFT, XK_k, resizestep, {.i=TWOBWM_RESIZE_UP}},
+ { MOD |SHIFT, XK_j, resizestep, {.i=TWOBWM_RESIZE_DOWN}},
+ { MOD |SHIFT, XK_l, resizestep, {.i=TWOBWM_RESIZE_RIGHT}},
+ { MOD |SHIFT, XK_h, resizestep, {.i=TWOBWM_RESIZE_LEFT}},
+ // Resize a window slower
+ { MOD |SHIFT|CONTROL,XK_k, resizestep, {.i=TWOBWM_RESIZE_UP_SLOW}},
+ { MOD |SHIFT|CONTROL,XK_j, resizestep, {.i=TWOBWM_RESIZE_DOWN_SLOW}},
+ { MOD |SHIFT|CONTROL,XK_l, resizestep, {.i=TWOBWM_RESIZE_RIGHT_SLOW}},
+ { MOD |SHIFT|CONTROL,XK_h, resizestep, {.i=TWOBWM_RESIZE_LEFT_SLOW}},
+ // Move a window
+ { MOD , XK_k, movestep, {.i=TWOBWM_MOVE_UP}},
+ { MOD , XK_j, movestep, {.i=TWOBWM_MOVE_DOWN}},
+ { MOD , XK_l, movestep, {.i=TWOBWM_MOVE_RIGHT}},
+ { MOD , XK_h, movestep, {.i=TWOBWM_MOVE_LEFT}},
+ // Move a window slower
+ { MOD |CONTROL, XK_k, movestep, {.i=TWOBWM_MOVE_UP_SLOW}},
+ { MOD |CONTROL, XK_j, movestep, {.i=TWOBWM_MOVE_DOWN_SLOW}},
+ { MOD |CONTROL, XK_l, movestep, {.i=TWOBWM_MOVE_RIGHT_SLOW}},
+ { MOD |CONTROL, XK_h, movestep, {.i=TWOBWM_MOVE_LEFT_SLOW}},
+ // Teleport the window to an area of the screen.
+ // Center:
+ { MOD , XK_g, teleport, {.i=TWOBWM_TELEPORT_CENTER}},
+ // Center y:
+ { MOD |SHIFT, XK_g, teleport, {.i=TWOBWM_TELEPORT_CENTER_Y}},
+ // Center x:
+ { MOD |CONTROL, XK_g, teleport, {.i=TWOBWM_TELEPORT_CENTER_X}},
+ // Top left:
+ { MOD , XK_y, teleport, {.i=TWOBWM_TELEPORT_TOP_LEFT}},
+ // Top right:
+ { MOD , XK_u, teleport, {.i=TWOBWM_TELEPORT_TOP_RIGHT}},
+ // Bottom left:
+ { MOD , XK_b, teleport, {.i=TWOBWM_TELEPORT_BOTTOM_LEFT}},
+ // Bottom right:
+ { MOD , XK_n, teleport, {.i=TWOBWM_TELEPORT_BOTTOM_RIGHT}},
+ // Resize while keeping the window aspect
+ { MOD , XK_Home, resizestep_aspect, {.i=TWOBWM_RESIZE_KEEP_ASPECT_GROW}},
+ { MOD , XK_End, resizestep_aspect, {.i=TWOBWM_RESIZE_KEEP_ASPECT_SHRINK}},
+ // Maximize (ignore offset and no EWMH atom)
+ { MOD , XK_x, maximize, {}},
+ // Full screen (disregarding offsets and adding EWMH atom)
+ { MOD |SHIFT , XK_x, fullscreen, {}},
+ // Maximize vertically
+ { MOD , XK_m, maxvert_hor, {.i=TWOBWM_MAXIMIZE_VERTICALLY}},
+ // Maximize horizontally
+ { MOD |SHIFT, XK_m, maxvert_hor, {.i=TWOBWM_MAXIMIZE_HORIZONTALLY}},
+ // Maximize and move
+ // vertically left
+ { MOD |SHIFT, XK_y, maxhalf, {.i=TWOBWM_MAXHALF_VERTICAL_LEFT}},
+ // vertically right
+ { MOD |SHIFT, XK_u, maxhalf, {.i=TWOBWM_MAXHALF_VERTICAL_RIGHT}},
+ // horizontally left
+ { MOD |SHIFT, XK_b, maxhalf, {.i=TWOBWM_MAXHALF_HORIZONTAL_BOTTOM}},
+ // horizontally right
+ { MOD |SHIFT, XK_n, maxhalf, {.i=TWOBWM_MAXHALF_HORIZONTAL_TOP}},
+ //fold half vertically
+ { MOD |SHIFT|CONTROL,XK_y, maxhalf, {.i=TWOBWM_MAXHALF_FOLD_VERTICAL}},
+ //fold half horizontally
+ { MOD |SHIFT|CONTROL,XK_b, maxhalf, {.i=TWOBWM_MAXHALF_FOLD_HORIZONTAL}},
+ //unfold vertically
+ { MOD |SHIFT|CONTROL,XK_u, maxhalf, {.i=TWOBWM_MAXHALF_UNFOLD_VERTICAL}},
+ //unfold horizontally
+ { MOD |SHIFT|CONTROL,XK_n, maxhalf, {.i=TWOBWM_MAXHALF_UNFOLD_HORIZONTAL}},
+ // Next/Previous screen
+ { MOD , XK_comma, changescreen, {.i=TWOBWM_NEXT_SCREEN}},
+ { MOD , XK_period, changescreen, {.i=TWOBWM_PREVIOUS_SCREEN}},
+ // Raise or lower a window
+ { MOD , XK_r, raiseorlower, {}},
+ // Next/Previous workspace
+ { MOD , XK_v, nextworkspace, {}},
+ { MOD , XK_c, prevworkspace, {}},
+ // Move to Next/Previous workspace
+ { MOD |SHIFT , XK_v, sendtonextworkspace,{}},
+ { MOD |SHIFT , XK_c, sendtoprevworkspace,{}},
+ // Iconify the window
+ { MOD , XK_i, hide, {}},
+ // Make the window unkillable
+ { MOD , XK_a, unkillable, {}},
+ // Make the window appear always on top
+ { MOD, XK_t, always_on_top, {}},
+ // Make the window stay on all workspaces
+ { MOD , XK_f, fix, {}},
+ // Move the cursor
+ { MOD , XK_Up, cursor_move, {.i=TWOBWM_CURSOR_UP_SLOW}},
+ { MOD , XK_Down, cursor_move, {.i=TWOBWM_CURSOR_DOWN_SLOW}},
+ { MOD , XK_Right, cursor_move, {.i=TWOBWM_CURSOR_RIGHT_SLOW}},
+ { MOD , XK_Left, cursor_move, {.i=TWOBWM_CURSOR_LEFT_SLOW}},
+ // Move the cursor faster
+ { MOD |SHIFT, XK_Up, cursor_move, {.i=TWOBWM_CURSOR_UP}},
+ { MOD |SHIFT, XK_Down, cursor_move, {.i=TWOBWM_CURSOR_DOWN}},
+ { MOD |SHIFT, XK_Right, cursor_move, {.i=TWOBWM_CURSOR_RIGHT}},
+ { MOD |SHIFT, XK_Left, cursor_move, {.i=TWOBWM_CURSOR_LEFT}},
+ // Start programs
+ { MOD , XK_w, start, {.com = menucmd}},
+ { MOD , XK_Return, start, {.com = termcmd}},
+ // Exit or restart 2bwm
+ { MOD |CONTROL, XK_q, twobwm_exit, {.i=0}},
+ { MOD |CONTROL, XK_r, twobwm_restart, {.i=0}},
+ { MOD , XK_space, halfandcentered, {.i=0}},
+ { MOD , XK_s, toggle_sloppy, {.com = sloppy_switch_cmd}},
+ // Change current workspace
+ DESKTOPCHANGE( XK_asterisk, 0) // 0
+ DESKTOPCHANGE( XK_parenleft, 1) // 1
+ DESKTOPCHANGE( XK_parenright, 2)
+ DESKTOPCHANGE( XK_braceright, 3)
+ DESKTOPCHANGE( XK_plus, 4)
+ DESKTOPCHANGE( XK_braceleft, 5)
+ DESKTOPCHANGE( XK_bracketright, 6)
+ DESKTOPCHANGE( XK_bracketleft, 7)
+ DESKTOPCHANGE( XK_exclam, 8)
+ DESKTOPCHANGE( XK_equal, 9) // 9
+};
+// the last argument makes it a root window only event
+static Button buttons[] = {
+ { MOD ,XCB_BUTTON_INDEX_1, mousemotion, {.i=TWOBWM_MOVE}, false},
+ { MOD ,XCB_BUTTON_INDEX_3, mousemotion, {.i=TWOBWM_RESIZE}, false},
+ { 0 ,XCB_BUTTON_INDEX_3, start, {.com = menucmd}, true},
+ { MOD|SHIFT, XCB_BUTTON_INDEX_1, changeworkspace, {.i=0}, false},
+ { MOD|SHIFT, XCB_BUTTON_INDEX_3, changeworkspace, {.i=1}, false},
+ { MOD|ALT, XCB_BUTTON_INDEX_1, changescreen, {.i=1}, false},
+ { MOD|ALT, XCB_BUTTON_INDEX_3, changescreen, {.i=0}, false}
+};
diff --git a/srcpkgs/2bwm/template b/srcpkgs/2bwm/template
@@ -0,0 +1,32 @@
+# Template file for '2bwm'
+pkgname=2bwm
+version=0.3
+revision=1
+_commit="148d83254ca5f0fbc464ced5c487103aaf959559"
+wrksrc="${pkgname}-${_commit}"
+build_style=gnu-makefile
+makedepends="libxcb-devel xcb-util-keysyms-devel xcb-util-wm-devel xcb-util-xrm-devel"
+short_desc="Fast floating window manager"
+maintainer="Dash Eclipse <dash@ezup.dev>"
+license="ISC"
+homepage="https://github.com/venam/2bwm"
+distfiles="https://github.com/venam/${pkgname}/archive/${_commit}.tar.gz"
+checksum=307cc1a47c26ba54d0a8a7aa29a87bc9768ea5524f03078c5cc7b2602e3e23e3
+tags="ezup gitpkg ${_commit}"
+
+pre_build() {
+ [ -e ${FILESDIR}/config.h ] && cp ${FILESDIR}/config.h config.h
+ sed -i 's|-Os ||g' Makefile
+ sed -i 's|^CFLAGS+=|override CFLAGS +=|g' Makefile
+ sed -i 's|^LDFLAGS+=|override LDFLAGS +=|g' Makefile
+ sed -i '/#include <stdlib.h>/i#define _GNU_SOURCE' 2bwm.c
+ sed -n 1,17p 2bwm.c >LICENSE
+}
+do_install() {
+ vbin 2bwm
+ vbin hidden
+ vman 2bwm.man 2bwm.1
+ vman hidden.man hidden.1
+ vdoc README.md README
+ vlicense LICENSE
+}