Trim trailing white spaces.
[geeqie.git] / src / window.c
index f4dbd9c..863c75d 100644 (file)
@@ -1,9 +1,9 @@
 /*
  * Geeqie
- * Copyright (C) 2008 The Geeqie Team
+ * Copyright (C) 2008 - 2012 The Geeqie Team
  *
  * Authors: Vladimir Nadvornik / Laurent Monin
- * 
+ *
  * This software is released under the GNU General Public License (GNU GPL).
  * Please read the included file COPYING for more information.
  * This software comes with no warranty of any kind, use at your own risk!
 #include "main.h"
 #include "window.h"
 
+#include "misc.h"
 #include "pixbuf_util.h"
 #include "ui_fileops.h"
 #include "ui_help.h"
 
-GtkWidget *window_new(GtkWindowType type, const gchar *name, const gchar *icon,
+GtkWidget *window_new(GtkWindowType type, const gchar *role, const gchar *icon,
                      const gchar *icon_file, const gchar *subtitle)
 {
        gchar *title;
@@ -38,8 +39,7 @@ GtkWidget *window_new(GtkWindowType type, const gchar *name, const gchar *icon,
        g_free(title);
 
        window_set_icon(window, icon, icon_file);
-       gtk_window_set_role(GTK_WINDOW(window), name);
-       gtk_window_set_wmclass(GTK_WINDOW(window), name, GQ_WMCLASS);
+       gtk_window_set_role(GTK_WINDOW(window), role);
 
        return window;
 }
@@ -65,19 +65,19 @@ void window_set_icon(GtkWidget *window, const gchar *icon, const gchar *file)
                }
 }
 
-gint window_maximized(GtkWidget *window)
+gboolean window_maximized(GtkWidget *window)
 {
        GdkWindowState state;
 
-       if (!window || !window->window) return FALSE;
+       if (!window || !gtk_widget_get_window(window)) return FALSE;
 
-       state = gdk_window_get_state(window->window);
-       return (state & GDK_WINDOW_STATE_MAXIMIZED);
+       state = gdk_window_get_state(gtk_widget_get_window(window));
+       return !!(state & GDK_WINDOW_STATE_MAXIMIZED);
 }
 
 /*
  *-----------------------------------------------------------------------------
- * Open  browser with the help Documentation
+ * Open browser with the help Documentation
  *-----------------------------------------------------------------------------
  */
 
@@ -85,23 +85,23 @@ static gchar *command_result(const gchar *binary, const gchar *command)
 {
        gchar *result = NULL;
        FILE *f;
-       char buf[2048];
-       int l;
+       gchar buf[2048];
+       gint l;
 
-       if (!binary) return NULL;
+       if (!binary || binary[0] == '\0') return NULL;
        if (!file_in_path(binary)) return NULL;
 
-       if (!command) return g_strdup(binary);
+       if (!command || command[0] == '\0') return g_strdup(binary);
        if (command[0] == '!') return g_strdup(command + 1);
 
        f = popen(command, "r");
        if (!f) return NULL;
 
-       while ((l = fread(buf, sizeof(char), sizeof(buf), f)) > 0)
+       while ((l = fread(buf, sizeof(gchar), sizeof(buf), f)) > 0)
                {
                if (!result)
                        {
-                       int n = 0;
+                       gint n = 0;
 
                        while (n < l && buf[n] != '\n' && buf[n] != '\r') n++;
                        if (n > 0) result = g_strndup(buf, n);
@@ -113,14 +113,15 @@ static gchar *command_result(const gchar *binary, const gchar *command)
        return result;
 }
 
-static void help_browser_command(const gchar *command, const gchar *path)
+static int help_browser_command(const gchar *command, const gchar *path)
 {
        gchar *result;
        gchar *buf;
        gchar *begin;
        gchar *end;
+       int retval = -1;
 
-       if (!command || !path) return;
+       if (!command || !path) return retval;
 
        DEBUG_1("Help command pre \"%s\", \"%s\"", command, path);
 
@@ -142,9 +143,11 @@ static void help_browser_command(const gchar *command, const gchar *path)
 
        DEBUG_1("Help command post [%s]", result);
 
-       system(result);
+       retval = runcmd(result);
+       DEBUG_1("Help command exit code: %d", retval);
 
        g_free(result);
+       return retval;
 }
 
 /*
@@ -157,8 +160,12 @@ static void help_browser_command(const gchar *command, const gchar *path)
 */
 static gchar *html_browsers[] =
 {
+       /* Our specific script */
+       GQ_APPNAME_LC "_html_browser", NULL,
        /* Redhat has a nifty htmlview script to start the user's preferred browser */
        "htmlview",     NULL,
+       /* Debian has even better approach with alternatives */
+       "sensible-browser", NULL,
        /* GNOME 2 */
        "gconftool-2",  "gconftool-2 -g /desktop/gnome/url-handlers/http/command",
        /* KDE */
@@ -168,29 +175,46 @@ static gchar *html_browsers[] =
        "mozilla",      NULL,
        "konqueror",    NULL,
        "netscape",     NULL,
+       "opera",        "!opera --remote 'openURL(%s,new-page)'",
        NULL,           NULL
 };
 
 static void help_browser_run(void)
 {
+       gchar *name = options->helpers.html_browser.command_name;
+       gchar *cmd = options->helpers.html_browser.command_line;
+       gchar *path = g_build_filename(GQ_HTMLDIR, "index.html", NULL);
        gchar *result = NULL;
        gint i;
 
        i = 0;
-       while (!result && html_browsers[i])
+       while (!result)
                {
-               result = command_result(html_browsers[i], html_browsers[i+1]);
-               i += 2;
+               if ((name && *name) || (cmd && *cmd)) {
+                       DEBUG_1("Trying browser: name=%s command=%s", name, cmd);
+                       result = command_result(name, cmd);
+                       DEBUG_1("Result: %s", result);
+                       if (result)
+                               {
+                               int ret = help_browser_command(result, path);
+                               
+                               if (ret == 0) break;
+                               g_free(result);
+                               result = NULL;
+                       }
+               }
+               if (!html_browsers[i]) break;
+               name = html_browsers[i++];
+               cmd = html_browsers[i++];
                }
 
        if (!result)
                {
-               printf("Unable to detect an installed browser.\n");
+               log_printf("Unable to detect an installed browser.\n");
                return;
                }
 
-       help_browser_command(result, GQ_HTMLDIR "/index.html");
-
+       g_free(path);
        g_free(result);
 }
 
@@ -209,6 +233,8 @@ static void help_window_destroy_cb(GtkWidget *window, gpointer data)
 
 void help_window_show(const gchar *key)
 {
+       gchar *path;
+
        if (key && strcmp(key, "html_contents") == 0)
                {
                help_browser_run();
@@ -222,10 +248,12 @@ void help_window_show(const gchar *key)
                return;
                }
 
-       help_window = help_window_new(_("Help"), GQ_WMCLASS, "help",
-                                     GQ_HELPDIR "/README", key);
+       path = g_build_filename(GQ_HELPDIR, "README", NULL);
+       help_window = help_window_new(_("Help"), "help", path, key);
+       g_free(path);
 
        g_signal_connect(G_OBJECT(help_window), "destroy",
                         G_CALLBACK(help_window_destroy_cb), NULL);
 }
 
+/* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */