X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fscreen.c;h=85bf036d44b488f13a62e3fb659721507bffe07b;hb=6e93be1d2e07ace0c21bc040cfb2e4890667d033;hp=6a300d891a85fa66ed9288d93a32da97220603d6;hpb=7e9ad375873a94f89b3894814ed61b0e24bd45a5;p=chaz%2Fopenbox diff --git a/openbox/screen.c b/openbox/screen.c index 6a300d89..85bf036d 100644 --- a/openbox/screen.c +++ b/openbox/screen.c @@ -1,7 +1,9 @@ #include "openbox.h" -#include "slit.h" +#include "dock.h" +#include "xerror.h" #include "prop.h" #include "startup.h" +#include "timer.h" #include "config.h" #include "screen.h" #include "client.h" @@ -11,6 +13,11 @@ #include "extensions.h" #include "../render/render.h" +#ifdef USE_LIBSN +# define SN_API_NOT_YET_FROZEN +# include +#endif + #include #ifdef HAVE_UNISTD_H # include @@ -34,7 +41,16 @@ static Rect *area = NULL; static Strut *strut = NULL; static Window support_window = None; +#ifdef USE_LIBSN +static SnMonitorContext *sn_context; +static int sn_busy_cnt; +static Timer *sn_timer = NULL; + +static void sn_event_func(SnMonitorEvent *event, void *data); +#endif + static void screen_update_area(); +static void set_root_cursor(); static gboolean running; static int another_running(Display *d, XErrorEvent *e) @@ -63,8 +79,7 @@ gboolean screen_annex() g_message("Managing screen %d", ob_screen); - /* set the mouse cursor for the root window (the default cursor) */ - XDefineCursor(ob_display, ob_root, ob_cursors.ptr); + set_root_cursor(); /* set the OPENBOX_PID hint */ pid = getpid(); @@ -77,7 +92,7 @@ gboolean screen_annex() PROP_SET32(ob_root, net_supporting_wm_check, window, support_window); /* set properties on the supporting window */ - PROP_SETS(support_window, net_wm_name, "Openbox"); + PROP_SETS(support_window, net_wm_name, "Openbox3"); PROP_SET32(support_window, net_supporting_wm_check, window,support_window); /* set the _NET_SUPPORTED_ATOMS hint */ @@ -187,6 +202,12 @@ void screen_startup() PROP_SET32(ob_root, net_showing_desktop, cardinal, screen_showing_desktop); screen_update_layout(); + +#ifdef USE_LIBSN + sn_context = sn_monitor_context_new(ob_sn_display, ob_screen, + sn_event_func, NULL, NULL); + sn_busy_cnt = 0; +#endif } void screen_shutdown() @@ -219,7 +240,7 @@ void screen_resize(int w, int h) if (ob_state == State_Starting) return; - slit_configure_all(); + dock_configure(); screen_update_struts(); for (it = client_list; it; it = it->next) @@ -315,7 +336,9 @@ void screen_set_desktop(guint num) /* focus the last focused window on the desktop, and ignore enter events from the switch so it doesnt mess with the focus */ while (XCheckTypedEvent(ob_display, EnterNotify, &e)); + g_message("switch fallback"); focus_fallback(Fallback_Desktop); + g_message("/switch fallback"); dispatch_ob(Event_Ob_Desktop, num, old); } @@ -467,10 +490,12 @@ void screen_install_colormap(Client *client, gboolean install) } else { if (XGetWindowAttributes(ob_display, client->window, &wa) && wa.colormap != None) { + xerror_set_ignore(TRUE); if (install) XInstallColormap(ob_display, wa.colormap); else XUninstallColormap(ob_display, wa.colormap); + xerror_set_ignore(FALSE); } } } @@ -497,6 +522,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(); } @@ -554,11 +583,11 @@ static void screen_update_area() Client *c = it->data; if (i < screen_num_desktops) { if (c->desktop == i) - client_remaximize(c); + client_reconfigure(c); } else { /* the 'all desktops' size */ if (c->desktop == DESKTOP_ALL) - client_remaximize(c); + client_reconfigure(c); } } } @@ -595,3 +624,68 @@ Strut *screen_strut(guint desktop) } return &strut[desktop]; } + +static void set_root_cursor() +{ +#ifdef USE_LIBSN + if (sn_busy_cnt) + XDefineCursor(ob_display, ob_root, ob_cursors.busy); + else +#endif + XDefineCursor(ob_display, ob_root, ob_cursors.ptr); +} + +#ifdef USE_LIBSN +static void sn_timeout(void *data) +{ + timer_stop(sn_timer); + sn_timer = NULL; + sn_busy_cnt = 0; + + set_root_cursor(); +} + +static void sn_event_func(SnMonitorEvent *ev, void *data) +{ + SnStartupSequence *seq; + const char *seq_id, *bin_name; + int cnt = sn_busy_cnt; + + if (!(seq = sn_monitor_event_get_startup_sequence(ev))) + return; + + seq_id = sn_startup_sequence_get_id(seq); + bin_name = sn_startup_sequence_get_binary_name(seq); + + if (!(seq_id && bin_name)) + return; + + switch (sn_monitor_event_get_type(ev)) { + case SN_MONITOR_EVENT_INITIATED: + ++sn_busy_cnt; + if (sn_timer) + timer_stop(sn_timer); + /* 30 second timeout for apps to start */ + sn_timer = timer_start(30 * 1000000, sn_timeout, NULL); + break; + case SN_MONITOR_EVENT_CHANGED: + break; + case SN_MONITOR_EVENT_COMPLETED: + if (sn_busy_cnt) --sn_busy_cnt; + if (sn_timer) { + timer_stop(sn_timer); + sn_timer = NULL; + } + break; + case SN_MONITOR_EVENT_CANCELED: + if (sn_busy_cnt) --sn_busy_cnt; + if (sn_timer) { + timer_stop(sn_timer); + sn_timer = NULL; + } + }; + + if (sn_busy_cnt != cnt) + set_root_cursor(); +} +#endif