diff --git a/tabbed-flexipatch/config.def.h b/tabbed-flexipatch/config.def.h index 0eef44a..5d077ea 100644 --- a/tabbed-flexipatch/config.def.h +++ b/tabbed-flexipatch/config.def.h @@ -33,14 +33,183 @@ static Bool npisrelative = False; #define SETPROP(p) { \ .v = (char *[]){ "/bin/sh", "-c", \ - "prop=\"`xwininfo -children -id $1 | grep '^ 0x' |" \ + "prop=\"$(xwininfo -children -id $1 | grep '^ 0x' |" \ "sed -e's@^ *\\(0x[0-9a-f]*\\) \"\\([^\"]*\\)\".*@\\1 \\2@' |" \ - "xargs -0 printf %b | dmenu -l 10 -w $1`\" &&" \ + "tail -n +2 | dmenu -i -l 10 -p 'Switch to: ')\" &&" \ "xprop -id $1 -f $0 8s -set $0 \"$prop\"", \ p, winid, NULL \ } \ } +/* Modify the following line to match your terminal and software list */ +#define OPENTERMSOFT(p) { \ + .v = (char *[]){ "/bin/sh", "-c", \ + "term='st' && titlearg='-t' && embedarg='-w' &&" \ + "softlist=$(printf '%s\n' \"htop\" \"btm\" \"vim\" \"xplr\" \"ncmpcpp\" \"cmatrix\") &&" \ + "printf '%s' \"$softlist\" |" \ + "dmenu -p 'Softwares to run: ' |" \ + "xargs -I {} $term $titlearg \"{}\" $embedarg $1 -e \"{}\"", \ + p, winid, NULL \ + } \ +} + + +/* Modify the following line to match your terminal*/ +#define OPENTERM(p) { \ + .v = (char *[]){ "/bin/sh", "-c", \ + "term='st' && embedarg='-w' &&" \ + "cd \"$(xwininfo -children -id $1 | grep '^ 0x' |" \ + "sed -e's@^ *\\(0x[0-9a-f]*\\) \"\\([^\"]*\\)\".*@\\1 \\2@' |" \ + "dmenu -l 10 -p 'New term path based on: ' |" \ + "cut -f 1 | xargs -I {} xprop -id \"{}\" | grep _NET_WM_PID |" \ + "cut -d ' ' -f 3 | xargs -I {} pstree -p \"{}\" |" \ + "cut -d '(' -f 3 | cut -d ')' -f 1 |" \ + "xargs -I {} readlink -e /proc/\"{}\"/cwd/)\" &&" \ + "$term $embedarg $1", \ + p, winid, NULL \ + } \ +} + +/* deskid: id for current workspace */ +/* rootid: id for root window */ +/* window: data for chosen window by dmenu */ +/* wid: chosen window's window id */ +/* wname: chosen window's name */ +/* cwid: chosen window's child window id (tabbed window only) */ +#define ATTACHWIN(p) { \ + .v = (char *[]){ "/bin/sh", "-c", \ + "deskid=$(xdotool get_desktop) &&" \ + "rootid=\"$(xwininfo -root | grep \"Window id\" | cut -d ' ' -f 4)\" &&" \ + "window=\"$(wmctrl -x -l | grep -E \" $deskid \" |" \ + "grep -v $(printf '0x0%x' \"$1\") |" \ + "cut -d ' ' -f 1,4 | dmenu -i -l 5 -p \"Attach: \")\" &&" \ + "wid=$(printf '%s' \"$window\" | cut -d ' ' -f 1) &&" \ + "wname=$(printf '%s' \"$window\" | cut -d ' ' -f 2) &&" \ + "[ \"$wname\" = \"tabbed.tabbed\" ] &&" \ + "cwid=$(xwininfo -children -id \"$wid\" | grep '^ 0x' |" \ + "sed -e 's@^ *\\(0x[0-9a-f]*\\) \"\\([^\"]*\\)\".*@\\1@') &&" \ + "for id in $(printf '%s' \"$cwid\"); do xdotool windowreparent \"$id\" \"$rootid\"; done &&" \ + "for id in $(printf '%s' \"$cwid\"); do xdotool windowreparent \"$id\" \"$1\"; done ||" \ + "xdotool windowreparent \"$wid\" $1", \ + p, winid, NULL \ + } \ +} + +#define ATTACHSELECTWIN(p) { \ + .v = (char *[]){ "/bin/sh", "-c", \ + "rootid=\"$(xwininfo -root | grep \"Window id\" | cut -d ' ' -f 4)\" &&" \ + "wid=$(xdotool selectwindow) &&" \ + "wname=$(xwininfo -id \"$wid\" | grep 'Window id:' | cut -d ' ' -f 5-) &&" \ + "[ \"$wname\" = \"(has no name)\" ] &&" \ + "cwid=$(xwininfo -children -id \"$wid\" | grep '^ 0x' |" \ + "sed -e 's@^ *\\(0x[0-9a-f]*\\) \"\\([^\"]*\\)\".*@\\1@') &&" \ + "for id in $(printf '%s' \"$cwid\"); do xdotool windowreparent \"$id\" \"$rootid\"; done &&" \ + "for id in $(printf '%s' \"$cwid\"); do xdotool windowreparent \"$id\" \"$1\"; done ||" \ + "xdotool windowreparent \"$wid\" $1", \ + p, winid, NULL \ + } \ +} + +#define ATTACHALL(p) { \ + .v = (char *[]){ "/bin/sh", "-c", \ + "deskid=$(xdotool get_desktop) &&" \ + "rootid=\"$(xwininfo -root | grep \"Window id\" | cut -d ' ' -f 4)\" &&" \ + "window=\"$(wmctrl -x -l | grep -E \" $deskid \" |" \ + "grep -v $(printf '0x0%x' \"$1\") | cut -d ' ' -f 1,4)\" &&" \ + "IFS=':' &&" \ + "for win in $(printf '%s' \"$window\" | tr '\n' ':'); do unset IFS &&" \ + "wid=$(printf '%s' \"$win\" | cut -d ' ' -f 1) &&" \ + "wname=$(printf '%s' \"$win\" | cut -d ' ' -f 2) &&" \ + "[ \"$wname\" = \"tabbed.tabbed\" ] &&" \ + "{ cwid=$(xwininfo -children -id \"$wid\" | grep '^ 0x' |" \ + "sed -e 's@^ *\\(0x[0-9a-f]*\\) \"\\([^\"]*\\)\".*@\\1@') &&" \ + "for id in $(printf '%s' \"$cwid\"); do xdotool windowreparent \"$id\" \"$rootid\"; done &&" \ + "for id in $(printf '%s' \"$cwid\"); do xdotool windowreparent \"$id\" \"$1\"; done; } ||" \ + "xdotool windowreparent \"$wid\" $1; done", \ + p, winid, NULL \ + } \ +} + + +#define DETACHWIN(p) { \ + .v = (char *[]){ "/bin/sh", "-c", \ + "rootid=\"$(xwininfo -root | grep \"Window id\" | cut -d ' ' -f 4)\" &&" \ + "wid=\"$(xwininfo -children -id $1 | grep '^ 0x' |" \ + "sed -e 's@^ *\\(0x[0-9a-f]*\\) \"\\([^\"]*\\)\".*@\\1 \\2@' |" \ + "dmenu -i -l 5 -p 'Detach: ' | cut -d ' ' -f 1)\" &&" \ + "xwininfo -id $wid -stats | grep -q 'IsUnMapped' && xdotool windowmap $wid;" \ + "xdotool windowreparent \"$wid\" \"$rootid\" &&" \ + "xdotool windowactivate $1", \ + p, winid, NULL \ + } \ +} + + + +#define DETACHALL(p) { \ + .v = (char *[]){ "/bin/sh", "-c", \ + "rootid=\"$(xwininfo -root | grep \"Window id\" | cut -d ' ' -f 4)\" &&" \ + "wid=\"$(xwininfo -children -id $1 | grep '^ 0x' |" \ + "sed -e 's@^ *\\(0x[0-9a-f]*\\) \"\\([^\"]*\\)\".*@\\1@')\" &&" \ + "IFS=':' &&" \ + "for id in $(printf '%s' \"$wid\" | tr '\n' ':'); do unset IFS &&" \ + "xdotool windowreparent \"$id\" \"$rootid\" &&" \ + "xwininfo -id $id -stats |" \ + "grep -q 'IsUnMapped' &&" \ + "xdotool windowmap $id; done", \ + p, winid, NULL \ + } \ +} + + + +#define SHOWHIDDEN(p) { \ + .v = (char *[]){ "/bin/sh", "-c", \ + "cwin=\"$(xwininfo -children -id $1 | grep '^ 0x' |" \ + "sed -e 's@^ *\\(0x[0-9a-f]*\\) \"\\([^\"]*\\)\".*@\\1 \\2@')\" &&" \ + "IFS=':' &&" \ + "for win in $(printf '%s' \"$cwin\" | tr '\n' ':'); do unset IFS &&" \ + "cwid=$(printf '%s' \"$win\" | cut -d ' ' -f 1) &&" \ + "xwininfo -id $cwid -stats |" \ + "grep -q 'IsUnMapped' &&" \ + "printf '%s\n' \"$win\"; done |" \ + "dmenu -i -l 5 -p \"Show hidden window:\" |" \ + "cut -d ' ' -f 1 |" \ + "xargs -I {} xdotool windowmap \"{}\"", \ + p, winid, NULL \ + } \ +} + +#define SHOWHIDDENALL(p) { \ + .v = (char *[]){ "/bin/sh", "-c", \ + "cwid=\"$(xwininfo -children -id $1 | grep '^ 0x' |" \ + "sed -e 's@^ *\\(0x[0-9a-f]*\\) \"\\([^\"]*\\)\".*@\\1@')\" &&" \ + "IFS=':' &&" \ + "for id in $(printf '%s' \"$cwid\" | tr '\n' ':'); do unset IFS &&" \ + "xwininfo -id $id -stats | " \ + "grep -q 'IsUnMapped' &&" \ + "xdotool windowmap $id; done", \ + p, winid, NULL \ + } \ +} + +#define HIDEWINDOW(p) { \ + .v = (char *[]){ "/bin/sh", "-c", \ + "cwid=\"$(xwininfo -children -id $1 | grep '^ 0x' |" \ + "sed -e 's@^ *\\(0x[0-9a-f]*\\) \"\\([^\"]*\\)\".*@\\1@')\" &&" \ + "IFS=':' && winnum=0 &&" \ + "for id in $(printf '%s' \"$cwid\" | tr '\n' ':'); do unset IFS &&" \ + "xwininfo -id $id -stats | " \ + "grep -q 'IsViewable' &&" \ + "winnum=$(($winnum+1)); done;" \ + "[ $winnum -gt 1 ] &&" \ + "{ xwininfo -children -id $1 | grep '^ 0x' | head -n 1 |" \ + "sed -e 's@^ *\\(0x[0-9a-f]*\\) \"\\([^\"]*\\)\".*@\\1@' |" \ + "xargs -I {} xdotool windowunmap \"{}\"; }", \ + p, winid, NULL \ + } \ +} + #if XRESOURCES_PATCH /* * Xresources preferences to load at startup @@ -99,7 +268,7 @@ static const Key keys[] = { { MODKEY|ShiftMask, XK_k, movetab, { .i = +1 } }, { MODKEY, XK_Tab, rotate, { .i = 0 } }, - { MODKEY, XK_slash, spawn, SETPROP("_TABBED_SELECT_TAB") }, + { MODKEY|ShiftMask, XK_comma, spawn, SETPROP("_TABBED_SELECT_TAB") }, { MODKEY, XK_1, move, { .i = 0 } }, { MODKEY, XK_2, move, { .i = 1 } }, { MODKEY, XK_3, move, { .i = 2 } }, @@ -117,6 +286,17 @@ static const Key keys[] = { { MODKEY|ShiftMask, XK_u, toggle, { .v = (void*) &urgentswitch } }, { 0, XK_F11, fullscreen, { 0 } }, + /* Unique functionality */ + { MODKEY|ShiftMask, XK_f, spawn, OPENTERMSOFT("_TABBED_SELECT_TERMAPP") }, + { MODKEY|ShiftMask, XK_g, spawn, OPENTERM("_TABBED_TERM") }, + { MODKEY|ShiftMask, XK_h, spawn, ATTACHWIN("_TABBED_ATTACH_WIN") }, + { MODKEY|ShiftMask, XK_r, spawn, ATTACHSELECTWIN("_TABBED_ATTACH_WIN") }, + { MODKEY|ShiftMask, XK_t, spawn, ATTACHALL("_TABBED_ATTACH_ALL") }, + { MODKEY|ShiftMask, XK_y, spawn, DETACHWIN("_TABBED_DETACH_WIN") }, + { MODKEY|ShiftMask, XK_b, spawn, DETACHALL("_TABBED_DETACH_ALL") }, + { MODKEY|ShiftMask, XK_n, spawn, HIDEWINDOW("_TABBED_HIDE_WINDOW") }, + { MODKEY|ShiftMask, XK_m, spawn, SHOWHIDDEN("_TABBED_SHOW_HIDDEN") }, + { MODKEY|ShiftMask, XK_i, spawn, SHOWHIDDENALL("_TABBED_SHOW_HIDDEN_ALL") }, #if HIDETABS_PATCH { MODKEY, XK_Shift_L, showbar, { .i = 1 } }, { ShiftMask, XK_Control_L, showbar, { .i = 1 } },