home *** CD-ROM | disk | FTP | other *** search
/ ftp.whtech.com / ftp.whtech.com.7z / ftp.whtech.com / emulators / v9t9 / linux / sources / V9t9 / source / Modules / keyboard_gtk.c < prev    next >
Encoding:
C/C++ Source or Header  |  2006-10-19  |  6.8 KB  |  316 lines

  1.  
  2. #include <gtk/gtk.h>
  3. #include <gdk/gdkkeysyms.h>
  4. #include "gtkinterface.h"
  5. #include "gtkloop.h"
  6.  
  7. #include "v9t9_common.h"
  8. #include "v9t9.h"
  9. #include "timer.h"
  10. #include "keyboard.h"
  11. #include "command.h"
  12.  
  13. #define _L LOG_KEYBOARD|LOG_INFO
  14.  
  15. void       GTK_keyboard_set_key(guint key, int onoff)
  16. {
  17.     logger(_L|L_1, "GTK key = %02X (%d)\n", key, onoff);
  18.     if (key >= GDK_a && key <= GDK_z)
  19.         key += (GDK_A - GDK_a);
  20.  
  21.     // a few troublesome keys that won't work because
  22.     // they're shifted, and we already detect the shift key.
  23.     switch (key)
  24.     {
  25.     case GDK_colon:        key = GDK_semicolon; break;
  26.     case GDK_plus:        key = GDK_equal; break;
  27.     case GDK_exclam:    key = GDK_1; break;
  28.     case GDK_at:        key = GDK_2; break;
  29.     case GDK_numbersign:key = GDK_3; break;
  30.     case GDK_dollar:    key = GDK_4; break;
  31.     case GDK_percent:    key = GDK_5; break;
  32.     case GDK_asciicircum:key = GDK_6; break;
  33.     case GDK_ampersand:    key = GDK_7; break;
  34.     case GDK_asterisk:    key = GDK_8; break;
  35.     case GDK_parenleft:    key = GDK_9; break;
  36.     case GDK_parenright:key = GDK_0; break;
  37.     case GDK_less:        key = GDK_comma; break;
  38.     case GDK_greater:    key = GDK_period; break;
  39.     }
  40.  
  41.     if (key < 128 && ASCII_DIRECT_TO_9901(key)) {
  42.         logger(_L, "direct key\n");
  43.         keyboard_setkey(onoff, 0, key);
  44.     } else 
  45.         switch (key) {
  46.         case GDK_Escape:
  47.             keyboard_setkey(onoff, 0, SK_ESC);
  48.             break;
  49.         case GDK_Tab: case GDK_KP_Tab:
  50.             keyboard_setkey(onoff, 0, SK_TAB);
  51.             break;
  52.  
  53.         case GDK_F1: case GDK_F2: case GDK_F3: case GDK_F4: case GDK_F5:
  54.         case GDK_F6: case GDK_F7: case GDK_F8: case GDK_F9: case GDK_F10:
  55.         case GDK_F11: case GDK_F12:
  56.             keyboard_setkey(onoff, 0, SK_F1 + (key - GDK_F1));
  57.             break;
  58.  
  59.         case GDK_Scroll_Lock:
  60.         case GDK_Num_Lock:
  61.             if (!onoff)
  62.                 command_parse_text("DumpKeyMap\n");
  63.             break;
  64.  
  65.         case GDK_Return:
  66.             keyboard_setkey(onoff, 0, '\r');
  67.             break;
  68.  
  69.         case GDK_Caps_Lock:
  70.             if (!onoff)
  71.                 caps ^= 1;
  72.             break;
  73.         case GDK_Break:
  74.             if (onoff)
  75.                 command_parse_text("Die\n");
  76.             break;
  77.         case GDK_Pause:
  78.             if (onoff)
  79.                 command_parse_text("Interactive=on\n");
  80.             break;
  81.  
  82.             // shifts
  83.         case GDK_Shift_L:
  84.         case GDK_Shift_R:
  85.             keyboard_setkey(onoff, SHIFT, 0);
  86.             break;
  87.         case GDK_Control_L:
  88.         case GDK_Control_R:
  89.             keyboard_setkey(onoff, CTRL, 0);
  90.             break;
  91.         case GDK_Alt_L:
  92.         case GDK_Alt_R:
  93.         case GDK_Meta_L:
  94.         case GDK_Meta_R:
  95.             keyboard_setkey(onoff, FCTN, 0);
  96.             break;
  97.  
  98.                     // cursor
  99.         case GDK_Up:
  100.             keyboard_setkey(onoff, FCTN, 'E');
  101.             break;
  102.         case GDK_Down:
  103.             keyboard_setkey(onoff, FCTN, 'X');
  104.             break;
  105.         case GDK_Left:
  106.         case GDK_BackSpace:
  107.             keyboard_setkey(onoff, FCTN, 'S');
  108.             break;
  109.         case GDK_Right:
  110.             keyboard_setkey(onoff, FCTN, 'D');
  111.             break;
  112.         case GDK_Insert:
  113.             keyboard_setkey(onoff, FCTN, '2');    // INSERT
  114.             break;
  115.         case GDK_Delete:
  116.             keyboard_setkey(onoff, FCTN, '1');    // DELETE
  117.             break;
  118.         case GDK_Page_Up:
  119.             keyboard_setkey(onoff, FCTN, '6');    // PGUP
  120.             break;
  121.         case GDK_Page_Down:
  122.             keyboard_setkey(onoff, FCTN, '4');    // PGDN
  123.             break;
  124.         case GDK_Begin:
  125.             keyboard_setkey(onoff, FCTN, '5');    // BEGIN
  126.             break;
  127.         case GDK_End:    // ???
  128.         case GDK_Redo:
  129.             keyboard_setkey(onoff, FCTN, '8');    // REDO
  130.             break;
  131.         case GDK_Help:
  132.             keyboard_setkey(onoff, FCTN, '7');    // AID
  133.             break;
  134.  
  135.             // faked keys
  136.         case GDK_grave:
  137.         case GDK_asciitilde:
  138.             if (!(realshift & SHIFT) && !keyboard_isset(FCTN, 'W'))
  139.                 keyboard_setkey(onoff, FCTN, 'C');    /* ` */
  140.             else
  141.                 keyboard_setkey(onoff, FCTN, 'W');    /* ~ */
  142.             break;
  143.         case GDK_minus:
  144.         case GDK_underscore:
  145.             if (!(realshift & SHIFT) && !keyboard_isset(FCTN, 'U'))
  146.                 keyboard_setkey(onoff, SHIFT, '/');    /* - */
  147.             else
  148.                 keyboard_setkey(onoff, FCTN, 'U');    /* _ */
  149.             break;
  150.         case GDK_bracketleft:
  151.         case GDK_braceleft:
  152.             if (!(realshift & SHIFT) && !keyboard_isset(FCTN, 'F'))
  153.                 keyboard_setkey(onoff, FCTN, 'R');    /* [ */
  154.             else
  155.                 keyboard_setkey(onoff, FCTN, 'F');    /* { */
  156.             break;
  157.         case GDK_bracketright:
  158.         case GDK_braceright:
  159.             if (!(realshift & SHIFT) && !keyboard_isset(FCTN, 'G'))
  160.                 keyboard_setkey(onoff, FCTN, 'T');    /* ] */
  161.             else
  162.                 keyboard_setkey(onoff, FCTN, 'G');    /* } */
  163.             break;
  164.         case GDK_apostrophe:
  165.         case GDK_quotedbl:
  166.             if (!(realshift & SHIFT) && !keyboard_isset(FCTN, 'P'))
  167.                 keyboard_setkey(onoff, FCTN, 'O');    /* ' */
  168.             else
  169.                 keyboard_setkey(onoff, FCTN, 'P');    /* " */
  170.             break;
  171.         case GDK_slash:
  172.         case GDK_question:
  173.             if (!(realshift & SHIFT) && !keyboard_isset(FCTN, 'I'))
  174.                 keyboard_setkey(onoff, 0, '/');    /* / */
  175.             else
  176.                 keyboard_setkey(onoff, FCTN, 'I');    /* ? */
  177.             break;
  178.         case GDK_backslash:
  179.         case GDK_bar:
  180.             if (!(realshift & SHIFT) && !keyboard_isset(FCTN, 'A'))
  181.                 keyboard_setkey(onoff, FCTN, 'Z');    /* \\ */
  182.             else
  183.                 keyboard_setkey(onoff, FCTN, 'A');    /* | */
  184.             break;
  185.  
  186.             // mouse movement
  187. #define NP_JOYST    1
  188. #define NP_MAG        ((int)onoff)
  189.  
  190.         case GDK_KP_8:
  191.             keyboard_setjoyst(NP_JOYST, JOY_Y, 0, -NP_MAG, 0);
  192.             break;
  193.         case GDK_KP_2:
  194.             keyboard_setjoyst(NP_JOYST, JOY_Y, 0, NP_MAG, 0);
  195.             break;
  196.         case GDK_KP_4:
  197.             keyboard_setjoyst(NP_JOYST, JOY_X, -NP_MAG, 0, 0);
  198.             break;
  199.         case GDK_KP_6:
  200.             keyboard_setjoyst(NP_JOYST, JOY_X, NP_MAG, 0, 0);
  201.             break;
  202.         case GDK_KP_7:
  203.             keyboard_setjoyst(NP_JOYST, JOY_X | JOY_Y, -NP_MAG, -NP_MAG, 0);
  204.             break;
  205.         case GDK_KP_9:
  206.             keyboard_setjoyst(NP_JOYST, JOY_X | JOY_Y, NP_MAG, -NP_MAG, 0);
  207.             break;
  208.         case GDK_KP_1:
  209.             keyboard_setjoyst(NP_JOYST, JOY_X | JOY_Y, -NP_MAG, NP_MAG, 0);
  210.             break;
  211.         case GDK_KP_3:
  212.             keyboard_setjoyst(NP_JOYST, JOY_X | JOY_Y, NP_MAG, NP_MAG, 0);
  213.             break;
  214.         case GDK_KP_5:
  215.             keyboard_setjoyst(NP_JOYST, JOY_X | JOY_Y, 0, 0, 0);
  216.             break;
  217.  
  218.         case GDK_KP_0:
  219.             keyboard_setjoyst(NP_JOYST, JOY_B, 0, 0, NP_MAG);
  220.             break;
  221.         }
  222. }
  223.  
  224. static      vmResult
  225. gtkkeyboard_detect(void)
  226. {
  227.     return vmOk;
  228. }
  229.  
  230. static      vmResult
  231. gtkkeyboard_init(void)
  232. {
  233.     features |= FE_KEYBOARD;
  234.     return vmOk;
  235. }
  236.  
  237. static      vmResult
  238. gtkkeyboard_enable(void)
  239. {
  240.     return vmOk;
  241. }
  242.  
  243. static      vmResult
  244. gtkkeyboard_disable(void)
  245. {
  246.     return vmOk;
  247. }
  248.  
  249. static      vmResult
  250. gtkkeyboard_restart(void)
  251. {
  252.     realshift = 0;
  253.     memset(crukeyboardmap, 0, 6);
  254.     crukeyboardmap[6] = crukeyboardmap[7] = 0x0;
  255.  
  256.     // select up and down keypresses
  257.     my_assert(v9t9_drawing_area);
  258.  
  259.     gdk_window_set_events(v9t9_drawing_area->window,
  260.                           gdk_window_get_events(v9t9_drawing_area->window) |
  261.                           GDK_KEY_RELEASE_MASK | GDK_KEY_PRESS_MASK);
  262.  
  263.     return vmOk;
  264. }
  265.  
  266. static      vmResult
  267. gtkkeyboard_restop(void)
  268. {
  269.     return vmOk;
  270. }
  271.  
  272. static      vmResult
  273. gtkkeyboard_term(void)
  274. {
  275.     return vmOk;
  276. }
  277.  
  278. static      vmResult
  279. gtkkeyboard_scan(void)
  280. {
  281.     return vmOk;
  282. }
  283.  
  284. static      vmResult
  285. gtkkeyboard_getspecialkeys(SpecialKey ** list)
  286. {
  287.     static SpecialKey none[] = { 0 };
  288.  
  289.     *list = none;
  290.     return vmOk;
  291. }
  292.  
  293. static vmKeyboardModule gtkKbdModule = {
  294.     3,
  295.     gtkkeyboard_scan,
  296.     gtkkeyboard_getspecialkeys
  297. };
  298.  
  299. vmModule    gtkKeyboard = {
  300.     3,
  301.     "GTK+ keyboard",
  302.     "kbdGTK",
  303.  
  304.     vmTypeKeyboard,
  305.     vmFlagsExclusive,
  306.  
  307.     gtkkeyboard_detect,
  308.     gtkkeyboard_init,
  309.     gtkkeyboard_term,
  310.     gtkkeyboard_enable,
  311.     gtkkeyboard_disable,
  312.     gtkkeyboard_restart,
  313.     gtkkeyboard_restop,
  314.     {(vmGenericModule *) & gtkKbdModule}
  315. };
  316.