rpms/libgxim/devel libgxim-fix-unwanted-window-destroy.patch, NONE, 1.1 libgxim.spec, 1.8, 1.9

Akira TAGOH tagoh at fedoraproject.org
Tue Mar 3 14:38:58 UTC 2009


Author: tagoh

Update of /cvs/pkgs/rpms/libgxim/devel
In directory cvs1.fedora.phx.redhat.com:/tmp/cvs-serv4290

Modified Files:
	libgxim.spec 
Added Files:
	libgxim-fix-unwanted-window-destroy.patch 
Log Message:
* Tue Mar  3 2009 Akira TAGOH <tagoh at redhat.com> - 0.3.2-4
- Fix destroying a window unexpectedly. (#488223)

libgxim-fix-unwanted-window-destroy.patch:

--- NEW FILE libgxim-fix-unwanted-window-destroy.patch ---
2009-03-03  Akira TAGOH  <akira at tagoh.org>

	* libgxim/gximmisc.c (g_xim_get_window): increase a reference count
	here to avoid destroying a window unexpectedly.
	(g_xim_get_selection_owner): hack to keep similar behavior.

	* libgxim/gximclconn.c (g_xim_client_transport_real_do_send_via_property):
	do increase/decrease a reference count appropriately
	(g_xim_client_transport_real_do_send_via_cm): likewise.

	* libgxim/gximsrvconn.c (g_xim_server_transport_real_do_send_via_property):
	likewise.
	(g_xim_server_transport_real_do_send_via_cm): likewise.

	* libgxim/gximcltmpl.c (g_xim_cl_tmpl_real_dispose): likewise.
	(g_xim_cl_tmpl_real_translate_events): likewise.
	(g_xim_cl_tmpl_real_selection_notify_event): likewise.

	* libgxim/gximsrvtmpl.c (_weak_notify_conn_cb): likewise.
	(g_xim_srv_tmpl_real_translate_events): likewise.
	(g_xim_srv_tmpl_real_xconnect): likewise.
	(g_xim_srv_tmpl_send_selection_notify): likewise.
	(g_xim_srv_tmpl_add_connection): likewise.

Index: libgxim/gximclconn.c
===================================================================
--- libgxim/gximclconn.c	(リビジョン 199)
+++ libgxim/gximclconn.c	(リビジョン 201)
@@ -508,7 +508,7 @@
 	ev = gdk_event_new(GDK_CLIENT_EVENT);
 	G_XIM_CHECK_ALLOC (ev, FALSE);
 
-	ev->client.window = g_object_ref(w);
+	ev->client.window = w;
 	ev->client.message_type = G_XIM_TRANSPORT_GET_IFACE (trans)->atom_xim_protocol;
 	ev->client.data_format = 32;
 	ev->client.data.l[0] = length;
@@ -565,7 +565,7 @@
 	ev = gdk_event_new(GDK_CLIENT_EVENT);
 	G_XIM_CHECK_ALLOC (ev, FALSE);
 
-	ev->client.window = g_object_ref(w);
+	ev->client.window = w;
 	ev->client.message_type = G_XIM_TRANSPORT_GET_IFACE (trans)->atom_xim_protocol;
 	ev->client.data_format = 8;
 	memset(ev->client.data.b, 0, transport_size);
Index: libgxim/gximsrvconn.c
===================================================================
--- libgxim/gximsrvconn.c	(リビジョン 199)
+++ libgxim/gximsrvconn.c	(リビジョン 201)
@@ -524,7 +524,7 @@
 	ev = gdk_event_new(GDK_CLIENT_EVENT);
 	G_XIM_CHECK_ALLOC (ev, FALSE);
 
-	ev->client.window = g_object_ref(w);
+	ev->client.window = w;
 	ev->client.message_type = G_XIM_TRANSPORT_GET_IFACE (trans)->atom_xim_protocol;
 	ev->client.data_format = 32;
 	ev->client.data.l[0] = length;
@@ -581,7 +581,7 @@
 	ev = gdk_event_new(GDK_CLIENT_EVENT);
 	G_XIM_CHECK_ALLOC (ev, FALSE);
 
-	ev->client.window = g_object_ref(w);
+	ev->client.window = w;
 	ev->client.message_type = G_XIM_TRANSPORT_GET_IFACE (trans)->atom_xim_protocol;
 	ev->client.data_format = 8;
 	memset(ev->client.data.b, 0, transport_size);
Index: libgxim/gximmisc.c
===================================================================
--- libgxim/gximmisc.c	(リビジョン 199)
+++ libgxim/gximmisc.c	(リビジョン 201)
@@ -725,7 +725,7 @@
 			   G_XIM_NATIVE_WINDOW_TO_POINTER (window));
 	}
 
-	return retval;
+	return retval != NULL ? g_object_ref(retval) : NULL;
 }
 
 GdkPixmap *
@@ -750,6 +750,7 @@
 			  GdkAtom     selection)
 {
 	Window xwindow;
+	GdkWindow *retval;
 
 	g_return_val_if_fail (GDK_IS_DISPLAY (display), NULL);
 	g_return_val_if_fail (selection != GDK_NONE, NULL);
@@ -763,7 +764,11 @@
 	if (xwindow == None)
 		return NULL;
 
-	return g_xim_get_window(display, (GdkNativeWindow)xwindow);
+	retval = g_xim_get_window(display, (GdkNativeWindow)xwindow);
+	/* just decrease a counter to not mind unref outside this function */
+	g_object_unref(retval);
+
+	return retval;
 }
 
 GdkWindow *
Index: libgxim/gximcltmpl.c
===================================================================
--- libgxim/gximcltmpl.c	(リビジョン 199)
+++ libgxim/gximcltmpl.c	(リビジョン 201)
@@ -178,6 +178,7 @@
 		w = g_xim_get_window(dpy, nw);
 		if (w)
 			g_xim_core_unwatch_event(core, w);
+		g_object_unref(w);
 		w = g_xim_transport_get_channel(G_XIM_TRANSPORT (client->connection), NULL);
 		if (w)
 			g_xim_core_unwatch_event(core, w);
@@ -231,7 +232,7 @@
 		     */
 		    if (w) {
 			    event->any.type = GDK_DESTROY;
-			    event->any.window = g_object_ref(w);
+			    event->any.window = w;
 			    event->any.send_event = xev->xdestroywindow.send_event ? TRUE : FALSE;
 			    retval = GDK_FILTER_TRANSLATE;
 		    }
@@ -332,7 +333,7 @@
 {
 	GXimClientTemplate *client = G_XIM_CL_TMPL (core);
 	GdkDisplay *dpy = g_xim_core_get_display(core);
-	GdkWindow *w;
+	GdkWindow *w = NULL;
 	GdkAtom atom_type;
 	gint format, bytes;
 	gchar *prop = NULL, *p = NULL;
@@ -409,6 +410,8 @@
 		goto end;
 	}
   end:
+	if (w)
+		g_object_unref(w);
 	g_free(prop);
 	g_free(p);
 
Index: libgxim/gximsrvtmpl.c
===================================================================
--- libgxim/gximsrvtmpl.c	(リビジョン 199)
+++ libgxim/gximsrvtmpl.c	(リビジョン 201)
@@ -331,6 +331,7 @@
 				    G_XIM_NATIVE_WINDOW_TO_POINTER (nw));
 		w = g_xim_get_window(dpy, nw);
 		g_xim_core_unwatch_event(core, w);
+		g_object_unref(w);
 		g_hash_table_remove(server->conn_table,
 				    G_XIM_NATIVE_WINDOW_TO_POINTER (nw));
 	}
@@ -341,6 +342,7 @@
 				    G_XIM_NATIVE_WINDOW_TO_POINTER (nw));
 		w = g_xim_get_window(dpy, nw);
 		g_xim_core_unwatch_event(core, w);
+		g_object_unref(w);
 		g_hash_table_remove(server->conn_table,
 				    G_XIM_NATIVE_WINDOW_TO_POINTER (nw));
 	}
@@ -473,7 +475,7 @@
 		     */
 		    if (w) {
 			    event->any.type = GDK_DESTROY;
-			    event->any.window = g_object_ref(w);
+			    event->any.window = w;
 			    event->any.send_event = xev->xdestroywindow.send_event ? TRUE : FALSE;
 			    retval = GDK_FILTER_TRANSLATE;
 		    }
@@ -762,7 +764,7 @@
 	ev = gdk_event_new(GDK_CLIENT_EVENT);
 	G_XIM_CHECK_ALLOC_WITH_CODE (ev, g_object_unref(conn), NULL);
 
-	ev->client.window = g_object_ref(window);
+	ev->client.window = window;
 	ev->client.message_type = event->message_type;
 	ev->client.data_format = 32;
 	ev->client.data.l[0] = (long)comm_window;
@@ -1110,6 +1112,7 @@
 	window = g_xim_get_window(dpy, event->requestor);
 	gdk_property_change(window, event->property, event->target,
 			    8, GDK_PROP_MODE_REPLACE, (const guchar *)data, length);
+	g_object_unref(window);
 	gdk_selection_send_notify_for_display(dpy,
 					      event->requestor,
 					      event->selection,
@@ -1170,6 +1173,7 @@
 	mask = gdk_window_get_events(w);
 	gdk_window_set_events(w, mask | GDK_STRUCTURE_MASK);
 	g_xim_core_watch_event(core, w);
+	g_object_unref(w);
 }
 
 /**


Index: libgxim.spec
===================================================================
RCS file: /cvs/pkgs/rpms/libgxim/devel/libgxim.spec,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- libgxim.spec	2 Mar 2009 05:48:14 -0000	1.8
+++ libgxim.spec	3 Mar 2009 14:38:28 -0000	1.9
@@ -1,6 +1,6 @@
 Name:		libgxim
 Version:	0.3.2
-Release:	3%{?dist}
+Release:	4%{?dist}
 License:	LGPLv2+
 URL:		http://code.google.com/p/libgxim/
 BuildRoot:	%{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
@@ -8,6 +8,7 @@
 BuildRequires:	dbus-devel > 0.23, dbus-glib-devel >= 0.74, glib2-devel >= 2.16, gtk2-devel
 Source0:	http://libgxim.googlecode.com/files/%{name}-%{version}.tar.bz2
 Patch0:		libgxim-fix-x-event.patch
+Patch1:		libgxim-fix-unwanted-window-destroy.patch
 
 Summary:	GObject-based XIM protocol library
 Group:		System Environment/Libraries
@@ -40,6 +41,7 @@
 %prep
 %setup -q
 %patch0 -p0 -b .xevent
+%patch1 -p0 -b .window
 
 
 %build
@@ -79,6 +81,9 @@
 %{_datadir}/gtk-doc/html/libgxim
 
 %changelog
+* Tue Mar  3 2009 Akira TAGOH <tagoh at redhat.com> - 0.3.2-4
+- Fix destroying a window unexpectedly. (#488223)
+
 * Mon Mar  2 2009 Akira TAGOH <tagoh at redhat.com> - 0.3.2-3
 - Backport a patch to fix the unknown event issue.
 




More information about the fedora-extras-commits mailing list