]> gitweb.michael.orlitzky.com - xfce4-hdaps.git/blobdiff - panel-plugin/xfce4-hdaps-dialogs.c
panel-plugin: switch from xfce-panel-plugin.h to libxfce4panel.h.
[xfce4-hdaps.git] / panel-plugin / xfce4-hdaps-dialogs.c
index fb8a5002037fd019fbc2b6505310019c187c24d0..5624ba82a61210cae9a29f328dc8d662e6e304b1 100644 (file)
@@ -1,21 +1,22 @@
 /*
  * xfce4-hdaps, an XFCE4 panel plugin for the HDAPS system.
  *
- * Copyright Michael Orlitzky
+ * Copyright (C) 2019 Michael Orlitzky
  *
- * http://michael.orlitzky.com/
+ *   http://michael.orlitzky.com/
  *
  * 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 3 of the License, or
- * (at your option) any later version.
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 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.
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details:
+ *
+ *   https://www.gnu.org/licenses/agpl-3.0.html
  *
- * http://www.fsf.org/licensing/licenses/gpl.html
  */
 
 #ifdef HAVE_CONFIG_H
@@ -25,7 +26,7 @@
 #include <string.h>
 #include <gtk/gtk.h>
 #include <libxfce4ui/libxfce4ui.h>
-#include <libxfce4panel/xfce-panel-plugin.h>
+#include <libxfce4panel/libxfce4panel.h>
 #include "xfce4-hdaps-dialogs.h"
 #include "hdaps.h"
 
 /* If people can't read the README, well maybe
  *  they can do it /online/.
  */
-#define PLUGIN_WEBSITE "http://michael.orlitzky.com/code/xfce4-hdaps.php"
+#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) {
+  /* 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 (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);
-    
-    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;
   }
 
-  
+
   if (response == GTK_RESPONSE_OK) {
     /* This corresponds to the "Save" button, so we
        want to save any settings that may have changed. */
     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_get_active_text((GtkComboBox*)hdaps->cb_device_name);
-    snprintf(hdaps->sysfs_file, FILENAME_MAX, UNLOAD_HEADS_FMT, hdaps->device_name);
+    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);
     hdaps_save(hdaps->plugin, hdaps);
     hdaps_reset_timeout(hdaps);
   }
 
-  
+
   /* Since there is already a "save" button, we should ignore
      any changes that were made if the user presses "cancel"
      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;
 }
@@ -81,30 +116,31 @@ 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. */
-  
+
   GtkWidget *dialog;
   GtkWidget *label;
   GtkWidget *vbox;
   GtkWidget *hbox;
   GtkSizeGroup *sg;
-  
+
   /* Block the plugin menu while the configuration
      dialogue is open. Don't forget to unblock it before
      we close. */
   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_DIALOG_NO_SEPARATOR,
-                                              GTK_STOCK_HELP, GTK_RESPONSE_HELP,
-                                              GTK_STOCK_SAVE, GTK_RESPONSE_OK,
-                                              GTK_STOCK_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);
@@ -118,70 +154,76 @@ 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_vbox_new(FALSE, DEFAULT_BORDER_WIDTH);
+  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(dialog)->vbox), vbox, TRUE, TRUE, 0);
-  
+  gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))),
+                     vbox, TRUE, TRUE, 0);
+
   /* Create size group to keep widgets aligned */
   sg = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
 
-  hbox = gtk_hbox_new(FALSE, DEFAULT_BORDER_WIDTH);
+  hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, DEFAULT_BORDER_WIDTH);
   gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
 
   label = gtk_label_new(_("Poll Frequency:"));
   gtk_size_group_add_widget(sg, label);
-  gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
+  gtk_widget_set_halign(label, 0.0);
+  gtk_widget_set_valign(label, 0.5);
   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_hbox_new(FALSE, DEFAULT_BORDER_WIDTH);
+  hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, DEFAULT_BORDER_WIDTH);
   gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
 
   label = gtk_label_new(_("Device Name:"));
   gtk_size_group_add_widget(sg, label);
-  gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
+  gtk_widget_set_halign(label, 0.0);
+  gtk_widget_set_valign(label, 0.5);
   gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
 
-  hdaps->cb_device_name = gtk_combo_box_new_text();
+  hdaps->cb_device_name = gtk_combo_box_text_new();
 
   /* Add the current device name, it should always be available.
      Oh, and it should be the default, too. */
-  gtk_combo_box_append_text((GtkComboBox*)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. */
   gtk_combo_box_set_active((GtkComboBox*)hdaps->cb_device_name, 0);
-  
+
   /* Now loop through the list of available devices, adding each
      to the list as we go. */
   char hdaps_devices[MAX_HDAPS_DEVICES][FILENAME_MAX];
   int found_devices = get_hdaps_device_list(hdaps_devices);
   int list_idx = 0;
-  
+
   for (list_idx = 0; list_idx < found_devices; list_idx++) {
     /* We don't want to add duplicate entries to the combo box.
        However, at this point, the current device name should be
        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_append_text((GtkComboBox*)hdaps->cb_device_name, hdaps_devices[list_idx]);
+      gtk_combo_box_text_append_text((GtkComboBoxText*)hdaps->cb_device_name,
+                                     hdaps_devices[list_idx]);
     }
   }
-  
+
   gtk_box_pack_start(GTK_BOX(hbox), hdaps->cb_device_name, FALSE, FALSE, 0);
-  
+
   /* Show the dialog and all of its widgets. */
   gtk_widget_show_all(dialog);
 }
@@ -189,52 +231,52 @@ void hdaps_configure(XfcePanelPlugin *plugin,
 
 
 
-/* URL handler used on the About dialog. */
-static void hdaps_url_handler(GtkAboutDialog *about,
-                             const gchar *link,
-                             gpointer data) {
-    gchar *cmd;
+/* URI (http(s):// and mailto://) handler used on the About dialog. */
+static void hdaps_uri_handler(GtkAboutDialog *about,
+                              const gchar *uri,
+                              gpointer data) {
 
-    cmd = g_strdup_printf("%s %s","xdg-open", link);
-
-    /* Stolen from xfce4-power-manager. */
-    if (!g_spawn_command_line_async(cmd, NULL)) {
-      g_free(cmd);
-      cmd = g_strdup_printf("%s %s","xfbrowser4", link);
-      g_spawn_command_line_async(cmd, NULL);
-    }
-    g_free(cmd);
+  launch_uri(GTK_WINDOW(about), uri);
 }
 
-
-/* Email address handler used on the About dialog. */
-static void hdaps_mailto_handler(GtkAboutDialog *about,
-                                const gchar *link,
-                                gpointer data) {
-    gchar *cmd = g_strdup_printf( "%s %s", "xdg-email", link);
-
-    g_spawn_command_line_async(cmd, NULL);
-    g_free(cmd);
+/* "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 <michael@orlitzky.com>", NULL };
-  const gchar *copyright = "Copyright \302\251 2010 Michael Orlitzky";
-
-  gtk_about_dialog_set_url_hook(hdaps_url_handler, NULL, NULL);
-  gtk_about_dialog_set_email_hook(hdaps_mailto_handler, NULL, NULL);
-
-  gtk_show_about_dialog(NULL,
-                       "authors", authors,
-                       "copyright", copyright,
-                       "destroy-with-parent", TRUE,
-                       "license", LICENSE_GPL3,
-                       "logo-icon-name", PACKAGE_NAME,
-                       "icon-name", PACKAGE_NAME,
-                       "name", PACKAGE_NAME,
-                       "version", PACKAGE_VERSION,
-                       "website", PLUGIN_WEBSITE,
-                       "website-label", "xfce4-hdaps homepage",
-                       NULL);
+  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, 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;
 }