changes to the timer api, pass the timer to the callback function.
authorDana Jansens <danakj@orodu.net>
Sat, 9 Aug 2003 04:56:12 +0000 (04:56 +0000)
committerDana Jansens <danakj@orodu.net>
Sat, 9 Aug 2003 04:56:12 +0000 (04:56 +0000)
add a desktop-switch popup with the desktop's name

openbox/focus.c
openbox/popup.c
openbox/popup.h
openbox/screen.c
openbox/timer.c
openbox/timer.h
plugins/keyboard/keyboard.c
plugins/menu/timed_menu.c

index dfa9c42..1642261 100644 (file)
 #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()
 {
@@ -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)
index cc4a605..0a96170 100644 (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);
 }
 
+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;
index 3707c8c..e06217e 100644 (file)
@@ -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);
 
index 5d87162..4f9e6a2 100644 (file)
@@ -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;
index b49f4de..33f4bab 100644 (file)
@@ -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);
 
index 549490c..aa26c98 100644 (file)
@@ -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
 {
index a583a2e..1597b06 100644 (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();
 }
index 3bf820a..844a564 100644 (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;
     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;
 }