dwm-keybindings-6.5.diff - sites - public wiki contents of suckless.org
 (HTM) git clone git://git.suckless.org/sites
 (DIR) Log
 (DIR) Files
 (DIR) Refs
       ---
       dwm-keybindings-6.5.diff (4787B)
       ---
            1 diff --git a/config.def.h b/config.def.h
            2 index 9efa774..5ca4a0d 100644
            3 --- a/config.def.h
            4 +++ b/config.def.h
            5 @@ -51,6 +51,8 @@ static const Layout layouts[] = {
            6          { MODKEY|ControlMask,           KEY,      toggleview,     {.ui = 1 << TAG} }, \
            7          { MODKEY|ShiftMask,             KEY,      tag,            {.ui = 1 << TAG} }, \
            8          { MODKEY|ControlMask|ShiftMask, KEY,      toggletag,      {.ui = 1 << TAG} },
            9 +#define KEYEVENT(SRC_MOD,SRC_KEY,DST_MOD,DST_KEY) \
           10 +        { SRC_MOD, SRC_KEY, sendkeyevent, { .v = &(const KeyBinding){ DST_MOD, DST_KEY } } },
           11  
           12  /* helper for spawning shell commands in the pre dwm-5.0 fashion */
           13  #define SHCMD(cmd) { .v = (const char*[]){ "/bin/sh", "-c", cmd, NULL } }
           14 @@ -85,6 +87,43 @@ static const Key keys[] = {
           15          { MODKEY,                       XK_period, focusmon,       {.i = +1 } },
           16          { MODKEY|ShiftMask,             XK_comma,  tagmon,         {.i = -1 } },
           17          { MODKEY|ShiftMask,             XK_period, tagmon,         {.i = +1 } },
           18 +        // Navigation(two-handed)
           19 +        KEYEVENT(Mod1Mask, XK_h, 0, XK_Left)
           20 +        KEYEVENT(Mod1Mask, XK_l, 0, XK_Right)
           21 +        KEYEVENT(Mod1Mask, XK_k, 0, XK_Up)
           22 +        KEYEVENT(Mod1Mask, XK_j, 0, XK_Down)
           23 +        KEYEVENT(Mod1Mask, XK_p, 0, XK_Up)
           24 +        KEYEVENT(Mod1Mask, XK_n, 0, XK_Down)
           25 +        KEYEVENT(Mod1Mask, XK_i, ControlMask, XK_Left)
           26 +        KEYEVENT(Mod1Mask, XK_o, ControlMask, XK_Right)
           27 +        KEYEVENT(Mod1Mask, XK_equal, ControlMask, XK_Home)
           28 +        KEYEVENT(Mod1Mask, XK_minus, ControlMask, XK_End)
           29 +        // Navigation(one-handed)
           30 +        KEYEVENT(Mod1Mask, XK_s, 0, XK_Up)
           31 +        KEYEVENT(Mod1Mask, XK_x, 0, XK_Down)
           32 +        KEYEVENT(Mod1Mask, XK_z, 0, XK_Left)
           33 +        KEYEVENT(Mod1Mask, XK_c, 0, XK_Right)
           34 +        KEYEVENT(Mod1Mask, XK_d, 0, XK_Return)
           35 +        KEYEVENT(Mod1Mask, XK_a, 0, XK_Home)
           36 +        KEYEVENT(Mod1Mask, XK_e, 0, XK_End)
           37 +        // Selection(two-handed)
           38 +        KEYEVENT(Mod1Mask|ShiftMask, XK_h, ShiftMask, XK_Left)
           39 +        KEYEVENT(Mod1Mask|ShiftMask, XK_l, ShiftMask, XK_Right)
           40 +        KEYEVENT(Mod1Mask|ShiftMask, XK_k, ShiftMask, XK_Up)
           41 +        KEYEVENT(Mod1Mask|ShiftMask, XK_j, ShiftMask, XK_Down)
           42 +        KEYEVENT(Mod1Mask|ShiftMask, XK_p, ShiftMask, XK_Up)
           43 +        KEYEVENT(Mod1Mask|ShiftMask, XK_n, ShiftMask, XK_Down)
           44 +        KEYEVENT(Mod1Mask|ShiftMask, XK_i, ControlMask|ShiftMask, XK_Left)
           45 +        KEYEVENT(Mod1Mask|ShiftMask, XK_o, ControlMask|ShiftMask, XK_Right)
           46 +        KEYEVENT(Mod1Mask|ShiftMask, XK_equal, ControlMask|ShiftMask, XK_Home)
           47 +        KEYEVENT(Mod1Mask|ShiftMask, XK_minus, ControlMask|ShiftMask, XK_End)
           48 +        // Selection(one-handed)
           49 +        KEYEVENT(Mod1Mask|ShiftMask, XK_s, ShiftMask, XK_Up)
           50 +        KEYEVENT(Mod1Mask|ShiftMask, XK_x, ShiftMask, XK_Down)
           51 +        KEYEVENT(Mod1Mask|ShiftMask, XK_z, ShiftMask, XK_Left)
           52 +        KEYEVENT(Mod1Mask|ShiftMask, XK_c, ShiftMask, XK_Right)
           53 +        KEYEVENT(Mod1Mask|ShiftMask, XK_a, ShiftMask, XK_Home)
           54 +        KEYEVENT(Mod1Mask|ShiftMask, XK_e, ShiftMask, XK_End)
           55          TAGKEYS(                        XK_1,                      0)
           56          TAGKEYS(                        XK_2,                      1)
           57          TAGKEYS(                        XK_3,                      2)
           58 diff --git a/dwm.c b/dwm.c
           59 index 67c6b2b..b7c911d 100644
           60 --- a/dwm.c
           61 +++ b/dwm.c
           62 @@ -106,6 +106,11 @@ typedef struct {
           63          const Arg arg;
           64  } Key;
           65  
           66 +typedef struct {
           67 +        unsigned int mod;
           68 +        KeySym keysym;
           69 +} KeyBinding;
           70 +
           71  typedef struct {
           72          const char *symbol;
           73          void (*arrange)(Monitor *);
           74 @@ -196,6 +201,7 @@ static void restack(Monitor *m);
           75  static void run(void);
           76  static void scan(void);
           77  static int sendevent(Client *c, Atom proto);
           78 +static void sendkeyevent(const Arg *arg);
           79  static void sendmon(Client *c, Monitor *m);
           80  static void setclientstate(Client *c, long state);
           81  static void setfocus(Client *c);
           82 @@ -1467,6 +1473,47 @@ sendevent(Client *c, Atom proto)
           83          return exists;
           84  }
           85  
           86 +XKeyEvent
           87 +createkeyevent(Display *display, Window win, Window rootWindow, int type, KeyBinding *keyBinding)
           88 +{
           89 +        int keysym = keyBinding->keysym;
           90 +        unsigned int modifier = keyBinding->mod;
           91 +
           92 +        XKeyEvent event;
           93 +        event.type = type;
           94 +        event.display = display;
           95 +        event.window = win;
           96 +        event.root = rootWindow;
           97 +        event.subwindow = None;
           98 +        event.time = CurrentTime;
           99 +        event.x = 1;
          100 +        event.y = 1;
          101 +        event.x_root = 1;
          102 +        event.y_root = 1;
          103 +        event.same_screen = True;
          104 +        event.keycode = XKeysymToKeycode(display, keysym);
          105 +        event.state = modifier;
          106 +
          107 +        return event;
          108 +}
          109 +
          110 +void sendkeyevent(const Arg *arg)
          111 +{
          112 +        Window rootWindow = XDefaultRootWindow(dpy);
          113 +
          114 +        Window focusedWindow;
          115 +        int revert;
          116 +        XGetInputFocus(dpy, &focusedWindow, &revert);
          117 +
          118 +        KeyBinding *keyBinding = (KeyBinding *)arg->v;
          119 +
          120 +        XKeyEvent event = createkeyevent(dpy, focusedWindow, rootWindow, KeyPress, keyBinding);
          121 +        XSendEvent(event.display, event.window, True, KeyPressMask, (XEvent *)&event);
          122 +
          123 +        event = createkeyevent(dpy, focusedWindow, rootWindow, KeyRelease, keyBinding);
          124 +        XSendEvent(event.display, event.window, True, KeyReleaseMask, (XEvent *)&event);
          125 +}
          126 +
          127  void
          128  setfocus(Client *c)
          129  {