r1649 - in trunk/src/target/OM-2007/applications/openmoko-taskmanager: . src

zhiyong_sun at sita.openmoko.org zhiyong_sun at sita.openmoko.org
Wed Apr 4 05:52:55 CEST 2007


Author: zhiyong_sun
Date: 2007-04-04 05:52:48 +0200 (Wed, 04 Apr 2007)
New Revision: 1649

Modified:
   trunk/src/target/OM-2007/applications/openmoko-taskmanager/ChangeLog
   trunk/src/target/OM-2007/applications/openmoko-taskmanager/src/callbacks.c
   trunk/src/target/OM-2007/applications/openmoko-taskmanager/src/list_view.c
   trunk/src/target/OM-2007/applications/openmoko-taskmanager/src/list_view.h
   trunk/src/target/OM-2007/applications/openmoko-taskmanager/src/taskmanager.c
Log:
openmoko-taskmanager: use GtkIconView widget to show task list in a 3 colums style, still have some small bugs(show the items which are hidden by moko figner wheel and toolbox)

Modified: trunk/src/target/OM-2007/applications/openmoko-taskmanager/ChangeLog
===================================================================
--- trunk/src/target/OM-2007/applications/openmoko-taskmanager/ChangeLog	2007-04-03 14:22:48 UTC (rev 1648)
+++ trunk/src/target/OM-2007/applications/openmoko-taskmanager/ChangeLog	2007-04-04 03:52:48 UTC (rev 1649)
@@ -0,0 +1,22 @@
+2007-04-04  Sun Zhiyong  <sunzhiyong at fic-sh.com.cn>
+	* openmoko-taskmanager/src/list_view.c:
+	(moko_task_list_init), (moko_add_window),
+	(moko_update_store_list), (moko_set_list_highlight),
+	(moko_task_list_selection_changed):
+	Use GtkIconView widget to show active task list(3 columns style);
+	Add GtkIconView "selection_changed" callback function to send selected application name to openmoko-footer.
+
+	* openmoko-taskmanger/src/list_view.h:
+	Add marcos, which are used for GtkIconView layout adjustment.
+
+	* openmoko-taskmanger/src/callbacks.c:
+	(moko_wm_cmd), (moko_kill_all_btn_cb),
+	(moko_wheel_left_up_press_cb),
+	(moko_wheel_right_down_press_cb),
+	(moko_wheel_bottom_press_cb):
+	Rewrite moko finger wheel "up left" and "right down" button callback functions;
+	Add moko finger wheel bottom button press callback function to show desktop;
+	Some modifies to fit GtkIconView widget.
+
+	* openmoko-taskmanager/src/taskmanager.c:
+	Add moko finger wheel bottom buttton press callback function. 

Modified: trunk/src/target/OM-2007/applications/openmoko-taskmanager/src/callbacks.c
===================================================================
--- trunk/src/target/OM-2007/applications/openmoko-taskmanager/src/callbacks.c	2007-04-03 14:22:48 UTC (rev 1648)
+++ trunk/src/target/OM-2007/applications/openmoko-taskmanager/src/callbacks.c	2007-04-04 03:52:48 UTC (rev 1649)
@@ -41,23 +41,25 @@
 gboolean
 moko_wm_cmd (MokoTaskManager *tm, GtkWidget *list_view, int task)
 {
-    GtkTreeSelection *sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (list_view));
-    GtkTreeIter iter;
-    GtkTreeModel *model;
+  GList *path = gtk_icon_view_get_selected_items (GTK_ICON_VIEW(list_view));
+  GtkTreeModel *model = gtk_icon_view_get_model (GTK_ICON_VIEW(list_view));
+  GtkTreeIter iter; 
 
-    if (gtk_tree_selection_get_selected (sel, &model, &iter)) 
-    	{
-    	  Window w;
-
-    	  gtk_tree_model_get (GTK_TREE_MODEL (model), &iter, OBJECT_COL, &w, -1);
-    	  mbcommand(GDK_DISPLAY(), task, w, NULL);
-    	  return TRUE;
-    	  }
-    else 
-    {
-         moko_dbus_send_message ("No application selected");
-    	  return FALSE;
-     }
+  if (gtk_tree_model_get_iter (model, &iter, path->data)) 
+  {
+    Window w;
+    gtk_tree_model_get (GTK_TREE_MODEL (model), &iter, OBJECT_COL, &w, -1);
+    mbcommand(GDK_DISPLAY(), task, w, NULL);
+    return TRUE;
+  }
+  else 
+  {
+    moko_dbus_send_message ("No application selected");
+    return FALSE;
+  }
+  
+  if (path)
+    g_list_free (path);
 }
 
 gboolean 
@@ -87,14 +89,11 @@
 void
 moko_kill_all_btn_cb (GtkButton *btn, MokoTaskManager *tm)
 {    
-    GtkTreeSelection *sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (tm->l->list_view));
     GtkTreeIter iter;
-    GtkTreeModel *model;
+    GtkTreeModel *model = gtk_icon_view_get_model (GTK_ICON_VIEW (tm->l->list_view));
     Window *win;
     GSList *list = NULL;
 
-    gtk_tree_selection_get_selected (sel, &model, &iter);
-
     if (!gtk_tree_model_get_iter_first (model, &iter))
     	return;
     
@@ -125,95 +124,103 @@
     gtk_window_iconify (GTK_WINDOW (tm->window));
 	moko_dbus_send_message ("");
 }
-/*
+
 void
-moko_tab_event_cb (GtkButton *btn, MokoTaskList *l) 
+moko_wheel_left_up_press_cb (GtkWidget *self, MokoTaskManager *tm)
 {
-    g_debug ("tab event");
-    GtkTreeIter iter;
-    GtkTreePath *path;
-    GtkTreeViewColumn *col;
-    GtkTreeModel *model;
+  if (!tm->l->list_view)
+    return;
+  
+  GtkTreeIter iter;
+  GtkTreeModel *model = gtk_icon_view_get_model (GTK_ICON_VIEW (tm->l->list_view));
+  GList *path = gtk_icon_view_get_selected_items (GTK_ICON_VIEW(tm->l->list_view));
 
-    gtk_tree_view_get_cursor(GTK_TREE_VIEW (l->list_view), &path, &col);
-    //gtk_tree_view_get_cursor(l->mokolist_view, &path, &col);
-
-    model = GTK_TREE_MODEL (l->list_store);
-
-    if (gtk_tree_model_get_iter (model, &iter, path)) {
-        Window w;
-        gtk_tree_model_get (model, &iter, OBJECT_COL, &w, -1);
-        //moko_print_win_list(GDK_DISPLAY(), &w, 1);
-        //moko_send_Xclimsgwm(GDK_DISPLAY (), w);
-        mbcommand(GDK_DISPLAY(), CMD_ACTIVATE_WINDOW, w, NULL);
-        }
-    if (path)
-    	free (path);
+  if (!path && gtk_tree_model_get_iter_first (model, &iter))
+  { 
+    GtkTreePath *new_path = NULL;
+    for (;gtk_tree_model_iter_next (model, &iter);)
+    {
+      if (new_path)
+	 gtk_tree_path_free (new_path);
+      new_path = gtk_tree_model_get_path (model, &iter);
+    }
+    gtk_icon_view_select_path (GTK_ICON_VIEW (tm->l->list_view), new_path);
+    gtk_tree_path_free (new_path);
+  }
+  else if (path && gtk_tree_path_prev (path->data))
+  {
+    gtk_icon_view_select_path (GTK_ICON_VIEW (tm->l->list_view), path->data);
+  }
+  else
+    g_warning ("Can not find right path of icon view item");
+  
+  if (path)
+  {
+    gtk_tree_path_free (path->data);
+    g_list_free (path);
+  }
+  return;
 }
 
-void        
-moko_hold_event_cb (GtkButton *btn, MokoTaskList *l) 
+void
+moko_wheel_right_down_press_cb (GtkWidget *self, MokoTaskManager *tm)
 {
+  if (!tm->l->list_view)
+    return;
+  GList* path = NULL;
+  GtkTreePath *new_path = NULL; 
+  GtkTreeModel *model = gtk_icon_view_get_model (GTK_ICON_VIEW (tm->l->list_view));
+  GtkTreeIter iter;
   
-}
-*/
-void
-moko_wheel_left_up_press_cb (GtkWidget *self, MokoTaskManager *tm)
-{
-   GtkTreeSelection *selection;
-   GtkTreeModel *model;
-   GtkTreeIter iter;
-   GtkTreePath* path;
+  path = gtk_icon_view_get_selected_items (GTK_ICON_VIEW(tm->l->list_view));
 
-   if (!tm->l->list_view)
- 	return;
-
-   selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (tm->l->list_view));
-
-   if (!gtk_tree_selection_get_selected (selection, &model, &iter))
-   {
-     moko_dbus_send_message ("");
-	 return;
-   }
-
-   path = gtk_tree_model_get_path (model, &iter);
-   if (!gtk_tree_path_prev (path))
-   {
-	gtk_tree_path_free (path);
-	return;
-   }
-   
-   gtk_tree_view_set_cursor (GTK_TREE_VIEW (tm->l->list_view), path, 0, 0);
-   gtk_tree_path_free (path);
-   return;
+  if (path && gtk_tree_model_get_iter (model, &iter, path->data))
+  {
+    if (gtk_tree_model_iter_next (model, &iter))
+      new_path = gtk_tree_model_get_path (model, &iter);
+    gtk_tree_path_free (path->data);//FIXME: If not use _GTK_SELECTION_SINGLE_ as icon view selection model, 
+                                    //here should use g_list_foreach (path, gtk_tree_path_free, NULL) 
+                                    //to free the tree path(es).
+  }
+  else if (gtk_tree_model_get_iter_first (model, &iter))
+  { 
+    new_path = gtk_tree_model_get_path (model, &iter);
+  }
+  else
+    g_error ("Can not find right path of icon view item");
+  
+  if (new_path)
+  {
+    gtk_icon_view_select_path (GTK_ICON_VIEW (tm->l->list_view), new_path);
+    gtk_tree_path_free (new_path);
+  }
+  g_list_free (path);
+  
+  return;
 }
 
 void
-moko_wheel_right_down_press_cb (GtkWidget *self, MokoTaskManager *tm)
+moko_wheel_bottom_press_cb (GtkWidget *self, MokoTaskManager *tm)
 {
-   GtkTreeSelection *selection;
-   GtkTreeModel *model;
-   GtkTreeIter iter;
-   GtkTreePath* path;
+  GtkWidget* widget = GTK_WIDGET(self);
+  Screen* screen = GDK_SCREEN_XSCREEN(gtk_widget_get_screen (widget));
+  XEvent xev;
 
-   if (!tm->l->list_view)
- 	return;
-	 
-   selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (tm->l->list_view));
+  xev.xclient.type = ClientMessage;
+  xev.xclient.serial = 0;
+  xev.xclient.send_event = True;
+  xev.xclient.display = DisplayOfScreen (screen);
+  xev.xclient.window = RootWindowOfScreen (screen);
+  xev.xclient.message_type = gdk_x11_get_xatom_by_name( "_NET_SHOWING_DESKTOP" );
+  xev.xclient.format = 32;
+  xev.xclient.data.l[0] = TRUE;
+  xev.xclient.data.l[1] = 0;
+  xev.xclient.data.l[2] = 0;
+  xev.xclient.data.l[3] = 0;
+  xev.xclient.data.l[4] = 0;
 
-   if (!gtk_tree_selection_get_selected (selection, &model, &iter))
-   {
-     moko_dbus_send_message ("");
-	 return;
-   }
-   
-   path = gtk_tree_model_get_path (model, &iter);
-   gtk_tree_path_next (path);
-   
-   if (!path)
-	return;
-     
-   gtk_tree_view_set_cursor (GTK_TREE_VIEW (tm->l->list_view), path, 0, 0);
-   gtk_tree_path_free (path);
-   return;
+  XSendEvent (DisplayOfScreen (screen), RootWindowOfScreen (screen), False,
+              SubstructureRedirectMask | SubstructureNotifyMask, &xev);
+
+  return;
 }

Modified: trunk/src/target/OM-2007/applications/openmoko-taskmanager/src/list_view.c
===================================================================
--- trunk/src/target/OM-2007/applications/openmoko-taskmanager/src/list_view.c	2007-04-03 14:22:48 UTC (rev 1648)
+++ trunk/src/target/OM-2007/applications/openmoko-taskmanager/src/list_view.c	2007-04-04 03:52:48 UTC (rev 1649)
@@ -30,6 +30,8 @@
 static void moko_task_list_class_init          (MokoTaskListClass *klass);
 static void moko_task_list_init                (MokoTaskList *l);
 
+static void moko_task_list_selection_changed (GtkIconView *self, MokoTaskList *l);
+
 static guint list_signals[LAST_SIGNAL] = { 0 };
 
 /**
@@ -89,68 +91,33 @@
 static void /* Instance Construction */
 moko_task_list_init (MokoTaskList *l) 
 { 
-    GtkCellRenderer *renderer;
-    GtkTreeViewColumn *column;
-   // GtkWidget *ico;
-    GtkWidget *align;
+  l->list_view = gtk_icon_view_new();
+  gtk_widget_set_name (l->list_view, "gtktreeview-black");
+  gtk_icon_view_set_columns (GTK_ICON_VIEW(l->list_view), COLUMN_NO);
+  gtk_icon_view_set_margin (GTK_ICON_VIEW(l->list_view), MARGIN);
+  gtk_icon_view_set_column_spacing (GTK_ICON_VIEW(l->list_view), COLUMN_SPACE);
+  gtk_icon_view_set_row_spacing (GTK_ICON_VIEW(l->list_view), ROW_SPACE);
+  gtk_icon_view_set_selection_mode (GTK_ICON_VIEW(l->list_view), GTK_SELECTION_SINGLE);
+  gtk_widget_show (l->list_view);
+  l->list_store = gtk_list_store_new (3, G_TYPE_STRING, G_TYPE_INT, GDK_TYPE_PIXBUF);
+  gtk_icon_view_set_pixbuf_column (GTK_ICON_VIEW(l->list_view), PIXBUF_COL);
+  gtk_icon_view_set_text_column (l->list_view, TEXT_COL );
+  gtk_icon_view_set_model (GTK_ICON_VIEW(l->list_view), GTK_TREE_MODEL(l->list_store));
 
-    align=gtk_alignment_new(0, 0, 1, 1);    
-    gtk_alignment_set_padding(GTK_ALIGNMENT (align), 0, 150, 0, 0);
-    l->list_store = gtk_list_store_new (3, G_TYPE_STRING, G_TYPE_INT, GDK_TYPE_PIXBUF);
-    l->list_view = gtk_tree_view_new_with_model (GTK_TREE_MODEL (l->list_store));
-    gtk_widget_set_name (l->list_view, "gtktreeview-black");
-    gtk_widget_show (l->list_view);
-    //l->mokolist_view = moko_tree_view_new_with_model (GTK_TREE_MODEL (l->list_store));
-    gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (l->list_view), FALSE);
-    //gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (l->mokolist_view), FALSE);
-    
-   /* l->renderer = gtk_cell_renderer_pixbuf_new ();
-    l->column = gtk_tree_view_column_new_with_attributes ("Icon", l->renderer, "pixbuf", 2, NULL);
-    gtk_tree_view_append_column (GTK_TREE_VIEW (l->list_view), l->column);
-    //moko_tree_view_append_column (GTK_TREE_VIEW (l->mokolist_view), l->column);
-
-    l->renderer = gtk_cell_renderer_text_new ();
-    l->column = gtk_tree_view_column_new_with_attributes ("Running programs", l->renderer, 
-    													"text", 0, NULL);
-   gtk_tree_view_append_column (GTK_TREE_VIEW (l->list_view), l->column);
-  		*/
-
-   column = gtk_tree_view_column_new();
-   gtk_tree_view_column_set_title (column, ("Task list"));
-   gtk_tree_view_column_set_resizable (column, TRUE);
-  
-    renderer = gtk_cell_renderer_pixbuf_new ();
-   gtk_tree_view_column_pack_start (column,  renderer , FALSE);
-   gtk_tree_view_column_set_attributes (column,  renderer , 
-  				"pixbuf", PIXBUF_COL, NULL);
-
-   renderer = gtk_cell_renderer_text_new ();
-   gtk_tree_view_column_pack_start (column,  renderer , FALSE);
-   gtk_tree_view_column_set_attributes(column,  renderer , 
-   				"text", TEXT_COL, NULL);
-  
-   gtk_tree_view_append_column (GTK_TREE_VIEW (l->list_view), column);
-		
-    l->scrolled = gtk_scrolled_window_new (NULL, NULL);
-    gtk_widget_show (l->scrolled);
-    gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (l->scrolled),
-				  GTK_POLICY_NEVER, GTK_POLICY_NEVER);
-    gtk_container_add (GTK_CONTAINER (align), l->list_view);
-    gtk_container_add (GTK_CONTAINER (l->scrolled), align);
-    gtk_widget_set_size_request (l->scrolled, -1, 400);
+  l->scrolled = gtk_scrolled_window_new (NULL, NULL);
+  gtk_widget_show (l->scrolled);
+  gtk_widget_set_size_request (GTK_WINDOW(l->scrolled), -1, 400);
+  gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (l->scrolled), GTK_POLICY_NEVER, GTK_POLICY_NEVER);
+  gtk_container_add (GTK_CONTAINER (l->scrolled), l->list_view);
    
-    //l->scrolled = moko_tree_view_put_into_scrolled_window (l->mokolist_view);
-
-    //gtk_box_pack_start (GTK_BOX (l), l->hbox, FALSE, FALSE, 0);
-    //gtk_box_pack_end (l->hbox, l->btn_close, FALSE, FALSE, 0);
-    gtk_box_pack_start (GTK_BOX (l), l->scrolled, TRUE, TRUE, 0);
+  gtk_box_pack_start (GTK_BOX (l), l->scrolled, TRUE, TRUE, 0);
     
-    default_icon = gdk_pixbuf_new_from_file_at_size (PKGDATADIR"/default-app-icon.xpm",
-		    					160, 160, NULL);
-    if (!default_icon )
-	    g_error ("Failed to load default icon");
-}
+  default_icon = gdk_pixbuf_new_from_file_at_size (PKGDATADIR"/default-app-icon.xpm", 140, 140, NULL);
+  if (!default_icon )
+    g_error ("Failed to load default icon");
 
+  g_signal_connect (l->list_view, "selection_changed", G_CALLBACK ( moko_task_list_selection_changed), l);
+}
 /* Construction */
 GtkWidget* 
 moko_task_list_new() 
@@ -168,35 +135,36 @@
 static void
 moko_add_window (Display *dpy, Window w, GtkListStore *list_store)
 {
-    GtkTreeIter iter;
-    gchar *name = NULL;
-    GdkPixbuf *icon = NULL;
+  GtkTreeIter iter;
+  gchar *name = NULL;
+  GdkPixbuf *icon = NULL;
 
-    name = moko_get_window_name(dpy, w);
-    if (!strcmp (name, "Openmoko-taskmanager"))
-    {
-    	g_free (name);
-    	return;
-    }
+  name = moko_get_window_name(dpy, w);
+  if (!strcmp (name, "Openmoko-taskmanager"))
+  {
+    g_free (name);
+    return;
+  }
 
-    icon = moko_get_window_icon (dpy, w);
-    gtk_list_store_append (list_store, &iter);
-    gtk_list_store_set (list_store, &iter, TEXT_COL, name, OBJECT_COL, w, -1);
+  icon = moko_get_window_icon (dpy, w);
+  gtk_list_store_append (list_store, &iter);
+  g_debug ("add widnow %s", name);
+  gtk_list_store_set (list_store, &iter, TEXT_COL, name, OBJECT_COL, w, -1);
 
-    if (icon) 
-	{
-        GdkPixbuf *icons = gdk_pixbuf_scale_simple (icon, 160, 160, GDK_INTERP_BILINEAR);
-        gtk_list_store_set (list_store, &iter, PIXBUF_COL, icons, -1);
-	    gdk_pixbuf_unref (icons);
-    }
-    else if (default_icon) 
-        gtk_list_store_set (list_store, &iter, PIXBUF_COL, default_icon, -1);
-    else
-	    g_error ("Failed to load %s's icon", name);
-
-    if (icon)
-	    gdk_pixbuf_unref (icon);
-    g_free (name);
+  if (icon) 
+  {
+    GdkPixbuf *icons = gdk_pixbuf_scale_simple (icon, 140, 140, GDK_INTERP_BILINEAR);
+    gtk_list_store_set (list_store, &iter, PIXBUF_COL, icons, -1);
+    gdk_pixbuf_unref (icons);
+  }
+  else if (default_icon) 
+    gtk_list_store_set (list_store, &iter, PIXBUF_COL, default_icon, -1);
+  else
+    g_warning ("Failed to load %s's icon", name);
+  
+  if (icon)
+    gdk_pixbuf_unref (icon);
+  g_free (name);
 }
 
 void 
@@ -211,14 +179,15 @@
     	return;
     p = g_malloc0 (nr);
 
-    if (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (list_store), &iter))	{
+    if (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (list_store), &iter))
+    {
     	gboolean more;
     do{
     	gboolean found = FALSE;
     	Window w;
     	gtk_tree_model_get (GTK_TREE_MODEL (list_store), &iter, OBJECT_COL, &w, -1);
     	for (i=0; i<nr; i++) 
-		{
+	{
     	    if (list[i] == w) 
 			{
     	    	p[i] = 1;
@@ -273,7 +242,7 @@
                         {
                             GtkTreePath *path;
                             path = gtk_tree_model_get_path (GTK_TREE_MODEL (l->list_store), &iter);
-                            gtk_tree_view_set_cursor (GTK_TREE_VIEW (l->list_view), path, NULL, FALSE);
+				gtk_icon_view_select_path (GTK_ICON_VIEW (l->list_view), path);
                             gtk_tree_path_free (path);
                             break;
                         }
@@ -285,3 +254,27 @@
     }
 }
 
+static void 
+moko_task_list_selection_changed (GtkIconView *self, MokoTaskList *l)
+{
+  char *name = NULL;
+  Window w;
+  GtkTreeIter iter;
+  GList *path = gtk_icon_view_get_selected_items (GTK_ICON_VIEW (self));
+  GtkTreeModel *model = gtk_icon_view_get_model (GTK_ICON_VIEW(self));
+  
+  if ( !path)
+    return;
+		    
+  gtk_tree_model_get_iter (model, &iter, path->data);
+  gtk_tree_model_get (GTK_TREE_MODEL (l->list_store), &iter, OBJECT_COL, &w, -1);
+  name = moko_get_window_name(GDK_DISPLAY(), w);
+
+  if (name)
+    moko_dbus_send_message (name);
+
+  g_list_foreach (path, gtk_tree_path_free, NULL);
+  g_list_free (path);
+  g_free (name);
+  return;
+}

Modified: trunk/src/target/OM-2007/applications/openmoko-taskmanager/src/list_view.h
===================================================================
--- trunk/src/target/OM-2007/applications/openmoko-taskmanager/src/list_view.h	2007-04-03 14:22:48 UTC (rev 1648)
+++ trunk/src/target/OM-2007/applications/openmoko-taskmanager/src/list_view.h	2007-04-04 03:52:48 UTC (rev 1649)
@@ -28,13 +28,17 @@
 
 #include "misc.h"
 
+#define COLUMN_NO  3
+#define COLUMN_SPACE 20
+#define ROW_SPACE  20
+#define MARGIN  10
+
 enum{
     TEXT_COL = 0,
     OBJECT_COL,
     PIXBUF_COL,
     MAX_COL
 };
-
 G_BEGIN_DECLS
 /*MOKOTASKLIST property*/
 

Modified: trunk/src/target/OM-2007/applications/openmoko-taskmanager/src/taskmanager.c
===================================================================
--- trunk/src/target/OM-2007/applications/openmoko-taskmanager/src/taskmanager.c	2007-04-03 14:22:48 UTC (rev 1648)
+++ trunk/src/target/OM-2007/applications/openmoko-taskmanager/src/taskmanager.c	2007-04-04 03:52:48 UTC (rev 1649)
@@ -242,6 +242,8 @@
     			G_CALLBACK 	(moko_wheel_left_up_press_cb), tm);
     g_signal_connect (tm->wheel, "press_right_down",
     			G_CALLBACK (moko_wheel_right_down_press_cb), tm);
+    g_signal_connect (tm->wheel, "press_bottom",
+    			G_CALLBACK (moko_wheel_bottom_press_cb), tm);
 
     gdk_window_add_filter (NULL, moko_window_filter, tm->l);
     XSelectInput (dpy, DefaultRootWindow (dpy), PropertyChangeMask);





More information about the commitlog mailing list