summaryrefslogtreecommitdiff
path: root/src/yelp-application.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/yelp-application.c')
-rw-r--r--src/yelp-application.c89
1 files changed, 53 insertions, 36 deletions
diff --git a/src/yelp-application.c b/src/yelp-application.c
index 46ccd720..d12f7300 100644
--- a/src/yelp-application.c
+++ b/src/yelp-application.c
@@ -28,9 +28,11 @@
#include <dbus/dbus-glib.h>
#include <gtk/gtk.h>
+#include "yelp-view.h"
+
#include "yelp-application.h"
#include "yelp-dbus.h"
-#include "yelp-view.h"
+#include "yelp-window.h"
typedef struct _YelpApplicationLoad YelpApplicationLoad;
struct _YelpApplicationLoad {
@@ -43,9 +45,12 @@ static void yelp_application_class_init (YelpApplicationClass *k
static void yelp_application_dispose (GObject *object);
static void yelp_application_finalize (GObject *object);
-static GtkWidget * application_new_window (YelpApplication *app);
static void application_uri_resolved (YelpUri *uri,
YelpApplicationLoad *data);
+static gboolean application_window_deleted (YelpWindow *window,
+ GdkEvent *event,
+ YelpApplication *app);
+static gboolean application_maybe_quit (YelpApplication *app);
G_DEFINE_TYPE (YelpApplication, yelp_application, G_TYPE_OBJECT);
#define GET_PRIV(object)(G_TYPE_INSTANCE_GET_PRIVATE ((object), YELP_TYPE_APPLICATION, YelpApplicationPrivate))
@@ -89,9 +94,10 @@ yelp_application_dispose (GObject *object)
{
YelpApplicationPrivate *priv = GET_PRIV (object);
- g_object_unref (priv->connection);
-
- g_hash_table_destroy (priv->windows_by_document);
+ if (priv->connection) {
+ g_object_unref (priv->connection);
+ priv->connection = NULL;
+ }
G_OBJECT_CLASS (yelp_application_parent_class)->dispose (object);
}
@@ -99,6 +105,10 @@ yelp_application_dispose (GObject *object)
static void
yelp_application_finalize (GObject *object)
{
+ YelpApplicationPrivate *priv = GET_PRIV (object);
+
+ g_hash_table_destroy (priv->windows_by_document);
+
G_OBJECT_CLASS (yelp_application_parent_class)->finalize (object);
}
@@ -214,37 +224,11 @@ yelp_application_load_uri (YelpApplication *app,
return TRUE;
}
-static GtkWidget *
-application_new_window (YelpApplication *app)
-{
- GtkWidget *window, *scroll, *view;
- YelpApplicationPrivate *priv = GET_PRIV (app);
-
- window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
- gtk_window_set_type_hint (GTK_WINDOW (window), GDK_WINDOW_TYPE_HINT_UTILITY);
- gtk_window_set_default_size (GTK_WINDOW (window), 520, 580);
- priv->windows = g_slist_prepend (priv->windows, window);
-
- scroll = gtk_scrolled_window_new (NULL, NULL);
- gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroll),
- GTK_POLICY_AUTOMATIC,
- GTK_POLICY_AUTOMATIC);
- gtk_container_add (GTK_CONTAINER (window), scroll);
-
- view = yelp_view_new ();
- gtk_container_add (GTK_CONTAINER (scroll), view);
-
- g_object_set_data (G_OBJECT (window), "view", view);
-
- return window;
-}
-
static void
application_uri_resolved (YelpUri *uri,
YelpApplicationLoad *data)
{
- GtkWidget *window;
- YelpView *view;
+ YelpWindow *window;
gchar *doc_uri;
YelpApplicationPrivate *priv = GET_PRIV (data->app);
@@ -253,18 +237,51 @@ application_uri_resolved (YelpUri *uri,
window = g_hash_table_lookup (priv->windows_by_document, doc_uri);
if (window == NULL) {
- window = application_new_window (data->app);
+ window = yelp_window_new (data->app);
+ priv->windows = g_slist_prepend (priv->windows, window);
g_hash_table_insert (priv->windows_by_document, doc_uri, window);
+ g_object_set_data (G_OBJECT (window), "doc_uri", doc_uri);
+ g_signal_connect (window, "delete-event",
+ G_CALLBACK (application_window_deleted), data->app);
}
else {
g_free (doc_uri);
}
- view = g_object_get_data (G_OBJECT (window), "view");
- yelp_view_load_uri (YELP_VIEW (view), uri);
+ yelp_window_load_uri (window, uri);
- gtk_widget_show_all (window);
+ gtk_widget_show_all (GTK_WIDGET (window));
gtk_window_present_with_time (GTK_WINDOW (window), data->timestamp);
g_free (data);
}
+
+static gboolean
+application_window_deleted (YelpWindow *window,
+ GdkEvent *event,
+ YelpApplication *app)
+{
+ gchar *doc_uri; /* owned by windows_by_document */
+ YelpApplicationPrivate *priv = GET_PRIV (app);
+
+ priv->windows = g_slist_remove (priv->windows, window);
+ doc_uri = g_object_get_data (G_OBJECT (window), "doc_uri");
+ if (doc_uri)
+ g_hash_table_remove (priv->windows_by_document, doc_uri);
+
+ if (priv->windows == NULL)
+ g_timeout_add_seconds (5, (GSourceFunc) application_maybe_quit, app);
+
+ return FALSE;
+}
+
+static gboolean
+application_maybe_quit (YelpApplication *app)
+{
+ YelpApplicationPrivate *priv = GET_PRIV (app);
+
+ if (priv->windows == NULL)
+ gtk_main_quit ();
+
+ return FALSE;
+}