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:
parent
356318b562
commit
79e189dbac
8 changed files with 67 additions and 11 deletions
|
@ -19,11 +19,11 @@
|
|||
#include <assert.h>
|
||||
|
||||
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 */
|
||||
|
||||
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()
|
||||
{
|
||||
|
@ -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
|
||||
*/
|
||||
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)
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
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;
|
||||
|
|
|
@ -2,9 +2,13 @@
|
|||
#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);
|
||||
|
@ -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_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);
|
||||
|
||||
|
|
|
@ -10,6 +10,7 @@
|
|||
#include "client.h"
|
||||
#include "frame.h"
|
||||
#include "focus.h"
|
||||
#include "popup.h"
|
||||
#include "dispatch.h"
|
||||
#include "extensions.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 *monitor_area;
|
||||
|
||||
static Popup *desktop_cycle_popup;
|
||||
static ObTimer *popup_timer = NULL;
|
||||
|
||||
#ifdef USE_LIBSN
|
||||
static SnMonitorContext *sn_context;
|
||||
static int sn_busy_cnt;
|
||||
|
@ -274,6 +278,8 @@ void screen_startup()
|
|||
GSList *it;
|
||||
guint i;
|
||||
|
||||
desktop_cycle_popup = popup_new(FALSE);
|
||||
|
||||
/* get the initial size */
|
||||
screen_resize();
|
||||
|
||||
|
@ -313,6 +319,8 @@ void screen_shutdown()
|
|||
{
|
||||
Rect **r;
|
||||
|
||||
popup_free(desktop_cycle_popup);
|
||||
|
||||
XSelectInput(ob_display, RootWindow(ob_display, ob_screen), NoEventMask);
|
||||
|
||||
/* we're not running here no more! */
|
||||
|
@ -412,6 +420,36 @@ void screen_set_num_desktops(guint num)
|
|||
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;
|
||||
|
@ -460,6 +498,9 @@ void screen_set_desktop(guint num)
|
|||
ob_debug("/switch fallback\n");
|
||||
#endif
|
||||
|
||||
if (ob_state() == OB_STATE_RUNNING)
|
||||
popup_cycle_show();
|
||||
|
||||
dispatch_ob(Event_Ob_Desktop, num, old);
|
||||
}
|
||||
|
||||
|
@ -846,7 +887,7 @@ static void set_root_cursor()
|
|||
}
|
||||
|
||||
#ifdef USE_LIBSN
|
||||
static void sn_timeout(void *data)
|
||||
static void sn_timeout(ObTimer *t, void *data)
|
||||
{
|
||||
timer_stop(sn_timer);
|
||||
sn_timer = NULL;
|
||||
|
|
|
@ -56,6 +56,7 @@ ObTimer *timer_start(long delay, ObTimeoutHandler cb, void *data)
|
|||
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);
|
||||
|
||||
|
@ -117,7 +118,7 @@ void timer_dispatch(GTimeVal **wait)
|
|||
*/
|
||||
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);
|
||||
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
typedef struct _ObTimer ObTimer;
|
||||
|
||||
/*! Data type of Timer callback */
|
||||
typedef void (*ObTimeoutHandler)(void *data);
|
||||
typedef void (*ObTimeoutHandler)(ObTimer *t, void *data);
|
||||
|
||||
struct _ObTimer
|
||||
{
|
||||
|
|
|
@ -121,7 +121,7 @@ static void reset_chains()
|
|||
}
|
||||
}
|
||||
|
||||
static void chain_timeout(void *data)
|
||||
static void chain_timeout(ObTimer *t, void *data)
|
||||
{
|
||||
reset_chains();
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
if (!data->shown && TIMED_MENU_DATA(data)->fd == -1) {
|
||||
|
@ -231,7 +231,7 @@ void *plugin_create(PluginMenuCreateData *data)
|
|||
|
||||
m->plugin_data = (void *)d;
|
||||
|
||||
timed_menu_timeout_handler(m);
|
||||
timed_menu_timeout_handler(NULL, m);
|
||||
return (void *)m;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue