Artifact 2ba9d74db2e28189d2d1d8a0a0226855767cddb5c8584d9579ea5c92b2eebd72:

  • File tmuxwm.c — part of check-in [d20f3304c3] at 2018-06-15 14:22:26 on branch trunk — Added licensing back; testing markdown readme (user: jmcclure size: 5192)

0000: 2f 2a 20 54 4d 55 58 57 4d 2e 43 0a 20 2a 20 43  /* TMUXWM.C. * C
0010: 6f 70 79 72 69 67 68 74 20 28 63 29 20 32 30 31  opyright (c) 201
0020: 35 2d 32 30 31 38 20 4a 65 73 73 65 20 4d 63 43  5-2018 Jesse McC
0030: 6c 75 72 65 20 3c 63 6f 64 65 40 6a 65 73 73 65  lure <code@jesse
0040: 6d 63 63 6c 75 72 65 2e 6f 72 67 3e 0a 20 2a 0a  mcclure.org>. *.
0050: 20 2a 20 50 65 72 6d 69 73 73 69 6f 6e 20 74 6f   * Permission to
0060: 20 75 73 65 2c 20 63 6f 70 79 2c 20 6d 6f 64 69   use, copy, modi
0070: 66 79 2c 20 61 6e 64 20 64 69 73 74 72 69 62 75  fy, and distribu
0080: 74 65 20 74 68 69 73 20 73 6f 66 74 77 61 72 65  te this software
0090: 20 66 6f 72 20 61 6e 79 0a 20 2a 20 70 75 72 70   for any. * purp
00a0: 6f 73 65 20 77 69 74 68 20 6f 72 20 77 69 74 68  ose with or with
00b0: 6f 75 74 20 66 65 65 20 69 73 20 68 65 72 65 62  out fee is hereb
00c0: 79 20 67 72 61 6e 74 65 64 2c 20 70 72 6f 76 69  y granted, provi
00d0: 64 65 64 20 74 68 61 74 20 74 68 65 20 61 62 6f  ded that the abo
00e0: 76 65 0a 20 2a 20 63 6f 70 79 72 69 67 68 74 20  ve. * copyright 
00f0: 6e 6f 74 69 63 65 20 61 6e 64 20 74 68 69 73 20  notice and this 
0100: 70 65 72 6d 69 73 73 69 6f 6e 20 6e 6f 74 69 63  permission notic
0110: 65 20 61 70 70 65 61 72 20 69 6e 20 61 6c 6c 20  e appear in all 
0120: 63 6f 70 69 65 73 2e 0a 20 2a 0a 20 2a 20 54 48  copies.. *. * TH
0130: 45 20 53 4f 46 54 57 41 52 45 20 49 53 20 50 52  E SOFTWARE IS PR
0140: 4f 56 49 44 45 44 20 22 41 53 20 49 53 22 20 41  OVIDED "AS IS" A
0150: 4e 44 20 54 48 45 20 41 55 54 48 4f 52 20 44 49  ND THE AUTHOR DI
0160: 53 43 4c 41 49 4d 53 20 41 4c 4c 20 57 41 52 52  SCLAIMS ALL WARR
0170: 41 4e 54 49 45 53 0a 20 2a 20 57 49 54 48 20 52  ANTIES. * WITH R
0180: 45 47 41 52 44 20 54 4f 20 54 48 49 53 20 53 4f  EGARD TO THIS SO
0190: 46 54 57 41 52 45 20 49 4e 43 4c 55 44 49 4e 47  FTWARE INCLUDING
01a0: 20 41 4c 4c 20 49 4d 50 4c 49 45 44 20 57 41 52   ALL IMPLIED WAR
01b0: 52 41 4e 54 49 45 53 20 4f 46 0a 20 2a 20 4d 45  RANTIES OF. * ME
01c0: 52 43 48 41 4e 54 41 42 49 4c 49 54 59 20 41 4e  RCHANTABILITY AN
01d0: 44 20 46 49 54 4e 45 53 53 2e 20 49 4e 20 4e 4f  D FITNESS. IN NO
01e0: 20 45 56 45 4e 54 20 53 48 41 4c 4c 20 54 48 45   EVENT SHALL THE
01f0: 20 41 55 54 48 4f 52 20 42 45 20 4c 49 41 42 4c   AUTHOR BE LIABL
0200: 45 20 46 4f 52 0a 20 2a 20 41 4e 59 20 53 50 45  E FOR. * ANY SPE
0210: 43 49 41 4c 2c 20 44 49 52 45 43 54 2c 20 49 4e  CIAL, DIRECT, IN
0220: 44 49 52 45 43 54 2c 20 4f 52 20 43 4f 4e 53 45  DIRECT, OR CONSE
0230: 51 55 45 4e 54 49 41 4c 20 44 41 4d 41 47 45 53  QUENTIAL DAMAGES
0240: 20 4f 52 20 41 4e 59 20 44 41 4d 41 47 45 53 0a   OR ANY DAMAGES.
0250: 20 2a 20 57 48 41 54 53 4f 45 56 45 52 20 52 45   * WHATSOEVER RE
0260: 53 55 4c 54 49 4e 47 20 46 52 4f 4d 20 4c 4f 53  SULTING FROM LOS
0270: 53 20 4f 46 20 55 53 45 2c 20 44 41 54 41 20 4f  S OF USE, DATA O
0280: 52 20 50 52 4f 46 49 54 53 2c 20 57 48 45 54 48  R PROFITS, WHETH
0290: 45 52 20 49 4e 20 41 4e 0a 20 2a 20 41 43 54 49  ER IN AN. * ACTI
02a0: 4f 4e 20 4f 46 20 43 4f 4e 54 52 41 43 54 2c 20  ON OF CONTRACT, 
02b0: 4e 45 47 4c 49 47 45 4e 43 45 20 4f 52 20 4f 54  NEGLIGENCE OR OT
02c0: 48 45 52 20 54 4f 52 54 49 4f 55 53 20 41 43 54  HER TORTIOUS ACT
02d0: 49 4f 4e 2c 20 41 52 49 53 49 4e 47 20 4f 55 54  ION, ARISING OUT
02e0: 20 4f 46 0a 20 2a 20 4f 52 20 49 4e 20 43 4f 4e   OF. * OR IN CON
02f0: 4e 45 43 54 49 4f 4e 20 57 49 54 48 20 54 48 45  NECTION WITH THE
0300: 20 55 53 45 20 4f 52 20 50 45 52 46 4f 52 4d 41   USE OR PERFORMA
0310: 4e 43 45 20 4f 46 20 54 48 49 53 20 53 4f 46 54  NCE OF THIS SOFT
0320: 57 41 52 45 2e 0a 20 2a 2f 0a 0a 23 69 6e 63 6c  WARE.. */..#incl
0330: 75 64 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 23  ude <stdlib.h>.#
0340: 69 6e 63 6c 75 64 65 20 3c 73 69 67 6e 61 6c 2e  include <signal.
0350: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 75 6e 69  h>.#include <uni
0360: 73 74 64 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  std.h>.#include 
0370: 3c 58 31 31 2f 58 6c 69 62 2e 68 3e 0a 23 69 6e  <X11/Xlib.h>.#in
0380: 63 6c 75 64 65 20 3c 58 31 31 2f 6b 65 79 73 79  clude <X11/keysy
0390: 6d 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 58  m.h>.#include <X
03a0: 31 31 2f 58 75 74 69 6c 2e 68 3e 0a 23 69 6e 63  11/Xutil.h>.#inc
03b0: 6c 75 64 65 20 3c 58 31 31 2f 58 4b 42 6c 69 62  lude <X11/XKBlib
03c0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 58 31  .h>.#include <X1
03d0: 31 2f 58 46 38 36 6b 65 79 73 79 6d 2e 68 3e 0a  1/XF86keysym.h>.
03e0: 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 7b  .static struct {
03f0: 20 4b 65 79 53 79 6d 20 73 79 6d 3b 20 63 68 61   KeySym sym; cha
0400: 72 20 2a 2a 61 72 67 73 3b 20 7d 20 20 62 69 6e  r **args; }  bin
0410: 64 5b 5d 20 3d 20 7b 0a 09 2f 2a 20 4e 6f 20 6b  d[] = {../* No k
0420: 65 79 73 79 6d 20 3d 20 73 74 61 72 74 20 77 69  eysym = start wi
0430: 74 68 20 57 4d 2e 20 20 46 69 72 73 74 20 69 73  th WM.  First is
0440: 20 4d 6f 64 2b 53 68 69 66 74 2b 45 6e 74 65 72   Mod+Shift+Enter
0450: 20 62 6f 75 6e 64 20 2a 2f 0a 09 7b 20 30 2c 20   bound */..{ 0, 
0460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0470: 20 20 20 20 20 20 20 28 63 68 61 72 20 2a 5b 5d         (char *[]
0480: 29 20 7b 20 22 73 74 22 2c 20 22 2d 65 22 2c 20  ) { "st", "-e", 
0490: 22 74 6d 75 78 22 2c 20 22 6e 65 77 2d 73 65 73  "tmux", "new-ses
04a0: 73 69 6f 6e 22 2c 20 22 2d 41 44 22 2c 20 22 2d  sion", "-AD", "-
04b0: 73 22 2c 20 22 54 6d 75 78 57 4d 22 2c 20 4e 55  s", "TmuxWM", NU
04c0: 4c 4c 20 7d 20 7d 2c 0a 09 7b 20 30 2c 20 20 20  LL } },..{ 0,   
04d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
04e0: 20 20 20 20 20 28 63 68 61 72 20 2a 5b 5d 29 20       (char *[]) 
04f0: 7b 20 22 73 65 74 78 6b 62 6d 61 70 22 2c 20 22  { "setxkbmap", "
0500: 2d 6f 70 74 69 6f 6e 22 2c 20 22 63 61 70 73 3a  -option", "caps:
0510: 65 73 63 61 70 65 22 2c 20 4e 55 4c 4c 20 7d 20  escape", NULL } 
0520: 7d 2c 0a 09 7b 20 58 46 38 36 58 4b 5f 41 75 64  },..{ XF86XK_Aud
0530: 69 6f 52 61 69 73 65 56 6f 6c 75 6d 65 2c 20 20  ioRaiseVolume,  
0540: 28 63 68 61 72 20 2a 5b 5d 29 20 7b 20 22 61 6d  (char *[]) { "am
0550: 69 78 65 72 22 2c 20 22 73 65 74 22 2c 20 22 4d  ixer", "set", "M
0560: 61 73 74 65 72 22 2c 20 22 32 2b 22 2c 20 4e 55  aster", "2+", NU
0570: 4c 4c 7d 20 7d 2c 0a 09 7b 20 58 46 38 36 58 4b  LL} },..{ XF86XK
0580: 5f 41 75 64 69 6f 4c 6f 77 65 72 56 6f 6c 75 6d  _AudioLowerVolum
0590: 65 2c 20 20 28 63 68 61 72 20 2a 5b 5d 29 20 7b  e,  (char *[]) {
05a0: 20 22 61 6d 69 78 65 72 22 2c 20 22 73 65 74 22   "amixer", "set"
05b0: 2c 20 22 4d 61 73 74 65 72 22 2c 20 22 32 2d 22  , "Master", "2-"
05c0: 2c 20 4e 55 4c 4c 7d 20 7d 2c 0a 09 7b 20 58 46  , NULL} },..{ XF
05d0: 38 36 58 4b 5f 41 75 64 69 6f 4d 75 74 65 2c 20  86XK_AudioMute, 
05e0: 20 20 20 20 20 20 20 20 28 63 68 61 72 20 2a 5b          (char *[
05f0: 5d 29 20 7b 20 22 61 6d 69 78 65 72 22 2c 20 22  ]) { "amixer", "
0600: 73 65 74 22 2c 20 22 4d 61 73 74 65 72 22 2c 20  set", "Master", 
0610: 22 74 6f 67 67 6c 65 22 2c 20 4e 55 4c 4c 7d 20  "toggle", NULL} 
0620: 7d 2c 0a 09 7b 20 58 46 38 36 58 4b 5f 53 63 72  },..{ XF86XK_Scr
0630: 65 65 6e 53 61 76 65 72 2c 20 20 20 20 20 20 20  eenSaver,       
0640: 28 63 68 61 72 20 2a 5b 5d 29 20 7b 20 22 73 6c  (char *[]) { "sl
0650: 6f 63 6b 22 2c 20 4e 55 4c 4c 7d 20 7d 2c 0a 7d  ock", NULL} },.}
0660: 3b 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  ;..static void c
0670: 6f 6e 66 69 67 75 72 65 72 65 71 75 65 73 74 28  onfigurerequest(
0680: 58 45 76 65 6e 74 20 2a 29 3b 0a 73 74 61 74 69  XEvent *);.stati
0690: 63 20 76 6f 69 64 20 65 6e 74 65 72 6e 6f 74 69  c void enternoti
06a0: 66 79 28 58 45 76 65 6e 74 20 2a 29 3b 0a 73 74  fy(XEvent *);.st
06b0: 61 74 69 63 20 76 6f 69 64 20 6b 65 79 70 72 65  atic void keypre
06c0: 73 73 28 58 45 76 65 6e 74 20 2a 29 3b 0a 73 74  ss(XEvent *);.st
06d0: 61 74 69 63 20 76 6f 69 64 20 6d 61 70 72 65 71  atic void mapreq
06e0: 75 65 73 74 28 58 45 76 65 6e 74 20 2a 29 3b 0a  uest(XEvent *);.
06f0: 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6d 61  static void unma
0700: 70 6e 6f 74 69 66 79 28 58 45 76 65 6e 74 20 2a  pnotify(XEvent *
0710: 29 3b 0a 0a 73 74 61 74 69 63 20 44 69 73 70 6c  );..static Displ
0720: 61 79 20 2a 64 70 79 3b 0a 73 74 61 74 69 63 20  ay *dpy;.static 
0730: 57 69 6e 64 6f 77 20 72 6f 6f 74 3b 0a 73 74 61  Window root;.sta
0740: 74 69 63 20 69 6e 74 20 73 77 2c 20 73 68 3b 0a  tic int sw, sh;.
0750: 73 74 61 74 69 63 20 76 6f 69 64 20 28 2a 68 61  static void (*ha
0760: 6e 64 6c 65 72 5b 4c 41 53 54 45 76 65 6e 74 5d  ndler[LASTEvent]
0770: 29 28 58 45 76 65 6e 74 20 2a 29 20 3d 20 7b 0a  )(XEvent *) = {.
0780: 09 5b 43 6f 6e 66 69 67 75 72 65 52 65 71 75 65  .[ConfigureReque
0790: 73 74 5d 20 20 20 3d 20 63 6f 6e 66 69 67 75 72  st]   = configur
07a0: 65 72 65 71 75 65 73 74 2c 0a 09 5b 45 6e 74 65  erequest,..[Ente
07b0: 72 4e 6f 74 69 66 79 5d 20 20 20 20 20 20 20 20  rNotify]        
07c0: 3d 20 65 6e 74 65 72 6e 6f 74 69 66 79 2c 0a 09  = enternotify,..
07d0: 5b 4b 65 79 50 72 65 73 73 5d 20 20 20 20 20 20  [KeyPress]      
07e0: 20 20 20 20 20 3d 20 6b 65 79 70 72 65 73 73 2c       = keypress,
07f0: 0a 09 5b 4d 61 70 52 65 71 75 65 73 74 5d 20 20  ..[MapRequest]  
0800: 20 20 20 20 20 20 20 3d 20 6d 61 70 72 65 71 75         = maprequ
0810: 65 73 74 2c 0a 7d 3b 0a 0a 73 74 61 74 69 63 20  est,.};..static 
0820: 69 6e 74 20 73 70 61 77 6e 28 63 68 61 72 20 2a  int spawn(char *
0830: 63 6f 6e 73 74 20 2a 61 72 67 73 29 20 7b 0a 09  const *args) {..
0840: 69 66 20 28 66 6f 72 6b 28 29 20 21 3d 20 30 29  if (fork() != 0)
0850: 20 72 65 74 75 72 6e 20 31 3b 0a 09 63 6c 6f 73   return 1;..clos
0860: 65 28 43 6f 6e 6e 65 63 74 69 6f 6e 4e 75 6d 62  e(ConnectionNumb
0870: 65 72 28 64 70 79 29 29 3b 0a 09 73 65 74 73 69  er(dpy));..setsi
0880: 64 28 29 3b 0a 09 69 66 20 28 66 6f 72 6b 28 29  d();..if (fork()
0890: 20 21 3d 20 30 29 20 65 78 69 74 28 30 29 3b 0a   != 0) exit(0);.
08a0: 09 72 65 74 75 72 6e 20 65 78 65 63 76 70 28 61  .return execvp(a
08b0: 72 67 73 5b 30 5d 2c 20 61 72 67 73 29 3b 0a 7d  rgs[0], args);.}
08c0: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 69  ..static int ini
08d0: 74 28 29 20 7b 0a 09 69 66 28 21 28 64 70 79 20  t() {..if(!(dpy 
08e0: 3d 20 58 4f 70 65 6e 44 69 73 70 6c 61 79 28 30  = XOpenDisplay(0
08f0: 78 30 29 29 29 20 72 65 74 75 72 6e 20 31 3b 0a  x0))) return 1;.
0900: 09 73 69 67 6e 61 6c 28 53 49 47 43 48 4c 44 2c  .signal(SIGCHLD,
0910: 20 53 49 47 5f 49 47 4e 29 3b 0a 09 72 6f 6f 74   SIG_IGN);..root
0920: 20 3d 20 44 65 66 61 75 6c 74 52 6f 6f 74 57 69   = DefaultRootWi
0930: 6e 64 6f 77 28 64 70 79 29 3b 0a 09 58 53 65 74  ndow(dpy);..XSet
0940: 57 69 6e 64 6f 77 42 61 63 6b 67 72 6f 75 6e 64  WindowBackground
0950: 28 64 70 79 2c 20 72 6f 6f 74 2c 20 30 78 30 36  (dpy, root, 0x06
0960: 30 38 31 32 29 3b 0a 09 58 44 65 66 69 6e 65 43  0812);..XDefineC
0970: 75 72 73 6f 72 28 64 70 79 2c 20 72 6f 6f 74 2c  ursor(dpy, root,
0980: 20 58 43 72 65 61 74 65 46 6f 6e 74 43 75 72 73   XCreateFontCurs
0990: 6f 72 28 64 70 79 2c 20 36 38 29 29 3b 0a 09 73  or(dpy, 68));..s
09a0: 77 20 3d 20 44 69 73 70 6c 61 79 57 69 64 74 68  w = DisplayWidth
09b0: 28 64 70 79 2c 20 44 65 66 61 75 6c 74 53 63 72  (dpy, DefaultScr
09c0: 65 65 6e 28 64 70 79 29 29 3b 0a 09 73 68 20 3d  een(dpy));..sh =
09d0: 20 44 69 73 70 6c 61 79 48 65 69 67 68 74 28 64   DisplayHeight(d
09e0: 70 79 2c 20 44 65 66 61 75 6c 74 53 63 72 65 65  py, DefaultScree
09f0: 6e 28 64 70 79 29 29 3b 0a 09 58 47 72 61 62 4b  n(dpy));..XGrabK
0a00: 65 79 28 64 70 79 2c 20 58 4b 65 79 73 79 6d 54  ey(dpy, XKeysymT
0a10: 6f 4b 65 79 63 6f 64 65 28 64 70 79 2c 20 58 4b  oKeycode(dpy, XK
0a20: 5f 54 61 62 29 2c 20 4d 6f 64 31 4d 61 73 6b 2c  _Tab), Mod1Mask,
0a30: 20 72 6f 6f 74 2c 20 54 72 75 65 2c 20 47 72 61   root, True, Gra
0a40: 62 4d 6f 64 65 41 73 79 6e 63 2c 20 47 72 61 62  bModeAsync, Grab
0a50: 4d 6f 64 65 41 73 79 6e 63 29 3b 0a 09 58 47 72  ModeAsync);..XGr
0a60: 61 62 4b 65 79 28 64 70 79 2c 20 58 4b 65 79 73  abKey(dpy, XKeys
0a70: 79 6d 54 6f 4b 65 79 63 6f 64 65 28 64 70 79 2c  ymToKeycode(dpy,
0a80: 20 58 4b 5f 52 65 74 75 72 6e 29 2c 20 4d 6f 64   XK_Return), Mod
0a90: 34 4d 61 73 6b 20 7c 20 53 68 69 66 74 4d 61 73  4Mask | ShiftMas
0aa0: 6b 2c 20 72 6f 6f 74 2c 20 54 72 75 65 2c 20 47  k, root, True, G
0ab0: 72 61 62 4d 6f 64 65 41 73 79 6e 63 2c 20 47 72  rabModeAsync, Gr
0ac0: 61 62 4d 6f 64 65 41 73 79 6e 63 29 3b 0a 09 58  abModeAsync);..X
0ad0: 47 72 61 62 4b 65 79 28 64 70 79 2c 20 41 6e 79  GrabKey(dpy, Any
0ae0: 4b 65 79 2c 20 4d 6f 64 34 4d 61 73 6b 2c 20 72  Key, Mod4Mask, r
0af0: 6f 6f 74 2c 20 54 72 75 65 2c 20 47 72 61 62 4d  oot, True, GrabM
0b00: 6f 64 65 41 73 79 6e 63 2c 20 47 72 61 62 4d 6f  odeAsync, GrabMo
0b10: 64 65 41 73 79 6e 63 29 3b 0a 09 58 53 65 6c 65  deAsync);..XSele
0b20: 63 74 49 6e 70 75 74 28 64 70 79 2c 20 72 6f 6f  ctInput(dpy, roo
0b30: 74 2c 20 53 75 62 73 74 72 75 63 74 75 72 65 4e  t, SubstructureN
0b40: 6f 74 69 66 79 4d 61 73 6b 20 7c 20 53 75 62 73  otifyMask | Subs
0b50: 74 72 75 63 74 75 72 65 52 65 64 69 72 65 63 74  tructureRedirect
0b60: 4d 61 73 6b 29 3b 0a 09 69 6e 74 20 69 3b 0a 09  Mask);..int i;..
0b70: 66 6f 72 20 28 69 20 3d 20 30 3b 20 69 20 3c 20  for (i = 0; i < 
0b80: 73 69 7a 65 6f 66 28 62 69 6e 64 29 20 2f 20 73  sizeof(bind) / s
0b90: 69 7a 65 6f 66 28 62 69 6e 64 5b 30 5d 29 3b 20  izeof(bind[0]); 
0ba0: 69 2b 2b 29 20 7b 0a 09 09 69 66 20 28 62 69 6e  i++) {...if (bin
0bb0: 64 5b 69 5d 2e 73 79 6d 20 3d 3d 20 30 29 20 73  d[i].sym == 0) s
0bc0: 70 61 77 6e 28 62 69 6e 64 5b 69 5d 2e 61 72 67  pawn(bind[i].arg
0bd0: 73 29 3b 0a 09 09 65 6c 73 65 20 58 47 72 61 62  s);...else XGrab
0be0: 4b 65 79 28 64 70 79 2c 20 58 4b 65 79 73 79 6d  Key(dpy, XKeysym
0bf0: 54 6f 4b 65 79 63 6f 64 65 28 64 70 79 2c 20 62  ToKeycode(dpy, b
0c00: 69 6e 64 5b 69 5d 2e 73 79 6d 29 2c 20 30 2c 20  ind[i].sym), 0, 
0c10: 72 6f 6f 74 2c 20 54 72 75 65 2c 20 47 72 61 62  root, True, Grab
0c20: 4d 6f 64 65 41 73 79 6e 63 2c 20 47 72 61 62 4d  ModeAsync, GrabM
0c30: 6f 64 65 41 73 79 6e 63 29 3b 0a 09 7d 0a 09 72  odeAsync);..}..r
0c40: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 69 6e 74 20  eturn 0;.}..int 
0c50: 6d 61 69 6e 28 29 20 7b 0a 09 69 66 20 28 69 6e  main() {..if (in
0c60: 69 74 28 29 20 21 3d 20 30 29 20 72 65 74 75 72  it() != 0) retur
0c70: 6e 20 31 3b 0a 09 58 45 76 65 6e 74 20 65 76 3b  n 1;..XEvent ev;
0c80: 0a 09 77 68 69 6c 65 20 28 21 58 4e 65 78 74 45  ..while (!XNextE
0c90: 76 65 6e 74 28 64 70 79 2c 26 65 76 29 29 0a 09  vent(dpy,&ev))..
0ca0: 09 69 66 20 28 68 61 6e 64 6c 65 72 5b 65 76 2e  .if (handler[ev.
0cb0: 74 79 70 65 5d 29 20 68 61 6e 64 6c 65 72 5b 65  type]) handler[e
0cc0: 76 2e 74 79 70 65 5d 28 26 65 76 29 3b 0a 09 72  v.type](&ev);..r
0cd0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 76 6f 69 64  eturn 0;.}..void
0ce0: 20 63 6f 6e 66 69 67 75 72 65 72 65 71 75 65 73   configurereques
0cf0: 74 28 58 45 76 65 6e 74 20 2a 65 76 29 20 7b 0a  t(XEvent *ev) {.
0d00: 09 58 43 6f 6e 66 69 67 75 72 65 52 65 71 75 65  .XConfigureReque
0d10: 73 74 45 76 65 6e 74 20 2a 65 20 3d 20 26 65 76  stEvent *e = &ev
0d20: 2d 3e 78 63 6f 6e 66 69 67 75 72 65 72 65 71 75  ->xconfigurerequ
0d30: 65 73 74 3b 0a 09 69 6e 74 20 62 70 78 20 3d 20  est;..int bpx = 
0d40: 28 65 2d 3e 78 20 3d 3d 20 30 20 26 26 20 65 2d  (e->x == 0 && e-
0d50: 3e 79 20 3d 3d 20 30 20 26 26 20 65 2d 3e 77 69  >y == 0 && e->wi
0d60: 64 74 68 20 3d 3d 20 73 77 20 26 26 20 65 2d 3e  dth == sw && e->
0d70: 68 65 69 67 68 74 20 3d 3d 20 73 68 20 3f 20 30  height == sh ? 0
0d80: 20 3a 20 32 29 3b 0a 09 58 57 69 6e 64 6f 77 43   : 2);..XWindowC
0d90: 68 61 6e 67 65 73 20 77 63 20 3d 20 7b 20 65 2d  hanges wc = { e-
0da0: 3e 78 2c 20 65 2d 3e 79 2c 20 65 2d 3e 77 69 64  >x, e->y, e->wid
0db0: 74 68 2c 20 65 2d 3e 68 65 69 67 68 74 2c 20 62  th, e->height, b
0dc0: 70 78 2c 20 65 2d 3e 64 65 74 61 69 6c 2c 20 41  px, e->detail, A
0dd0: 62 6f 76 65 20 7d 3b 0a 09 58 43 6f 6e 66 69 67  bove };..XConfig
0de0: 75 72 65 57 69 6e 64 6f 77 28 64 70 79 2c 20 65  ureWindow(dpy, e
0df0: 2d 3e 77 69 6e 64 6f 77 2c 20 65 2d 3e 76 61 6c  ->window, e->val
0e00: 75 65 5f 6d 61 73 6b 20 7c 20 43 57 42 6f 72 64  ue_mask | CWBord
0e10: 65 72 57 69 64 74 68 2c 20 26 77 63 29 3b 0a 7d  erWidth, &wc);.}
0e20: 0a 0a 76 6f 69 64 20 65 6e 74 65 72 6e 6f 74 69  ..void enternoti
0e30: 66 79 28 58 45 76 65 6e 74 20 2a 65 76 29 20 7b  fy(XEvent *ev) {
0e40: 0a 09 58 53 65 74 49 6e 70 75 74 46 6f 63 75 73  ..XSetInputFocus
0e50: 28 64 70 79 2c 20 65 76 2d 3e 78 63 72 6f 73 73  (dpy, ev->xcross
0e60: 69 6e 67 2e 77 69 6e 64 6f 77 2c 20 52 65 76 65  ing.window, Reve
0e70: 72 74 54 6f 50 6f 69 6e 74 65 72 52 6f 6f 74 2c  rtToPointerRoot,
0e80: 20 43 75 72 72 65 6e 74 54 69 6d 65 29 3b 0a 7d   CurrentTime);.}
0e90: 0a 0a 76 6f 69 64 20 6b 65 79 70 72 65 73 73 28  ..void keypress(
0ea0: 58 45 76 65 6e 74 20 2a 65 76 29 20 7b 0a 09 58  XEvent *ev) {..X
0eb0: 4b 65 79 45 76 65 6e 74 20 2a 65 20 3d 20 26 65  KeyEvent *e = &e
0ec0: 76 2d 3e 78 6b 65 79 3b 0a 09 4b 65 79 53 79 6d  v->xkey;..KeySym
0ed0: 20 73 79 6d 20 3d 20 58 6b 62 4b 65 79 63 6f 64   sym = XkbKeycod
0ee0: 65 54 6f 4b 65 79 73 79 6d 28 64 70 79 2c 20 65  eToKeysym(dpy, e
0ef0: 2d 3e 6b 65 79 63 6f 64 65 2c 20 30 2c 20 30 29  ->keycode, 0, 0)
0f00: 3b 0a 09 69 6e 74 20 69 3b 0a 09 69 66 20 28 65  ;..int i;..if (e
0f10: 2d 3e 73 74 61 74 65 20 3d 3d 20 4d 6f 64 31 4d  ->state == Mod1M
0f20: 61 73 6b 20 26 26 20 73 79 6d 20 3d 3d 20 58 4b  ask && sym == XK
0f30: 5f 54 61 62 29 20 58 43 69 72 63 75 6c 61 74 65  _Tab) XCirculate
0f40: 53 75 62 77 69 6e 64 6f 77 73 55 70 28 64 70 79  SubwindowsUp(dpy
0f50: 2c 20 72 6f 6f 74 29 3b 0a 09 65 6c 73 65 20 69  , root);..else i
0f60: 66 20 28 65 2d 3e 73 74 61 74 65 20 3d 3d 20 28  f (e->state == (
0f70: 4d 6f 64 34 4d 61 73 6b 7c 53 68 69 66 74 4d 61  Mod4Mask|ShiftMa
0f80: 73 6b 29 20 26 26 20 73 79 6d 20 3d 3d 20 58 4b  sk) && sym == XK
0f90: 5f 52 65 74 75 72 6e 29 20 73 70 61 77 6e 28 62  _Return) spawn(b
0fa0: 69 6e 64 5b 30 5d 2e 61 72 67 73 29 3b 0a 09 65  ind[0].args);..e
0fb0: 6c 73 65 20 69 66 20 28 65 2d 3e 73 74 61 74 65  lse if (e->state
0fc0: 20 3d 3d 20 30 29 20 7b 0a 09 09 66 6f 72 20 28   == 0) {...for (
0fd0: 69 20 3d 20 30 3b 20 69 20 3c 20 73 69 7a 65 6f  i = 0; i < sizeo
0fe0: 66 28 62 69 6e 64 29 20 2f 20 73 69 7a 65 6f 66  f(bind) / sizeof
0ff0: 28 62 69 6e 64 5b 30 5d 29 3b 20 69 2b 2b 29 0a  (bind[0]); i++).
1000: 09 09 09 69 66 20 28 62 69 6e 64 5b 69 5d 2e 73  ...if (bind[i].s
1010: 79 6d 20 3d 3d 20 73 79 6d 29 20 73 70 61 77 6e  ym == sym) spawn
1020: 28 62 69 6e 64 5b 69 5d 2e 61 72 67 73 29 3b 0a  (bind[i].args);.
1030: 09 7d 0a 09 65 6c 73 65 20 69 66 20 28 65 2d 3e  .}..else if (e->
1040: 73 74 61 74 65 20 3d 3d 20 4d 6f 64 34 4d 61 73  state == Mod4Mas
1050: 6b 29 20 7b 0a 09 09 58 45 76 65 6e 74 20 78 65  k) {...XEvent xe
1060: 76 3b 0a 09 09 78 65 76 2e 74 79 70 65 20 3d 20  v;...xev.type = 
1070: 4b 65 79 50 72 65 73 73 3b 0a 09 09 78 65 76 2e  KeyPress;...xev.
1080: 78 6b 65 79 2e 77 69 6e 64 6f 77 20 3d 20 65 2d  xkey.window = e-
1090: 3e 73 75 62 77 69 6e 64 6f 77 3b 0a 09 09 78 65  >subwindow;...xe
10a0: 76 2e 78 6b 65 79 2e 74 69 6d 65 20 3d 20 43 75  v.xkey.time = Cu
10b0: 72 72 65 6e 74 54 69 6d 65 3b 0a 09 09 78 65 76  rrentTime;...xev
10c0: 2e 78 6b 65 79 2e 73 74 61 74 65 20 3d 20 43 6f  .xkey.state = Co
10d0: 6e 74 72 6f 6c 4d 61 73 6b 3b 0a 09 09 78 65 76  ntrolMask;...xev
10e0: 2e 78 6b 65 79 2e 6b 65 79 63 6f 64 65 20 3d 20  .xkey.keycode = 
10f0: 58 4b 65 79 73 79 6d 54 6f 4b 65 79 63 6f 64 65  XKeysymToKeycode
1100: 28 64 70 79 2c 20 58 4b 5f 73 70 61 63 65 29 3b  (dpy, XK_space);
1110: 0a 09 09 58 53 65 6e 64 45 76 65 6e 74 28 64 70  ...XSendEvent(dp
1120: 79 2c 20 65 2d 3e 73 75 62 77 69 6e 64 6f 77 2c  y, e->subwindow,
1130: 20 54 72 75 65 2c 20 4b 65 79 50 72 65 73 73 4d   True, KeyPressM
1140: 61 73 6b 2c 20 26 78 65 76 29 3b 0a 09 09 78 65  ask, &xev);...xe
1150: 76 2e 78 6b 65 79 2e 73 74 61 74 65 20 3d 20 30  v.xkey.state = 0
1160: 3b 0a 09 09 78 65 76 2e 78 6b 65 79 2e 6b 65 79  ;...xev.xkey.key
1170: 63 6f 64 65 20 3d 20 65 2d 3e 6b 65 79 63 6f 64  code = e->keycod
1180: 65 3b 0a 09 09 58 53 65 6e 64 45 76 65 6e 74 28  e;...XSendEvent(
1190: 64 70 79 2c 20 65 2d 3e 73 75 62 77 69 6e 64 6f  dpy, e->subwindo
11a0: 77 2c 20 54 72 75 65 2c 20 4b 65 79 50 72 65 73  w, True, KeyPres
11b0: 73 4d 61 73 6b 2c 20 26 78 65 76 29 3b 0a 09 09  sMask, &xev);...
11c0: 58 46 6c 75 73 68 28 64 70 79 29 3b 0a 09 7d 0a  XFlush(dpy);..}.
11d0: 7d 0a 0a 76 6f 69 64 20 6d 61 70 72 65 71 75 65  }..void mapreque
11e0: 73 74 28 58 45 76 65 6e 74 20 2a 65 76 29 20 7b  st(XEvent *ev) {
11f0: 0a 09 58 4d 61 70 52 65 71 75 65 73 74 45 76 65  ..XMapRequestEve
1200: 6e 74 20 2a 65 20 3d 20 26 65 76 2d 3e 78 6d 61  nt *e = &ev->xma
1210: 70 72 65 71 75 65 73 74 3b 0a 09 58 57 69 6e 64  prequest;..XWind
1220: 6f 77 41 74 74 72 69 62 75 74 65 73 20 77 61 3b  owAttributes wa;
1230: 0a 09 69 66 20 28 21 58 47 65 74 57 69 6e 64 6f  ..if (!XGetWindo
1240: 77 41 74 74 72 69 62 75 74 65 73 28 64 70 79 2c  wAttributes(dpy,
1250: 20 65 2d 3e 77 69 6e 64 6f 77 2c 20 26 77 61 29   e->window, &wa)
1260: 20 7c 7c 20 77 61 2e 6f 76 65 72 72 69 64 65 5f   || wa.override_
1270: 72 65 64 69 72 65 63 74 29 20 72 65 74 75 72 6e  redirect) return
1280: 3b 0a 09 58 57 4d 48 69 6e 74 73 20 2a 77 6d 48  ;..XWMHints *wmH
1290: 69 6e 74 20 3d 20 58 47 65 74 57 4d 48 69 6e 74  int = XGetWMHint
12a0: 73 28 64 70 79 2c 65 2d 3e 77 69 6e 64 6f 77 29  s(dpy,e->window)
12b0: 3b 0a 09 69 66 20 28 21 28 77 6d 48 69 6e 74 20  ;..if (!(wmHint 
12c0: 26 26 20 77 6d 48 69 6e 74 2d 3e 66 6c 61 67 73  && wmHint->flags
12d0: 20 26 20 49 6e 70 75 74 48 69 6e 74 20 26 26 20   & InputHint && 
12e0: 21 77 6d 48 69 6e 74 2d 3e 69 6e 70 75 74 29 29  !wmHint->input))
12f0: 20 58 53 65 6c 65 63 74 49 6e 70 75 74 28 64 70   XSelectInput(dp
1300: 79 2c 20 65 2d 3e 77 69 6e 64 6f 77 2c 20 45 6e  y, e->window, En
1310: 74 65 72 57 69 6e 64 6f 77 4d 61 73 6b 29 3b 0a  terWindowMask);.
1320: 09 69 66 20 28 77 6d 48 69 6e 74 29 20 58 46 72  .if (wmHint) XFr
1330: 65 65 28 77 6d 48 69 6e 74 29 3b 0a 09 57 69 6e  ee(wmHint);..Win
1340: 64 6f 77 20 70 61 72 65 6e 74 3b 0a 09 69 66 20  dow parent;..if 
1350: 28 58 47 65 74 54 72 61 6e 73 69 65 6e 74 46 6f  (XGetTransientFo
1360: 72 48 69 6e 74 28 64 70 79 2c 20 65 2d 3e 77 69  rHint(dpy, e->wi
1370: 6e 64 6f 77 2c 20 26 70 61 72 65 6e 74 29 29 20  ndow, &parent)) 
1380: 58 4d 6f 76 65 52 65 73 69 7a 65 57 69 6e 64 6f  XMoveResizeWindo
1390: 77 28 64 70 79 2c 20 65 2d 3e 77 69 6e 64 6f 77  w(dpy, e->window
13a0: 2c 20 77 61 2e 78 2c 20 77 61 2e 79 2c 20 77 61  , wa.x, wa.y, wa
13b0: 2e 77 69 64 74 68 2c 20 77 61 2e 68 65 69 67 68  .width, wa.heigh
13c0: 74 29 3b 0a 09 65 6c 73 65 20 58 4d 6f 76 65 52  t);..else XMoveR
13d0: 65 73 69 7a 65 57 69 6e 64 6f 77 28 64 70 79 2c  esizeWindow(dpy,
13e0: 20 65 2d 3e 77 69 6e 64 6f 77 2c 20 30 2c 20 30   e->window, 0, 0
13f0: 2c 20 73 77 2c 20 73 68 29 3b 0a 09 58 53 65 74  , sw, sh);..XSet
1400: 57 69 6e 64 6f 77 42 6f 72 64 65 72 28 64 70 79  WindowBorder(dpy
1410: 2c 20 65 2d 3e 77 69 6e 64 6f 77 2c 20 30 78 30  , e->window, 0x0
1420: 30 30 30 30 30 29 3b 0a 09 58 4d 61 70 57 69 6e  00000);..XMapWin
1430: 64 6f 77 28 64 70 79 2c 20 65 2d 3e 77 69 6e 64  dow(dpy, e->wind
1440: 6f 77 29 3b 0a 7d 0a 0a                          ow);.}..