Mercurial > emacs
annotate src/dbusbind.c @ 87307:710ac69daf1f
* dbusbind.c (top): Include <stdio.h>.
(Fdbus_call_method, Fdbus_send_signal): Apply type cast in
dbus_message_new_method_call and dbus_message_new_signal.
(Fdbus_register_signal): Rename unique_name to uname. Check
handler for FUNCTIONP instead of CHECK_SYMBOL. Handle case of
non-existing unique name. Fix typos in matching rule. Return an
object which is useful in Fdbus_unregister_signal.
(Fdbus_unregister_signal): Reimplementation, in order to remove
only the corresponding entry.
(Vdbus_registered_functions_table): Change the order of entries.
Apply these changes in xd_read_message and Fdbus_register_signal.
author | Michael Albinus <michael.albinus@gmx.de> |
---|---|
date | Sun, 16 Dec 2007 22:36:47 +0000 |
parents | e0d7140e5b0e |
children | 02e327d7d839 |
rev | line source |
---|---|
86940
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
1 /* Elisp bindings for D-Bus. |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
2 Copyright (C) 2007 Free Software Foundation, Inc. |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
3 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
4 This file is part of GNU Emacs. |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
5 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
6 GNU Emacs is free software; you can redistribute it and/or modify |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
7 it under the terms of the GNU General Public License as published by |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
8 the Free Software Foundation; either version 3, or (at your option) |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
9 any later version. |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
10 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
11 GNU Emacs is distributed in the hope that it will be useful, |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
12 but WITHOUT ANY WARRANTY; without even the implied warranty of |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
14 GNU General Public License for more details. |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
15 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
16 You should have received a copy of the GNU General Public License |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
17 along with GNU Emacs; see the file COPYING. If not, write to |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
18 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
19 Boston, MA 02110-1301, USA. */ |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
20 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
21 #include "config.h" |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
22 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
23 #ifdef HAVE_DBUS |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
24 #include <stdlib.h> |
87307
710ac69daf1f
* dbusbind.c (top): Include <stdio.h>.
Michael Albinus <michael.albinus@gmx.de>
parents:
87280
diff
changeset
|
25 #include <stdio.h> |
86940
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
26 #include <dbus/dbus.h> |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
27 #include "lisp.h" |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
28 #include "frame.h" |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
29 #include "termhooks.h" |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
30 #include "keyboard.h" |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
31 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
32 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
33 /* Subroutines. */ |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
34 Lisp_Object Qdbus_get_unique_name; |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
35 Lisp_Object Qdbus_call_method; |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
36 Lisp_Object Qdbus_send_signal; |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
37 Lisp_Object Qdbus_register_signal; |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
38 Lisp_Object Qdbus_unregister_signal; |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
39 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
40 /* D-Bus error symbol. */ |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
41 Lisp_Object Qdbus_error; |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
42 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
43 /* Lisp symbols of the system and session buses. */ |
87051
1da959e791de
* dbusbind.c (QCdbus_system_bus, QCdbus_session_bus): Renamed from
Michael Albinus <michael.albinus@gmx.de>
parents:
86940
diff
changeset
|
44 Lisp_Object QCdbus_system_bus, QCdbus_session_bus; |
86940
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
45 |
87051
1da959e791de
* dbusbind.c (QCdbus_system_bus, QCdbus_session_bus): Renamed from
Michael Albinus <michael.albinus@gmx.de>
parents:
86940
diff
changeset
|
46 /* Hash table which keeps function definitions. */ |
1da959e791de
* dbusbind.c (QCdbus_system_bus, QCdbus_session_bus): Renamed from
Michael Albinus <michael.albinus@gmx.de>
parents:
86940
diff
changeset
|
47 Lisp_Object Vdbus_registered_functions_table; |
86940
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
48 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
49 /* Whether to debug D-Bus. */ |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
50 Lisp_Object Vdbus_debug; |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
51 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
52 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
53 /* We use "xd_" and "XD_" as prefix for all internal symbols, because |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
54 we don't want to poison other namespaces with "dbus_". */ |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
55 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
56 /* Raise a Lisp error from a D-Bus error. */ |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
57 #define XD_ERROR(error) \ |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
58 { \ |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
59 char s[1024]; \ |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
60 strcpy (s, error.message); \ |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
61 dbus_error_free (&error); \ |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
62 /* Remove the trailing newline. */ \ |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
63 if (strchr (s, '\n') != NULL) \ |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
64 s[strlen (s) - 1] = '\0'; \ |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
65 xsignal1 (Qdbus_error, build_string (s)); \ |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
66 } |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
67 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
68 /* Macros for debugging. In order to enable them, build with |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
69 "make MYCPPFLAGS='-DDBUS_DEBUG'". */ |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
70 #ifdef DBUS_DEBUG |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
71 #define XD_DEBUG_MESSAGE(...) \ |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
72 { \ |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
73 char s[1024]; \ |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
74 sprintf (s, __VA_ARGS__); \ |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
75 printf ("%s: %s\n", __func__, s); \ |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
76 message ("%s: %s", __func__, s); \ |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
77 } |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
78 #define XD_DEBUG_VALID_LISP_OBJECT_P(object) \ |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
79 if (!valid_lisp_object_p (object)) \ |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
80 { \ |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
81 XD_DEBUG_MESSAGE ("%s Assertion failure", __LINE__); \ |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
82 xsignal1 (Qdbus_error, build_string ("Assertion failure")); \ |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
83 } |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
84 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
85 #else /* !DBUS_DEBUG */ |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
86 #define XD_DEBUG_MESSAGE(...) \ |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
87 if (!NILP (Vdbus_debug)) \ |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
88 { \ |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
89 char s[1024]; \ |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
90 sprintf (s, __VA_ARGS__); \ |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
91 message ("%s: %s", __func__, s); \ |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
92 } |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
93 #define XD_DEBUG_VALID_LISP_OBJECT_P(object) |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
94 #endif |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
95 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
96 /* Determine the DBusType of a given Lisp object. It is used to |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
97 convert Lisp objects, being arguments of `dbus-call-method' or |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
98 `dbus-send-signal', into corresponding C values appended as |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
99 arguments to a D-Bus message. */ |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
100 #define XD_LISP_OBJECT_TO_DBUS_TYPE(object) \ |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
101 (EQ (object, Qt) || EQ (object, Qnil)) ? DBUS_TYPE_BOOLEAN : \ |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
102 (NATNUMP (object)) ? DBUS_TYPE_UINT32 : \ |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
103 (INTEGERP (object)) ? DBUS_TYPE_INT32 : \ |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
104 (FLOATP (object)) ? DBUS_TYPE_DOUBLE : \ |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
105 (STRINGP (object)) ? DBUS_TYPE_STRING : \ |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
106 DBUS_TYPE_INVALID |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
107 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
108 /* Extract C value from Lisp OBJECT. DTYPE must be a valid DBusType, |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
109 as detected by XD_LISP_OBJECT_TO_DBUS_TYPE. Compound types are not |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
110 supported (yet). It is used to convert Lisp objects, being |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
111 arguments of `dbus-call-method' or `dbus-send-signal', into |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
112 corresponding C values appended as arguments to a D-Bus |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
113 message. */ |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
114 char * |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
115 xd_retrieve_value (dtype, object) |
87280
e0d7140e5b0e
* dbusbind.c (xd_retrieve_value, xd_retrieve_arg)
Michael Albinus <michael.albinus@gmx.de>
parents:
87175
diff
changeset
|
116 unsigned int dtype; |
86940
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
117 Lisp_Object object; |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
118 { |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
119 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
120 XD_DEBUG_VALID_LISP_OBJECT_P (object); |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
121 switch (dtype) |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
122 { |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
123 case DBUS_TYPE_BOOLEAN: |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
124 XD_DEBUG_MESSAGE ("%d %s", dtype, (NILP (object)) ? "false" : "true"); |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
125 return (NILP (object)) ? (char *) FALSE : (char *) TRUE; |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
126 case DBUS_TYPE_UINT32: |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
127 XD_DEBUG_MESSAGE ("%d %d", dtype, XUINT (object)); |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
128 return (char *) XUINT (object); |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
129 case DBUS_TYPE_INT32: |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
130 XD_DEBUG_MESSAGE ("%d %d", dtype, XINT (object)); |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
131 return (char *) XINT (object); |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
132 case DBUS_TYPE_DOUBLE: |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
133 XD_DEBUG_MESSAGE ("%d %d", dtype, XFLOAT (object)); |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
134 return (char *) XFLOAT (object); |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
135 case DBUS_TYPE_STRING: |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
136 XD_DEBUG_MESSAGE ("%d %s", dtype, SDATA (object)); |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
137 return SDATA (object); |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
138 default: |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
139 XD_DEBUG_MESSAGE ("DBus-Type %d not supported", dtype); |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
140 return NULL; |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
141 } |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
142 } |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
143 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
144 /* Retrieve C value from a DBusMessageIter structure ITER, and return |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
145 a converted Lisp object. The type DTYPE of the argument of the |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
146 D-Bus message must be a valid DBusType. Compound D-Bus types are |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
147 partly supported; they result always in a Lisp list. */ |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
148 Lisp_Object |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
149 xd_retrieve_arg (dtype, iter) |
87280
e0d7140e5b0e
* dbusbind.c (xd_retrieve_value, xd_retrieve_arg)
Michael Albinus <michael.albinus@gmx.de>
parents:
87175
diff
changeset
|
150 unsigned int dtype; |
86940
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
151 DBusMessageIter *iter; |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
152 { |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
153 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
154 switch (dtype) |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
155 { |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
156 case DBUS_TYPE_BOOLEAN: |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
157 { |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
158 dbus_bool_t val; |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
159 dbus_message_iter_get_basic (iter, &val); |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
160 XD_DEBUG_MESSAGE ("%d %s", dtype, (val == FALSE) ? "false" : "true"); |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
161 return (val == FALSE) ? Qnil : Qt; |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
162 } |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
163 case DBUS_TYPE_INT32: |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
164 case DBUS_TYPE_UINT32: |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
165 { |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
166 dbus_uint32_t val; |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
167 dbus_message_iter_get_basic (iter, &val); |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
168 XD_DEBUG_MESSAGE ("%d %d", dtype, val); |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
169 return make_number (val); |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
170 } |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
171 case DBUS_TYPE_STRING: |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
172 case DBUS_TYPE_OBJECT_PATH: |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
173 { |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
174 char *val; |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
175 dbus_message_iter_get_basic (iter, &val); |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
176 XD_DEBUG_MESSAGE ("%d %s", dtype, val); |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
177 return build_string (val); |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
178 } |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
179 case DBUS_TYPE_ARRAY: |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
180 case DBUS_TYPE_VARIANT: |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
181 case DBUS_TYPE_STRUCT: |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
182 case DBUS_TYPE_DICT_ENTRY: |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
183 { |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
184 Lisp_Object result; |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
185 struct gcpro gcpro1; |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
186 result = Qnil; |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
187 GCPRO1 (result); |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
188 DBusMessageIter subiter; |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
189 int subtype; |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
190 dbus_message_iter_recurse (iter, &subiter); |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
191 while ((subtype = dbus_message_iter_get_arg_type (&subiter)) |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
192 != DBUS_TYPE_INVALID) |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
193 { |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
194 result = Fcons (xd_retrieve_arg (subtype, &subiter), result); |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
195 dbus_message_iter_next (&subiter); |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
196 } |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
197 RETURN_UNGCPRO (Fnreverse (result)); |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
198 } |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
199 default: |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
200 XD_DEBUG_MESSAGE ("DBusType %d not supported", dtype); |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
201 return Qnil; |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
202 } |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
203 } |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
204 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
205 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
206 /* Initialize D-Bus connection. BUS is a Lisp symbol, either :system |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
207 or :session. It tells which D-Bus to be initialized. */ |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
208 DBusConnection * |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
209 xd_initialize (bus) |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
210 Lisp_Object bus; |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
211 { |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
212 DBusConnection *connection; |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
213 DBusError derror; |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
214 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
215 /* Parameter check. */ |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
216 CHECK_SYMBOL (bus); |
87051
1da959e791de
* dbusbind.c (QCdbus_system_bus, QCdbus_session_bus): Renamed from
Michael Albinus <michael.albinus@gmx.de>
parents:
86940
diff
changeset
|
217 if (!((EQ (bus, QCdbus_system_bus)) || (EQ (bus, QCdbus_session_bus)))) |
86940
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
218 xsignal2 (Qdbus_error, build_string ("Wrong bus name"), bus); |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
219 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
220 /* Open a connection to the bus. */ |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
221 dbus_error_init (&derror); |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
222 |
87051
1da959e791de
* dbusbind.c (QCdbus_system_bus, QCdbus_session_bus): Renamed from
Michael Albinus <michael.albinus@gmx.de>
parents:
86940
diff
changeset
|
223 if (EQ (bus, QCdbus_system_bus)) |
86940
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
224 connection = dbus_bus_get (DBUS_BUS_SYSTEM, &derror); |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
225 else |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
226 connection = dbus_bus_get (DBUS_BUS_SESSION, &derror); |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
227 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
228 if (dbus_error_is_set (&derror)) |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
229 XD_ERROR (derror); |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
230 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
231 if (connection == NULL) |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
232 xsignal2 (Qdbus_error, build_string ("No connection"), bus); |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
233 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
234 /* Return the result. */ |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
235 return connection; |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
236 } |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
237 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
238 DEFUN ("dbus-get-unique-name", Fdbus_get_unique_name, Sdbus_get_unique_name, |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
239 1, 1, 0, |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
240 doc: /* Return the unique name of Emacs registered at D-Bus BUS as string. */) |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
241 (bus) |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
242 Lisp_Object bus; |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
243 { |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
244 DBusConnection *connection; |
87156
e0ab56e63db8
* dbusbind.c (Fdbus_get_unique_name, xd_read_message)
Michael Albinus <michael.albinus@gmx.de>
parents:
87092
diff
changeset
|
245 char name[DBUS_MAXIMUM_NAME_LENGTH]; |
86940
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
246 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
247 /* Check parameters. */ |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
248 CHECK_SYMBOL (bus); |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
249 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
250 /* Open a connection to the bus. */ |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
251 connection = xd_initialize (bus); |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
252 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
253 /* Request the name. */ |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
254 strcpy (name, dbus_bus_get_unique_name (connection)); |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
255 if (name == NULL) |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
256 xsignal1 (Qdbus_error, build_string ("No unique name available")); |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
257 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
258 /* Return. */ |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
259 return build_string (name); |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
260 } |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
261 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
262 DEFUN ("dbus-call-method", Fdbus_call_method, Sdbus_call_method, 5, MANY, 0, |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
263 doc: /* Call METHOD on the D-Bus BUS. |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
264 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
265 BUS is either the symbol `:system' or the symbol `:session'. |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
266 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
267 SERVICE is the D-Bus service name to be used. PATH is the D-Bus |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
268 object path SERVICE is registered at. INTERFACE is an interface |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
269 offered by SERVICE. It must provide METHOD. |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
270 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
271 All other arguments ARGS are passed to METHOD as arguments. They are |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
272 converted into D-Bus types via the following rules: |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
273 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
274 t and nil => DBUS_TYPE_BOOLEAN |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
275 number => DBUS_TYPE_UINT32 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
276 integer => DBUS_TYPE_INT32 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
277 float => DBUS_TYPE_DOUBLE |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
278 string => DBUS_TYPE_STRING |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
279 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
280 Other Lisp objects are not supported as input arguments of METHOD. |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
281 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
282 `dbus-call-method' returns the resulting values of METHOD as a list of |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
283 Lisp objects. The type conversion happens the other direction as for |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
284 input arguments. Additionally to the types supported for input |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
285 arguments, the D-Bus compound types DBUS_TYPE_ARRAY, DBUS_TYPE_VARIANT, |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
286 DBUS_TYPE_STRUCT and DBUS_TYPE_DICT_ENTRY are accepted. All of them |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
287 are converted into a list of Lisp objects which correspond to the |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
288 elements of the D-Bus container. Example: |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
289 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
290 \(dbus-call-method |
87156
e0ab56e63db8
* dbusbind.c (Fdbus_get_unique_name, xd_read_message)
Michael Albinus <michael.albinus@gmx.de>
parents:
87092
diff
changeset
|
291 :session "org.gnome.seahorse" "/org/gnome/seahorse/keys/openpgp" |
e0ab56e63db8
* dbusbind.c (Fdbus_get_unique_name, xd_read_message)
Michael Albinus <michael.albinus@gmx.de>
parents:
87092
diff
changeset
|
292 "org.gnome.seahorse.Keys" "GetKeyField" |
86940
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
293 "openpgp:657984B8C7A966DD" "simple-name") |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
294 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
295 => (t ("Philip R. Zimmermann")) |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
296 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
297 If the result of the METHOD call is just one value, the converted Lisp |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
298 object is returned instead of a list containing this single Lisp object. |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
299 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
300 \(dbus-call-method |
87156
e0ab56e63db8
* dbusbind.c (Fdbus_get_unique_name, xd_read_message)
Michael Albinus <michael.albinus@gmx.de>
parents:
87092
diff
changeset
|
301 :system "org.freedesktop.Hal" "/org/freedesktop/Hal/devices/computer" |
e0ab56e63db8
* dbusbind.c (Fdbus_get_unique_name, xd_read_message)
Michael Albinus <michael.albinus@gmx.de>
parents:
87092
diff
changeset
|
302 "org.freedesktop.Hal.Device" "GetPropertyString" |
86940
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
303 "system.kernel.machine") |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
304 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
305 => "i686" |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
306 |
87156
e0ab56e63db8
* dbusbind.c (Fdbus_get_unique_name, xd_read_message)
Michael Albinus <michael.albinus@gmx.de>
parents:
87092
diff
changeset
|
307 usage: (dbus-call-method BUS SERVICE PATH INTERFACE METHOD &rest ARGS) */) |
86940
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
308 (nargs, args) |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
309 int nargs; |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
310 register Lisp_Object *args; |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
311 { |
87156
e0ab56e63db8
* dbusbind.c (Fdbus_get_unique_name, xd_read_message)
Michael Albinus <michael.albinus@gmx.de>
parents:
87092
diff
changeset
|
312 Lisp_Object bus, service, path, interface, method; |
86940
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
313 Lisp_Object result; |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
314 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4, gcpro5; |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
315 DBusConnection *connection; |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
316 DBusMessage *dmessage; |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
317 DBusMessage *reply; |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
318 DBusMessageIter iter; |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
319 DBusError derror; |
87280
e0d7140e5b0e
* dbusbind.c (xd_retrieve_value, xd_retrieve_arg)
Michael Albinus <michael.albinus@gmx.de>
parents:
87175
diff
changeset
|
320 unsigned int dtype; |
86940
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
321 int i; |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
322 char *value; |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
323 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
324 /* Check parameters. */ |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
325 bus = args[0]; |
87156
e0ab56e63db8
* dbusbind.c (Fdbus_get_unique_name, xd_read_message)
Michael Albinus <michael.albinus@gmx.de>
parents:
87092
diff
changeset
|
326 service = args[1]; |
e0ab56e63db8
* dbusbind.c (Fdbus_get_unique_name, xd_read_message)
Michael Albinus <michael.albinus@gmx.de>
parents:
87092
diff
changeset
|
327 path = args[2]; |
e0ab56e63db8
* dbusbind.c (Fdbus_get_unique_name, xd_read_message)
Michael Albinus <michael.albinus@gmx.de>
parents:
87092
diff
changeset
|
328 interface = args[3]; |
e0ab56e63db8
* dbusbind.c (Fdbus_get_unique_name, xd_read_message)
Michael Albinus <michael.albinus@gmx.de>
parents:
87092
diff
changeset
|
329 method = args[4]; |
86940
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
330 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
331 CHECK_SYMBOL (bus); |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
332 CHECK_STRING (service); |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
333 CHECK_STRING (path); |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
334 CHECK_STRING (interface); |
87156
e0ab56e63db8
* dbusbind.c (Fdbus_get_unique_name, xd_read_message)
Michael Albinus <michael.albinus@gmx.de>
parents:
87092
diff
changeset
|
335 CHECK_STRING (method); |
e0ab56e63db8
* dbusbind.c (Fdbus_get_unique_name, xd_read_message)
Michael Albinus <michael.albinus@gmx.de>
parents:
87092
diff
changeset
|
336 GCPRO5 (bus, service, path, interface, method); |
86940
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
337 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
338 XD_DEBUG_MESSAGE ("%s %s %s %s", |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
339 SDATA (service), |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
340 SDATA (path), |
87156
e0ab56e63db8
* dbusbind.c (Fdbus_get_unique_name, xd_read_message)
Michael Albinus <michael.albinus@gmx.de>
parents:
87092
diff
changeset
|
341 SDATA (interface), |
e0ab56e63db8
* dbusbind.c (Fdbus_get_unique_name, xd_read_message)
Michael Albinus <michael.albinus@gmx.de>
parents:
87092
diff
changeset
|
342 SDATA (method)); |
86940
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
343 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
344 /* Open a connection to the bus. */ |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
345 connection = xd_initialize (bus); |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
346 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
347 /* Create the message. */ |
87307
710ac69daf1f
* dbusbind.c (top): Include <stdio.h>.
Michael Albinus <michael.albinus@gmx.de>
parents:
87280
diff
changeset
|
348 dmessage = dbus_message_new_method_call ((char *) SDATA (service), |
710ac69daf1f
* dbusbind.c (top): Include <stdio.h>.
Michael Albinus <michael.albinus@gmx.de>
parents:
87280
diff
changeset
|
349 (char *) SDATA (path), |
710ac69daf1f
* dbusbind.c (top): Include <stdio.h>.
Michael Albinus <michael.albinus@gmx.de>
parents:
87280
diff
changeset
|
350 (char *) SDATA (interface), |
710ac69daf1f
* dbusbind.c (top): Include <stdio.h>.
Michael Albinus <michael.albinus@gmx.de>
parents:
87280
diff
changeset
|
351 (char *) SDATA (method)); |
86940
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
352 if (dmessage == NULL) |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
353 { |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
354 UNGCPRO; |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
355 xsignal1 (Qdbus_error, build_string ("Unable to create a new message")); |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
356 } |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
357 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
358 UNGCPRO; |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
359 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
360 /* Append parameters to the message. */ |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
361 for (i = 5; i < nargs; ++i) |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
362 { |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
363 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
364 XD_DEBUG_VALID_LISP_OBJECT_P (args[i]); |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
365 XD_DEBUG_MESSAGE ("Parameter%d %s", |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
366 i-4, |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
367 SDATA (format2 ("%s", args[i], Qnil))); |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
368 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
369 dtype = XD_LISP_OBJECT_TO_DBUS_TYPE (args[i]); |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
370 if (dtype == DBUS_TYPE_INVALID) |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
371 xsignal2 (Qdbus_error, build_string ("Not a valid argument"), args[i]); |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
372 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
373 value = (char *) xd_retrieve_value (dtype, args[i]); |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
374 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
375 if (!dbus_message_append_args (dmessage, |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
376 dtype, |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
377 &value, |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
378 DBUS_TYPE_INVALID)) |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
379 xsignal2 (Qdbus_error, |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
380 build_string ("Unable to append argument"), args[i]); |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
381 } |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
382 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
383 /* Send the message. */ |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
384 dbus_error_init (&derror); |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
385 reply = dbus_connection_send_with_reply_and_block (connection, |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
386 dmessage, |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
387 -1, |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
388 &derror); |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
389 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
390 if (dbus_error_is_set (&derror)) |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
391 XD_ERROR (derror); |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
392 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
393 if (reply == NULL) |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
394 xsignal1 (Qdbus_error, build_string ("No reply")); |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
395 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
396 XD_DEBUG_MESSAGE ("Message sent"); |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
397 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
398 /* Collect the results. */ |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
399 result = Qnil; |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
400 GCPRO1 (result); |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
401 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
402 if (!dbus_message_iter_init (reply, &iter)) |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
403 { |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
404 UNGCPRO; |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
405 xsignal1 (Qdbus_error, build_string ("Cannot read reply")); |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
406 } |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
407 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
408 /* Loop over the parameters of the D-Bus reply message. Construct a |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
409 Lisp list, which is returned by `dbus-call-method'. */ |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
410 while ((dtype = dbus_message_iter_get_arg_type (&iter)) != DBUS_TYPE_INVALID) |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
411 { |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
412 result = Fcons (xd_retrieve_arg (dtype, &iter), result); |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
413 dbus_message_iter_next (&iter); |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
414 } |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
415 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
416 /* Cleanup. */ |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
417 dbus_message_unref (dmessage); |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
418 dbus_message_unref (reply); |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
419 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
420 /* Return the result. If there is only one single Lisp object, |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
421 return it as-it-is, otherwise return the reversed list. */ |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
422 if (XUINT (Flength (result)) == 1) |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
423 RETURN_UNGCPRO (XCAR (result)); |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
424 else |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
425 RETURN_UNGCPRO (Fnreverse (result)); |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
426 } |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
427 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
428 DEFUN ("dbus-send-signal", Fdbus_send_signal, Sdbus_send_signal, 5, MANY, 0, |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
429 doc: /* Send signal SIGNAL on the D-Bus BUS. |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
430 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
431 BUS is either the symbol `:system' or the symbol `:session'. |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
432 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
433 SERVICE is the D-Bus service name SIGNAL is sent from. PATH is the |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
434 D-Bus object path SERVICE is registered at. INTERFACE is an interface |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
435 offered by SERVICE. It must provide signal SIGNAL. |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
436 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
437 All other arguments ARGS are passed to SIGNAL as arguments. They are |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
438 converted into D-Bus types via the following rules: |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
439 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
440 t and nil => DBUS_TYPE_BOOLEAN |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
441 number => DBUS_TYPE_UINT32 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
442 integer => DBUS_TYPE_INT32 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
443 float => DBUS_TYPE_DOUBLE |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
444 string => DBUS_TYPE_STRING |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
445 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
446 Other Lisp objects are not supported as arguments of SIGNAL. |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
447 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
448 Example: |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
449 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
450 \(dbus-send-signal |
87156
e0ab56e63db8
* dbusbind.c (Fdbus_get_unique_name, xd_read_message)
Michael Albinus <michael.albinus@gmx.de>
parents:
87092
diff
changeset
|
451 :session "org.gnu.Emacs" "/org/gnu/Emacs" |
e0ab56e63db8
* dbusbind.c (Fdbus_get_unique_name, xd_read_message)
Michael Albinus <michael.albinus@gmx.de>
parents:
87092
diff
changeset
|
452 "org.gnu.Emacs.FileManager" "FileModified" "/home/albinus/.emacs") |
86940
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
453 |
87156
e0ab56e63db8
* dbusbind.c (Fdbus_get_unique_name, xd_read_message)
Michael Albinus <michael.albinus@gmx.de>
parents:
87092
diff
changeset
|
454 usage: (dbus-send-signal BUS SERVICE PATH INTERFACE SIGNAL &rest ARGS) */) |
86940
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
455 (nargs, args) |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
456 int nargs; |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
457 register Lisp_Object *args; |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
458 { |
87156
e0ab56e63db8
* dbusbind.c (Fdbus_get_unique_name, xd_read_message)
Michael Albinus <michael.albinus@gmx.de>
parents:
87092
diff
changeset
|
459 Lisp_Object bus, service, path, interface, signal; |
86940
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
460 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4, gcpro5; |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
461 DBusConnection *connection; |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
462 DBusMessage *dmessage; |
87280
e0d7140e5b0e
* dbusbind.c (xd_retrieve_value, xd_retrieve_arg)
Michael Albinus <michael.albinus@gmx.de>
parents:
87175
diff
changeset
|
463 unsigned int dtype; |
86940
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
464 int i; |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
465 char *value; |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
466 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
467 /* Check parameters. */ |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
468 bus = args[0]; |
87156
e0ab56e63db8
* dbusbind.c (Fdbus_get_unique_name, xd_read_message)
Michael Albinus <michael.albinus@gmx.de>
parents:
87092
diff
changeset
|
469 service = args[1]; |
e0ab56e63db8
* dbusbind.c (Fdbus_get_unique_name, xd_read_message)
Michael Albinus <michael.albinus@gmx.de>
parents:
87092
diff
changeset
|
470 path = args[2]; |
e0ab56e63db8
* dbusbind.c (Fdbus_get_unique_name, xd_read_message)
Michael Albinus <michael.albinus@gmx.de>
parents:
87092
diff
changeset
|
471 interface = args[3]; |
e0ab56e63db8
* dbusbind.c (Fdbus_get_unique_name, xd_read_message)
Michael Albinus <michael.albinus@gmx.de>
parents:
87092
diff
changeset
|
472 signal = args[4]; |
86940
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
473 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
474 CHECK_SYMBOL (bus); |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
475 CHECK_STRING (service); |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
476 CHECK_STRING (path); |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
477 CHECK_STRING (interface); |
87156
e0ab56e63db8
* dbusbind.c (Fdbus_get_unique_name, xd_read_message)
Michael Albinus <michael.albinus@gmx.de>
parents:
87092
diff
changeset
|
478 CHECK_STRING (signal); |
e0ab56e63db8
* dbusbind.c (Fdbus_get_unique_name, xd_read_message)
Michael Albinus <michael.albinus@gmx.de>
parents:
87092
diff
changeset
|
479 GCPRO5 (bus, service, path, interface, signal); |
86940
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
480 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
481 XD_DEBUG_MESSAGE ("%s %s %s %s", |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
482 SDATA (service), |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
483 SDATA (path), |
87156
e0ab56e63db8
* dbusbind.c (Fdbus_get_unique_name, xd_read_message)
Michael Albinus <michael.albinus@gmx.de>
parents:
87092
diff
changeset
|
484 SDATA (interface), |
e0ab56e63db8
* dbusbind.c (Fdbus_get_unique_name, xd_read_message)
Michael Albinus <michael.albinus@gmx.de>
parents:
87092
diff
changeset
|
485 SDATA (signal)); |
86940
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
486 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
487 /* Open a connection to the bus. */ |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
488 connection = xd_initialize (bus); |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
489 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
490 /* Create the message. */ |
87307
710ac69daf1f
* dbusbind.c (top): Include <stdio.h>.
Michael Albinus <michael.albinus@gmx.de>
parents:
87280
diff
changeset
|
491 dmessage = dbus_message_new_signal ((char *) SDATA (path), |
710ac69daf1f
* dbusbind.c (top): Include <stdio.h>.
Michael Albinus <michael.albinus@gmx.de>
parents:
87280
diff
changeset
|
492 (char *) SDATA (interface), |
710ac69daf1f
* dbusbind.c (top): Include <stdio.h>.
Michael Albinus <michael.albinus@gmx.de>
parents:
87280
diff
changeset
|
493 (char *) SDATA (signal)); |
86940
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
494 if (dmessage == NULL) |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
495 { |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
496 UNGCPRO; |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
497 xsignal1 (Qdbus_error, build_string ("Unable to create a new message")); |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
498 } |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
499 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
500 UNGCPRO; |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
501 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
502 /* Append parameters to the message. */ |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
503 for (i = 5; i < nargs; ++i) |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
504 { |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
505 XD_DEBUG_VALID_LISP_OBJECT_P (args[i]); |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
506 XD_DEBUG_MESSAGE ("Parameter%d %s", |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
507 i-4, |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
508 SDATA (format2 ("%s", args[i], Qnil))); |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
509 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
510 dtype = XD_LISP_OBJECT_TO_DBUS_TYPE (args[i]); |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
511 if (dtype == DBUS_TYPE_INVALID) |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
512 xsignal2 (Qdbus_error, build_string ("Not a valid argument"), args[i]); |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
513 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
514 value = (char *) xd_retrieve_value (dtype, args[i]); |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
515 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
516 if (!dbus_message_append_args (dmessage, |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
517 dtype, |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
518 &value, |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
519 DBUS_TYPE_INVALID)) |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
520 xsignal2 (Qdbus_error, |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
521 build_string ("Unable to append argument"), args[i]); |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
522 } |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
523 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
524 /* Send the message. The message is just added to the outgoing |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
525 message queue. */ |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
526 if (!dbus_connection_send (connection, dmessage, NULL)) |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
527 xsignal1 (Qdbus_error, build_string ("Cannot send message")); |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
528 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
529 /* Flush connection to ensure the message is handled. */ |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
530 dbus_connection_flush (connection); |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
531 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
532 XD_DEBUG_MESSAGE ("Signal sent"); |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
533 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
534 /* Cleanup. */ |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
535 dbus_message_unref (dmessage); |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
536 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
537 /* Return. */ |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
538 return Qt; |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
539 } |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
540 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
541 /* Read queued incoming message of the D-Bus BUS. BUS is a Lisp |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
542 symbol, either :system or :session. */ |
87092
1ddad0de60e5
* dbusbind.c (xd_read_message): Return value is a Lisp_Object.
Michael Albinus <michael.albinus@gmx.de>
parents:
87053
diff
changeset
|
543 Lisp_Object |
86940
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
544 xd_read_message (bus) |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
545 Lisp_Object bus; |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
546 { |
87175
30175fd3b679
* dbusbind.c (xd_read_message): Generate an event for every
Michael Albinus <michael.albinus@gmx.de>
parents:
87156
diff
changeset
|
547 Lisp_Object args, key, value; |
86940
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
548 struct gcpro gcpro1; |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
549 static struct input_event event; |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
550 DBusConnection *connection; |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
551 DBusMessage *dmessage; |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
552 DBusMessageIter iter; |
87280
e0d7140e5b0e
* dbusbind.c (xd_retrieve_value, xd_retrieve_arg)
Michael Albinus <michael.albinus@gmx.de>
parents:
87175
diff
changeset
|
553 unsigned int dtype; |
87175
30175fd3b679
* dbusbind.c (xd_read_message): Generate an event for every
Michael Albinus <michael.albinus@gmx.de>
parents:
87156
diff
changeset
|
554 char uname[DBUS_MAXIMUM_NAME_LENGTH]; |
87156
e0ab56e63db8
* dbusbind.c (Fdbus_get_unique_name, xd_read_message)
Michael Albinus <michael.albinus@gmx.de>
parents:
87092
diff
changeset
|
555 char path[DBUS_MAXIMUM_MATCH_RULE_LENGTH]; /* Unlimited in D-Bus spec. */ |
e0ab56e63db8
* dbusbind.c (Fdbus_get_unique_name, xd_read_message)
Michael Albinus <michael.albinus@gmx.de>
parents:
87092
diff
changeset
|
556 char interface[DBUS_MAXIMUM_NAME_LENGTH]; |
e0ab56e63db8
* dbusbind.c (Fdbus_get_unique_name, xd_read_message)
Michael Albinus <michael.albinus@gmx.de>
parents:
87092
diff
changeset
|
557 char member[DBUS_MAXIMUM_NAME_LENGTH]; |
87051
1da959e791de
* dbusbind.c (QCdbus_system_bus, QCdbus_session_bus): Renamed from
Michael Albinus <michael.albinus@gmx.de>
parents:
86940
diff
changeset
|
558 |
86940
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
559 /* Open a connection to the bus. */ |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
560 connection = xd_initialize (bus); |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
561 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
562 /* Non blocking read of the next available message. */ |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
563 dbus_connection_read_write (connection, 0); |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
564 dmessage = dbus_connection_pop_message (connection); |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
565 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
566 /* Return if there is no queued message. */ |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
567 if (dmessage == NULL) |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
568 return; |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
569 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
570 XD_DEBUG_MESSAGE ("Event received"); |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
571 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
572 /* Collect the parameters. */ |
87175
30175fd3b679
* dbusbind.c (xd_read_message): Generate an event for every
Michael Albinus <michael.albinus@gmx.de>
parents:
87156
diff
changeset
|
573 args = Qnil; |
30175fd3b679
* dbusbind.c (xd_read_message): Generate an event for every
Michael Albinus <michael.albinus@gmx.de>
parents:
87156
diff
changeset
|
574 GCPRO1 (args); |
86940
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
575 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
576 if (!dbus_message_iter_init (dmessage, &iter)) |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
577 { |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
578 UNGCPRO; |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
579 XD_DEBUG_MESSAGE ("Cannot read event"); |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
580 return; |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
581 } |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
582 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
583 /* Loop over the resulting parameters. Construct a list. */ |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
584 while ((dtype = dbus_message_iter_get_arg_type (&iter)) != DBUS_TYPE_INVALID) |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
585 { |
87175
30175fd3b679
* dbusbind.c (xd_read_message): Generate an event for every
Michael Albinus <michael.albinus@gmx.de>
parents:
87156
diff
changeset
|
586 args = Fcons (xd_retrieve_arg (dtype, &iter), args); |
86940
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
587 dbus_message_iter_next (&iter); |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
588 } |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
589 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
590 /* The arguments are stored in reverse order. Reorder them. */ |
87175
30175fd3b679
* dbusbind.c (xd_read_message): Generate an event for every
Michael Albinus <michael.albinus@gmx.de>
parents:
87156
diff
changeset
|
591 args = Fnreverse (args); |
86940
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
592 |
87175
30175fd3b679
* dbusbind.c (xd_read_message): Generate an event for every
Michael Albinus <michael.albinus@gmx.de>
parents:
87156
diff
changeset
|
593 /* Read unique name, object path, interface and member from the |
30175fd3b679
* dbusbind.c (xd_read_message): Generate an event for every
Michael Albinus <michael.albinus@gmx.de>
parents:
87156
diff
changeset
|
594 message. */ |
30175fd3b679
* dbusbind.c (xd_read_message): Generate an event for every
Michael Albinus <michael.albinus@gmx.de>
parents:
87156
diff
changeset
|
595 strcpy (uname, dbus_message_get_sender (dmessage)); |
87051
1da959e791de
* dbusbind.c (QCdbus_system_bus, QCdbus_session_bus): Renamed from
Michael Albinus <michael.albinus@gmx.de>
parents:
86940
diff
changeset
|
596 strcpy (path, dbus_message_get_path (dmessage)); |
1da959e791de
* dbusbind.c (QCdbus_system_bus, QCdbus_session_bus): Renamed from
Michael Albinus <michael.albinus@gmx.de>
parents:
86940
diff
changeset
|
597 strcpy (interface, dbus_message_get_interface (dmessage)); |
1da959e791de
* dbusbind.c (QCdbus_system_bus, QCdbus_session_bus): Renamed from
Michael Albinus <michael.albinus@gmx.de>
parents:
86940
diff
changeset
|
598 strcpy (member, dbus_message_get_member (dmessage)); |
86940
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
599 |
87175
30175fd3b679
* dbusbind.c (xd_read_message): Generate an event for every
Michael Albinus <michael.albinus@gmx.de>
parents:
87156
diff
changeset
|
600 /* Search for a registered function of the message. */ |
30175fd3b679
* dbusbind.c (xd_read_message): Generate an event for every
Michael Albinus <michael.albinus@gmx.de>
parents:
87156
diff
changeset
|
601 key = list3 (bus, build_string (interface), build_string (member)); |
30175fd3b679
* dbusbind.c (xd_read_message): Generate an event for every
Michael Albinus <michael.albinus@gmx.de>
parents:
87156
diff
changeset
|
602 value = Fgethash (key, Vdbus_registered_functions_table, Qnil); |
30175fd3b679
* dbusbind.c (xd_read_message): Generate an event for every
Michael Albinus <michael.albinus@gmx.de>
parents:
87156
diff
changeset
|
603 |
30175fd3b679
* dbusbind.c (xd_read_message): Generate an event for every
Michael Albinus <michael.albinus@gmx.de>
parents:
87156
diff
changeset
|
604 /* Loop over the registered functions. Construct an event. */ |
30175fd3b679
* dbusbind.c (xd_read_message): Generate an event for every
Michael Albinus <michael.albinus@gmx.de>
parents:
87156
diff
changeset
|
605 while (!NILP (value)) |
30175fd3b679
* dbusbind.c (xd_read_message): Generate an event for every
Michael Albinus <michael.albinus@gmx.de>
parents:
87156
diff
changeset
|
606 { |
30175fd3b679
* dbusbind.c (xd_read_message): Generate an event for every
Michael Albinus <michael.albinus@gmx.de>
parents:
87156
diff
changeset
|
607 key = XCAR (value); |
87307
710ac69daf1f
* dbusbind.c (top): Include <stdio.h>.
Michael Albinus <michael.albinus@gmx.de>
parents:
87280
diff
changeset
|
608 /* key has the structure (UNAME SERVICE PATH HANDLER). */ |
87280
e0d7140e5b0e
* dbusbind.c (xd_retrieve_value, xd_retrieve_arg)
Michael Albinus <michael.albinus@gmx.de>
parents:
87175
diff
changeset
|
609 if (((uname == NULL) |
87307
710ac69daf1f
* dbusbind.c (top): Include <stdio.h>.
Michael Albinus <michael.albinus@gmx.de>
parents:
87280
diff
changeset
|
610 || (NILP (XCAR (key))) |
710ac69daf1f
* dbusbind.c (top): Include <stdio.h>.
Michael Albinus <michael.albinus@gmx.de>
parents:
87280
diff
changeset
|
611 || (strcmp (uname, SDATA (XCAR (key))) == 0)) |
87280
e0d7140e5b0e
* dbusbind.c (xd_retrieve_value, xd_retrieve_arg)
Michael Albinus <michael.albinus@gmx.de>
parents:
87175
diff
changeset
|
612 && ((path == NULL) |
e0d7140e5b0e
* dbusbind.c (xd_retrieve_value, xd_retrieve_arg)
Michael Albinus <michael.albinus@gmx.de>
parents:
87175
diff
changeset
|
613 || (NILP (XCAR (XCDR (XCDR (key))))) |
e0d7140e5b0e
* dbusbind.c (xd_retrieve_value, xd_retrieve_arg)
Michael Albinus <michael.albinus@gmx.de>
parents:
87175
diff
changeset
|
614 || (strcmp (path, SDATA (XCAR (XCDR (XCDR (key))))) == 0)) |
e0d7140e5b0e
* dbusbind.c (xd_retrieve_value, xd_retrieve_arg)
Michael Albinus <michael.albinus@gmx.de>
parents:
87175
diff
changeset
|
615 && (!NILP (XCAR (XCDR (XCDR (XCDR (key))))))) |
87175
30175fd3b679
* dbusbind.c (xd_read_message): Generate an event for every
Michael Albinus <michael.albinus@gmx.de>
parents:
87156
diff
changeset
|
616 { |
30175fd3b679
* dbusbind.c (xd_read_message): Generate an event for every
Michael Albinus <michael.albinus@gmx.de>
parents:
87156
diff
changeset
|
617 EVENT_INIT (event); |
30175fd3b679
* dbusbind.c (xd_read_message): Generate an event for every
Michael Albinus <michael.albinus@gmx.de>
parents:
87156
diff
changeset
|
618 event.kind = DBUS_EVENT; |
30175fd3b679
* dbusbind.c (xd_read_message): Generate an event for every
Michael Albinus <michael.albinus@gmx.de>
parents:
87156
diff
changeset
|
619 event.frame_or_window = Qnil; |
30175fd3b679
* dbusbind.c (xd_read_message): Generate an event for every
Michael Albinus <michael.albinus@gmx.de>
parents:
87156
diff
changeset
|
620 event.arg = Fcons (XCAR (XCDR (XCDR (XCDR (key)))), args); |
87156
e0ab56e63db8
* dbusbind.c (Fdbus_get_unique_name, xd_read_message)
Michael Albinus <michael.albinus@gmx.de>
parents:
87092
diff
changeset
|
621 |
87175
30175fd3b679
* dbusbind.c (xd_read_message): Generate an event for every
Michael Albinus <michael.albinus@gmx.de>
parents:
87156
diff
changeset
|
622 /* Add uname, path, interface and member to the event. */ |
30175fd3b679
* dbusbind.c (xd_read_message): Generate an event for every
Michael Albinus <michael.albinus@gmx.de>
parents:
87156
diff
changeset
|
623 event.arg = Fcons ((member == NULL ? Qnil : build_string (member)), |
30175fd3b679
* dbusbind.c (xd_read_message): Generate an event for every
Michael Albinus <michael.albinus@gmx.de>
parents:
87156
diff
changeset
|
624 event.arg); |
30175fd3b679
* dbusbind.c (xd_read_message): Generate an event for every
Michael Albinus <michael.albinus@gmx.de>
parents:
87156
diff
changeset
|
625 event.arg = Fcons ((interface == NULL |
30175fd3b679
* dbusbind.c (xd_read_message): Generate an event for every
Michael Albinus <michael.albinus@gmx.de>
parents:
87156
diff
changeset
|
626 ? Qnil : build_string (interface)), |
30175fd3b679
* dbusbind.c (xd_read_message): Generate an event for every
Michael Albinus <michael.albinus@gmx.de>
parents:
87156
diff
changeset
|
627 event.arg); |
30175fd3b679
* dbusbind.c (xd_read_message): Generate an event for every
Michael Albinus <michael.albinus@gmx.de>
parents:
87156
diff
changeset
|
628 event.arg = Fcons ((path == NULL ? Qnil : build_string (path)), |
30175fd3b679
* dbusbind.c (xd_read_message): Generate an event for every
Michael Albinus <michael.albinus@gmx.de>
parents:
87156
diff
changeset
|
629 event.arg); |
30175fd3b679
* dbusbind.c (xd_read_message): Generate an event for every
Michael Albinus <michael.albinus@gmx.de>
parents:
87156
diff
changeset
|
630 event.arg = Fcons ((uname == NULL ? Qnil : build_string (uname)), |
30175fd3b679
* dbusbind.c (xd_read_message): Generate an event for every
Michael Albinus <michael.albinus@gmx.de>
parents:
87156
diff
changeset
|
631 event.arg); |
87051
1da959e791de
* dbusbind.c (QCdbus_system_bus, QCdbus_session_bus): Renamed from
Michael Albinus <michael.albinus@gmx.de>
parents:
86940
diff
changeset
|
632 |
87175
30175fd3b679
* dbusbind.c (xd_read_message): Generate an event for every
Michael Albinus <michael.albinus@gmx.de>
parents:
87156
diff
changeset
|
633 /* Add the bus symbol to the event. */ |
30175fd3b679
* dbusbind.c (xd_read_message): Generate an event for every
Michael Albinus <michael.albinus@gmx.de>
parents:
87156
diff
changeset
|
634 event.arg = Fcons (bus, event.arg); |
87051
1da959e791de
* dbusbind.c (QCdbus_system_bus, QCdbus_session_bus): Renamed from
Michael Albinus <michael.albinus@gmx.de>
parents:
86940
diff
changeset
|
635 |
87175
30175fd3b679
* dbusbind.c (xd_read_message): Generate an event for every
Michael Albinus <michael.albinus@gmx.de>
parents:
87156
diff
changeset
|
636 /* Store it into the input event queue. */ |
30175fd3b679
* dbusbind.c (xd_read_message): Generate an event for every
Michael Albinus <michael.albinus@gmx.de>
parents:
87156
diff
changeset
|
637 kbd_buffer_store_event (&event); |
30175fd3b679
* dbusbind.c (xd_read_message): Generate an event for every
Michael Albinus <michael.albinus@gmx.de>
parents:
87156
diff
changeset
|
638 } |
30175fd3b679
* dbusbind.c (xd_read_message): Generate an event for every
Michael Albinus <michael.albinus@gmx.de>
parents:
87156
diff
changeset
|
639 value = XCDR (value); |
30175fd3b679
* dbusbind.c (xd_read_message): Generate an event for every
Michael Albinus <michael.albinus@gmx.de>
parents:
87156
diff
changeset
|
640 } |
86940
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
641 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
642 /* Cleanup. */ |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
643 dbus_message_unref (dmessage); |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
644 UNGCPRO; |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
645 } |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
646 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
647 /* Read queued incoming messages from the system and session buses. */ |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
648 void |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
649 xd_read_queued_messages () |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
650 { |
87092
1ddad0de60e5
* dbusbind.c (xd_read_message): Return value is a Lisp_Object.
Michael Albinus <michael.albinus@gmx.de>
parents:
87053
diff
changeset
|
651 |
87307
710ac69daf1f
* dbusbind.c (top): Include <stdio.h>.
Michael Albinus <michael.albinus@gmx.de>
parents:
87280
diff
changeset
|
652 /* Vdbus_registered_functions_table will be initialized as hash |
710ac69daf1f
* dbusbind.c (top): Include <stdio.h>.
Michael Albinus <michael.albinus@gmx.de>
parents:
87280
diff
changeset
|
653 table in dbus.el. When this package isn't loaded yet, it doesn't |
710ac69daf1f
* dbusbind.c (top): Include <stdio.h>.
Michael Albinus <michael.albinus@gmx.de>
parents:
87280
diff
changeset
|
654 make sense to handle D-Bus messages. Furthermore, we ignore all |
710ac69daf1f
* dbusbind.c (top): Include <stdio.h>.
Michael Albinus <michael.albinus@gmx.de>
parents:
87280
diff
changeset
|
655 Lisp errors during the call. */ |
87092
1ddad0de60e5
* dbusbind.c (xd_read_message): Return value is a Lisp_Object.
Michael Albinus <michael.albinus@gmx.de>
parents:
87053
diff
changeset
|
656 if (HASH_TABLE_P (Vdbus_registered_functions_table)) |
1ddad0de60e5
* dbusbind.c (xd_read_message): Return value is a Lisp_Object.
Michael Albinus <michael.albinus@gmx.de>
parents:
87053
diff
changeset
|
657 { |
1ddad0de60e5
* dbusbind.c (xd_read_message): Return value is a Lisp_Object.
Michael Albinus <michael.albinus@gmx.de>
parents:
87053
diff
changeset
|
658 internal_condition_case_1 (xd_read_message, QCdbus_system_bus, |
1ddad0de60e5
* dbusbind.c (xd_read_message): Return value is a Lisp_Object.
Michael Albinus <michael.albinus@gmx.de>
parents:
87053
diff
changeset
|
659 Qerror, Fidentity); |
1ddad0de60e5
* dbusbind.c (xd_read_message): Return value is a Lisp_Object.
Michael Albinus <michael.albinus@gmx.de>
parents:
87053
diff
changeset
|
660 internal_condition_case_1 (xd_read_message, QCdbus_session_bus, |
1ddad0de60e5
* dbusbind.c (xd_read_message): Return value is a Lisp_Object.
Michael Albinus <michael.albinus@gmx.de>
parents:
87053
diff
changeset
|
661 Qerror, Fidentity); |
1ddad0de60e5
* dbusbind.c (xd_read_message): Return value is a Lisp_Object.
Michael Albinus <michael.albinus@gmx.de>
parents:
87053
diff
changeset
|
662 } |
86940
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
663 } |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
664 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
665 DEFUN ("dbus-register-signal", Fdbus_register_signal, Sdbus_register_signal, |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
666 6, 6, 0, |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
667 doc: /* Register for signal SIGNAL on the D-Bus BUS. |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
668 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
669 BUS is either the symbol `:system' or the symbol `:session'. |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
670 |
87051
1da959e791de
* dbusbind.c (QCdbus_system_bus, QCdbus_session_bus): Renamed from
Michael Albinus <michael.albinus@gmx.de>
parents:
86940
diff
changeset
|
671 SERVICE is the D-Bus service name used by the sending D-Bus object. |
1da959e791de
* dbusbind.c (QCdbus_system_bus, QCdbus_session_bus): Renamed from
Michael Albinus <michael.albinus@gmx.de>
parents:
86940
diff
changeset
|
672 It can be either a known name or the unique name of the D-Bus object |
1da959e791de
* dbusbind.c (QCdbus_system_bus, QCdbus_session_bus): Renamed from
Michael Albinus <michael.albinus@gmx.de>
parents:
86940
diff
changeset
|
673 sending the signal. When SERVICE is nil, related signals from all |
1da959e791de
* dbusbind.c (QCdbus_system_bus, QCdbus_session_bus): Renamed from
Michael Albinus <michael.albinus@gmx.de>
parents:
86940
diff
changeset
|
674 D-Bus objects shall be accepted. |
86940
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
675 |
87051
1da959e791de
* dbusbind.c (QCdbus_system_bus, QCdbus_session_bus): Renamed from
Michael Albinus <michael.albinus@gmx.de>
parents:
86940
diff
changeset
|
676 PATH is the D-Bus object path SERVICE is registered. It can also be |
1da959e791de
* dbusbind.c (QCdbus_system_bus, QCdbus_session_bus): Renamed from
Michael Albinus <michael.albinus@gmx.de>
parents:
86940
diff
changeset
|
677 nil if the path name of incoming signals shall not be checked. |
1da959e791de
* dbusbind.c (QCdbus_system_bus, QCdbus_session_bus): Renamed from
Michael Albinus <michael.albinus@gmx.de>
parents:
86940
diff
changeset
|
678 |
1da959e791de
* dbusbind.c (QCdbus_system_bus, QCdbus_session_bus): Renamed from
Michael Albinus <michael.albinus@gmx.de>
parents:
86940
diff
changeset
|
679 INTERFACE is an interface offered by SERVICE. It must provide SIGNAL. |
86940
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
680 HANDLER is a Lisp function to be called when the signal is received. |
87051
1da959e791de
* dbusbind.c (QCdbus_system_bus, QCdbus_session_bus): Renamed from
Michael Albinus <michael.albinus@gmx.de>
parents:
86940
diff
changeset
|
681 It must accept as arguments the values SIGNAL is sending. INTERFACE, |
1da959e791de
* dbusbind.c (QCdbus_system_bus, QCdbus_session_bus): Renamed from
Michael Albinus <michael.albinus@gmx.de>
parents:
86940
diff
changeset
|
682 SIGNAL and HANDLER must not be nil. Example: |
86940
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
683 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
684 \(defun my-signal-handler (device) |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
685 (message "Device %s added" device)) |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
686 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
687 \(dbus-register-signal |
87156
e0ab56e63db8
* dbusbind.c (Fdbus_get_unique_name, xd_read_message)
Michael Albinus <michael.albinus@gmx.de>
parents:
87092
diff
changeset
|
688 :system "org.freedesktop.Hal" "/org/freedesktop/Hal/Manager" |
e0ab56e63db8
* dbusbind.c (Fdbus_get_unique_name, xd_read_message)
Michael Albinus <michael.albinus@gmx.de>
parents:
87092
diff
changeset
|
689 "org.freedesktop.Hal.Manager" "DeviceAdded" 'my-signal-handler) |
86940
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
690 |
87307
710ac69daf1f
* dbusbind.c (top): Include <stdio.h>.
Michael Albinus <michael.albinus@gmx.de>
parents:
87280
diff
changeset
|
691 => ((:system "org.freedesktop.Hal.Manager" "DeviceAdded") |
710ac69daf1f
* dbusbind.c (top): Include <stdio.h>.
Michael Albinus <michael.albinus@gmx.de>
parents:
87280
diff
changeset
|
692 ("org.freedesktop.Hal" "/org/freedesktop/Hal/Manager" my-signal-handler)) |
86940
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
693 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
694 `dbus-register-signal' returns an object, which can be used in |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
695 `dbus-unregister-signal' for removing the registration. */) |
87156
e0ab56e63db8
* dbusbind.c (Fdbus_get_unique_name, xd_read_message)
Michael Albinus <michael.albinus@gmx.de>
parents:
87092
diff
changeset
|
696 (bus, service, path, interface, signal, handler) |
e0ab56e63db8
* dbusbind.c (Fdbus_get_unique_name, xd_read_message)
Michael Albinus <michael.albinus@gmx.de>
parents:
87092
diff
changeset
|
697 Lisp_Object bus, service, path, interface, signal, handler; |
86940
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
698 { |
87307
710ac69daf1f
* dbusbind.c (top): Include <stdio.h>.
Michael Albinus <michael.albinus@gmx.de>
parents:
87280
diff
changeset
|
699 Lisp_Object uname, key, value; |
86940
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
700 DBusConnection *connection; |
87156
e0ab56e63db8
* dbusbind.c (Fdbus_get_unique_name, xd_read_message)
Michael Albinus <michael.albinus@gmx.de>
parents:
87092
diff
changeset
|
701 char rule[DBUS_MAXIMUM_MATCH_RULE_LENGTH]; |
86940
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
702 DBusError derror; |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
703 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
704 /* Check parameters. */ |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
705 CHECK_SYMBOL (bus); |
87051
1da959e791de
* dbusbind.c (QCdbus_system_bus, QCdbus_session_bus): Renamed from
Michael Albinus <michael.albinus@gmx.de>
parents:
86940
diff
changeset
|
706 if (!NILP (service)) CHECK_STRING (service); |
1da959e791de
* dbusbind.c (QCdbus_system_bus, QCdbus_session_bus): Renamed from
Michael Albinus <michael.albinus@gmx.de>
parents:
86940
diff
changeset
|
707 if (!NILP (path)) CHECK_STRING (path); |
86940
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
708 CHECK_STRING (interface); |
87156
e0ab56e63db8
* dbusbind.c (Fdbus_get_unique_name, xd_read_message)
Michael Albinus <michael.albinus@gmx.de>
parents:
87092
diff
changeset
|
709 CHECK_STRING (signal); |
87307
710ac69daf1f
* dbusbind.c (top): Include <stdio.h>.
Michael Albinus <michael.albinus@gmx.de>
parents:
87280
diff
changeset
|
710 FUNCTIONP (handler); |
86940
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
711 |
87156
e0ab56e63db8
* dbusbind.c (Fdbus_get_unique_name, xd_read_message)
Michael Albinus <michael.albinus@gmx.de>
parents:
87092
diff
changeset
|
712 /* Retrieve unique name of service. If service is a known name, we |
e0ab56e63db8
* dbusbind.c (Fdbus_get_unique_name, xd_read_message)
Michael Albinus <michael.albinus@gmx.de>
parents:
87092
diff
changeset
|
713 will register for the corresponding unique name, if any. Signals |
e0ab56e63db8
* dbusbind.c (Fdbus_get_unique_name, xd_read_message)
Michael Albinus <michael.albinus@gmx.de>
parents:
87092
diff
changeset
|
714 are sent always with the unique name as sender. Note: the unique |
e0ab56e63db8
* dbusbind.c (Fdbus_get_unique_name, xd_read_message)
Michael Albinus <michael.albinus@gmx.de>
parents:
87092
diff
changeset
|
715 name of "org.freedesktop.DBus" is that string itself. */ |
87280
e0d7140e5b0e
* dbusbind.c (xd_retrieve_value, xd_retrieve_arg)
Michael Albinus <michael.albinus@gmx.de>
parents:
87175
diff
changeset
|
716 if ((!NILP (service)) |
e0d7140e5b0e
* dbusbind.c (xd_retrieve_value, xd_retrieve_arg)
Michael Albinus <michael.albinus@gmx.de>
parents:
87175
diff
changeset
|
717 && (strlen (SDATA (service)) > 0) |
e0d7140e5b0e
* dbusbind.c (xd_retrieve_value, xd_retrieve_arg)
Michael Albinus <michael.albinus@gmx.de>
parents:
87175
diff
changeset
|
718 && (strcmp (SDATA (service), DBUS_SERVICE_DBUS) != 0) |
e0d7140e5b0e
* dbusbind.c (xd_retrieve_value, xd_retrieve_arg)
Michael Albinus <michael.albinus@gmx.de>
parents:
87175
diff
changeset
|
719 && (strncmp (SDATA (service), ":", 1) != 0)) |
87307
710ac69daf1f
* dbusbind.c (top): Include <stdio.h>.
Michael Albinus <michael.albinus@gmx.de>
parents:
87280
diff
changeset
|
720 { |
710ac69daf1f
* dbusbind.c (top): Include <stdio.h>.
Michael Albinus <michael.albinus@gmx.de>
parents:
87280
diff
changeset
|
721 uname = call2 (intern ("dbus-get-name-owner"), bus, service); |
710ac69daf1f
* dbusbind.c (top): Include <stdio.h>.
Michael Albinus <michael.albinus@gmx.de>
parents:
87280
diff
changeset
|
722 /* When there is no unique name, we mark it with an empty |
710ac69daf1f
* dbusbind.c (top): Include <stdio.h>.
Michael Albinus <michael.albinus@gmx.de>
parents:
87280
diff
changeset
|
723 string. */ |
710ac69daf1f
* dbusbind.c (top): Include <stdio.h>.
Michael Albinus <michael.albinus@gmx.de>
parents:
87280
diff
changeset
|
724 if (NILP (uname)) |
710ac69daf1f
* dbusbind.c (top): Include <stdio.h>.
Michael Albinus <michael.albinus@gmx.de>
parents:
87280
diff
changeset
|
725 uname = build_string (""); |
710ac69daf1f
* dbusbind.c (top): Include <stdio.h>.
Michael Albinus <michael.albinus@gmx.de>
parents:
87280
diff
changeset
|
726 } |
87156
e0ab56e63db8
* dbusbind.c (Fdbus_get_unique_name, xd_read_message)
Michael Albinus <michael.albinus@gmx.de>
parents:
87092
diff
changeset
|
727 else |
87307
710ac69daf1f
* dbusbind.c (top): Include <stdio.h>.
Michael Albinus <michael.albinus@gmx.de>
parents:
87280
diff
changeset
|
728 uname = service; |
87156
e0ab56e63db8
* dbusbind.c (Fdbus_get_unique_name, xd_read_message)
Michael Albinus <michael.albinus@gmx.de>
parents:
87092
diff
changeset
|
729 |
87307
710ac69daf1f
* dbusbind.c (top): Include <stdio.h>.
Michael Albinus <michael.albinus@gmx.de>
parents:
87280
diff
changeset
|
730 /* Create a matching rule if the unique name exists (when no |
710ac69daf1f
* dbusbind.c (top): Include <stdio.h>.
Michael Albinus <michael.albinus@gmx.de>
parents:
87280
diff
changeset
|
731 wildcard). */ |
710ac69daf1f
* dbusbind.c (top): Include <stdio.h>.
Michael Albinus <michael.albinus@gmx.de>
parents:
87280
diff
changeset
|
732 if (NILP (uname) || (strlen (SDATA (uname)) > 0)) |
710ac69daf1f
* dbusbind.c (top): Include <stdio.h>.
Michael Albinus <michael.albinus@gmx.de>
parents:
87280
diff
changeset
|
733 { |
710ac69daf1f
* dbusbind.c (top): Include <stdio.h>.
Michael Albinus <michael.albinus@gmx.de>
parents:
87280
diff
changeset
|
734 /* Open a connection to the bus. */ |
710ac69daf1f
* dbusbind.c (top): Include <stdio.h>.
Michael Albinus <michael.albinus@gmx.de>
parents:
87280
diff
changeset
|
735 connection = xd_initialize (bus); |
87051
1da959e791de
* dbusbind.c (QCdbus_system_bus, QCdbus_session_bus): Renamed from
Michael Albinus <michael.albinus@gmx.de>
parents:
86940
diff
changeset
|
736 |
87307
710ac69daf1f
* dbusbind.c (top): Include <stdio.h>.
Michael Albinus <michael.albinus@gmx.de>
parents:
87280
diff
changeset
|
737 /* Create a rule to receive related signals. */ |
710ac69daf1f
* dbusbind.c (top): Include <stdio.h>.
Michael Albinus <michael.albinus@gmx.de>
parents:
87280
diff
changeset
|
738 sprintf (rule, |
710ac69daf1f
* dbusbind.c (top): Include <stdio.h>.
Michael Albinus <michael.albinus@gmx.de>
parents:
87280
diff
changeset
|
739 "type='signal',interface='%s',member='%s'", |
710ac69daf1f
* dbusbind.c (top): Include <stdio.h>.
Michael Albinus <michael.albinus@gmx.de>
parents:
87280
diff
changeset
|
740 SDATA (interface), |
710ac69daf1f
* dbusbind.c (top): Include <stdio.h>.
Michael Albinus <michael.albinus@gmx.de>
parents:
87280
diff
changeset
|
741 SDATA (signal)); |
87051
1da959e791de
* dbusbind.c (QCdbus_system_bus, QCdbus_session_bus): Renamed from
Michael Albinus <michael.albinus@gmx.de>
parents:
86940
diff
changeset
|
742 |
87307
710ac69daf1f
* dbusbind.c (top): Include <stdio.h>.
Michael Albinus <michael.albinus@gmx.de>
parents:
87280
diff
changeset
|
743 /* Add unique name and path to the rule if they are non-nil. */ |
710ac69daf1f
* dbusbind.c (top): Include <stdio.h>.
Michael Albinus <michael.albinus@gmx.de>
parents:
87280
diff
changeset
|
744 if (!NILP (uname)) |
710ac69daf1f
* dbusbind.c (top): Include <stdio.h>.
Michael Albinus <michael.albinus@gmx.de>
parents:
87280
diff
changeset
|
745 sprintf (rule, "%s,sender='%s'", rule, SDATA (uname)); |
87051
1da959e791de
* dbusbind.c (QCdbus_system_bus, QCdbus_session_bus): Renamed from
Michael Albinus <michael.albinus@gmx.de>
parents:
86940
diff
changeset
|
746 |
87307
710ac69daf1f
* dbusbind.c (top): Include <stdio.h>.
Michael Albinus <michael.albinus@gmx.de>
parents:
87280
diff
changeset
|
747 if (!NILP (path)) |
710ac69daf1f
* dbusbind.c (top): Include <stdio.h>.
Michael Albinus <michael.albinus@gmx.de>
parents:
87280
diff
changeset
|
748 sprintf (rule, "%s,path='%s'", rule, SDATA (path)); |
86940
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
749 |
87307
710ac69daf1f
* dbusbind.c (top): Include <stdio.h>.
Michael Albinus <michael.albinus@gmx.de>
parents:
87280
diff
changeset
|
750 /* Add the rule to the bus. */ |
710ac69daf1f
* dbusbind.c (top): Include <stdio.h>.
Michael Albinus <michael.albinus@gmx.de>
parents:
87280
diff
changeset
|
751 dbus_error_init (&derror); |
710ac69daf1f
* dbusbind.c (top): Include <stdio.h>.
Michael Albinus <michael.albinus@gmx.de>
parents:
87280
diff
changeset
|
752 dbus_bus_add_match (connection, rule, &derror); |
710ac69daf1f
* dbusbind.c (top): Include <stdio.h>.
Michael Albinus <michael.albinus@gmx.de>
parents:
87280
diff
changeset
|
753 if (dbus_error_is_set (&derror)) |
710ac69daf1f
* dbusbind.c (top): Include <stdio.h>.
Michael Albinus <michael.albinus@gmx.de>
parents:
87280
diff
changeset
|
754 XD_ERROR (derror); |
710ac69daf1f
* dbusbind.c (top): Include <stdio.h>.
Michael Albinus <michael.albinus@gmx.de>
parents:
87280
diff
changeset
|
755 |
710ac69daf1f
* dbusbind.c (top): Include <stdio.h>.
Michael Albinus <michael.albinus@gmx.de>
parents:
87280
diff
changeset
|
756 XD_DEBUG_MESSAGE ("Matching rule \"%s\" created", rule); |
710ac69daf1f
* dbusbind.c (top): Include <stdio.h>.
Michael Albinus <michael.albinus@gmx.de>
parents:
87280
diff
changeset
|
757 } |
86940
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
758 |
87051
1da959e791de
* dbusbind.c (QCdbus_system_bus, QCdbus_session_bus): Renamed from
Michael Albinus <michael.albinus@gmx.de>
parents:
86940
diff
changeset
|
759 /* Create a hash table entry. */ |
87175
30175fd3b679
* dbusbind.c (xd_read_message): Generate an event for every
Michael Albinus <michael.albinus@gmx.de>
parents:
87156
diff
changeset
|
760 key = list3 (bus, interface, signal); |
30175fd3b679
* dbusbind.c (xd_read_message): Generate an event for every
Michael Albinus <michael.albinus@gmx.de>
parents:
87156
diff
changeset
|
761 value = Fgethash (key, Vdbus_registered_functions_table, Qnil); |
30175fd3b679
* dbusbind.c (xd_read_message): Generate an event for every
Michael Albinus <michael.albinus@gmx.de>
parents:
87156
diff
changeset
|
762 |
87307
710ac69daf1f
* dbusbind.c (top): Include <stdio.h>.
Michael Albinus <michael.albinus@gmx.de>
parents:
87280
diff
changeset
|
763 if (NILP (Fmember (list4 (uname, service, path, handler), value))) |
87175
30175fd3b679
* dbusbind.c (xd_read_message): Generate an event for every
Michael Albinus <michael.albinus@gmx.de>
parents:
87156
diff
changeset
|
764 Fputhash (key, |
87307
710ac69daf1f
* dbusbind.c (top): Include <stdio.h>.
Michael Albinus <michael.albinus@gmx.de>
parents:
87280
diff
changeset
|
765 Fcons (list4 (uname, service, path, handler), value), |
87175
30175fd3b679
* dbusbind.c (xd_read_message): Generate an event for every
Michael Albinus <michael.albinus@gmx.de>
parents:
87156
diff
changeset
|
766 Vdbus_registered_functions_table); |
86940
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
767 |
87307
710ac69daf1f
* dbusbind.c (top): Include <stdio.h>.
Michael Albinus <michael.albinus@gmx.de>
parents:
87280
diff
changeset
|
768 /* Return object. */ |
710ac69daf1f
* dbusbind.c (top): Include <stdio.h>.
Michael Albinus <michael.albinus@gmx.de>
parents:
87280
diff
changeset
|
769 return list2 (key, list3 (service, path, handler)); |
86940
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
770 } |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
771 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
772 DEFUN ("dbus-unregister-signal", Fdbus_unregister_signal, Sdbus_unregister_signal, |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
773 1, 1, 0, |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
774 doc: /* Unregister OBJECT from the D-Bus. |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
775 OBJECT must be the result of a preceding `dbus-register-signal' call. */) |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
776 (object) |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
777 Lisp_Object object; |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
778 { |
87307
710ac69daf1f
* dbusbind.c (top): Include <stdio.h>.
Michael Albinus <michael.albinus@gmx.de>
parents:
87280
diff
changeset
|
779 Lisp_Object value; |
710ac69daf1f
* dbusbind.c (top): Include <stdio.h>.
Michael Albinus <michael.albinus@gmx.de>
parents:
87280
diff
changeset
|
780 struct gcpro gcpro1; |
86940
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
781 |
87307
710ac69daf1f
* dbusbind.c (top): Include <stdio.h>.
Michael Albinus <michael.albinus@gmx.de>
parents:
87280
diff
changeset
|
782 /* Check parameter. */ |
710ac69daf1f
* dbusbind.c (top): Include <stdio.h>.
Michael Albinus <michael.albinus@gmx.de>
parents:
87280
diff
changeset
|
783 CONSP (object) && (!NILP (XCAR (object))) && CONSP (XCDR (object)); |
710ac69daf1f
* dbusbind.c (top): Include <stdio.h>.
Michael Albinus <michael.albinus@gmx.de>
parents:
87280
diff
changeset
|
784 |
710ac69daf1f
* dbusbind.c (top): Include <stdio.h>.
Michael Albinus <michael.albinus@gmx.de>
parents:
87280
diff
changeset
|
785 /* Find the corresponding entry in the hash table. */ |
710ac69daf1f
* dbusbind.c (top): Include <stdio.h>.
Michael Albinus <michael.albinus@gmx.de>
parents:
87280
diff
changeset
|
786 value = Fgethash (XCAR (object), Vdbus_registered_functions_table, Qnil); |
710ac69daf1f
* dbusbind.c (top): Include <stdio.h>.
Michael Albinus <michael.albinus@gmx.de>
parents:
87280
diff
changeset
|
787 |
710ac69daf1f
* dbusbind.c (top): Include <stdio.h>.
Michael Albinus <michael.albinus@gmx.de>
parents:
87280
diff
changeset
|
788 /* Loop over the registered functions. */ |
710ac69daf1f
* dbusbind.c (top): Include <stdio.h>.
Michael Albinus <michael.albinus@gmx.de>
parents:
87280
diff
changeset
|
789 while (!NILP (value)) |
710ac69daf1f
* dbusbind.c (top): Include <stdio.h>.
Michael Albinus <michael.albinus@gmx.de>
parents:
87280
diff
changeset
|
790 { |
710ac69daf1f
* dbusbind.c (top): Include <stdio.h>.
Michael Albinus <michael.albinus@gmx.de>
parents:
87280
diff
changeset
|
791 GCPRO1 (value); |
710ac69daf1f
* dbusbind.c (top): Include <stdio.h>.
Michael Albinus <michael.albinus@gmx.de>
parents:
87280
diff
changeset
|
792 |
710ac69daf1f
* dbusbind.c (top): Include <stdio.h>.
Michael Albinus <michael.albinus@gmx.de>
parents:
87280
diff
changeset
|
793 /* (car value) has the structure (UNAME SERVICE PATH HANDLER). |
710ac69daf1f
* dbusbind.c (top): Include <stdio.h>.
Michael Albinus <michael.albinus@gmx.de>
parents:
87280
diff
changeset
|
794 (cdr object) has the structure ((SERVICE PATH HANDLER) ...). */ |
710ac69daf1f
* dbusbind.c (top): Include <stdio.h>.
Michael Albinus <michael.albinus@gmx.de>
parents:
87280
diff
changeset
|
795 if (!NILP (Fequal (XCDR (XCAR (value)), XCAR (XCDR (object))))) |
710ac69daf1f
* dbusbind.c (top): Include <stdio.h>.
Michael Albinus <michael.albinus@gmx.de>
parents:
87280
diff
changeset
|
796 { |
710ac69daf1f
* dbusbind.c (top): Include <stdio.h>.
Michael Albinus <michael.albinus@gmx.de>
parents:
87280
diff
changeset
|
797 /* Compute new hash value. */ |
710ac69daf1f
* dbusbind.c (top): Include <stdio.h>.
Michael Albinus <michael.albinus@gmx.de>
parents:
87280
diff
changeset
|
798 value = Fdelete (XCAR (value), |
710ac69daf1f
* dbusbind.c (top): Include <stdio.h>.
Michael Albinus <michael.albinus@gmx.de>
parents:
87280
diff
changeset
|
799 Fgethash (XCAR (object), |
710ac69daf1f
* dbusbind.c (top): Include <stdio.h>.
Michael Albinus <michael.albinus@gmx.de>
parents:
87280
diff
changeset
|
800 Vdbus_registered_functions_table, Qnil)); |
710ac69daf1f
* dbusbind.c (top): Include <stdio.h>.
Michael Albinus <michael.albinus@gmx.de>
parents:
87280
diff
changeset
|
801 if (NILP (value)) |
710ac69daf1f
* dbusbind.c (top): Include <stdio.h>.
Michael Albinus <michael.albinus@gmx.de>
parents:
87280
diff
changeset
|
802 Fremhash (XCAR (object), Vdbus_registered_functions_table); |
710ac69daf1f
* dbusbind.c (top): Include <stdio.h>.
Michael Albinus <michael.albinus@gmx.de>
parents:
87280
diff
changeset
|
803 else |
710ac69daf1f
* dbusbind.c (top): Include <stdio.h>.
Michael Albinus <michael.albinus@gmx.de>
parents:
87280
diff
changeset
|
804 Fputhash (XCAR (object), value, Vdbus_registered_functions_table); |
710ac69daf1f
* dbusbind.c (top): Include <stdio.h>.
Michael Albinus <michael.albinus@gmx.de>
parents:
87280
diff
changeset
|
805 RETURN_UNGCPRO (Qt); |
710ac69daf1f
* dbusbind.c (top): Include <stdio.h>.
Michael Albinus <michael.albinus@gmx.de>
parents:
87280
diff
changeset
|
806 } |
710ac69daf1f
* dbusbind.c (top): Include <stdio.h>.
Michael Albinus <michael.albinus@gmx.de>
parents:
87280
diff
changeset
|
807 UNGCPRO; |
710ac69daf1f
* dbusbind.c (top): Include <stdio.h>.
Michael Albinus <michael.albinus@gmx.de>
parents:
87280
diff
changeset
|
808 value = XCDR (value); |
710ac69daf1f
* dbusbind.c (top): Include <stdio.h>.
Michael Albinus <michael.albinus@gmx.de>
parents:
87280
diff
changeset
|
809 } |
86940
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
810 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
811 /* Return. */ |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
812 return Qnil; |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
813 } |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
814 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
815 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
816 void |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
817 syms_of_dbusbind () |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
818 { |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
819 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
820 Qdbus_get_unique_name = intern ("dbus-get-unique-name"); |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
821 staticpro (&Qdbus_get_unique_name); |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
822 defsubr (&Sdbus_get_unique_name); |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
823 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
824 Qdbus_call_method = intern ("dbus-call-method"); |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
825 staticpro (&Qdbus_call_method); |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
826 defsubr (&Sdbus_call_method); |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
827 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
828 Qdbus_send_signal = intern ("dbus-send-signal"); |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
829 staticpro (&Qdbus_send_signal); |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
830 defsubr (&Sdbus_send_signal); |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
831 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
832 Qdbus_register_signal = intern ("dbus-register-signal"); |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
833 staticpro (&Qdbus_register_signal); |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
834 defsubr (&Sdbus_register_signal); |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
835 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
836 Qdbus_unregister_signal = intern ("dbus-unregister-signal"); |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
837 staticpro (&Qdbus_unregister_signal); |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
838 defsubr (&Sdbus_unregister_signal); |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
839 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
840 Qdbus_error = intern ("dbus-error"); |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
841 staticpro (&Qdbus_error); |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
842 Fput (Qdbus_error, Qerror_conditions, |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
843 list2 (Qdbus_error, Qerror)); |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
844 Fput (Qdbus_error, Qerror_message, |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
845 build_string ("D-Bus error")); |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
846 |
87051
1da959e791de
* dbusbind.c (QCdbus_system_bus, QCdbus_session_bus): Renamed from
Michael Albinus <michael.albinus@gmx.de>
parents:
86940
diff
changeset
|
847 QCdbus_system_bus = intern (":system"); |
1da959e791de
* dbusbind.c (QCdbus_system_bus, QCdbus_session_bus): Renamed from
Michael Albinus <michael.albinus@gmx.de>
parents:
86940
diff
changeset
|
848 staticpro (&QCdbus_system_bus); |
1da959e791de
* dbusbind.c (QCdbus_system_bus, QCdbus_session_bus): Renamed from
Michael Albinus <michael.albinus@gmx.de>
parents:
86940
diff
changeset
|
849 |
1da959e791de
* dbusbind.c (QCdbus_system_bus, QCdbus_session_bus): Renamed from
Michael Albinus <michael.albinus@gmx.de>
parents:
86940
diff
changeset
|
850 QCdbus_session_bus = intern (":session"); |
1da959e791de
* dbusbind.c (QCdbus_system_bus, QCdbus_session_bus): Renamed from
Michael Albinus <michael.albinus@gmx.de>
parents:
86940
diff
changeset
|
851 staticpro (&QCdbus_session_bus); |
86940
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
852 |
87051
1da959e791de
* dbusbind.c (QCdbus_system_bus, QCdbus_session_bus): Renamed from
Michael Albinus <michael.albinus@gmx.de>
parents:
86940
diff
changeset
|
853 DEFVAR_LISP ("dbus-registered-functions-table", &Vdbus_registered_functions_table, |
1da959e791de
* dbusbind.c (QCdbus_system_bus, QCdbus_session_bus): Renamed from
Michael Albinus <michael.albinus@gmx.de>
parents:
86940
diff
changeset
|
854 doc: /* Hash table of registered functions for D-Bus. |
87307
710ac69daf1f
* dbusbind.c (top): Include <stdio.h>.
Michael Albinus <michael.albinus@gmx.de>
parents:
87280
diff
changeset
|
855 The key in the hash table is the list (BUS INTERFACE MEMBER). BUS is |
87175
30175fd3b679
* dbusbind.c (xd_read_message): Generate an event for every
Michael Albinus <michael.albinus@gmx.de>
parents:
87156
diff
changeset
|
856 either the symbol `:system' or the symbol `:session'. INTERFACE is a |
30175fd3b679
* dbusbind.c (xd_read_message): Generate an event for every
Michael Albinus <michael.albinus@gmx.de>
parents:
87156
diff
changeset
|
857 string which denotes a D-Bus interface, and MEMBER, also a string, is |
30175fd3b679
* dbusbind.c (xd_read_message): Generate an event for every
Michael Albinus <michael.albinus@gmx.de>
parents:
87156
diff
changeset
|
858 either a method or a signal INTERFACE is offering. All arguments but |
30175fd3b679
* dbusbind.c (xd_read_message): Generate an event for every
Michael Albinus <michael.albinus@gmx.de>
parents:
87156
diff
changeset
|
859 BUS must not be nil. |
86940
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
860 |
87307
710ac69daf1f
* dbusbind.c (top): Include <stdio.h>.
Michael Albinus <michael.albinus@gmx.de>
parents:
87280
diff
changeset
|
861 The value in the hash table is a list of quadruple lists |
710ac69daf1f
* dbusbind.c (top): Include <stdio.h>.
Michael Albinus <michael.albinus@gmx.de>
parents:
87280
diff
changeset
|
862 \((UNAME SERVICE PATH HANDLER) (UNAME SERVICE PATH HANDLER) ...). |
87175
30175fd3b679
* dbusbind.c (xd_read_message): Generate an event for every
Michael Albinus <michael.albinus@gmx.de>
parents:
87156
diff
changeset
|
863 SERVICE is the service name as registered, UNAME is the corresponding |
30175fd3b679
* dbusbind.c (xd_read_message): Generate an event for every
Michael Albinus <michael.albinus@gmx.de>
parents:
87156
diff
changeset
|
864 unique name. PATH is the object path of the sending object. All of |
87307
710ac69daf1f
* dbusbind.c (top): Include <stdio.h>.
Michael Albinus <michael.albinus@gmx.de>
parents:
87280
diff
changeset
|
865 them can be nil, which means a wildcard then. HANDLER is the function |
710ac69daf1f
* dbusbind.c (top): Include <stdio.h>.
Michael Albinus <michael.albinus@gmx.de>
parents:
87280
diff
changeset
|
866 to be called when a D-Bus message, which matches the key criteria, |
87175
30175fd3b679
* dbusbind.c (xd_read_message): Generate an event for every
Michael Albinus <michael.albinus@gmx.de>
parents:
87156
diff
changeset
|
867 arrives. */); |
87051
1da959e791de
* dbusbind.c (QCdbus_system_bus, QCdbus_session_bus): Renamed from
Michael Albinus <michael.albinus@gmx.de>
parents:
86940
diff
changeset
|
868 /* We initialize Vdbus_registered_functions_table in dbus.el, |
1da959e791de
* dbusbind.c (QCdbus_system_bus, QCdbus_session_bus): Renamed from
Michael Albinus <michael.albinus@gmx.de>
parents:
86940
diff
changeset
|
869 because we need to define a hash table function first. */ |
1da959e791de
* dbusbind.c (QCdbus_system_bus, QCdbus_session_bus): Renamed from
Michael Albinus <michael.albinus@gmx.de>
parents:
86940
diff
changeset
|
870 Vdbus_registered_functions_table = Qnil; |
86940
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
871 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
872 DEFVAR_LISP ("dbus-debug", &Vdbus_debug, |
87051
1da959e791de
* dbusbind.c (QCdbus_system_bus, QCdbus_session_bus): Renamed from
Michael Albinus <michael.albinus@gmx.de>
parents:
86940
diff
changeset
|
873 doc: /* If non-nil, debug messages of D-Bus bindings are raised. */); |
86940
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
874 #ifdef DBUS_DEBUG |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
875 Vdbus_debug = Qt; |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
876 #else |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
877 Vdbus_debug = Qnil; |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
878 #endif |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
879 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
880 Fprovide (intern ("dbusbind"), Qnil); |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
881 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
882 } |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
883 |
2dd672d9fe75
* config.in (HAVE_DBUS): Add.
Michael Albinus <michael.albinus@gmx.de>
parents:
diff
changeset
|
884 #endif /* HAVE_DBUS */ |
87053 | 885 |
886 /* arch-tag: 0e828477-b571-4fe4-b559-5c9211bc14b8 | |
887 (do not change this comment) */ |