Xinqi Bao's Git
c11d5d5b970f08602ef085c2b57648bf64d1d041
2 * (C)opyright MMVI Anselm R. Garbe <garbeam at gmail dot com>
3 * See LICENSE file for license details.
13 #define CLIENT_MASK (StructureNotifyMask | PropertyChangeMask | EnterWindowMask)
16 update_name(Client
*c
)
24 XGetTextProperty(dpy
, c
->win
, &name
, net_atom
[NetWMName
]);
26 XGetWMName(dpy
, c
->win
, &name
);
29 if(name
.encoding
== XA_STRING
)
30 strncpy(c
->name
, (char *)name
.value
, sizeof(c
->name
));
32 if(XmbTextPropertyToTextList(dpy
, &name
, &list
, &n
) >= Success
35 strncpy(c
->name
, *list
, sizeof(c
->name
));
36 XFreeStringList(list
);
50 for(l
=&stack
; *l
&& *l
!= c
; l
=&(*l
)->snext
);
55 XRaiseWindow(dpy
, c
->win
);
56 XSetInputFocus(dpy
, c
->win
, RevertToPointerRoot
, CurrentTime
);
61 manage(Window w
, XWindowAttributes
*wa
)
64 XSetWindowAttributes twa
;
67 c
= emallocz(sizeof(Client
));
69 c
->r
[RFloat
].x
= wa
->x
;
70 c
->r
[RFloat
].y
= wa
->y
;
71 c
->r
[RFloat
].width
= wa
->width
;
72 c
->r
[RFloat
].height
= wa
->height
;
73 XSetWindowBorderWidth(dpy
, c
->win
, 1);
74 XSelectInput(dpy
, c
->win
, CLIENT_MASK
);
75 XGetTransientForHint(dpy
, c
->win
, &c
->trans
);
76 if(!XGetWMNormalHints(dpy
, c
->win
, &c
->size
, &msize
) || !c
->size
.flags
)
77 c
->size
.flags
= PSize
;
79 (c
->size
.flags
& PMinSize
&& c
->size
.flags
& PMaxSize
80 && c
->size
.min_width
== c
->size
.max_width
81 && c
->size
.min_height
== c
->size
.max_height
);
83 twa
.override_redirect
= 1;
84 twa
.background_pixmap
= ParentRelative
;
85 twa
.event_mask
= ExposureMask
;
87 c
->title
= XCreateWindow(dpy
, root
, c
->r
[RFloat
].x
, c
->r
[RFloat
].y
,
88 c
->r
[RFloat
].width
, barrect
.height
, 0,
89 DefaultDepth(dpy
, screen
), CopyFromParent
,
90 DefaultVisual(dpy
, screen
),
91 CWOverrideRedirect
| CWBackPixmap
| CWEventMask
, &twa
);
93 for(l
=&clients
; *l
; l
=&(*l
)->next
);
94 c
->next
= *l
; /* *l == nil */
98 XMapWindow(dpy
, c
->win
);
99 XGrabButton(dpy
, Button1
, Mod1Mask
, c
->win
, False
, ButtonPressMask
,
100 GrabModeAsync
, GrabModeSync
, None
, None
);
101 XGrabButton(dpy
, Button2
, Mod1Mask
, c
->win
, False
, ButtonPressMask
,
102 GrabModeAsync
, GrabModeSync
, None
, None
);
103 XGrabButton(dpy
, Button3
, Mod1Mask
, c
->win
, False
, ButtonPressMask
,
104 GrabModeAsync
, GrabModeSync
, None
, None
);
113 XMoveResizeWindow(dpy
, c
->win
, c
->r
[RFloat
].x
, c
->r
[RFloat
].y
,
114 c
->r
[RFloat
].width
, c
->r
[RFloat
].height
);
115 e
.type
= ConfigureNotify
;
118 e
.x
= c
->r
[RFloat
].x
;
119 e
.y
= c
->r
[RFloat
].y
;
120 e
.width
= c
->r
[RFloat
].width
;
121 e
.height
= c
->r
[RFloat
].height
;
124 e
.override_redirect
= False
;
125 XSelectInput(dpy
, c
->win
, CLIENT_MASK
& ~StructureNotifyMask
);
126 XSendEvent(dpy
, c
->win
, False
, StructureNotifyMask
, (XEvent
*)&e
);
127 XSelectInput(dpy
, c
->win
, CLIENT_MASK
);
132 dummy_error_handler(Display
*dpy
, XErrorEvent
*error
)
143 XSetErrorHandler(dummy_error_handler
);
145 XUngrabButton(dpy
, AnyButton
, AnyModifier
, c
->win
);
146 XUnmapWindow(dpy
, c
->win
);
147 XDestroyWindow(dpy
, c
->title
);
149 for(l
=&clients
; *l
&& *l
!= c
; l
=&(*l
)->next
);
152 for(l
=&stack
; *l
&& *l
!= c
; l
=&(*l
)->snext
);
158 XSetErrorHandler(error_handler
);
160 discard_events(EnterWindowMask
);
170 for(c
= clients
; c
; c
= c
->next
)
177 draw_client(Client
*c
)