/* THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX SOFTWARE CORPORATION ("PARALLAX"). PARALLAX, IN DISTRIBUTING THE CODE TO END-USERS, AND SUBJECT TO ALL OF THE TERMS AND CONDITIONS HEREIN, GRANTS A ROYALTY-FREE, PERPETUAL LICENSE TO SUCH END-USERS FOR USE BY SUCH END-USERS IN USING, DISPLAYING, AND CREATING DERIVATIVE WORKS THEREOF, SO LONG AS SUCH USE, DISPLAY OR CREATION IS FOR NON-COMMERCIAL, ROYALTY OR REVENUE FREE PURPOSES. IN NO EVENT SHALL THE END-USER USE THE COMPUTER CODE CONTAINED HEREIN FOR REVENUE-BEARING PURPOSES. THE END-USER UNDERSTANDS AND AGREES TO THE TERMS HEREIN AND ACCEPTS THE SAME BY USE OF THIS FILE. COPYRIGHT 1993-1999 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED. */ #include #include #include #include "physfsx.h" #include "maths.h" #include "pstypes.h" #include "gr.h" #include "key.h" #include "ui.h" #include "u_mem.h" #include "func.h" #include "dxxerror.h" #define MAX_NUM_PADS 20 static UI_GADGET_BUTTON * Pad[17]; static UI_KEYPAD * KeyPad[MAX_NUM_PADS]; static int active_pad; static int desc_x, desc_y; static int HotKey[17]; static int HotKey1[17]; #define REMOVE_EOL(s) (*(strstr( (s), "\n" ))='\0') int ui_pad_get_current() { return active_pad; } void ui_pad_init() { int i; for (i=0; i< MAX_NUM_PADS; i++ ) KeyPad[i] = NULL; active_pad = -1; } void ui_pad_close() { int i, j; for (i=0; i< MAX_NUM_PADS; i++ ) if (KeyPad[i]) { for (j=0; j<17; j++ ) d_free(KeyPad[i]->buttontext[j]); d_free( KeyPad[i] ); KeyPad[i] = NULL; } } void LineParse( int n, char * dest, char * source ) { int i = 0, j=0, cn = 0; // Go to the n'th line while (cn < n ) if ((unsigned char) source[i++] == 179) cn++; // Read up until the next comma while ((unsigned char) source[i] != 179) { dest[j] = source[i++]; j++; } // Null-terminate dest[j++] = 0; } void ui_pad_activate( UI_DIALOG * dlg, int x, int y ) { int w,h,row,col, n; int bh, bw; bw = 56; bh = 30; x += 5; y += 20; desc_x = x+2; desc_y = y-17; n=0; row = 0; col = 0; w = 1; h = 1; Pad[n] = ui_add_gadget_button( dlg, x+(bw*col), y+(bh*row), bw*w, bh*h, NULL, NULL ); Pad[n]->canvas->cv_font = ui_small_font; n=1; row = 0; col = 1; w = 1; h = 1; Pad[n] = ui_add_gadget_button( dlg, x+(bw*col), y+(bh*row), bw*w, bh*h, NULL, NULL ); Pad[n]->canvas->cv_font = ui_small_font; n=2; row = 0; col = 2; w = 1; h = 1; Pad[n] = ui_add_gadget_button( dlg, x+(bw*col), y+(bh*row), bw*w, bh*h, NULL, NULL ); Pad[n]->canvas->cv_font = ui_small_font; n=3; row = 0; col = 3; w = 1; h = 1; Pad[n] = ui_add_gadget_button( dlg, x+(bw*col), y+(bh*row), bw*w, bh*h, NULL, NULL ); Pad[n]->canvas->cv_font = ui_small_font; n=4; row = 1; col = 0; w = 1; h = 1; Pad[n] = ui_add_gadget_button( dlg, x+(bw*col), y+(bh*row), bw*w, bh*h, NULL, NULL ); Pad[n]->canvas->cv_font = ui_small_font; n=5; row = 1; col = 1; w = 1; h = 1; Pad[n] = ui_add_gadget_button( dlg, x+(bw*col), y+(bh*row), bw*w, bh*h, NULL, NULL ); Pad[n]->canvas->cv_font = ui_small_font; n=6; row = 1; col = 2; w = 1; h = 1; Pad[n] = ui_add_gadget_button( dlg, x+(bw*col), y+(bh*row), bw*w, bh*h, NULL, NULL ); Pad[n]->canvas->cv_font = ui_small_font; n=7; row = 1; col = 3; w = 1; h = 2; Pad[n] = ui_add_gadget_button( dlg, x+(bw*col), y+(bh*row), bw*w, bh*h, NULL, NULL ); Pad[n]->canvas->cv_font = ui_small_font; n=8; row = 2; col = 0; w = 1; h = 1; Pad[n] = ui_add_gadget_button( dlg, x+(bw*col), y+(bh*row), bw*w, bh*h, NULL, NULL ); Pad[n]->canvas->cv_font = ui_small_font; n=9; row = 2; col = 1; w = 1; h = 1; Pad[n] = ui_add_gadget_button( dlg, x+(bw*col), y+(bh*row), bw*w, bh*h, NULL, NULL ); Pad[n]->canvas->cv_font = ui_small_font; n=10; row = 2; col = 2; w = 1; h = 1; Pad[n] = ui_add_gadget_button( dlg, x+(bw*col), y+(bh*row), bw*w, bh*h, NULL, NULL ); Pad[n]->canvas->cv_font = ui_small_font; n=11; row = 3; col = 0; w = 1; h = 1; Pad[n] = ui_add_gadget_button( dlg, x+(bw*col), y+(bh*row), bw*w, bh*h, NULL, NULL ); Pad[n]->canvas->cv_font = ui_small_font; n=12; row = 3; col = 1; w = 1; h = 1; Pad[n] = ui_add_gadget_button( dlg, x+(bw*col), y+(bh*row), bw*w, bh*h, NULL, NULL ); Pad[n]->canvas->cv_font = ui_small_font; n=13; row = 3; col = 2; w = 1; h = 1; Pad[n] = ui_add_gadget_button( dlg, x+(bw*col), y+(bh*row), bw*w, bh*h, NULL, NULL ); Pad[n]->canvas->cv_font = ui_small_font; n=14; row = 3; col = 3; w = 1; h = 2; Pad[n] = ui_add_gadget_button( dlg, x+(bw*col), y+(bh*row), bw*w, bh*h, NULL, NULL ); Pad[n]->canvas->cv_font = ui_small_font; n=15; row = 4; col = 0; w = 2; h = 1; Pad[n] = ui_add_gadget_button( dlg, x+(bw*col), y+(bh*row), bw*w, bh*h, NULL, NULL ); Pad[n]->canvas->cv_font = ui_small_font; n=16; row = 4; col = 2; w = 1; h = 1; Pad[n] = ui_add_gadget_button( dlg, x+(bw*col), y+(bh*row), bw*w, bh*h, NULL, NULL ); Pad[n]->canvas->cv_font = ui_small_font; HotKey[0] = KEY_CTRLED + KEY_NUMLOCK; HotKey[1] = KEY_CTRLED + KEY_PADDIVIDE; HotKey[2] = KEY_CTRLED + KEY_PADMULTIPLY; HotKey[3] = KEY_CTRLED + KEY_PADMINUS; HotKey[4] = KEY_CTRLED + KEY_PAD7; HotKey[5] = KEY_CTRLED + KEY_PAD8; HotKey[6] = KEY_CTRLED + KEY_PAD9; HotKey[7] = KEY_CTRLED + KEY_PADPLUS; HotKey[8] = KEY_CTRLED + KEY_PAD4; HotKey[9] = KEY_CTRLED + KEY_PAD5; HotKey[10] = KEY_CTRLED + KEY_PAD6; HotKey[11] = KEY_CTRLED + KEY_PAD1; HotKey[12] = KEY_CTRLED + KEY_PAD2; HotKey[13] = KEY_CTRLED + KEY_PAD3; HotKey[14] = KEY_CTRLED + KEY_PADENTER; HotKey[15] = KEY_CTRLED + KEY_PAD0; HotKey[16] = KEY_CTRLED + KEY_PADPERIOD; HotKey1[0] = KEY_SHIFTED + KEY_CTRLED + KEY_NUMLOCK; HotKey1[1] = KEY_SHIFTED + KEY_CTRLED + KEY_PADDIVIDE; HotKey1[2] = KEY_SHIFTED + KEY_CTRLED + KEY_PADMULTIPLY; HotKey1[3] = KEY_SHIFTED + KEY_CTRLED + KEY_PADMINUS; HotKey1[4] = KEY_SHIFTED + KEY_CTRLED + KEY_PAD7; HotKey1[5] = KEY_SHIFTED + KEY_CTRLED + KEY_PAD8; HotKey1[6] = KEY_SHIFTED + KEY_CTRLED + KEY_PAD9; HotKey1[7] = KEY_SHIFTED + KEY_CTRLED + KEY_PADPLUS; HotKey1[8] = KEY_SHIFTED + KEY_CTRLED + KEY_PAD4; HotKey1[9] = KEY_SHIFTED + KEY_CTRLED + KEY_PAD5; HotKey1[10] = KEY_SHIFTED + KEY_CTRLED + KEY_PAD6; HotKey1[11] = KEY_SHIFTED + KEY_CTRLED + KEY_PAD1; HotKey1[12] = KEY_SHIFTED + KEY_CTRLED + KEY_PAD2; HotKey1[13] = KEY_SHIFTED + KEY_CTRLED + KEY_PAD3; HotKey1[14] = KEY_SHIFTED + KEY_CTRLED + KEY_PADENTER; HotKey1[15] = KEY_SHIFTED + KEY_CTRLED + KEY_PAD0; HotKey1[16] = KEY_SHIFTED + KEY_CTRLED + KEY_PADPERIOD; active_pad = -1; } void ui_pad_deactivate() { int i; for (i=0; i<17; i++ ) { Pad[i]->text = NULL; } } void ui_pad_draw(UI_DIALOG *dlg, int x, int y) { int bh, bw; bw = 56; bh = 30; ui_dialog_set_current_canvas( dlg ); ui_draw_box_in( x, y, x+(bw*4)+10 + 200, y+(bh*5)+45 ); gr_set_current_canvas( NULL ); gr_setcolor( CWHITE ); gr_urect( desc_x, desc_y, desc_x+ 56*4-1, desc_y+15 ); gr_set_fontcolor( CBLACK, CWHITE ); gr_ustring( desc_x, desc_y, KeyPad[active_pad]->description ); } static void ui_pad_set_active( int n ) { int np; char * name; int i, j; for (i=0; i<17; i++ ) { Pad[i]->text = KeyPad[n]->buttontext[i]; Pad[i]->status = 1; Pad[i]->user_function = NULL; Pad[i]->dim_if_no_function = 1; Pad[i]->hotkey = -1; for (j=0; j< KeyPad[n]->numkeys; j++ ) { if (HotKey[i] == KeyPad[n]->keycode[j] ) { Pad[i]->hotkey = HotKey[i]; Pad[i]->user_function = func_nget( KeyPad[n]->function_number[j], &np, &name ); } if (HotKey1[i] == KeyPad[n]->keycode[j] ) { Pad[i]->hotkey1 = HotKey1[i]; Pad[i]->user_function1 = func_nget( KeyPad[n]->function_number[j], &np, &name ); } } } active_pad = n; } void ui_pad_goto(int n) { if ( KeyPad[n] != NULL ) ui_pad_set_active(n); } void ui_pad_goto_next() { int i, si; i = active_pad + 1; si = i; while( KeyPad[i]==NULL ) { i++; if (i >= MAX_NUM_PADS) i = 0; if (i == si ) break; } ui_pad_set_active(i); } void ui_pad_goto_prev() { int i; if (active_pad == -1 ) active_pad = MAX_NUM_PADS; i = active_pad - 1; if (i<0) i= MAX_NUM_PADS - 1; while( KeyPad[i]==NULL ) { i--; if (i < 0) i = MAX_NUM_PADS-1; if (i == active_pad ) break; } ui_pad_set_active(i); } void ui_pad_read( int n, const char * filename ) { char * ptr; char buffer[100]; char text[100]; char line_buffer[200]; PHYSFS_file * infile; int linenumber = 0; int i; int keycode, functionnumber; infile = PHYSFSX_openReadBuffered( filename ); if (!infile) { Warning( "Couldn't find %s\n", filename ); return; } MALLOC( KeyPad[n], UI_KEYPAD, 1 ); for (i=0; i < 17; i++ ) { MALLOC( KeyPad[n]->buttontext[i], char, 100 ); } KeyPad[n]->numkeys = 0; for (i=0; i<100; i++ ) { KeyPad[n]->keycode[i] = -1; KeyPad[n]->function_number[i] = 0; } while ( linenumber < 22) { PHYSFSX_fgets( buffer, 100, infile ); switch( linenumber+1 ) { case 1: strncpy( KeyPad[n]->description, buffer, 100 ); break; //===================== ROW 0 ============================== case 3: LineParse( 1, text, buffer ); sprintf( KeyPad[n]->buttontext[0], "%s\n", text ); LineParse( 2, text, buffer ); sprintf( KeyPad[n]->buttontext[1], "%s\n", text ); LineParse( 3, text, buffer ); sprintf( KeyPad[n]->buttontext[2], "%s\n", text ); LineParse( 4, text, buffer ); sprintf( KeyPad[n]->buttontext[3], "%s\n", text ); break; case 4: LineParse( 1, text, buffer ); sprintf( KeyPad[n]->buttontext[0], "%s%s\n", KeyPad[n]->buttontext[0],text ); LineParse( 2, text, buffer ); sprintf( KeyPad[n]->buttontext[1], "%s%s\n", KeyPad[n]->buttontext[1],text ); LineParse( 3, text, buffer ); sprintf( KeyPad[n]->buttontext[2], "%s%s\n", KeyPad[n]->buttontext[2],text ); LineParse( 4, text, buffer ); sprintf( KeyPad[n]->buttontext[3], "%s%s\n", KeyPad[n]->buttontext[3],text ); break; case 5: LineParse( 1, text, buffer ); sprintf( KeyPad[n]->buttontext[0], "%s%s", KeyPad[n]->buttontext[0],text ); LineParse( 2, text, buffer ); sprintf( KeyPad[n]->buttontext[1], "%s%s", KeyPad[n]->buttontext[1],text ); LineParse( 3, text, buffer ); sprintf( KeyPad[n]->buttontext[2], "%s%s", KeyPad[n]->buttontext[2],text ); LineParse( 4, text, buffer ); sprintf( KeyPad[n]->buttontext[3], "%s%s", KeyPad[n]->buttontext[3],text ); break; //===================== ROW 1 ============================== case 7: LineParse( 1, text, buffer ); sprintf( KeyPad[n]->buttontext[4], "%s\n", text ); LineParse( 2, text, buffer ); sprintf( KeyPad[n]->buttontext[5], "%s\n", text ); LineParse( 3, text, buffer); sprintf( KeyPad[n]->buttontext[6], "%s\n", text ); LineParse( 4, text, buffer ); sprintf( KeyPad[n]->buttontext[7], "%s\n", text ); break; case 8: LineParse( 1, text, buffer ); sprintf( KeyPad[n]->buttontext[4], "%s%s\n", KeyPad[n]->buttontext[4],text ); LineParse( 2, text, buffer ); sprintf( KeyPad[n]->buttontext[5], "%s%s\n", KeyPad[n]->buttontext[5],text ); LineParse( 3, text, buffer ); sprintf( KeyPad[n]->buttontext[6], "%s%s\n", KeyPad[n]->buttontext[6],text ); LineParse( 4, text, buffer ); sprintf( KeyPad[n]->buttontext[7], "%s%s\n", KeyPad[n]->buttontext[7],text ); break; case 9: LineParse( 1, text, buffer ); sprintf( KeyPad[n]->buttontext[4], "%s%s", KeyPad[n]->buttontext[4],text ); LineParse( 2, text, buffer ); sprintf( KeyPad[n]->buttontext[5], "%s%s", KeyPad[n]->buttontext[5],text ); LineParse( 3, text, buffer ); sprintf( KeyPad[n]->buttontext[6], "%s%s", KeyPad[n]->buttontext[6],text ); LineParse( 4, text, buffer ); sprintf( KeyPad[n]->buttontext[7], "%s%s\n", KeyPad[n]->buttontext[7],text ); break; case 10: ptr = strrchr( buffer, (char) 179 ); *ptr = 0; ptr = strrchr( buffer, (char) 180 ); ptr++; sprintf( KeyPad[n]->buttontext[7], "%s%s\n", KeyPad[n]->buttontext[7],ptr ); break; //======================= ROW 2 ============================== case 11: LineParse( 1, text, buffer ); sprintf( KeyPad[n]->buttontext[8], "%s\n", text ); LineParse( 2, text, buffer ); sprintf( KeyPad[n]->buttontext[9], "%s\n", text ); LineParse( 3, text, buffer); sprintf( KeyPad[n]->buttontext[10], "%s\n", text ); LineParse( 4, text, buffer ); sprintf( KeyPad[n]->buttontext[7], "%s%s\n", KeyPad[n]->buttontext[7],text ); break; case 12: LineParse( 1, text, buffer ); sprintf( KeyPad[n]->buttontext[8], "%s%s\n", KeyPad[n]->buttontext[8],text ); LineParse( 2, text, buffer ); sprintf( KeyPad[n]->buttontext[9], "%s%s\n", KeyPad[n]->buttontext[9],text ); LineParse( 3, text, buffer ); sprintf( KeyPad[n]->buttontext[10], "%s%s\n", KeyPad[n]->buttontext[10],text ); LineParse( 4, text, buffer ); sprintf( KeyPad[n]->buttontext[7], "%s%s\n", KeyPad[n]->buttontext[7],text ); break; case 13: LineParse( 1, text, buffer ); sprintf( KeyPad[n]->buttontext[8], "%s%s", KeyPad[n]->buttontext[8],text ); LineParse( 2, text, buffer ); sprintf( KeyPad[n]->buttontext[9], "%s%s", KeyPad[n]->buttontext[9],text ); LineParse( 3, text, buffer ); sprintf( KeyPad[n]->buttontext[10], "%s%s", KeyPad[n]->buttontext[10],text ); LineParse( 4, text, buffer ); sprintf( KeyPad[n]->buttontext[7], "%s%s", KeyPad[n]->buttontext[7],text ); break; // ====================== ROW 3 ========================= case 15: LineParse( 1, text, buffer ); sprintf( KeyPad[n]->buttontext[11], "%s\n", text ); LineParse( 2, text, buffer ); sprintf( KeyPad[n]->buttontext[12], "%s\n", text ); LineParse( 3, text, buffer); sprintf( KeyPad[n]->buttontext[13], "%s\n", text ); LineParse( 4, text, buffer ); sprintf( KeyPad[n]->buttontext[14], "%s\n", text ); break; case 16: LineParse( 1, text, buffer ); sprintf( KeyPad[n]->buttontext[11], "%s%s\n", KeyPad[n]->buttontext[11],text ); LineParse( 2, text, buffer ); sprintf( KeyPad[n]->buttontext[12], "%s%s\n", KeyPad[n]->buttontext[12],text ); LineParse( 3, text, buffer ); sprintf( KeyPad[n]->buttontext[13], "%s%s\n", KeyPad[n]->buttontext[13],text ); LineParse( 4, text, buffer ); sprintf( KeyPad[n]->buttontext[14], "%s%s\n", KeyPad[n]->buttontext[14],text ); break; case 17: LineParse( 1, text, buffer ); sprintf( KeyPad[n]->buttontext[11], "%s%s", KeyPad[n]->buttontext[11],text ); LineParse( 2, text, buffer ); sprintf( KeyPad[n]->buttontext[12], "%s%s", KeyPad[n]->buttontext[12],text ); LineParse( 3, text, buffer ); sprintf( KeyPad[n]->buttontext[13], "%s%s", KeyPad[n]->buttontext[13],text ); LineParse( 4, text, buffer ); sprintf( KeyPad[n]->buttontext[14], "%s%s\n", KeyPad[n]->buttontext[14],text ); break; case 18: ptr = strrchr( buffer, (char) 179 ); *ptr = 0; ptr = strrchr( buffer, (char) 180 ); ptr++; sprintf( KeyPad[n]->buttontext[14], "%s%s\n", KeyPad[n]->buttontext[14], ptr ); break; //======================= ROW 4 ========================= case 19: LineParse( 1, text, buffer ); sprintf( KeyPad[n]->buttontext[15], "%s\n", text ); LineParse( 2, text, buffer ); sprintf( KeyPad[n]->buttontext[16], "%s\n", text ); LineParse( 3, text, buffer ); sprintf( KeyPad[n]->buttontext[14], "%s%s\n", KeyPad[n]->buttontext[14],text ); break; case 20: LineParse( 1, text, buffer ); sprintf( KeyPad[n]->buttontext[15], "%s%s\n", KeyPad[n]->buttontext[15],text ); LineParse( 2, text, buffer ); sprintf( KeyPad[n]->buttontext[16], "%s%s\n", KeyPad[n]->buttontext[16],text ); LineParse( 3, text, buffer ); sprintf( KeyPad[n]->buttontext[14], "%s%s\n", KeyPad[n]->buttontext[14],text ); break; case 21: LineParse( 1, text, buffer ); sprintf( KeyPad[n]->buttontext[15], "%s%s", KeyPad[n]->buttontext[15],text ); LineParse( 2, text, buffer ); sprintf( KeyPad[n]->buttontext[16], "%s%s", KeyPad[n]->buttontext[16],text ); LineParse( 3, text, buffer ); sprintf( KeyPad[n]->buttontext[14], "%s%s", KeyPad[n]->buttontext[14],text ); break; } linenumber++; } // Get the keycodes... while (PHYSFSX_fgets(line_buffer, 200, infile)) { sscanf(line_buffer, " %s %s ", text, buffer); keycode = DecodeKeyText(text); functionnumber = func_get_index(buffer); if (functionnumber==-1) { Error( "Unknown function, %s, in %s\n", buffer, filename ); } else if (keycode==-1) { Error( "Unknown keystroke, %s, in %s\n", text, filename ); //ui_messagebox( -2, -2, 1, buffer, "Ok" ); } else { KeyPad[n]->keycode[KeyPad[n]->numkeys] = keycode; KeyPad[n]->function_number[KeyPad[n]->numkeys] = functionnumber; KeyPad[n]->numkeys++; } } PHYSFS_close(infile); }