Files
lcdproc/server/input.c
T
ddouthitt 6a0e23dc3e Massive changes (first commit), including but not limited to:
* Ability to specify port and address to bind to
* By default, binds only to 127.0.0.1 port 13666
* Client commands now return usage when no options given
* New driver command: getinfo
* Added comments all over the place
* Used #defines to further document code
* Used #defines to set up compile-time defaults, etc.
* Cleaned up client command argument analysis in client_functions.c
* Beginning support of syslog
* Some bug fixes
2001-09-21 21:08:10 +00:00

194 lines
4.6 KiB
C

/*
input.c
Handles keypad (and other?) input from the user.
Currently, the keys are as follows:
Context Key Function
------- --- --------
Normal "normal" context is handled in this source file.
A Pause/Continue
B Back(Go to previous screen)
C Forward(Go to next screen)
D Open main menu
E-Z Sent to client, if any; ignored otherwise
(menu keys are not handled here, but in the menu code)
Menu
A Enter/select
B Up/Left
C Down/Right
D Exit/Cancel
E-Z Ignored
*/
// These are the keys for a (likely) properly functioning LK202-25...
// #define KEY_UP 'I'
// #define KEY_DOWN 'J'
// #define KEY_LEFT 'O'
// #define KEY_RIGHT 'E'
// #define KEY_F1 'N'
// #define KEY_F2 'M'
// #define KEY_ENTER 'H'
// These are the keys for my (possibly) broken LK202-25...
#define KEY_UP 'I'
#define KEY_DOWN 'F'
#define KEY_LEFT 'K'
#define KEY_RIGHT 'A'
#define KEY_F1 'N'
// #define KEY_F2 'M'
// #define KEY_ENTER 'H'
// TODO: Generalize these into each driver...
//
// Really, what this comes down to, is different settings for
// different displays. Unless you want to recompile for all
// the defaults, these key settings must be in the driver.
//
// But then, which driver is active and which screen takes which
// input and... (sigh).
//
#define PAUSE_KEY KEY_F1
#define BACK_KEY KEY_LEFT
#define FORWARD_KEY KEY_RIGHT
#define MAIN_MENU_KEY KEY_DOWN
// This seems somewhat arbitrary, but it IS the original settings:
//
// #define PAUSE_KEY 'A'
// #define BACK_KEY 'B'
// #define FORWARD_KEY 'C'
// #define MAIN_MENU_KEY 'D'
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <syslog.h>
#include "shared/sockets.h"
#include "shared/debug.h"
#include "drivers/lcd.h"
#include "client_data.h"
#include "clients.h"
#include "screen.h"
#include "widget.h"
#include "screenlist.h"
#include "menus.h"
#include "input.h"
#define KeyWanted(a,b) ((a) && strchr((a), (b)))
#define CurrentScreen screenlist_current
#define FirstClient(a) (client *)LL_GetFirst(a);
#define NextClient(a) (client *)LL_GetNext(a);
int server_input (int key);
// FIXME! The server tends to crash when "E" is pressed.. (?!)
// (but only when the joystick driver is the last one on the list...)
// Checks for keypad input, and dispatches it
int
handle_input ()
{
char str[15];
int key;
screen *s;
widget *w;
client *c;
if ((key = lcd.getkey ()) == 0)
return 0;
//debug ("handle_input(%c)\n", (char) key);
// Sequence:
// Does the current screen want the key?
// IfTrue: handle and quit
// IfFalse:
// Let ALL clients handle it if they want
// Let Server handle it, too
//
// This leads to a unique situation:
// First: multiple clients may handle the same key in multiple ways
// Second: the server may handle the key differently yet
//
// Solution: Only the current screen can handle the key press.
// Alternately, only one client can handle the key press.
// TODO: Interpret and translate keys!
// Give current screen a shot at the key first
s = CurrentScreen ();
if (KeyWanted(s->keys, key)) {
// This screen wants this key. Tell it we got one
snprintf(str, sizeof(str), "key %c\n", key);
sock_send_string(s->parent->sock, str);
// Nobody else gets this key
}
// if the current screen doesn't want it,
// ignore the key...
// else {
// // Give key to clients who want it
//
// c = FirstClient(clients);
//
// while (c) {
// // If the client should have this keypress...
// if(KeyWanted(c->data->client_keys,key)) {
// // Send keypress to client
// snprintf(str, sizeof(str), "key %c\n", key);
// sock_send_string(c->sock, str);
// break; // first come, first serve
// };
// c = NextClient(clients);
// } // while clients
//
// // Give server a shot at all keys
// server_input (key);
// }
return 0;
}
int
server_input (int key)
{
debug ("server_input(%c)\n", (char) key);
syslog(LOG_DEBUG, "key %d pressed on device", key);
switch ((char) key) {
case PAUSE_KEY:
if (screenlist_action == SCR_HOLD)
screenlist_action = 0;
else
screenlist_action = SCR_HOLD;
break;
case BACK_KEY:
screenlist_action = SCR_BACK;
screenlist_prev ();
break;
case FORWARD_KEY:
screenlist_action = SCR_SKIP;
screenlist_next ();
break;
case MAIN_MENU_KEY:
debug ("got the menu key!\n");
server_menu ();
break;
default:
debug ("server_input: Unused key \"%c\" (%i)\n", (char) key, key);
break;
}
return 0;
}