dwm-alttab2-6.4.diff - sites - public wiki contents of suckless.org
 (HTM) git clone git://git.suckless.org/sites
 (DIR) Log
 (DIR) Files
 (DIR) Refs
       ---
       dwm-alttab2-6.4.diff (4323B)
       ---
            1 diff --git a/config.def.h b/config.def.h
            2 index 71ec68b..95499bd 100644
            3 --- a/config.def.h
            4 +++ b/config.def.h
            5 @@ -2,6 +2,8 @@
            6  
            7  /* appearance */
            8  static const unsigned int borderpx  = 1;        /* border pixel of windows */
            9 +static const unsigned int tabModKey = 0x40;
           10 +static const unsigned int tabCycleKey = 0x17;
           11  static const unsigned int snap      = 32;       /* snap pixel */
           12  static const int showbar            = 1;        /* 0 means no bar */
           13  static const int topbar             = 1;        /* 0 means bottom bar */
           14 @@ -96,6 +98,7 @@ static const Key keys[] = {
           15          TAGKEYS(                        XK_9,                      8)
           16          { MODKEY|ShiftMask,             XK_q,      quit,           {0} },
           17          { MODKEY,                       XK_o,      winview,        {0} },
           18 +        { Mod1Mask,                     XK_Tab,    alttab,         {0} },
           19  };
           20  
           21  /* button definitions */
           22 diff --git a/dwm.c b/dwm.c
           23 index ec076a8..71d0ebc 100644
           24 --- a/dwm.c
           25 +++ b/dwm.c
           26 @@ -28,6 +28,7 @@
           27  #include <stdlib.h>
           28  #include <string.h>
           29  #include <unistd.h>
           30 +#include <time.h>
           31  #include <sys/types.h>
           32  #include <sys/wait.h>
           33  #include <X11/cursorfont.h>
           34 @@ -142,6 +143,7 @@ typedef struct {
           35  } Rule;
           36  
           37  /* function declarations */
           38 +static void alttab(const Arg *arg);
           39  static void applyrules(Client *c);
           40  static int applysizehints(Client *c, int *x, int *y, int *w, int *h, int interact);
           41  static void arrange(Monitor *m);
           42 @@ -168,6 +170,7 @@ static void expose(XEvent *e);
           43  static void focus(Client *c);
           44  static void focusin(XEvent *e);
           45  static void focusmon(const Arg *arg);
           46 +static void focusnext(const Arg *arg);
           47  static void focusstack(const Arg *arg);
           48  static Atom getatomprop(Client *c, Atom prop);
           49  static int getrootptr(int *x, int *y);
           50 @@ -269,6 +272,8 @@ static Drw *drw;
           51  static Monitor *mons, *selmon;
           52  static Window root, wmcheckwin;
           53  
           54 +static int alt_tab_direction = 0;
           55 +
           56  /* configuration, allows nested code to access above variables */
           57  #include "config.h"
           58  
           59 @@ -276,6 +281,79 @@ static Window root, wmcheckwin;
           60  struct NumTags { char limitexceeded[LENGTH(tags) > 31 ? -1 : 1]; };
           61  
           62  /* function implementations */
           63 +
           64 +static void
           65 +alttab(const Arg *arg) {
           66 +
           67 +        view(&(Arg){ .ui = ~0 });
           68 +        focusnext(&(Arg){ .i = alt_tab_direction });
           69 +
           70 +        int grabbed = 1;
           71 +        int grabbed_keyboard = 1000;
           72 +        for (int i = 0; i < 100; i += 1) {
           73 +                struct timespec ts;
           74 +                ts.tv_sec = 0;
           75 +                ts.tv_nsec = 1000000;
           76 +
           77 +                if (grabbed_keyboard != GrabSuccess) {
           78 +                        grabbed_keyboard = XGrabKeyboard(dpy, DefaultRootWindow(dpy), True,
           79 +                                                                                         GrabModeAsync, GrabModeAsync, CurrentTime);
           80 +                }
           81 +                if (grabbed_keyboard == GrabSuccess) {
           82 +                        XGrabButton(dpy, AnyButton, AnyModifier, None, False,
           83 +                                                BUTTONMASK, GrabModeAsync, GrabModeAsync,
           84 +                                                None, None);
           85 +                        break;
           86 +                }
           87 +                nanosleep(&ts, NULL);
           88 +                if (i == 100 - 1)
           89 +                        grabbed = 0;
           90 +        }
           91 +
           92 +        XEvent event;
           93 +        Client *c;
           94 +        Monitor *m;
           95 +        XButtonPressedEvent *ev;
           96 +
           97 +        while (grabbed) {
           98 +                XNextEvent(dpy, &event);
           99 +                switch (event.type) {
          100 +                case KeyPress:
          101 +                        if (event.xkey.keycode == tabCycleKey)
          102 +                                focusnext(&(Arg){ .i = alt_tab_direction });
          103 +                        break;
          104 +                case KeyRelease:
          105 +                        if (event.xkey.keycode == tabModKey) {
          106 +                                XUngrabKeyboard(dpy, CurrentTime);
          107 +                                XUngrabButton(dpy, AnyButton, AnyModifier, None);
          108 +                                grabbed = 0;
          109 +                                alt_tab_direction = !alt_tab_direction;
          110 +                                winview(0);
          111 +                        }
          112 +                        break;
          113 +            case ButtonPress:
          114 +                        ev = &(event.xbutton);
          115 +                        if ((m = wintomon(ev->window)) && m != selmon) {
          116 +                                unfocus(selmon->sel, 1);
          117 +                                selmon = m;
          118 +                                focus(NULL);
          119 +                        }
          120 +                        if ((c = wintoclient(ev->window)))
          121 +                                focus(c);
          122 +                        XAllowEvents(dpy, AsyncBoth, CurrentTime);
          123 +                        break;
          124 +                case ButtonRelease:
          125 +                        XUngrabKeyboard(dpy, CurrentTime);
          126 +                        XUngrabButton(dpy, AnyButton, AnyModifier, None);
          127 +                        grabbed = 0;
          128 +                        alt_tab_direction = !alt_tab_direction;
          129 +                        winview(0);
          130 +                        break;
          131 +                }
          132 +        }
          133 +        return;
          134 +}
          135 +
          136  void
          137  applyrules(Client *c)
          138  {
          139 @@ -836,6 +914,28 @@ focusmon(const Arg *arg)
          140          focus(NULL);
          141  }
          142  
          143 +static void
          144 +focusnext(const Arg *arg) {
          145 +        Monitor *m;
          146 +        Client *c;
          147 +        m = selmon;
          148 +        c = m->sel;
          149 +
          150 +        if (arg->i) {
          151 +                if (c->next)
          152 +                        c = c->next;
          153 +                else
          154 +                        c = m->clients;
          155 +        } else {
          156 +                Client *last = c;
          157 +                if (last == m->clients)
          158 +                        last = NULL;
          159 +                for (c = m->clients; c->next != last; c = c->next);
          160 +        }
          161 +        focus(c);
          162 +        return;
          163 +}
          164 +
          165  void
          166  focusstack(const Arg *arg)
          167  {