Bonjour,
Si vous aussi ça vous manque terriblement de pouvoir changer d'onglet avec la molette de votre sourie dans les applications GTK3, comme ça se faisait avant dans GTK2 (et dans Firefox avec l'extension "Tab Wheel Scroll"), voici comment faire pour retrouver le saint graal du GTK :
On installe le nécessaire à la compilation :
mkdir dev
cd dev
sudo apt-get install build-essential fakeroot dpkg-dev
sudo apt-get build-dep libgtk-3-0
apt-get source libgtk-3-0
rm -rf gtk+3.0-*
On récupère le patch (je l'ai mis à la fin du message aussi) :
wget https://launchpadlibrarian.net/101685319/undo_no_scroll.patch
mv undo_no_scroll.patch 045_undo_no_scroll.patch
Dans l'archive
gtk+3.0_3.4.1-0ubuntu1.debian.tar.gz, aller dans le dossier debian/patches/
- Supprimer le fichier 043_notebook_scroll.patch
- Ajouter le fichier 045_undo_no_scroll.patch
- Editer le fichier
series :
- Supprimer (si elle existe) la ligne "043_notebook_scroll.patch"
- Ajouter une ligne "045_undo_no_scroll.patch"
On vient de modifier le fichier gtk+3.0_3.4.1-0ubuntu1.debian.tar.gz, on doit donc modifier ses sommes de contrôles et sa taille dans le fichier
gtk+3.0_3.4.1-0ubuntu1.dsc (en rouge, ci-dessous) :
Checksums-Sha1:
91b68f0dd5f6558eae98811f4031f32ff46ad172 12809412 gtk+3.0_3.4.1.orig.tar.xz
606ad2f0d2bc1cdb6bbe69dd2e78f3539e0459fb 111790 gtk+3.0_3.4.1-0ubuntu1.debian.tar.gz
Checksums-Sha256:
0716b533de0ff2ffdec1076bb85c7a95e2b7b6ac9ece71e84625043ae3eb25f7 12809412 gtk+3.0_3.4.1.orig.tar.xz
fe2336944b9c2320d30596e7c439557f51a585ccdd2971b9ae50da9821749577 111790 gtk+3.0_3.4.1-0ubuntu1.debian.tar.gz
Files:
2cbf02394c2c42cc597405eadabcac3e 12809412 gtk+3.0_3.4.1.orig.tar.xz
45e99a4320edc38160531ff809e86281 111790 gtk+3.0_3.4.1-0ubuntu1.debian.tar.gz
Utiliser le code suivant pour récupérer les bonnes infos :
i=gtk+3.0*.debian.tar.gz
sha1sum $i && sha256sum $i && md5sum $i && ll $i
Il ne reste plus qu'à appliquer le patch et à compiler :
dpkg-source -x gtk+3.0*.dsc # Sous Debian Testing (en cas de mauvaise signature) : dpkg-source --no-check -x gtk+3.0*.dsc
cd gtk+3.0*/
sudo dpkg-buildpackage -rfakeroot -b
cd ..
sudo dpkg -i *.deb
Normalement, si je n'ai rien oublié, tout est bon. Ca marche dans epiphany, nautilus, etc... Et ça ne pose pas de problème dans le terminal.
Maintenant vous pouvez arrêter d'utiliser des poupées vaudou contre Cody Russell (puisque c'est à ce sous doué mental que l'on doit cette boulette :
https://bugzilla.gnome.org/show_bug.cgi?id=630226), et l'on peut remercier notre héros, Otus (jan-varho), pour son patch (
https://bugs.launchpad.net/ubuntu/+source/gtk+3.0/+bug/872055).
Le patch en question (au cas où) :
Index: gtk+3.0-3.4.1/gtk/gtknotebook.c
===================================================================
--- gtk+3.0-3.4.1.orig/gtk/gtknotebook.c 2012-04-13 13:25:05.000000000 +0300
+++ gtk+3.0-3.4.1/gtk/gtknotebook.c 2012-04-13 13:44:20.000000000 +0300
@@ -304,6 +304,9 @@
GtkWidget *child,
gboolean *expand,
gboolean *fill);
+static gboolean gtk_notebook_scroll (GtkWidget *widget,
+ GdkEventScroll *event);
+
/*** GObject Methods ***/
static void gtk_notebook_set_property (GObject *object,
@@ -665,6 +668,7 @@
widget_class->drag_data_received = gtk_notebook_drag_data_received;
widget_class->drag_failed = gtk_notebook_drag_failed;
widget_class->compute_expand = gtk_notebook_compute_expand;
+ widget_class->scroll_event = gtk_notebook_scroll;
container_class->add = gtk_notebook_add;
container_class->remove = gtk_notebook_remove;
@@ -1893,7 +1897,8 @@
attributes.event_mask = gtk_widget_get_events (widget);
attributes.event_mask |= (GDK_BUTTON_PRESS_MASK |
GDK_BUTTON_RELEASE_MASK | GDK_KEY_PRESS_MASK |
- GDK_POINTER_MOTION_MASK | GDK_LEAVE_NOTIFY_MASK);
+ GDK_POINTER_MOTION_MASK | GDK_LEAVE_NOTIFY_MASK |
+ GDK_SCROLL_MASK);
attributes_mask = GDK_WA_X | GDK_WA_Y;
priv->event_window = gdk_window_new (gtk_widget_get_parent_window (widget),
@@ -2858,6 +2863,52 @@
return FALSE;
}
+static gboolean
+gtk_notebook_scroll (GtkWidget *widget,
+ GdkEventScroll *event)
+{
+ GtkNotebook *notebook = GTK_NOTEBOOK (widget);
+ GtkNotebookPrivate *priv = notebook->priv;
+ GtkWidget *child, *event_widget;
+ gint i;
+
+ if (!priv->cur_page)
+ return FALSE;
+
+ child = priv->cur_page->child;
+ event_widget = gtk_get_event_widget ((GdkEvent *)event);
+
+ /* ignore scroll events from the content of the page */
+ if (!event_widget || gtk_widget_is_ancestor (event_widget, child) || event_widget == child)
+ return FALSE;
+
+ /* nor from the action area */
+ for (i = 0; i < 2; i++)
+ {
+ if (event_widget == priv->action_widget[i] ||
+ (priv->action_widget[i] &&
+ gtk_widget_is_ancestor (event_widget, priv->action_widget[i])))
+ return FALSE;
+ }
+
+ switch (event->direction)
+ {
+ case GDK_SCROLL_RIGHT:
+ case GDK_SCROLL_DOWN:
+ gtk_notebook_next_page (notebook);
+ break;
+ case GDK_SCROLL_LEFT:
+ case GDK_SCROLL_UP:
+ gtk_notebook_prev_page (notebook);
+ break;
+ case GDK_SCROLL_SMOOTH:
+ /* Ignore smooth scrolling (-Wswitch) */
+ break;
+ }
+
+ return TRUE;
+}
+
static GList*
get_tab_at_pos (GtkNotebook *notebook, gint x, gint y)
{