+ if (!show) {
+ pager_popup_hide(desktop_cycle_popup);
+ } else {
+ 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)
+{
+ guint r, c;
+ static guint d = (guint)-1;
+ guint ret, oldd;
+
+ if (d == (guint)-1)
+ d = screen_desktop;
+
+ if ((cancel || done) && dialog)
+ goto show_cycle_dialog;
+
+ oldd = d;
+ get_row_col(d, &r, &c);
+
+ if (linear) {
+ switch (dir) {
+ case OB_DIRECTION_EAST:
+ if (d < screen_num_desktops - 1)
+ ++d;
+ else if (wrap)
+ d = 0;
+ break;
+ case OB_DIRECTION_WEST:
+ if (d > 0)
+ --d;
+ else if (wrap)
+ d = screen_num_desktops - 1;
+ break;
+ default:
+ assert(0);
+ return screen_desktop;
+ }
+ } else {
+ switch (dir) {
+ case OB_DIRECTION_EAST:
+ ++c;
+ if (c >= screen_desktop_layout.columns) {
+ if (wrap)
+ c = 0;
+ else
+ goto show_cycle_dialog;
+ }
+ d = translate_row_col(r, c);
+ if (d >= screen_num_desktops) {
+ if (wrap) {
+ ++c;
+ } else {
+ d = oldd;
+ goto show_cycle_dialog;
+ }
+ }
+ break;
+ case OB_DIRECTION_WEST:
+ --c;
+ if (c >= screen_desktop_layout.columns) {
+ if (wrap)
+ c = screen_desktop_layout.columns - 1;
+ else
+ goto show_cycle_dialog;
+ }
+ d = translate_row_col(r, c);
+ if (d >= screen_num_desktops) {
+ if (wrap) {
+ --c;
+ } else {
+ d = oldd;
+ goto show_cycle_dialog;
+ }
+ }
+ break;
+ case OB_DIRECTION_SOUTH:
+ ++r;
+ if (r >= screen_desktop_layout.rows) {
+ if (wrap)
+ r = 0;
+ else
+ goto show_cycle_dialog;
+ }
+ d = translate_row_col(r, c);
+ if (d >= screen_num_desktops) {
+ if (wrap) {
+ ++r;
+ } else {
+ d = oldd;
+ goto show_cycle_dialog;
+ }
+ }
+ break;
+ case OB_DIRECTION_NORTH:
+ --r;
+ if (r >= screen_desktop_layout.rows) {
+ if (wrap)
+ r = screen_desktop_layout.rows - 1;
+ else
+ goto show_cycle_dialog;
+ }
+ d = translate_row_col(r, c);
+ if (d >= screen_num_desktops) {
+ if (wrap) {
+ --r;
+ } else {
+ d = oldd;
+ goto show_cycle_dialog;
+ }
+ }
+ break;
+ default:
+ assert(0);
+ return d = screen_desktop;
+ }
+
+ d = translate_row_col(r, c);
+ }
+
+show_cycle_dialog:
+ if (dialog && !cancel && !done) {
+ screen_desktop_popup(d, TRUE);
+ } else
+ screen_desktop_popup(0, FALSE);
+ ret = d;
+
+ if (!dialog || cancel || done)
+ d = (guint)-1;
+
+ return ret;