From: Darren S. <ds...@us...> - 2005-06-29 18:18:53
|
Update of /cvsroot/xine/gnome-xine/src In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv5281/src Modified Files: desktop_integration.c desktop_integration.h wizards.c Log Message: Setup wizard overhaul: improve display, report errors via the UI. Move Mozilla registration from wizards.c to desktop_integration.c. Disable more code if the registration functionality is disabled. Index: desktop_integration.c =================================================================== RCS file: /cvsroot/xine/gnome-xine/src/desktop_integration.c,v retrieving revision 1.9 retrieving revision 1.10 diff -u -r1.9 -r1.10 --- desktop_integration.c 17 May 2005 22:35:45 -0000 1.9 +++ desktop_integration.c 29 Jun 2005 18:18:41 -0000 1.10 @@ -33,6 +33,10 @@ #include <dlfcn.h> #include <alloca.h> #include <string.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <unistd.h> +#include <errno.h> #include "utils.h" @@ -293,6 +297,53 @@ free( gnome_vfs ); } + +#ifdef USE_INTEGRATION_WIZARD + +static char *report = NULL; +static char *section = NULL; + +void di_registration_flush () +{ + free (report); + report = NULL; + section = NULL; +} + +static void di_report (const char *fmt, ...) + __attribute__ ((format (printf, 1, 2))); + +static void di_report (const char *fmt, ...) +{ + char *msg, *markup; + va_list ap, aq; + + if (section) + { + asreprintf (&report, _("%s%s<i>Errors while registering with %s:</i>\n"), + report ? : "", report ? "\n" : "", section); + section = NULL; + } + + va_start (ap, fmt); + va_copy (aq, ap); + fprintf (stderr, _("gxine desktop integration: ")); + vfprintf (stderr, fmt, ap); + va_end (ap); + fprintf (stderr, "\n"); + msg = g_strdup_vprintf (fmt, aq); + va_end (aq); + markup = g_markup_printf_escaped ("%s", msg); + free (msg); + asreprintf (&report, "%s\n%s", report, markup); + free (markup); +} + +const char *di_registration_report (void) +{ + return report; +} + /* * add the installed application to the gnome application info registry */ @@ -317,15 +368,15 @@ return GNOME_VFS_OK; } - - void di_register_gnome (void) { char *mime_types; + section = "GNOME"; + if (!gnome_vfs_init()) { - printf (_("desktop_integration: initialisation failed.\n")); - return ; + di_report (_("GNOME initialisation failed")); + return; } /* freeze the lists to enable multiple updates */ @@ -377,6 +428,8 @@ FILE *f; char *mime_types; + section = "KDE"; + kdehome = getenv ("KDEHOME"); if (kdehome) @@ -387,7 +440,7 @@ NULL); if (ensure_path_exists (fname, 0755)) { - printf (_("desktop_integration: error while creating %s\n"), fname); + di_report (_("can't create directory %s: %s"), fname, strerror (errno)); g_free (fname); return; } @@ -407,21 +460,24 @@ f = fopen (fname, "w"); if (!f) { - printf (_("desktop_integration: error while creating %s\n"), - fname); - + di_report (_("can't open file %s for writing: %s"), fname, strerror (errno)); g_free (fname); + return; } fprintf (f, "[Desktop Entry]\n" - "Version=0.92\n" + "Version=1.0\n" "Encoding=UTF-8\n" "Name=gxine\n" + "GenericName=Video Player\n" + "Comment=Play films and songs, or watch digital TV\n" "MultipleArgs=true\n" - "Terminal=0\n" + "Terminal=false\n" "Icon=%s/gxine-icon.xpm\n" "Exec=%s/gxine\n" "Type=Application\n" + "StartupNotify=true\n" + "Categories=GTK;Application;AudioVideo;\n" "MimeType=", pixmapdir, bindir); @@ -460,7 +516,10 @@ } fprintf (f, "\n"); - fclose (f); + if (ferror (f)) + di_report (_("error while writing to file %s: %s\n"), fname, strerror (errno)); + if (fclose (f)); + di_report (_("error when closing file %s: %s\n"), fname, strerror (errno)); g_free (fname); } @@ -472,14 +531,15 @@ FILE *f; char *mime_types; + section = "mailcap"; + fname = g_strconcat (g_get_home_dir(), "/.mailcap", NULL); mc = read_entire_file (fname, &n); f = fopen (fname, "w"); if (!f) { - printf (_("desktop_integration: cannot open %s for writing\n"), - fname); + di_report (_("can't open file %s for writing: %s"), fname, strerror (errno)); g_free (fname); return; } @@ -527,7 +587,70 @@ } fprintf (f, "\n"); + if (ferror (f)) + di_report (_("error while writing to file %s: %s\n"), fname, strerror (errno)); + if (fclose (f)); + di_report (_("error when closing file %s: %s\n"), fname, strerror (errno)); + g_free (fname); +} + +void di_register_mozilla (void) +{ + gchar *fname, *sname; + char buf[FILENAME_MAX]; + int i; + struct stat st; + + static const char *dir[] = { "/.mozilla", "/.firefox" }; + + section = "Mozilla"; + + sname = g_strconcat (plugindir, "/gxineplugin.so", NULL); + if (stat (sname, &st)) + return; + + printf (_("wizards: installing browser plugin...\n")); + + for (i = 0; i < sizeof (dir) / sizeof (dir[0]); ++i) + { + /* just make sure the directory exists */ + fname = g_strconcat (g_get_home_dir(), dir[i], "/plugins", NULL); + if (ensure_path_exists (fname, 0755)) + { + di_report (_("can't create directory %s: %s"), fname, strerror (errno)); + goto next; + } + g_free (fname); + + fname = g_strconcat (g_get_home_dir(), dir[i], "/plugins/gxineplugin.so", NULL); + buf[0] = 0; + + /* If the destination object exists, check if it's a symlink and if it's + * pointing to the right place. If any of those are not true, we unlink + * the object (if it exists) and create a fresh symlink in its place. + */ + + if (readlink (fname, buf, sizeof (buf)) && + errno != EINVAL && errno != ENOENT) + { + di_report (_("symlink check on %s failed: %s"), fname, strerror (errno)); + goto next; + } + + if (!strcmp (buf, sname)) + goto next; + + if (unlink (fname) && errno != ENOENT) + di_report (_("cannot unlink %s: %s"), fname, strerror (errno)); + + if (symlink (sname, fname) && errno != EEXIST) + di_report (_("cannot link %s to %s: %s"), sname, fname, strerror (errno)); + + next: + g_free (fname); + } - fclose (f); + g_free (sname); } +#endif /* USE_INTEGRATION_WIZARD */ Index: desktop_integration.h =================================================================== RCS file: /cvsroot/xine/gnome-xine/src/desktop_integration.h,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- desktop_integration.h 25 Nov 2002 12:19:27 -0000 1.3 +++ desktop_integration.h 29 Jun 2005 18:18:42 -0000 1.4 @@ -25,11 +25,14 @@ #ifndef HAVE_DESKTOP_INTEGRATION #define HAVE_DESKTOP_INTEGRATION +#ifdef USE_INTEGRATION_WIZARD +const char *di_registration_report (void); +void di_registration_flush (void); void di_register_gnome (void); - void di_register_kde (void); - void di_register_mailcap (void); +void di_register_mozilla (void); +#endif #endif Index: wizards.c =================================================================== RCS file: /cvsroot/xine/gnome-xine/src/wizards.c,v retrieving revision 1.34 retrieving revision 1.35 diff -u -r1.34 -r1.35 --- wizards.c 2 Jun 2005 22:16:54 -0000 1.34 +++ wizards.c 29 Jun 2005 18:18:42 -0000 1.35 @@ -38,57 +38,83 @@ #include <stdlib.h> #include <string.h> +#include "ui.h" #include "utils.h" #include "desktop_integration.h" -typedef struct { - char *msg; - char *explanation; -} hc_msg_t; +static GtkWidget *add_heading (GtkWidget *vbox, const char *label) +{ + char *markup = g_strdup_printf ("<big><b>%s</b></big>", label); + GtkWidget *l = gtk_label_new (markup); + gtk_label_set_use_markup (GTK_LABEL (l), TRUE); + gtk_label_set_line_wrap (GTK_LABEL (l), TRUE); + gtk_misc_set_alignment (GTK_MISC (l), 0, 0.5); + gtk_box_pack_start (GTK_BOX(vbox), l, FALSE, FALSE, 5); + free (markup); + return l; +} -static void details_cb (GtkWidget* widget, gpointer data) { - - hc_msg_t *msg = data; +static GtkWidget *add_label (GtkWidget *vbox, const char *label) +{ + GtkWidget *l = gtk_label_new (label); + gtk_label_set_line_wrap (GTK_LABEL (l), TRUE); + gtk_misc_set_alignment (GTK_MISC (l), 0, 0.5); + gtk_box_pack_start (GTK_BOX(vbox), l, FALSE, FALSE, 5); + return l; +} - display_info (_("Health Check Results"), msg->msg); +static gboolean do_welcome (GtkWidget *dlg, GtkWidget *vbox) +{ + add_heading (vbox, _("Welcome to gxine!\n\n")); + add_label (vbox, _("Would you like to run some setup wizards now " + "that will check your installation and maybe " + "do some adjustments for you if necessary?\n\n" + "If you do not want to run the wizards right now, " + "just click on the <i>Close</i> button and you will " + "not be bothered again.\n\n" + "You can always run the wizards (again) from the " + "help menu.")); + return FALSE; +}; - display_info (_("Health Check Explanation"), msg->explanation); -} +typedef struct { + char *msg, *explanation; +} hc_msg_t; -static GtkWidget *do_health_check (GtkWidget *dlg, GtkWidget *headline) { +static void details_cb (GtkWidget* widget, gpointer data) +{ + hc_msg_t *msg = data; + display_info (FROM_GXINE, _("Health Check Results"), "%s\n%s", + msg->msg, msg->explanation); +} - GtkWidget *vbox, *l, *table, *b; +static gboolean do_health_check (GtkWidget *dlg, GtkWidget *vbox) +{ + GtkWidget *l, *table, *b; xine_health_check_t hc; xine_health_check_t *results; int check; hc_msg_t *msg; - vbox = gtk_vbox_new (0, 0); - table = gtk_table_new (1, 1, FALSE); - l = gtk_label_new (_("The xine engine runs certain checks on your\n" - "system configuration. Results follow:")); - - gtk_label_set_justify (GTK_LABEL (l), GTK_JUSTIFY_LEFT); - - gtk_misc_set_alignment (GTK_MISC (l), 0, 0.5); - - gtk_box_pack_start (GTK_BOX(vbox), l, FALSE, FALSE, 5); + add_heading (vbox, _("System configuration check")); + add_label (vbox, _("The xine engine runs certain checks on your " + "system configuration. Results follow:")); /* If input.vcd_device is empty, we will set it to the default "/dev/cdrom" */ hc.cdrom_dev = xine_config_register_string(xine, "input.vcd_device", "/dev/cdrom", - "device used for cdrom drive", + _("device used for CD-ROM drive"), NULL, 0, NULL, NULL); /* If input.dvd_device is empty, we will set it to the default "/dev/dvd" */ hc.dvd_dev = xine_config_register_string(xine, "input.dvd_device", "/dev/dvd", - "device used for dvd drive", + _("device used for DVD drive"), NULL, 0, NULL, NULL); /* Run tests */ @@ -133,10 +159,7 @@ } ; gtk_box_pack_start (GTK_BOX(vbox), table, FALSE, FALSE, 5); - - gtk_widget_show_all (vbox); - - return vbox; + return FALSE; } #ifdef USE_INTEGRATION_WIZARD @@ -145,110 +168,63 @@ static GtkWidget *cb_kde; static GtkWidget *cb_mailcap; -static GtkWidget *ask_integration_wizard (GtkWidget *w, GtkWidget *headline) { - GtkWidget *vbox, *l; +static void integrate_cb (GtkButton *button, gpointer data) +{ + gboolean state = !!data; + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (cb_mailcap), state); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (cb_moz), state); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (cb_gnome), state); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (cb_kde), state); +} + +static gboolean ask_integration_wizard (GtkWidget *w, GtkWidget *vbox) +{ struct stat st; gchar *sname; + GtkWidget *b, *hbox; - vbox = gtk_vbox_new (0, 0); - - l = gtk_label_new (_("Register gxine with the following applications\n" - "as a media handler/helper:")); + add_heading (vbox, _("Registration")); + add_label (vbox, _("Register gxine with the following applications " + "as a media handler/helper:")); - gtk_label_set_justify (GTK_LABEL (l), GTK_JUSTIFY_LEFT); - gtk_misc_set_alignment (GTK_MISC (l), 0, 0.5); - - gtk_box_pack_start (GTK_BOX(vbox), l, FALSE, FALSE, 5); - - - cb_mailcap = gtk_check_button_new_with_label ("~/.mailcap"); + cb_mailcap = gtk_check_button_new_with_label ("~_/.mailcap"); gtk_box_pack_start (GTK_BOX(vbox), cb_mailcap, FALSE, FALSE, 5); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (cb_mailcap), TRUE); - cb_moz = gtk_check_button_new_with_label ("Mozilla & Mozilla Firefox (plugin)"); + cb_moz = gtk_check_button_new_with_label (_("_Mozilla & Mozilla Firefox (plugin)")); gtk_box_pack_start (GTK_BOX(vbox), cb_moz, FALSE, FALSE, 5); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (cb_moz), TRUE); sname = g_strconcat (plugindir, "/gxineplugin.so", NULL); gtk_widget_set_sensitive (cb_moz, !stat (sname, &st)); g_free (sname); - cb_gnome = gtk_check_button_new_with_label ("Gnome / Nautilus"); + cb_gnome = gtk_check_button_new_with_label (_("_GNOME, Nautilus")); gtk_box_pack_start (GTK_BOX(vbox), cb_gnome, FALSE, FALSE, 5); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (cb_gnome), TRUE); - cb_kde = gtk_check_button_new_with_label ("KDE / Konqueror"); + cb_kde = gtk_check_button_new_with_label (_("_KDE, Konqueror")); gtk_box_pack_start (GTK_BOX(vbox), cb_kde, FALSE, FALSE, 5); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (cb_kde), TRUE); - gtk_widget_show_all (vbox); + hbox = gtk_hbox_new (FALSE, 2); + gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 2); - return vbox; -} + b = ui_button_new_stock_mnemonic (GTK_STOCK_ADD, _("_All")); + gtk_box_pack_start (GTK_BOX (hbox), b, FALSE, FALSE, 2); + g_signal_connect (G_OBJECT (b), "clicked", + (GCallback) integrate_cb, integrate_cb); + + b = ui_button_new_stock_mnemonic (GTK_STOCK_REMOVE, _("_None")); + gtk_box_pack_start (GTK_BOX (hbox), b, FALSE, FALSE, 2); + g_signal_connect (G_OBJECT (b), "clicked", + (GCallback) integrate_cb, NULL); -static void di_register_mozilla (void) { - - gchar *fname, *sname; - static const char dir[][12] = { "/.mozilla", "/.firefox" }; - char buf[FILENAME_MAX]; - int i; - struct stat st; - - sname = g_strconcat (plugindir, "/gxineplugin.so", NULL); - if (stat (sname, &st)) - return; - - printf (_("wizards: installing browser plugin...\n")); - - for (i = 0; i < sizeof (dir) / sizeof (dir[0]); ++i) - { - /* just make sure the directory exists */ - fname = g_strconcat (g_get_home_dir(), dir[i], "/plugins", NULL); - { - int j = ensure_path_exists (fname, 0755); - if (j) - { - printf (_("wizards: error: can't create directory %s: %s\n"), - fname, strerror (errno)); - continue; - } - } - g_free (fname); - - fname = g_strconcat (g_get_home_dir(), dir[i], "/plugins/gxineplugin.so", NULL); - buf[0] = 0; - - /* If the destination object exists, check if it's a symlink and if it's - * pointing to the right place. If any of those are not true, we unlink - * the object (if it exists) and create a fresh symlink in its place. - */ - - if (readlink (fname, buf, sizeof (buf)) && - errno != EINVAL && errno != ENOENT) - { - printf (_("wizards: error: symlink check on %s failed: %s\n"), - fname, strerror (errno)); - continue; - } - - if (!strcmp (buf, sname)) - continue; - - if (unlink (fname) && errno != ENOENT) - printf (_("wizards: error: cannot unlink %s: %s\n"), - fname, strerror (errno)); - - if (symlink (sname, fname) && errno != EEXIST) - printf (_("wizards: error: cannot link %s to %s: %s\n"), - sname, fname, strerror (errno)); - - g_free (fname); - } - - g_free (sname); + return FALSE; } -static void desktop_integration (void) { - +static void desktop_integration (void) +{ + di_registration_flush (); if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (cb_mailcap))) { di_register_mailcap(); } @@ -262,6 +238,20 @@ di_register_mozilla(); } } + +static gboolean report_integration_wizard (GtkWidget *w, GtkWidget *vbox) +{ + const char *report = di_registration_report (); + if (!report) + return TRUE; + + add_heading (vbox, _("Registration report")); + add_label (vbox, _("There were some problems during registration.")); + gtk_label_set_use_markup ((GtkLabel *)add_label (vbox, report), TRUE); + di_registration_flush (); + + return FALSE; +} #endif #define RESPONSE_CLOSE 0 @@ -294,8 +284,6 @@ void run_wizards (gboolean requested) { static GtkWidget *dlg = NULL; - GtkWidget *headline, *sep, *content, *w, *hbox; - int b, state; if (dlg) { @@ -306,9 +294,23 @@ if (requested || (xine_config_register_num (xine, "misc.wizards_shown", 0, _("Keep track of whether user has seen wizards yet"), - NULL, 20, NULL, NULL) < WIZARDS_LEVEL)) { - + NULL, 20, NULL, NULL) < WIZARDS_LEVEL)) + { xine_cfg_entry_t entry; + int b, state; + + static const struct { + GtkWidget *(*create) (GtkWidget *, GtkWidget *); + gboolean (*action) (void); /* TRUE to skip a stage */ + } wizards[] = { + { do_welcome, NULL }, + { do_health_check, NULL }, +#ifdef USE_INTEGRATION_WIZARD + { ask_integration_wizard, desktop_integration }, + { report_integration_wizard, NULL }, +#endif + { NULL } + }; if (xine_config_lookup_entry (xine, "misc.wizards_shown", &entry)) { entry.num_value = WIZARDS_LEVEL; @@ -318,11 +320,11 @@ /* set up dialog which all wizards will use */ dlg = gtk_dialog_new_with_buttons (_("gxine setup wizards"), NULL, 0, - GTK_STOCK_CLOSE, GTK_RESPONSE_DELETE_EVENT, - GTK_STOCK_GO_FORWARD, GTK_RESPONSE_ACCEPT, - NULL); + GTK_STOCK_GO_FORWARD, GTK_RESPONSE_ACCEPT, + GTK_STOCK_CLOSE, GTK_RESPONSE_DELETE_EVENT, + NULL); gtk_dialog_set_default_response (GTK_DIALOG(dlg), GTK_RESPONSE_ACCEPT); - gtk_window_set_default_size (GTK_WINDOW (dlg), 450, 400); + gtk_window_set_default_size (GTK_WINDOW (dlg), -1, 400); g_signal_connect (G_OBJECT (dlg), "delete_event", G_CALLBACK (close_cb), &b); g_signal_connect (G_OBJECT (dlg), "response", @@ -332,95 +334,50 @@ * contents: headline, separator, wizard-specific part */ - hbox = gtk_hbox_new (0,0); - /* headline */ { - gchar *pathname; - pathname = g_strconcat (pixmapdir, "/wizards.png", NULL); - headline = gtk_image_new_from_file (pathname); + gchar *pathname = g_strconcat (pixmapdir, "/wizards.png", NULL); + GtkWidget *w = gtk_image_new_from_file (pathname); + gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dlg)->vbox), w, FALSE, FALSE, 2); g_free (pathname); } - gtk_box_pack_start (GTK_BOX (hbox), headline, FALSE, FALSE, 2); - - gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dlg)->vbox), - hbox, FALSE, FALSE, 2); - sep = gtk_hseparator_new (); gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dlg)->vbox), - sep, FALSE, FALSE, 5); - - content = gtk_vbox_new (0, 0); + gtk_hseparator_new (), FALSE, FALSE, 5); - /* - * ask user if he/she wants to proceed - */ - - - w = gtk_label_new (_("<big><b>Welcome to gxine!</b></big>\n\n" - "Would you like to run some setup wizards now\n" - "that will check your installation and maybe\n" - "do some adjustments for you if necessary?\n\n" - "If you do not want to run the wizards right now,\n" - "just click on the <i>Close</i> button and you will not be\n" - "bothered again.\n\n" - "You can always run the wizards (again) from the help menu.")); - gtk_label_set_use_markup (GTK_LABEL(w), TRUE); - gtk_label_set_line_wrap (GTK_LABEL (w), TRUE); - gtk_box_pack_start_defaults (GTK_BOX(content), w); - - gtk_box_pack_start_defaults (GTK_BOX (GTK_DIALOG (dlg)->vbox), content); - - gtk_widget_set_size_request (w, 500, 300); - window_show (dlg, NULL); - gtk_main (); - - if (b == RESPONSE_CLOSE) - goto finished; - - state = 0; - while (TRUE) { - - gtk_container_remove (GTK_CONTAINER (content), w); - - switch (state) { - - case 0: - w = do_health_check (dlg, headline); - - gtk_box_pack_start (GTK_BOX(content), w, TRUE, TRUE, 0); - gtk_widget_set_size_request (w, 500, 300); - - gtk_main (); - - if (b == RESPONSE_CLOSE) - goto finished; - - state ++; - break; + state = -1; + while (1) + { + GtkWidget *content = gtk_vbox_new (0, 0); + gtk_box_pack_start_defaults (GTK_BOX (GTK_DIALOG (dlg)->vbox), content); -#ifdef USE_INTEGRATION_WIZARD - case 1: - w = ask_integration_wizard (dlg, headline); + if (wizards[++state].create) + { + if (wizards[state].create (dlg, content)) + goto next; + } + else + { + gtk_dialog_set_response_sensitive (GTK_DIALOG (dlg), GTK_RESPONSE_ACCEPT, FALSE); + add_heading (content, _("Setup completed.")); + } - gtk_box_pack_start_defaults (GTK_BOX(content), w); - gtk_widget_set_size_request (w, 500, 300); + gtk_widget_show_all (content); + gtk_main (); - gtk_main (); + if (b == RESPONSE_CLOSE) + break; - if (b != RESPONSE_CLOSE) - desktop_integration (); -#endif + if (wizards[state].action) + wizards[state].action (); - default: - goto finished; - } + next: + gtk_container_remove (GTK_CONTAINER (GTK_DIALOG (dlg)->vbox), content); } -finished: - gtk_widget_hide (dlg); + gtk_widget_destroy (dlg); dlg = NULL; } } |