[Goodies-commits] r6255 - in xfce4-radio-plugin/trunk: . panel-plugin
Stefan Ott
cockroach at xfce.org
Wed Dec 3 04:23:36 CET 2008
Author: cockroach
Date: 2008-12-03 03:23:36 +0000 (Wed, 03 Dec 2008)
New Revision: 6255
Modified:
xfce4-radio-plugin/trunk/
xfce4-radio-plugin/trunk/AUTHORS
xfce4-radio-plugin/trunk/NEWS
xfce4-radio-plugin/trunk/panel-plugin/radio.c
xfce4-radio-plugin/trunk/panel-plugin/radio.h
Log:
Merged in the new-config-file-format branch
Property changes on: xfce4-radio-plugin/trunk
___________________________________________________________________
Added: svn:mergeinfo
+ /xfce4-radio-plugin/branches/newpresets:6233-6254
Modified: xfce4-radio-plugin/trunk/AUTHORS
===================================================================
--- xfce4-radio-plugin/trunk/AUTHORS 2008-12-03 03:18:11 UTC (rev 6254)
+++ xfce4-radio-plugin/trunk/AUTHORS 2008-12-03 03:23:36 UTC (rev 6255)
@@ -1 +1,5 @@
Stefan Ott <stefan at ott.net>
+
+Contributors:
+Lex Neva
+Oleg Khlystov
Modified: xfce4-radio-plugin/trunk/NEWS
===================================================================
--- xfce4-radio-plugin/trunk/NEWS 2008-12-03 03:18:11 UTC (rev 6254)
+++ xfce4-radio-plugin/trunk/NEWS 2008-12-03 03:23:36 UTC (rev 6255)
@@ -5,9 +5,11 @@
=====================
* The "thanks for all the patches"-release
* We now use a clearly-defined name for the config file (xfce4/panel/radio.rc)
+ * Switched to a new config file format (old files are auto-imported)
* Fixes for non-ASCII (eg. UTF8) station preset names
- * We now learn the maximum signal strength for the card
+ * We now auto-learn the maximum signal strength for your card
* Can now disable the synchronization with external apps
+ * New, fancy preset dialog
v0.3.1 (18 Jun 2008):
=====================
Modified: xfce4-radio-plugin/trunk/panel-plugin/radio.c
===================================================================
--- xfce4-radio-plugin/trunk/panel-plugin/radio.c 2008-12-03 03:18:11 UTC (rev 6254)
+++ xfce4-radio-plugin/trunk/panel-plugin/radio.c 2008-12-03 03:23:36 UTC (rev 6255)
@@ -22,6 +22,7 @@
#include <config.h>
#endif
+#define DEBUG 1
#include <ctype.h>
#include <string.h>
#include <unistd.h>
@@ -32,6 +33,7 @@
#include <libxfcegui4/dialogs.h>
#include <libxfcegui4/xfce-exec.h>
#include <libxfce4util/libxfce4util.h>
+#include <gdk/gdkkeysyms.h>
static int
radio_get_signal (int fd)
@@ -49,11 +51,14 @@
static gboolean
update_signal_bar (radio_gui* data)
{
- if (!data->on || !data->show_signal) {
+ if (!data->on || !data->show_signal)
+ {
gtk_widget_hide (data->signal_bar);
data->signal_timeout_id = 0;
return FALSE;
- } else {
+ }
+ else
+ {
gtk_widget_show (data->signal_bar);
double signal = radio_get_signal (data->fd);
@@ -73,7 +78,8 @@
gtk_widget_modify_bg (data->signal_bar, GTK_STATE_PRELIGHT,
&color);
- if (data->signal_timeout_id == 0) {
+ if (data->signal_timeout_id == 0)
+ {
data->signal_timeout_id = g_timeout_add(500,
(GtkFunction) update_signal_bar,
(gpointer) data);
@@ -82,23 +88,56 @@
}
}
+#define make_preset_finder(name, arg, search_arg, get_col, get_var, \
+ free, comparison) \
+ static gboolean \
+ find_preset_by_##name (GtkTreeModel *model, \
+ search_arg, \
+ GtkTreeIter *search_iter) \
+ { \
+ arg; \
+ GtkTreeIter iter; \
+ gboolean valid; \
+ valid = gtk_tree_model_get_iter_first (model, &iter); \
+ while (valid) \
+ { \
+ gtk_tree_model_get (model, &iter, \
+ get_col, get_var, -1); \
+ if (comparison) { \
+ *search_iter = iter; \
+ return TRUE; \
+ } \
+ free; \
+ valid = gtk_tree_model_iter_next (model, &iter);\
+ } \
+ return FALSE; \
+ } \
+
+make_preset_finder (freq, gint freq, gint search_freq, 1, &freq, freq = 0,
+ freq == search_freq);
+make_preset_finder (name, gchar *name, const gchar *search_name, 0, &name,
+ g_free(name), strcmp (name, search_name) == 0);
+
static void
update_tooltip (radio_gui* data)
{
GtkWidget* ebox = data->ebox;
+ GtkTreeIter iter;
+ gchar *name;
- char *text = malloc(1024);
- strcpy (text, _("Not tuned"));
- radio_preset* preset = find_preset_by_freq (data->freq, data);
-
- if (preset) {
- sprintf(text, "Tuned to %s", preset->name);
- } else {
- sprintf(text, "Tuned to %5.1f", (float) data->freq / 100);
+ GtkTreeModel *presets = GTK_TREE_MODEL (data->presets);
+ if (find_preset_by_freq (presets, data->freq, &iter))
+ {
+ gtk_tree_model_get (presets, &iter, 0, &name, -1);
}
- gtk_tooltips_set_tip (data->tooltips, ebox, text, NULL);
+ else
+ {
+ name = g_strdup_printf ("%5.1f", (float) data->freq / 100);
+ }
- free (text);
+ gtk_tooltips_set_tip (data->tooltips, ebox, name, NULL);
+
+ g_free (name);
}
static void
@@ -106,10 +145,13 @@
{
gchar *label;
- if (data->on) {
+ if (data->on)
+ {
label = g_strdup_printf ("%5.1f", ((float) data->freq) / 100);
update_tooltip (data);
- } else {
+ }
+ else
+ {
label = g_strdup (_("- off -"));
}
@@ -129,7 +171,8 @@
struct video_audio vid_aud;
long freq;
- if (!data->on) {
+ if (!data->on)
+ {
data->fd = open (data->device, O_RDONLY);
// We return TRUE to keep the timer alive, same reason as above
@@ -140,26 +183,31 @@
if (ioctl (data->fd, VIDIOCGAUDIO, &vid_aud))
perror ("VIDIOCGAUDIO");
- if (vid_aud.flags & VIDEO_AUDIO_MUTE) {
+ if (vid_aud.flags & VIDEO_AUDIO_MUTE)
+ {
close (data->fd);
- printf ("It just happened\n");
// Radio is off. Did I think it was on?
- if (data->on) {
+ if (data->on)
+ {
// manually clean up; radio_stop would call ioctl
if (data->show_signal)
gtk_widget_hide (data->signal_bar);
data->on = FALSE;
}
- } else {
+ }
+ else
+ {
// Radio is on. Did I think it was off?
- if (!data->on) {
+ if (!data->on)
+ {
// manually clean up; radio_start would tune the radio
gtk_tooltips_enable (data->tooltips);
data->on = TRUE;
}
- if (ioctl (data->fd, VIDIOCGFREQ, &freq)) {
+ if (ioctl (data->fd, VIDIOCGFREQ, &freq))
+ {
perror ("VIDIOCGFREQ");
return TRUE; // should maybe be FALSE?
}
@@ -183,7 +231,8 @@
struct video_tuner tuner;
struct video_audio vid_aud;
- if (-1 == (data->fd = open (data->device, O_RDONLY))) {
+ if (-1 == (data->fd = open (data->device, O_RDONLY)))
+ {
GtkWindow* win = GTK_WINDOW (gtk_widget_get_toplevel(
data->box));
GtkWidget* warn = gtk_message_dialog_new (win, 0,
@@ -203,7 +252,8 @@
vid_aud.flags &= ~VIDEO_AUDIO_MUTE;
if (ioctl (data->fd, VIDIOCSAUDIO, &vid_aud)) perror("VIDIOCSAUDIO");
- if (strcmp(data->startup_command, "") != 0) {
+ if (strcmp(data->startup_command, "") != 0)
+ {
xfce_exec(data->startup_command, FALSE, FALSE, NULL);
}
@@ -226,172 +276,53 @@
if (data->show_signal) gtk_widget_hide (data->signal_bar);
- if (strcmp (data->shutdown_command, "") != 0) {
+ if (strcmp (data->shutdown_command, "") != 0)
+ {
xfce_exec (data->shutdown_command, FALSE, FALSE, NULL);
}
}
-#define make_preset_finder(name, arg, comparison) \
- static radio_preset* \
- find_preset_by_##name (arg, radio_gui* data) \
- { \
- radio_preset* preset = data->presets; \
- while (preset != NULL) { \
- if (comparison) { \
- return preset; \
- } \
- preset = preset->next; \
- } \
- return NULL; \
- }
-
-make_preset_finder(name, const char* name, strcmp (preset->name, name) == 0);
-make_preset_finder(freq, int freq, preset->freq == freq);
-
-static gboolean
-add_before (radio_preset* a, radio_preset* b)
+static gint
+parse_freq (const gchar *freq_char)
{
- return (b == NULL || strcmp (a->name, b->name) < 0);
-}
+ gint mult, decimal_int;
-static gboolean
-append_to_presets (radio_preset* new_preset, radio_gui* data)
-{
- radio_preset *preset = data->presets, *prev;
+ gint freq_int = 100 * atoi (freq_char);
- if (find_preset_by_freq (new_preset->freq, data)) return FALSE;
-
- if (data->presets == NULL) {
- data->presets = new_preset;
- return TRUE;
- } else if (add_before (new_preset, data->presets)) {
- new_preset->next = data->presets;
- data->presets = new_preset;
- return TRUE;
- } else {
- while (preset != NULL) {
- prev = preset;
-
- preset = preset->next;
- if (add_before (new_preset, preset)) {
- new_preset->next = preset;
- prev->next = new_preset;
- return TRUE;
- }
- }
+ gchar *decimals = strstr (freq_char, ".");
+ if (decimals)
+ decimals++;
+ else
+ {
+ // In some languages, a comma can be used instead of a point
+ decimals = strstr (freq_char, ",");
+ if (decimals)
+ decimals++;
+ else
+ decimals = "0";
}
- return FALSE;
-}
-static radio_preset *
-pop_preset (radio_preset *target, radio_gui *data)
-{
- radio_preset *preset = data->presets, *prev;
+ decimal_int = atoi (decimals);
- while (preset != NULL) {
- if (preset->freq == target->freq) {
- if (preset == data->presets) {
- data->presets = preset->next;
- } else {
- prev->next = preset->next;
- }
- return preset;
- } else {
- prev = preset;
- }
- preset = preset->next;
- }
- return NULL;
-}
+ if (decimal_int < 10)
+ mult = 10;
+ else if (decimal_int < 100)
+ mult = 1;
+ else
+ mult = 0;
-static void
-rename_preset (GtkEditable* menu_item, void *pointer)
-{
- radio_gui* data = (radio_gui*) pointer;
- radio_preset* preset = find_preset_by_freq (data->freq, data);
- if (!preset) return;
- GtkWidget* dialog = gtk_dialog_new_with_buttons (_("Add preset"),
- NULL, GTK_DIALOG_DESTROY_WITH_PARENT,
- GTK_STOCK_OK, GTK_RESPONSE_OK,
- GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, NULL);
- GtkWidget* box = GTK_DIALOG (dialog)->vbox;
+ freq_int += mult * decimal_int;
- GtkWidget* label = gtk_label_new (_("Station name:"));
- gtk_widget_show (label);
- gtk_box_pack_start (GTK_BOX (box), label, FALSE, FALSE, 0);
-
- GtkWidget* station = gtk_entry_new();
- gtk_entry_set_text (GTK_ENTRY (station), preset->name);
- gtk_widget_show (station);
- gtk_box_pack_start (GTK_BOX (box), station, FALSE, FALSE, 0);
-
- if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_OK) {
- g_free (preset->name);
- preset->name = g_strdup (gtk_entry_get_text (GTK_ENTRY (station)));
- pop_preset (preset, data);
- append_to_presets (preset, data);
- }
- gtk_widget_destroy (dialog);
- update_tooltip (data);
- write_config (data->plugin, data);
+ return freq_int;
}
-static void
-add_preset_dialog (GtkEditable* menu_item, void *pointer)
-{
- radio_gui* data = (radio_gui*) pointer;
- GtkWindow* win = GTK_WINDOW (gtk_widget_get_toplevel (data->box));
- GtkWidget* dialog = gtk_dialog_new_with_buttons (_("Add preset"),
- NULL, GTK_DIALOG_DESTROY_WITH_PARENT,
- GTK_STOCK_OK, GTK_RESPONSE_ACCEPT,
- GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT, NULL);
- GtkWidget* box = GTK_DIALOG (dialog)->vbox;
-
- GtkWidget* label = gtk_label_new (_("Station name:"));
- gtk_widget_show (label);
- gtk_box_pack_start (GTK_BOX (box), label, FALSE, FALSE, 0);
-
- char buf[8];
- sprintf (buf, "%5.1f FM", ((float) data->freq) / 100);
- GtkWidget* station = gtk_entry_new();
- gtk_entry_set_text (GTK_ENTRY (station), buf);
- gtk_widget_show (station);
- gtk_box_pack_start (GTK_BOX (box), station, FALSE, FALSE, 0);
-
- if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT) {
- radio_preset* preset = malloc (sizeof (radio_preset));
- preset->name = g_strdup(gtk_entry_get_text (GTK_ENTRY (station)));
- preset->freq = data->freq;
- preset->next = NULL;
- if (!append_to_presets (preset, data)) {
- GtkWidget* warn = gtk_message_dialog_new(win, 0,
- GTK_MESSAGE_ERROR, GTK_BUTTONS_OK,
- _("There is already a preset with this frequency."));
- gtk_dialog_run (GTK_DIALOG (warn));
- gtk_widget_destroy (warn);
- } else {
- write_config (data->plugin, data);
- }
- }
- gtk_widget_destroy (dialog);
-}
-
static gboolean
parse_freq_and_tune (const char* freq_char, radio_gui* data)
{
- int freq_int = 100 * atoi (freq_char);
+ int freq_int = parse_freq (freq_char);
- char* decimals = strstr (freq_char, ".");
- if (!decimals) {
- decimals = "0";
- } else {
- decimals++;
- }
- int decimal_int = atoi (decimals);
- if (decimal_int > 10) return FALSE;
- freq_int += 10 * decimal_int;
-
- if (freq_int >= FREQ_MIN && freq_int <= FREQ_MAX) {
+ if (freq_int >= FREQ_MIN && freq_int <= FREQ_MAX)
+ {
data->freq = freq_int;
radio_tune (data);
return TRUE;
@@ -419,7 +350,8 @@
gtk_box_pack_start (GTK_BOX (box), freq, FALSE, FALSE, 0);
int retval;
- for (;;) {
+ for (;;)
+ {
retval = gtk_dialog_run (GTK_DIALOG (dialog));
if ( retval == GTK_RESPONSE_CANCEL ||
@@ -446,8 +378,10 @@
char *file;
XfceRc *rc;
- file = xfce_resource_save_location (XFCE_RESOURCE_CONFIG,
- RADIO_CONFIG_FILE, TRUE);
+ // Take data from a clearly defined place RADIO_CONFIG
+ file = xfce_resource_save_location (XFCE_RESOURCE_CONFIG, RADIO_CONFIG,
+ TRUE);
+
if (G_UNLIKELY (!file))
return NULL;
@@ -458,58 +392,34 @@
}
static void
-remove_preset (GtkEditable* menu_item, void *pointer)
+select_preset (GtkEditable* menu_item, radio_gui *data)
{
- radio_gui* data = (radio_gui*) pointer;
- radio_preset *preset;
-
- preset = pop_preset (find_preset_by_freq (data->freq, data), data);
-
- XfceRc *rc;
- if ((rc = get_config_rc ())) {
- char buf[6];
- sprintf(buf, "%d", preset->freq);
-
- // TODO: only delete the entry - seems broken
- //xfce_rc_set_group (rc, "presets");
- //xfce_rc_delete_entry (rc, buf, TRUE);
- xfce_rc_delete_group (rc, "presets", FALSE);
-
- if (xfce_rc_has_entry (rc, buf)) {
- printf("dammit, failed\n");
- }
-
- xfce_rc_close (rc);
+ GtkWidget* label = gtk_bin_get_child (GTK_BIN (menu_item));
+ const gchar* text = gtk_label_get_text (GTK_LABEL (label));
+ GtkTreeModel *presets = GTK_TREE_MODEL(data->presets);
+ GtkTreeIter iter;
+ if (find_preset_by_name (presets, text, &iter))
+ {
+ gtk_tree_model_get (presets, &iter, 1, &data->freq, -1);
+ radio_tune (data);
}
-
- free (preset);
-
- // TODO: becomes unneccessary as soon as the above TODO has been fixed
- write_config (data->plugin, data);
}
-static void
-select_preset (GtkEditable* menu_item, void *pointer)
-{
- radio_gui* data = (radio_gui*) pointer;
- GtkWidget* label = gtk_bin_get_child (GTK_BIN (menu_item));
- const char* text = gtk_label_get_text (GTK_LABEL (label));
- radio_preset* preset = find_preset_by_name (text, data);
- data->freq = preset->freq;
- radio_tune (data);
-}
-
static gboolean
mouse_click (GtkWidget* src, GdkEventButton *event, radio_gui* data)
{
- if (event->button == 1) {
- if (!data->on) {
+ if (event->button == 1)
+ {
+ if (!data->on)
data->on = radio_start (data);
- } else {
+ else
+ {
data->on = FALSE;
radio_stop (data);
}
- } else if (event->button == 2 && data->on) {
+ }
+ else if (event->button == 2 && data->on)
+ {
GtkWidget* menu = gtk_menu_new ();
GtkWidget* item = gtk_menu_item_new_with_label (_("Presets"));
gtk_widget_show (item);
@@ -521,16 +431,21 @@
gtk_container_add (GTK_CONTAINER (menu), separator);
gtk_widget_set_sensitive (separator, FALSE);
- radio_preset* preset = data->presets;
- while (preset != NULL) {
- item = gtk_menu_item_new_with_label (preset->name);
+ gchar *name;
+ GtkTreeModel *presets = GTK_TREE_MODEL(data->presets);
+ GtkTreeIter iter;
+
+ gboolean valid = gtk_tree_model_get_iter_first (presets, &iter);
+ while (valid)
+ {
+ gtk_tree_model_get (presets, &iter, 0, &name, -1);
+ item = gtk_menu_item_new_with_label (name);
gtk_widget_show (item);
- gtk_menu_append (menu, item);
+ g_free (name);
+ gtk_menu_shell_append (GTK_MENU_SHELL(menu), item);
g_signal_connect (GTK_WIDGET (item), "activate",
G_CALLBACK (select_preset), data);
- gtk_widget_set_sensitive (item, preset->freq !=
- data->freq);
- preset = preset->next;
+ valid = gtk_tree_model_iter_next (presets, &iter);
}
separator = gtk_separator_menu_item_new ();
@@ -538,34 +453,6 @@
gtk_container_add (GTK_CONTAINER (menu), separator);
gtk_widget_set_sensitive (separator, FALSE);
- radio_preset* current = find_preset_by_freq (data->freq, data);
-
- item = gtk_menu_item_new_with_label (_("Add preset"));
- gtk_widget_show (item);
- gtk_menu_append (menu, item);
- g_signal_connect (GTK_WIDGET (item), "activate",
- G_CALLBACK (add_preset_dialog), data);
- gtk_widget_set_sensitive (item, current == NULL);
-
- item = gtk_menu_item_new_with_label (_("Delete active preset"));
- gtk_widget_show (item);
- gtk_menu_append (menu, item);
- g_signal_connect (GTK_WIDGET (item), "activate",
- G_CALLBACK (remove_preset), data);
- gtk_widget_set_sensitive (item, current != NULL);
-
- item = gtk_menu_item_new_with_label (_("Rename active preset"));
- gtk_widget_show (item);
- gtk_menu_append (menu, item);
- g_signal_connect (GTK_WIDGET (item), "activate",
- G_CALLBACK (rename_preset), data);
- gtk_widget_set_sensitive (item, current != NULL);
-
- separator = gtk_separator_menu_item_new ();
- gtk_widget_show (separator);
- gtk_container_add (GTK_CONTAINER (menu), separator);
- gtk_widget_set_sensitive (separator, FALSE);
-
item = gtk_menu_item_new_with_label (_("Tune to frequency"));
gtk_widget_show (item);
gtk_menu_append (menu, item);
@@ -589,64 +476,60 @@
update_label (data);
update_signal_bar (data);
- write_config (data->plugin, data);
+ write_config (data, FALSE);
}
static void
-tune_to_prev_preset (radio_gui* data)
+mouse_scroll(GtkWidget* src, GdkEventScroll *event, radio_gui* data)
{
- radio_preset *preset = data->presets, *prev;
+ GtkTreePath *path;
+ GtkTreeIter iter, iter1;
+ GtkTreeModel *presets;
- if (preset->freq == data->freq) {
- while (preset->next != NULL) {
- preset = preset->next;
+ if (!data->on)
+ return;
+
+ int direction = event->direction == GDK_SCROLL_UP ? -1 : 1;
+ if (data->scroll == CHANGE_FREQ) {
+ data->freq += direction * FREQ_STEP;
+ if (data->freq > FREQ_MAX) data->freq = FREQ_MIN;
+ if (data->freq < FREQ_MIN) data->freq = FREQ_MAX;
+ radio_tune (data);
+ }
+ else if (data->scroll == CHANGE_PRESET)
+ {
+ presets = GTK_TREE_MODEL(data->presets);
+ if (!find_preset_by_freq (presets, data->freq, &iter))
+ {
+ // tune to first preset, if it exists
+ if (!gtk_tree_model_get_iter_first (presets, &iter))
+ return;
+
+ gtk_tree_model_get (presets, &iter,
+ 1, &data->freq, -1);
+ radio_tune (data);
+ return;
}
- data->freq = preset->freq;
- } else {
- prev = preset;
- while (preset != NULL) {
- if (preset->freq == data->freq) {
- data->freq = prev->freq;
- }
- prev = preset;
- preset = preset->next;
+ // preset found
+ if (direction == 1)
+ {
+ if (!gtk_tree_model_iter_next (presets, &iter))
+ return;
+ gtk_tree_model_get (presets, &iter, 1, &data->freq, -1);
+ radio_tune (data);
}
- }
- radio_tune (data);
-}
+ else
+ {
+ path = gtk_tree_model_get_path (presets, &iter);
-static void
-mouse_scroll(GtkWidget* src, GdkEventScroll *event, radio_gui* data)
-{
- if (data->on) {
- int direction = event->direction == GDK_SCROLL_UP ? -1 : 1;
- if (data->scroll == CHANGE_FREQ) {
- data->freq += direction * FREQ_STEP;
- if (data->freq > FREQ_MAX) data->freq = FREQ_MIN;
- if (data->freq < FREQ_MIN) data->freq = FREQ_MAX;
+ if (!gtk_tree_path_prev (path))
+ return;
+
+ gtk_tree_model_get_iter (presets, &iter1, path);
+ gtk_tree_path_free (path);
+ gtk_tree_model_get (presets, &iter1,
+ 1, &data->freq, -1);
radio_tune (data);
- } else if (data->scroll == CHANGE_PRESET) {
- radio_preset* preset = find_preset_by_freq
- (data->freq, data);
- if (preset) {
- // preset found
- if (direction == 1) {
- // tune to next preset
- preset = preset->next == NULL ?
- data->presets : preset->next;
- data->freq = preset->freq;
- radio_tune (data);
- } else {
- tune_to_prev_preset (data);
- }
- } else {
- // tune to first preset, if it exists
- preset = data->presets;
- if (preset) {
- data->freq = preset->freq;
- radio_tune (data);
- }
- }
}
}
}
@@ -689,14 +572,7 @@
static void
free_presets (radio_gui *data)
{
- radio_preset *preset = data->presets;
-
- while (preset != NULL) {
- free(preset);
- preset = preset->next;
- }
-
- data->presets = NULL;
+ g_object_unref (data->presets);
}
static void
@@ -728,22 +604,29 @@
// have to get the freqfact here now because someone else might
// turn on the radio
fd = open(plugin_data->device, O_RDONLY);
- if (fd != -1) {
- if (ioctl(fd, VIDIOCGTUNER, &tuner) == 0) {
+ if (fd != -1)
+ {
+ if (ioctl(fd, VIDIOCGTUNER, &tuner) == 0)
+ {
if (tuner.flags & VIDEO_TUNER_LOW)
plugin_data->freqfact = 16000;
else
plugin_data->freqfact = 16;
- } else {
+ }
+ else
+ {
plugin_data->freqfact = 16;
}
close (fd);
- } else {
+ }
+ else
+ {
plugin_data->freqfact = 16;
}
plugin_data->show_signal = TRUE;
plugin_data->auto_update_display = TRUE;
plugin_data->presets = NULL;
+ plugin_data->presets = NULL;
plugin_data->scroll = CHANGE_FREQ;
plugin_data->signal_timeout_id = 0;
plugin_data->radio_timeout_id = g_timeout_add(2000,
@@ -805,9 +688,13 @@
{
radio_gui* data = (radio_gui*) pointer;
gboolean frq = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(button));
- if (frq) {
+
+ if (frq)
+ {
data->scroll = CHANGE_FREQ;
- } else {
+ }
+ else
+ {
data->scroll = CHANGE_PRESET;
}
}
@@ -817,12 +704,170 @@
{
gtk_widget_destroy (dialog);
xfce_panel_plugin_unblock_menu (data->plugin);
- write_config (data->plugin, data);
+ write_config (data, TRUE);
}
static void
+cell_float_to_text_cb ( GtkTreeViewColumn *tree_column,
+ GtkCellRenderer *cell,
+ GtkTreeModel *tree_model,
+ GtkTreeIter *iter,
+ gpointer data)
+{
+ gint f;
+ gchar *text;
+
+ /* Get the double value from the model. */
+ gtk_tree_model_get (tree_model, iter, 1, &f, -1);
+ /* Now we can format the value ourselves. */
+ text = g_strdup_printf ("%.2f", f / 100.0);
+ g_object_set (cell, "text", text, NULL);
+ g_free (text);
+}
+
+static void
+add_button_clicked_cb (GtkWidget *widget, GtkTreeSelection *selection)
+{
+ GtkTreeIter iter;
+ GtkTreeModel *model;
+
+ radio_gui *data = g_object_get_data(G_OBJECT(selection), "data");
+
+ gtk_tree_selection_get_selected (selection, &model, &iter);
+ gtk_list_store_append (GTK_LIST_STORE(model), &iter);
+ gtk_list_store_set (GTK_LIST_STORE(model), &iter,
+ 0, _("unnamed"),
+ 1, data->freq, -1);
+ gtk_tree_selection_select_iter (selection, &iter);
+ write_config (data, TRUE);
+}
+
+static void
+del_button_clicked_cb (GtkWidget *widget, GtkTreeSelection *selection)
+{
+ GtkTreeIter iter;
+ GtkTreeModel *model;
+
+ radio_gui *data = g_object_get_data(G_OBJECT(selection), "data");
+
+ if (gtk_tree_selection_get_selected (selection, &model, &iter))
+ {
+ if (gtk_list_store_remove(GTK_LIST_STORE(model), &iter))
+ {
+ gtk_tree_selection_select_iter(selection,&iter);
+ }
+ }
+ write_config (data, TRUE);
+ update_tooltip (data);
+}
+
+static void
+up_button_clicked_cb (GtkWidget *widget, GtkTreeSelection *selection)
+{
+ GtkTreeIter iter;
+ GtkTreeModel *model;
+
+ radio_gui *data = g_object_get_data(G_OBJECT(selection), "data");
+
+ if (gtk_tree_selection_get_selected (selection, &model, &iter))
+ {
+ GtkTreePath *path = gtk_tree_model_get_path (model, &iter);
+ if (gtk_tree_path_prev (path))
+ {
+ GtkTreeIter iter1 = iter;
+ gtk_tree_model_get_iter (model, &iter1, path);
+ gtk_list_store_swap (GTK_LIST_STORE (model),
+ &iter, &iter1);
+ }
+ gtk_tree_path_free (path);
+ }
+ write_config (data, TRUE);
+ /* TODO
+ * update_tooltip берет первое попавшееся значение из нескольких
+ * с одной и той же частотой, а при перемещении записи вверх или
+ * вниз может измениться первое попавшееся значение.
+ */
+ update_tooltip (data);
+}
+
+static void
+down_button_clicked_cb (GtkWidget *widget, GtkTreeSelection *selection)
+{
+ GtkTreeIter iter;
+ GtkTreeModel *model;
+
+ radio_gui *data = g_object_get_data(G_OBJECT(selection), "data");
+
+ if (gtk_tree_selection_get_selected (selection, &model, &iter))
+ {
+ GtkTreeIter iter1 = iter;
+ if (gtk_tree_model_iter_next (model, &iter1))
+ {
+ gtk_list_store_swap (GTK_LIST_STORE (model),
+ &iter, &iter1);
+ }
+ }
+ write_config (data, TRUE);
+ // See up_button_clicked_cb
+ update_tooltip (data);
+}
+
+static gboolean
+list_view_key_press_event_cb (GtkWidget *widget, GdkEventKey *event,
+ GtkTreeSelection *data)
+{
+ if (event->keyval == GDK_Delete)
+ del_button_clicked_cb(widget, data);
+ if (event->keyval == GDK_Insert)
+ add_button_clicked_cb(widget, data);
+
+ return FALSE;
+}
+
+static void
+name_cell_edited_cb (GtkCellRendererText *cellrenderertext, gchar *path_str,
+ gchar *new_val, radio_gui *data)
+{
+ GtkTreeIter iter;
+ gboolean valid;
+
+ GtkListStore *presets = data->presets;
+ valid = gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL(presets),
+ &iter, path_str);
+ g_return_if_fail (valid == TRUE);
+
+ gtk_list_store_set (presets, &iter, 0, new_val, -1);
+ write_config (data, TRUE);
+ update_tooltip (data);
+}
+
+static void
+freq_cell_edited_cb (GtkCellRendererText *cellrenderertext, gchar *path_str,
+ gchar *new_val, radio_gui *data)
+{
+ GtkTreeIter iter;
+ gboolean valid;
+ gint value;
+
+ value = parse_freq (new_val);
+
+ if (value < FREQ_MIN) value = FREQ_MIN;
+ if (value > FREQ_MAX) value = FREQ_MAX;
+
+ GtkListStore *presets = data->presets;
+ valid = gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL(presets),
+ &iter, path_str);
+ g_return_if_fail (valid == TRUE);
+
+ gtk_list_store_set (presets, &iter, 1, value, -1);
+ write_config (data, TRUE);
+ update_tooltip (data);
+}
+
+static void
radio_plugin_create_options (XfcePanelPlugin *plugin, radio_gui *data)
{
+ DBG("%d", data->freq);
GtkWidget *table;
GtkWidget *label;
GtkWidget *hbox;
@@ -840,6 +885,16 @@
GSList *scroll_group = NULL; // scroll action:
GtkWidget *frequency_button; // - change frequency
GtkWidget *preset_button; // - change preset
+ GtkWidget *preset_box;
+ GtkWidget *button_box;
+ GtkWidget *notebook;
+ GtkWidget *label_properties;
+ GtkWidget *label_presets;
+ GtkWidget *scrolled_window;
+ GtkWidget *list_view;
+ GtkTreeSelection *selection;
+ GtkCellRenderer *cellrenderer;
+ GtkTreeViewColumn *list_column;
xfce_panel_plugin_block_menu (plugin);
@@ -855,11 +910,98 @@
g_signal_connect (dialog, "response",
G_CALLBACK (radio_plugin_dialog_response), data);
+ list_view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(data->presets));
+ gtk_widget_set_size_request(list_view, 200, 150);
+ gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(list_view), FALSE);
+ gtk_widget_show(list_view);
+
+ cellrenderer = gtk_cell_renderer_text_new();
+ g_object_set (G_OBJECT (cellrenderer),
+ "mode", GTK_CELL_RENDERER_MODE_EDITABLE,
+ "editable", TRUE, NULL);
+ list_column = gtk_tree_view_column_new_with_attributes
+ (NULL, cellrenderer, "text", 0, NULL);
+ gtk_tree_view_column_set_min_width(list_column, 300);
+ gtk_tree_view_append_column(GTK_TREE_VIEW(list_view), list_column);
+ g_signal_connect(GTK_OBJECT(cellrenderer), "edited",
+ GTK_SIGNAL_FUNC(name_cell_edited_cb), (gpointer)data);
+
+ cellrenderer = gtk_cell_renderer_text_new();
+ g_object_set (G_OBJECT (cellrenderer),
+ "mode", GTK_CELL_RENDERER_MODE_EDITABLE,
+ "editable", TRUE, \
+ "xalign", 1.0f, NULL);
+ list_column = gtk_tree_view_column_new_with_attributes
+ (NULL, cellrenderer, "text", 1, NULL);
+ gtk_tree_view_append_column(GTK_TREE_VIEW(list_view), list_column);
+ gtk_tree_view_column_set_cell_data_func (list_column, cellrenderer,
+ cell_float_to_text_cb,
+ NULL, NULL);
+ g_signal_connect(GTK_OBJECT(cellrenderer), "edited",
+ GTK_SIGNAL_FUNC(freq_cell_edited_cb), (gpointer)data);
+
+ button_box = gtk_hbox_new(FALSE, 0);
+
+ GtkWidget *add_button = gtk_button_new_from_stock(GTK_STOCK_ADD);
+ GtkWidget *del_button = gtk_button_new_from_stock(GTK_STOCK_DELETE);
+ GtkWidget *up_button = gtk_button_new_from_stock(GTK_STOCK_GO_UP);
+ GtkWidget *down_button = gtk_button_new_from_stock(GTK_STOCK_GO_DOWN);
+
+ gtk_box_pack_end(GTK_BOX(button_box), del_button, FALSE, FALSE, 0);
+ gtk_box_pack_end(GTK_BOX(button_box), add_button, FALSE, FALSE, 0);
+ gtk_box_pack_end(GTK_BOX(button_box), up_button, FALSE, FALSE, 0);
+ gtk_box_pack_end(GTK_BOX(button_box), down_button,FALSE, FALSE, 0);
+
+ selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(list_view));
+ gtk_tree_selection_set_mode(selection, GTK_SELECTION_SINGLE);
+
+ g_object_set_data(G_OBJECT(selection), "data", data);
+
+ g_signal_connect(GTK_OBJECT(add_button), "clicked",
+ GTK_SIGNAL_FUNC( add_button_clicked_cb), selection);
+ g_signal_connect(GTK_OBJECT(del_button), "clicked",
+ GTK_SIGNAL_FUNC( del_button_clicked_cb), selection);
+ g_signal_connect(GTK_OBJECT(up_button), "clicked",
+ GTK_SIGNAL_FUNC(up_button_clicked_cb), selection);
+ g_signal_connect(GTK_OBJECT(down_button), "clicked",
+ GTK_SIGNAL_FUNC(down_button_clicked_cb), selection);
+ g_signal_connect(GTK_OBJECT(list_view), "key-press-event",
+ GTK_SIGNAL_FUNC(list_view_key_press_event_cb), selection);
+
+ scrolled_window = gtk_scrolled_window_new(NULL, NULL);
+ gtk_container_add(GTK_CONTAINER(scrolled_window), list_view);
+ gtk_scrolled_window_set_shadow_type(
+ GTK_SCROLLED_WINDOW(scrolled_window),
+ GTK_SHADOW_IN);
+ gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
+ GTK_POLICY_AUTOMATIC,
+ GTK_POLICY_AUTOMATIC);
+ gtk_widget_show(scrolled_window);
+
+ preset_box = gtk_vbox_new(FALSE, 4);
+ gtk_box_pack_start(GTK_BOX(preset_box), scrolled_window,
+ TRUE, TRUE, 0);
+ gtk_box_pack_start(GTK_BOX(preset_box), button_box,
+ FALSE, FALSE, 0);
+ gtk_container_set_border_width (GTK_CONTAINER(preset_box), 4);
+ gtk_widget_show_all (preset_box);
+
table = gtk_table_new(4, 2, FALSE);
+ gtk_container_set_border_width (GTK_CONTAINER(table), 4);
gtk_widget_show(table);
- gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), table,
- FALSE, TRUE, 0);
+ notebook = gtk_notebook_new ();
+ gtk_notebook_set_tab_pos (GTK_NOTEBOOK(notebook), GTK_POS_TOP);
+ gtk_notebook_set_show_tabs (GTK_NOTEBOOK(notebook), TRUE);
+ label_properties = gtk_label_new (_("Properties"));
+ label_presets = gtk_label_new (_("Presets"));
+ gtk_notebook_append_page (GTK_NOTEBOOK(notebook), preset_box,
+ label_presets);
+ gtk_notebook_append_page (GTK_NOTEBOOK(notebook), table,
+ label_properties);
+ gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), notebook,
+ TRUE, TRUE, 0);
+ gtk_widget_show (notebook);
// V4L device
label = gtk_label_new (_("V4L device"));
@@ -1024,94 +1166,199 @@
}
static void
-write_config (XfcePanelPlugin *plugin, radio_gui *data)
+write_config_signal (XfcePanelPlugin *plugin, radio_gui *data)
{
+ write_config (data, TRUE);
+}
+
+static void
+write_config (radio_gui *data, gboolean save_presets)
+{
XfceRc *rc;
- if ((rc = get_config_rc ())) {
- xfce_rc_set_group (rc, "radio plugin");
+ int i;
- xfce_rc_write_entry (rc, "dev", data->device);
- xfce_rc_write_entry (rc, "startup_cmd",
- data->startup_command);
- xfce_rc_write_entry (rc, "shutdown_cmd",
- data->shutdown_command);
- xfce_rc_write_int_entry (rc, "frq", data->freq);
- xfce_rc_write_int_entry (rc, "scroll", data->scroll);
- xfce_rc_write_bool_entry(rc, "show_signal", data->show_signal);
- xfce_rc_write_bool_entry(rc, "update_display",
+ if (!(rc = get_config_rc ()))
+ return;
+
+ xfce_rc_set_group (rc, "radio plugin");
+
+ xfce_rc_write_entry (rc, "dev", data->device);
+ xfce_rc_write_entry (rc, "startup_cmd", data->startup_command);
+ xfce_rc_write_entry (rc, "shutdown_cmd", data->shutdown_command);
+
+ xfce_rc_write_int_entry (rc, "frq", data->freq);
+ xfce_rc_write_int_entry (rc, "scroll", data->scroll);
+ xfce_rc_write_bool_entry(rc, "show_signal", data->show_signal);
+ xfce_rc_write_bool_entry(rc, "update_display",
data->auto_update_display);
- xfce_rc_set_group (rc, "presets");
+ if (!save_presets)
+ {
+ xfce_rc_close (rc);
+ return;
+ }
- radio_preset *preset = data->presets;
+ gchar *name;
+ gint freq;
+ GtkTreeIter iter;
+ GtkTreeModel *presets = GTK_TREE_MODEL(data->presets);
+ gboolean valid = gtk_tree_model_get_iter_first (presets, &iter);
- char buf[6];
-
- while (preset != NULL) {
- sprintf(buf, "%d", preset->freq);
- xfce_rc_write_entry (rc, buf, preset->name);
- preset = preset->next;
+ // We start at 10 since there seems to be a problem loading keys which
+ // are only 1 char long
+ i = 10;
+ while (valid)
+ {
+ if (i == 10)
+ {
+ xfce_rc_delete_group (rc, PRESET_NAMES, FALSE);
+ xfce_rc_delete_group (rc, PRESET_FREQS, FALSE);
}
- xfce_rc_close (rc);
+ gtk_tree_model_get (presets, &iter, 0, &name, 1, &freq, -1);
+ gchar *key = g_strdup_printf ("%d", i);
+ DBG("freq=%d, name=%s", freq, name);
+
+ xfce_rc_set_group (rc, PRESET_NAMES);
+ xfce_rc_write_entry (rc, key, name);
+ xfce_rc_set_group (rc, PRESET_FREQS);
+ xfce_rc_write_int_entry (rc, key, freq);
+
+ g_free (name);
+ g_free (key);
+ i++;
+ valid = gtk_tree_model_iter_next (presets, &iter);
}
+ xfce_rc_close (rc);
}
static void
-read_config (XfcePanelPlugin *plugin, radio_gui *data)
+import_old_config (XfcePanelPlugin *plugin, radio_gui *data)
{
const char *value;
+ char *file;
XfceRc *rc;
- if (!(rc = get_config_rc (plugin)))
+ // Abort if there's nothing to be imported
+ if (!(file = xfce_panel_plugin_lookup_rc_file (plugin)))
return;
+ DBG ("Importing data from old conig file %s", file);
+
+ rc = xfce_rc_simple_open (file, TRUE);
+ g_free (file);
+
+ if (!rc)
+ return;
+
xfce_rc_set_group (rc, "radio plugin");
data->freq = xfce_rc_read_int_entry (rc, "frq", FREQ_INIT);
data->scroll = xfce_rc_read_int_entry (rc, "scroll", CHANGE_FREQ);
data->show_signal = xfce_rc_read_bool_entry (rc, "show_signal", TRUE);
- data->auto_update_display = xfce_rc_read_bool_entry
- (rc, "update_display", TRUE);
- if ((value = xfce_rc_read_entry (rc, "dev", NULL)) && *value) {
+ if ((value = xfce_rc_read_entry (rc, "dev", NULL)) && *value)
strncpy (data->device, value, MAX_DEVICE_NAME_LENGTH);
- }
- if ((value = xfce_rc_read_entry (rc, "startup_cmd", NULL)) && *value) {
+ if ((value = xfce_rc_read_entry (rc, "startup_cmd", NULL)) && *value)
strncpy (data->startup_command, value, MAX_COMMAND_LENGTH);
- }
- if ((value = xfce_rc_read_entry (rc, "shutdown_cmd", NULL)) && *value) {
+ if ((value = xfce_rc_read_entry (rc, "shutdown_cmd", NULL)) && *value)
strncpy (data->shutdown_command, value, MAX_COMMAND_LENGTH);
- }
- free_presets (data);
+ GtkTreeIter iter;
+ GtkListStore *presets = data->presets;
gchar** entries = xfce_rc_get_entries (rc, "presets");
- if (entries != NULL) {
- gchar** entry;
+ if (entries != NULL)
+ {
+ gchar **entry;
entry = entries;
xfce_rc_set_group (rc, "presets");
- while (*entry) {
+ while (*entry)
+ {
if ((value = xfce_rc_read_entry (rc, *entry, NULL))
- && *value) {
- radio_preset *preset =
- malloc (sizeof (radio_preset));
- preset->next = NULL;
-// g_free (preset->name);
- preset->name = g_strdup(value);
- preset->freq = atoi (*entry);
- append_to_presets (preset, data);
+ && *value)
+ {
+ gint vfreq = atoi (*entry);
+ const gchar *vname = value;
+
+ DBG("freq=%d, name=%s", vfreq, vname);
+
+ gtk_list_store_append (presets, &iter);
+ gtk_list_store_set (presets, &iter, 0, vname,
+ 1, vfreq, -1);
}
entry++;
}
}
g_strfreev (entries);
xfce_rc_close (rc);
+
+ write_config (data, TRUE);
}
static void
+read_config (XfcePanelPlugin *plugin, radio_gui *data)
+{
+ const char *value;
+ XfceRc *rc;
+
+ if (!(rc = get_config_rc ()))
+ return;
+
+ xfce_rc_set_group (rc, "radio plugin");
+
+ data->freq = xfce_rc_read_int_entry (rc, "frq", FREQ_INIT);
+ data->scroll = xfce_rc_read_int_entry (rc, "scroll", CHANGE_FREQ);
+ data->show_signal = xfce_rc_read_bool_entry (rc, "show_signal", TRUE);
+ data->auto_update_display = xfce_rc_read_bool_entry
+ (rc, "update_display", TRUE);
+
+ if ((value = xfce_rc_read_entry (rc, "dev", NULL)) && *value)
+ strncpy (data->device, value, MAX_DEVICE_NAME_LENGTH);
+
+ if ((value = xfce_rc_read_entry (rc, "startup_cmd", NULL)) && *value)
+ strncpy (data->startup_command, value, MAX_COMMAND_LENGTH);
+
+ if ((value = xfce_rc_read_entry (rc, "shutdown_cmd", NULL)) && *value)
+ strncpy (data->shutdown_command, value, MAX_COMMAND_LENGTH);
+
+ GtkTreeIter iter;
+ g_return_if_fail (data->presets == NULL);
+ data->presets = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_INT);
+ GtkListStore *presets = data->presets;
+
+ gchar** names = xfce_rc_get_entries (rc, PRESET_NAMES);
+ gchar** freqs = xfce_rc_get_entries (rc, PRESET_FREQS);
+
+ if (names == NULL || freqs == NULL) {
+ import_old_config (plugin, data);
+ xfce_rc_close (rc);
+ return;
+ }
+ gchar **ename = names;
+ gchar **efreq = freqs;
+
+ while (*ename || *efreq)
+ {
+ xfce_rc_set_group (rc, PRESET_NAMES);
+ const gchar *vname = xfce_rc_read_entry (rc, *ename,
+ _(DEFAULT_NAME));
+ xfce_rc_set_group (rc, PRESET_FREQS);
+ gint vfreq = xfce_rc_read_int_entry (rc, *efreq, FREQ_MIN);
+ DBG("freq=%d, name=%s", vfreq, vname);
+
+ gtk_list_store_append (presets, &iter);
+ gtk_list_store_set (presets, &iter, 0, vname, 1, vfreq, -1);
+ ename++; efreq++;
+ }
+ g_strfreev (names);
+ g_strfreev (freqs);
+ xfce_rc_close (rc);
+}
+
+static void
radio_plugin_construct (XfcePanelPlugin *plugin)
{
xfce_textdomain (GETTEXT_PACKAGE, PACKAGE_LOCALE_DIR, "UTF-8");
@@ -1126,7 +1373,8 @@
g_signal_connect (plugin, "size-changed", G_CALLBACK
(radio_plugin_set_size), data);
g_signal_connect (plugin, "free-data", G_CALLBACK (radio_free), data);
- g_signal_connect (plugin, "save", G_CALLBACK (write_config), data);
+ g_signal_connect (plugin, "save", G_CALLBACK (write_config_signal),
+ data);
}
XFCE_PANEL_PLUGIN_REGISTER_EXTERNAL (radio_plugin_construct);
Modified: xfce4-radio-plugin/trunk/panel-plugin/radio.h
===================================================================
--- xfce4-radio-plugin/trunk/panel-plugin/radio.h 2008-12-03 03:18:11 UTC (rev 6254)
+++ xfce4-radio-plugin/trunk/panel-plugin/radio.h 2008-12-03 03:23:36 UTC (rev 6255)
@@ -42,8 +42,12 @@
#define BORDER 8
-#define RADIO_CONFIG_FILE "xfce4/panel/radio.rc"
+#define DEFAULT_NAME "unnamed"
+#define PRESET_NAMES "preset_names"
+#define PRESET_FREQS "preset_freqs"
+const char RADIO_CONFIG[] = "xfce4/panel/radio.rc";
+
typedef enum {
CHANGE_FREQ,
CHANGE_PRESET
@@ -76,7 +80,7 @@
char device [MAX_DEVICE_NAME_LENGTH];
char startup_command [MAX_COMMAND_LENGTH];
char shutdown_command [MAX_COMMAND_LENGTH];
- radio_preset* presets;
+ GtkListStore* presets;
mouse_scroll_reaction scroll;
// this seems to be card specific and we can't seem to get the maximum
@@ -87,6 +91,7 @@
} radio_gui;
static void radio_tune (radio_gui*);
-static radio_preset* find_preset_by_freq (int, radio_gui*);
+//static radio_preset* find_preset_by_freq (int, radio_gui*);
static void read_config (XfcePanelPlugin *, radio_gui *);
-static void write_config (XfcePanelPlugin *, radio_gui *);
+//static void write_config (XfcePanelPlugin *, radio_gui *);
+static void write_config (radio_gui *i, gboolean);
More information about the Goodies-commits
mailing list