supported[i++] = prop_atoms.net_moveresize_window;
supported[i++] = prop_atoms.net_wm_moveresize;
supported[i++] = prop_atoms.net_wm_user_time;
+ supported[i++] = prop_atoms.net_wm_user_time_window;
supported[i++] = prop_atoms.net_frame_extents;
+ supported[i++] = prop_atoms.net_request_frame_extents;
+ supported[i++] = prop_atoms.net_restack_window;
supported[i++] = prop_atoms.net_startup_id;
#ifdef SYNC
supported[i++] = prop_atoms.net_wm_sync_request;
void screen_startup(gboolean reconfig)
{
- if (!reconfig) {
- guint i, numnames;
- gchar **names;
- GSList *it;
+ guint i, numnames;
+ gchar **names;
+ GSList *it;
+ guint32 d;
- /* get the initial size */
- screen_resize();
+ desktop_cycle_popup = pager_popup_new(FALSE);
+ pager_popup_height(desktop_cycle_popup, POPUP_HEIGHT);
- /* 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))
- names[i] = g_strdup(it->data);
+ if (reconfig)
+ return;
- /* set the root window property */
- PROP_SETSS(RootWindow(ob_display, ob_screen), net_desktop_names,names);
+ /* get the initial size */
+ screen_resize();
- g_strfreev(names);
- }
+ /* 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))
+ names[i] = g_strdup(it->data);
- desktop_cycle_popup = pager_popup_new(FALSE);
- pager_popup_height(desktop_cycle_popup, POPUP_HEIGHT);
+ /* set the root window property */
+ PROP_SETSS(RootWindow(ob_display, ob_screen), net_desktop_names,names);
+
+ g_strfreev(names);
- if (!reconfig)
- screen_num_desktops = 0;
+ /* 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);
+
+ /* 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();
- }
+ screen_update_layout();
}
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;
+
+ XSelectInput(ob_display, RootWindow(ob_display, ob_screen),
+ NoEventMask);
- /* 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);
+ /* 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);
- }
+ 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);
}
}
+ /* have to try focus here because when you leave an empty desktop
+ there is no focus out to watch for
+
+ do this before hiding the windows so if helper windows are coming
+ with us, they don't get hidden
+ */
+ if (dofocus && (c = focus_fallback_target(TRUE, focus_client))) {
+ /* only do the flicker reducing stuff ahead of time if we are going
+ to call xsetinputfocus on the window ourselves. otherwise there is
+ no guarantee the window will actually take focus.. */
+ if (c->can_focus) {
+ /* do this here so that if you switch desktops to a window with
+ helper windows then the helper windows won't flash */
+ client_bring_helper_windows(c);
+ /* reduce flicker by hiliting now rather than waiting for the
+ server FocusIn event */
+ frame_adjust_focus(c->frame, TRUE);
+ }
+ client_focus(c);
+ }
+
/* hide windows from bottom to top */
for (it = g_list_last(stacking_list); it; it = g_list_previous(it)) {
if (WINDOW_IS_CLIENT(it->data)) {
}
}
- /* have to try focus here because when you leave an empty desktop
- there is no focus out to watch for */
- if (dofocus && (c = focus_fallback_target(TRUE, focus_client))) {
- /* reduce flicker by hiliting now rather than waiting for the server
- FocusIn event */
- frame_adjust_focus(c->frame, TRUE);
- client_focus(c);
- }
-
event_ignore_queued_enters();
if (event_curtime != CurrentTime)
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_icon_size_multiplier(desktop_cycle_popup,
+ (screen_desktop_layout.columns /
+ screen_desktop_layout.rows) / 2,
+ (screen_desktop_layout.rows/
+ screen_desktop_layout.columns) / 2);
pager_popup_max_width(desktop_cycle_popup,
MAX(a->width/3, POPUP_WIDTH));
pager_popup_show(desktop_cycle_popup, screen_desktop_names[d], d);
guint screen_cycle_desktop(ObDirection dir, gboolean wrap, gboolean linear,
gboolean dialog, gboolean done, gboolean cancel)
{
- static gboolean first = TRUE;
- static guint origd, d;
guint r, c;
+ static guint d = (guint)-1;
+ guint ret;
- if (cancel) {
- d = origd;
- goto done_cycle;
- } else if (done && dialog) {
- goto done_cycle;
- }
- if (first) {
- first = FALSE;
- d = origd = screen_desktop;
- }
+ if (d == (guint)-1)
+ d = screen_desktop;
+
+ if ((cancel || done) && dialog)
+ goto show_cycle_dialog;
get_row_col(d, &r, &c);
}
show_cycle_dialog:
- if (dialog) {
+ if (dialog && !cancel && !done) {
screen_desktop_popup(d, TRUE);
- return d;
- }
-
-done_cycle:
- first = TRUE;
+ } else
+ screen_desktop_popup(0, FALSE);
+ ret = d;
- screen_desktop_popup(0, FALSE);
+ if (!dialog || cancel || done)
+ d = (guint)-1;
- return d;
+ return ret;
}
void screen_update_layout()
Window w;
gint i;
guint u;
-
- return !!XQueryPointer(ob_display, RootWindow(ob_display, ob_screen),
- &w, &w, x, y, &i, &i, &u);
+ gboolean ret;
+
+ ret = !!XQueryPointer(ob_display, RootWindow(ob_display, ob_screen),
+ &w, &w, x, y, &i, &i, &u);
+ if (!ret) {
+ for (i = 0; i < ScreenCount(ob_display); ++i)
+ if (i != ob_screen)
+ if (XQueryPointer(ob_display, RootWindow(ob_display, i),
+ &w, &w, x, y, &i, &i, &u))
+ break;
+ }
+ return ret;
}