summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/main.c22
-rw-r--r--src/settings.c125
-rw-r--r--src/settings.h56
-rw-r--r--src/ui_act.c33
4 files changed, 95 insertions, 141 deletions
diff --git a/src/main.c b/src/main.c
index 426d566..fd43c40 100644
--- a/src/main.c
+++ b/src/main.c
@@ -52,6 +52,7 @@ THE SOFTWARE.
#include "terminal.h"
#include "config.h"
#include "ui.h"
+#include "ui_act.h"
#include "ui_readline.h"
int main (int argc, char **argv) {
@@ -74,7 +75,6 @@ int main (int argc, char **argv) {
struct pollfd polls[2];
nfds_t pollsLen = 0;
char buf = '\0';
- BarKeyShortcut_t *curShortcut = NULL;
/* terminal attributes _before_ we started messing around with ~ECHO */
struct termios termOrig;
@@ -301,15 +301,25 @@ int main (int argc, char **argv) {
curFd = ctlFd;
}
buf = fgetc (curFd);
- curShortcut = settings.keys;
- while (curShortcut != NULL) {
- if (curShortcut->key == buf) {
- curShortcut->cmd (&ph, &player, &settings, &playlist,
+ size_t i;
+ for (i = 0; i < BAR_KS_COUNT; i++) {
+ if (settings.keys[i] == buf) {
+ BarKeyShortcutFunc_t idToF[] = {BarUiActHelp,
+ BarUiActLoveSong, BarUiActBanSong,
+ BarUiActAddMusic, BarUiActCreateStation,
+ BarUiActDeleteStation, BarUiActExplain,
+ BarUiActStationFromGenre, BarUiActHistory,
+ BarUiActSongInfo, BarUiActAddSharedStation,
+ BarUiActMoveSong, BarUiActSkipSong, BarUiActPause,
+ BarUiActQuit, BarUiActRenameStation,
+ BarUiActSelectStation, BarUiActTempBanSong,
+ BarUiActPrintUpcoming, BarUiActSelectQuickMix,
+ BarUiActDebug};
+ idToF[i] (&ph, &player, &settings, &playlist,
&curStation, &songHistory, &doQuit, curFd);
break;
}
- curShortcut = curShortcut->next;
}
}
diff --git a/src/settings.c b/src/settings.c
index d2853e8..31690e6 100644
--- a/src/settings.c
+++ b/src/settings.c
@@ -31,7 +31,6 @@ THE SOFTWARE.
#include "settings.h"
#include "config.h"
-#include "ui_act.h"
/* tries to guess your config dir; somehow conforming to
* http://standards.freedesktop.org/basedir-spec/basedir-spec-0.6.html
@@ -72,19 +71,6 @@ void BarSettingsInit (BarSettings_t *settings) {
* @oaram pointer to struct
*/
void BarSettingsDestroy (BarSettings_t *settings) {
- BarKeyShortcut_t *curShortcut = settings->keys, *lastShortcut;
-
- while (curShortcut != NULL) {
- lastShortcut = curShortcut;
- curShortcut = curShortcut->next;
- if (lastShortcut->description != NULL) {
- free (lastShortcut->description);
- }
- if (lastShortcut->configKey != NULL) {
- free (lastShortcut->configKey);
- }
- free (lastShortcut);
- }
free (settings->controlProxy);
free (settings->username);
free (settings->password);
@@ -95,35 +81,6 @@ void BarSettingsDestroy (BarSettings_t *settings) {
memset (settings, 0, sizeof (*settings));
}
-/* copy key shortcut into settings structure
- * @param shortcut to be copied
- * @param destination settings structure
- */
-static void BarSettingsAppendKey (BarKeyShortcut_t *shortcut,
- BarSettings_t *settings) {
- BarKeyShortcut_t *tmp = calloc (1, sizeof (*tmp));
-
- /* copy shortcut */
- memcpy (tmp, shortcut, sizeof (*tmp));
- if (shortcut->description != NULL) {
- tmp->description = strdup (shortcut->description);
- }
- if (shortcut->configKey != NULL) {
- tmp->configKey = strdup (shortcut->configKey);
- }
-
- /* insert into linked list */
- if (settings->keys == NULL) {
- settings->keys = tmp;
- } else {
- BarKeyShortcut_t *curShortcut = settings->keys;
- while (curShortcut->next != NULL) {
- curShortcut = curShortcut->next;
- }
- curShortcut->next = tmp;
- }
-}
-
/* read app settings from file; format is: key = value\n
* @param where to save these settings
* @return nothing yet
@@ -133,46 +90,17 @@ void BarSettingsRead (BarSettings_t *settings) {
char configfile[1024], key[256], val[256];
size_t i;
FILE *configfd;
- BarKeyShortcut_t *curShortcut;
- BarKeyShortcut_t defaultKeys[] = {
- {'?', BarUiActHelp, NULL, "act_help", NULL},
- {'+', BarUiActLoveSong, "love current song", "act_songlove",
- NULL},
- {'-', BarUiActBanSong, "ban current song", "act_songban", NULL},
- {'a', BarUiActAddMusic, "add music to current station",
- "act_stationaddmusic", NULL},
- {'c', BarUiActCreateStation, "create new station",
- "act_stationcreate", NULL},
- {'d', BarUiActDeleteStation, "delete current station",
- "act_stationdelete", NULL},
- {'e', BarUiActExplain, "explain why this song is played",
- "act_songexplain", NULL},
- {'g', BarUiActStationFromGenre, "add genre station",
- "act_stationaddbygenre", NULL},
- {'h', BarUiActHistory, "song history",
- "act_history", NULL},
- {'i', BarUiActSongInfo,
- "print information about current song/station",
- "act_songinfo", NULL},
- {'j', BarUiActAddSharedStation, "add shared station",
- "act_addshared", NULL},
- {'m', BarUiActMoveSong, "move song to different station",
- "act_songmove", NULL},
- {'n', BarUiActSkipSong, "next song", "act_songnext", NULL},
- {'p', BarUiActPause, "pause/continue", "act_songpause", NULL},
- {'q', BarUiActQuit, "quit", "act_quit", NULL},
- {'r', BarUiActRenameStation, "rename current station",
- "act_stationrename", NULL},
- {'s', BarUiActSelectStation, "change station",
- "act_stationchange", NULL},
- {'t', BarUiActTempBanSong, "tired (ban song for 1 month)",
- "act_songtired", NULL},
- {'u', BarUiActPrintUpcoming, "upcoming songs", "act_upcoming",
- NULL},
- {'x', BarUiActSelectQuickMix, "select quickmix stations",
- "act_stationselectquickmix", NULL},
- {'$', BarUiActDebug, NULL,
- "act_debug", NULL},
+ /* _must_ have same order as in BarKeyShortcutId_t */
+ const char defaultKeys[] = {'?', '+', '-', 'a', 'c', 'd', 'e', 'g',
+ 'h', 'i', 'j', 'm', 'n', 'p', 'q', 'r', 's', 't', 'u', 'x', '$'};
+ const char *shortcutFileKeys[] = {
+ "act_help", "act_songlove", "act_songban", "act_stationaddmusic",
+ "act_stationcreate", "act_stationdelete", "act_songexplain",
+ "act_stationaddbygenre", "act_history", "act_songinfo",
+ "act_addshared", "act_songmove", "act_songnext", "act_songpause",
+ "act_quit", "act_stationrename", "act_stationchange",
+ "act_songtired", "act_upcoming", "act_stationselectquickmix",
+ "act_debug"
};
/* apply defaults */
@@ -184,14 +112,10 @@ void BarSettingsRead (BarSettings_t *settings) {
#endif
#endif
settings->history = 5;
+ memcpy (settings->keys, defaultKeys, sizeof (defaultKeys));
BarGetXdgConfigDir (PACKAGE "/config", configfile, sizeof (configfile));
if ((configfd = fopen (configfile, "r")) == NULL) {
- /* use default keyboard shortcuts */
- for (i = 0; i < sizeof (defaultKeys) / sizeof (*defaultKeys);
- i++) {
- BarSettingsAppendKey (&defaultKeys[i], settings);
- }
return;
}
@@ -218,11 +142,9 @@ void BarSettingsRead (BarSettings_t *settings) {
settings->lastfmScrobblePercent = atoi (val);
} else if (memcmp ("act_", key, 4) == 0) {
/* keyboard shortcuts */
- for (i = 0; i < sizeof (defaultKeys) / sizeof (*defaultKeys);
- i++) {
- if (strcmp (defaultKeys[i].configKey, key) == 0) {
- defaultKeys[i].key = val[0];
- BarSettingsAppendKey (&defaultKeys[i], settings);
+ for (i = 0; i < BAR_KS_COUNT; i++) {
+ if (strcmp (shortcutFileKeys[i], key) == 0) {
+ settings->keys[i] = val[0];
break;
}
}
@@ -255,22 +177,5 @@ void BarSettingsRead (BarSettings_t *settings) {
settings->enableScrobbling = 1;
}
- /* append missing keyboard shortcuts to ensure the functionality is
- * available */
- for (i = 0; i < sizeof (defaultKeys) / sizeof (*defaultKeys); i++) {
- char shortcutAvailable = 0;
- curShortcut = settings->keys;
- while (curShortcut != NULL) {
- if (curShortcut->cmd == defaultKeys[i].cmd) {
- shortcutAvailable = 1;
- break;
- }
- curShortcut = curShortcut->next;
- }
- if (!shortcutAvailable) {
- BarSettingsAppendKey (&defaultKeys[i], settings);
- }
- }
-
fclose (configfd);
}
diff --git a/src/settings.h b/src/settings.h
index 3d98ec6..614ebf3 100644
--- a/src/settings.h
+++ b/src/settings.h
@@ -29,11 +29,39 @@ THE SOFTWARE.
#include "player.h"
#define BAR_KS_ARGS PianoHandle_t *ph, struct audioPlayer *player, \
- struct BarSettings *settings, PianoSong_t **curSong, \
+ BarSettings_t *settings, PianoSong_t **curSong, \
PianoStation_t **curStation, PianoSong_t **songHistory, char *doQuit, \
FILE *curFd
-struct BarSettings {
+/* keep in mind that you have to update several arrays in main.c/ui_act.c too,
+ * if you're adding new shortcuts */
+typedef enum {
+ BAR_KS_HELP = 0,
+ BAR_KS_LOVE = 1,
+ BAR_KS_BAN = 2,
+ BAR_KS_ADDMUSIC = 3,
+ BAR_KS_CREATESTATION = 4,
+ BAR_KS_DELETESTATION = 5,
+ BAR_KS_EXPLAIN = 6,
+ BAR_KS_GENRESTATION = 7,
+ BAR_KS_HISTORY = 8,
+ BAR_KS_INFO = 9,
+ BAR_KS_ADDSHARED = 10,
+ BAR_KS_MOVESONG = 11,
+ BAR_KS_SKIP = 12,
+ BAR_KS_PLAYPAUSE = 13,
+ BAR_KS_QUIT = 14,
+ BAR_KS_RENAMESTATION = 15,
+ BAR_KS_SELECTSTATION = 16,
+ BAR_KS_TIRED = 17,
+ BAR_KS_UPCOMING = 18,
+ BAR_KS_SELECTQUICKMIX = 19,
+ BAR_KS_DEBUG = 20,
+ /* insert new shortcuts _before_ this element and increase its value */
+ BAR_KS_COUNT = 21,
+} BarKeyShortcutId_t;
+
+typedef struct {
char *username;
char *password;
char *controlProxy; /* non-american listeners need this */
@@ -41,28 +69,18 @@ struct BarSettings {
char *lastfmPassword;
unsigned char lastfmScrobblePercent;
char enableScrobbling;
- struct BarKeyShortcut {
- char key;
- void (*cmd) (BAR_KS_ARGS);
- char *description;
- char *configKey;
- struct BarKeyShortcut *next;
- } *keys;
+ char keys[BAR_KS_COUNT];
PianoAudioFormat_t audioFormat;
char *autostartStation;
char *eventCmd;
unsigned int history;
-};
-
-typedef struct BarSettings BarSettings_t;
-typedef struct BarKeyShortcut BarKeyShortcut_t;
-
-void BarSettingsInit (BarSettings_t *settings);
-void BarSettingsDestroy (BarSettings_t *settings);
+} BarSettings_t;
-void BarSettingsRead (BarSettings_t *settings);
+typedef void (*BarKeyShortcutFunc_t) (BAR_KS_ARGS);
-void BarGetXdgConfigDir (const char *filename, char *retDir,
- size_t retDirN);
+void BarSettingsInit (BarSettings_t *);
+void BarSettingsDestroy (BarSettings_t *);
+void BarSettingsRead (BarSettings_t *);
+void BarGetXdgConfigDir (const char *, char *, size_t);
#endif /* _SETTINGS_H */
diff --git a/src/ui_act.c b/src/ui_act.c
index 5510b2f..518dc80 100644
--- a/src/ui_act.c
+++ b/src/ui_act.c
@@ -67,15 +67,36 @@ static int BarTransformIfShared (PianoHandle_t *ph, PianoStation_t *station) {
/* print current shortcut configuration
*/
void BarUiActHelp (BAR_KS_ARGS) {
- BarKeyShortcut_t *curShortcut = settings->keys;
+ const char *idToDesc[] = {
+ NULL,
+ "love current song",
+ "ban current song",
+ "add music to current station",
+ "create new station",
+ "delete current station",
+ "explain why this song is played",
+ "add genre station",
+ "song history",
+ "print information about current song/station",
+ "add shared station",
+ "move song to different station",
+ "next song",
+ "pause/continue",
+ "quit",
+ "rename current station",
+ "change station",
+ "tired (ban song for 1 month)",
+ "upcoming songs",
+ "select quickmix stations",
+ NULL,
+ };
+ size_t i;
BarUiMsg (MSG_NONE, "\r");
- while (curShortcut != NULL) {
- if (curShortcut->description != NULL) {
- BarUiMsg (MSG_LIST, "%c %s\n", curShortcut->key,
- curShortcut->description);
+ for (i = 0; i < BAR_KS_COUNT; i++) {
+ if (idToDesc[i] != NULL) {
+ BarUiMsg (MSG_LIST, "%c %s\n", settings->keys[i], idToDesc[i]);
}
- curShortcut = curShortcut->next;
}
}