[gtkhtml3/f17] Add patch for Red Hat bug #829915 (input freeze in editor)

Milan Crha mcrha at fedoraproject.org
Fri Jun 8 09:06:37 UTC 2012


commit c951453842fb7ad8c90915fc8dd9cb3bd73d3774
Author: Milan Crha <mcrha at redhat.com>
Date:   Fri Jun 8 11:06:25 2012 +0200

    Add patch for Red Hat bug #829915 (input freeze in editor)

 gtkhtml-4.4.2-fix-input-freeze.patch |  108 ++++++++++++++++++++++++++++++++++
 gtkhtml3.spec                        |   10 ++-
 2 files changed, 114 insertions(+), 4 deletions(-)
---
diff --git a/gtkhtml-4.4.2-fix-input-freeze.patch b/gtkhtml-4.4.2-fix-input-freeze.patch
new file mode 100644
index 0000000..6ae6382
--- /dev/null
+++ b/gtkhtml-4.4.2-fix-input-freeze.patch
@@ -0,0 +1,108 @@
+diff --git a/components/editor/gtkhtml-color-combo.c b/components/editor/gtkhtml-color-combo.c
+index 8ea4d9f..d30ee54 100644
+--- a/components/editor/gtkhtml-color-combo.c
++++ b/components/editor/gtkhtml-color-combo.c
+@@ -61,6 +61,8 @@ struct _GtkhtmlColorComboPrivate {
+ 
+ 	guint popup_shown	: 1;
+ 	guint popup_in_progress	: 1;
++	GdkDevice *grab_keyboard;
++	GdkDevice *grab_mouse;
+ };
+ 
+ static gpointer parent_class;
+@@ -637,15 +639,29 @@ color_combo_popup (GtkhtmlColorCombo *combo)
+ 	GtkToggleButton *toggle_button;
+ 	GtkButton *button;
+ 	GdkWindow *window;
+-	GdkGrabStatus status;
++	gboolean grab_status;
++	GdkDevice *device, *mouse, *keyboard;
++	guint32 activate_time;
+ 	const gchar *label;
+ 
++	device = gtk_get_current_event_device ();
++	g_return_if_fail (device != NULL);
++
+ 	if (!gtk_widget_get_realized (GTK_WIDGET (combo)))
+ 		return;
+ 
+ 	if (combo->priv->popup_shown)
+ 		return;
+ 
++	activate_time = gtk_get_current_event_time ();
++	if (gdk_device_get_source (device) == GDK_SOURCE_KEYBOARD) {
++		keyboard = device;
++		mouse = gdk_device_get_associated_device (device);
++	} else {
++		keyboard = gdk_device_get_associated_device (device);
++		mouse = device;
++	}
++
+ 	/* Update the default button label. */
+ 	button = GTK_BUTTON (combo->priv->default_button);
+ 	label = gtkhtml_color_state_get_default_label (combo->priv->state);
+@@ -664,22 +680,28 @@ color_combo_popup (GtkhtmlColorCombo *combo)
+ 
+ 	/* Try to grab the pointer and keyboard. */
+ 	window = gtk_widget_get_window (combo->priv->window);
+-	status = gdk_pointer_grab (
+-		window, TRUE,
+-		GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK |
+-		GDK_POINTER_MOTION_MASK, NULL, NULL, GDK_CURRENT_TIME);
+-	if (status == GDK_GRAB_SUCCESS) {
+-		status = gdk_keyboard_grab (window, TRUE, GDK_CURRENT_TIME);
+-		if (status != GDK_GRAB_SUCCESS)
+-			gdk_display_pointer_ungrab (
+-				gdk_window_get_display (window),
+-				GDK_CURRENT_TIME);
++	grab_status = !keyboard ||
++		gdk_device_grab (keyboard, window,
++			GDK_OWNERSHIP_WINDOW, TRUE,
++			GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK,
++			NULL, activate_time) == GDK_GRAB_SUCCESS;
++	if (grab_status) {
++		grab_status = !mouse ||
++			gdk_device_grab (mouse, window,
++				GDK_OWNERSHIP_WINDOW, TRUE,
++				GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK,
++				NULL, activate_time) == GDK_GRAB_SUCCESS;
++		if (!grab_status && keyboard)
++			gdk_device_ungrab (keyboard, activate_time);
+ 	}
+ 
+-	if (status == GDK_GRAB_SUCCESS)
+-		gtk_grab_add (combo->priv->window);
+-	else
++	if (grab_status) {
++		gtk_device_grab_add (combo->priv->window, mouse, TRUE);
++		combo->priv->grab_keyboard = keyboard;
++		combo->priv->grab_mouse = mouse;
++	} else {
+ 		gtk_widget_hide (combo->priv->window);
++	}
+ }
+ 
+ static void
+@@ -694,12 +716,20 @@ color_combo_popdown (GtkhtmlColorCombo *combo)
+ 		return;
+ 
+ 	/* Hide the pop-up. */
+-	gtk_grab_remove (combo->priv->window);
++	gtk_device_grab_remove (combo->priv->window, combo->priv->grab_mouse);
+ 	gtk_widget_hide (combo->priv->window);
+ 
+ 	/* Deactivate the toggle button. */
+ 	toggle_button = GTK_TOGGLE_BUTTON (combo->priv->toggle_button);
+ 	gtk_toggle_button_set_active (toggle_button, FALSE);
++
++	if (combo->priv->grab_keyboard)
++		gdk_device_ungrab (combo->priv->grab_keyboard, GDK_CURRENT_TIME);
++	if (combo->priv->grab_mouse)
++		gdk_device_ungrab (combo->priv->grab_mouse, GDK_CURRENT_TIME);
++
++	combo->priv->grab_keyboard = NULL;
++	combo->priv->grab_mouse = NULL;
+ }
+ 
+ static void
diff --git a/gtkhtml3.spec b/gtkhtml3.spec
index 434a473..dbc4477 100644
--- a/gtkhtml3.spec
+++ b/gtkhtml3.spec
@@ -5,7 +5,7 @@
 
 Name: gtkhtml3
 Version: 4.4.2
-Release: 1%{?dist}
+Release: 2%{?dist}
 Group: System Environment/Libraries
 Summary: GtkHTML library
 License: LGPLv2+ and GPLv2
@@ -14,8 +14,7 @@ Source: http://download.gnome.org/sources/gtkhtml/4.4/gtkhtml-%{version}.tar.xz
 
 ### Patches ###
 
-# GNOME bug #672582
-#Patch01: gtkhtml-4.4.1-fix-iframe-selection.patch
+Patch01: gtkhtml-4.4.2-fix-input-freeze.patch
 
 ### Build Dependencies ###
 
@@ -46,7 +45,7 @@ developing applications that use %{name}.
 
 %prep
 %setup -q -n gtkhtml-%{version}
-#%patch01 -p1 -b .fix-iframe-selection
+%patch01 -p1 -b .fix-input-freeze
 
 %build
 autoreconf -fi
@@ -79,6 +78,9 @@ find $RPM_BUILD_ROOT -name '*.la' -exec rm -f {} ';'
 %{_libdir}/pkgconfig/*.pc
 
 %changelog
+* Fri Jun 08 2012 Milan Crha <mcrha at redhat.com> - 4.4.2-2
+- Add patch for Red Hat bug #829915 (input freeze in editor)
+
 * Mon May 14 2012 Milan Crha <mcrha at redhat.com> - 4.4.2-1
 - Update to 4.4.2
 - Remove patch for GNOME bug #672582 (fixed upstream).


More information about the scm-commits mailing list