diff --git a/server/client_data.c b/server/client_data.c index 3b01d41..0cd42d4 100644 --- a/server/client_data.c +++ b/server/client_data.c @@ -24,6 +24,7 @@ client_data_init (client_data * d) d->ack = 0; d->name = NULL; + d->client_keys = NULL; d->screenlist = LL_new (); if (!d->screenlist) { @@ -57,6 +58,10 @@ client_data_destroy (client_data * d) if (d->name) free (d->name); + // Clean up the key list... + if (d->client_keys) + free (d->client_keys); + // Clean up the screenlist... debug ("client_data_destroy: Cleaning screenlist\n"); LL_Rewind (d->screenlist); diff --git a/server/client_data.h b/server/client_data.h index a78a6ee..6951e9c 100644 --- a/server/client_data.h +++ b/server/client_data.h @@ -10,7 +10,8 @@ typedef struct client_data { char *name; // and other stuff... doesn't matter yet LL *screenlist; - // list of accepted keys... (?) + // list of requested keys... + char *client_keys ; LL *menulist; } client_data; diff --git a/server/client_functions.c b/server/client_functions.c index 5804373..9527bda 100644 --- a/server/client_functions.c +++ b/server/client_functions.c @@ -142,11 +142,45 @@ client_set_func (client * c, int argc, char **argv) int client_add_key_func (client * c, int argc, char **argv) { + char * keys ; if (!c->data->ack) return 1; - sock_send_string (c->sock, "huh? Not implemented yet. Try using screen_add_key.\n"); + if (argc < 2) { + sock_send_string (c->sock, "huh? You must specify a key list\n"); + return 0; + } + if (argc > 2) { + sock_send_string (c->sock, "huh? Too many parameters...\n"); + return 0; + } + keys = argv[1]; + debug ("client_add_key: Adding key(s) %s to client_keys\n", keys); + + if (!c->data->client_keys) { + // No keys list, create a new one + c->data->client_keys = strdup( keys ); + } else { + // Add supplied keys to existing list + // NOTE: There could be duplicates in the resulting list + // That's OK, it's the existence of the key in the list + // that's important. We'll be more careful in the delete + // key function. + char * new ; + int new_len = strlen(c->data->client_keys) + strlen(keys) + 1 ; + + new = realloc( c->data->client_keys, new_len ); + if( new ) { + c->data->client_keys = new ; + strcat( new, keys ); + } + } + + if (!c->data->client_keys) { + sock_send_string(c->sock, "huh? failed\n"); + } else + sock_send_string(c->sock, "success\n"); return 0; } @@ -158,11 +192,45 @@ client_add_key_func (client * c, int argc, char **argv) int client_del_key_func (client * c, int argc, char **argv) { + char * keys ; if (!c->data->ack) return 1; - sock_send_string (c->sock, "huh? Not implemented yet. Try using screen_del_key.\n"); + if (argc < 2) { + sock_send_string (c->sock, "huh? You must specify a key list\n"); + return 0; + } + if (argc > 2) { + sock_send_string (c->sock, "huh? Too many parameters...\n"); + return 0; + } + keys = argv[1] ; + debug ("client_del_key: Deleting key(s) %s from client_keys\n", keys); + + if (c->data->client_keys) { + // Client has keys, remove keys from the list + // NOTE: We let malloc/realloc remember the length + // of the allocated storage. If keys are later + // added, realloc (in add_key above) will make + // sure there is enough space at c->data->client_keys + char * from ; + char * to ; + + to = from = c->data->client_keys ; + while( *from ) { + // Is this key to be deleted from the list? + if( strchr( keys, *from ) ) { + // Yes, skip it + ++from ; + } else { + // No, save it + *to++ = *from++ ; + } + } + } + + sock_send_string(c->sock, "success\n"); return 0; } @@ -222,7 +290,7 @@ screen_add_key_func (client * c, int argc, char **argv) if (!w->text) { // Save supplied key list w->text = strdup( keys ); - } else { + } else { // Add supplied keys to existing list // NOTE: There could be duplicates in the resulting list // That's OK, it's the existence of the key in the list diff --git a/server/drivers/glk.c b/server/drivers/glk.c index 258f6ff..4d84505 100644 --- a/server/drivers/glk.c +++ b/server/drivers/glk.c @@ -141,6 +141,8 @@ int glk_init(struct lcd_logical_driver *driver, char *args) width = 20 ; height = 4 ; gpo_count = 2 ; break ; case 0x23 : // GLK12232-25SM width = 20 ; height = 4 ; gpo_count = 2 ; break ; + case 0x24 : // GLK12232-25SM-Penguin + width = 20 ; height = 4 ; gpo_count = 2 ; break ; default : fprintf( stderr, "glk: Unrecognized module type: 0x%02x\n", i ); return( -1 ); @@ -635,18 +637,18 @@ char glk_getkey() /* Remap keys according to what LCDproc expects */ switch( c ) { default : break ; - case 'U' : c = 'A' ; break ; - case 'Q' : c = 'B' ; break ; - case 'P' : c = 'C' ; break ; - case 'K' : c = 'D' ; break ; - case 'V' : c = 'E' ; break ; - case 'L' : c = 'F' ; break ; - case 'u' : c = 'N' ; break ; - case 'q' : c = 'O' ; break ; - case 'p' : c = 'P' ; break ; - case 'k' : c = 'Q' ; break ; - case 'v' : c = 'R' ; break ; - case 'l' : c = 'S' ; break ; + case 'V' : c = 'A' ; break ; /* Hold/Select */ + case 'P' : c = 'B' ; break ; /* Left -- Minus */ + case 'Q' : c = 'C' ; break ; /* Right -- Plus */ + case 'L' : c = 'D' ; break ; /* Menu/Exit */ + case 'U' : c = 'E' ; break ; /* Up */ + case 'K' : c = 'F' ; break ; /* Down */ + case 'v' : c = 'N' ; break ; + case 'p' : c = 'O' ; break ; + case 'q' : c = 'P' ; break ; + case 'l' : c = 'Q' ; break ; + case 'u' : c = 'R' ; break ; + case 'k' : c = 'S' ; break ; }; // if( c ) { diff --git a/server/input.c b/server/input.c index e39258f..486f7f0 100644 --- a/server/input.c +++ b/server/input.c @@ -11,17 +11,17 @@ 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 + 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 + B Up/Left + C Down/Right + D Exit/Cancel + E-Z Ignored */ #include @@ -76,21 +76,15 @@ handle_input () sock_send_string(s->parent->sock, str); // Nobody else gets this key } else { - // Give key to anyone who wants it + // Give key to clients who want it c = (client *)LL_GetFirst(clients); while(c) { // If the client should have this keypress... - s = (screen *)LL_GetFirst(c->data->screenlist); - while(s) { - w = widget_find( s, KEYS_WIDGETID ); - if( s->parent && w && w->text && strchr( w->text, key ) ) { - // Send keypress to client - sprintf(str, "key %c\n", key); - sock_send_string(c->sock, str); - break ; // Screen loop - } - s = (screen *)LL_GetNext(c->data->screenlist); - } // while screens + 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