#include <assert.h>
ObClient *focus_client;
-GList **focus_order = NULL; /* these lists are created when screen_startup
- sets the number of desktops */
+GList **focus_order; /* these lists are created when screen_startup
+ sets the number of desktops */
-static ObClient *focus_cycle_target = NULL;
-static Popup *focus_cycle_popup = NULL;
+static ObClient *focus_cycle_target;
+static Popup *focus_cycle_popup;
void focus_startup()
{
*/
/* XXX the size and the font extents need to be related on some level
*/
- popup_size(focus_cycle_popup, 320, 48);
+ popup_size(focus_cycle_popup, POPUP_WIDTH, POPUP_HEIGHT);
/* use the transient's parent's title/icon */
while (p->transient_for && p->transient_for != OB_TRAN_GROUP)
self->w = textw + iconw + ob_rr_theme->bevel * (self->hasicon ? 3 : 2);
}
+void popup_set_text_align(Popup *self, RrJustify align)
+{
+ if (!self->a_text)
+ self->a_text = RrAppearanceCopy(ob_rr_theme->app_hilite_label);
+
+ self->a_text->texture[0].data.text.justify = align;
+}
+
void popup_show(Popup *self, gchar *text, ObClientIcon *icon)
{
gint x, y, w, h;
#define __popup_h
#include <glib.h>
+#include "render/render.h"
struct _ObClientIcon;
+#define POPUP_WIDTH 320
+#define POPUP_HEIGHT 48
+
typedef struct _ObPopup Popup;
Popup *popup_new(gboolean hasicon);
void popup_size(Popup *self, gint w, gint h);
void popup_size_to_string(Popup *self, gchar *text);
+void popup_set_text_align(Popup *self, RrJustify align);
+
void popup_show(Popup *self, gchar *text, struct _ObClientIcon *icon);
void popup_hide(Popup *self);
#include "client.h"
#include "frame.h"
#include "focus.h"
+#include "popup.h"
#include "dispatch.h"
#include "extensions.h"
#include "render/render.h"
static Rect **area; /* array of desktop holding array of xinerama areas */
static Rect *monitor_area;
+static Popup *desktop_cycle_popup;
+static ObTimer *popup_timer = NULL;
+
#ifdef USE_LIBSN
static SnMonitorContext *sn_context;
static int sn_busy_cnt;
GSList *it;
guint i;
+ desktop_cycle_popup = popup_new(FALSE);
+
/* get the initial size */
screen_resize();
{
Rect **r;
+ popup_free(desktop_cycle_popup);
+
XSelectInput(ob_display, RootWindow(ob_display, ob_screen), NoEventMask);
/* we're not running here no more! */
screen_set_desktop(num - 1);
}
+static void popup_cycle_hide(ObTimer *t, void *d)
+{
+ timer_stop(t);
+ popup_timer = NULL;
+
+ popup_hide(desktop_cycle_popup);
+}
+
+static void popup_cycle_show()
+{
+ Rect *a;
+
+ a = screen_physical_area_monitor(0);
+ popup_position(desktop_cycle_popup, CenterGravity,
+ a->x + a->width / 2, a->y + a->height / 2);
+ /* XXX the size and the font extents need to be related on some level
+ */
+ popup_size(desktop_cycle_popup, POPUP_WIDTH, POPUP_HEIGHT);
+
+ popup_set_text_align(desktop_cycle_popup, RR_JUSTIFY_CENTER);
+
+ popup_show(desktop_cycle_popup,
+ screen_desktop_names[screen_desktop], NULL);
+
+ g_message("%s", screen_desktop_names[screen_desktop]);
+
+ if (popup_timer) timer_stop(popup_timer);
+ popup_timer = timer_start(G_USEC_PER_SEC / 2, popup_cycle_hide, NULL);
+}
+
void screen_set_desktop(guint num)
{
GList *it;
ob_debug("/switch fallback\n");
#endif
+ if (ob_state() == OB_STATE_RUNNING)
+ popup_cycle_show();
+
dispatch_ob(Event_Ob_Desktop, num, old);
}
}
#ifdef USE_LIBSN
-static void sn_timeout(void *data)
+static void sn_timeout(ObTimer *t, void *data)
{
timer_stop(sn_timer);
sn_timer = NULL;
self->action = cb;
self->data = data;
self->del_me = FALSE;
+ g_get_current_time(&now);
self->last = self->timeout = now;
g_time_val_add(&self->timeout, delay);
*/
timers = g_slist_delete_link(timers, timers);
g_time_val_add(&curr->last, curr->delay);
- curr->action(curr->data);
+ curr->action(curr, curr->data);
g_time_val_add(&curr->timeout, curr->delay);
insert_timer(curr);
typedef struct _ObTimer ObTimer;
/*! Data type of Timer callback */
-typedef void (*ObTimeoutHandler)(void *data);
+typedef void (*ObTimeoutHandler)(ObTimer *t, void *data);
struct _ObTimer
{
}
}
-static void chain_timeout(void *data)
+static void chain_timeout(ObTimer *t, void *data)
{
reset_chains();
}
}
}
-void timed_menu_timeout_handler(void *d)
+void timed_menu_timeout_handler(ObTimer *t, void *d)
{
ObMenu *data = d;
if (!data->shown && TIMED_MENU_DATA(data)->fd == -1) {
m->plugin_data = (void *)d;
- timed_menu_timeout_handler(m);
+ timed_menu_timeout_handler(NULL, m);
return (void *)m;
}