#include "obrender/render.h"
#include "gettext.h"
#include "obt/display.h"
+#include "obt/xqueue.h"
#include "obt/prop.h"
#include "obt/mainloop.h"
current_wm_sn_owner = None;
}
- timestamp = event_get_server_time();
+ timestamp = event_time();
XSetSelectionOwner(obt_display, wm_sn_atom, screen_support_win,
timestamp);
/* 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;
supported[i++] = OBT_PROP_ATOM(OB_CONTROL);
supported[i++] = OBT_PROP_ATOM(OB_VERSION);
supported[i++] = OBT_PROP_ATOM(OB_APP_ROLE);
+ supported[i++] = OBT_PROP_ATOM(OB_APP_TITLE);
supported[i++] = OBT_PROP_ATOM(OB_APP_NAME);
supported[i++] = OBT_PROP_ATOM(OB_APP_CLASS);
supported[i++] = OBT_PROP_ATOM(OB_APP_TYPE);
/* 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);
}
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)
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;
g_direct_equal, NULL);
if (perm)
desktop_popup_perm = TRUE;
-
- g_free(a);
}
void screen_hide_desktop_popup(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 */
} ObScreenStrut;
#define RESET_STRUT_LIST(sl) \
- (g_slist_free(sl), sl = NULL)
+ while (sl) { \
+ g_slice_free(ObScreenStrut, (sl)->data); \
+ sl = g_slist_delete_link(sl, sl); \
+ }
#define ADD_STRUT_TO_LIST(sl, d, s) \
{ \
- ObScreenStrut *ss = g_new(ObScreenStrut, 1); \
+ ObScreenStrut *ss = g_slice_new(ObScreenStrut); \
ss->desktop = d; \
ss->strut = s; \
sl = g_slist_prepend(sl, ss); \
{
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);
dims[i*4+1] = area->y;
dims[i*4+2] = area->width;
dims[i*4+3] = area->height;
- g_free(area);
+ g_slice_free(Rect, area);
}
/* set the legacy workarea hint to the union of all the monitors */
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);
}
}
}
- a = g_new(Rect, 1);
+ a = g_slice_new(Rect);
a->x = l;
a->y = t;
a->width = r - l + 1;
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;
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)
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());
}
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));
}