about summary refs log tree commit diff stats
path: root/client.c
diff options
context:
space:
mode:
Diffstat (limited to 'client.c')
-rw-r--r--client.c36
1 files changed, 21 insertions, 15 deletions
diff --git a/client.c b/client.c
index 6f6ed99..5912c77 100644
--- a/client.c
+++ b/client.c
@@ -219,12 +219,13 @@ manage(Window w, XWindowAttributes *wa)
 	c->h = wa->height;
 	c->th = bh;
 
-	if(c->y < bh)
+	c->border = 1;
+	setsize(c);
+
+	if(c->h != sh && c->y < bh)
 		c->y = c->ty = bh;
 
-	c->border = 1;
 	c->proto = getproto(c->win);
-	setsize(c);
 	XSelectInput(dpy, c->win,
 		StructureNotifyMask | PropertyChangeMask | EnterWindowMask);
 	XGetTransientForHint(dpy, c->win, &trans);
@@ -237,8 +238,6 @@ manage(Window w, XWindowAttributes *wa)
 			DefaultVisual(dpy, screen),
 			CWOverrideRedirect | CWBackPixmap | CWEventMask, &twa);
 
-	settags(c);
-
 	if(clients)
 		clients->prev = c;
 	c->next = clients;
@@ -251,11 +250,12 @@ manage(Window w, XWindowAttributes *wa)
 	XGrabButton(dpy, Button3, MODKEY, c->win, False, BUTTONMASK,
 			GrabModeAsync, GrabModeSync, None, None);
 
+	settags(c);
 	if(!c->isfloat)
-		c->isfloat = trans || (c->maxw && c->minw &&
-				(c->maxw == c->minw) && (c->maxh == c->minh));
-
-
+		c->isfloat = trans
+			|| (c->maxw && c->minw &&
+				c->maxw == c->minw && c->maxh == c->minh)
+			|| (c->w == sw && c->h == sh);
 	settitle(c);
 	arrange(NULL);
 
@@ -272,6 +272,7 @@ resize(Client *c, Bool sizehints, Corner sticky)
 	int bottom = c->y + c->h;
 	int right = c->x + c->w;
 	XConfigureEvent e;
+	XWindowChanges wc;
 
 	if(sizehints) {
 		if(c->incw)
@@ -287,18 +288,23 @@ resize(Client *c, Bool sizehints, Corner sticky)
 		if(c->maxh && c->h > c->maxh)
 			c->h = c->maxh;
 	}
-	if(c->x > sw) /* might happen on restart */
-		c->x = sw - c->w;
-	if(c->y > sh)
-		c->y = sh - c->h;
+	if(c->x > right) /* might happen on restart */
+		c->x = right - c->w;
+	if(c->y > bottom)
+		c->y = bottom - c->h;
 	if(sticky == TopRight || sticky == BotRight)
 		c->x = right - c->w;
 	if(sticky == BotLeft || sticky == BotRight)
 		c->y = bottom - c->h;
 
 	resizetitle(c);
-	XSetWindowBorderWidth(dpy, c->win, 1);
-	XMoveResizeWindow(dpy, c->win, c->x, c->y, c->w, c->h);
+	wc.x = c->x;
+	wc.y = c->y;
+	wc.width = c->w;
+	wc.height = c->h;
+	wc.border_width = 1;
+	XConfigureWindow(dpy, c->win,
+			CWX|CWY|CWWidth|CWHeight|CWBorderWidth, &wc);
 
 	e.type = ConfigureNotify;
 	e.event = c->win;
/widgets/status.go?h=0.5.0&id=46756487fb56acf26122a7b5d46be2ff8ee3c051'>^
5685a17 ^
a073d76 ^






84965d6 ^

80e891a ^
d797513 ^







a073d76 ^



84965d6 ^

a073d76 ^







84965d6 ^

a073d76 ^


6728a11 ^
a073d76 ^











e591221 ^



d797513 ^



80e891a ^
a073d76 ^


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




               
                                  
                                       
 
                                         


                        
                        

                                 
                      


                           

                           





                                        

                                                    




                                        
                                        
                                   






                                                        

                                                                     
                                                             







                                                                                    



                                                           

                                            







                                                                                  

                                            


                                                
                    











                                                                                              



                                    



                                               
                                                                 


                   
package widgets

import (
	"time"

	"github.com/gdamore/tcell"
	"github.com/mattn/go-runewidth"

	"git.sr.ht/~sircmpwn/aerc/lib/ui"
)

type StatusLine struct {
	ui.Invalidatable
	stack    []*StatusMessage
	fallback StatusMessage
	aerc     *Aerc
}

type StatusMessage struct {
	bg      tcell.Color
	fg      tcell.Color
	message string
}

func NewStatusLine() *StatusLine {
	return &StatusLine{
		fallback: StatusMessage{
			bg:      tcell.ColorDefault,
			fg:      tcell.ColorDefault,
			message: "Idle",
		},
	}
}

func (status *StatusLine) Invalidate() {
	status.DoInvalidate(status)
}

func (status *StatusLine) Draw(ctx *ui.Context) {
	line := &status.fallback
	if len(status.stack) != 0 {
		line = status.stack[len(status.stack)-1]
	}
	style := tcell.StyleDefault.
		Background(line.bg).Foreground(line.fg).Reverse(true)
	ctx.Fill(0, 0, ctx.Width(), ctx.Height(), ' ', style)
	pendingKeys := ""
	if status.aerc != nil {
		for _, pendingKey := range status.aerc.pendingKeys {
			pendingKeys += string(pendingKey.Rune)
		}
	}
	message := runewidth.FillRight(line.message, ctx.Width()-len(pendingKeys)-5)
	ctx.Printf(0, 0, style, "%s%s", message, pendingKeys)
}

func (status *StatusLine) Set(text string) *StatusMessage {
	status.fallback = StatusMessage{
		bg:      tcell.ColorDefault,
		fg:      tcell.ColorDefault,
		message: text,
	}
	status.Invalidate()
	return &status.fallback
}

func (status *StatusLine) Push(text string, expiry time.Duration) *StatusMessage {
	msg := &StatusMessage{
		bg:      tcell.ColorDefault,
		fg:      tcell.ColorDefault,
		message: text,
	}
	status.stack = append(status.stack, msg)
	go (func() {
		time.Sleep(expiry)
		for i, m := range status.stack {
			if m == msg {
				status.stack = append(status.stack[:i], status.stack[i+1:]...)
				break
			}
		}
		status.Invalidate()
	})()
	return msg
}

func (status *StatusLine) Expire() {
	status.stack = nil
}

func (status *StatusLine) SetAerc(aerc *Aerc) {
	status.aerc = aerc
}

func (msg *StatusMessage) Color(bg tcell.Color, fg tcell.Color) {
	msg.bg = bg
	msg.fg = fg
}