[Pkg-opt-media-team] [dvdisaster] 53/61: Resurrect old code to support opening URLs in a browser.

Takaki Taniguchi takaki at moszumanska.debian.org
Thu Feb 2 13:48:46 UTC 2017


This is an automated email from the git hooks/post-receive script.

takaki pushed a commit to branch master
in repository dvdisaster.

commit 2f2a3918ee2d0a989b6099ec9ee484cdf3b7f04b
Author: Carlos Maddela <e7appew at gmail.com>
Date:   Thu Jan 5 19:13:13 2017 +1100

    Resurrect old code to support opening URLs in a browser.
---
 .../27-allow-opening-in-browser-again.patch        | 486 +++++++++++++++++++++
 debian/patches/series                              |   1 +
 2 files changed, 487 insertions(+)

diff --git a/debian/patches/27-allow-opening-in-browser-again.patch b/debian/patches/27-allow-opening-in-browser-again.patch
new file mode 100644
index 0000000..cc9b782
--- /dev/null
+++ b/debian/patches/27-allow-opening-in-browser-again.patch
@@ -0,0 +1,486 @@
+From: Carlos Maddela <e7appew at gmail.com>
+Date: Thu, 5 Jan 2017 19:11:38 +1100
+Subject: Resurrect old code to support opening URLs in a browser.
+
+Description: Resurrect old code to support opening URLs in a browser.
+Author: Carlos Maddela <e7appew at gmail.com>
+Origin: vendor
+Forwarded: not-needed
+Last-Update: 2016-12-21
+---
+This patch header follows DEP-3: http://dep.debian.net/deps/dep3/
+---
+ closure.c      |   2 +
+ dvdisaster.h   |   7 +
+ help-dialogs.c |   3 +-
+ show-html.c    | 402 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 4 files changed, 413 insertions(+), 1 deletion(-)
+ create mode 100644 show-html.c
+
+diff --git a/closure.c b/closure.c
+index 0e2f889..632c103 100644
+--- a/closure.c
++++ b/closure.c
+@@ -467,6 +467,7 @@ void InitClosure()
+    Closure->deviceNames = g_ptr_array_new();
+    Closure->deviceNodes = g_ptr_array_new();
+    Closure->viewer      = g_strdup("xdg-open");
++   Closure->browser      = g_strdup("xdg-open");
+    Closure->methodList  = g_ptr_array_new();
+    Closure->methodName  = g_strdup("RS01");
+    Closure->dDumpDir    = g_strdup(Closure->homeDir);
+@@ -598,6 +599,7 @@ void FreeClosure()
+    cond_free(Closure->binDir);
+    cond_free(Closure->docDir);
+    cond_free(Closure->viewer);
++   cond_free(Closure->browser);
+    cond_free(Closure->errorTitle);
+    cond_free(Closure->simulateCD);
+    cond_free(Closure->dDumpDir);
+diff --git a/dvdisaster.h b/dvdisaster.h
+index db2031e..22eab5a 100644
+--- a/dvdisaster.h
++++ b/dvdisaster.h
+@@ -213,6 +213,7 @@ typedef struct _GlobalClosure
+    char *binDir;        /* place where the binary resides */
+    char *docDir;        /* place where our documentation resides */
+    char *viewer;        /* Name of preferred PDF viewer */
++   char *browser;       /* Name of preferred browser */
+ 
+    GMutex progressLock; /* A mutex protected the stuff below */
+    char bs[256];        /* A string of 255 backspace characters */
+@@ -1299,6 +1300,12 @@ int ProbeAltiVec(void);
+ void ShowPDF(char*);
+ 
+ /***
++ *** show-html.c
++ ***/
++
++void ShowHTML(char*);
++
++/***
+  *** smart-lec.c
+  ***/
+ 
+diff --git a/help-dialogs.c b/help-dialogs.c
+index 5065e76..3874463 100644
+--- a/help-dialogs.c
++++ b/help-dialogs.c
+@@ -599,7 +599,8 @@ static gint about_cb(GtkWidget *widget, GdkEvent *event, gpointer data)
+    {  case GDK_BUTTON_PRESS: 
+         if(!inside) return FALSE; /* Defect in certain Gtk versions? */
+         if(!strcmp(label,"GPL")) ShowGPL(); 
+-        else if(!strcmp(label,"MODIFYING")) show_modifying(); 
++        else if(!strcmp(label,"MODIFYING")) show_modifying();
++        else if(strlen(label) > 4 && !strncmp(label, "http", 4)) ShowHTML(g_strdup(label));
+         else ShowPDF(g_strdup(label));
+ 	break; 
+       case GDK_ENTER_NOTIFY: 
+diff --git a/show-html.c b/show-html.c
+new file mode 100644
+index 0000000..608e8ec
+--- /dev/null
++++ b/show-html.c
+@@ -0,0 +1,402 @@
++/*  dvdisaster: Additional error correction for optical media.
++ *  Copyright (C) 2004-2012 Carsten Gnoerlich.
++ *  Project home page: http://www.dvdisaster.com
++ *  Email: carsten at dvdisaster.com  -or-  cgnoerlich at fsfe.org
++ *
++ *  This program is free software; you can redistribute it and/or modify
++ *  it under the terms of the GNU General Public License as published by
++ *  the Free Software Foundation; either version 2 of the License, or
++ *  (at your option) any later version.
++ *
++ *  This program 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 General Public License for more details.
++ *
++ *  You should have received a copy of the GNU General Public License
++ *  along with this program; if not, write to the Free Software
++ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA,
++ *  or direct your browser at http://www.gnu.org.
++ */
++
++#include "dvdisaster.h"
++
++#if defined(SYS_LINUX) || defined(SYS_FREEBSD) || defined(SYS_NETBSD)
++#include <sys/wait.h>
++#endif
++
++#ifdef SYS_MINGW
++#include "windows.h"
++#include "shellapi.h"
++#endif
++
++/***
++ *** Ask user to specify his browser
++ ***/
++
++#if defined(SYS_LINUX) || defined(SYS_FREEBSD) || defined(SYS_NETBSD)
++
++#define SEARCH_BUTTON 1
++
++typedef struct
++{  GtkWidget *dialog;
++   GtkWidget *entry;
++   GtkWidget *search;
++   GtkWidget *filesel;
++   GtkWidget *fileok;
++   GtkWidget *filecancel;
++   char *url;
++} browser_dialog_info;
++
++static void response_cb(GtkWidget *widget, int response, gpointer data)
++{  browser_dialog_info *bdi = (browser_dialog_info*)data; 
++
++   switch(response)
++   {  case GTK_RESPONSE_ACCEPT:
++	if(Closure->browser) g_free(Closure->browser);
++	Closure->browser = g_strdup(gtk_entry_get_text(GTK_ENTRY(bdi->entry)));
++	ShowHTML(bdi->url);
++	break;
++
++      case GTK_RESPONSE_REJECT:
++	if(bdi->url) g_free(bdi->url);
++        break;
++   }
++   gtk_widget_destroy(widget);
++   if(bdi->filesel)
++     gtk_widget_destroy(bdi->filesel);
++   g_free(bdi);
++}
++
++static void search_cb(GtkWidget *widget, gpointer data)
++{  browser_dialog_info *bdi = (browser_dialog_info*)data; 
++
++   if(widget == bdi->search) 
++   {  bdi->filesel = gtk_file_selection_new(_utf("windowtitle|Choose a browser"));
++      bdi->fileok = GTK_FILE_SELECTION(bdi->filesel)->ok_button;
++      bdi->filecancel = GTK_FILE_SELECTION(bdi->filesel)->cancel_button;
++      ReverseCancelOK(GTK_DIALOG(bdi->filesel));
++      gtk_file_selection_hide_fileop_buttons(GTK_FILE_SELECTION(bdi->filesel));
++      g_signal_connect(G_OBJECT(GTK_FILE_SELECTION(bdi->filesel)->ok_button), "clicked", 
++		       G_CALLBACK(search_cb), bdi);
++    
++      g_signal_connect(G_OBJECT(GTK_FILE_SELECTION(bdi->filesel)->cancel_button), "clicked", 
++		       G_CALLBACK(search_cb), bdi);
++      
++      gtk_widget_show(bdi->filesel);
++   }
++
++   if(widget == bdi->fileok)
++   {
++      if(Closure->browser) g_free(Closure->browser);
++      Closure->browser = g_strdup(gtk_file_selection_get_filename(GTK_FILE_SELECTION(bdi->filesel)));
++      ShowHTML(bdi->url);
++      gtk_widget_destroy(bdi->filesel);
++      gtk_widget_destroy(bdi->dialog);
++      g_free(bdi);
++      return;
++   }
++
++   if(widget == bdi->filecancel)
++   {  gtk_widget_destroy(bdi->filesel);
++      bdi->filesel = NULL;
++   }
++}
++
++static void browser_dialog(char *url)
++{  GtkWidget *dialog, *vbox, *hbox, *label, *entry, *button;
++   browser_dialog_info *bdi = g_malloc0(sizeof(browser_dialog_info));
++
++   /* Create the dialog */
++
++   dialog = gtk_dialog_new_with_buttons(_utf("windowtitle|Browser required"), 
++				       Closure->window, GTK_DIALOG_DESTROY_WITH_PARENT,
++				       GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, 
++				       GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT, NULL);
++   bdi->dialog = dialog;
++   if(url)
++   {  bdi->url = g_strdup(url);
++   }
++
++   vbox = gtk_vbox_new(FALSE, 0);
++   gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), vbox, FALSE, FALSE, 0);
++   gtk_container_set_border_width(GTK_CONTAINER(vbox), 10);
++
++   /* Insert the contents */
++
++   label = gtk_label_new(NULL);
++   gtk_label_set_markup(GTK_LABEL(label), _utf("<b>Could not find a suitable browser.</b>\n\n"
++                                               "Which browser would you like to use\n"
++                                               "for reading the online documentation?\n\n"
++			                       "Please enter its name (e.g. mozilla) or\n"
++			                       "use the \"Search\" button for a file dialog.\n")),
++			      gtk_box_pack_start(GTK_BOX(vbox), label, TRUE, TRUE, 10);
++
++   hbox = gtk_hbox_new(FALSE, 0);
++   gtk_box_pack_start(GTK_BOX(vbox), hbox, TRUE, TRUE, 10);
++
++   bdi->entry = entry = gtk_entry_new();
++   gtk_box_pack_start(GTK_BOX(hbox), entry, FALSE, FALSE, 10);
++
++   bdi->search = button = gtk_button_new_with_label(_utf("Search"));
++   g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(search_cb), bdi);
++   gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 10);
++
++   /* Show it */
++
++   g_signal_connect(dialog, "response", G_CALLBACK(response_cb), bdi);
++
++   gtk_widget_show_all(dialog);
++}
++#endif /* SYS_ unix-like */
++
++/***
++ *** Show the manual in an external browser
++ ***/
++
++/*
++ * Check the child processes exit status
++ * to find whether the browser could be invoked.
++ */
++
++typedef struct
++{  pid_t pid;
++   char *url;
++   GtkWidget *msg;
++   int seconds;
++} browser_info;
++
++
++static void msg_destroy_cb(GtkWidget *widget, gpointer data)
++{  browser_info *bi = (browser_info*)data;
++
++   bi->msg = NULL; 
++}
++
++#if defined(SYS_LINUX) || defined(SYS_FREEBSD) ||  defined(SYS_NETBSD)
++
++/* 
++ * The following list of browsers and html wrappers
++ * will be tried one at a time until one entry succeeds by:
++ * - returning zero
++ * - not returning within 60 seconds
++ */
++
++static int browser_index;
++static void try_browser(browser_info*);
++
++static char *browsers[] = 
++{  "user-selection",
++   "xdg-open",
++   "gnome-open",
++   "htmlview",
++   "firefox",
++   "mozilla",
++   "konqueror",
++   "epiphany",
++   "opera",
++   "/Applications/Safari.app/Contents/MacOS/Safari",  /* better way to do this? */
++   NULL
++};
++
++static gboolean browser_timeout_func(gpointer data)
++{  browser_info *bi = (browser_info*)data;
++   int status;
++
++   waitpid(bi->pid, &status, WNOHANG);
++
++   /* At least mozilla returns random values under FreeBSD on success,
++      so we can't rely on the return value exept our own 110 one. */
++
++   if(WIFEXITED(status))
++   {
++      switch(WEXITSTATUS(status))
++      {  case 110: /* browser did not execute */
++	   browser_index++;
++	   if(!browsers[browser_index]) /* all browsers from the list failed */
++	   {  browser_dialog(bi->url);
++
++	      if(bi->msg) 
++		gtk_widget_destroy(bi->msg);
++	      if(bi->url) 
++		g_free(bi->url);
++	      g_free(bi);
++	   }
++	   else                        /* try next browser from list */
++	   {  bi->seconds = 0;  
++	      try_browser(bi);
++	   }
++	   return FALSE;
++
++         case 0:  /* browser assumed to be successful */
++         default:
++	   if(bi->msg) 
++	     gtk_widget_destroy(bi->msg);
++	   if(bi->url) 
++	     g_free(bi->url);
++	   g_free(bi);
++	   return FALSE;
++      }
++   }
++
++   bi->seconds++;
++   if(bi->seconds == 10 && bi->msg)
++   {  gtk_widget_destroy(bi->msg);
++      bi->msg = NULL;
++   }
++
++   return bi->seconds > 60 ? FALSE : TRUE;
++}
++#endif /* SYS_ unix-like */
++
++#ifdef SYS_MINGW
++static gboolean browser_timeout_func(gpointer data)
++{  browser_info *bi = (browser_info*)data;
++   
++   bi->seconds++;
++
++   if(bi->seconds >= 10)
++   {  if(bi->msg)
++      {  gtk_widget_destroy(bi->msg);
++         bi->msg = NULL;
++      }
++      if(bi->url) g_free(bi->url);
++      g_free(bi);
++      return FALSE;
++   }
++
++   return TRUE;
++}
++#endif /* SYS_MINGW */
++
++/*
++ * Invoke the browser
++ */
++
++#if defined(SYS_LINUX) || defined(SYS_FREEBSD) || defined(SYS_NETBSD)
++static void try_browser(browser_info *bi)
++{  pid_t pid;
++
++   bi->pid = pid = fork();
++
++   if(pid == -1)
++   {  printf("fork failed\n");
++      return;
++   }
++
++   /* make the parent remember and wait() for the browser */
++
++   if(pid > 0)  
++   {  g_timeout_add(1000, browser_timeout_func, (gpointer)bi);
++
++      if(browser_index)
++      {  g_free(Closure->browser);
++	 Closure->browser = g_strdup(browsers[browser_index]);
++      }
++   }
++
++   /* try calling the browser */
++
++   if(pid == 0)
++   {  char *argv[10];
++      int argc = 0;
++
++      argv[argc++] = browser_index ? browsers[browser_index] : Closure->browser;
++      argv[argc++] = bi->url;
++      argv[argc++] = NULL;
++      execvp(argv[0], argv);
++
++      _exit(110); /* couldn't execute */
++   }
++}
++#endif /* SYS_ unix-like */
++
++
++void ShowHTML(char *target)
++{  browser_info *bi = g_malloc0(sizeof(browser_info));
++   guint64 ignore;
++   const char *lang;
++   char *path = NULL;
++   int http_url;
++
++   /* If no target is given, select between translations of the manual. */
++
++   if(!target) target = g_strdup("index.html");
++
++   http_url = strlen(target) > 4 && !strncmp(target, "http", 4);
++
++   if(!http_url && !strchr(target, '/'))  /* create full path */
++   { 
++      if(!Closure->docDir)
++      {  
++	 CreateMessage(_("Documentation not installed."), GTK_MESSAGE_ERROR);
++         g_free(bi);
++         return;
++      }
++
++      lang = g_getenv("LANG");
++
++      if(lang)
++      {  if(!strncmp(lang, "ru", 2)) 
++#ifdef SYS_MINGW
++	     path = g_strdup_printf("%s\\ru\\%s",Closure->docDir,target); 
++#else
++	     path = g_strdup_printf("%s/ru/%s",Closure->docDir,target); 
++#endif
++         else if(!strncmp(lang, "de", 2)) 
++#ifdef SYS_MINGW
++	     path = g_strdup_printf("%s\\de\\%s",Closure->docDir,target); 
++#else
++	     path = g_strdup_printf("%s/de/%s",Closure->docDir,target); 
++#endif
++      }
++
++      if(!path)
++      {
++#ifdef SYS_MINGW
++         path = g_strdup_printf("%s\\en\\%s",Closure->docDir,target); 
++#else
++         path = g_strdup_printf("%s/en/%s",Closure->docDir,target); 
++#endif
++      }
++
++#ifdef SYS_MINGW      
++      if(!LargeStat(path, &ignore))
++      {  
++	 g_free(path);  /* the local dir is Windows specific */
++	 path = g_strdup_printf("%s\\local\\%s",Closure->docDir,target);
++      }
++#endif
++      g_free(target);
++      bi->url = path;
++   }
++   else bi->url = target;
++
++   if(!http_url && !LargeStat(bi->url, &ignore))
++   {  
++      CreateMessage(_("Documentation file\n%s\nnot found.\n"), GTK_MESSAGE_ERROR, bi->url);
++      g_free(bi);
++      g_free(bi->url);
++      return;
++   }
++
++   /* Lock the help button and show a message for 10 seconds. */
++
++   TimedInsensitive(Closure->helpButton, 10000);
++   bi->msg = CreateMessage(_("Please hang on until the browser comes up!"), GTK_MESSAGE_INFO);
++   g_signal_connect(G_OBJECT(bi->msg), "destroy", G_CALLBACK(msg_destroy_cb), bi);
++
++#ifdef SYS_MINGW
++   /* Okay, Billy wins big time here ;-) */
++
++   ShellExecute(NULL, "open", bi->url, NULL, NULL, SW_SHOWNORMAL);
++   g_timeout_add(1000, browser_timeout_func, (gpointer)bi);
++#endif
++
++#if defined(SYS_LINUX) || defined(SYS_FREEBSD) || defined(SYS_NETBSD)
++   /* Try the first browser */
++
++   browser_index = 0;
++   try_browser(bi);
++#endif
++}
diff --git a/debian/patches/series b/debian/patches/series
index efb177c..92f39c4 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -18,3 +18,4 @@
 24-show-gpl3-license.patch
 25-fix-man-pages.patch
 26-fix-display-of-manual.pdf.patch
+27-allow-opening-in-browser-again.patch

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-opt-media/dvdisaster.git



More information about the Pkg-opt-media-team mailing list