Commit 4b3c2080 authored by Juan Pablo Ugarte's avatar Juan Pablo Ugarte

GladeWindow: port to GtkApplication

This will let us export actions on DBus as an entry point for
integration with other IDE like Builder.
parent d666d334
......@@ -103,8 +103,6 @@ struct _GladeWindowPrivate
guint statusbar_menu_context_id; /* The context id of the menu bar */
guint statusbar_actions_context_id; /* The context id of actions messages */
GActionGroup *actions;
GtkRecentManager *recent_manager;
GtkWidget *recent_menu;
......@@ -131,7 +129,7 @@ struct _GladeWindowPrivate
static void check_reload_project (GladeWindow *window, GladeProject *project);
G_DEFINE_TYPE_WITH_PRIVATE (GladeWindow, glade_window, GTK_TYPE_WINDOW)
G_DEFINE_TYPE_WITH_PRIVATE (GladeWindow, glade_window, GTK_TYPE_APPLICATION_WINDOW)
static void
refresh_title (GladeWindow *window)
......@@ -408,7 +406,7 @@ project_targets_changed_cb (GladeProject *project, GladeWindow *window)
static void
actions_set_enabled (GladeWindow *window, const gchar *name, gboolean enabled)
{
GAction *action = g_action_map_lookup_action (G_ACTION_MAP (window->priv->actions), name);
GAction *action = g_action_map_lookup_action (G_ACTION_MAP (window), name);
g_simple_action_set_enabled (G_SIMPLE_ACTION (action), enabled);
}
......@@ -1540,7 +1538,7 @@ drag_data_received (GtkWidget *widget,
static gboolean
delete_event (GtkWindow *w, GdkEvent *event, GladeWindow *window)
{
g_action_group_activate_action (window->priv->actions, "quit", NULL);
g_action_group_activate_action (G_ACTION_GROUP (window), "quit", NULL);
/* return TRUE to stop other handlers */
return TRUE;
......@@ -2079,8 +2077,6 @@ on_quit_action_activate (GSimpleAction *action,
glade_window_config_save (window);
g_list_free (projects);
gtk_main_quit ();
}
static void
......@@ -2148,10 +2144,9 @@ glade_window_init (GladeWindow *window)
static void
glade_window_action_handler (GladeWindow *window, const gchar *name)
{
GladeWindowPrivate *priv = window->priv;
GAction *action;
if ((action = g_action_map_lookup_action (G_ACTION_MAP (priv->actions), name)))
if ((action = g_action_map_lookup_action (G_ACTION_MAP (window), name)))
g_action_activate (action, NULL);
}
......@@ -2221,12 +2216,12 @@ on_intro_show_node (GladeIntro *intro,
if (!g_strcmp0 (node, "new-project"))
{
/* Create two new project to make the project switcher visible */
g_action_group_activate_action (window->priv->actions, "new", NULL);
g_action_group_activate_action (window->priv->actions, "new", NULL);
g_action_group_activate_action (G_ACTION_GROUP (window), "new", NULL);
g_action_group_activate_action (G_ACTION_GROUP (window), "new", NULL);
}
else if (!g_strcmp0 (node, "add-project"))
{
GAction *new_action = g_action_map_lookup_action (G_ACTION_MAP (priv->actions), "new");
GAction *new_action = g_action_map_lookup_action (G_ACTION_MAP (window), "new");
g_signal_connect (new_action, "activate",
G_CALLBACK (on_user_new_action_activate),
......@@ -2393,9 +2388,8 @@ glade_window_constructed (GObject *object)
priv->recent_manager = gtk_recent_manager_get_default ();
/* Setup Actions */
priv->actions = (GActionGroup *) g_simple_action_group_new ();
g_action_map_add_action_entries (G_ACTION_MAP (priv->actions), actions, G_N_ELEMENTS (actions), window);
gtk_widget_insert_action_group (GTK_WIDGET (window), "app", priv->actions);
g_action_map_add_action_entries (G_ACTION_MAP (window), actions, G_N_ELEMENTS (actions), window);
gtk_widget_insert_action_group (GTK_WIDGET (window), "app", G_ACTION_GROUP(window));
/* status bar */
priv->statusbar_context_id = gtk_statusbar_get_context_id (GTK_STATUSBAR (priv->statusbar), "general");
......
......@@ -38,14 +38,13 @@ typedef struct _GladeWindowClass GladeWindowClass;
struct _GladeWindow
{
GtkWindow parent_instance;
GladeWindowPrivate *priv;
GtkApplicationWindow parent_instance;
GladeWindowPrivate *priv;
};
struct _GladeWindowClass
{
GtkWindowClass parent_class;
GtkApplicationWindowClass parent_class;
};
GType glade_window_get_type (void) G_GNUC_CONST;
......@@ -55,7 +54,7 @@ GtkWidget *glade_window_new (void);
void glade_window_new_project (GladeWindow *window);
gboolean glade_window_open_project (GladeWindow *window,
const gchar *path);
const gchar *path);
void glade_window_check_devhelp (GladeWindow *window);
......
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.21.0
<!-- Generated with glade 3.22.0
Glade - A user interface designer for GTK+ and GNOME.
Copyright (C) 2012-2017 Juan Pablo Ugarte
......@@ -166,7 +166,7 @@ Author: Juan Pablo Ugarte
<property name="show_numbers">True</property>
<signal name="item-activated" handler="on_open_recent_action_item_activated" swapped="no"/>
</object>
<template class="GladeWindow" parent="GtkWindow">
<template class="GladeWindow" parent="GtkApplicationWindow">
<property name="can_focus">False</property>
<child>
<object class="GtkStack" id="stack">
......
......@@ -18,6 +18,7 @@
* Authors:
* Chema Celorio <chema@celorio.com>
* Vincent Geddes <vgeddes@gnome.org>
* Juan Pablo Ugarte <juanpablougarte@gmail.com>
*/
#include <config.h>
......@@ -44,7 +45,7 @@
/* Application arguments */
static gboolean version = FALSE, without_devhelp = FALSE;
static gchar **files = NULL;
static gboolean verbose = FALSE;
static GOptionEntry option_entries[] = {
{"version", '\0', 0, G_OPTION_ARG_NONE, &version,
......@@ -53,29 +54,14 @@ static GOptionEntry option_entries[] = {
{"without-devhelp", '\0', 0, G_OPTION_ARG_NONE, &without_devhelp,
N_("Disable Devhelp integration"), NULL},
{G_OPTION_REMAINING, '\0', 0, G_OPTION_ARG_FILENAME_ARRAY, &files,
NULL, N_("[FILE...]")},
{NULL}
};
/* Debugging arguments */
static gboolean verbose = FALSE;
static GOptionEntry debug_option_entries[] = {
{"verbose", 'v', 0, G_OPTION_ARG_NONE, &verbose, N_("be verbose"), NULL},
{NULL}
};
int
main (int argc, char *argv[])
static void
startup (GApplication *application)
{
GladeWindow *window;
GOptionContext *option_context;
GOptionGroup *option_group;
GError *error = NULL;
GTimer *timer = NULL;
#ifdef ENABLE_NLS
setlocale (LC_ALL, "");
bindtextdomain (GETTEXT_PACKAGE, glade_app_get_locale_dir ());
......@@ -83,119 +69,125 @@ main (int argc, char *argv[])
textdomain (GETTEXT_PACKAGE);
#endif
/* Set up option groups */
option_context = g_option_context_new (NULL);
g_option_context_set_summary (option_context,
N_("Create or edit user interface designs for GTK+ or GNOME applications."));
g_option_context_set_translation_domain (option_context, GETTEXT_PACKAGE);
option_group = g_option_group_new ("glade",
N_("Glade options"),
N_("Glade options"), NULL, NULL);
g_option_group_add_entries (option_group, option_entries);
g_option_context_set_main_group (option_context, option_group);
g_option_group_set_translation_domain (option_group, GETTEXT_PACKAGE);
option_group = g_option_group_new ("debug",
N_("Glade debug options"),
N_("Show Glade debug options"),
NULL, NULL);
g_option_group_add_entries (option_group, debug_option_entries);
g_option_group_set_translation_domain (option_group, GETTEXT_PACKAGE);
g_option_context_add_group (option_context, option_group);
/* Add Gtk option group */
g_option_context_add_group (option_context, gtk_get_option_group (FALSE));
/* Parse command line */
if (!g_option_context_parse (option_context, &argc, &argv, &error))
{
g_option_context_free (option_context);
glade_setup_log_handlers ();
if (error)
{
g_print ("%s\n", error->message);
g_error_free (error);
}
else
g_print ("An unknown error occurred\n");
g_set_application_name (APPLICATION_NAME);
return -1;
}
gtk_window_set_default_icon_name ("glade");
g_option_context_free (option_context);
option_context = NULL;
}
static void
on_quit_activate (GAction *action,
GVariant *parameter,
GApplication *application)
{
g_application_quit (application);
}
static void
activate (GApplication *application)
{
GladeWindow *window;
GAction *quit;
if (version != FALSE)
{
/* Print version information and exit */
g_print ("%s\n", PACKAGE_STRING);
return 0;
}
/* Pass NULL here since we parsed the gtk+ args already...
* from this point on we need a DISPLAY variable to be set.
*/
gtk_init (NULL, NULL);
/* Check for gmodule support */
if (!g_module_supported ())
{
g_warning (_("gmodule support not found. gmodule support is required "
"for glade to work"));
return -1;
g_application_quit (application);
return;
}
g_set_application_name (APPLICATION_NAME);
gtk_window_set_default_icon_name ("glade");
glade_setup_log_handlers ();
window = GLADE_WINDOW (glade_window_new ());
gtk_application_add_window (GTK_APPLICATION (application),
GTK_WINDOW (window));
if (without_devhelp == FALSE)
glade_window_check_devhelp (window);
gtk_widget_show (GTK_WIDGET (window));
/* Update UI before loading files */
while (gtk_events_pending ()) gtk_main_iteration ();
glade_window_registration_notify_user (window);
if (verbose) timer = g_timer_new ();
quit = g_action_map_lookup_action (G_ACTION_MAP (window), "quit");
g_signal_connect (quit, "activate", G_CALLBACK (on_quit_activate), application);
}
static void
open (GApplication *application,
GFile **files,
gint n_files,
const gchar *hint)
{
GTimer *timer = NULL;
GtkWindow *window;
gint i;
g_application_activate (application);
window = gtk_application_get_active_window (GTK_APPLICATION (application));
/* load files specified on commandline */
if (files != NULL)
if (verbose) timer = g_timer_new ();
for (i = 0; i < n_files; i++)
{
guint i;
gchar *path = g_file_get_path (files[i]);
for (i = 0; files[i]; ++i)
{
if (verbose) g_timer_start (timer);
if (g_file_test (files[i], G_FILE_TEST_EXISTS) != FALSE)
glade_window_open_project (window, files[i]);
if (g_file_test (path, G_FILE_TEST_EXISTS) != FALSE)
glade_window_open_project (GLADE_WINDOW (window), path);
else
g_warning (_("Unable to open '%s', the file does not exist.\n"),
files[i]);
path);
if (verbose)
{
g_timer_stop (timer);
g_message ("Loading '%s' took %lf seconds", files[i],
g_message ("Loading '%s' took %lf seconds", path,
g_timer_elapsed (timer, NULL));
}
}
g_strfreev (files);
g_free (path);
}
if (verbose) g_timer_destroy (timer);
}
glade_window_registration_notify_user (window);
gtk_main ();
int
main (int argc, char *argv[])
{
GtkApplication *app;
int status;
/* Check for gmodule support */
if (!g_module_supported ())
{
g_warning (_("gmodule support not found. gmodule support is required "
"for glade to work"));
return -1;
}
app = gtk_application_new ("org.gnome.Glade", G_APPLICATION_HANDLES_OPEN);
g_application_set_option_context_summary (G_APPLICATION (app),
N_("Create or edit user interface designs for GTK+ or GNOME applications."));
g_application_add_main_option_entries (G_APPLICATION (app), option_entries);
g_signal_connect (app, "startup", G_CALLBACK (startup), NULL);
g_signal_connect (app, "activate", G_CALLBACK (activate), NULL);
g_signal_connect (app, "open", G_CALLBACK (open), NULL);
status = g_application_run (G_APPLICATION (app), argc, argv);
g_object_unref (app);
return 0;
return status;
}
#ifdef G_OS_WIN32
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment