Magellan Linux

Contents of /trunk/libunique/patches/libunique-1.1.6-unique-gdbus.patch

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1920 - (show annotations) (download)
Wed Oct 24 17:40:00 2012 UTC (11 years, 7 months ago) by niro
File size: 17849 byte(s)
-patches for libunique 1.1.6
1 From 01066039529c0181f231325476bb4823c16a2aea Mon Sep 17 00:00:00 2001
2 From: Christian Persch <chpe@gnome.org>
3 Date: Sat, 15 May 2010 17:47:45 +0000
4 Subject: Add GDBus backend
5
6 Add backend using GDBus, the new D-BUS binding in GIO 2.25.
7
8 Bug #618723.
9 ---
10 diff --git a/configure.ac b/configure.ac
11 index bc3163a..b6a4221 100644
12 --- a/configure.ac
13 +++ b/configure.ac
14 @@ -116,6 +116,19 @@ AS_IF([test "x$have_dbus" = "xyes"],
15
16 AM_CONDITIONAL([HAVE_DBUS], [test "x$have_dbus" = "xyes"])
17
18 +dnl GDBus backend
19 +dnl This is the default backend if GIO is recent enough
20 +m4_define([gdbus_gio_required],[2.25.7])
21 +PKG_CHECK_MODULES([GDBUS],[gio-2.0 >= gdbus_gio_required],[have_gdbus=yes],[have_gdbus=no])
22 +
23 +AS_IF([test "x$have_gdbus" = "xyes"],
24 + [
25 + AC_DEFINE([HAVE_GDBUS],[1],[Define if GDBus backend is enabled])
26 + ]
27 + )
28 +
29 +AM_CONDITIONAL([HAVE_GDBUS],[test "$have_gdbus" = "yes"])
30 +
31 dnl Bacon backend
32 dnl This is the fallback backend, so we *need* these headers and functions
33 dnl even if we end up using D-Bus
34 @@ -146,7 +159,13 @@ AM_CONDITIONAL([HAVE_BACON], [test "x$have_bacon" = "xyes"])
35
36 dnl Choose the default backend
37 AC_MSG_CHECKING([for default IPC mechanism])
38 -AS_IF([test "x$have_dbus" = "xyes"],
39 +AS_IF([test "x$have_gdbus" = "xyes"],
40 + [
41 + UNIQUE_DEFAULT_BACKEND=gdbus
42 + AC_MSG_RESULT([GDBus])
43 + ],
44 +
45 + [test "x$have_dbus" = "xyes"],
46 [
47 UNIQUE_DEFAULT_BACKEND=dbus
48 AC_MSG_RESULT([D-Bus])
49 @@ -243,6 +262,7 @@ AC_CONFIG_FILES([
50 unique/uniqueversion.h
51 unique/bacon/Makefile
52 unique/dbus/Makefile
53 + unique/gdbus/Makefile
54 tests/Makefile
55 po/Makefile.in
56 ])
57 @@ -261,6 +281,7 @@ Configuration:
58 Backends:
59 Unix Domain Socket: $have_bacon
60 D-BUS: $have_dbus
61 + GDBus: $have_gdbus
62
63 Default backend: $UNIQUE_DEFAULT_BACKEND
64 "
65 diff --git a/doc/reference/Makefile.am b/doc/reference/Makefile.am
66 index 3172588..2c1dbf4 100644
67 --- a/doc/reference/Makefile.am
68 +++ b/doc/reference/Makefile.am
69 @@ -50,7 +50,8 @@ IGNORE_HFILES = \
70 uniquemarshal.h \
71 stamp-uniquemarshal.h \
72 bacon \
73 - dbus
74 + dbus \
75 + gdbus
76
77 EXTRA_HFILES =
78
79 diff --git a/unique/Makefile.am b/unique/Makefile.am
80 index 6475a87..8f0b7ba 100644
81 --- a/unique/Makefile.am
82 +++ b/unique/Makefile.am
83 @@ -12,7 +12,11 @@ if HAVE_DBUS
84 SUBDIRS += dbus
85 endif
86
87 -DIST_SUBDIRS = bacon dbus
88 +if HAVE_GDBUS
89 +SUBDIRS += gdbus
90 +endif
91 +
92 +DIST_SUBDIRS = bacon dbus gdbus
93
94 INCLUDES = -I$(top_srcdir)
95
96 @@ -72,6 +76,10 @@ if HAVE_DBUS
97 unique_backend_libs += $(top_builddir)/unique/dbus/libunique-dbus.la
98 endif
99
100 +if HAVE_GDBUS
101 +unique_backend_libs += $(top_builddir)/unique/gdbus/libunique-gdbus.la
102 +endif
103 +
104 uniquedir = $(includedir)/unique-1.0/unique
105 unique_HEADERS = \
106 $(unique_sources_h) \
107 diff --git a/unique/gdbus/.gitignore b/unique/gdbus/.gitignore
108 new file mode 100644
109 index 0000000..c7e22c3
110 --- /dev/null
111 +++ b/unique/gdbus/.gitignore
112 @@ -0,0 +1,2 @@
113 +libunique_gdbus_la-uniquebackend-gdbus.lo
114 +libunique-gdbus.la
115 diff --git a/unique/gdbus/Makefile.am b/unique/gdbus/Makefile.am
116 new file mode 100644
117 index 0000000..e10637d
118 --- /dev/null
119 +++ b/unique/gdbus/Makefile.am
120 @@ -0,0 +1,24 @@
121 +include $(top_srcdir)/build/autotools/Makefile.am.silent
122 +
123 +noinst_LTLIBRARIES = libunique-gdbus.la
124 +
125 +libunique_gdbus_la_SOURCES = \
126 + uniquebackend-gdbus.h \
127 + uniquebackend-gdbus.c
128 +
129 +libunique_gdbus_la_PPCFLAGS = \
130 + -DG_LOG_DOMAIN=\"Unique-GDBus\" \
131 + -DG_DISABLE_SINGLE_INCLUDES \
132 + -I$(top_srcdir) \
133 + $(AM_CPPFLAGS)
134 +
135 +libunique_gdbus_la_CFLAGS = \
136 + $(UNIQUE_CFLAGS) \
137 + $(UNIQUE_DEBUG_CFLAGS) \
138 + $(MAINTAINER_CFLAGS) \
139 + $(GDBUS_CFLAGS) \
140 + $(AM_CFLAGS)
141 +
142 +libunique_gdbus_la_LIBADD = \
143 + $(UNIQUE_LIBS) \
144 + $(GDBUS_LIBS)
145 diff --git a/unique/gdbus/uniquebackend-gdbus.c b/unique/gdbus/uniquebackend-gdbus.c
146 new file mode 100644
147 index 0000000..14d54a9
148 --- /dev/null
149 +++ b/unique/gdbus/uniquebackend-gdbus.c
150 @@ -0,0 +1,303 @@
151 +/* Unique - Single Instance application library
152 + * uniquebackend-gdbus.c: GDBus implementation of UniqueBackend
153 + *
154 + * Copyright (C) 2007 Emmanuele Bassi <ebassi@o-hand.com>
155 + * Copyright © 2010 Christian Persch
156 + *
157 + * This library is free software; you can redistribute it and/or
158 + * modify it under the terms of the GNU Lesser General Public
159 + * License as published by the Free Software Foundation; either
160 + * version 2.1 of the License, or (at your option) any later version.
161 + *
162 + * This library is distributed in the hope that it will be useful,
163 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
164 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
165 + * Lesser General Public License for more details.
166 + *
167 + * You should have received a copy of the GNU Lesser General Public
168 + * License along with this library; if not, write to the Free Software
169 + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
170 + * 02110-1301 USA
171 + */
172 +
173 +#ifdef HAVE_CONFIG_H
174 +#include "config.h"
175 +#endif
176 +
177 +#include <gio/gio.h>
178 +#include <gdk/gdk.h>
179 +
180 +#include "../uniqueinternals.h"
181 +#include "uniquebackend-gdbus.h"
182 +
183 +struct _UniqueBackendGDBus
184 +{
185 + UniqueBackend parent_instance;
186 +
187 + GDBusConnection *connection;
188 + guint registration_id;
189 + guint owner_id;
190 + gboolean owns_name;
191 + GMainLoop *loop;
192 +};
193 +
194 +struct _UniqueBackendGDBusClass
195 +{
196 + UniqueBackendClass parent_class;
197 + GDBusNodeInfo *introspection_data;
198 +};
199 +
200 +G_DEFINE_TYPE (UniqueBackendGDBus, unique_backend_gdbus, UNIQUE_TYPE_BACKEND);
201 +
202 +static const char introspection_xml[] =
203 + "<node name='/'>"
204 + "<interface name='org.gtk.UniqueApp'>"
205 + "<method name='SendMessage'>"
206 + "<arg name='command' type='s' direction='in'/>"
207 + "<arg name='message' type='(suuus)' direction='in'/>"
208 + "<arg name='time' type='u' direction='in'/>"
209 + "<arg name='response' type='s' direction='out'/>"
210 + "</method>"
211 + "</interface>"
212 + "</node>";
213 +
214 +static void
215 +method_call_cb (GDBusConnection *connection,
216 + const gchar *sender,
217 + const gchar *object_path,
218 + const gchar *interface_name,
219 + const gchar *method_name,
220 + GVariant *parameters,
221 + GDBusMethodInvocation *invocation,
222 + gpointer user_data)
223 +{
224 + if (g_strcmp0 (interface_name, "org.gtk.UniqueApp") != 0 ||
225 + g_strcmp0 (object_path, "/Factory") != 0)
226 + return;
227 +
228 + if (g_strcmp0 (method_name, "SendMessage") == 0)
229 + {
230 + UniqueBackend *backend = UNIQUE_BACKEND (user_data);
231 + const gchar *command_str, *data, *startup_id;
232 + guint len, screen_num, workspace, time_;
233 + UniqueMessageData message_data;
234 + gint command;
235 + UniqueResponse response;
236 + GdkDisplay *display;
237 +
238 + g_variant_get (parameters,
239 + "(&s(&suuu&s)u)",
240 + &command_str,
241 + &data, &len, &screen_num, &workspace, &startup_id,
242 + &time_);
243 +
244 + command = unique_command_from_string (backend->parent, command_str);
245 + if (command == 0)
246 + {
247 + g_dbus_method_invocation_return_error (invocation,
248 + G_DBUS_ERROR,
249 + G_DBUS_ERROR_INVALID_ARGS,
250 + "Invalid command `%s' received",
251 + command_str);
252 + return;
253 + }
254 +
255 + display = gdk_display_get_default ();
256 +
257 + message_data.data = len > 0 ? (guchar *) data : NULL;
258 + message_data.length = (gint) len;
259 + message_data.workspace = workspace;
260 + message_data.startup_id = (char *) startup_id;
261 + if (screen_num >= 0 && screen_num < gdk_display_get_n_screens (display))
262 + message_data.screen = gdk_display_get_screen (display, screen_num);
263 + else
264 + message_data.screen = gdk_screen_get_default ();
265 +
266 + response = unique_app_emit_message_received (backend->parent, command, &message_data, time_);
267 +
268 + g_dbus_method_invocation_return_value (invocation,
269 + g_variant_new ("(s)", unique_response_to_string (response)));
270 + return;
271 + }
272 +}
273 +
274 +static void
275 +name_acquired_cb (GDBusConnection *connection,
276 + const gchar *name,
277 + gpointer user_data)
278 +{
279 + UniqueBackendGDBus *backend_gdbus = UNIQUE_BACKEND_GDBUS (user_data);
280 +
281 + backend_gdbus->owns_name = TRUE;
282 + if (backend_gdbus->loop && g_main_loop_is_running (backend_gdbus->loop))
283 + g_main_loop_quit (backend_gdbus->loop);
284 +}
285 +
286 +static void
287 +name_lost_cb (GDBusConnection *connection,
288 + const gchar *name,
289 + gpointer user_data)
290 +{
291 + UniqueBackendGDBus *backend_gdbus = UNIQUE_BACKEND_GDBUS (user_data);
292 +
293 + backend_gdbus->owns_name = FALSE;
294 + if (backend_gdbus->loop && g_main_loop_is_running (backend_gdbus->loop))
295 + g_main_loop_quit (backend_gdbus->loop);
296 +}
297 +
298 +static const GDBusInterfaceVTable interface_vtable = {
299 + method_call_cb,
300 + NULL,
301 + NULL
302 +};
303 +
304 +static gboolean
305 +unique_backend_gdbus_request_name (UniqueBackend *backend)
306 +{
307 + UniqueBackendGDBus *backend_gdbus = UNIQUE_BACKEND_GDBUS (backend);
308 + UniqueBackendGDBusClass *klass = UNIQUE_BACKEND_GDBUS_GET_CLASS (backend);
309 + GError *error;
310 +
311 + error = NULL;
312 + backend_gdbus->connection = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, &error);
313 + if (!backend_gdbus->connection)
314 + {
315 + g_warning ("Unable to open a connection to the session bus: %s",
316 + error->message);
317 + g_error_free (error);
318 +
319 + return FALSE;
320 + }
321 +
322 + backend_gdbus->registration_id =
323 + g_dbus_connection_register_object (backend_gdbus->connection,
324 + "/Factory",
325 + klass->introspection_data->interfaces[0],
326 + &interface_vtable,
327 + backend, NULL,
328 + &error);
329 + if (backend_gdbus->registration_id == 0)
330 + {
331 + g_warning ("Unable to register object with the session bus: %s",
332 + error->message);
333 + g_error_free (error);
334 +
335 + return FALSE;
336 + }
337 +
338 + backend_gdbus->owns_name = FALSE;
339 +
340 + backend_gdbus->owner_id =
341 + g_bus_own_name_on_connection (backend_gdbus->connection,
342 + unique_backend_get_name (backend),
343 + G_BUS_NAME_OWNER_FLAGS_NONE,
344 + name_acquired_cb,
345 + name_lost_cb,
346 + backend, NULL);
347 +
348 + backend_gdbus->loop = g_main_loop_new (NULL, FALSE);
349 + g_main_loop_run (backend_gdbus->loop);
350 + g_main_loop_unref (backend_gdbus->loop);
351 + backend_gdbus->loop = NULL;
352 +
353 + return backend_gdbus->owns_name;
354 +}
355 +
356 +static UniqueResponse
357 +unique_backend_gdbus_send_message (UniqueBackend *backend,
358 + gint command,
359 + UniqueMessageData *message_data,
360 + guint time_)
361 +{
362 + UniqueBackendGDBus *backend_gdbus = UNIQUE_BACKEND_GDBUS (backend);
363 + GVariantBuilder builder;
364 + GVariant *result;
365 + const gchar *command_str, *resp;
366 + UniqueResponse response;
367 + GError *error;
368 +
369 + command_str = unique_command_to_string (backend->parent, command);
370 +
371 + g_variant_builder_init (&builder, G_VARIANT_TYPE ("(s(suuus)u)"));
372 + g_variant_builder_add (&builder, "s", command_str ? command_str : "");
373 + g_variant_builder_open (&builder, G_VARIANT_TYPE ("(suuus)"));
374 + g_variant_builder_add (&builder, "s", message_data->data ? (char *) message_data->data : "");
375 + g_variant_builder_add (&builder, "u", (guint) message_data->length);
376 + g_variant_builder_add (&builder, "u", (guint) gdk_screen_get_number (message_data->screen));
377 + g_variant_builder_add (&builder, "u", (guint) message_data->workspace);
378 + g_variant_builder_add (&builder, "s", message_data->startup_id ? message_data->startup_id : "");
379 + g_variant_builder_close (&builder);
380 + g_variant_builder_add (&builder, "u", time_);
381 +
382 + error = NULL;
383 + result = g_dbus_connection_call_sync (backend_gdbus->connection,
384 + unique_backend_get_name (backend),
385 + "/Factory",
386 + "org.gtk.UniqueApp",
387 + "SendMessage",
388 + g_variant_builder_end (&builder),
389 + G_VARIANT_TYPE ("(s)"),
390 + G_DBUS_CALL_FLAGS_NO_AUTO_START,
391 + -1,
392 + NULL,
393 + &error);
394 + if (error)
395 + {
396 + g_warning ("Error while sending message: %s", error->message);
397 + g_error_free (error);
398 +
399 + return UNIQUE_RESPONSE_INVALID;
400 + }
401 +
402 + g_variant_get (result, "(&s)", &resp);
403 + response = unique_response_from_string (resp);
404 + g_variant_unref (result);
405 +
406 + return response;
407 +}
408 +
409 +static void
410 +unique_backend_gdbus_dispose (GObject *gobject)
411 +{
412 + UniqueBackendGDBus *backend_gdbus = UNIQUE_BACKEND_GDBUS (gobject);
413 +
414 + if (backend_gdbus->owner_id != 0)
415 + {
416 + g_bus_unown_name (backend_gdbus->owner_id);
417 + backend_gdbus->owner_id = 0;
418 + }
419 + if (backend_gdbus->registration_id != 0)
420 + {
421 + g_assert (backend_gdbus->connection != NULL);
422 + g_dbus_connection_unregister_object (backend_gdbus->connection,
423 + backend_gdbus->registration_id);
424 + backend_gdbus->registration_id = 0;
425 + }
426 + if (backend_gdbus->connection)
427 + {
428 + g_object_unref (backend_gdbus->connection);
429 + backend_gdbus->connection = NULL;
430 + }
431 +
432 + G_OBJECT_CLASS (unique_backend_gdbus_parent_class)->dispose (gobject);
433 +}
434 +
435 +static void
436 +unique_backend_gdbus_class_init (UniqueBackendGDBusClass *klass)
437 +{
438 + GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
439 + UniqueBackendClass *backend_class = UNIQUE_BACKEND_CLASS (klass);
440 +
441 + gobject_class->dispose = unique_backend_gdbus_dispose;
442 +
443 + backend_class->request_name = unique_backend_gdbus_request_name;
444 + backend_class->send_message = unique_backend_gdbus_send_message;
445 +
446 + klass->introspection_data = g_dbus_node_info_new_for_xml (introspection_xml, NULL);
447 + g_assert (klass->introspection_data != NULL);
448 +}
449 +
450 +static void
451 +unique_backend_gdbus_init (UniqueBackendGDBus *backend)
452 +{
453 +}
454 diff --git a/unique/gdbus/uniquebackend-gdbus.h b/unique/gdbus/uniquebackend-gdbus.h
455 new file mode 100644
456 index 0000000..41eb6e5
457 --- /dev/null
458 +++ b/unique/gdbus/uniquebackend-gdbus.h
459 @@ -0,0 +1,43 @@
460 +/* Unique - Single Instance application library
461 + * uniquebackend-gdbus.c: GDBus implementation of UniqueBackend
462 + *
463 + * Copyright (C) 2007 Emmanuele Bassi <ebassi@o-hand.com>
464 + *
465 + * This library is free software; you can redistribute it and/or
466 + * modify it under the terms of the GNU Lesser General Public
467 + * License as published by the Free Software Foundation; either
468 + * version 2.1 of the License, or (at your option) any later version.
469 + *
470 + * This library is distributed in the hope that it will be useful,
471 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
472 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
473 + * Lesser General Public License for more details.
474 + *
475 + * You should have received a copy of the GNU Lesser General Public
476 + * License along with this library; if not, write to the Free Software
477 + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
478 + * 02110-1301 USA
479 + */
480 +
481 +#ifndef __UNIQUE_BACKEND_GDBUS_H__
482 +#define __UNIQUE_BACKEND_GDBUS_H__
483 +
484 +#include <unique/uniquebackend.h>
485 +
486 +G_BEGIN_DECLS
487 +
488 +#define UNIQUE_TYPE_BACKEND_GDBUS (unique_backend_gdbus_get_type ())
489 +#define UNIQUE_BACKEND_GDBUS(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), UNIQUE_TYPE_BACKEND_GDBUS, UniqueBackendGDBus))
490 +#define UNIQUE_IS_BACKEND_GDBUS(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), UNIQUE_TYPE_BACKEND_GDBUS))
491 +#define UNIQUE_BACKEND_GDBUS_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), UNIQUE_TYPE_BACKEND_GDBUS, UniqueBackendGDBusClass))
492 +#define UNIQUE_IS_BACKEND_GDBUS_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), UNIQUE_TYPE_BACKEND_GDBUS))
493 +#define UNIQUE_BACKEND_GDBUS_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), UNIQUE_TYPE_BACKEND_GDBUS, UniqueBackendGDBusClass))
494 +
495 +typedef struct _UniqueBackendGDBus UniqueBackendGDBus;
496 +typedef struct _UniqueBackendGDBusClass UniqueBackendGDBusClass;
497 +
498 +GType unique_backend_gdbus_get_type (void) G_GNUC_CONST;
499 +
500 +G_END_DECLS
501 +
502 +#endif /* __UNIQUE_BACKEND_GDBUS_H__ */
503 diff --git a/unique/uniquebackend.c b/unique/uniquebackend.c
504 index 18a0c45..a76e42e 100644
505 --- a/unique/uniquebackend.c
506 +++ b/unique/uniquebackend.c
507 @@ -298,6 +298,9 @@ unique_backend_send_message (UniqueBackend *backend,
508 #ifdef HAVE_DBUS
509 #include "dbus/uniquebackend-dbus.h"
510 #endif
511 +#ifdef HAVE_GDBUS
512 +#include "gdbus/uniquebackend-gdbus.h"
513 +#endif
514
515 /**
516 * unique_backend_create:
517 @@ -329,6 +332,10 @@ unique_backend_create (void)
518 if (strcmp (backend_name, "dbus") == 0)
519 backend_gtype = unique_backend_dbus_get_type ();
520 #endif /* HAVE_DBUS */
521 +#ifdef HAVE_GDBUS
522 + if (strcmp (backend_name, "gdbus") == 0)
523 + backend_gtype = unique_backend_gdbus_get_type ();
524 +#endif /* HAVE_GDBUS */
525 #if !defined(HAVE_BACON) && !defined(HAVE_DBUS)
526 #error Need either bacon or dbus
527 #endif
528 --
529 cgit v0.8.3.1