mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2025-01-11 15:06:14 +01:00
GApplication: receiving end of GRemoteActionGroup
Use the fact that the action group exporter now speaks to GRemoteActionGroup to get the platform data into GApplicion without hacks. https://bugzilla.gnome.org/show_bug.cgi?id=665737
This commit is contained in:
parent
1807ef336a
commit
0971d36e4b
@ -250,6 +250,92 @@ G_DEFINE_TYPE_WITH_CODE (GApplication, g_application, G_TYPE_OBJECT,
|
||||
G_IMPLEMENT_INTERFACE (G_TYPE_ACTION_GROUP, g_application_action_group_iface_init)
|
||||
G_IMPLEMENT_INTERFACE (G_TYPE_ACTION_MAP, g_application_action_map_iface_init))
|
||||
|
||||
/* GApplicationExportedActions {{{1 */
|
||||
|
||||
/* We create a subclass of GSimpleActionGroup that implements
|
||||
* GRemoteActionGroup and deals with the platform data using
|
||||
* GApplication's before/after_emit vfuncs. This is the action group we
|
||||
* will be exporting.
|
||||
*
|
||||
* We could implement GRemoteActionGroup on GApplication directly, but
|
||||
* this would be potentially extremely confusing to have exposed as part
|
||||
* of the public API of GApplication. We certainly don't want anyone in
|
||||
* the same process to be calling these APIs...
|
||||
*/
|
||||
typedef GSimpleActionGroupClass GApplicationExportedActionsClass;
|
||||
typedef struct
|
||||
{
|
||||
GSimpleActionGroup parent_instance;
|
||||
GApplication *application;
|
||||
} GApplicationExportedActions;
|
||||
|
||||
static GType g_application_exported_actions_get_type (void);
|
||||
static void g_application_exported_actions_iface_init (GRemoteActionGroupInterface *iface);
|
||||
G_DEFINE_TYPE_WITH_CODE (GApplicationExportedActions, g_application_exported_actions, G_TYPE_SIMPLE_ACTION_GROUP,
|
||||
G_IMPLEMENT_INTERFACE (G_TYPE_REMOTE_ACTION_GROUP, g_application_exported_actions_iface_init))
|
||||
|
||||
static void
|
||||
g_application_exported_actions_activate_action_full (GRemoteActionGroup *remote,
|
||||
const gchar *action_name,
|
||||
GVariant *parameter,
|
||||
GVariant *platform_data)
|
||||
{
|
||||
GApplicationExportedActions *exported = (GApplicationExportedActions *) remote;
|
||||
|
||||
G_APPLICATION_GET_CLASS (exported->application)
|
||||
->before_emit (exported->application, platform_data);
|
||||
|
||||
g_action_group_activate_action (G_ACTION_GROUP (exported), action_name, parameter);
|
||||
|
||||
G_APPLICATION_GET_CLASS (exported->application)
|
||||
->after_emit (exported->application, platform_data);
|
||||
}
|
||||
|
||||
static void
|
||||
g_application_exported_actions_change_action_state_full (GRemoteActionGroup *remote,
|
||||
const gchar *action_name,
|
||||
GVariant *value,
|
||||
GVariant *platform_data)
|
||||
{
|
||||
GApplicationExportedActions *exported = (GApplicationExportedActions *) remote;
|
||||
|
||||
G_APPLICATION_GET_CLASS (exported->application)
|
||||
->before_emit (exported->application, platform_data);
|
||||
|
||||
g_action_group_change_action_state (G_ACTION_GROUP (exported), action_name, value);
|
||||
|
||||
G_APPLICATION_GET_CLASS (exported->application)
|
||||
->after_emit (exported->application, platform_data);
|
||||
}
|
||||
|
||||
static void
|
||||
g_application_exported_actions_init (GApplicationExportedActions *actions)
|
||||
{
|
||||
}
|
||||
|
||||
static void
|
||||
g_application_exported_actions_iface_init (GRemoteActionGroupInterface *iface)
|
||||
{
|
||||
iface->activate_action_full = g_application_exported_actions_activate_action_full;
|
||||
iface->change_action_state_full = g_application_exported_actions_change_action_state_full;
|
||||
}
|
||||
|
||||
static void
|
||||
g_application_exported_actions_class_init (GApplicationExportedActionsClass *class)
|
||||
{
|
||||
}
|
||||
|
||||
static GActionGroup *
|
||||
g_application_exported_actions_new (GApplication *application)
|
||||
{
|
||||
GApplicationExportedActions *actions;
|
||||
|
||||
actions = g_object_new (g_application_exported_actions_get_type (), NULL);
|
||||
actions->application = application;
|
||||
|
||||
return G_ACTION_GROUP (actions);
|
||||
}
|
||||
|
||||
/* vfunc defaults {{{1 */
|
||||
static void
|
||||
g_application_real_before_emit (GApplication *application,
|
||||
@ -704,7 +790,7 @@ g_application_init (GApplication *application)
|
||||
G_TYPE_APPLICATION,
|
||||
GApplicationPrivate);
|
||||
|
||||
application->priv->actions = G_ACTION_GROUP (g_simple_action_group_new ());
|
||||
application->priv->actions = g_application_exported_actions_new (application);
|
||||
|
||||
/* application->priv->actions is the one and only ref on the group, so when
|
||||
* we dispose, the action group will die, disconnecting all signals.
|
||||
@ -1253,6 +1339,7 @@ g_application_register (GApplication *application,
|
||||
application->priv->impl =
|
||||
g_application_impl_register (application, application->priv->id,
|
||||
application->priv->flags,
|
||||
application->priv->actions,
|
||||
&application->priv->remote_actions,
|
||||
cancellable, error);
|
||||
|
||||
|
@ -87,6 +87,7 @@ static GDBusInterfaceInfo *org_gtk_private_CommandLine;
|
||||
struct _GApplicationImpl
|
||||
{
|
||||
GDBusConnection *session_bus;
|
||||
GActionGroup *exported_actions;
|
||||
const gchar *bus_name;
|
||||
|
||||
gchar *object_path;
|
||||
@ -377,7 +378,8 @@ g_application_impl_attempt_primary (GApplicationImpl *impl,
|
||||
if (impl->object_id == 0)
|
||||
return FALSE;
|
||||
|
||||
impl->actions_id = g_dbus_connection_export_action_group (impl->session_bus, impl->object_path, impl->app, error);
|
||||
impl->actions_id = g_dbus_connection_export_action_group (impl->session_bus, impl->object_path,
|
||||
impl->exported_actions, error);
|
||||
|
||||
if (impl->actions_id == 0)
|
||||
return FALSE;
|
||||
@ -477,6 +479,7 @@ GApplicationImpl *
|
||||
g_application_impl_register (GApplication *application,
|
||||
const gchar *appid,
|
||||
GApplicationFlags flags,
|
||||
GActionGroup *exported_actions,
|
||||
GRemoteActionGroup **remote_actions,
|
||||
GCancellable *cancellable,
|
||||
GError **error)
|
||||
@ -487,6 +490,7 @@ g_application_impl_register (GApplication *application,
|
||||
impl = g_slice_new0 (GApplicationImpl);
|
||||
|
||||
impl->app = application;
|
||||
impl->exported_actions = exported_actions;
|
||||
impl->bus_name = appid;
|
||||
|
||||
impl->session_bus = g_bus_get_sync (G_BUS_TYPE_SESSION, cancellable, NULL);
|
||||
|
@ -15,12 +15,13 @@ G_GNUC_INTERNAL
|
||||
void g_application_impl_destroy (GApplicationImpl *impl);
|
||||
|
||||
G_GNUC_INTERNAL
|
||||
GApplicationImpl * g_application_impl_register (GApplication *application,
|
||||
const gchar *appid,
|
||||
GApplicationFlags flags,
|
||||
GRemoteActionGroup**remote_actions,
|
||||
GCancellable *cancellable,
|
||||
GError **error);
|
||||
GApplicationImpl * g_application_impl_register (GApplication *application,
|
||||
const gchar *appid,
|
||||
GApplicationFlags flags,
|
||||
GActionGroup *exported_actions,
|
||||
GRemoteActionGroup **remote_actions,
|
||||
GCancellable *cancellable,
|
||||
GError **error);
|
||||
|
||||
G_GNUC_INTERNAL
|
||||
void g_application_impl_activate (GApplicationImpl *impl,
|
||||
|
Loading…
Reference in New Issue
Block a user