X-Git-Url: http://gitweb.michael.orlitzky.com/?p=xfce4-hdaps.git;a=blobdiff_plain;f=panel-plugin%2Fxfce4-hdaps-dialogs.c;h=5624ba82a61210cae9a29f328dc8d662e6e304b1;hp=26f454e4aa146c104bdd80064acc34f673996322;hb=ef0bd0512e5f92587d27a729033a473609ddadc7;hpb=60ffd1d1b7266d9a030b2c864135ff444f0cb917 diff --git a/panel-plugin/xfce4-hdaps-dialogs.c b/panel-plugin/xfce4-hdaps-dialogs.c index 26f454e..5624ba8 100644 --- a/panel-plugin/xfce4-hdaps-dialogs.c +++ b/panel-plugin/xfce4-hdaps-dialogs.c @@ -26,7 +26,7 @@ #include #include #include -#include +#include #include "xfce4-hdaps-dialogs.h" #include "hdaps.h" @@ -39,20 +39,51 @@ */ #define PLUGIN_WEBSITE "http://michael.orlitzky.com/code/xfce4-hdaps.xhtml" +/* Launch a URI using either gtk_show_uri_on_window (gvfs), exo-open + * or xdg-open. This is used both when you click the author's email + * address, and when you visit the plugin's homepage. + */ +static gboolean launch_uri(GtkWindow *parent, const gchar *uri) { + GError *error = NULL; + gboolean result = gtk_show_uri_on_window(parent, + uri, + GDK_CURRENT_TIME, + &error); + /* First, let's try what the GTK docs say the default is. */ + if (result == TRUE) { + return result; + } + else { + g_warning(_("Error launching URI %s: %s"), uri, error->message); + g_error_free(error); + } -static void hdaps_configure_response(GtkWidget *dialog, - gint response, - HdapsPlugin *hdaps) { - - if (response == GTK_RESPONSE_HELP) { - /* Launch the user's web browser and direct them to - the plugin's webpage. */ - gboolean spawn_result = g_spawn_command_line_async("exo-open --launch WebBrowser " PLUGIN_WEBSITE, NULL); + /* Ok, GTK failed, on to the fallbacks. Let's try exo-open first, + since it's part of XFCE. */ + gchar *cmd = g_strdup_printf("%s %s","exo-open", uri); + result = g_spawn_command_line_async(cmd, NULL); - if (G_UNLIKELY(spawn_result == FALSE)) { - g_warning(_("Unable to open the following url: %s"), PLUGIN_WEBSITE); + if (G_UNLIKELY(result == FALSE)) { + g_warning(_("Unable to open URI with exo-open, trying xdg-open: %s"), uri); + g_free(cmd); + cmd = g_strdup_printf("%s %s","xdg-open", uri); + result = g_spawn_command_line_async(cmd, NULL); + if (G_UNLIKELY(result == FALSE)) { + g_warning(_("Unable to open URI with xdg-open, giving up: %s"), uri); } + } + + g_free(cmd); + + return result; +} + +static void hdaps_configure_response(GtkDialog *dialog, + gint response, + HdapsPlugin *hdaps) { + if (response == GTK_RESPONSE_HELP) { + launch_uri(GTK_WINDOW(dialog), PLUGIN_WEBSITE); return; } @@ -63,7 +94,10 @@ static void hdaps_configure_response(GtkWidget *dialog, g_object_set_data(G_OBJECT(hdaps->plugin), "dialog", NULL); hdaps->poll_frequency = gtk_spin_button_get_value_as_int((GtkSpinButton*)hdaps->sb_poll_frequency); hdaps->device_name = gtk_combo_box_text_get_active_text((GtkComboBoxText*)hdaps->cb_device_name); - snprintf(hdaps->sysfs_file, FILENAME_MAX, UNLOAD_HEADS_FMT, hdaps->device_name); + snprintf(hdaps->sysfs_file, + FILENAME_MAX, + UNLOAD_HEADS_FMT, + hdaps->device_name); hdaps_save(hdaps->plugin, hdaps); hdaps_reset_timeout(hdaps); } @@ -74,7 +108,7 @@ static void hdaps_configure_response(GtkWidget *dialog, instead. */ g_object_set_data(G_OBJECT(hdaps->plugin), "dialog", NULL); xfce_panel_plugin_unblock_menu(hdaps->plugin); - gtk_widget_destroy(dialog); + gtk_widget_destroy(GTK_WIDGET(dialog)); return; } @@ -82,7 +116,7 @@ static void hdaps_configure_response(GtkWidget *dialog, void hdaps_configure(XfcePanelPlugin *plugin, - HdapsPlugin *hdaps) { + HdapsPlugin *hdaps) { /* Here comes a bunch of GTK garbage to create the settings dialog. */ @@ -99,13 +133,14 @@ void hdaps_configure(XfcePanelPlugin *plugin, xfce_panel_plugin_block_menu(plugin); /* Create the dialog */ - dialog = xfce_titled_dialog_new_with_buttons(_("Hdaps Plugin"), - GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (plugin))), - GTK_DIALOG_DESTROY_WITH_PARENT, - "gtk-help", GTK_RESPONSE_HELP, - "gtk-save", GTK_RESPONSE_OK, - "gtk-cancel", GTK_RESPONSE_CANCEL, - NULL); + dialog = xfce_titled_dialog_new_with_buttons( + _("Hdaps Plugin"), + GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(plugin))), + GTK_DIALOG_DESTROY_WITH_PARENT, + "gtk-help", GTK_RESPONSE_HELP, + "gtk-save", GTK_RESPONSE_OK, + "gtk-cancel", GTK_RESPONSE_CANCEL, + NULL); /* Center the dialog on screen. */ gtk_window_set_position(GTK_WINDOW(dialog), GTK_WIN_POS_CENTER); @@ -119,13 +154,13 @@ void hdaps_configure(XfcePanelPlugin *plugin, /* Connect the reponse signal to the dialog. */ g_signal_connect(G_OBJECT (dialog), "response", - G_CALLBACK(hdaps_configure_response), hdaps); + G_CALLBACK(hdaps_configure_response), hdaps); vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, DEFAULT_BORDER_WIDTH); gtk_container_set_border_width(GTK_CONTAINER(vbox), DEFAULT_BORDER_WIDTH - 2); gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), - vbox, TRUE, TRUE, 0); + vbox, TRUE, TRUE, 0); /* Create size group to keep widgets aligned */ sg = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL); @@ -140,13 +175,14 @@ void hdaps_configure(XfcePanelPlugin *plugin, gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); hdaps->sb_poll_frequency = gtk_spin_button_new_with_range(100, 5000, 100); - gtk_spin_button_set_value((GtkSpinButton*)hdaps->sb_poll_frequency, hdaps->poll_frequency); + gtk_spin_button_set_value((GtkSpinButton*)hdaps->sb_poll_frequency, + hdaps->poll_frequency); gtk_box_pack_start(GTK_BOX(hbox), - hdaps->sb_poll_frequency, - FALSE, - FALSE, - 0); + hdaps->sb_poll_frequency, + FALSE, + FALSE, + 0); /* Create the device name dropdown. */ hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, DEFAULT_BORDER_WIDTH); @@ -162,7 +198,8 @@ void hdaps_configure(XfcePanelPlugin *plugin, /* Add the current device name, it should always be available. Oh, and it should be the default, too. */ - gtk_combo_box_text_append_text((GtkComboBoxText*)hdaps->cb_device_name, hdaps->device_name); + gtk_combo_box_text_append_text((GtkComboBoxText*)hdaps->cb_device_name, + hdaps->device_name); /* This function takes an index, and 0 should be the first (only) index at this point. */ @@ -180,7 +217,8 @@ void hdaps_configure(XfcePanelPlugin *plugin, the only entry. Therefore, to avoid duplicates, we only have to avoid adding the current device name a second time. */ if (strcmp(hdaps_devices[list_idx], hdaps->device_name) != 0) { - gtk_combo_box_text_append_text((GtkComboBoxText*)hdaps->cb_device_name, hdaps_devices[list_idx]); + gtk_combo_box_text_append_text((GtkComboBoxText*)hdaps->cb_device_name, + hdaps_devices[list_idx]); } } @@ -195,43 +233,50 @@ void hdaps_configure(XfcePanelPlugin *plugin, /* URI (http(s):// and mailto://) handler used on the About dialog. */ static void hdaps_uri_handler(GtkAboutDialog *about, - const gchar *uri, - gpointer data) { - gchar *cmd; + const gchar *uri, + gpointer data) { - cmd = g_strdup_printf("%s %s","xdg-open", uri); - - if (!g_spawn_command_line_async(cmd, NULL)) { - g_free(cmd); - cmd = g_strdup_printf("%s %s","xdg-open", uri); - g_spawn_command_line_async(cmd, NULL); - } - g_free(cmd); + launch_uri(GTK_WINDOW(about), uri); } +/* "Close" button handler for the About dialog. */ +static void hdaps_close_handler (GtkAboutDialog *about, + gint response_id, + gpointer user_data) { + /* This will cause the dialog to be destroyed */ + gtk_widget_destroy(GTK_WIDGET(about)); +} void hdaps_about(XfcePanelPlugin *plugin) { const gchar *authors[] = { "Michael Orlitzky ", NULL }; - const gchar *copyright = "Copyright \302\251 2012 Michael Orlitzky"; + const gchar *copyright = "Copyright \302\251 2019 Michael Orlitzky"; + + GtkAboutDialog *about = GTK_ABOUT_DIALOG(gtk_about_dialog_new()); + + gtk_about_dialog_set_authors(about, authors); + gtk_about_dialog_set_copyright(about, copyright); + gtk_about_dialog_set_program_name(about, PACKAGE_NAME); + gtk_about_dialog_set_logo_icon_name(about, PACKAGE_NAME); + gtk_about_dialog_set_license(about, LICENSE_AGPL3); + gtk_about_dialog_set_version(about, PACKAGE_VERSION); + gtk_about_dialog_set_website(about, PLUGIN_WEBSITE); + gtk_about_dialog_set_website_label(about, "xfce4-hdaps homepage"); /* Use a custom URI handler for http(s):// and mailto:// URIs. The - default behavior apparently needs gio/gvfs to work, and I don't - have those installed. */ - g_signal_connect(plugin, - "activate-link", - G_CALLBACK(hdaps_uri_handler), - NULL); - - gtk_show_about_dialog(NULL, - "authors", authors, - "copyright", copyright, - "destroy-with-parent", TRUE, - "license", LICENSE_AGPL3, - "logo-icon-name", PACKAGE_NAME, - "icon-name", PACKAGE_NAME, - "program-name", PACKAGE_NAME, - "version", PACKAGE_VERSION, - "website", PLUGIN_WEBSITE, - "website-label", "xfce4-hdaps homepage", - NULL); + default behavior apparently needs gio/gvfs to work, so we want + to add some fallbacks. */ + g_signal_connect(about, + "activate-link", + G_CALLBACK(hdaps_uri_handler), + NULL); + + /* To close the dialog when "close" is clicked, we have to connect + * the response signal to a handler that actually does it. + */ + g_signal_connect(about, + "response", + G_CALLBACK(hdaps_close_handler), + NULL); + gtk_widget_show(GTK_WIDGET(about)); + return; }