From 798a3e739c8dbb34c0d66bd29224df33977f26fe Mon Sep 17 00:00:00 2001 From: Youness Alaoui Date: Sat, 5 Nov 2011 17:49:43 +0000 Subject: [PATCH] Expedite: Add support for the PSL1GHT engine SVN revision: 64780 --- configure.ac | 7 + src/bin/Makefile.am | 5 + src/bin/engine_psl1ght.c | 284 +++++++++++++++++++++++++++++++++++++++ src/bin/engine_psl1ght.h | 8 ++ src/bin/main.c | 3 + src/bin/main.h | 3 + 6 files changed, 310 insertions(+) create mode 100644 src/bin/engine_psl1ght.c create mode 100644 src/bin/engine_psl1ght.h diff --git a/configure.ac b/configure.ac index 8c715a2..6a5fdcd 100644 --- a/configure.ac +++ b/configure.ac @@ -76,6 +76,9 @@ AC_SUBST(d3d_libs) # Software SDL EXPEDITE_CHECK_ENGINE([software-sdl], [Software SDL], "yes") +# PSL1GHT +EXPEDITE_CHECK_ENGINE([psl1ght], [PSL1GHT], "yes") + # GL SDL EXPEDITE_CHECK_ENGINE([opengl-sdl], [OpenGL SDL], "yes") @@ -177,6 +180,9 @@ if test "x$have_software_sdl" = "xyes" -o "x$have_gl_sdl" = "xyes"; then fi AM_CONDITIONAL(BUILD_SDL, test "x$have_sdl" = "xyes") +# PSL1GHT +AM_CONDITIONAL(BUILD_PSL1GHT, test "x$have_psl1ght" = "xyes") + # DirectFB if test "x$have_directfb" = "xyes"; then @@ -267,6 +273,7 @@ echo " Open GL SDL..................: ${have_opengl_sdl}" echo " Open GL Cocoa................: ${have_opengl_cocoa}" echo " FB...........................: ${have_fb}" echo " DirectFB.....................: ${have_directfb}" +echo " PSL1GHT......................: ${have_psl1ght}" echo " Software X11 16 bits.........: ${have_software_16_x11}" echo " Software DirectDraw 16 bits..: ${have_software_16_ddraw}" echo " Software WinCE 16 bits.......: ${have_software_16_wince}" diff --git a/src/bin/Makefile.am b/src/bin/Makefile.am index ba7cc04..4364810 100644 --- a/src/bin/Makefile.am +++ b/src/bin/Makefile.am @@ -197,6 +197,11 @@ expedite_SOURCES += \ engine_gl_sdl.c engine_gl_sdl.h endif +if BUILD_PSL1GHT +expedite_SOURCES += \ +engine_psl1ght.c +endif + if BUILD_FB expedite_SOURCES += \ engine_fb.c engine_fb.h diff --git a/src/bin/engine_psl1ght.c b/src/bin/engine_psl1ght.c new file mode 100644 index 0000000..2661a6c --- /dev/null +++ b/src/bin/engine_psl1ght.c @@ -0,0 +1,284 @@ +#include "main.h" + +#include +#include +#include + +static int window_width = 0; +static int window_height = 0; + +Eina_Bool +engine_psl1ght_args(const char *engine, int width, int height) +{ + Evas_Engine_Info_PSL1GHT *einfo; + + evas_output_method_set(evas, evas_render_method_lookup("psl1ght")); + einfo = (Evas_Engine_Info_PSL1GHT *)evas_engine_info_get(evas); + if (!einfo) + { + printf("Evas does not support the PSL1GHT Engine\n"); + return EINA_FALSE; + } + + if (!evas_engine_info_set(evas, (Evas_Engine_Info *)einfo)) + { + printf("Evas can not setup the informations of the PSL1GHT Engine\n"); + return EINA_FALSE; + } + + window_width = width; + window_height = height; + ioMouseInit(1); + ioKbInit(1); + return EINA_TRUE; +} + +void +engine_psl1ght_loop(void) +{ + mouseInfo mouseinfo; + static int mouse_connected = FALSE; + static u8 mouse_buttons = 0; + static int mouse_x = 0; + static int mouse_y = 0; + KbInfo kbInfo; + static int keyboard_connected = FALSE; + static KbLed keyboard_leds = {{0}}; + static KbMkey keyboard_mods = {{0}}; + static u16 keyboard_old_key = 0; + int i; + + /* Check mouse events */ + ioMouseGetInfo(&mouseinfo); + + if (mouseinfo.status[0] == 1 && !mouse_connected) // Connected + { + mouse_connected = TRUE; + mouse_buttons = 0; + + // Old events in the queue are discarded + ioMouseClearBuf(0); + } + else if (mouseinfo.status[0] != 1 && mouse_connected) // Disconnected + { + mouse_connected = FALSE; + mouse_buttons = 0; + } + + if (mouse_connected) + { + mouseDataList datalist; + + ioMouseGetDataList(0, &datalist); + + for (i = 0; i < datalist.count; i++) { + u8 old_left = mouse_buttons & 1; + u8 new_left = datalist.list[i].buttons & 1; + u8 old_right = mouse_buttons & 2; + u8 new_right = datalist.list[i].buttons & 2; + u8 old_middle = mouse_buttons & 4; + u8 new_middle = datalist.list[i].buttons & 4; + + mouse_x += datalist.list[i].x_axis; + mouse_y += datalist.list[i].y_axis; + if (mouse_x < 0) mouse_x = 0; + if (mouse_y < 0) mouse_y = 0; + if (mouse_x > window_width) mouse_x = window_width; + if (mouse_y > window_height) mouse_x = window_height; + + evas_event_feed_mouse_move(evas, mouse_x, mouse_y, 0, NULL); + + if (old_left != new_left) + { + if (new_left) + evas_event_feed_mouse_down(evas, 1, EVAS_BUTTON_NONE, 0, NULL); + else + evas_event_feed_mouse_up(evas, 1, EVAS_BUTTON_NONE, 0, NULL); + } + if (old_right != new_right) + { + if (new_right) + evas_event_feed_mouse_down(evas, 3, EVAS_BUTTON_NONE, 0, NULL); + else + evas_event_feed_mouse_up(evas, 3, EVAS_BUTTON_NONE, 0, NULL); + } + if (old_middle != new_middle) + { + if (new_middle) + evas_event_feed_mouse_down(evas, 2, EVAS_BUTTON_NONE, 0, NULL); + else + evas_event_feed_mouse_up(evas, 2, EVAS_BUTTON_NONE, 0, NULL); + } + mouse_buttons = datalist.list[i].buttons; + } + } + + /* Check keyboard events */ + ioKbGetInfo(&kbInfo); + + if (kbInfo.status[0] == 1 && !keyboard_connected) + { + /* Connected */ + keyboard_connected = true; + + // Old events in the queue are discarded + ioKbClearBuf(0); + keyboard_leds._KbLedU.leds = 0; + keyboard_mods._KbMkeyU.mkeys = 0; + keyboard_old_key = 0; + + // Set raw keyboard code types to get scan codes + ioKbSetCodeType(0, KB_CODETYPE_ASCII); + ioKbSetReadMode(0, KB_RMODE_INPUTCHAR); + } + else if (kbInfo.status[0] != 1 && keyboard_connected) + { + /* Disconnected keyboard */ + keyboard_connected = FALSE; + } + + if (keyboard_connected) + { + KbData Keys; + + // Read data from the keyboard buffer + if (ioKbRead(0, &Keys) == 0 && Keys.nb_keycode > 0) + { + if (Keys.mkey._KbMkeyU._KbMkeyS.l_shift != + keyboard_mods._KbMkeyU._KbMkeyS.l_shift || + Keys.mkey._KbMkeyU._KbMkeyS.r_shift != + keyboard_mods._KbMkeyU._KbMkeyS.r_shift) + { + if (Keys.mkey._KbMkeyU._KbMkeyS.r_shift || + Keys.mkey._KbMkeyU._KbMkeyS.l_shift) + evas_key_modifier_on(evas, "Shift"); + else + evas_key_modifier_off(evas, "Shift"); + } + if (Keys.mkey._KbMkeyU._KbMkeyS.l_ctrl != + keyboard_mods._KbMkeyU._KbMkeyS.l_ctrl || + Keys.mkey._KbMkeyU._KbMkeyS.r_ctrl != + keyboard_mods._KbMkeyU._KbMkeyS.r_ctrl) + { + if (Keys.mkey._KbMkeyU._KbMkeyS.r_ctrl || + Keys.mkey._KbMkeyU._KbMkeyS.l_ctrl) + evas_key_modifier_on(evas, "Control"); + else + evas_key_modifier_off(evas, "Control"); + } + if (Keys.mkey._KbMkeyU._KbMkeyS.l_alt != + keyboard_mods._KbMkeyU._KbMkeyS.l_alt || + Keys.mkey._KbMkeyU._KbMkeyS.r_alt != + keyboard_mods._KbMkeyU._KbMkeyS.r_alt) + { + if (Keys.mkey._KbMkeyU._KbMkeyS.r_alt || + Keys.mkey._KbMkeyU._KbMkeyS.l_alt) + evas_key_modifier_on(evas, "Alt"); + else + evas_key_modifier_off(evas, "Alt"); + } + if (Keys.mkey._KbMkeyU._KbMkeyS.l_win != + keyboard_mods._KbMkeyU._KbMkeyS.l_win || + Keys.mkey._KbMkeyU._KbMkeyS.r_win != + keyboard_mods._KbMkeyU._KbMkeyS.r_win) + { + if (Keys.mkey._KbMkeyU._KbMkeyS.r_win || + Keys.mkey._KbMkeyU._KbMkeyS.l_win) + evas_key_modifier_on(evas, "Super"); + else + evas_key_modifier_off(evas, "Super"); + } + keyboard_mods = Keys.mkey; + + if (Keys.led._KbLedU._KbLedS.num_lock != + keyboard_leds._KbLedU._KbLedS.num_lock) + { + if (Keys.led._KbLedU._KbLedS.num_lock) + evas_key_lock_on(evas, "Num_Lock"); + else + evas_key_lock_on(evas, "Num_Lock"); + } + if (Keys.led._KbLedU._KbLedS.caps_lock != + keyboard_leds._KbLedU._KbLedS.caps_lock) + { + if (Keys.led._KbLedU._KbLedS.caps_lock) + evas_key_lock_on(evas, "Caps_Lock"); + else + evas_key_lock_on(evas, "Caps_Lock"); + } + if (Keys.led._KbLedU._KbLedS.scroll_lock != + keyboard_leds._KbLedU._KbLedS.scroll_lock) + { + if (Keys.led._KbLedU._KbLedS.scroll_lock) + evas_key_lock_on(evas, "Scroll_Lock"); + else + evas_key_lock_on(evas, "Scroll_Lock"); + } + keyboard_leds = Keys.led; + + for (i = 0; i < Keys.nb_keycode; i++) { + if (Keys.keycode[i] != keyboard_old_key) + { + u16 key = Keys.keycode[i]; + char *key_str = NULL; + + if (key == 0) + key = keyboard_old_key; + key_str = (char *)&key; + + printf ("Key %d is %X\n", i, key); + key &= ~KB_KEYPAD; + if (key & KB_RAWDAT) + { + key &= 0xFF; + if (key == KB_RAWKEY_ESCAPE) + key_str = "Escape"; + else if (key == KB_RAWKEY_ENTER) + key_str = "Return"; + else if (key == KB_RAWKEY_UP_ARROW) + key_str = "Up"; + else if (key == KB_RAWKEY_DOWN_ARROW) + key_str = "Down"; + else if (key == KB_RAWKEY_LEFT_ARROW) + key_str = "Left"; + else if (key == KB_RAWKEY_RIGHT_ARROW) + key_str = "Right"; + else + key_str = NULL; + } + else { + if (key == 0x0A) + key_str = "Return"; + else { + key_str[0] = key_str[1]; + key_str[1] = 0; + } + } + if (key_str) + { + if (Keys.keycode[i] != 0) + { + printf ("Key %s pressed\n", key_str); + evas_event_feed_key_up(evas, key_str, key_str, NULL, NULL, 0, NULL); + } + else { + evas_event_feed_key_down(evas, key_str, key_str, NULL, NULL, 0, NULL); + printf ("Key %s released\n", key_str); + } + } + keyboard_old_key = Keys.keycode[0]; + } + } + } + } + return; +} + +void +engine_psl1ght_shutdown(void) +{ + ioMouseEnd(); + ioKbEnd(); + return; +} + diff --git a/src/bin/engine_psl1ght.h b/src/bin/engine_psl1ght.h new file mode 100644 index 0000000..69610c5 --- /dev/null +++ b/src/bin/engine_psl1ght.h @@ -0,0 +1,8 @@ +#ifndef ENGINE_SOFTWARE_PSL1GHT_H +#define ENGINE_SOFTWARE_PSL1GHT_H + +Eina_Bool engine_psl1ght_args(const char *engine, int width, int height); +void engine_psl1ght_loop(void); +void engine_psl1ght_shutdown(void); + +#endif diff --git a/src/bin/main.c b/src/bin/main.c index 29c23d4..ba0bd8d 100644 --- a/src/bin/main.c +++ b/src/bin/main.c @@ -1174,6 +1174,9 @@ static const Expedite_Engine engines[] = { #if HAVE_EVAS_OPENGL_COCOA { "gl-cocoa", engine_gl_cocoa_args, engine_gl_cocoa_loop, engine_gl_cocoa_shutdown }, #endif +#if HAVE_EVAS_PSL1GHT + { "psl1ght", engine_psl1ght_args, engine_psl1ght_loop, engine_psl1ght_shutdown }, +#endif #if HAVE_EVAS_SOFTWARE_16_X11 { "x11-16",engine_software_16_x11_args, engine_software_16_x11_loop, engine_software_16_x11_shutdown }, #endif diff --git a/src/bin/main.h b/src/bin/main.h index c0f1348..882c88b 100644 --- a/src/bin/main.h +++ b/src/bin/main.h @@ -64,6 +64,9 @@ #if HAVE_EVAS_OPENGL_COCOA #include "engine_gl_cocoa.h" #endif +#if HAVE_EVAS_PSL1GHT +#include "engine_psl1ght.h" +#endif #if HAVE_EVAS_SOFTWARE_16_X11 #include "engine_software_16_x11.h" #endif