From 56230c5c167acf308dc45b98d5adeadac58f2e2f Mon Sep 17 00:00:00 2001 From: Reginald Kennedy Date: Wed, 4 Dec 2013 02:19:35 +0800 Subject: [PATCH] Fix quirk matching of windows missing WM_CLASS. From: Yuri D'Elia (Note: Modified styling and skipped the addition of a default quirk.) --- spectrwm.c | 56 +++++++++++++++++++++++++++----------------------------- 1 file changed, 27 insertions(+), 29 deletions(-) diff --git a/spectrwm.c b/spectrwm.c index 251b746..9d08e6e 100644 --- a/spectrwm.c +++ b/spectrwm.c @@ -8035,7 +8035,7 @@ manage_window(xcb_window_t id, uint16_t mapped) struct ws_win *win, *ww; int ws_idx; char ws_idx_str[SWM_PROPLEN]; - char *name; + char *class, *instance, *name; struct swm_region *r; struct pid_e *p; struct quirk *qp; @@ -8161,40 +8161,38 @@ manage_window(xcb_window_t id, uint16_t mapped) ewmh_autoquirk(win); /* Determine initial quirks. */ - if (xcb_icccm_get_wm_class_reply(conn, + xcb_icccm_get_wm_class_reply(conn, xcb_icccm_get_wm_class(conn, win->id), - &win->ch, NULL)) { - name = get_win_name(win->id); + &win->ch, NULL); - DNPRINTF(SWM_D_CLASS, "manage_window: class: %s, instance: %s, " - "name: %s\n", - win->ch.class_name, win->ch.instance_name, name); - - /* java is retarded so treat it special */ - if (strstr(win->ch.instance_name, "sun-awt")) { - DNPRINTF(SWM_D_CLASS, "manage_window: java window " - "detected.\n"); - win->java = 1; - } - - TAILQ_FOREACH(qp, &quirks, entry) { - if (regexec(&qp->regex_class, win->ch.class_name, 0, - NULL, 0) == 0 && regexec(&qp->regex_instance, - win->ch.instance_name, 0, NULL, 0) == 0 && - regexec(&qp->regex_name, name, 0, NULL, 0) == 0) { - DNPRINTF(SWM_D_CLASS, "manage_window: matched " - "quirk: %s:%s:%s mask: %#lx\n", qp->class, - qp->instance, qp->name, qp->quirk); - if (qp->quirk & SWM_Q_FLOAT) - win->floating = 1; - win->quirks = qp->quirk; - } + class = win->ch.class_name ? win->ch.class_name : ""; + instance = win->ch.instance_name ? win->ch.instance_name : ""; + name = get_win_name(win->id); - } + DNPRINTF(SWM_D_CLASS, "manage_window: class: %s, instance: %s, " + "name: %s\n", class, instance, name); - free(name); + /* java is retarded so treat it special */ + if (win->ch.instance_name && strstr(win->ch.instance_name, "sun-awt")) { + DNPRINTF(SWM_D_CLASS, "manage_window: java window detected.\n"); + win->java = 1; } + TAILQ_FOREACH(qp, &quirks, entry) { + if (regexec(&qp->regex_class, class, 0, NULL, 0) == 0 && + regexec(&qp->regex_instance, instance, 0, NULL, 0) == 0 && + regexec(&qp->regex_name, name, 0, NULL, 0) == 0) { + DNPRINTF(SWM_D_CLASS, "manage_window: matched " + "quirk: %s:%s:%s mask: %#lx\n", qp->class, + qp->instance, qp->name, qp->quirk); + if (qp->quirk & SWM_Q_FLOAT) + win->floating = 1; + win->quirks = qp->quirk; + } + } + + free(name); + /* Alter window position if quirky */ if (win->quirks & SWM_Q_ANYWHERE) win->manual = 1; -- 1.7.10.4