Files
lcdproc/server/input.c
T
ppokorny 00cc9fca23 + Changed protocol to 0.3 because we now accept both -foo and foo
as argument introducers.  in 0.4-pre10, these were changed
   from foo to -foo and this broke many clients.  This change
   should fix that and be backward/forward compatible.
 + Added a noop function to the protocol.  This is useful for writing
   shell script clients of LCDproc.
 + Changed the shared sock_send_string function to NOT send the
   ending NUL ('\0') byte with the string.  This was confusing
   in Perl clients which saw NUL's as the first character of
   each reply.  WARNING: The LCDPROC client depended on this
   behavior, your client may too.  Use the newline instead.
   See the code in clients/lcdproc/main.c (look for "switch(buf[i])")
   to see one way to handle this.  This should allow new clients
   to connect to old servers and vice-versa.
 + Messed with include structure in .c files.  It should no longer
   be necessary to specify ../.. to get to shared code headers.
   Also, since we are using automake, the global config.h can be
   found with just #include "config.h" as it's location is included
   in a -I to the compilers.  As a result "make distcheck" now works.
2001-05-25 03:14:27 +00:00

130 lines
2.7 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
*/
#include <stdlib.h>
#include <stdio.h>
#include <string.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"
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[256];
int key;
screen *s;
widget *w;
client *c;
key = lcd.getkey ();
if (!key)
return 0;
debug ("handle_input(%c)\n", (char) key);
if (key) {
// TODO: Interpret and translate keys!
// Give current screen a shot at the key first
s = screenlist_current ();
w = widget_find( s, KEYS_WIDGETID );
if( s->parent && w && w->text && strchr( w->text, key ) ) {
// This screen wants this key. Tell it we got one
sprintf(str, "key %c\n", key);
sock_send_string(s->parent->sock, str);
// Nobody else gets this key
} else {
// Give key to clients who want it
c = (client *)LL_GetFirst(clients);
while(c) {
// If the client should have this keypress...
if( c->data->client_keys && strchr(c->data->client_keys, key) ) {
// Send keypress to client
sprintf(str, "key %c\n", key);
sock_send_string(c->sock, str);
};
c = (client *)LL_GetNext(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);
switch (key) {
case 'A':
if (screenlist_action == SCR_HOLD)
screenlist_action = 0;
else
screenlist_action = SCR_HOLD;
break;
case 'B':
screenlist_action = SCR_BACK;
screenlist_prev ();
break;
case 'C':
screenlist_action = SCR_SKIP;
screenlist_next ();
break;
case 'D':
debug ("got the menu key!\n");
server_menu ();
break;
default:
debug ("server_input: Unused key \"%c\" (%i)\n", (char) key, key);
break;
}
return 0;
}