mirror of
https://gitlab.gnome.org/GNOME/gtk.git
synced 2024-12-27 22:20:24 +00:00
[GtkApplication] Update for GApplication API changes
We now implement "quit" and "action" signals here. https://bugzilla.gnome.org/show_bug.cgi?id=621003
This commit is contained in:
parent
cf14d4f368
commit
6c71da01cc
@ -34,6 +34,7 @@
|
|||||||
|
|
||||||
#include "gtkapplication.h"
|
#include "gtkapplication.h"
|
||||||
#include "gtkmain.h"
|
#include "gtkmain.h"
|
||||||
|
#include "gtkmarshalers.h"
|
||||||
#include "gtkintl.h"
|
#include "gtkintl.h"
|
||||||
#include "gtkprivate.h"
|
#include "gtkprivate.h"
|
||||||
|
|
||||||
@ -76,6 +77,8 @@ enum
|
|||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
ACTIVATED,
|
ACTIVATED,
|
||||||
|
QUIT,
|
||||||
|
ACTION,
|
||||||
|
|
||||||
LAST_SIGNAL
|
LAST_SIGNAL
|
||||||
};
|
};
|
||||||
@ -92,14 +95,32 @@ struct _GtkApplicationPrivate
|
|||||||
|
|
||||||
G_DEFINE_TYPE (GtkApplication, gtk_application, G_TYPE_APPLICATION)
|
G_DEFINE_TYPE (GtkApplication, gtk_application, G_TYPE_APPLICATION)
|
||||||
|
|
||||||
|
static void
|
||||||
|
process_timestamp_from_platform_data (GVariant *platform_data)
|
||||||
|
{
|
||||||
|
/* TODO - extract timestamp from here, update GDK time */
|
||||||
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
gtk_application_default_quit (GApplication *application,
|
gtk_application_default_quit (GtkApplication *application)
|
||||||
guint timestamp)
|
|
||||||
{
|
{
|
||||||
gtk_main_quit ();
|
gtk_main_quit ();
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
gtk_application_default_quit_with_data (GApplication *application,
|
||||||
|
GVariant *platform_data)
|
||||||
|
{
|
||||||
|
gboolean result;
|
||||||
|
|
||||||
|
process_timestamp_from_platform_data (platform_data);
|
||||||
|
|
||||||
|
g_signal_emit (application, gtk_application_signals[QUIT], 0, &result);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gtk_application_default_run (GApplication *application)
|
gtk_application_default_run (GApplication *application)
|
||||||
{
|
{
|
||||||
@ -128,7 +149,7 @@ gtk_application_default_prepare_activation (GApplication *application,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gtk_application_default_activated (GApplication *application,
|
gtk_application_default_activated (GtkApplication *application,
|
||||||
GVariant *arguments)
|
GVariant *arguments)
|
||||||
{
|
{
|
||||||
GtkApplication *app = GTK_APPLICATION (application);
|
GtkApplication *app = GTK_APPLICATION (application);
|
||||||
@ -139,20 +160,27 @@ gtk_application_default_activated (GApplication *application,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gtk_application_default_action (GApplication *application,
|
gtk_application_default_action (GtkApplication *application,
|
||||||
const gchar *action_name,
|
const gchar *action_name)
|
||||||
guint timestamp)
|
|
||||||
{
|
{
|
||||||
GtkApplication *app = GTK_APPLICATION (application);
|
|
||||||
GtkAction *action;
|
GtkAction *action;
|
||||||
|
|
||||||
action = gtk_action_group_get_action (app->priv->main_actions, action_name);
|
action = gtk_action_group_get_action (application->priv->main_actions, action_name);
|
||||||
if (action)
|
if (action)
|
||||||
{
|
{
|
||||||
/* TODO set timestamp */
|
|
||||||
gtk_action_activate (action);
|
gtk_action_activate (action);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
gtk_application_default_action_with_data (GApplication *application,
|
||||||
|
const gchar *action_name,
|
||||||
|
GVariant *platform_data)
|
||||||
|
{
|
||||||
|
process_timestamp_from_platform_data (platform_data);
|
||||||
|
|
||||||
|
g_signal_emit (application, gtk_application_signals[ACTION], g_quark_from_string (action_name));
|
||||||
|
}
|
||||||
|
|
||||||
static GVariant *
|
static GVariant *
|
||||||
gtk_application_format_activation_data (void)
|
gtk_application_format_activation_data (void)
|
||||||
@ -377,15 +405,32 @@ gtk_application_run (GtkApplication *app)
|
|||||||
* gtk_application_quit:
|
* gtk_application_quit:
|
||||||
* @app: a #GtkApplication
|
* @app: a #GtkApplication
|
||||||
*
|
*
|
||||||
* Request the application exit.
|
* Request the application exit. This function invokes
|
||||||
* By default, this method will exit the main loop; see gtk_main_quit().
|
* g_application_quit_with_data(), which normally will
|
||||||
|
* in turn cause @app to emit #GtkApplication::quit.
|
||||||
|
*
|
||||||
|
* To control an application's quit behavior (for example, to ask for
|
||||||
|
* files to be saved), connect to the #GtkApplication::quit signal
|
||||||
|
* handler.
|
||||||
*
|
*
|
||||||
* Since: 3.0
|
* Since: 3.0
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
gtk_application_quit (GtkApplication *app)
|
gtk_application_quit (GtkApplication *app)
|
||||||
{
|
{
|
||||||
g_application_quit (G_APPLICATION (app), gtk_get_current_event_time ());
|
GVariantBuilder builder;
|
||||||
|
GVariant *platform_data;
|
||||||
|
|
||||||
|
g_variant_builder_init (&builder, G_VARIANT_TYPE ("a{sv}"));
|
||||||
|
g_variant_builder_add (&builder, "{sv}",
|
||||||
|
"timestamp",
|
||||||
|
g_variant_new ("u",
|
||||||
|
gtk_get_current_event_time ()));
|
||||||
|
platform_data = g_variant_builder_end (&builder);
|
||||||
|
|
||||||
|
g_application_quit_with_data (G_APPLICATION (app), platform_data);
|
||||||
|
|
||||||
|
g_variant_unref (platform_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -495,10 +540,13 @@ gtk_application_class_init (GtkApplicationClass *klass)
|
|||||||
gobject_class->set_property = gtk_application_set_property;
|
gobject_class->set_property = gtk_application_set_property;
|
||||||
|
|
||||||
application_class->run = gtk_application_default_run;
|
application_class->run = gtk_application_default_run;
|
||||||
application_class->quit = gtk_application_default_quit;
|
application_class->quit_with_data = gtk_application_default_quit_with_data;
|
||||||
application_class->action = gtk_application_default_action;
|
application_class->action_with_data = gtk_application_default_action_with_data;
|
||||||
application_class->prepare_activation = gtk_application_default_prepare_activation;
|
application_class->prepare_activation = gtk_application_default_prepare_activation;
|
||||||
|
|
||||||
|
klass->quit = gtk_application_default_quit;
|
||||||
|
klass->action = gtk_application_default_action;
|
||||||
|
|
||||||
klass->activated = gtk_application_default_activated;
|
klass->activated = gtk_application_default_activated;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -522,6 +570,53 @@ gtk_application_class_init (GtkApplicationClass *klass)
|
|||||||
G_TYPE_NONE, 1,
|
G_TYPE_NONE, 1,
|
||||||
G_TYPE_VARIANT);
|
G_TYPE_VARIANT);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* GtkApplication::quit:
|
||||||
|
* @application: the object on which the signal is emitted
|
||||||
|
*
|
||||||
|
* This signal is emitted when a quit is initiated. See also
|
||||||
|
* the #GApplication::quit-with-data signal which may in
|
||||||
|
* turn trigger this signal.
|
||||||
|
*
|
||||||
|
* The default handler for this signal exits the mainloop of the
|
||||||
|
* application.
|
||||||
|
*
|
||||||
|
* Returns: %TRUE if the signal has been handled, %FALSE to continue
|
||||||
|
* signal emission
|
||||||
|
*/
|
||||||
|
gtk_application_signals[QUIT] =
|
||||||
|
g_signal_new (g_intern_static_string ("quit"),
|
||||||
|
G_OBJECT_CLASS_TYPE (klass),
|
||||||
|
G_SIGNAL_RUN_LAST,
|
||||||
|
G_STRUCT_OFFSET (GtkApplicationClass, quit),
|
||||||
|
g_signal_accumulator_true_handled, NULL,
|
||||||
|
_gtk_marshal_BOOLEAN__VOID,
|
||||||
|
G_TYPE_BOOLEAN, 0);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* GtkApplication::action:
|
||||||
|
* @application: the object on which the signal is emitted
|
||||||
|
* @name: The name of the activated action
|
||||||
|
*
|
||||||
|
* This signal is emitted when an action is activated. The action name
|
||||||
|
* is passed as the first argument, but also as signal detail, so it
|
||||||
|
* is possible to connect to this signal for individual actions.
|
||||||
|
*
|
||||||
|
* See also the #GApplication::action-with-data signal which may in
|
||||||
|
* turn trigger this signal.
|
||||||
|
*
|
||||||
|
* The signal is never emitted for disabled actions.
|
||||||
|
*/
|
||||||
|
gtk_application_signals[ACTION] =
|
||||||
|
g_signal_new (g_intern_static_string ("action"),
|
||||||
|
G_OBJECT_CLASS_TYPE (klass),
|
||||||
|
G_SIGNAL_RUN_FIRST | G_SIGNAL_NO_RECURSE | G_SIGNAL_DETAILED,
|
||||||
|
G_STRUCT_OFFSET (GtkApplicationClass, action),
|
||||||
|
NULL, NULL,
|
||||||
|
g_cclosure_marshal_VOID__STRING,
|
||||||
|
G_TYPE_NONE, 1,
|
||||||
|
G_TYPE_STRING);
|
||||||
|
|
||||||
g_type_class_add_private (gobject_class, sizeof (GtkApplicationPrivate));
|
g_type_class_add_private (gobject_class, sizeof (GtkApplicationPrivate));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -66,8 +66,12 @@ struct _GtkApplicationClass
|
|||||||
GApplicationClass parent_class;
|
GApplicationClass parent_class;
|
||||||
|
|
||||||
/*< vfuncs >*/
|
/*< vfuncs >*/
|
||||||
void (* activated) (GApplication *application,
|
void (* activated) (GtkApplication *application,
|
||||||
GVariant *args);
|
GVariant *args);
|
||||||
|
void (* action) (GtkApplication *application,
|
||||||
|
const gchar *action_name);
|
||||||
|
gboolean (* quit) (GtkApplication *application);
|
||||||
|
|
||||||
|
|
||||||
/* Padding for future expansion */
|
/* Padding for future expansion */
|
||||||
void (*_gtk_reserved1) (void);
|
void (*_gtk_reserved1) (void);
|
||||||
|
Loading…
Reference in New Issue
Block a user