changes to the timer api, pass the timer to the callback function.

add a desktop-switch popup with the desktop's name
This commit is contained in:
Dana Jansens 2003-08-09 04:56:12 +00:00
parent 356318b562
commit 79e189dbac
8 changed files with 67 additions and 11 deletions

View file

@ -19,11 +19,11 @@
#include <assert.h> #include <assert.h>
ObClient *focus_client; ObClient *focus_client;
GList **focus_order = NULL; /* these lists are created when screen_startup GList **focus_order; /* these lists are created when screen_startup
sets the number of desktops */ sets the number of desktops */
static ObClient *focus_cycle_target = NULL; static ObClient *focus_cycle_target;
static Popup *focus_cycle_popup = NULL; static Popup *focus_cycle_popup;
void focus_startup() void focus_startup()
{ {
@ -240,7 +240,7 @@ static void popup_cycle(ObClient *c, gboolean show)
*/ */
/* XXX the size and the font extents need to be related on some level /* 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 */ /* use the transient's parent's title/icon */
while (p->transient_for && p->transient_for != OB_TRAN_GROUP) while (p->transient_for && p->transient_for != OB_TRAN_GROUP)

View file

@ -109,6 +109,14 @@ void popup_size_to_string(Popup *self, gchar *text)
self->w = textw + iconw + ob_rr_theme->bevel * (self->hasicon ? 3 : 2); 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) void popup_show(Popup *self, gchar *text, ObClientIcon *icon)
{ {
gint x, y, w, h; gint x, y, w, h;

View file

@ -2,9 +2,13 @@
#define __popup_h #define __popup_h
#include <glib.h> #include <glib.h>
#include "render/render.h"
struct _ObClientIcon; struct _ObClientIcon;
#define POPUP_WIDTH 320
#define POPUP_HEIGHT 48
typedef struct _ObPopup Popup; typedef struct _ObPopup Popup;
Popup *popup_new(gboolean hasicon); Popup *popup_new(gboolean hasicon);
@ -21,6 +25,8 @@ void popup_position(Popup *self, gint gravity, gint x, gint y);
void popup_size(Popup *self, gint w, gint h); void popup_size(Popup *self, gint w, gint h);
void popup_size_to_string(Popup *self, gchar *text); 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_show(Popup *self, gchar *text, struct _ObClientIcon *icon);
void popup_hide(Popup *self); void popup_hide(Popup *self);

View file

@ -10,6 +10,7 @@
#include "client.h" #include "client.h"
#include "frame.h" #include "frame.h"
#include "focus.h" #include "focus.h"
#include "popup.h"
#include "dispatch.h" #include "dispatch.h"
#include "extensions.h" #include "extensions.h"
#include "render/render.h" #include "render/render.h"
@ -43,6 +44,9 @@ Window screen_support_win;
static Rect **area; /* array of desktop holding array of xinerama areas */ static Rect **area; /* array of desktop holding array of xinerama areas */
static Rect *monitor_area; static Rect *monitor_area;
static Popup *desktop_cycle_popup;
static ObTimer *popup_timer = NULL;
#ifdef USE_LIBSN #ifdef USE_LIBSN
static SnMonitorContext *sn_context; static SnMonitorContext *sn_context;
static int sn_busy_cnt; static int sn_busy_cnt;
@ -274,6 +278,8 @@ void screen_startup()
GSList *it; GSList *it;
guint i; guint i;
desktop_cycle_popup = popup_new(FALSE);
/* get the initial size */ /* get the initial size */
screen_resize(); screen_resize();
@ -313,6 +319,8 @@ void screen_shutdown()
{ {
Rect **r; Rect **r;
popup_free(desktop_cycle_popup);
XSelectInput(ob_display, RootWindow(ob_display, ob_screen), NoEventMask); XSelectInput(ob_display, RootWindow(ob_display, ob_screen), NoEventMask);
/* we're not running here no more! */ /* we're not running here no more! */
@ -412,6 +420,36 @@ void screen_set_num_desktops(guint num)
screen_set_desktop(num - 1); 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) void screen_set_desktop(guint num)
{ {
GList *it; GList *it;
@ -460,6 +498,9 @@ void screen_set_desktop(guint num)
ob_debug("/switch fallback\n"); ob_debug("/switch fallback\n");
#endif #endif
if (ob_state() == OB_STATE_RUNNING)
popup_cycle_show();
dispatch_ob(Event_Ob_Desktop, num, old); dispatch_ob(Event_Ob_Desktop, num, old);
} }
@ -846,7 +887,7 @@ static void set_root_cursor()
} }
#ifdef USE_LIBSN #ifdef USE_LIBSN
static void sn_timeout(void *data) static void sn_timeout(ObTimer *t, void *data)
{ {
timer_stop(sn_timer); timer_stop(sn_timer);
sn_timer = NULL; sn_timer = NULL;

View file

@ -56,6 +56,7 @@ ObTimer *timer_start(long delay, ObTimeoutHandler cb, void *data)
self->action = cb; self->action = cb;
self->data = data; self->data = data;
self->del_me = FALSE; self->del_me = FALSE;
g_get_current_time(&now);
self->last = self->timeout = now; self->last = self->timeout = now;
g_time_val_add(&self->timeout, delay); g_time_val_add(&self->timeout, delay);
@ -117,7 +118,7 @@ void timer_dispatch(GTimeVal **wait)
*/ */
timers = g_slist_delete_link(timers, timers); timers = g_slist_delete_link(timers, timers);
g_time_val_add(&curr->last, curr->delay); 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); g_time_val_add(&curr->timeout, curr->delay);
insert_timer(curr); insert_timer(curr);

View file

@ -6,7 +6,7 @@
typedef struct _ObTimer ObTimer; typedef struct _ObTimer ObTimer;
/*! Data type of Timer callback */ /*! Data type of Timer callback */
typedef void (*ObTimeoutHandler)(void *data); typedef void (*ObTimeoutHandler)(ObTimer *t, void *data);
struct _ObTimer struct _ObTimer
{ {

View file

@ -121,7 +121,7 @@ static void reset_chains()
} }
} }
static void chain_timeout(void *data) static void chain_timeout(ObTimer *t, void *data)
{ {
reset_chains(); reset_chains();
} }

View file

@ -124,7 +124,7 @@ void timed_menu_read_pipe(int fd, void *d)
} }
} }
void timed_menu_timeout_handler(void *d) void timed_menu_timeout_handler(ObTimer *t, void *d)
{ {
ObMenu *data = d; ObMenu *data = d;
if (!data->shown && TIMED_MENU_DATA(data)->fd == -1) { if (!data->shown && TIMED_MENU_DATA(data)->fd == -1) {
@ -231,7 +231,7 @@ void *plugin_create(PluginMenuCreateData *data)
m->plugin_data = (void *)d; m->plugin_data = (void *)d;
timed_menu_timeout_handler(m); timed_menu_timeout_handler(NULL, m);
return (void *)m; return (void *)m;
} }