+/* clamp x to min..max-1 */
+#define clamp(x, min, max) \
+ if (x < (min)) x = min; \
+ if (x >= (max)) x = max
+
+static void translate_mouse(SDL_VideoDevice *this, int *x, int *y)
+{
+ struct SDL_PrivateVideoData *pdata = this->hidden;
+
+ 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);
+ }
+}
+
+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, 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);
+ }
+ }
+}
+