mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2025-01-11 23:16: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_GROUP, g_application_action_group_iface_init)
|
||||||
G_IMPLEMENT_INTERFACE (G_TYPE_ACTION_MAP, g_application_action_map_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 */
|
/* vfunc defaults {{{1 */
|
||||||
static void
|
static void
|
||||||
g_application_real_before_emit (GApplication *application,
|
g_application_real_before_emit (GApplication *application,
|
||||||
@ -704,7 +790,7 @@ g_application_init (GApplication *application)
|
|||||||
G_TYPE_APPLICATION,
|
G_TYPE_APPLICATION,
|
||||||
GApplicationPrivate);
|
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
|
/* application->priv->actions is the one and only ref on the group, so when
|
||||||
* we dispose, the action group will die, disconnecting all signals.
|
* we dispose, the action group will die, disconnecting all signals.
|
||||||
@ -1253,6 +1339,7 @@ g_application_register (GApplication *application,
|
|||||||
application->priv->impl =
|
application->priv->impl =
|
||||||
g_application_impl_register (application, application->priv->id,
|
g_application_impl_register (application, application->priv->id,
|
||||||
application->priv->flags,
|
application->priv->flags,
|
||||||
|
application->priv->actions,
|
||||||
&application->priv->remote_actions,
|
&application->priv->remote_actions,
|
||||||
cancellable, error);
|
cancellable, error);
|
||||||
|
|
||||||
|
@ -87,6 +87,7 @@ static GDBusInterfaceInfo *org_gtk_private_CommandLine;
|
|||||||
struct _GApplicationImpl
|
struct _GApplicationImpl
|
||||||
{
|
{
|
||||||
GDBusConnection *session_bus;
|
GDBusConnection *session_bus;
|
||||||
|
GActionGroup *exported_actions;
|
||||||
const gchar *bus_name;
|
const gchar *bus_name;
|
||||||
|
|
||||||
gchar *object_path;
|
gchar *object_path;
|
||||||
@ -377,7 +378,8 @@ g_application_impl_attempt_primary (GApplicationImpl *impl,
|
|||||||
if (impl->object_id == 0)
|
if (impl->object_id == 0)
|
||||||
return FALSE;
|
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)
|
if (impl->actions_id == 0)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
@ -477,6 +479,7 @@ GApplicationImpl *
|
|||||||
g_application_impl_register (GApplication *application,
|
g_application_impl_register (GApplication *application,
|
||||||
const gchar *appid,
|
const gchar *appid,
|
||||||
GApplicationFlags flags,
|
GApplicationFlags flags,
|
||||||
|
GActionGroup *exported_actions,
|
||||||
GRemoteActionGroup **remote_actions,
|
GRemoteActionGroup **remote_actions,
|
||||||
GCancellable *cancellable,
|
GCancellable *cancellable,
|
||||||
GError **error)
|
GError **error)
|
||||||
@ -487,6 +490,7 @@ g_application_impl_register (GApplication *application,
|
|||||||
impl = g_slice_new0 (GApplicationImpl);
|
impl = g_slice_new0 (GApplicationImpl);
|
||||||
|
|
||||||
impl->app = application;
|
impl->app = application;
|
||||||
|
impl->exported_actions = exported_actions;
|
||||||
impl->bus_name = appid;
|
impl->bus_name = appid;
|
||||||
|
|
||||||
impl->session_bus = g_bus_get_sync (G_BUS_TYPE_SESSION, cancellable, NULL);
|
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);
|
void g_application_impl_destroy (GApplicationImpl *impl);
|
||||||
|
|
||||||
G_GNUC_INTERNAL
|
G_GNUC_INTERNAL
|
||||||
GApplicationImpl * g_application_impl_register (GApplication *application,
|
GApplicationImpl * g_application_impl_register (GApplication *application,
|
||||||
const gchar *appid,
|
const gchar *appid,
|
||||||
GApplicationFlags flags,
|
GApplicationFlags flags,
|
||||||
GRemoteActionGroup**remote_actions,
|
GActionGroup *exported_actions,
|
||||||
GCancellable *cancellable,
|
GRemoteActionGroup **remote_actions,
|
||||||
GError **error);
|
GCancellable *cancellable,
|
||||||
|
GError **error);
|
||||||
|
|
||||||
G_GNUC_INTERNAL
|
G_GNUC_INTERNAL
|
||||||
void g_application_impl_activate (GApplicationImpl *impl,
|
void g_application_impl_activate (GApplicationImpl *impl,
|
||||||
|
Loading…
Reference in New Issue
Block a user