event.c
changeset 123 61490330e90a
parent 121 eb3165734f00
child 124 75576e44c1d8
equal deleted inserted replaced
122:f20cea484900 123:61490330e90a
    18 	KeySym keysym;
    18 	KeySym keysym;
    19 	void (*func)(Arg *arg);
    19 	void (*func)(Arg *arg);
    20 	Arg arg;
    20 	Arg arg;
    21 } Key;
    21 } Key;
    22 
    22 
    23 /*
       
    24 const char *browse[] = { "firefox", NULL };
    23 const char *browse[] = { "firefox", NULL };
    25 const char *gimp[] = { "gimp", NULL };
    24 const char *gimp[] = { "gimp", NULL };
    26 */
    25 const char *term[] = { 
    27 const char *term[] = { "xterm", NULL };
       
    28 /*
       
    29 	"urxvtc", "-tr", "+sb", "-bg", "black", "-fg", "white", "-cr", "white",
    26 	"urxvtc", "-tr", "+sb", "-bg", "black", "-fg", "white", "-cr", "white",
    30 	"-fn", "-*-terminus-medium-*-*-*-13-*-*-*-*-*-iso10646-*", NULL
    27 	"-fn", "-*-terminus-medium-*-*-*-13-*-*-*-*-*-iso10646-*", NULL
    31 };
    28 };
    32 coonst char *xlock[] = { "xlock", NULL };
    29 const char *xlock[] = { "xlock", NULL };
    33 */
       
    34 
    30 
    35 static Key key[] = {
    31 static Key key[] = {
    36 	/* modifier				key			function	arguments */
    32 	/* modifier		key		function	arguments */
    37 	{ ControlMask,			XK_0,		appendtag,	{ .i = Tscratch } }, 
    33 	{ ControlMask,		XK_0,		appendtag,	{ .i = Tscratch } }, 
    38 	{ ControlMask,			XK_1,		appendtag,	{ .i = Tdev } }, 
    34 	{ ControlMask,		XK_1,		appendtag,	{ .i = Tdev } }, 
    39 	{ ControlMask,			XK_2,		appendtag,	{ .i = Twww } }, 
    35 	{ ControlMask,		XK_2,		appendtag,	{ .i = Twww } }, 
    40 	{ ControlMask,			XK_3,		appendtag,	{ .i = Twork } }, 
    36 	{ ControlMask,		XK_3,		appendtag,	{ .i = Twork } }, 
    41 	{ MODKEY,				XK_0,		view,		{ .i = Tscratch } }, 
    37 	{ MODKEY,		XK_0,		view,		{ .i = Tscratch } }, 
    42 	{ MODKEY,				XK_1,		view,		{ .i = Tdev } }, 
    38 	{ MODKEY,		XK_1,		view,		{ .i = Tdev } }, 
    43 	{ MODKEY,				XK_2,		view,		{ .i = Twww } }, 
    39 	{ MODKEY,		XK_2,		view,		{ .i = Twww } }, 
    44 	{ MODKEY,				XK_3,		view,		{ .i = Twork } }, 
    40 	{ MODKEY,		XK_3,		view,		{ .i = Twork } }, 
    45 	{ MODKEY,				XK_j,		focusnext,		{ 0 } }, 
    41 	{ MODKEY,		XK_j,		focusnext,	{ 0 } }, 
    46 	{ MODKEY,				XK_k,		focusprev,		{ 0 } },
    42 	{ MODKEY,		XK_k,		focusprev,	{ 0 } },
    47 	{ MODKEY,				XK_m,		maximize,		{ 0 } }, 
    43 	{ MODKEY,		XK_m,		maximize,	{ 0 } }, 
    48 	{ MODKEY,				XK_space,	dotile,		{ 0 } }, 
    44 	{ MODKEY,		XK_space,	dotile,		{ 0 } }, 
    49 	{ MODKEY,				XK_Return,	zoom,		{ 0 } },
    45 	{ MODKEY,		XK_Return,	zoom,		{ 0 } },
    50 	{ ControlMask|ShiftMask,XK_0,		heretag,	{ .i = Tscratch } }, 
    46 	{ ControlMask|ShiftMask,XK_0,		heretag,	{ .i = Tscratch } }, 
    51 	{ ControlMask|ShiftMask,XK_1,		heretag,	{ .i = Tdev } }, 
    47 	{ ControlMask|ShiftMask,XK_1,		heretag,	{ .i = Tdev } }, 
    52 	{ ControlMask|ShiftMask,XK_2,		heretag,	{ .i = Twww } }, 
    48 	{ ControlMask|ShiftMask,XK_2,		heretag,	{ .i = Twww } }, 
    53 	{ ControlMask|ShiftMask,XK_3,		heretag,	{ .i = Twork } }, 
    49 	{ ControlMask|ShiftMask,XK_3,		heretag,	{ .i = Twork } }, 
    54 	{ MODKEY|ShiftMask,		XK_0,		replacetag,		{ .i = Tscratch } }, 
    50 	{ MODKEY|ShiftMask,	XK_0,		replacetag,	{ .i = Tscratch } }, 
    55 	{ MODKEY|ShiftMask,		XK_1,		replacetag,		{ .i = Tdev } }, 
    51 	{ MODKEY|ShiftMask,	XK_1,		replacetag,	{ .i = Tdev } }, 
    56 	{ MODKEY|ShiftMask,		XK_2,		replacetag,		{ .i = Twww } }, 
    52 	{ MODKEY|ShiftMask,	XK_2,		replacetag,	{ .i = Twww } }, 
    57 	{ MODKEY|ShiftMask,		XK_3,		replacetag,		{ .i = Twork } }, 
    53 	{ MODKEY|ShiftMask,	XK_3,		replacetag,	{ .i = Twork } }, 
    58 	{ MODKEY|ShiftMask,		XK_c,		killclient,		{ 0 } }, 
    54 	{ MODKEY|ShiftMask,	XK_c,		killclient,	{ 0 } }, 
    59 	/*
    55 	{ MODKEY|ShiftMask,	XK_g,		spawn,		{ .argv = gimp } },
    60 	{ MODKEY|ShiftMask,		XK_g,		spawn,		{ .argv = gimp } },
    56 	{ MODKEY|ShiftMask,	XK_l,		spawn,		{ .argv = xlock } },
    61 	{ MODKEY|ShiftMask,		XK_l,		spawn,		{ .argv = xlock } },
    57 	{ MODKEY|ShiftMask,	XK_q,		quit,		{ 0 } },
    62 	*/
    58 	{ MODKEY|ShiftMask,	XK_space,	dofloat,	{ 0 } }, 
    63 	{ MODKEY|ShiftMask,		XK_q,		quit,		{ 0 } },
    59 	{ MODKEY|ShiftMask,	XK_w,		spawn,		{ .argv = browse } },
    64 	{ MODKEY|ShiftMask,		XK_space,	dofloat,	{ 0 } }, 
    60 	{ MODKEY|ShiftMask,	XK_Return,	spawn,		{ .argv = term } },
    65 	/*{ MODKEY|ShiftMask,		XK_w,		spawn,		{ .argv = browse } },*/
       
    66 	{ MODKEY|ShiftMask,		XK_Return,	spawn,		{ .argv = term } },
       
    67 };
    61 };
    68 
    62 
    69 /* static */
    63 /* static */
    70 
    64 
    71 static void
    65 static void
    72 movemouse(Client *c)
    66 movemouse(Client *c)
    73 {
    67 {
    74 	XEvent ev;
       
    75 	int x1, y1, ocx, ocy, di;
    68 	int x1, y1, ocx, ocy, di;
    76 	unsigned int dui;
    69 	unsigned int dui;
    77 	Window dummy;
    70 	Window dummy;
       
    71 	XEvent ev;
    78 
    72 
    79 	ocx = c->x;
    73 	ocx = c->x;
    80 	ocy = c->y;
    74 	ocy = c->y;
    81 	if(XGrabPointer(dpy, root, False, MouseMask, GrabModeAsync, GrabModeAsync,
    75 	if(XGrabPointer(dpy, root, False, MouseMask, GrabModeAsync, GrabModeAsync,
    82 				None, cursor[CurMove], CurrentTime) != GrabSuccess)
    76 			None, cursor[CurMove], CurrentTime) != GrabSuccess)
    83 		return;
    77 		return;
    84 	XQueryPointer(dpy, root, &dummy, &dummy, &x1, &y1, &di, &di, &dui);
    78 	XQueryPointer(dpy, root, &dummy, &dummy, &x1, &y1, &di, &di, &dui);
    85 	for(;;) {
    79 	for(;;) {
    86 		XMaskEvent(dpy, MouseMask | ExposureMask, &ev);
    80 		XMaskEvent(dpy, MouseMask | ExposureMask, &ev);
    87 		switch (ev.type) {
    81 		switch (ev.type) {
   103 }
    97 }
   104 
    98 
   105 static void
    99 static void
   106 resizemouse(Client *c)
   100 resizemouse(Client *c)
   107 {
   101 {
   108 	XEvent ev;
       
   109 	int ocx, ocy;
   102 	int ocx, ocy;
   110 	Corner sticky;
   103 	Corner sticky;
       
   104 	XEvent ev;
   111 
   105 
   112 	ocx = c->x;
   106 	ocx = c->x;
   113 	ocy = c->y;
   107 	ocy = c->y;
   114 	if(XGrabPointer(dpy, root, False, MouseMask, GrabModeAsync, GrabModeAsync,
   108 	if(XGrabPointer(dpy, root, False, MouseMask, GrabModeAsync, GrabModeAsync,
   115 				None, cursor[CurResize], CurrentTime) != GrabSuccess)
   109 				None, cursor[CurResize], CurrentTime) != GrabSuccess)
   144 static void
   138 static void
   145 buttonpress(XEvent *e)
   139 buttonpress(XEvent *e)
   146 {
   140 {
   147 	int x;
   141 	int x;
   148 	Arg a;
   142 	Arg a;
       
   143 	Client *c;
   149 	XButtonPressedEvent *ev = &e->xbutton;
   144 	XButtonPressedEvent *ev = &e->xbutton;
   150 	Client *c;
       
   151 
   145 
   152 	if(barwin == ev->window) {
   146 	if(barwin == ev->window) {
   153 		switch(ev->button) {
   147 		switch(ev->button) {
   154 		default:
   148 		default:
   155 			x = 0;
   149 			x = 0;
   199 }
   193 }
   200 
   194 
   201 static void
   195 static void
   202 configurerequest(XEvent *e)
   196 configurerequest(XEvent *e)
   203 {
   197 {
       
   198 	Client *c;
   204 	XConfigureRequestEvent *ev = &e->xconfigurerequest;
   199 	XConfigureRequestEvent *ev = &e->xconfigurerequest;
   205 	XWindowChanges wc;
   200 	XWindowChanges wc;
   206 	Client *c;
       
   207 
   201 
   208 	ev->value_mask &= ~CWSibling;
   202 	ev->value_mask &= ~CWSibling;
   209 	if((c = getclient(ev->window))) {
   203 	if((c = getclient(ev->window))) {
   210 		gravitate(c, True);
   204 		gravitate(c, True);
   211 		if(ev->value_mask & CWX)
   205 		if(ev->value_mask & CWX)
   246 }
   240 }
   247 
   241 
   248 static void
   242 static void
   249 enternotify(XEvent *e)
   243 enternotify(XEvent *e)
   250 {
   244 {
       
   245 	Client *c;
   251 	XCrossingEvent *ev = &e->xcrossing;
   246 	XCrossingEvent *ev = &e->xcrossing;
   252 	Client *c;
       
   253 
   247 
   254 	if(ev->mode != NotifyNormal || ev->detail == NotifyInferior)
   248 	if(ev->mode != NotifyNormal || ev->detail == NotifyInferior)
   255 		return;
   249 		return;
   256 
   250 
   257 	if((c = getclient(ev->window)))
   251 	if((c = getclient(ev->window)))
   261 }
   255 }
   262 
   256 
   263 static void
   257 static void
   264 expose(XEvent *e)
   258 expose(XEvent *e)
   265 {
   259 {
       
   260 	Client *c;
   266 	XExposeEvent *ev = &e->xexpose;
   261 	XExposeEvent *ev = &e->xexpose;
   267 	Client *c;
       
   268 
   262 
   269 	if(ev->count == 0) {
   263 	if(ev->count == 0) {
   270 		if(barwin == ev->window)
   264 		if(barwin == ev->window)
   271 			drawstatus();
   265 			drawstatus();
   272 		else if((c = getctitle(ev->window)))
   266 		else if((c = getctitle(ev->window)))
   275 }
   269 }
   276 
   270 
   277 static void
   271 static void
   278 keypress(XEvent *e)
   272 keypress(XEvent *e)
   279 {
   273 {
   280 	XKeyEvent *ev = &e->xkey;
       
   281 	static unsigned int len = key ? sizeof(key) / sizeof(key[0]) : 0;
   274 	static unsigned int len = key ? sizeof(key) / sizeof(key[0]) : 0;
   282 	unsigned int i;
   275 	unsigned int i;
   283 	KeySym keysym;
   276 	KeySym keysym;
       
   277 	XKeyEvent *ev = &e->xkey;
   284 
   278 
   285 	keysym = XKeycodeToKeysym(dpy, (KeyCode)ev->keycode, 0);
   279 	keysym = XKeycodeToKeysym(dpy, (KeyCode)ev->keycode, 0);
   286 	for(i = 0; i < len; i++)
   280 	for(i = 0; i < len; i++)
   287 		if((keysym == key[i].keysym) && (key[i].mod == ev->state)) {
   281 		if((keysym == key[i].keysym) && (key[i].mod == ev->state)) {
   288 			if(key[i].func)
   282 			if(key[i].func)
   301 }
   295 }
   302 
   296 
   303 static void
   297 static void
   304 maprequest(XEvent *e)
   298 maprequest(XEvent *e)
   305 {
   299 {
       
   300 	static XWindowAttributes wa;
   306 	XMapRequestEvent *ev = &e->xmaprequest;
   301 	XMapRequestEvent *ev = &e->xmaprequest;
   307 	static XWindowAttributes wa;
       
   308 
   302 
   309 	if(!XGetWindowAttributes(dpy, ev->window, &wa))
   303 	if(!XGetWindowAttributes(dpy, ev->window, &wa))
   310 		return;
   304 		return;
   311 
   305 
   312 	if(wa.override_redirect) {
   306 	if(wa.override_redirect) {
   320 }
   314 }
   321 
   315 
   322 static void
   316 static void
   323 propertynotify(XEvent *e)
   317 propertynotify(XEvent *e)
   324 {
   318 {
       
   319 	Client *c;
       
   320 	Window trans;
   325 	XPropertyEvent *ev = &e->xproperty;
   321 	XPropertyEvent *ev = &e->xproperty;
   326 	Window trans;
       
   327 	Client *c;
       
   328 
   322 
   329 	if(ev->state == PropertyDelete)
   323 	if(ev->state == PropertyDelete)
   330 		return; /* ignore */
   324 		return; /* ignore */
   331 
   325 
   332 	if((c = getclient(ev->window))) {
   326 	if((c = getclient(ev->window))) {