summaryrefslogtreecommitdiff
path: root/src/ui_dispatch.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/ui_dispatch.c')
-rw-r--r--src/ui_dispatch.c71
1 files changed, 71 insertions, 0 deletions
diff --git a/src/ui_dispatch.c b/src/ui_dispatch.c
new file mode 100644
index 0000000..ddcf60c
--- /dev/null
+++ b/src/ui_dispatch.c
@@ -0,0 +1,71 @@
+/*
+Copyright (c) 2010-2011
+ Lars-Dominik Braun <lars@6xq.net>
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+*/
+
+#include <assert.h>
+
+#include "ui_dispatch.h"
+#include "settings.h"
+#include "ui.h"
+
+/* handle global keyboard shortcuts
+ * @return BAR_KS_* if action was performed or BAR_KS_COUNT on error/if no
+ * action was performed
+ */
+BarKeyShortcutId_t BarUiDispatch (BarApp_t *app, const char key, PianoStation_t *selStation,
+ PianoSong_t *selSong, const bool verbose,
+ BarUiDispatchContext_t context) {
+ assert (app != NULL);
+ assert (sizeof (app->settings.keys) / sizeof (*app->settings.keys) ==
+ sizeof (dispatchActions) / sizeof (*dispatchActions));
+
+ if (selStation != NULL) {
+ context |= BAR_DC_STATION;
+ }
+ if (selSong != NULL) {
+ context |= BAR_DC_SONG;
+ }
+
+ for (size_t i = 0; i < BAR_KS_COUNT; i++) {
+ if (app->settings.keys[i] != BAR_KS_DISABLED &&
+ app->settings.keys[i] == key) {
+ if ((dispatchActions[i].context & context) == dispatchActions[i].context) {
+ assert (dispatchActions[i].function != NULL);
+
+ dispatchActions[i].function (app, selStation, selSong,
+ context);
+ return i;
+ } else if (verbose) {
+ if (dispatchActions[i].context & BAR_DC_SONG) {
+ BarUiMsg (MSG_ERR, "No song playing.\n");
+ } else if (dispatchActions[i].context & BAR_DC_STATION) {
+ BarUiMsg (MSG_ERR, "No station selected.\n");
+ } else {
+ assert (0);
+ }
+ return BAR_KS_COUNT;
+ }
+ }
+ }
+ return BAR_KS_COUNT;
+}
+