X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;ds=sidebyside;f=openbox%2Fscreen.c;h=b0c3286a2d7815fbc90b14ed738d3e4ce772224f;hb=740c8af41e77a0cf5a748a7530d19405ad6739c0;hp=b305e68535726d753f141432e4c4e9b9b92f735a;hpb=3409148047e2d179fbe9fc5ef194253cc0f0ad85;p=chaz%2Fopenbox diff --git a/openbox/screen.c b/openbox/screen.c index b305e685..b0c3286a 100644 --- a/openbox/screen.c +++ b/openbox/screen.c @@ -28,6 +28,7 @@ #include "config.h" #include "screen.h" #include "client.h" +#include "session.h" #include "frame.h" #include "event.h" #include "focus.h" @@ -152,7 +153,7 @@ static gboolean replace_wm() return TRUE; } -gboolean screen_annex() +gboolean screen_annex(const gchar *program_name) { XSetWindowAttributes attrib; pid_t pid; @@ -169,6 +170,7 @@ gboolean screen_annex() CopyFromParent, CWOverrideRedirect, &attrib); XMapWindow(ob_display, screen_support_win); + XLowerWindow(ob_display, screen_support_win); if (!replace_wm()) { XDestroyWindow(ob_display, screen_support_win); @@ -201,7 +203,7 @@ gboolean screen_annex() net_supporting_wm_check, window, screen_support_win); /* set properties on the supporting window */ - PROP_SETS(screen_support_win, net_wm_name, "Openbox"); + PROP_SETS(screen_support_win, net_wm_name, program_name); PROP_SET32(screen_support_win, net_supporting_wm_check, window, screen_support_win); @@ -284,7 +286,7 @@ gboolean screen_annex() supported[i++] = prop_atoms.openbox_wm_state_undecorated; supported[i++] = prop_atoms.openbox_pid; - supported[i++] = prop_atoms.openbox_rc; + supported[i++] = prop_atoms.openbox_config; supported[i++] = prop_atoms.openbox_control; g_assert(i == num_support); @@ -301,20 +303,29 @@ void screen_startup(gboolean reconfig) guint i; desktop_cycle_popup = pager_popup_new(FALSE); + pager_popup_height(desktop_cycle_popup, POPUP_HEIGHT); if (!reconfig) /* get the initial size */ screen_resize(); - /* set the names */ - screen_desktop_names = g_new(gchar*, - g_slist_length(config_desktops_names) + 1); - for (i = 0, it = config_desktops_names; it; ++i, it = g_slist_next(it)) - screen_desktop_names[i] = it->data; /* dont strdup */ - screen_desktop_names[i] = NULL; + /* get the names */ + if (PROP_GETSS(RootWindow(ob_display, ob_screen), + net_desktop_names, utf8, &screen_desktop_names)) + for (i = 0; screen_desktop_names[i]; ++i); + else + i = 0; + for (it = g_slist_nth(config_desktops_names, i); it; + it = g_slist_next(it), ++i) + { + screen_desktop_names = g_renew(gchar*, screen_desktop_names, i + 2); + screen_desktop_names[i+1] = NULL; + screen_desktop_names[i] = g_strdup(it->data); + } + /* then set the names */ PROP_SETSS(RootWindow(ob_display, ob_screen), net_desktop_names, screen_desktop_names); - g_free(screen_desktop_names); /* dont free the individual strings */ + g_strfreev(screen_desktop_names); screen_desktop_names = NULL; if (!reconfig) @@ -327,10 +338,13 @@ void screen_startup(gboolean reconfig) net_current_desktop, cardinal, &d) && d < screen_num_desktops) { - screen_set_desktop(d); - } else + screen_set_desktop(d, FALSE); + } else if (session_desktop >= 0) + screen_set_desktop(MIN((guint)session_desktop, + screen_num_desktops), FALSE); + else screen_set_desktop(MIN(config_screen_firstdesk, - screen_num_desktops) - 1); + screen_num_desktops) - 1, FALSE); /* don't start in showing-desktop mode */ screen_showing_desktop = FALSE; @@ -423,9 +437,6 @@ void screen_set_num_desktops(guint num) /* the number of rows/columns will differ */ screen_update_layout(); - /* may be some unnamed desktops that we need to fill in with names */ - screen_update_desktop_names(); - /* move windows on desktops that will no longer exist! */ for (it = client_list; it; it = g_list_next(it)) { ObClient *c = it->data; @@ -436,12 +447,16 @@ void screen_set_num_desktops(guint num) /* change our struts/area to match (after moving windows) */ screen_update_areas(); + /* may be some unnamed desktops that we need to fill in with names + (after updating the areas so the popup can resize) */ + screen_update_desktop_names(); + /* change our desktop if we're on one that no longer exists! */ if (screen_desktop >= screen_num_desktops) - screen_set_desktop(num - 1); + screen_set_desktop(num - 1, TRUE); } -void screen_set_desktop(guint num) +void screen_set_desktop(guint num, gboolean dofocus) { ObClient *c; GList *it; @@ -483,7 +498,7 @@ void screen_set_desktop(guint num) /* have to try focus here because when you leave an empty desktop there is no focus out to watch for */ - if ((c = focus_fallback_target(TRUE, focus_client))) { + if (dofocus && (c = focus_fallback_target(TRUE, focus_client))) { /* reduce flicker by hiliting now rather than waiting for the server FocusIn event */ frame_adjust_focus(c->frame, TRUE); @@ -614,9 +629,6 @@ void screen_desktop_popup(guint d, gboolean show) a = screen_physical_area_monitor(0); pager_popup_position(desktop_cycle_popup, CenterGravity, a->x + a->width / 2, a->y + a->height / 2); - pager_popup_width(desktop_cycle_popup, MAX(a->width/3, POPUP_WIDTH)); - pager_popup_height(desktop_cycle_popup, POPUP_HEIGHT); - pager_popup_show(desktop_cycle_popup, screen_desktop_names[d], d); } } @@ -872,8 +884,15 @@ void screen_update_desktop_names() screen_num_desktops + 1); screen_desktop_names[screen_num_desktops] = NULL; for (; i < screen_num_desktops; ++i) - screen_desktop_names[i] = g_strdup_printf("Desktop %i", i + 1); + screen_desktop_names[i] = g_strdup_printf("desktop %i", i + 1); } + + /* resize the pager for these names */ + pager_popup_width_to_strings(desktop_cycle_popup, + screen_desktop_names, + screen_num_desktops, + MAX(screen_physical_area_monitor(0)->width/3, + POPUP_WIDTH)); } void screen_show_desktop(gboolean show, gboolean restore_focus)