From 20ac4bae89cb3b3539b140d87228b000277db439 Mon Sep 17 00:00:00 2001 From: "Ryan C. Gordon" Date: Tue, 27 May 2014 15:40:03 -0400 Subject: [PATCH] Some updates for the X11 drag areas work. --- src/video/x11/SDL_x11events.c | 55 +++++++++++++++++++---------------- 1 file changed, 30 insertions(+), 25 deletions(-) diff --git a/src/video/x11/SDL_x11events.c b/src/video/x11/SDL_x11events.c index db6a301d1cca6..fc96d1b268b68 100644 --- a/src/video/x11/SDL_x11events.c +++ b/src/video/x11/SDL_x11events.c @@ -273,27 +273,24 @@ X11_DispatchUnmapNotify(SDL_WindowData *data) } static void -InitiateWindowMove(SDL_Window *window) +InitiateWindowMove(_THIS, const SDL_WindowData *data, const SDL_Point *point) { - SDL_SysWMinfo info; - SDL_VERSION(&info.version); - SDL_GetWindowWMInfo(window, &info); - Display *display = info.info.x11.display; - - int bx, by, dx, dy; - SDL_GetWindowPosition(window, &bx, &by); - SDL_GetMouseState(&dx, &dy); + SDL_VideoData *viddata = (SDL_VideoData *) _this->driverdata; + SDL_Window* window = data->window; + Display *display = viddata->display; + + /* !!! FIXME: we need to regrab this if necessary when the drag is done. */ X11_XUngrabPointer(display, 0L); X11_XFlush(display); XEvent evt; evt.xclient.type = ClientMessage; - evt.xclient.window = info.info.x11.window; + evt.xclient.window = data->xwindow; evt.xclient.message_type = X11_XInternAtom(display, "_NET_WM_MOVERESIZE", False); evt.xclient.format = 32; - evt.xclient.data.l[0] = bx + dx; - evt.xclient.data.l[1] = by + dy; - evt.xclient.data.l[2] = 8; /* _NET_WM_MOVERESIZE_MOVE */ + evt.xclient.data.l[0] = window->x + point->x; + evt.xclient.data.l[1] = window->y + point->y; + evt.xclient.data.l[2] = 8; /* _NET_WM_MOVERESIZE_MOVE */ /* !!! FIXME: hardcoded 8? */ evt.xclient.data.l[3] = Button1; evt.xclient.data.l[4] = 0; X11_XSendEvent(display, DefaultRootWindow(display), False, SubstructureRedirectMask | SubstructureNotifyMask, &evt); @@ -301,20 +298,26 @@ InitiateWindowMove(SDL_Window *window) X11_XSync(display, 0); } -static void -ProcessDragArea(SDL_WindowData* data) +static SDL_bool +ProcessDragArea(_THIS, const SDL_WindowData *data, const XEvent *xev) { - SDL_Window* window = data->window; - SDL_Mouse* mouse = SDL_GetMouse(); - int i; + const SDL_Window *window = data->window; const int num_areas = window->num_drag_areas; - const SDL_Point point = {mouse->x, mouse->y}; - const SDL_Rect *areas = window->drag_areas; - for(i = 0;i < num_areas;++i) { - if (SDL_PointInRect(&point, &areas[i])) { - InitiateWindowMove(window); + + if (num_areas > 0) { + const SDL_Point point = { xev->xbutton.x, xev->xbutton.y }; + const SDL_Rect *areas = window->drag_areas; + int i; + + for (i = 0; i < num_areas; i++) { + if (SDL_PointInRect(&point, &areas[i])) { + InitiateWindowMove(_this, data, &point); + return SDL_TRUE; /* dragging, drop this event. */ + } } } + + return SDL_FALSE; /* not a drag area. */ } static void @@ -754,8 +757,10 @@ X11_DispatchEvent(_THIS) if (X11_IsWheelEvent(display,&xevent,&ticks)) { SDL_SendMouseWheel(data->window, 0, 0, ticks); } else { - if(xevent.xbutton.button == SDL_BUTTON_LEFT) { - ProcessDragArea(data); + if(xevent.xbutton.button == Button1) { + if (ProcessDragArea(_this, data, &xevent)) { + break; /* don't pass this event on to app. */ + } } SDL_SendMouseButton(data->window, 0, SDL_PRESSED, xevent.xbutton.button); }