X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fscreen.c;h=353d2de077fbe2b4e59b146ca2d7d5580f75d7a6;hb=fd77a0a7b3f892925f203287b8b46c6ec9be94ea;hp=0bd56591e778d13d7cb09d52ce788773020c3cba;hpb=1d57f7b08590255e57dd5931a1993507b4f116c2;p=chaz%2Fopenbox diff --git a/openbox/screen.c b/openbox/screen.c index 0bd56591..353d2de0 100644 --- a/openbox/screen.c +++ b/openbox/screen.c @@ -36,8 +36,8 @@ #include "obrender/render.h" #include "gettext.h" #include "obt/display.h" +#include "obt/xqueue.h" #include "obt/prop.h" -#include "obt/mainloop.h" #include #ifdef HAVE_UNISTD_H @@ -70,6 +70,7 @@ Time screen_desktop_user_time = CurrentTime; static Size screen_physical_size; static guint screen_old_desktop; static gboolean screen_desktop_timeout = TRUE; +static guint screen_desktop_timer = 0; /*! An array of desktops, holding an array of areas per monitor */ static Rect *monitor_area = NULL; /*! An array of desktops, holding an array of struts */ @@ -79,11 +80,12 @@ static GSList *struts_right = NULL; static GSList *struts_bottom = NULL; static ObPagerPopup *desktop_popup; +static guint desktop_popup_timer = 0; static gboolean desktop_popup_perm; /*! The number of microseconds that you need to be on a desktop before it will replace the remembered "last desktop" */ -#define REMEMBER_LAST_DESKTOP_TIME 750000 +#define REMEMBER_LAST_DESKTOP_TIME 750 static gboolean replace_wm(void) { @@ -116,7 +118,7 @@ static gboolean replace_wm(void) current_wm_sn_owner = None; } - timestamp = event_get_server_time(); + timestamp = event_time(); XSetSelectionOwner(obt_display, wm_sn_atom, screen_support_win, timestamp); @@ -129,14 +131,16 @@ static gboolean replace_wm(void) /* Wait for old window manager to go away */ if (current_wm_sn_owner) { - XEvent event; gulong wait = 0; const gulong timeout = G_USEC_PER_SEC * 15; /* wait for 15s max */ + ObtXQueueWindowType wt; + + wt.window = current_wm_sn_owner; + wt.type = DestroyNotify; while (wait < timeout) { - if (XCheckWindowEvent(obt_display, current_wm_sn_owner, - StructureNotifyMask, &event) && - event.type == DestroyNotify) + /* Checks the local queue and incoming events for this event */ + if (xqueue_exists_local(xqueue_match_window_type, &wt)) break; g_usleep(G_USEC_PER_SEC / 10); wait += G_USEC_PER_SEC / 10; @@ -393,7 +397,7 @@ void screen_startup(gboolean reconfig) /* set the root window property */ OBT_PROP_SETSS(obt_root(ob_screen), - NET_DESKTOP_NAMES, utf8, (const gchar**)names); + NET_DESKTOP_NAMES, utf8, (const gchar*const*)names); g_strfreev(names); } @@ -598,7 +602,8 @@ static void screen_fallback_focus(void) static gboolean last_desktop_func(gpointer data) { screen_desktop_timeout = TRUE; - return FALSE; + screen_desktop_timer = 0; + return FALSE; /* don't repeat */ } void screen_set_desktop(guint num, gboolean dofocus) @@ -680,9 +685,9 @@ void screen_set_desktop(guint num, gboolean dofocus) } } screen_desktop_timeout = FALSE; - obt_main_loop_timeout_remove(ob_main_loop, last_desktop_func); - obt_main_loop_timeout_add(ob_main_loop, REMEMBER_LAST_DESKTOP_TIME, - last_desktop_func, NULL, NULL, NULL); + if (screen_desktop_timer) g_source_remove(screen_desktop_timer); + screen_desktop_timer = g_timeout_add(REMEMBER_LAST_DESKTOP_TIME, + last_desktop_func, NULL); ob_debug("Moving to desktop %d", num+1); @@ -731,8 +736,8 @@ void screen_set_desktop(guint num, gboolean dofocus) event_end_ignore_all_enters(ignore_start); - if (event_curtime != CurrentTime) - screen_desktop_user_time = event_curtime; + if (event_source_time() != CurrentTime) + screen_desktop_user_time = event_source_time(); } void screen_add_desktop(gboolean current) @@ -934,12 +939,13 @@ static guint translate_row_col(guint r, guint c) static gboolean hide_desktop_popup_func(gpointer data) { pager_popup_hide(desktop_popup); + desktop_popup_timer = 0; return FALSE; /* don't repeat */ } void screen_show_desktop_popup(guint d, gboolean perm) { - Rect *a; + const Rect *a; /* 0 means don't show the popup */ if (!config_desktop_popup_time) return; @@ -956,23 +962,21 @@ void screen_show_desktop_popup(guint d, gboolean perm) MAX(a->width/3, POPUP_WIDTH)); pager_popup_show(desktop_popup, screen_desktop_names[d], d); - obt_main_loop_timeout_remove(ob_main_loop, hide_desktop_popup_func); + if (desktop_popup_timer) g_source_remove(desktop_popup_timer); + desktop_popup_timer = 0; if (!perm && !desktop_popup_perm) /* only hide if its not already being show permanently */ - obt_main_loop_timeout_add(ob_main_loop, - config_desktop_popup_time * 1000, - hide_desktop_popup_func, desktop_popup, - g_direct_equal, NULL); + desktop_popup_timer = g_timeout_add(config_desktop_popup_time, + hide_desktop_popup_func, + desktop_popup); if (perm) desktop_popup_perm = TRUE; - - g_free(a); } void screen_hide_desktop_popup(void) { - obt_main_loop_timeout_remove_data(ob_main_loop, hide_desktop_popup_func, - desktop_popup, FALSE); + if (desktop_popup_timer) g_source_remove(desktop_popup_timer); + desktop_popup_timer = 0; pager_popup_hide(desktop_popup); desktop_popup_perm = FALSE; } @@ -1205,7 +1209,7 @@ void screen_update_desktop_names(void) /* if we changed any names, then set the root property so we can all agree on the names */ OBT_PROP_SETSS(obt_root(ob_screen), NET_DESKTOP_NAMES, - utf8, (const gchar**)screen_desktop_names); + utf8, (const gchar*const*)screen_desktop_names); } /* resize the pager for these names */ @@ -1373,7 +1377,14 @@ void screen_update_areas(void) { guint i; gulong *dims; - GList *it; + GList *it, *onscreen; + + /* collect the clients that are on screen */ + onscreen = NULL; + for (it = client_list; it; it = g_list_next(it)) { + if (client_monitor(it->data) != screen_num_monitors) + onscreen = g_list_prepend(onscreen, it->data); + } g_free(monitor_area); get_xinerama_screens(&monitor_area, &screen_num_monitors); @@ -1447,8 +1458,10 @@ void screen_update_areas(void) dims, 4 * screen_num_desktops); /* the area has changed, adjust all the windows if they need it */ - for (it = client_list; it; it = g_list_next(it)) + for (it = onscreen; it; it = g_list_next(it)) { + client_move_onscreen(it->data, FALSE); client_reconfigure(it->data, FALSE); + } g_free(dims); } @@ -1619,14 +1632,14 @@ Rect* screen_area(guint desktop, guint head, Rect *search) return a; } -guint screen_find_monitor(Rect *search) +guint screen_find_monitor(const Rect *search) { guint i; guint most = screen_num_monitors; guint mostv = 0; for (i = 0; i < screen_num_monitors; ++i) { - Rect *area = screen_physical_area_monitor(i); + const Rect *area = screen_physical_area_monitor(i); if (RECT_INTERSECTS_RECT(*area, *search)) { Rect r; guint v; @@ -1639,24 +1652,20 @@ guint screen_find_monitor(Rect *search) most = i; } } - g_free(area); } return most; } -Rect* screen_physical_area_all_monitors(void) +const Rect* screen_physical_area_all_monitors(void) { return screen_physical_area_monitor(screen_num_monitors); } -Rect* screen_physical_area_monitor(guint head) +const Rect* screen_physical_area_monitor(guint head) { - Rect *a; g_assert(head <= screen_num_monitors); - a = g_new(Rect, 1); - *a = monitor_area[head]; - return a; + return &monitor_area[head]; } gboolean screen_physical_area_monitor_contains(guint head, Rect *search) @@ -1676,7 +1685,7 @@ guint screen_monitor_active(void) return screen_monitor_pointer(); } -Rect* screen_physical_area_active(void) +const Rect* screen_physical_area_active(void) { return screen_physical_area_monitor(screen_monitor_active()); } @@ -1697,7 +1706,7 @@ guint screen_monitor_primary(gboolean fixed) return screen_monitor_pointer(); } -Rect *screen_physical_area_primary(gboolean fixed) +const Rect* screen_physical_area_primary(gboolean fixed) { return screen_physical_area_monitor(screen_monitor_primary(fixed)); }