Index: ase-0.8.2/src/jinete/jsystem.cpp =================================================================== --- ase-0.8.2.orig/src/jinete/jsystem.cpp 2011-06-14 22:25:51.681509956 +0200 +++ ase-0.8.2/src/jinete/jsystem.cpp 2011-06-16 12:39:33.218215092 +0200 @@ -29,6 +29,8 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +// #include + #include "config.h" #include @@ -355,6 +357,9 @@ return mouse_scares == 0; } +/* used by keyboard-mouse code by david */ +static int key_mouse_b = 0; + /** * Updates the mouse information (position, wheel and buttons). * @@ -369,7 +374,7 @@ poll_mouse(); - m_b[0] = mouse_b; + m_b[0] = mouse_b | key_mouse_b; m_z[0] = mouse_z; update_mouse_position(); @@ -438,8 +443,135 @@ return false; } + +/* keyboard mouse emulation code inserted by david */ +static void keyboard_mouse() +{ + static int last_clock = ji_clock; + static int speed_x = 0; + static int speed_y = 0; + static int delta_x = 0; + static int delta_y = 0; + + const int scale = 1000; + const int max_speed = 1000; // [scale]*px/ms + + int now = ji_clock; + int delta_t = now - last_clock; + int ak = 1; + int ad = 10; + + if (delta_t == 0) + { + return; + } + + /* The patched jmessage.cpp filters out all arrow key messages, unless the + shift key is held, so it's better to disable the keyboard mouse on shift + key */ + int shift = key_shifts&KB_SHIFT_FLAG; + + if (!shift && key[KEY_LEFT]) { + speed_x -= ak*delta_t; + } + else if (!shift && key[KEY_RIGHT]) { + speed_x += ak*delta_t; + } + else { + if (speed_x < 0) + { + speed_x = speed_x + ad*delta_t; + speed_x = speed_x > 0 ? 0 : speed_x; + } + else + { + speed_x = speed_x - ad*delta_t; + speed_x = speed_x < 0 ? 0 : speed_x; + } + } + + if (!shift && key[KEY_UP]) { + speed_y -= ak*delta_t; + } + else if (!shift && key[KEY_DOWN]) { + speed_y += ak*delta_t; + } + else { + if (speed_y < 0) + { + speed_y = speed_y + ad*delta_t; + speed_y = speed_y > 0 ? 0 : speed_y; + } + else + { + speed_y = speed_y - ad*delta_t; + speed_y = speed_y < 0 ? 0 : speed_y; + } + } + + if (speed_x > max_speed) + speed_x = max_speed; + if (speed_x < -max_speed) + speed_x = -max_speed; + if (speed_y > max_speed) + speed_y = max_speed; + if (speed_y < -max_speed) + speed_y = -max_speed; + + delta_x += delta_t*speed_x; + delta_y += delta_t*speed_y; + + // fprintf (stderr, "%i %i %i %i %i\n", delta_t, speed_x, speed_y, delta_x, delta_y); + // fprintf (stderr, "now %i %i then %i %i %i\n", mouse_x, mouse_y, + // mouse_x+delta_x/scale, mouse_y+delta_y/scale); + + int int_delta_x = delta_x/scale; + int int_delta_y = delta_y/scale; + delta_x %= scale; + delta_y %= scale; + + if (int_delta_x || int_delta_y) { + int pos = mouse_pos; + int x = (pos>>16) + int_delta_x; + int y = (pos&0xffff) + int_delta_y; + + if (x >= screen->w) + { + speed_x = 0; + x = screen->w; + } + if (x < 0) + { + speed_x = 0; + x = 0; + } + if (y >= screen->h) + { + speed_y = 0; + y = screen->h; + } + if (y < 0) + { + speed_y = 0; + y = 0; + } + + position_mouse(x, y); + } + + /* mouse buttons */ + key_mouse_b = 0; + if (key[KEY_F1]) key_mouse_b |= 1; /* left */ + if (key[KEY_F2]) key_mouse_b |= 4; /* middle */ + if (key[KEY_F3]) key_mouse_b |= 2; /* right */ + + last_clock = now; +} + static void update_mouse_position() { + keyboard_mouse(); + if (ji_screen == screen) { m_x[0] = mouse_x; m_y[0] = mouse_y; Index: ase-0.8.2/data/gui.xml =================================================================== --- ase-0.8.2.orig/data/gui.xml 2011-06-14 23:37:49.391508728 +0200 +++ ase-0.8.2/data/gui.xml 2011-06-14 23:44:56.211508608 +0200 @@ -45,14 +45,14 @@ - - + + - - + + Index: ase-0.8.2/src/jinete/jmessage.cpp =================================================================== --- ase-0.8.2.orig/src/jinete/jmessage.cpp 2011-06-16 12:43:59.718215107 +0200 +++ ase-0.8.2/src/jinete/jmessage.cpp 2011-06-19 12:35:11.813186277 +0200 @@ -81,6 +81,22 @@ msg->key.propagate_to_children = false; msg->key.propagate_to_parent = true; + /* ignore keys used for mouse emuliation unless shift is pressed, to not + * interfere with the keyboard-mouse (some menus would close when + * receiveing key events) */ + switch (msg->key.scancode) + { + case KEY_UP: + case KEY_DOWN: + case KEY_LEFT: + case KEY_RIGHT: + case KEY_F1: + case KEY_F2: + case KEY_F3: + if (!(msg->any.shifts&KB_SHIFT_FLAG)) + msg->any.used = true; + } + #if 0 printf("%i: %i %i [%c]\n", type, msg->key.scancode, msg->key.ascii, msg->key.ascii);