about summary refs log tree commit diff stats
path: root/event.c
Commit message (Collapse)AuthorAgeFilesLines
* patched resizemouse according to sanders remarkarg@mmvi2006-09-221-2/+2
|
* sander check thisarg@mmvi2006-09-221-19/+37
|
* implemented the maximization as I described on the mailinglist, this feels ↵arg@mmvi2006-09-221-2/+2
| | | | better to me.
* added visibility check to enternotify as well 1.6arg@mmvi2006-09-151-1/+1
|
* removed a bunch of lines through making function signatures more consistent ↵Anselm R. Garbe2006-09-121-37/+22
| | | | with my style ( { does not belong to a new line, if function args are single-lined)
* small change to comments, renamed two set* functions in client.c into update*Anselm R. Garbe2006-09-111-2/+2
|
* applied Sanders max_and_focus.patchAnselm R. Garbe2006-09-041-4/+4
|
* simplified buttonpressAnselm R. Garbe2006-09-011-23/+12
|
* applied sanders patchAnselm R. Garbe2006-09-011-5/+8
|
* implemented Button2 press on tags for toggletag on the focused clientAnselm R. Garbe2006-08-311-2/+9
|
* simplified configurerequestAnselm R. Garbe2006-08-291-25/+22
|
* now dwm enforces max screen size also in tiled mode on non-floating clients ↵Anselm R. Garbe2006-08-291-13/+14
| | | | which are maximized
* fixedAnselm R. Garbe2006-08-291-1/+3
|
* configurenotify remembers max geom now, and restores this if necessary, ↵Anselm R. Garbe2006-08-291-1/+11
| | | | however it accepts to touch the max size on configurerequest, this shouldn't break fillscreen apps (tested with mplayer)
* applied sanders focus_ patchesAnselm R. Garbe2006-08-281-1/+1
|
* applied sanders somepatches.patchAnselm R. Garbe2006-08-281-2/+4
|
* trying a different configurationAnselm R. Garbe2006-08-251-13/+11
|
* changed symbols for float/tiled mode, added mouse-driven mode toggle to ↵Anselm R. Garbe2006-08-251-10/+12
| | | | buttonpress()
* new color stuff/new rendering stuffAnselm R. Garbe2006-08-251-1/+3
|
* applied Sanders focus_* patches, removed the unnecessary clean-prefix from ↵Anselm R.Garbe2006-08-211-0/+2
| | | | the new function names
* changed main event loopAnselm R.Garbe2006-08-151-0/+13
|
* removed NUMLOCKMASK, added dynamically calculated numlockmask insteadAnselm R.Garbe2006-08-141-3/+3
|
* applied sanders man page patch, removed button2 from bar clickAnselm R.Garbe2006-08-141-3/+3
|
* fixedAnselm R.Garbe2006-08-141-1/+1
|
* remove unnecessary XSyncAnselm R.Garbe2006-08-141-1/+0
|
* added mappingnotify event for kb refreshesAnselm R.Garbe2006-08-141-0/+12
|
* removed unneecessary crapAnselm R.Garbe2006-08-141-6/+1
|
* pplied Sanders appendtag patchAnselm R.Garbe2006-08-141-0/+6
|
* some other small fixesAnselm R.Garbe2006-08-141-2/+4
|
* removed ungrabkeys again (because of sander's mail)Anselm R.Garbe2006-08-141-16/+0
|
* implemented ungrabkeys() which is called in cleanup()Anselm R.Garbe2006-08-141-0/+16
|
* implemented restack behavior (floats are on top in tiled mode)Anselm R.Garbe2006-08-141-3/+6
|
* applied Sanders LD and resize patchesAnselm R.Garbe2006-08-141-2/+5
|
* removed viewnext/viewprevAnselm R.Garbe2006-08-141-23/+9
|
* made shortcuts like proposed by Sander, renamed viewextend to toggleview ↵Anselm R.Garbe2006-08-131-1/+1
| | | | (more clear)
* implemented viewextend and added M-S-C-n shortcuts for extending the current ↵Anselm R.Garbe2006-08-111-5/+2
| | | | view... updated man page (works great!) nice feature
* implement multi-tag selection through button3 click on the specific tagAnselm R.Garbe2006-08-111-1/+7
|
* realized that client focussing through the bar is pretty useless, better is ↵Anselm R.Garbe2006-08-111-5/+5
| | | | sloppy view focussing for B1/B3 as well instead
* implemented focusprev on button1 press in the bar, and focusnext on button3 ↵Anselm R.Garbe2006-08-111-2/+6
| | | | press in the bar
* applied Sanders zoom_update patchAnselm R.Garbe2006-08-101-2/+1
|
* applied sumik's multihead patchAnselm R.Garbe2006-08-101-5/+10
|
* applied sander's patchAnselm R.Garbe2006-08-101-11/+8
|
* disallow zoom on maximized clientsAnselm R.Garbe2006-08-101-9/+8
|
* added zoom on Mod1-Button1 on managed clients only (there is no moving possible)Anselm R.Garbe2006-08-091-0/+2
|
* removed NET_ACTIVE_WINDOW handlingAnselm R.Garbe2006-08-081-13/+0
|
* implemented NET_ACTIVE_WINDOW supportAnselm R.Garbe2006-08-081-0/+13
|
* applied grabbing-- and shell_minimalarg@10ksloc.org2006-08-071-8/+0
|
* small performance tweak ;)arg@10ksloc.org2006-08-041-2/+4
|
* fixed xterm font change (all other related apps should work fine with this ↵arg@10ksloc.org2006-08-041-14/+12
| | | | fix as well)
* removed TLast tag enum, now tags is simple defined as char *[] array, the ↵arg@10ksloc.org2006-08-031-1/+1
| | | | rest is calculated correctly, rules take an int array for the tags
dbong/suckless/dwm/blame/dwm.h?id=1d63030665674496930612ef9a272afb6b75c174'>^
6fc8a63 ^
b003a35 ^
0b80d18 ^

281f098 ^
5983c00 ^
bf35794 ^
d800ec0 ^
7d7cde0 ^
bf35794 ^
d2d394e ^
bf35794 ^
bf35794 ^
39677ec ^
439e15d ^
b4d53bf ^
281f098 ^

281f098 ^


9056d7e ^
d2d394e ^
281f098 ^
3399650 ^
d7e1708 ^
6b25d06 ^
281f098 ^

868159f ^
d7e1708 ^
dba2306 ^
6b25d06 ^

b9da4b0 ^
9e8b325 ^
281f098 ^



9e8b325 ^
dba2306 ^
6b25d06 ^
281f098 ^

d2d394e ^
868159f ^

29355bd ^
8b59083 ^
281f098 ^
868159f ^
868159f ^
aa13727 ^

281f098 ^
5983c00 ^

281f098 ^

0b80d18 ^
281f098 ^
4b5b3d9 ^
6b25d06 ^
8dc8605 ^
868159f ^


fee8df6 ^
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
                                                                    
                                        


                                                                             


                                                                              
  
                                                                            
                                                                        



                                                                              
  




                                                                              

                                                                             
  


                                                                             

                                                                        
  
                                                              

   
                   
                     
 
                                                   
                                                                     
                                          
                                 
 


                                                                           
                                                                   




                                            
               
                        
              
                          
 
                


                    

                           
      
 
                
                       

                                    


                          
                        
 
                             
               
                       
                  
                       
                                                 

                                                             
                            
                                     
                   
                     
                     
                      
                   

  
                                                              
                                                                 
                                                                                      
                                                                     
                                                                         

                                                                                              
                                                                   
                                                                                       
                                             
                                                                             
                                                                                  
                              
                                                                         
                    
                           
 
              
                                                                                    

                                                                            


                                                                               
                                                                                         
                                                                          
                                                               
 
            
                                                                  

                                                                                    
                                                                                   
 
             

                                                                                       
 
            



                                                                                                       
 
           
                                                                                                     

                                                                                     
                                                                    

                                                                                     
 
            
                                                                                                       
                                                                                    
                                                                                              

            
                                                                                        

                                                                                   

                                                                                                     
                                                                                               
                                                                                       
                                                                                                       
                                                                                      
                                                                                                                 


                                                                                                      
                                                                                                             
/* (C)opyright MMVI-MMVII Anselm R. Garbe <garbeam at gmail dot com>
 * See LICENSE file for license details.
 *
 * dynamic window manager is designed like any other X client as well. It is
 * driven through handling X events. In contrast to other X clients, a window
 * manager selects for SubstructureRedirectMask on the root window, to receive
 * events about window (dis-)appearance.  Only one X connection at a time is
 * allowed to select for this event mask.
 *
 * Calls to fetch an X event from the event queue are blocking.  Due reading
 * status text from standard input, a select()-driven main loop has been
 * implemented which selects for reads on the X connection and STDIN_FILENO to
 * handle all data smoothly. The event handlers of dwm are organized in an
 * array which is accessed whenever a new event has been fetched. This allows
 * event dispatching in O(1) time.
 *
 * Each child of the root window is called a client, except windows which have
 * set the override_redirect flag.  Clients are organized in a global
 * doubly-linked client list, the focus history is remembered through a global
 * stack list. Each client contains an array of Bools of the same size as the
 * global tags array to indicate the tags of a client.  For each client dwm
 * creates a small title window, which is resized whenever the (_NET_)WM_NAME
 * properties are updated or the client is moved/resized.
 *
 * Keys and tagging rules are organized as arrays and defined in the config.h
 * file. These arrays are kept static in event.o and tag.o respectively,
 * because no other part of dwm needs access to them.  The current mode is
 * represented by the arrange() function pointer, which wether points to
 * dofloat() or dotile(). 
 *
 * To understand everything else, start reading main.c:main().
 */

#include "config.h"
#include <X11/Xlib.h>

/* mask shorthands, used in event.c and client.c */
#define BUTTONMASK		(ButtonPressMask | ButtonReleaseMask)
/* other stuff used in different places */
#define PROTODELWIN		1

enum { NetSupported, NetWMName, NetLast };		/* EWMH atoms */
enum { WMProtocols, WMDelete, WMLast };			/* default atoms */
enum { CurNormal, CurResize, CurMove, CurLast };	/* cursor */
enum { ColBorder, ColFG, ColBG, ColLast };		/* color */

typedef enum {
	TopLeft, TopRight, BotLeft, BotRight
} Corner; /* window corners */

typedef union {
	const char *cmd;
	int i;
} Arg; /* argument type */

typedef struct {
	int ascent;
	int descent;
	int height;
	XFontSet set;
	XFontStruct *xfont;
} Fnt;

typedef struct {
	int x, y, w, h;
	unsigned long norm[ColLast];
	unsigned long sel[ColLast];
	Drawable drawable;
	Fnt font;
	GC gc;
} DC; /* draw context */

typedef struct Client Client;
struct Client {
	char name[256];
	int proto;
	int x, y, w, h;
	int rx, ry, rw, rh; /* revert geometry */
	int basew, baseh, incw, inch, maxw, maxh, minw, minh;
	long flags; 
	unsigned int border;
	Bool isfloat, isfixed, ismax;
	Bool *tags;
	Client *next;
	Client *prev;
	Client *snext;
	Window win;
};

extern const char *tags[];			/* all tags */
extern char stext[256];				/* status text */
extern int bh, bmw;				/* bar height, bar mode label width */
extern int screen, sx, sy, sw, sh;		/* screen geometry */
extern int wax, way, wah, waw;			/* windowarea geometry */
extern unsigned int master, nmaster;		/* master percent, number of master clients */
extern unsigned int ntags, numlockmask;		/* number of tags, dynamic lock mask */
extern void (*handler[LASTEvent])(XEvent *);	/* event handler */
extern void (*arrange)(void);			/* arrange function, indicates mode  */
extern Atom wmatom[WMLast], netatom[NetLast];
extern Bool running, issel, *seltag;		/* seltag is array of Bool */
extern Client *clients, *sel, *stack;		/* global client list and stack */
extern Cursor cursor[CurLast];
extern DC dc;					/* global draw context */
extern Display *dpy;
extern Window root, barwin;

/* client.c */
extern void configure(Client *c);		/* send synthetic configure event */
extern void focus(Client *c);			/* focus c, c may be NULL */
extern Client *getclient(Window w);		/* return client of w */
extern void killclient(Arg *arg);		/* kill c nicely */
extern void manage(Window w, XWindowAttributes *wa);	/* manage new client */
extern void resize(Client *c, Bool sizehints, Corner sticky); /* resize c*/
extern void updatesizehints(Client *c);		/* update the size hint variables of c */
extern void updatetitle(Client *c);		/* update the name of c */
extern void unmanage(Client *c);		/* destroy c */

/* draw.c */
extern void drawstatus(void);			/* draw the bar */
extern unsigned long getcolor(const char *colstr);	/* return color of colstr */
extern void setfont(const char *fontstr);	/* set the font for DC */
extern unsigned int textw(const char *text);	/* return the width of text in px*/

/* event.c */
extern void grabkeys(void);			/* grab all keys defined in config.h */
extern void procevent(void);			/* process pending X events */

/* main.c */
extern int getproto(Window w);			/* return protocol mask of WMProtocols property of w */
extern void quit(Arg *arg);			/* quit dwm nicely */
extern void sendevent(Window w, Atom a, long value);	/* send synthetic event to w */
extern int xerror(Display *dsply, XErrorEvent *ee);	/* dwm's X error handler */

/* tag.c */
extern void initrregs(void);			/* initialize regexps of rules defined in config.h */
extern Client *getnext(Client *c);		/* returns next visible client */
extern Client *getprev(Client *c);		/* returns previous visible client */
extern void settags(Client *c, Client *trans);	/* sets tags of c */
extern void tag(Arg *arg);			/* tags c with arg's index */
extern void toggletag(Arg *arg);		/* toggles c tags with arg's index */

/* util.c */
extern void *emallocz(unsigned int size);	/* allocates zero-initialized memory, exits on error */
extern void eprint(const char *errstr, ...);	/* prints errstr and exits with 1 */
extern void spawn(Arg *arg);			/* forks a new subprocess with to arg's cmd */

/* view.c */
extern void detach(Client *c);			/* detaches c from global client list */
extern void dofloat(void);			/* arranges all windows floating */
extern void dotile(void);			/* arranges all windows tiled */
extern void focusnext(Arg *arg);		/* focuses next visible client, arg is ignored  */
extern void focusprev(Arg *arg);		/* focuses previous visible client, arg is ignored */
extern void incnmaster(Arg *arg);		/* increments nmaster with arg's index value */
extern Bool isvisible(Client *c);		/* returns True if client is visible */
extern void resizemaster(Arg *arg);		/* resizes the master percent with arg's index value */
extern void restack(void);			/* restores z layers of all clients */
extern void togglefloat(Arg *arg);		/* toggles focusesd client between floating/non-floating state */
extern void togglemode(Arg *arg);		/* toggles global arrange function (dotile/dofloat) */
extern void toggleview(Arg *arg);		/* toggles the tag with arg's index (in)visible */
extern void view(Arg *arg);			/* views the tag with arg's index */
extern void zoom(Arg *arg);			/* zooms the focused client to master area, arg is ignored */