about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--client.c24
-rw-r--r--dwm.h6
-rw-r--r--event.c8
-rw-r--r--util.c28
4 files changed, 12 insertions, 54 deletions
diff --git a/client.c b/client.c
index 029a59c..2a981fc 100644
--- a/client.c
+++ b/client.c
@@ -28,17 +28,19 @@ next(Client *c)
 void
 zoom(Arg *arg)
 {
-	Client **l, *old;
+	Client **l;
 
-	if(!(old = sel))
+	if(!sel)
 		return;
 
+	if(sel == next(clients)) 
+		sel = next(sel->next);
+
 	for(l = &clients; *l && *l != sel; l = &(*l)->next);
 	*l = sel->next;
 
-	old->next = clients; /* pop */
-	clients = old;
-	sel = old;
+	sel->next = clients; /* pop */
+	clients = sel;
 	arrange(NULL);
 	focus(sel);
 }
@@ -54,7 +56,6 @@ max(Arg *arg)
 	sel->h = sh - 2 * sel->border - bh;
 	craise(sel);
 	resize(sel, False);
-	discard_events(EnterWindowMask);
 }
 
 void
@@ -65,9 +66,6 @@ view(Arg *arg)
 	tsel = arg->i;
 	arrange(NULL);
 
-	if((c = next(clients)))
-		focus(c);
-
 	for(c = clients; c; c = next(c->next))
 		draw_client(c);
 	draw_bar();
@@ -120,7 +118,6 @@ floating(Arg *arg)
 			focus(sel);
 		}
 	}
-	discard_events(EnterWindowMask);
 }
 
 void
@@ -171,13 +168,12 @@ tiling(Arg *arg)
 		else
 			ban_client(c);
 	}
-	if(sel && !sel->tags[tsel]) {
+	if(!sel || (sel && !sel->tags[tsel])) {
 		if((sel = next(clients))) {
 			craise(sel);
 			focus(sel);
 		}
 	}
-	discard_events(EnterWindowMask);
 }
 
 void
@@ -323,14 +319,16 @@ void
 focus(Client *c)
 {
 	Client *old = sel;
+	XEvent ev;
 
+	XFlush(dpy);
 	sel = c;
 	if(old && old != c)
 		draw_client(old);
 	draw_client(c);
 	XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime);
 	XFlush(dpy);
-	discard_events(EnterWindowMask);
+	while(XCheckMaskEvent(dpy, EnterWindowMask, &ev));
 }
 
 static void
diff --git a/dwm.h b/dwm.h
index 29aa6a2..113e861 100644
--- a/dwm.h
+++ b/dwm.h
@@ -137,9 +137,6 @@ extern unsigned int textnw(char *text, unsigned int len);
 extern unsigned int textw(char *text);
 extern unsigned int texth(void);
 
-/* event.c */
-extern void discard_events(long even_mask);
-
 /* dev.c */
 extern void update_keys(void);
 extern void keypress(XEvent *e);
@@ -155,8 +152,5 @@ extern void quit(Arg *arg);
 /* util.c */
 extern void error(const char *errstr, ...);
 extern void *emallocz(unsigned int size);
-extern void *emalloc(unsigned int size);
-extern void *erealloc(void *ptr, unsigned int size);
-extern char *estrdup(const char *str);
 extern void spawn(Arg *arg);
 extern void swap(void **p1, void **p2);
diff --git a/event.c b/event.c
index 4edf139..b027a3e 100644
--- a/event.c
+++ b/event.c
@@ -4,6 +4,7 @@
  */
 
 #include <fcntl.h>
+#include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include <X11/keysym.h>
@@ -37,13 +38,6 @@ void (*handler[LASTEvent]) (XEvent *) = {
 	[UnmapNotify] = unmapnotify
 };
 
-void
-discard_events(long even_mask)
-{
-	XEvent ev;
-	while(XCheckMaskEvent(dpy, even_mask, &ev));
-}
-
 static void
 buttonpress(XEvent *e)
 {
diff --git a/util.c b/util.c
index d8e6612..e95dfc5 100644
--- a/util.c
+++ b/util.c
@@ -6,7 +6,6 @@
 #include <stdarg.h>
 #include <stdio.h>
 #include <stdlib.h>
-#include <string.h>
 #include <sys/types.h>
 #include <sys/wait.h>
 #include <unistd.h>
@@ -39,33 +38,6 @@ emallocz(unsigned int size)
 	return res;
 }
 
-void *
-emalloc(unsigned int size)
-{
-	void *res = malloc(size);
-	if(!res)
-		bad_malloc(size);
-	return res;
-}
-
-void *
-erealloc(void *ptr, unsigned int size)
-{
-	void *res = realloc(ptr, size);
-	if(!res)
-		bad_malloc(size);
-	return res;
-}
-
-char *
-estrdup(const char *str)
-{
-	char *res = strdup(str);
-	if(!res)
-		bad_malloc(strlen(str));
-	return res;
-}
-
 void
 swap(void **p1, void **p2)
 {
lt;vc@akkartik.com> 2015-05-04 14:47:14 -0700 1256 - scenarios now support keyboard' href='/akkartik/mu/commit/cpp/074keyboard.mu?h=hlt&id=e3092e7b5ca7fc8c87c891d4d6a1a53ea413072f'>e3092e7b ^
d803b687 ^
77d5b5d6 ^
4a48bedc ^
e3092e7b ^
104854ca ^
7a84094a ^
a0331a9b ^
e3092e7b ^
7a84094a ^
80df524b ^
502d2ea5 ^
760f683f ^
dd660682 ^
e3092e7b ^
0d2686c7 ^


dd660682 ^
e3092e7b ^
6aa42628 ^
80df524b ^
dd660682 ^
e3092e7b ^

c6c19a27 ^


d803b687 ^
77d5b5d6 ^
4a48bedc ^
d803b687 ^


80df524b ^
dd660682 ^

e3092e7b ^
f8c0ef3e ^
760f683f ^
77d5b5d6 ^
4a48bedc ^
f8c0ef3e ^
d803b687 ^
502d2ea5 ^


136412d2 ^
502d2ea5 ^
f8c0ef3e ^

5b1219ca ^
f8c0ef3e ^
6a0f71b9 ^
760f683f ^
77d5b5d6 ^
4a48bedc ^
6a0f71b9 ^
d803b687 ^
ccfee303 ^


6a0f71b9 ^

5e9eff8c ^
760f683f ^
77d5b5d6 ^
4a48bedc ^
dd660682 ^
104854ca ^
5e9eff8c ^
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

                                                                            
 
                           
           
                                                                  
                                              
                     


                                                              
                       


            

 
                        

            

 
                   
                         
                  

 
                                                           
             
             
                                      
                                               

 
                                                                                              
             
             
   
                        
                                                                       
                                                
     
                            
                                                             
                        
                                     
                                          
     


                                                                             
                                         
   
                                                                      
                                                    
                                   

 


                                                                            
                                                                                           
             
             


                                                                 
                                                          

                                                      
 
 
                                                                                                                                       
             
             
   
                                                                


                                            
                             
                         

        
                    
 
 
                                                           
             
             
   
                                        


                   

   
 
                                                       
             
             
                                                                              
                              
 
# Wrappers around interaction primitives that take a potentially fake object
# and are thus easier to test.

exclusive-container event [
  text:char
  keycode:num  # keys on keyboard without a unicode representation
  touch:touch-event  # mouse, track ball, etc.
  resize:resize-event
  # update the assume-console handler if you add more variants
]

container touch-event [
  type:num
  row:num
  column:num
]

container resize-event [
  width:num
  height:num
]

container console [
  current-event-index:num
  events:&:@:event
]

def new-fake-console events:&:@:event -> result:&:console [
  local-scope
  load-inputs
  result:&:console <- new console:type
  *result <- put *result, events:offset, events
]

def read-event console:&:console -> result:event, found?:bool, quit?:bool, console:&:console [
  local-scope
  load-inputs
  {
    break-unless console
    current-event-index:num <- get *console, current-event-index:offset
    buf:&:@:event <- get *console, events:offset
    {
      max:num <- length *buf
      done?:bool <- greater-or-equal current-event-index, max
      break-unless done?
      dummy:&:event <- new event:type
      return *dummy, true/found, true/quit
    }
    result <- index *buf, current-event-index
    current-event-index <- add current-event-index, 1
    *console <- put *console, current-event-index:offset, current-event-index
    return result, true/found, false/quit
  }
  switch  # real event source is infrequent; avoid polling it too much
  result:event, found?:bool <- check-for-interaction
  return result, found?, false/quit
]

# variant of read-event for just keyboard events. Discards everything that
# isn't unicode, so no arrow keys, page-up/page-down, etc. But you still get
# newlines, tabs, ctrl-d..
def read-key console:&:console -> result:char, found?:bool, quit?:bool, console:&:console [
  local-scope
  load-inputs
  x:event, found?:bool, quit?:bool, console <- read-event console
  return-if quit?, 0, found?, quit?
  return-unless found?, 0, found?, quit?
  c:char, converted?:bool <- maybe-convert x, text:variant
  return-unless converted?, 0, false/found, false/quit
  return c, true/found, false/quit
]

def send-keys-to-channel console:&:console, chan:&:sink:char, screen:&:screen -> console:&:console, chan:&:sink:char, screen:&:screen [
  local-scope
  load-inputs
  {
    c:char, found?:bool, quit?:bool, console <- read-key console
    loop-unless found?
    break-if quit?
    assert c, [invalid event, expected text]
    screen <- print screen, c
    chan <- write chan, c
    loop
  }
  chan <- close chan
]

def wait-for-event console:&:console -> console:&:console [
  local-scope
  load-inputs
  {
    _, found?:bool <- read-event console
    break-if found?
    switch
    loop
  }
]

def has-more-events? console:&:console -> result:bool [
  local-scope
  load-inputs
  return-if console, false  # fake events are processed as soon as they arrive
  result <- interactions-left?
]