Commit ab5fb5de authored by Allison Karlitskaya's avatar Allison Karlitskaya

GtkApplication rewrite

parent ff142ac2
......@@ -957,6 +957,7 @@ gdk_x11_display_ungrab
gdk_x11_lookup_xdisplay
gdk_x11_display_broadcast_startup_message
gdk_x11_display_get_startup_notification_id
gdk_x11_display_set_startup_notification_id
gdk_x11_register_standard_event_type
gdk_x11_display_error_trap_push
gdk_x11_display_error_trap_pop
......
......@@ -252,13 +252,6 @@ gtk_alignment_set_padding
#if IN_FILE(__GTK_APPLICATION_C__)
gtk_application_get_type G_GNUC_CONST
gtk_application_new
gtk_application_set_action_group
gtk_application_create_window
gtk_application_get_window
gtk_application_get_windows
gtk_application_add_window
gtk_application_run
gtk_application_quit
#endif
#endif
......@@ -4400,6 +4393,7 @@ gtk_window_begin_resize_drag
gtk_window_deiconify
gtk_window_fullscreen
gtk_window_get_accept_focus
gtk_window_get_application
gtk_window_get_decorated
gtk_window_get_deletable
gtk_window_get_default_widget
......@@ -4462,6 +4456,7 @@ gtk_window_resize
gtk_window_resize_grip_is_visible
gtk_window_resize_to_geometry
gtk_window_set_accept_focus
gtk_window_set_application
gtk_window_set_auto_startup_notification
gtk_window_set_decorated
gtk_window_set_deletable
......
This diff is collapsed.
/* GTK - The GIMP Toolkit
*
* Copyright (C) 2010 Red Hat, Inc.
/*
* Copyright © 2010 Codethink Limited
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
* version 2 of the licence, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
......@@ -17,14 +16,7 @@
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*
* Author: Colin Walters <walters@verbum.org>
*/
/*
* Modified by the GTK+ Team and others 1997-2000. See the AUTHORS
* file for a list of people on the GTK+ Team. See the ChangeLog
* files for a list of changes. These files are distributed with
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
* Author: Ryan Lortie <desrt@desrt.ca>
*/
#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION)
......@@ -34,10 +26,9 @@
#ifndef __GTK_APPLICATION_H__
#define __GTK_APPLICATION_H__
#include <gio/gio.h>
#include <gtk/gtkaction.h>
#include <gtk/gtkactiongroup.h>
#include <gtk/gtkwindow.h>
#include <gtk/gtkwidget.h>
#include <gio/gio.h>
G_BEGIN_DECLS
......@@ -57,7 +48,6 @@ struct _GtkApplication
GApplication parent;
/*< private >*/
GtkApplicationPrivate *priv;
};
......@@ -66,40 +56,16 @@ struct _GtkApplicationClass
GApplicationClass parent_class;
/*< vfuncs >*/
GtkWindow *(* create_window) (GtkApplication *app);
void (* activated) (GtkApplication *app,
GVariant *args);
void (* action) (GtkApplication *app,
const gchar *action_name);
gboolean (* quit) (GtkApplication *app);
/* Padding for future expansion */
void (*_gtk_reserved1) (void);
void (*_gtk_reserved2) (void);
void (*_gtk_reserved3) (void);
void (*_gtk_reserved4) (void);
void (*_gtk_reserved5) (void);
void (*_gtk_reserved6) (void);
void (*_gtk_reserved7) (void);
void (*_gtk_reserved8) (void);
void (*_gtk_reserved9) (void);
void (*_gtk_reserved10) (void);
GtkWindow *(* create_window) (GtkApplication *application);
/*< private >*/
gpointer padding[12];
};
GType gtk_application_get_type (void) G_GNUC_CONST;
GtkApplication* gtk_application_new (const gchar *appid,
gint *argc,
gchar ***argv);
void gtk_application_set_action_group (GtkApplication *app,
GtkActionGroup *group);
GtkWindow * gtk_application_create_window (GtkApplication *app);
GtkWindow * gtk_application_get_window (GtkApplication *app);
G_CONST_RETURN GSList * gtk_application_get_windows (GtkApplication *app);
void gtk_application_add_window (GtkApplication *app,
GtkWindow *window);
void gtk_application_run (GtkApplication *app);
void gtk_application_quit (GtkApplication *app);
GType gtk_application_get_type (void) G_GNUC_CONST;
GtkApplication* gtk_application_new (const gchar *application_id,
GApplicationFlags flags);
G_END_DECLS
......
......@@ -113,6 +113,8 @@ struct _GtkWindowPrivate
GdkWindow *frame;
GdkWindowTypeHint gdk_type_hint;
GtkApplication *application;
gdouble opacity;
GdkWindow *grip_window;
......@@ -223,7 +225,7 @@ enum {
PROP_OPACITY,
PROP_HAS_RESIZE_GRIP,
PROP_RESIZE_GRIP_VISIBLE,
PROP_APPLICATION,
/* Readonly properties */
PROP_IS_ACTIVE,
PROP_HAS_TOPLEVEL_FOCUS,
......@@ -937,7 +939,6 @@ gtk_window_class_init (GtkWindowClass *klass)
1.0,
GTK_PARAM_READWRITE));
/* Style properties.
*/
gtk_widget_class_install_style_property (widget_class,
......@@ -955,6 +956,24 @@ gtk_window_class_init (GtkWindowClass *klass)
/* Signals
*/
/**
* GtkWindow:application:
*
* The #GtkApplication associated with the window.
*
* The application will be kept alive for at least as long as the
* window is open.
*
* Since: 3.0
*/
g_object_class_install_property (gobject_class,
PROP_APPLICATION,
g_param_spec_object ("application",
P_("GtkApplication"),
P_("The GtkApplication for the window"),
GTK_TYPE_APPLICATION,
GTK_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
window_signals[SET_FOCUS] =
g_signal_new (I_("set-focus"),
G_TYPE_FROM_CLASS (gobject_class),
......@@ -1219,6 +1238,9 @@ gtk_window_set_property (GObject *object,
case PROP_HAS_RESIZE_GRIP:
gtk_window_set_has_resize_grip (window, g_value_get_boolean (value));
break;
case PROP_APPLICATION:
gtk_window_set_application (window, g_value_get_object (value));
break;
case PROP_MNEMONICS_VISIBLE:
gtk_window_set_mnemonics_visible (window, g_value_get_boolean (value));
break;
......@@ -1334,6 +1356,9 @@ gtk_window_get_property (GObject *object,
case PROP_RESIZE_GRIP_VISIBLE:
g_value_set_boolean (value, gtk_window_resize_grip_is_visible (window));
break;
case PROP_APPLICATION:
g_value_set_object (value, gtk_window_get_application (window));
break;
case PROP_MNEMONICS_VISIBLE:
g_value_set_boolean (value, priv->mnemonics_visible);
break;
......@@ -2598,6 +2623,70 @@ gtk_window_get_opacity (GtkWindow *window)
return window->priv->opacity;
}
/**
* gtk_window_get_application:
* @window: a #GtkWindow
*
* Gets the #GtkApplication associated with the window (if any).
*
* Return value: a #GtkApplication, or %NULL
*
* Since: 3.0
**/
GtkApplication *
gtk_window_get_application (GtkWindow *window)
{
g_return_val_if_fail (GTK_IS_WINDOW (window), NULL);
return window->priv->application;
}
static void
gtk_window_release_application (GtkWindow *window)
{
if (window->priv->application)
{
g_application_release (G_APPLICATION (window->priv->application));
g_object_unref (window->priv->application);
window->priv->application = NULL;
}
}
/**
* gtk_window_set_application:
* @window: a #GtkWindow
* @application: a #GtkApplication, or %NULL
*
* Sets or unsets the #GtkApplication associated with the window.
*
* The application will be kept alive for at least as long as the window
* is open.
*
* Since: 3.0
**/
void
gtk_window_set_application (GtkWindow *window,
GtkApplication *application)
{
g_return_if_fail (GTK_IS_WINDOW (window));
if (window->priv->application != application)
{
gtk_window_release_application (window);
window->priv->application = application;
if (window->priv->application != NULL)
{
g_application_hold (G_APPLICATION (window->priv->application));
g_object_ref (window->priv->application);
}
g_object_notify (G_OBJECT (window), "application");
}
}
/**
* gtk_window_set_type_hint:
* @window: a #GtkWindow
......@@ -4488,6 +4577,7 @@ gtk_window_finalize (GObject *object)
g_free (priv->wmclass_name);
g_free (priv->wmclass_class);
g_free (priv->wm_role);
gtk_window_release_application (window);
mnemonic_hash = gtk_window_get_mnemonic_hash (window, FALSE);
if (mnemonic_hash)
......
......@@ -32,6 +32,7 @@
#define __GTK_WINDOW_H__
#include <gtk/gtkapplication.h>
#include <gtk/gtkaccelgroup.h>
#include <gtk/gtkbin.h>
......@@ -345,6 +346,10 @@ GList * gtk_window_group_list_windows (GtkWindowGroup *window_grou
GtkWidget * gtk_window_group_get_current_device_grab (GtkWindowGroup *window_group,
GdkDevice *device);
GtkApplication *gtk_window_get_application (GtkWindow *window);
void gtk_window_set_application (GtkWindow *window,
GtkApplication *application);
/* Window grips
*/
......
#include <gtk/gtk.h>
static const char *builder_data =
"<interface>"
"<object class=\"GtkAboutDialog\" id=\"about_dialog\">"
" <property name=\"program-name\">Example Application</property>"
" <property name=\"website\">http://www.gtk.org</property>"
"</object>"
"<object class=\"GtkActionGroup\" id=\"actions\">"
" <child>"
" <object class=\"GtkAction\" id=\"About\">"
" <property name=\"name\">About</property>"
" <property name=\"stock_id\">gtk-about</property>"
" </object>"
" </child>"
"</object>"
"</interface>";
static GtkWidget *about_dialog;
static void
new_window (GtkApplication *app,
GFile *file)
{
GtkWidget *window, *scrolled, *view;
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_window_set_application (GTK_WINDOW (window), app);
gtk_window_set_title (GTK_WINDOW (window), "Bloatpad");
scrolled = gtk_scrolled_window_new (NULL, NULL);
view = gtk_text_view_new ();
gtk_container_add (GTK_CONTAINER (scrolled), view);
gtk_container_add (GTK_CONTAINER (window), scrolled);
if (file != NULL)
{
gchar *contents;
gsize length;
if (g_file_load_contents (file, NULL, &contents, &length, NULL, NULL))
{
GtkTextBuffer *buffer;
buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view));
gtk_text_buffer_set_text (buffer, contents, length);
g_free (contents);
}
}
gtk_widget_show_all (GTK_WIDGET (window));
}
static void
activate (GtkApplication *application)
{
new_window (application, NULL);
}
static void
about_activate (GtkAction *action,
gpointer user_data)
open (GtkApplication *application,
GFile **files,
gint n_files,
const gchar *hint,
gpointer user_data)
{
gtk_dialog_run (GTK_DIALOG (about_dialog));
gtk_widget_hide (GTK_WIDGET (about_dialog));
gint i;
for (i = 0; i < n_files; i++)
new_window (application, files[i]);
}
int
main (int argc, char **argv)
{
GtkApplication *app;
GtkWindow *window;
GtkBuilder *builder;
GtkAction *action;
GtkActionGroup *actions;
app = gtk_application_new ("org.gtk.Example", &argc, &argv);
builder = gtk_builder_new ();
if (!gtk_builder_add_from_string (builder, builder_data, -1, NULL))
g_error ("failed to parse UI");
actions = GTK_ACTION_GROUP (gtk_builder_get_object (builder, "actions"));
gtk_application_set_action_group (app, actions);
action = gtk_action_group_get_action (actions, "About");
g_signal_connect (action, "activate", G_CALLBACK (about_activate), app);
about_dialog = GTK_WIDGET (gtk_builder_get_object (builder, "about_dialog"));
gtk_builder_connect_signals (builder, app);
g_object_unref (builder);
window = gtk_application_get_window (app);
gtk_container_add (GTK_CONTAINER (window), gtk_label_new ("Hello world"));
gtk_widget_show_all (GTK_WIDGET (window));
int status;
gtk_application_run (app);
app = gtk_application_new ("org.gtk.Test.bloatpad",
G_APPLICATION_HANDLES_OPEN);
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;
}
......@@ -95,7 +95,7 @@ noinst_PROGRAMS = $(TEST_PROGS) \
testvolumebutton
if USE_X11
noinst_PROGRAMS += testapplication testerrors
noinst_PROGRAMS += testerrors
endif
if HAVE_CXX
......@@ -118,7 +118,6 @@ testheightforwidth_DEPENDENCIES = $(TEST_DEPS)
testicontheme_DEPENDENCIES = $(TEST_DEPS)
testiconview_DEPENDENCIES = $(TEST_DEPS)
testaccel_DEPENDENCIES = $(TEST_DEPS)
testapplication_DEPENDENCIES = $(TEST_DEPS)
testadjustsize_DEPENDENCIES = $(TEST_DEPS)
testassistant_DEPENDENCIES = $(TEST_DEPS)
testbbox_DEPENDENCIES = $(TEST_DEPS)
......@@ -185,7 +184,6 @@ simple_LDADD = $(LDADDS)
print_editor_LDADD = $(LDADDS)
testaccel_LDADD = $(LDADDS)
testadjustsize_LDADD = $(LDADDS)
testapplication_LDADD = $(LDADDS)
testassistant_LDADD = $(LDADDS)
testbbox_LDADD = $(LDADDS)
testbuttons_LDADD = $(LDADDS)
......
/* GTK - The GIMP Toolkit
* testapplication.c: Using GtkApplication
* Copyright (C) 2010, Red Hat, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#include "config.h"
#include <stdlib.h>
#include <gtk/gtk.h>
#include <gio/gdesktopappinfo.h>
static const char *builder_data =
"<interface>"
"<object class=\"GtkAboutDialog\" id=\"about_dialog\">"
" <property name=\"program-name\">Test Application</property>"
" <property name=\"website\">http://gtk.org</property>"
"</object>"
"<object class=\"GtkActionGroup\" id=\"actions\">"
" <child>"
" <object class=\"GtkAction\" id=\"About\">"
" <property name=\"name\">About</property>"
" <property name=\"stock_id\">gtk-about</property>"
" </object>"
" </child>"
"</object>"
"</interface>";
static GtkWidget *about_dialog;
static void
about_activate (GtkAction *action,
gpointer user_data)
{
gtk_dialog_run (GTK_DIALOG (about_dialog));
gtk_widget_hide (GTK_WIDGET (about_dialog));
}
static void
launch_myself (void)
{
GAppInfo *ai;
g_type_init ();
ai = (GAppInfo*)g_desktop_app_info_new_from_filename ("./testapplication.desktop");
g_app_info_launch (ai, NULL, NULL, NULL);
}
int
main (int argc, char **argv)
{
GtkApplication *app;
GtkWindow *window;
GtkWidget *window2;
GtkBuilder *builder;
GtkAction *action;
GtkActionGroup *actions;
if (argc > 1 && g_strcmp0 (argv[1], "--launch-yourself") == 0)
{
launch_myself ();
exit (0);
}
app = gtk_application_new ("org.gtk.TestApp", &argc, &argv);
builder = gtk_builder_new ();
if (!gtk_builder_add_from_string (builder, builder_data, -1, NULL))
g_error ("failed to parse UI");
actions = GTK_ACTION_GROUP (gtk_builder_get_object (builder, "actions"));
gtk_application_set_action_group (app, actions);
action = gtk_action_group_get_action (actions, "About");
g_signal_connect (action, "activate", G_CALLBACK (about_activate), app);
about_dialog = GTK_WIDGET (gtk_builder_get_object (builder, "about_dialog"));
gtk_builder_connect_signals (builder, app);
g_object_unref (builder);
window = gtk_application_get_window (app);
gtk_container_add (GTK_CONTAINER (window), gtk_label_new ("Hello world"));
gtk_widget_show_all (GTK_WIDGET (window));
window2 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_container_add (GTK_CONTAINER (window2), gtk_label_new ("Hello again"));
gtk_widget_show_all (window2);
gtk_application_add_window (app, GTK_WINDOW (window2));
gtk_application_run (app);
return 0;
}
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