aboutsummaryrefslogtreecommitdiff
path: root/monsterwm.c
diff options
context:
space:
mode:
authorIvan Kanakarakis <ivan.kanak@gmail.com>2011-12-30 20:38:50 +0200
committerIvan Kanakarakis <ivan.kanak@gmail.com>2011-12-30 21:55:17 +0200
commiteea086632d60ee59674baf251604ae3a11ef1ab0 (patch)
treeedeb17b648e5ad51ccd9b4de4773a5a9235d5bcd /monsterwm.c
parentc58975816598ab7b9e0d0a53e3890854892914af (diff)
fix a memory leak on maprequest() function for XClassHint
Diffstat (limited to 'monsterwm.c')
-rw-r--r--monsterwm.c29
1 files changed, 13 insertions, 16 deletions
diff --git a/monsterwm.c b/monsterwm.c
index 390c91e..1377616 100644
--- a/monsterwm.c
+++ b/monsterwm.c
@@ -174,8 +174,7 @@ void change_desktop(const Arg *arg) {
previous_desktop = current_desktop;
/* save current desktop settings and unmap windows */
save_desktop(current_desktop);
- for (client *c=head; c; c=c->next)
- XUnmapWindow(dis, c->win);
+ for (client *c=head; c; c=c->next) XUnmapWindow(dis, c->win);
/* read new desktop properties, tile and map new windows */
select_desktop(arg->i);
tile();
@@ -344,30 +343,28 @@ void maprequest(XEvent *e) {
Window trans;
Bool follow = False, winistrans = XGetTransientForHint(dis, ev->window, &trans) && trans;
- int cd = current_desktop, nd = current_desktop;
+ int cd = current_desktop, newdsk = current_desktop;
XClassHint ch = {0, 0};
if (!winistrans && XGetClassHint(dis, ev->window, &ch))
- for (unsigned int i=0; i<LENGTH(rules); i++) {
- if (strcmp(ch.res_class, rules[i].class)
- && strcmp(ch.res_name, rules[i].class)) continue;
- nd = rules[i].desktop;
- follow = rules[i].follow;
- if (ch.res_class) XFree(ch.res_class);
- if (ch.res_name) XFree(ch.res_name);
- break;
- }
+ for (unsigned int i=0; i<LENGTH(rules); i++)
+ if (!strcmp(ch.res_class, rules[i].class) || !strcmp(ch.res_name, rules[i].class)) {
+ follow = rules[i].follow;
+ newdsk = rules[i].desktop;
+ break;
+ }
+ if (ch.res_class) XFree(ch.res_class);
+ if (ch.res_name) XFree(ch.res_name);
save_desktop(cd);
- select_desktop(nd);
+ select_desktop(newdsk);
add_window(ev->window);
select_desktop(cd);
- if (cd == nd) {
+ if (cd == newdsk) {
if (!winistrans) tile();
XMapWindow(dis, ev->window);
update_current();
- }
- if (follow) change_desktop(&(Arg){.i = nd});
+ } else if (follow) change_desktop(&(Arg){.i = newdsk});
desktopinfo();
}