X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fscreen.c;h=5fc2bb9221390ecac63b6710d64a54dbfd578a67;hb=31d7680274cdf2fa3c45b8c8d56db2b5d8fbc111;hp=93ee2c1475e598f63de8f59fa7864773d345f731;hpb=a7f65a818c48e272aa9c8c49f2339b46b794078e;p=chaz%2Fopenbox diff --git a/openbox/screen.c b/openbox/screen.c index 93ee2c14..5fc2bb92 100644 --- a/openbox/screen.c +++ b/openbox/screen.c @@ -153,7 +153,7 @@ static gboolean replace_wm() return TRUE; } -gboolean screen_annex() +gboolean screen_annex(const gchar *program_name) { XSetWindowAttributes attrib; pid_t pid; @@ -170,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); @@ -202,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); @@ -298,51 +299,55 @@ gboolean screen_annex() void screen_startup(gboolean reconfig) { + guint i, numnames; + gchar **names; GSList *it; - guint i; + guint32 d; desktop_cycle_popup = pager_popup_new(FALSE); + pager_popup_height(desktop_cycle_popup, POPUP_HEIGHT); + + if (reconfig) + return; - if (!reconfig) - /* get the initial size */ - screen_resize(); + /* get the initial size */ + screen_resize(); - /* set the names */ - screen_desktop_names = g_new(gchar*, - g_slist_length(config_desktops_names) + 1); + /* get the desktop names */ + numnames = g_slist_length(config_desktops_names); + names = g_new(gchar*, numnames + 1); + names[numnames] = NULL; 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; - PROP_SETSS(RootWindow(ob_display, ob_screen), - net_desktop_names, screen_desktop_names); - g_free(screen_desktop_names); /* dont free the individual strings */ - screen_desktop_names = NULL; + names[i] = g_strdup(it->data); - if (!reconfig) - screen_num_desktops = 0; + /* set the root window property */ + PROP_SETSS(RootWindow(ob_display, ob_screen), net_desktop_names,names); + + g_strfreev(names); + + /* set the number of desktops */ + screen_num_desktops = 0; screen_set_num_desktops(config_desktops_num); - if (!reconfig) { - guint32 d; - /* start on the current desktop when a wm was already running */ - if (PROP_GET32(RootWindow(ob_display, ob_screen), - net_current_desktop, cardinal, &d) && - d < screen_num_desktops) - { - 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, FALSE); - /* don't start in showing-desktop mode */ - screen_showing_desktop = FALSE; - PROP_SET32(RootWindow(ob_display, ob_screen), - net_showing_desktop, cardinal, screen_showing_desktop); + /* start on the current desktop when a wm was already running */ + if (PROP_GET32(RootWindow(ob_display, ob_screen), + net_current_desktop, cardinal, &d) && + d < screen_num_desktops) + { + 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, FALSE); - screen_update_layout(); - } + /* don't start in showing-desktop mode */ + screen_showing_desktop = FALSE; + PROP_SET32(RootWindow(ob_display, ob_screen), + net_showing_desktop, cardinal, screen_showing_desktop); + + screen_update_layout(); } void screen_shutdown(gboolean reconfig) @@ -351,22 +356,24 @@ void screen_shutdown(gboolean reconfig) pager_popup_free(desktop_cycle_popup); - if (!reconfig) { - XSelectInput(ob_display, RootWindow(ob_display, ob_screen), - NoEventMask); + if (reconfig) + return; - /* we're not running here no more! */ - PROP_ERASE(RootWindow(ob_display, ob_screen), openbox_pid); - /* not without us */ - PROP_ERASE(RootWindow(ob_display, ob_screen), net_supported); - /* don't keep this mode */ - PROP_ERASE(RootWindow(ob_display, ob_screen), net_showing_desktop); + XSelectInput(ob_display, RootWindow(ob_display, ob_screen), + NoEventMask); - XDestroyWindow(ob_display, screen_support_win); - } + /* we're not running here no more! */ + PROP_ERASE(RootWindow(ob_display, ob_screen), openbox_pid); + /* not without us */ + PROP_ERASE(RootWindow(ob_display, ob_screen), net_supported); + /* don't keep this mode */ + PROP_ERASE(RootWindow(ob_display, ob_screen), net_showing_desktop); + + XDestroyWindow(ob_display, screen_support_win); g_strfreev(screen_desktop_names); screen_desktop_names = NULL; + for (r = area; *r; ++r) g_free(*r); g_free(area); @@ -427,9 +434,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; @@ -440,6 +444,10 @@ 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, TRUE); @@ -469,7 +477,7 @@ void screen_set_desktop(guint num, gboolean dofocus) /* show windows before hiding the rest to lessen the enter/leave events */ - /* show/hide windows from top to bottom */ + /* show windows from top to bottom */ for (it = stacking_list; it; it = g_list_next(it)) { if (WINDOW_IS_CLIENT(it->data)) { ObClient *c = it->data; @@ -618,9 +626,8 @@ 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_max_width(desktop_cycle_popup, + MAX(a->width/3, POPUP_WIDTH)); pager_popup_show(desktop_cycle_popup, screen_desktop_names[d], d); } } @@ -868,16 +875,21 @@ void screen_update_desktop_names() if (PROP_GETSS(RootWindow(ob_display, ob_screen), net_desktop_names, utf8, &screen_desktop_names)) - for (i = 0; screen_desktop_names[i] && i <= screen_num_desktops; ++i); + for (i = 0; screen_desktop_names[i] && i < screen_num_desktops; ++i); else i = 0; - if (i <= screen_num_desktops) { + if (i < screen_num_desktops) { screen_desktop_names = g_renew(gchar*, screen_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_text_width_to_strings(desktop_cycle_popup, + screen_desktop_names, + screen_num_desktops); } void screen_show_desktop(gboolean show, gboolean restore_focus)