Skip to content

Commit 7628da6

Browse files
committed
Registrar: Add registrar dbus interface for reference.
1 parent 934a0de commit 7628da6

File tree

8 files changed

+126
-30
lines changed

8 files changed

+126
-30
lines changed

lib/menu-widget.vala

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,11 +67,46 @@ namespace Appmenu
6767
this.add(scroller);
6868
scroller.add(mwidget);
6969
this.show_all();
70+
try
71+
{
72+
var con = Bus.get_sync(BusType.SESSION);
73+
con.call.begin(
74+
"org.valapanel.AppMenu.Registrar",
75+
"/Registrar",
76+
"org.valapanel.AppMenu.Registrar",
77+
"Reference",
78+
null,null,
79+
DBusCallFlags.NONE, -1);
80+
81+
}
82+
catch(Error e)
83+
{
84+
stderr.printf("%s\n",e.message);
85+
}
7086
}
7187
public MenuWidget()
7288
{
7389
Object();
7490
}
91+
protected override void destroy()
92+
{
93+
try
94+
{
95+
var con = Bus.get_sync(BusType.SESSION,null);
96+
con.call.begin(
97+
"org.valapanel.AppMenu.Registrar",
98+
"/Registrar",
99+
"org.valapanel.AppMenu.Registrar",
100+
"UnReference",
101+
null,null,
102+
DBusCallFlags.NO_AUTO_START, -1);
103+
104+
}
105+
catch(Error e)
106+
{
107+
stderr.printf("%s\n",e.message);
108+
}
109+
}
75110
private void restock()
76111
{
77112
unowned Gtk.StyleContext mcontext = mwidget.get_style_context();

lib/registrar.vala

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,20 @@ namespace Appmenu
8181
construct
8282
{
8383
have_registrar = false;
84+
try{
85+
var con = Bus.get_sync(BusType.SESSION);
86+
con.call.begin(
87+
DBUS_NAME,
88+
REG_OBJECT,
89+
REG_IFACE,
90+
"GetMenus",
91+
null,null,
92+
DBusCallFlags.NONE, -1);
93+
}
94+
catch(Error e)
95+
{
96+
stderr.printf("%s\n",e.message);
97+
}
8498
create_outer_registrar();
8599
}
86100
public void get_menu_for_window(uint window, out string name, out ObjectPath path)

subprojects/registrar/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ include(GLibProgramHandlers)
1414
add_glib_marshal(MARSHALC MARSHALH "registrar-marshal" g_cclosure_user_marshal)
1515
file(STRINGS data/com.canonical.AppMenu.Registrar.xml XML_RAW)
1616
string(CONCAT XML_CONTENTS ${XML_RAW})
17+
file(STRINGS data/org.valapanel.AppMenu.Registrar.xml PRIVATE_RAW)
18+
string(CONCAT PRIVATE_CONTENTS ${PRIVATE_RAW})
1719
configure_file(registrar-xml.c.in registrar-xml.c ESCAPE_QUOTES)
1820

1921
add_executable (appmenu-registrar
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
<node>
2+
<interface name="org.valapanel.AppMenu.Registrar">
3+
<method name="Reference">
4+
</method>
5+
<method name="UnReference">
6+
</method>
7+
</interface>
8+
</node>

subprojects/registrar/registrar-dbusmenu.c

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ struct _RegistrarDBusMenu
5757
{
5858
GObject parent;
5959
GHashTable *menus;
60+
uint registered_object;
6061
};
6162

6263
G_DEFINE_TYPE(RegistrarDBusMenu, registrar_dbus_menu, G_TYPE_OBJECT)
@@ -374,34 +375,34 @@ static void _dbus_registrar_dbus_menu_window_unregistered(GObject *_sender, uint
374375
static const GDBusInterfaceVTable _interface_vtable =
375376
{ registrar_dbus_menu_dbus_interface_method_call, NULL, NULL };
376377

377-
static void _registrar_dbus_menu_unregister_object(gpointer user_data)
378+
void registrar_dbus_menu_unregister(RegistrarDBusMenu *data, GDBusConnection *con)
378379
{
379-
GObject *data = G_OBJECT(user_data);
380+
g_dbus_connection_unregister_object(con, data->registered_object);
380381
g_signal_handlers_disconnect_by_func(data,
381382
_dbus_registrar_dbus_menu_window_registered,
382-
data);
383+
con);
383384
g_signal_handlers_disconnect_by_func(data,
384385
_dbus_registrar_dbus_menu_window_unregistered,
385-
data);
386+
con);
386387
g_object_unref(data);
387388
}
388389

389390
uint registrar_dbus_menu_register(RegistrarDBusMenu *object, GDBusConnection *connection,
390391
GError **error)
391392
{
392-
uint result;
393393
GDBusNodeInfo *info = g_dbus_node_info_new_for_xml(introspection_xml, NULL);
394-
result = g_dbus_connection_register_object(connection,
395-
DBUSMENU_REG_OBJECT,
396-
(GDBusInterfaceInfo *)info->interfaces[0],
397-
&_interface_vtable,
398-
object,
399-
_registrar_dbus_menu_unregister_object,
400-
error);
394+
uint result = g_dbus_connection_register_object(connection,
395+
DBUSMENU_REG_OBJECT,
396+
(GDBusInterfaceInfo *)info->interfaces[0],
397+
&_interface_vtable,
398+
object,
399+
NULL,
400+
error);
401401
if (!result)
402402
{
403403
return 0;
404404
}
405+
object->registered_object = result;
405406
g_signal_connect(object,
406407
"window-registered",
407408
(GCallback)_dbus_registrar_dbus_menu_window_registered,

subprojects/registrar/registrar-dbusmenu.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ G_BEGIN_DECLS
2929
G_DECLARE_FINAL_TYPE(RegistrarDBusMenu, registrar_dbus_menu, REGISTRAR, DBUS_MENU, GObject)
3030
uint registrar_dbus_menu_register(RegistrarDBusMenu *object, GDBusConnection *connection,
3131
GError **error);
32+
void registrar_dbus_menu_unregister(RegistrarDBusMenu *data, GDBusConnection *con);
3233

3334
G_END_DECLS
3435

subprojects/registrar/registrar-main.c

Lines changed: 52 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,18 @@
2323
#include <stdbool.h>
2424
#include <stdint.h>
2525

26+
#define MAIN_OBJECT_PATH "/Registrar"
27+
2628
struct _RegistrarApplication
2729
{
2830
GApplication parent;
2931
RegistrarDBusMenu *registrar;
3032
u_int32_t dbusmenu_binding;
33+
u_int32_t private_binding;
3134
};
3235

36+
extern const char *private_xml;
37+
3338
G_DEFINE_TYPE(RegistrarApplication, registrar_application, G_TYPE_APPLICATION)
3439

3540
static const GOptionEntry options[4] =
@@ -53,20 +58,18 @@ static const GOptionEntry options[4] =
5358

5459
RegistrarApplication *registrar_application_new()
5560
{
56-
return REGISTRAR_APPLICATION(g_object_new(registrar_application_get_type(),
57-
"application-id",
58-
"org.valapanel.AppMenu.Registrar",
59-
"flags",
60-
G_APPLICATION_HANDLES_COMMAND_LINE,
61-
"resource-base-path",
62-
"/org/valapanel/registrar",
63-
NULL));
61+
return REGISTRAR_APPLICATION(
62+
g_object_new(registrar_application_get_type(),
63+
"application-id",
64+
"org.valapanel.AppMenu.Registrar",
65+
"flags",
66+
G_APPLICATION_HANDLES_COMMAND_LINE | G_APPLICATION_IS_SERVICE,
67+
"resource-base-path",
68+
"/org/valapanel/registrar",
69+
NULL));
6470
}
6571
static void registrar_application_activate(GApplication *base)
6672
{
67-
RegistrarApplication *self = REGISTRAR_APPLICATION(base);
68-
if (self->dbusmenu_binding > 0)
69-
g_application_hold(base);
7073
}
7174
static int registrar_application_handle_local_options(GApplication *application,
7275
GVariantDict *options)
@@ -94,9 +97,7 @@ static void registrar_application_on_dbus_name_aquired(GDBusConnection *connecti
9497
RegistrarApplication *self = REGISTRAR_APPLICATION(user_data);
9598
g_autoptr(GError) err = NULL;
9699
registrar_dbus_menu_register(self->registrar, connection, &err);
97-
if (!err)
98-
g_application_hold(G_APPLICATION(user_data));
99-
else
100+
if (err)
100101
{
101102
g_print("%s\n", err->message);
102103
}
@@ -105,8 +106,31 @@ static void registrar_application_on_dbus_name_lost(GDBusConnection *connection,
105106
gpointer user_data)
106107
{
107108
GApplication *app = G_APPLICATION(user_data);
108-
g_application_release(app);
109109
}
110+
111+
static void registrar_application_method_call(GDBusConnection *connection, const char *sender,
112+
const char *object_path, const char *interface_name,
113+
const char *method_name, GVariant *parameters,
114+
GDBusMethodInvocation *invocation, gpointer user_data)
115+
{
116+
GApplication *app = G_APPLICATION(user_data);
117+
if (g_strcmp0(method_name, "Reference") == 0)
118+
{
119+
g_application_hold(app);
120+
}
121+
else if (g_strcmp0(method_name, "UnReference") == 0)
122+
{
123+
g_application_release(app);
124+
}
125+
else
126+
{
127+
g_object_unref(invocation);
128+
}
129+
}
130+
static const GDBusInterfaceVTable _interface_vtable = { registrar_application_method_call,
131+
NULL,
132+
NULL };
133+
110134
static bool registrar_application_dbus_register(GApplication *base, GDBusConnection *connection,
111135
const char *object_path, GError **error)
112136
{
@@ -125,7 +149,17 @@ static bool registrar_application_dbus_register(GApplication *base, GDBusConnect
125149
registrar_application_on_dbus_name_lost,
126150
self,
127151
NULL);
128-
return ret && self->dbusmenu_binding;
152+
GDBusNodeInfo *info = g_dbus_node_info_new_for_xml(private_xml, NULL);
153+
self->private_binding =
154+
g_dbus_connection_register_object(connection,
155+
MAIN_OBJECT_PATH,
156+
(GDBusInterfaceInfo *)info->interfaces[0],
157+
&_interface_vtable,
158+
self,
159+
NULL,
160+
error);
161+
162+
return ret && self->dbusmenu_binding && self->private_binding;
129163
}
130164
static void registrar_application_dbus_unregister(GApplication *base, GDBusConnection *connection,
131165
const char *object_path)
@@ -134,8 +168,9 @@ static void registrar_application_dbus_unregister(GApplication *base, GDBusConne
134168
g_return_if_fail(connection != NULL);
135169
g_return_if_fail(object_path != NULL);
136170
g_bus_unown_name(self->dbusmenu_binding);
171+
registrar_dbus_menu_unregister(self->registrar, connection);
172+
g_dbus_connection_unregister_object(connection, self->private_binding);
137173
self->dbusmenu_binding = 0;
138-
g_application_release(base);
139174
G_APPLICATION_CLASS(registrar_application_parent_class)
140175
->dbus_unregister(base, connection, object_path);
141176
}
@@ -153,7 +188,6 @@ static void registrar_application_init(RegistrarApplication *application)
153188
application->registrar =
154189
REGISTRAR_DBUS_MENU(g_object_new(registrar_dbus_menu_get_type(), NULL));
155190
g_application_add_main_option_entries(G_APPLICATION(application), options);
156-
g_application_hold(application);
157191
}
158192

159193
static void registrar_application_class_init(RegistrarApplicationClass *klass)

subprojects/registrar/registrar-xml.c.in

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,3 +17,4 @@
1717
*/
1818

1919
const char* introspection_xml = "@XML_CONTENTS@";
20+
const char* private_xml = "@PRIVATE_CONTENTS@";

0 commit comments

Comments
 (0)