Releasing debian version 0.10.0-2.
[debian/lxpanel.git] / plugins / pager.c
index 7d723da..fb560c2 100644 (file)
@@ -2,6 +2,8 @@
  *
  * Copyright (C) 2009 Dongxu Li <song6song@sourceforge.net>
  *               2012 Julien Lavergne <gilir@ubuntu.com>
+ *               2014 Andriy Grytsenko <andrej@rep.kiev.ua>
+ *               2018 number Zero <numzero@users.sf.net>
  *
  * This file is part of lxpanel.
  *
 #endif
 #include <libwnck/libwnck.h>
 
+#include "misc.h"
 #include "plugin.h"
 
+typedef struct
+{
+    WnckPager *pager;
+    gint border;
+} PagerData;
+
 /* command to configure desktop, it will be set by .config callback */
 static const char *configure_command = NULL;
 
 static void on_realize(GtkWidget *p, LXPanel *panel)
 {
-    WnckPager *pager = WNCK_PAGER(gtk_bin_get_child(GTK_BIN(p)));
-    int rows, r, h = panel_get_height(panel);
+    PagerData *d = lxpanel_plugin_get_data(p);
+    int rows, r, h = panel_get_height(panel) - 2 * d->border;
 
     /* set geometry */
-    wnck_pager_set_orientation(pager, panel_get_orientation(panel));
+    wnck_pager_set_orientation(d->pager, panel_get_orientation(panel));
     if (panel_get_orientation(panel) == GTK_ORIENTATION_VERTICAL)
         h *= ((gfloat) gdk_screen_height() / (gfloat) gdk_screen_width());
     rows = h / (panel_get_icon_size(panel) * 2) + 1; /* min */
-    r = (h - 4) / panel_get_icon_size(panel); /* max */
+    r = (h - 2) / panel_get_icon_size(panel); /* max */
     /* g_debug("pager for height %d and icon size %d: %d to %d",panel_get_height(panel),panel_get_icon_size(panel),r,rows); */
     rows = MAX(rows, r);
-    wnck_pager_set_n_rows(pager, rows);
+    wnck_pager_set_n_rows(d->pager, rows);
 }
 
 static void on_size_allocate(GtkWidget *p, GdkRectangle *allocation, LXPanel *panel)
@@ -58,24 +67,64 @@ static void on_size_allocate(GtkWidget *p, GdkRectangle *allocation, LXPanel *pa
     on_realize(p, panel);
 }
 
+static gboolean on_scroll_event(GtkWidget * p, GdkEventScroll * ev, LXPanel *panel)
+{
+    int desknum = get_net_current_desktop();
+    int desks = get_net_number_of_desktops();
+    Screen *xscreen = GDK_SCREEN_XSCREEN(gtk_widget_get_screen(p));
+
+    switch (ev->direction) {
+        case GDK_SCROLL_DOWN:
+            desknum++;
+            break;
+        case GDK_SCROLL_UP:
+            desknum--;
+            break;
+        default:
+            return FALSE;
+    }
+
+    if (desknum < 0 || desknum >= desks)
+        return TRUE;
+
+    Xclimsgx(xscreen, RootWindowOfScreen(xscreen), a_NET_CURRENT_DESKTOP, desknum, 0, 0, 0, 0);
+    return TRUE;
+}
+
 static GtkWidget *pager_constructor(LXPanel *panel, config_setting_t *settings)
 {
     GtkWidget *p, *w;
+    PagerData *d;
     int border = 1; /* NOTE: old 'pager' used 2, WnckPager has 1, need 1 more */
 
     /* FIXME: use some global setting for border */
+#if GTK_CHECK_VERSION(3, 0, 0)
+    w = wnck_pager_new();
+#else
     w = wnck_pager_new(NULL);
-    g_return_val_if_fail(w != NULL, 0);
-    p = gtk_alignment_new(0, 0, 1.0, 1.0);
+#endif
+    g_return_val_if_fail(w != NULL, NULL);
+    d = g_new(PagerData, 1);
+    d->pager = WNCK_PAGER(w);
+    d->border = border;
+    p = gtk_event_box_new();
+    gtk_widget_set_has_window(p, FALSE);
+    lxpanel_plugin_set_data(p, d, g_free);
 
     /* we cannot configure pager until it added into widgets hierarchy */
     g_signal_connect(p, "realize", G_CALLBACK(on_realize), panel);
     g_signal_connect(p, "size-allocate", G_CALLBACK(on_size_allocate), panel);
-    wnck_pager_set_display_mode(WNCK_PAGER(w), WNCK_PAGER_DISPLAY_CONTENT);
+    g_signal_connect(p, "scroll-event", G_CALLBACK(on_scroll_event), panel);
+    wnck_pager_set_display_mode(d->pager, WNCK_PAGER_DISPLAY_CONTENT);
 
     gtk_widget_show(w);
 
-    gtk_alignment_set_padding(GTK_ALIGNMENT(p), border, border, border, border);
+    /* add an additional container to setup a border */
+    w = gtk_event_box_new();
+    gtk_widget_set_has_window(w, FALSE);
+    gtk_container_set_border_width(GTK_CONTAINER(w), border);
+    gtk_container_add(GTK_CONTAINER(w), (GtkWidget*)d->pager);
+    gtk_widget_show(w);
     gtk_container_add(GTK_CONTAINER(p), w);
 
     return p;
@@ -100,7 +149,7 @@ static void pager_menu_callback(GtkWidget *widget, gpointer data)
 
 static gboolean pager_update_context_menu(GtkWidget *plugin, GtkMenu *menu)
 {
-    GdkScreen *screen = gdk_screen_get_default();
+    GdkScreen *screen = gtk_widget_get_screen(plugin);
     const char *wm_name = gdk_x11_screen_get_window_manager_name(screen);
     char *path = NULL;
 
@@ -130,6 +179,7 @@ static gboolean pager_update_context_menu(GtkWidget *plugin, GtkMenu *menu)
         /* disable 'Settings' menu item */
         gtk_container_foreach(GTK_CONTAINER(menu), pager_menu_callback, NULL);
     }
+    /* FIXME: else replace 'Settings' item label with "Launch Workspaces Configurator (%s)" */
     g_free(path);
     return FALSE;
 }