X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fscreen.c;h=fd6244665cc99cc8827a90a3ff1745386dec543d;hb=7a166a383805f7693e0800f3bf693e3736463a0d;hp=118798e8e8b02f00a8a3b61c30b37a0b6e84948a;hpb=12d4c8666c9475f254783fd33d1eb2b47f32e030;p=chaz%2Fopenbox diff --git a/openbox/screen.c b/openbox/screen.c index 118798e8..fd624466 100644 --- a/openbox/screen.c +++ b/openbox/screen.c @@ -1,11 +1,14 @@ #include "openbox.h" +#include "dock.h" #include "prop.h" +#include "startup.h" #include "config.h" #include "screen.h" #include "client.h" #include "frame.h" #include "focus.h" #include "dispatch.h" +#include "extensions.h" #include "../render/render.h" #include @@ -15,7 +18,7 @@ #endif /*! The event mask to grab on the root window */ -#define ROOT_EVENTMASK (/*ColormapChangeMask |*/ PropertyChangeMask | \ +#define ROOT_EVENTMASK (StructureNotifyMask | PropertyChangeMask | \ EnterWindowMask | LeaveWindowMask | \ SubstructureNotifyMask | SubstructureRedirectMask | \ ButtonPressMask | ButtonReleaseMask | ButtonMotionMask) @@ -159,7 +162,8 @@ void screen_startup() guint i; /* get the initial size */ - screen_resize(); + screen_resize(WidthOfScreen(ScreenOfDisplay(ob_display, ob_screen)), + HeightOfScreen(ScreenOfDisplay(ob_display, ob_screen))); /* set the names */ screen_desktop_names = g_new(char*, @@ -173,8 +177,10 @@ void screen_startup() screen_num_desktops = 0; screen_set_num_desktops(config_desktops_num); - screen_desktop = 0; - screen_set_desktop(0); + if (startup_desktop >= screen_num_desktops) + startup_desktop = 0; + screen_desktop = startup_desktop; + screen_set_desktop(startup_desktop); /* don't start in showing-desktop mode */ screen_showing_desktop = FALSE; @@ -198,14 +204,14 @@ void screen_shutdown() g_free(area); } -void screen_resize() +void screen_resize(int w, int h) { - /* XXX RandR support here? */ + GList *it; guint32 geometry[2]; /* Set the _NET_DESKTOP_GEOMETRY hint */ - geometry[0] = WidthOfScreen(ScreenOfDisplay(ob_display, ob_screen)); - geometry[1] = HeightOfScreen(ScreenOfDisplay(ob_display, ob_screen)); + geometry[0] = w; + geometry[1] = h; PROP_SETA32(ob_root, net_desktop_geometry, cardinal, geometry, 2); screen_physical_size.width = geometry[0]; screen_physical_size.height = geometry[1]; @@ -213,9 +219,11 @@ void screen_resize() if (ob_state == State_Starting) return; + dock_configure(); screen_update_struts(); - /* XXX adjust more stuff ? */ + for (it = client_list; it; it = it->next) + client_move_onscreen(it->data); } void screen_set_num_desktops(guint num) @@ -235,9 +243,6 @@ void screen_set_num_desktops(guint num) PROP_SETA32(ob_root, net_desktop_viewport, cardinal, viewport, num * 2); g_free(viewport); - /* change our struts/area to match */ - screen_update_struts(); - /* the number of rows/columns will differ */ screen_update_layout(); @@ -257,10 +262,13 @@ void screen_set_num_desktops(guint num) /* move windows on desktops that will no longer exist! */ for (it = client_list; it != NULL; it = it->next) { Client *c = it->data; - if (c->desktop >= num) + if (c->desktop >= num && c->desktop != DESKTOP_ALL) client_set_desktop(c, num - 1, FALSE); } + /* change our struts/area to match (after moving windows) */ + screen_update_struts(); + dispatch_ob(Event_Ob_NumDesktops, num, old); /* change our desktop if we're on one that no longer exists! */ @@ -288,21 +296,24 @@ void screen_set_desktop(guint num) /* show windows from top to bottom */ for (it = stacking_list; it != NULL; it = it->next) { - Client *c = it->data; - if (!c->frame->visible && client_should_show(c)) - frame_show(c->frame); + if (WINDOW_IS_CLIENT(it->data)) { + Client *c = it->data; + if (!c->frame->visible && client_should_show(c)) + frame_show(c->frame); + } } /* hide windows from bottom to top */ for (it = g_list_last(stacking_list); it != NULL; it = it->prev) { - Client *c = it->data; - if (c->frame->visible && !client_should_show(c)) - frame_hide(c->frame); + if (WINDOW_IS_CLIENT(it->data)) { + Client *c = it->data; + if (c->frame->visible && !client_should_show(c)) + frame_hide(c->frame); + } } /* focus the last focused window on the desktop, and ignore enter events from the switch so it doesnt mess with the focus */ - XSync(ob_display, FALSE); while (XCheckTypedEvent(ob_display, EnterNotify, &e)); focus_fallback(Fallback_Desktop); @@ -411,19 +422,33 @@ void screen_show_desktop(gboolean show) if (show) { /* bottom to top */ for (it = g_list_last(stacking_list); it != NULL; it = it->prev) { - Client *client = it->data; - if (client->frame->visible && !client_should_show(client)) - frame_hide(client->frame); + if (WINDOW_IS_CLIENT(it->data)) { + Client *client = it->data; + if (client->frame->visible && !client_should_show(client)) + frame_hide(client->frame); + } } } else { /* top to bottom */ for (it = stacking_list; it != NULL; it = it->next) { - Client *client = it->data; - if (!client->frame->visible && client_should_show(client)) - frame_show(client->frame); + if (WINDOW_IS_CLIENT(it->data)) { + Client *client = it->data; + if (!client->frame->visible && client_should_show(client)) + frame_show(client->frame); + } } } + if (show) { + /* focus desktop */ + for (it = focus_order[screen_desktop]; it; it = it->next) + if (((Client*)it->data)->type == Type_Desktop && + client_focus(it->data)) + break; + } else { + focus_fallback(Fallback_NoFocus); + } + show = !!show; /* make it boolean */ PROP_SET32(ob_root, net_showing_desktop, cardinal, show); @@ -472,6 +497,10 @@ void screen_update_struts() /* apply to the 'all desktops' strut */ STRUT_ADD(strut[screen_num_desktops], c->strut); } + + for (i = 0; i < screen_num_desktops; ++i) + STRUT_ADD(strut[i], dock_strut); + screen_update_area(); }