static gboolean download_handle(WebKitDownload *, gchar *, gpointer);
static void download_handle_start(WebKitWebView *, WebKitDownload *, gpointer);
static void downloadmanager_cancel(GtkToolButton *, gpointer data);
+static gboolean downloadmanager_delete(GtkWidget *, gpointer);
static void downloadmanager_setup(void);
static gchar *ensure_uri_scheme(const gchar *);
static void external_handler_run(GtkAction *, gpointer);
static gboolean keywords_try_search(WebKitWebView *, const gchar *);
static gboolean menu_web_view(WebKitWebView *, WebKitContextMenu *, GdkEvent *,
WebKitHitTestResult *, gpointer);
+static gboolean quit_if_nothing_active(void);
static gboolean remote_msg(GIOChannel *, GIOCondition, gpointer);
static void search(gpointer, gint);
static void show_web_view(WebKitWebView *, gpointer);
static const gchar *accepted_language[2] = { NULL, NULL };
-static gint clients = 0;
+static gint clients = 0, downloads = 0;
static gboolean cooperative_alone = TRUE;
static gboolean cooperative_instances = TRUE;
static int cooperative_pipe_fp = 0;
free(c);
clients--;
- if (clients == 0)
- gtk_main_quit();
+ quit_if_nothing_active();
}
gboolean
return TRUE;
}
+void
+download_handle_finished(WebKitDownload *download, gpointer data)
+{
+ downloads--;
+}
+
void
download_handle_start(WebKitWebView *web_view, WebKitDownload *download,
gpointer data)
g_signal_connect(G_OBJECT(download), "notify::estimated-progress",
G_CALLBACK(changed_download_progress), tb);
+ downloads++;
+ g_signal_connect(G_OBJECT(download), "finished",
+ G_CALLBACK(download_handle_finished), NULL);
+
g_object_ref(download);
g_signal_connect(G_OBJECT(tb), "clicked",
G_CALLBACK(downloadmanager_cancel), download);
gtk_widget_destroy(GTK_WIDGET(tb));
}
+gboolean
+downloadmanager_delete(GtkWidget *obj, gpointer data)
+{
+ if (!quit_if_nothing_active())
+ gtk_widget_hide(dm.win);
+
+ return TRUE;
+}
+
void
downloadmanager_setup(void)
{
gtk_window_set_default_size(GTK_WINDOW(dm.win), 500, 250);
gtk_window_set_title(GTK_WINDOW(dm.win), __NAME__" - Download Manager");
g_signal_connect(G_OBJECT(dm.win), "delete-event",
- G_CALLBACK(gtk_widget_hide_on_delete), NULL);
+ G_CALLBACK(downloadmanager_delete), NULL);
g_signal_connect(G_OBJECT(dm.win), "key-press-event",
G_CALLBACK(key_downloadmanager), NULL);
switch (((GdkEventKey *)event)->keyval)
{
case GDK_KEY_d: /* close window (left hand) */
- gtk_widget_hide(dm.win);
+ case GDK_KEY_q:
+ downloadmanager_delete(dm.win, NULL);
return TRUE;
}
}
return FALSE;
}
+gboolean
+quit_if_nothing_active(void)
+{
+ if (clients == 0)
+ {
+ if (downloads == 0)
+ {
+ gtk_main_quit();
+ return TRUE;
+ }
+ else
+ gtk_widget_show_all(dm.win);
+ }
+
+ return FALSE;
+}
+
gboolean
remote_msg(GIOChannel *channel, GIOCondition condition, gpointer data)
{
Launch the external handler for the currently loaded URI.
.TP
\fBMod1\fP + \fBq\fP
-Close the current window.
+Close the current window. Quits the entire program if this was the last
+window and if there are no more active downloads (download manager is
+shown otherwise).
.TP
\fBMod1\fP + \fBw\fP
Go to your \(lqhomepage\(rq. See the environment variable
.SS "Download manager"
.TP
\fBMod1\fP + \fBd\fP
-Close the download manager (downloads are not aborted).
+.TQ
+\fBMod1\fP + \fBq\fP
+Close the download manager. Active downloads are never aborted. However,
+if there are no more active downloads and no more browsing windows, then
+the entire program will quit.
.\" --------------------------------------------------------------------
.SH "KEYWORD BASED SEARCHING"
In this file, you can configure keywords and the associated URIs: