changed how manage client works
This commit is contained in:
		
							
								
								
									
										51
									
								
								client.c
									
									
									
									
									
								
							
							
						
						
									
										51
									
								
								client.c
									
									
									
									
									
								
							@@ -3,6 +3,7 @@
 | 
				
			|||||||
 * See LICENSE file for license details.
 | 
					 * See LICENSE file for license details.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <stdlib.h>
 | 
				
			||||||
#include <string.h>
 | 
					#include <string.h>
 | 
				
			||||||
#include <X11/Xatom.h>
 | 
					#include <X11/Xatom.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -36,10 +37,10 @@ update_client_name(Client *c)
 | 
				
			|||||||
	XFree(name.value);
 | 
						XFree(name.value);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Client *
 | 
					void
 | 
				
			||||||
create_client(Window w, XWindowAttributes *wa)
 | 
					manage(Window w, XWindowAttributes *wa)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	Client *c;
 | 
						Client *c, **l;
 | 
				
			||||||
	XSetWindowAttributes twa;
 | 
						XSetWindowAttributes twa;
 | 
				
			||||||
	long msize;
 | 
						long msize;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -68,24 +69,44 @@ create_client(Window w, XWindowAttributes *wa)
 | 
				
			|||||||
			DefaultDepth(dpy, screen), CopyFromParent,
 | 
								DefaultDepth(dpy, screen), CopyFromParent,
 | 
				
			||||||
			DefaultVisual(dpy, screen),
 | 
								DefaultVisual(dpy, screen),
 | 
				
			||||||
			CWOverrideRedirect | CWBackPixmap | CWEventMask, &twa);
 | 
								CWOverrideRedirect | CWBackPixmap | CWEventMask, &twa);
 | 
				
			||||||
	XFlush(dpy);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if 0
 | 
						for(l=&clients; *l; l=&(*l)->next);
 | 
				
			||||||
	for(t=&client, i=0; *t; t=&(*t)->next, i++);
 | 
						c->next = *l; /* *l == nil */
 | 
				
			||||||
	c->next = *t; /* *t == nil */
 | 
						*l = c;
 | 
				
			||||||
	*t = c;
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
	return c;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void
 | 
					 | 
				
			||||||
manage(Client *c)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	XMapRaised(dpy, c->win);
 | 
						XMapRaised(dpy, c->win);
 | 
				
			||||||
	XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime);
 | 
						XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime);
 | 
				
			||||||
	XFlush(dpy);
 | 
						XFlush(dpy);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static int
 | 
				
			||||||
 | 
					dummy_error_handler(Display *dpy, XErrorEvent *error)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void
 | 
				
			||||||
 | 
					unmanage(Client *c)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						Client **l;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						XGrabServer(dpy);
 | 
				
			||||||
 | 
						XSetErrorHandler(dummy_error_handler);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						XUnmapWindow(dpy, c->win);
 | 
				
			||||||
 | 
						XDestroyWindow(dpy, c->title);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for(l=&clients; *l && *l != c; l=&(*l)->next);
 | 
				
			||||||
 | 
						eassert(*l == c);
 | 
				
			||||||
 | 
						*l = c->next;
 | 
				
			||||||
 | 
						free(c);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						XFlush(dpy);
 | 
				
			||||||
 | 
						XSetErrorHandler(error_handler);
 | 
				
			||||||
 | 
						XUngrabServer(dpy);
 | 
				
			||||||
 | 
						/*flush_masked_events(EnterWindowMask); ? */
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Client *
 | 
					Client *
 | 
				
			||||||
getclient(Window w)
 | 
					getclient(Window w)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										14
									
								
								event.c
									
									
									
									
									
								
							
							
						
						
									
										14
									
								
								event.c
									
									
									
									
									
								
							@@ -159,12 +159,8 @@ maprequest(XEvent *e)
 | 
				
			|||||||
		return;
 | 
							return;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/*if(!client_of_win(ev->window))*/
 | 
						if(!getclient(ev->window))
 | 
				
			||||||
		/*manage(create_client(ev->window, &wa));*/
 | 
							manage(ev->window, &wa);
 | 
				
			||||||
	XMapRaised(dpy, ev->window);
 | 
					 | 
				
			||||||
	XMoveResizeWindow(dpy, ev->window, rect.x, rect.y, rect.width, rect.height - barrect.height);
 | 
					 | 
				
			||||||
	XSetInputFocus(dpy, ev->window, RevertToPointerRoot, CurrentTime);
 | 
					 | 
				
			||||||
	XFlush(dpy);
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void
 | 
					static void
 | 
				
			||||||
@@ -185,11 +181,9 @@ propertynotify(XEvent *e)
 | 
				
			|||||||
static void
 | 
					static void
 | 
				
			||||||
unmapnotify(XEvent *e)
 | 
					unmapnotify(XEvent *e)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
#if 0
 | 
					 | 
				
			||||||
	Client *c;
 | 
						Client *c;
 | 
				
			||||||
	XUnmapEvent *ev = &e->xunmap;
 | 
						XUnmapEvent *ev = &e->xunmap;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if((c = client_of_win(ev->window)))
 | 
						if((c = getclient(ev->window)))
 | 
				
			||||||
		destroy_client(c);
 | 
							unmanage(c);
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										9
									
								
								wm.c
									
									
									
									
									
								
							
							
						
						
									
										9
									
								
								wm.c
									
									
									
									
									
								
							@@ -20,19 +20,18 @@ Atom net_atom[NetLast];
 | 
				
			|||||||
Cursor cursor[CurLast];
 | 
					Cursor cursor[CurLast];
 | 
				
			||||||
XRectangle rect, barrect;
 | 
					XRectangle rect, barrect;
 | 
				
			||||||
Bool running = True;
 | 
					Bool running = True;
 | 
				
			||||||
Client *clients = NULL;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
char *bartext, tag[256];
 | 
					char *bartext, tag[256];
 | 
				
			||||||
int screen, sel_screen;
 | 
					int screen, sel_screen;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* draw structs */
 | 
					 | 
				
			||||||
Brush brush = {0};
 | 
					Brush brush = {0};
 | 
				
			||||||
 | 
					Client *clients = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
enum { WM_PROTOCOL_DELWIN = 1 };
 | 
					enum { WM_PROTOCOL_DELWIN = 1 };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static Bool other_wm_running;
 | 
					static Bool other_wm_running;
 | 
				
			||||||
static int (*x_error_handler) (Display *, XErrorEvent *);
 | 
					 | 
				
			||||||
static char version[] = "gridwm - " VERSION ", (C)opyright MMVI Anselm R. Garbe\n";
 | 
					static char version[] = "gridwm - " VERSION ", (C)opyright MMVI Anselm R. Garbe\n";
 | 
				
			||||||
 | 
					static int (*x_error_handler) (Display *, XErrorEvent *);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void
 | 
					static void
 | 
				
			||||||
usage()
 | 
					usage()
 | 
				
			||||||
@@ -56,7 +55,7 @@ scan_wins()
 | 
				
			|||||||
			if(wa.override_redirect || XGetTransientForHint(dpy, wins[i], &d1))
 | 
								if(wa.override_redirect || XGetTransientForHint(dpy, wins[i], &d1))
 | 
				
			||||||
				continue;
 | 
									continue;
 | 
				
			||||||
			if(wa.map_state == IsViewable)
 | 
								if(wa.map_state == IsViewable)
 | 
				
			||||||
				manage(create_client(wins[i], &wa));
 | 
									manage(wins[i], &wa);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if(wins)
 | 
						if(wins)
 | 
				
			||||||
@@ -69,7 +68,7 @@ scan_wins()
 | 
				
			|||||||
 * Other types of errors call Xlib's default error handler, which
 | 
					 * Other types of errors call Xlib's default error handler, which
 | 
				
			||||||
 * calls exit().
 | 
					 * calls exit().
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
static int
 | 
					int
 | 
				
			||||||
error_handler(Display *dpy, XErrorEvent *error)
 | 
					error_handler(Display *dpy, XErrorEvent *error)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	if(error->error_code == BadWindow
 | 
						if(error->error_code == BadWindow
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										5
									
								
								wm.h
									
									
									
									
									
								
							
							
						
						
									
										5
									
								
								wm.h
									
									
									
									
									
								
							@@ -65,8 +65,8 @@ extern void run(char *arg);
 | 
				
			|||||||
extern void quit(char *arg);
 | 
					extern void quit(char *arg);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* client.c */
 | 
					/* client.c */
 | 
				
			||||||
extern Client *create_client(Window w, XWindowAttributes *wa);
 | 
					extern void manage(Window w, XWindowAttributes *wa);
 | 
				
			||||||
extern void manage(Client *c);
 | 
					void unmanage(Client *c);
 | 
				
			||||||
extern Client * getclient(Window w);
 | 
					extern Client * getclient(Window w);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* key.c */
 | 
					/* key.c */
 | 
				
			||||||
@@ -74,3 +74,4 @@ extern void update_keys();
 | 
				
			|||||||
extern void keypress(XEvent *e);
 | 
					extern void keypress(XEvent *e);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* wm.c */
 | 
					/* wm.c */
 | 
				
			||||||
 | 
					extern int error_handler(Display *dpy, XErrorEvent *error);
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user