#include <stdio.h>
#include <stdlib.h>
+#include <X11/XF86keysym.h>
#include "../SDL_sysvideo.h"
#include "../SDL_pixels_c.h"
#include "../../events/SDL_events_c.h"
#include "linux/xenv.h"
-#include "omapsdl.h"
+#include "osdl.h"
static int omap_available(void)
doublebuf = (flags & SDL_DOUBLEBUF) ? 1 : 0;
fbmem = osdl_video_set_mode(pdata,
pdata->border_l, pdata->border_r, pdata->border_t, pdata->border_b,
- width, height, bpp, &doublebuf);
+ width, height, bpp, &doublebuf, this->wm_title);
if (fbmem == NULL) {
err("failing on mode %dx%d@%d, doublebuf %s, border %d,%d,%d,%d",
width, height, bpp, (flags & SDL_DOUBLEBUF) ? "on" : "off",
trace();
}
-static int key_event_cb(void *cb_arg, int sdl_kc, int is_pressed)
+static int key_event_cb(void *cb_arg, int sdl_kc, int sdl_sc, int is_pressed)
{
SDL_keysym keysym = { 0, };
+ int shift = 0;
+ SDLMod mod;
+ int ret;
keysym.sym = sdl_kc;
+ keysym.scancode = sdl_sc;
+
+ /* 0xff if pandora's Fn, so we exclude it too.. */
+ if (is_pressed && sdl_kc < 0xff && SDL_TranslateUNICODE) {
+ mod = SDL_GetModState();
+ if (!(mod & KMOD_CTRL) && (!!(mod & KMOD_SHIFT) ^ !!(mod & KMOD_CAPS)))
+ shift = 1;
+
+ /* prefer X mapping, if that doesn't work use hardcoded one */
+ ret = xenv_keycode_to_keysym(sdl_sc, shift);
+ if (ret >= 0) {
+ keysym.unicode = ret;
+ if ((mod & KMOD_CTRL)
+ && 0x60 <= keysym.unicode && keysym.unicode <= 0x7f)
+ {
+ keysym.unicode -= 0x60;
+ }
+ /* hmh.. */
+ if ((keysym.unicode & 0xff00) == 0xff00)
+ keysym.unicode &= ~0xff00;
+ }
+ else {
+ keysym.unicode = sdl_kc;
+ if ((mod & KMOD_CTRL) && 0x60 <= sdl_kc && sdl_kc <= 0x7f)
+ {
+ keysym.unicode = sdl_kc - 0x60;
+ }
+ else if (shift && 'a' <= sdl_kc && sdl_kc <= 'z')
+ {
+ keysym.unicode = sdl_kc - 'a' + 'A';
+ }
+ }
+ }
+
SDL_PrivateKeyboard(is_pressed, &keysym);
}
if (x < (min)) x = min; \
if (x >= (max)) x = max
-static int ts_event_cb(void *cb_arg, int x, int y, unsigned int pressure)
+static void translate_mouse(SDL_VideoDevice *this, int *x, int *y)
{
- static int was_pressed;
- SDL_VideoDevice *this = cb_arg;
struct SDL_PrivateVideoData *pdata = this->hidden;
- int xoffs;
if (!pdata->cfg_no_ts_translate && pdata->layer_w != 0 && pdata->layer_h != 0) {
- x = pdata->border_l + ((x - pdata->layer_x) * pdata->ts_xmul >> 16);
- y = pdata->border_t + ((y - pdata->layer_y) * pdata->ts_ymul >> 16);
- clamp(x, 0, this->screen->w);
- clamp(y, 0, this->screen->h);
+ *x = pdata->border_l + ((*x - pdata->layer_x) * pdata->ts_xmul >> 16);
+ *y = pdata->border_t + ((*y - pdata->layer_y) * pdata->ts_ymul >> 16);
+ clamp(*x, 0, this->screen->w);
+ clamp(*y, 0, this->screen->h);
}
+}
- SDL_PrivateMouseMotion(0, 0, x, y);
+static int ts_event_cb(void *cb_arg, int x, int y, unsigned int pressure)
+{
+ static int was_pressed;
+ SDL_VideoDevice *this = cb_arg;
+ struct SDL_PrivateVideoData *pdata = this->hidden;
+
+ translate_mouse(this, &x, &y);
pressure = !!pressure;
if (pressure != was_pressed) {
- SDL_PrivateMouseButton(pressure ? SDL_PRESSED : SDL_RELEASED, 1, 0, 0);
+ SDL_PrivateMouseButton(pressure ? SDL_PRESSED : SDL_RELEASED, 1, x, y);
was_pressed = pressure;
}
+ else
+ SDL_PrivateMouseMotion(0, 0, x, y);
+}
+
+static int xmouseb_event_cb(void *cb_arg, int x, int y, int button, int is_pressed)
+{
+ SDL_VideoDevice *this = cb_arg;
+ struct SDL_PrivateVideoData *pdata = this->hidden;
+
+ translate_mouse(this, &x, &y);
+ SDL_PrivateMouseButton(is_pressed ? SDL_PRESSED : SDL_RELEASED, button, x, y);
+}
+
+static int xmousem_event_cb(void *cb_arg, int x, int y)
+{
+ SDL_VideoDevice *this = cb_arg;
+ struct SDL_PrivateVideoData *pdata = this->hidden;
+
+ translate_mouse(this, &x, &y);
+ SDL_PrivateMouseMotion(0, 0, x, y);
+}
+
+static int xkey_cb(void *cb_arg, int kc, int is_pressed)
+{
+ SDL_VideoDevice *this = cb_arg;
+ struct SDL_PrivateVideoData *pdata = this->hidden;
+ int ret;
+
+ if (kc == XF86XK_MenuKB && is_pressed) {
+ ret = osdl_video_pause(pdata, 1);
+ if (ret == 0) {
+ xenv_minimize();
+ osdl_video_pause(pdata, 0);
+ omapsdl_input_get_events(0, NULL, NULL, NULL);
+ }
+ }
}
static void omap_PumpEvents(SDL_VideoDevice *this)
{
struct SDL_PrivateVideoData *pdata = this->hidden;
- int dummy;
+ int read_tslib = 1;
trace();
- omapsdl_input_get_events(0, key_event_cb, ts_event_cb, this);
+ if (pdata->xenv_up) {
+ if (!pdata->cfg_ts_force_tslib) {
+ xenv_update(xkey_cb, xmouseb_event_cb, xmousem_event_cb, this);
+ if (pdata->xenv_mouse)
+ read_tslib = 0;
+ }
+ else {
+ /* just flush X event queue */
+ xenv_update(NULL, NULL, NULL, NULL);
+ }
+ }
- // XXX: we might want to process some X events too
- if (pdata->xenv_up)
- xenv_update(&dummy);
+ omapsdl_input_get_events(0, key_event_cb,
+ read_tslib ? ts_event_cb : NULL, this);
}
static SDL_VideoDevice *omap_create(int devindex)