]> gitweb.michael.orlitzky.com - xfce4-hdaps.git/blob - panel-plugin/xfce4-hdaps-dialogs.c
panel-plugin: whitespace cleanup.
[xfce4-hdaps.git] / panel-plugin / xfce4-hdaps-dialogs.c
1 /*
2 * xfce4-hdaps, an XFCE4 panel plugin for the HDAPS system.
3 *
4 * Copyright (C) 2019 Michael Orlitzky
5 *
6 * http://michael.orlitzky.com/
7 *
8 * This program is free software: you can redistribute it and/or modify
9 * it under the terms of the GNU Affero General Public License as
10 * published by the Free Software Foundation, either version 3 of the
11 * License, or (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU Affero General Public License for more details:
17 *
18 * https://www.gnu.org/licenses/agpl-3.0.html
19 *
20 */
21
22 #ifdef HAVE_CONFIG_H
23 #include <config.h>
24 #endif
25
26 #include <string.h>
27 #include <gtk/gtk.h>
28 #include <libxfce4ui/libxfce4ui.h>
29 #include <libxfce4panel/xfce-panel-plugin.h>
30 #include "xfce4-hdaps-dialogs.h"
31 #include "hdaps.h"
32
33 /* Wild guess. Actually borrowed from some code
34 I copy-and-pasted. Doesn't seem too ugly. */
35 #define DEFAULT_BORDER_WIDTH 8
36
37 /* If people can't read the README, well maybe
38 * they can do it /online/.
39 */
40 #define PLUGIN_WEBSITE "http://michael.orlitzky.com/code/xfce4-hdaps.xhtml"
41
42
43 static void hdaps_configure_response(GtkWidget *dialog,
44 gint response,
45 HdapsPlugin *hdaps) {
46
47 if (response == GTK_RESPONSE_HELP) {
48 /* Launch the user's web browser and direct them to
49 the plugin's webpage. */
50 gboolean spawn_result = g_spawn_command_line_async("exo-open --launch WebBrowser " PLUGIN_WEBSITE, NULL);
51
52 if (G_UNLIKELY(spawn_result == FALSE)) {
53 g_warning(_("Unable to open the following url: %s"), PLUGIN_WEBSITE);
54 }
55
56 return;
57 }
58
59
60 if (response == GTK_RESPONSE_OK) {
61 /* This corresponds to the "Save" button, so we
62 want to save any settings that may have changed. */
63 g_object_set_data(G_OBJECT(hdaps->plugin), "dialog", NULL);
64 hdaps->poll_frequency = gtk_spin_button_get_value_as_int((GtkSpinButton*)hdaps->sb_poll_frequency);
65 hdaps->device_name = gtk_combo_box_text_get_active_text((GtkComboBoxText*)hdaps->cb_device_name);
66 snprintf(hdaps->sysfs_file, FILENAME_MAX, UNLOAD_HEADS_FMT, hdaps->device_name);
67 hdaps_save(hdaps->plugin, hdaps);
68 hdaps_reset_timeout(hdaps);
69 }
70
71
72 /* Since there is already a "save" button, we should ignore
73 any changes that were made if the user presses "cancel"
74 instead. */
75 g_object_set_data(G_OBJECT(hdaps->plugin), "dialog", NULL);
76 xfce_panel_plugin_unblock_menu(hdaps->plugin);
77 gtk_widget_destroy(dialog);
78
79 return;
80 }
81
82
83
84 void hdaps_configure(XfcePanelPlugin *plugin,
85 HdapsPlugin *hdaps) {
86
87 /* Here comes a bunch of GTK garbage to create the
88 settings dialog. */
89
90 GtkWidget *dialog;
91 GtkWidget *label;
92 GtkWidget *vbox;
93 GtkWidget *hbox;
94 GtkSizeGroup *sg;
95
96 /* Block the plugin menu while the configuration
97 dialogue is open. Don't forget to unblock it before
98 we close. */
99 xfce_panel_plugin_block_menu(plugin);
100
101 /* Create the dialog */
102 dialog = xfce_titled_dialog_new_with_buttons(_("Hdaps Plugin"),
103 GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (plugin))),
104 GTK_DIALOG_DESTROY_WITH_PARENT,
105 "gtk-help", GTK_RESPONSE_HELP,
106 "gtk-save", GTK_RESPONSE_OK,
107 "gtk-cancel", GTK_RESPONSE_CANCEL,
108 NULL);
109
110 /* Center the dialog on screen. */
111 gtk_window_set_position(GTK_WINDOW(dialog), GTK_WIN_POS_CENTER);
112
113 /* Set dialog icon to a generic settings icon. */
114 gtk_window_set_icon_name(GTK_WINDOW(dialog), "xfce4-settings");
115
116 /* Link the dialog to the plugin, so we can destroy it in case
117 * the plugin is closed while the dialog is still open. */
118 g_object_set_data(G_OBJECT(plugin), "dialog", dialog);
119
120 /* Connect the reponse signal to the dialog. */
121 g_signal_connect(G_OBJECT (dialog), "response",
122 G_CALLBACK(hdaps_configure_response), hdaps);
123
124
125 vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, DEFAULT_BORDER_WIDTH);
126 gtk_container_set_border_width(GTK_CONTAINER(vbox), DEFAULT_BORDER_WIDTH - 2);
127 gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))),
128 vbox, TRUE, TRUE, 0);
129
130 /* Create size group to keep widgets aligned */
131 sg = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
132
133 hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, DEFAULT_BORDER_WIDTH);
134 gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
135
136 label = gtk_label_new(_("Poll Frequency:"));
137 gtk_size_group_add_widget(sg, label);
138 gtk_widget_set_halign(label, 0.0);
139 gtk_widget_set_valign(label, 0.5);
140 gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
141
142 hdaps->sb_poll_frequency = gtk_spin_button_new_with_range(100, 5000, 100);
143 gtk_spin_button_set_value((GtkSpinButton*)hdaps->sb_poll_frequency, hdaps->poll_frequency);
144
145 gtk_box_pack_start(GTK_BOX(hbox),
146 hdaps->sb_poll_frequency,
147 FALSE,
148 FALSE,
149 0);
150
151 /* Create the device name dropdown. */
152 hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, DEFAULT_BORDER_WIDTH);
153 gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
154
155 label = gtk_label_new(_("Device Name:"));
156 gtk_size_group_add_widget(sg, label);
157 gtk_widget_set_halign(label, 0.0);
158 gtk_widget_set_valign(label, 0.5);
159 gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
160
161 hdaps->cb_device_name = gtk_combo_box_text_new();
162
163 /* Add the current device name, it should always be available.
164 Oh, and it should be the default, too. */
165 gtk_combo_box_text_append_text((GtkComboBoxText*)hdaps->cb_device_name, hdaps->device_name);
166
167 /* This function takes an index, and 0 should be the first
168 (only) index at this point. */
169 gtk_combo_box_set_active((GtkComboBox*)hdaps->cb_device_name, 0);
170
171 /* Now loop through the list of available devices, adding each
172 to the list as we go. */
173 char hdaps_devices[MAX_HDAPS_DEVICES][FILENAME_MAX];
174 int found_devices = get_hdaps_device_list(hdaps_devices);
175 int list_idx = 0;
176
177 for (list_idx = 0; list_idx < found_devices; list_idx++) {
178 /* We don't want to add duplicate entries to the combo box.
179 However, at this point, the current device name should be
180 the only entry. Therefore, to avoid duplicates, we only
181 have to avoid adding the current device name a second time. */
182 if (strcmp(hdaps_devices[list_idx], hdaps->device_name) != 0) {
183 gtk_combo_box_text_append_text((GtkComboBoxText*)hdaps->cb_device_name, hdaps_devices[list_idx]);
184 }
185 }
186
187 gtk_box_pack_start(GTK_BOX(hbox), hdaps->cb_device_name, FALSE, FALSE, 0);
188
189 /* Show the dialog and all of its widgets. */
190 gtk_widget_show_all(dialog);
191 }
192
193
194
195
196 /* URI (http(s):// and mailto://) handler used on the About dialog. */
197 static void hdaps_uri_handler(GtkAboutDialog *about,
198 const gchar *uri,
199 gpointer data) {
200 gchar *cmd;
201
202 cmd = g_strdup_printf("%s %s","xdg-open", uri);
203
204 if (!g_spawn_command_line_async(cmd, NULL)) {
205 g_free(cmd);
206 cmd = g_strdup_printf("%s %s","xdg-open", uri);
207 g_spawn_command_line_async(cmd, NULL);
208 }
209 g_free(cmd);
210 }
211
212
213 void hdaps_about(XfcePanelPlugin *plugin) {
214 const gchar *authors[] = { "Michael Orlitzky <michael@orlitzky.com>", NULL };
215 const gchar *copyright = "Copyright \302\251 2012 Michael Orlitzky";
216
217 /* Use a custom URI handler for http(s):// and mailto:// URIs. The
218 default behavior apparently needs gio/gvfs to work, and I don't
219 have those installed. */
220 g_signal_connect(plugin,
221 "activate-link",
222 G_CALLBACK(hdaps_uri_handler),
223 NULL);
224
225 gtk_show_about_dialog(NULL,
226 "authors", authors,
227 "copyright", copyright,
228 "destroy-with-parent", TRUE,
229 "license", LICENSE_AGPL3,
230 "logo-icon-name", PACKAGE_NAME,
231 "icon-name", PACKAGE_NAME,
232 "program-name", PACKAGE_NAME,
233 "version", PACKAGE_VERSION,
234 "website", PLUGIN_WEBSITE,
235 "website-label", "xfce4-hdaps homepage",
236 NULL);
237 }