Frequencies Piecharts (gui): Emit 'NOMISSING' when appropriate.
[pspp] / src / ui / gui / help-menu.c
index c3a4bac22eb00cebfa62c8239a2e406e83c60f6d..30bbc7522bf73716f197d510bfda7e66fd1612ae 100644 (file)
 /* Try to open html documentation uri via the default
    browser on the operating system */
 #ifdef __APPLE__
-#define HTMLOPENARGV {"open", 0, 0, 0, 0}
-#define HTMLOPENARGIDX 1
+#define HTMLOPENARGV {"open", 0, 0}
 #elif  _WIN32
-#define HTMLOPENARGV {"cmd","/C", "start", 0, 0}
-#define HTMLOPENARGIDX 3
+#define HTMLOPENARGV {"wscript", 0, 0}
 #else
-#define HTMLOPENARGV {"xdg-open", 0, 0, 0, 0}
-#define HTMLOPENARGIDX 1
+#define HTMLOPENARGV {"xdg-open", 0, 0}
 #endif
 
 static const gchar *artists[] = { "Bastián Díaz", "Hugo Alejandro", NULL};
@@ -75,7 +72,7 @@ about_new (GtkMenuItem *mmm, GtkWindow *parent)
   gtk_about_dialog_set_copyright (GTK_ABOUT_DIALOG (about),
                                  "Free Software Foundation");
 
-  gtk_about_dialog_set_translator_credits 
+  gtk_about_dialog_set_translator_credits
     (
      GTK_ABOUT_DIALOG (about),
      /* TRANSLATORS: Do not translate this string.  Instead, put the names of the people
@@ -92,6 +89,41 @@ about_new (GtkMenuItem *mmm, GtkWindow *parent)
   gtk_widget_hide (about);
 }
 
+
+/* Opening the htmluri in windows via cmd /start uri opens
+   the windows command shell for a moment. The alternative is
+   to start a script via wscript. This will not be visible*/
+#ifdef _WIN32
+static gboolean open_windows_help (const gchar *helpuri,
+                                   GError **err)
+{
+  gchar *vbsfilename = NULL;
+  gchar *vbs = NULL;
+  gboolean result;
+  vbsfilename = g_build_filename (g_get_tmp_dir (),
+                                  "pspp-help-open.vbs",
+                                  NULL);
+  vbs = g_strdup_printf("CreateObject(\"WScript.Shell\").Run \"%s\"",
+                        helpuri);
+  result = g_file_set_contents (vbsfilename,
+                                vbs,
+                                strlen(vbs),
+                                err);
+  g_free (vbs);
+  if (!result)
+    goto error;
+
+  gchar *argv[] = {"wscript",vbsfilename,0};
+
+  result = g_spawn_async (NULL, argv,
+                          NULL, G_SPAWN_SEARCH_PATH,
+                          NULL, NULL, NULL, err);
+ error:
+  g_free (vbsfilename);
+  return result;
+}
+#endif
+
 /* Open the manual at PAGE with the following priorities
    First: local yelp help system
    Second: browser with local html doc dir in path pspp.html/<helppage>.html
@@ -102,9 +134,10 @@ online_help (const char *page)
   GError *err = NULL;
   GError *htmlerr = NULL;
   gchar *argv[3] = { "yelp", 0, 0};
-  gchar *htmlargv[5] = HTMLOPENARGV;
+  gchar *htmlargv[3] = HTMLOPENARGV;
   gchar *htmlfilename = NULL;
   gchar *htmlfullname = NULL;
+  gchar *htmluri = NULL;
 
   if (page == NULL)
     {
@@ -115,7 +148,7 @@ online_help (const char *page)
     {
       gchar **tokens = NULL;
       const int maxtokens = 5;
-      int idx = 0;
+      int idx ;
       argv[1] = g_strdup_printf ("file://%s#%s",
                                  relocate (DOCDIR "/pspp.xml"), page);
       /* The page will be translated to the htmlfilename
@@ -124,7 +157,8 @@ online_help (const char *page)
          QUICK-CLUSTER          QUICK-CLUSTER.html
          which is valid for the multiple page html doc*/
       tokens = g_strsplit (page, "#", maxtokens);
-      for(;tokens[idx] && idx < maxtokens;idx++);
+      for (idx = 0; idx < maxtokens && tokens[idx]; idx++)
+       ;
       htmlfilename = g_strdup_printf ("%s.html", tokens[idx-1]);
       g_strfreev (tokens);
     }
@@ -134,28 +168,36 @@ online_help (const char *page)
   if (g_file_test (relocate (DOCDIR "/pspp.html"), G_FILE_TEST_IS_DIR))
     {
       GError *urierr = NULL;
-      gchar *uriname =  g_filename_to_uri (htmlfullname,NULL, &urierr);
-      if (uriname)
-        htmlargv[HTMLOPENARGIDX] = uriname;
-      else
+      htmluri =  g_filename_to_uri (htmlfullname,NULL, &urierr);
+      if (!htmluri)
         {
           msg (ME, _("Help path conversion error: %s"), urierr->message);
-          htmlargv[HTMLOPENARGIDX] = htmlfullname;
+          htmluri = htmlfullname;
         }
       g_clear_error (&urierr);
     }
   else
-    htmlargv[HTMLOPENARGIDX] = g_strdup_printf (PACKAGE_URL "manual/html_node/%s",
-                                                htmlfilename);
+    htmluri = g_strdup_printf (PACKAGE_URL "manual/html_node/%s",
+                               htmlfilename);
   g_free (htmlfullname);
   g_free (htmlfilename);
+  htmlargv[1] = htmluri;
+
+  /* The following **SHOULD** work but it does not on 28.5.2016
+     g_app_info_launch_default_for_uri (htmluri, NULL, &err);
+     osx: wine is started to launch the uri...
+     windows: not so bad, but the first access does not work*/
 
   if (! (g_spawn_async (NULL, argv,
                         NULL, G_SPAWN_SEARCH_PATH,
                         NULL, NULL,   NULL,   &err) ||
+#ifdef _WIN32
+         open_windows_help (htmluri, &htmlerr))
+#else
          g_spawn_async (NULL, htmlargv,
                         NULL, G_SPAWN_SEARCH_PATH,
                         NULL, NULL,   NULL,   &htmlerr))
+#endif
       )
     {
       msg (ME, _("Cannot open reference manual via yelp: %s. "
@@ -164,12 +206,12 @@ online_help (const char *page)
                  "The PSSP manual is also available at %s"),
                   err->message,
                   htmlerr->message,
-                  htmlargv[HTMLOPENARGIDX],
+                  htmluri,
                   PACKAGE_URL "documentation.html");
     }
 
   g_free (argv[1]);
-  g_free (htmlargv[HTMLOPENARGIDX]);
+  g_free (htmluri);
   g_clear_error (&err);
   g_clear_error (&htmlerr);
 }
@@ -190,7 +232,7 @@ create_help_menu (GtkWindow *toplevel)
   GtkWidget *help_ref = gtk_menu_item_new_with_mnemonic (_("_Reference Manual"));
 
   GtkAccelGroup *accel_group = gtk_accel_group_new ();
-  
+
   gtk_window_add_accel_group (toplevel, accel_group);
 
   gtk_widget_add_accelerator (help_ref,
@@ -203,10 +245,10 @@ create_help_menu (GtkWindow *toplevel)
 
   g_signal_connect (help_about, "activate", G_CALLBACK (about_new), toplevel);
   g_signal_connect (help_ref, "activate", G_CALLBACK (reference_manual), NULL);
-  
+
   g_object_set (menuitem, "submenu", menu, NULL);
 
   gtk_widget_show_all (menuitem);
-  
+
   return menuitem;
 }