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>
|
#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)
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
{
|
{
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue