]> 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 80e0bcc3ba580f22f0ce5ce5e22c229e804fa9e0..5624ba82a61210cae9a29f328dc8d662e6e304b1 100644 (file)
@@ -1,11 +1,34 @@
+/*
+ * xfce4-hdaps, an XFCE4 panel plugin for the HDAPS system.
+ *
+ * Copyright (C) 2019 Michael Orlitzky
+ *
+ *   http://michael.orlitzky.com/
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * 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 Affero General Public License for more details:
+ *
+ *   https://www.gnu.org/licenses/agpl-3.0.html
+ *
+ */
+
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
 
+#include <string.h>
 #include <gtk/gtk.h>
-#include <libxfcegui4/libxfcegui4.h>
-#include <libxfce4panel/xfce-panel-plugin.h>
+#include <libxfce4ui/libxfce4ui.h>
+#include <libxfce4panel/libxfce4panel.h>
 #include "xfce4-hdaps-dialogs.h"
+#include "hdaps.h"
 
 /* Wild guess. Actually borrowed from some code
    I copy-and-pasted. Doesn't seem too ugly. */
 /* 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;
 }
@@ -59,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);
@@ -96,99 +154,129 @@ 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. I believe GTK takes care of the duplicates
-     for us. */
+     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++) {
-    gtk_combo_box_append_text((GtkComboBox*)hdaps->cb_device_name, hdaps_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_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);
 }
 
 
 
+
+/* URI (http(s):// and mailto://) handler used on the About dialog. */
+static void hdaps_uri_handler(GtkAboutDialog *about,
+                              const gchar *uri,
+                              gpointer data) {
+
+  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) {
-  GdkPixbuf *icon;
-  GtkWidget *dialog;
-  XfceAboutInfo *about;
-
-  /* Send NULL as our license, since GPL >= 3 is not
-     supported yet. I don't particularly care if people
-     want to re-license under GPL2, but I also don't want
-     to cause any unnecessary confusion. */
-  about = xfce_about_info_new("xfce4-hdaps",
-                             VERSION,
-                             _("An HDAPS Plugin for XFCE4"),
-                             XFCE_COPYRIGHT_TEXT("2009", "Michael Orlitzky"),
-                             NULL);
-  
-  xfce_about_info_set_homepage(about, PLUGIN_WEBSITE);
-  
-  xfce_about_info_add_credit(about,
-                            "Michael Orlitzky",
-                            "michael@orlitzky.com",
-                            _("A Reasonable Man"));
-
-  icon = gtk_icon_theme_load_icon(gtk_icon_theme_get_default(),
-                                 "xfce4-hdaps",
-                                 48, 0, NULL);
-  
-  dialog = xfce_about_dialog_new_with_values(NULL, about, icon);
-  xfce_about_info_free(about);
-  gtk_dialog_run(GTK_DIALOG(dialog));
-  gtk_widget_destroy(dialog);
-  g_object_unref(G_OBJECT(icon));
+  const gchar *authors[] = { "Michael Orlitzky <michael@orlitzky.com>", 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;
 }