X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fclient.c;h=e80b84f182f9d06e2c62b877792db1df8c544d0a;hb=d77c8f62f2f908cfe1d09686a35dce1ccaf65aec;hp=0cc393ba13040b3187b856fb9e12dcf6852663be;hpb=ed61a94ca51b2fc663ffef1b2bd37785c676cd34;p=chaz%2Fopenbox diff --git a/openbox/client.c b/openbox/client.c index 0cc393ba..e80b84f1 100644 --- a/openbox/client.c +++ b/openbox/client.c @@ -40,7 +40,6 @@ #include "keyboard.h" #include "mouse.h" #include "render/render.h" -#include "per_app_settings.h" #include #include @@ -205,6 +204,32 @@ void client_manage_all() XFree(children); } +static ObAppSettings *get_settings(ObClient *client) +{ + GSList *a = config_per_app_settings; + + while (a) { + ObAppSettings *app = (ObAppSettings *) a->data; + + if ( + (app->name && !app->class && !strcmp(app->name, client->name)) + || (app->class && !app->name && !strcmp(app->class, client->class)) + || (app->class && app->name && !strcmp(app->class, client->class) + && !strcmp(app->name, client->name)) + ) { + ob_debug("Window matching: %s\n", app->name); + /* Match if no role was specified in the per app setting, or if the string + * matches the beginning of the role, since apps like to set the role to + * things like browser-window-23c4b2f */ + if (!app->role || !strncmp(app->role, client->role, strlen(app->role))) + return app; + } + + a = a->next; + } + return NULL; +} + void client_manage(Window window) { ObClient *self; @@ -213,7 +238,7 @@ void client_manage(Window window) XSetWindowAttributes attrib_set; XWMHints *wmhint; gboolean activate = FALSE; - ObAppSetting *settings; + ObAppSettings *settings; grab_server(TRUE); @@ -295,28 +320,58 @@ void client_manage(Window window) client_apply_startup_state(self); /* get and set application level settings */ - settings = (ObAppSetting *) get_client_settings(self); + settings = get_settings(self); + + stacking_add(CLIENT_AS_WINDOW(self)); + client_restore_session_stacking(self); if (settings) { - if (settings->shade && !settings->decor) - settings->decor = TRUE; - - client_shade(self, settings->shade); - client_set_undecorated(self, !settings->decor); - - if (settings->desktop != -1) - client_set_desktop(self, settings->desktop, FALSE); + /* Don't worry, we won't actually both shade and undecorate the + * window when push comes to shove. */ + if (settings->shade != -1) + client_shade(self, settings->shade); + if (settings->decor != -1) + client_set_undecorated(self, !settings->decor); + if (settings->iconic != -1) + client_iconify(self, settings->iconic, FALSE); + if (settings->skip_pager != -1) { + self->skip_pager = !!settings->skip_pager; + client_change_state(self); + } + if (settings->skip_taskbar != -1) { + self->skip_taskbar = !!settings->skip_taskbar; + client_change_state(self); + } - client_set_layer(self, settings->layer); - } + /* 1 && -1 shouldn't be possible by the code in config.c */ + if (settings->max_vert == 1 && settings->max_horz == 1) + client_maximize(self, TRUE, 0, TRUE); + else if (settings->max_vert == 0 && settings->max_horz == 0) + client_maximize(self, FALSE, 0, TRUE); + else if (settings->max_vert == 1 && settings->max_horz == 0) { + client_maximize(self, TRUE, 2, TRUE); + client_maximize(self, FALSE, 1, TRUE); + } else if (settings->max_vert == 0 && settings->max_horz == 1) { + client_maximize(self, TRUE, 1, TRUE); + client_maximize(self, FALSE, 2, TRUE); + } - stacking_add(CLIENT_AS_WINDOW(self)); - client_restore_session_stacking(self); + if (settings->fullscreen != -1) + client_fullscreen(self, !!settings->fullscreen, TRUE); + + if (settings->desktop < screen_num_desktops + || settings->desktop == DESKTOP_ALL) + client_set_desktop(self, settings->desktop, TRUE); + + if (settings->layer > -2 && settings->layer < 2) + client_set_layer(self, settings->layer); + + } /* focus the new window? */ if (ob_state() != OB_STATE_STARTING && (config_focus_new || client_search_focus_parent(self)) || - (settings && settings->focus) && + (settings && settings->focus == TRUE) && /* note the check against Type_Normal/Dialog, not client_normal(self), which would also include other types. in this case we want more strict rules for focus */ @@ -361,10 +416,7 @@ void client_manage(Window window) gint x = self->area.x, ox = x; gint y = self->area.y, oy = y; - place_client(self, &x, &y); - - if (settings) - place_window_from_settings(settings, self, &x, &y); + place_client(self, &x, &y, settings); /* make sure the window is visible. */ client_find_onscreen(self, &x, &y, @@ -1183,7 +1235,7 @@ void client_update_normal_hints(ObClient *self) if (size.flags & PBaseSize) SIZE_SET(self->base_size, size.base_width, size.base_height); - if (size.flags & PResizeInc) + if (size.flags & PResizeInc && size.width_inc && size.height_inc) SIZE_SET(self->size_inc, size.width_inc, size.height_inc); } } @@ -1193,7 +1245,7 @@ void client_setup_decor_and_functions(ObClient *self) /* start with everything (cept fullscreen) */ self->decorations = (OB_FRAME_DECOR_TITLEBAR | - (ob_rr_theme->show_handle ? OB_FRAME_DECOR_HANDLE : 0) | + OB_FRAME_DECOR_HANDLE | OB_FRAME_DECOR_GRIPS | OB_FRAME_DECOR_BORDER | OB_FRAME_DECOR_ICON | @@ -1484,7 +1536,8 @@ void client_update_title(ObClient *self) /* try netwm */ if (!PROP_GETS(self->window, net_wm_name, utf8, &data)) { /* try old x stuff */ - if (!PROP_GETS(self->window, wm_name, locale, &data)) { + if (!(PROP_GETS(self->window, wm_name, locale, &data) + || PROP_GETS(self->window, wm_name, utf8, &data))) { // http://developer.gnome.org/projects/gup/hig/draft_hig_new/windows-alert.html if (self->transient) { data = g_strdup(""); @@ -1494,35 +1547,39 @@ void client_update_title(ObClient *self) } } - /* did the title change? then reset the title_count */ - if (old_title && 0 != strncmp(old_title, data, strlen(data))) - self->title_count = 1; + if (config_title_number) { - /* look for duplicates and append a number */ - nums = 0; - for (it = client_list; it; it = g_list_next(it)) - if (it->data != self) { - ObClient *c = it->data; - if (0 == strncmp(c->title, data, strlen(data))) - nums |= 1 << c->title_count; - } - /* find first free number */ - for (i = 1; i <= 32; ++i) - if (!(nums & (1 << i))) { - if (self->title_count == 1 || i == 1) - self->title_count = i; - break; + /* did the title change? then reset the title_count */ + if (old_title && 0 != strncmp(old_title, data, strlen(data))) + self->title_count = 1; + + /* look for duplicates and append a number */ + nums = 0; + for (it = client_list; it; it = g_list_next(it)) + if (it->data != self) { + ObClient *c = it->data; + if (0 == strncmp(c->title, data, strlen(data))) + nums |= 1 << c->title_count; + } + /* find first free number */ + for (i = 1; i <= 32; ++i) + if (!(nums & (1 << i))) { + if (self->title_count == 1 || i == 1) + self->title_count = i; + break; + } + /* dont display the number for the first window */ + if (self->title_count > 1) { + gchar *ndata; + ndata = g_strdup_printf("%s - [%u]", data, self->title_count); + g_free(data); + data = ndata; } - /* dont display the number for the first window */ - if (self->title_count > 1) { - gchar *ndata; - ndata = g_strdup_printf("%s - [%u]", data, self->title_count); - g_free(data); - data = ndata; - } + } else + self->title_count = 1; - PROP_SETS(self->window, net_wm_visible_name, data); no_number: + PROP_SETS(self->window, net_wm_visible_name, data); self->title = data; if (self->frame) @@ -1538,12 +1595,15 @@ no_number: /* try netwm */ if (!PROP_GETS(self->window, net_wm_icon_name, utf8, &data)) /* try old x stuff */ - if (!PROP_GETS(self->window, wm_icon_name, locale, &data)) { + if (!(PROP_GETS(self->window, wm_icon_name, locale, &data) + || PROP_GETS(self->window, wm_icon_name, utf8, &data))) { data = g_strdup(self->title); read_title = FALSE; } - /* append the title count, dont display the number for the first window */ + /* append the title count, dont display the number for the first window. + * We don't need to check for config_title_number here since title_count + * is not set above 1 then. */ if (read_title && self->title_count > 1) { gchar *vdata, *ndata; ndata = g_strdup_printf(" - [%u]", self->title_count); @@ -1982,35 +2042,16 @@ void client_configure_full(ObClient *self, ObCorner anchor, /* set the size and position if fullscreen */ if (self->fullscreen) { -#ifdef VIDMODE - gint dot; - XF86VidModeModeLine mode; -#endif Rect *a; guint i; i = client_monitor(self); a = screen_physical_area_monitor(i); -#ifdef VIDMODE - if (i == 0 && /* primary head */ - extensions_vidmode && - XF86VidModeGetViewPort(ob_display, ob_screen, &x, &y) && - /* get the mode last so the mode.privsize isnt freed incorrectly */ - XF86VidModeGetModeLine(ob_display, ob_screen, &dot, &mode)) { - x += a->x; - y += a->y; - w = mode.hdisplay; - h = mode.vdisplay; - if (mode.privsize) XFree(mode.private); - } else -#endif - { - x = a->x; - y = a->y; - w = a->width; - h = a->height; - } + x = a->x; + y = a->y; + w = a->width; + h = a->height; user = FALSE; /* ignore that increment etc shit when in fullscreen */ } else { @@ -2294,12 +2335,6 @@ static void client_iconify_recursive(ObClient *self, focus_order_remove(self); focus_order_add_new(self); - /* this is here cuz with the VIDMODE extension, the viewport can - change while a fullscreen window is iconic, and when it - uniconifies, it would be nice if it did so to the new position - of the viewport */ - client_reconfigure(self); - changed = TRUE; } } @@ -2807,21 +2842,20 @@ gboolean client_focus(ObClient *self) return TRUE; } +/* Used when the current client is closed, focus_last will then prevent + * focus from going to the mouse pointer */ void client_unfocus(ObClient *self) { if (focus_client == self) { #ifdef DEBUG_FOCUS ob_debug("client_unfocus for %lx\n", self->window); #endif - focus_fallback(OB_FOCUS_FALLBACK_UNFOCUSING); + focus_fallback(OB_FOCUS_FALLBACK_CLOSED); } } void client_activate(ObClient *self, gboolean here) { - /* This check is for the client_list_menu trying to activate - * a closed client. */ - if (!g_list_find(client_list, self)) return; if (client_normal(self) && screen_showing_desktop) screen_show_desktop(FALSE); if (self->iconic)