2 * xfce4-hdaps, an XFCE4 panel plugin for the HDAPS system.
4 * Copyright (C) 2019 Michael Orlitzky
6 * http://michael.orlitzky.com/
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.
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:
18 * https://www.gnu.org/licenses/agpl-3.0.html
28 #include <libxfce4ui/libxfce4ui.h>
29 #include <libxfce4panel/xfce-panel-plugin.h>
30 #include "xfce4-hdaps-dialogs.h"
33 /* Wild guess. Actually borrowed from some code
34 I copy-and-pasted. Doesn't seem too ugly. */
35 #define DEFAULT_BORDER_WIDTH 8
37 /* If people can't read the README, well maybe
38 * they can do it /online/.
40 #define PLUGIN_WEBSITE "http://michael.orlitzky.com/code/xfce4-hdaps.xhtml"
43 static void hdaps_configure_response(GtkWidget
*dialog
,
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
);
52 if (G_UNLIKELY(spawn_result
== FALSE
)) {
53 g_warning(_("Unable to open the following url: %s"), PLUGIN_WEBSITE
);
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
);
72 /* Since there is already a "save" button, we should ignore
73 any changes that were made if the user presses "cancel"
75 g_object_set_data(G_OBJECT(hdaps
->plugin
), "dialog", NULL
);
76 xfce_panel_plugin_unblock_menu(hdaps
->plugin
);
77 gtk_widget_destroy(dialog
);
84 void hdaps_configure(XfcePanelPlugin
*plugin
,
87 /* Here comes a bunch of GTK garbage to create the
96 /* Block the plugin menu while the configuration
97 dialogue is open. Don't forget to unblock it before
99 xfce_panel_plugin_block_menu(plugin
);
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_STOCK_HELP
, GTK_RESPONSE_HELP
,
106 GTK_STOCK_SAVE
, GTK_RESPONSE_OK
,
107 GTK_STOCK_CANCEL
, GTK_RESPONSE_CANCEL
,
110 /* Center the dialog on screen. */
111 gtk_window_set_position(GTK_WINDOW(dialog
), GTK_WIN_POS_CENTER
);
113 /* Set dialog icon to a generic settings icon. */
114 gtk_window_set_icon_name(GTK_WINDOW(dialog
), "xfce4-settings");
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
);
120 /* Connect the reponse signal to the dialog. */
121 g_signal_connect(G_OBJECT (dialog
), "response",
122 G_CALLBACK(hdaps_configure_response
), hdaps
);
125 vbox
= gtk_vbox_new(FALSE
, 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(dialog
)->vbox
), vbox
, TRUE
, TRUE
, 0);
129 /* Create size group to keep widgets aligned */
130 sg
= gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL
);
132 hbox
= gtk_hbox_new(FALSE
, DEFAULT_BORDER_WIDTH
);
133 gtk_box_pack_start(GTK_BOX(vbox
), hbox
, FALSE
, FALSE
, 0);
135 label
= gtk_label_new(_("Poll Frequency:"));
136 gtk_size_group_add_widget(sg
, label
);
137 gtk_widget_set_halign(label
, 0.0);
138 gtk_widget_set_valign(label
, 0.5);
139 gtk_box_pack_start(GTK_BOX(hbox
), label
, FALSE
, FALSE
, 0);
141 hdaps
->sb_poll_frequency
= gtk_spin_button_new_with_range(100, 5000, 100);
142 gtk_spin_button_set_value((GtkSpinButton
*)hdaps
->sb_poll_frequency
, hdaps
->poll_frequency
);
144 gtk_box_pack_start(GTK_BOX(hbox
),
145 hdaps
->sb_poll_frequency
,
150 /* Create the device name dropdown. */
151 hbox
= gtk_hbox_new(FALSE
, DEFAULT_BORDER_WIDTH
);
152 gtk_box_pack_start(GTK_BOX(vbox
), hbox
, FALSE
, FALSE
, 0);
154 label
= gtk_label_new(_("Device Name:"));
155 gtk_size_group_add_widget(sg
, label
);
156 gtk_widget_set_halign(label
, 0.0);
157 gtk_widget_set_valign(label
, 0.5);
158 gtk_box_pack_start(GTK_BOX(hbox
), label
, FALSE
, FALSE
, 0);
160 hdaps
->cb_device_name
= gtk_combo_box_text_new();
162 /* Add the current device name, it should always be available.
163 Oh, and it should be the default, too. */
164 gtk_combo_box_text_append_text((GtkComboBoxText
*)hdaps
->cb_device_name
, hdaps
->device_name
);
166 /* This function takes an index, and 0 should be the first
167 (only) index at this point. */
168 gtk_combo_box_set_active((GtkComboBox
*)hdaps
->cb_device_name
, 0);
170 /* Now loop through the list of available devices, adding each
171 to the list as we go. */
172 char hdaps_devices
[MAX_HDAPS_DEVICES
][FILENAME_MAX
];
173 int found_devices
= get_hdaps_device_list(hdaps_devices
);
176 for (list_idx
= 0; list_idx
< found_devices
; list_idx
++) {
177 /* We don't want to add duplicate entries to the combo box.
178 However, at this point, the current device name should be
179 the only entry. Therefore, to avoid duplicates, we only
180 have to avoid adding the current device name a second time. */
181 if (strcmp(hdaps_devices
[list_idx
], hdaps
->device_name
) != 0) {
182 gtk_combo_box_text_append_text((GtkComboBoxText
*)hdaps
->cb_device_name
, hdaps_devices
[list_idx
]);
186 gtk_box_pack_start(GTK_BOX(hbox
), hdaps
->cb_device_name
, FALSE
, FALSE
, 0);
188 /* Show the dialog and all of its widgets. */
189 gtk_widget_show_all(dialog
);
195 /* URL handler used on the About dialog. */
196 static void hdaps_url_handler(GtkAboutDialog
*about
,
201 cmd
= g_strdup_printf("%s %s","xdg-open", link
);
203 /* Stolen from xfce4-power-manager. */
204 if (!g_spawn_command_line_async(cmd
, NULL
)) {
206 cmd
= g_strdup_printf("%s %s","xfbrowser4", link
);
207 g_spawn_command_line_async(cmd
, NULL
);
213 /* Email address handler used on the About dialog. */
214 static void hdaps_mailto_handler(GtkAboutDialog
*about
,
217 gchar
*cmd
= g_strdup_printf( "%s %s", "xdg-email", link
);
219 g_spawn_command_line_async(cmd
, NULL
);
224 void hdaps_about(XfcePanelPlugin
*plugin
) {
225 const gchar
*authors
[] = { "Michael Orlitzky <michael@orlitzky.com>", NULL
};
226 const gchar
*copyright
= "Copyright \302\251 2012 Michael Orlitzky";
228 gtk_about_dialog_set_url_hook(hdaps_url_handler
, NULL
, NULL
);
229 gtk_about_dialog_set_email_hook(hdaps_mailto_handler
, NULL
, NULL
);
231 gtk_show_about_dialog(NULL
,
233 "copyright", copyright
,
234 "destroy-with-parent", TRUE
,
235 "license", LICENSE_AGPL3
,
236 "logo-icon-name", PACKAGE_NAME
,
237 "icon-name", PACKAGE_NAME
,
238 "program-name", PACKAGE_NAME
,
239 "version", PACKAGE_VERSION
,
240 "website", PLUGIN_WEBSITE
,
241 "website-label", "xfce4-hdaps homepage",