* We start by getting every device in the sysfs
* block device directory, and then eliminate those
* which don't have an unload_heads entry.
- */
+ */
int list_idx = 0;
DIR *dp;
struct dirent *ep;
dp = opendir(SYSFS_BLOCK_DEVICE_DIR);
-
+
if (dp != NULL) {
while ((ep = readdir(dp)) && list_idx < MAX_HDAPS_DEVICES) {
/* This next test covers "." and ".." too. */
int slurp_file(const char* filename, char* buf, int max_bytes) {
/* This function just reads the contents of filename
* into buf, and returns the number of bytes read.
- */
+ */
if (filename == NULL || buf == NULL) {
/* HDAPS_SUPER_BAD_ERROR */
return HDAPS_ERROR;
}
-
+
/* Return an error value by default. */
int bytes_read = HDAPS_ERROR;
int fd = open(filename, O_RDONLY);
-
+
if (fd < 0) {
/* open() didn't work. Report the error, and bail. */
fprintf(stderr, "open(%s): %s\n", filename, strerror(errno));
return HDAPS_ERROR;
- }
+ }
bytes_read = read(fd, buf, max_bytes-1);
-
+
if (bytes_read < 0) {
/* Why did we read fewer than 0 bytes? */
fprintf(stderr, "read(%s): %s\n", filename, strerror(errno));
/* Null-terminate buf if read() worked. */
buf[bytes_read] = 0;
}
-
+
if (close(fd)) {
/* Oh hey we should be able to close the file, too. */
- fprintf(stderr, "close(%s): %s\n", filename, strerror(errno));
+ fprintf(stderr, "close(%s): %s\n", filename, strerror(errno));
}
-
+
return bytes_read;
}
int parse_int_from_file(const char* filename) {
/* Read an integer from a file. We expect the file
to contain an integer (although in string form). */
-
+
char buf[MAX_FILE_CONTENTS_SIZE];
int bytes_read = slurp_file(filename, buf, sizeof(buf));
/* 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);
}
-
+
return;
}
-
+
if (response == GTK_RESPONSE_OK) {
/* This corresponds to the "Save" button, so we
want to save any settings that may have changed. */
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. */
void hdaps_configure(XfcePanelPlugin *plugin,
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. */
g_signal_connect(G_OBJECT (dialog), "response",
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);
-
+
/* Create size group to keep widgets aligned */
sg = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
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_box_pack_start(GTK_BOX(hbox),
hdaps->sb_poll_frequency,
FALSE,
/* 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);
-
+
/* 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
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);
}
void hdaps_save(XfcePanelPlugin *plugin, HdapsPlugin *hdaps) {
-
+
XfceRc *rc;
gchar *file;
DBG("Failed to open the configuration file. Bailing.");
return;
}
-
-
+
+
/* Write any user-configured values to the resource file. */
if (hdaps->device_name) {
xfce_rc_write_entry(rc, "device_name", hdaps->device_name);
}
-
+
xfce_rc_write_int_entry(rc, "poll_frequency", hdaps->poll_frequency);
-
+
/* close the rc file */
xfce_rc_close(rc);
}
if (hdaps->icon) {
gtk_widget_destroy(hdaps->icon);
}
-
+
if (icon) {
hdaps->icon = gtk_image_new_from_pixbuf(icon);
g_object_unref(G_OBJECT(icon));
gtk_box_pack_start(GTK_BOX(hdaps->hvbox), GTK_WIDGET(hdaps->icon), FALSE, FALSE, 0);
gtk_widget_show(hdaps->icon);
-
+
return;
}
static void hdaps_read(HdapsPlugin *hdaps) {
-
+
XfceRc *rc;
gchar *file;
const gchar *saved_device_name;
DBG("Retaining default settings.");
return;
}
-
+
/* Open the config file read-only. */
rc = xfce_rc_simple_open(file, TRUE);
DBG("Retaining default settings.");
return;
}
-
+
/* Read the settings, one at a time. */
-
+
/* We use saved_device_name here because we need
to dupe the string after we read it in from the
config file. */
hdaps->poll_frequency = xfce_rc_read_int_entry(rc,
"poll_frequency",
DEFAULT_POLL_FREQUENCY);
-
+
/* And close the config file. */
xfce_rc_close(rc);
}
/* The HdapsPlugin gets a copy of the XfcePanelPlugin. */
hdaps->plugin = plugin;
-
+
/* Set default values right before reading in the user's settings.
This way, hdaps_read() doesn't have to set defaults on error
conditions. */
hdaps_set_defaults(hdaps);
-
+
/* Read any user settings into the HdapsPlugin. */
hdaps_read(hdaps);
hdaps->previous_status = HDAPS_OFF;
hdaps_set_icon(hdaps, HDAPS_OFF);
hdaps_set_tooltip(hdaps, HDAPS_OFF);
-
+
return hdaps;
}
static void hdaps_free(XfcePanelPlugin *plugin,
HdapsPlugin *hdaps) {
-
+
GtkWidget *dialog;
/* Destroy the dialog if it's still open. */
static void hdaps_orientation_changed(XfcePanelPlugin *plugin,
GtkOrientation orientation,
HdapsPlugin *hdaps) {
-
+
/* Change the plugin's orientation. Basically magic to me. */
gtk_orientable_set_orientation(GTK_ORIENTABLE(hdaps->hvbox), orientation);
}
static gboolean hdaps_size_changed(XfcePanelPlugin *plugin,
gint size,
HdapsPlugin *hdaps) {
-
+
GtkOrientation orientation;
/* Get the current orientation of the plugin. */
static gboolean hdaps_update_status(HdapsPlugin *hdaps) {
/* This checks the status of HDAPS and updates the
- widget accordingly. */
+ widget accordingly. */
/* This just gets the status. */
int status = parse_int_from_file(hdaps->sysfs_file);
if (status > 0) {
status = HDAPS_ON;
}
-
+
if (status != hdaps->previous_status) {
/* And we only update the icon if we need to. */
hdaps_set_icon(hdaps, status);
hdaps_set_tooltip(hdaps, status);
hdaps->previous_status = status;
}
-
+
return TRUE;
}
/* Show the "about" right-click menu item, and
connect its event handler. */
- xfce_panel_plugin_menu_show_about(plugin);
+ xfce_panel_plugin_menu_show_about(plugin);
g_signal_connect(G_OBJECT(plugin), "about",
G_CALLBACK(hdaps_about), hdaps);
typedef struct {
XfcePanelPlugin *plugin;
-
+
/* Panel widgets */
GtkWidget *eventbox;
GtkWidget *hvbox;
/* Keep track of the previous status so we don't update the
icon every poll_frequency for no reason. */
int previous_status;
-
+
/* Settings */
gchar *device_name;
gint poll_frequency;
-
+
/* Pseudo-setting, updated whenever device_name is. */
char sysfs_file[FILENAME_MAX];
-
- /* Configuration dialog widgets */
+
+ /* Configuration dialog widgets */
GtkWidget *sb_poll_frequency; /* Spinners on all our rides, yo. */
GtkWidget *cb_device_name; /* The "Device name" combo box. */
-
-
+
+
} HdapsPlugin;
void hdaps_save(XfcePanelPlugin *plugin,