/*
- * (C) Gražvydas "notaz" Ignotas, 2010
+ * (C) Gražvydas "notaz" Ignotas, 2010-2012
*
* This work is licensed under the terms of the GNU LGPL, version 2.1 or later.
* See the COPYING file in the top-level directory.
#include "../../events/SDL_events_c.h"
#include "linux/xenv.h"
-#include "omapsdl.h"
+#include "osdl.h"
static int omap_available(void)
struct SDL_PrivateVideoData *pdata = this->hidden;
SDL_PixelFormat *format;
Uint32 unhandled_flags;
+ int doublebuf;
void *fbmem;
trace("%d, %d, %d, %08x", width, height, bpp, flags);
}
}
+ 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, (flags & SDL_DOUBLEBUF) ? 1 : 0);
+ width, height, bpp, &doublebuf);
if (fbmem == NULL) {
- log("failing on mode %dx%d@%d, doublebuf %s",
- width, height, bpp, (flags & SDL_DOUBLEBUF) ? "on" : "off");
+ err("failing on mode %dx%d@%d, doublebuf %s, border %d,%d,%d,%d",
+ width, height, bpp, (flags & SDL_DOUBLEBUF) ? "on" : "off",
+ pdata->border_l, pdata->border_r, pdata->border_t, pdata->border_b);
return NULL;
}
+ if ((flags & SDL_DOUBLEBUF) && !doublebuf) {
+ log("doublebuffering could not be set\n");
+ flags &= ~SDL_DOUBLEBUF;
+ }
flags |= SDL_FULLSCREEN | SDL_HWSURFACE;
unhandled_flags = flags & ~(SDL_FULLSCREEN | SDL_HWSURFACE | SDL_DOUBLEBUF);
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 mouseb_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 mousem_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 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(NULL, mouseb_event_cb, mousem_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)