Minor Xlib refactor

This commit is contained in:
Jack Andersen 2016-01-02 13:10:35 -10:00
parent 6ee5e9011b
commit 7eeebce37c
2 changed files with 29 additions and 34 deletions

View File

@ -4,6 +4,7 @@
#include "System.hpp" #include "System.hpp"
#include <memory> #include <memory>
#include <algorithm> #include <algorithm>
#include <cstring>
#undef min #undef min
#undef max #undef max
@ -35,7 +36,7 @@ struct SWindowRect
int location[2]; int location[2];
int size[2]; int size[2];
SWindowRect() {memset(this, 0, sizeof(SWindowRect));} SWindowRect() {std::memset(this, 0, sizeof(SWindowRect));}
SWindowRect(int x, int y, int w, int h) SWindowRect(int x, int y, int w, int h)
{ {

View File

@ -525,7 +525,7 @@ class WindowXlib : public IWindow
double m_vScrollLast = 0.0; double m_vScrollLast = 0.0;
/* Cached window rectangle (to avoid repeated X queries) */ /* Cached window rectangle (to avoid repeated X queries) */
int m_wx, m_wy, m_ww, m_wh; boo::SWindowRect m_wrect;
float m_pixelFactor; float m_pixelFactor;
bool m_inFs = false; bool m_inFs = false;
@ -912,8 +912,8 @@ public:
XUnlockDisplay(m_xDisp); XUnlockDisplay(m_xDisp);
return; return;
} }
getWindowFrame(m_wx, m_wy, m_ww, m_wh); getWindowFrame(m_wrect.location[0], m_wrect.location[1], m_wrect.size[0], m_wrect.size[1]);
XPoint pt = {short(coord[0]), short(m_wh - coord[1])}; XPoint pt = {short(coord[0]), short(m_wrect.size[1] - coord[1])};
XVaNestedList list = XVaCreateNestedList(0, XNSpotLocation, &pt, nullptr); XVaNestedList list = XVaCreateNestedList(0, XNSpotLocation, &pt, nullptr);
XSetICValues(m_xIC, XNPreeditAttributes, list, nullptr); XSetICValues(m_xIC, XNPreeditAttributes, list, nullptr);
XFree(list); XFree(list);
@ -1108,36 +1108,36 @@ public:
SWindowCoord MakeButtonEventCoord(XEvent* event) const SWindowCoord MakeButtonEventCoord(XEvent* event) const
{ {
int x = event->xbutton.x; int x = event->xbutton.x;
int y = m_wh-event->xbutton.y; int y = m_wrect.size[1]-event->xbutton.y;
return return
{ {
{x, y}, {x, y},
{int(x / m_pixelFactor), int(y / m_pixelFactor)}, {int(x / m_pixelFactor), int(y / m_pixelFactor)},
{x / float(m_ww), y / float(m_wh)} {x / float(m_wrect.size[0]), y / float(m_wrect.size[1])}
}; };
} }
SWindowCoord MakeMotionEventCoord(XEvent* event) const SWindowCoord MakeMotionEventCoord(XEvent* event) const
{ {
int x = event->xmotion.x; int x = event->xmotion.x;
int y = m_wh-event->xmotion.y; int y = m_wrect.size[1]-event->xmotion.y;
return return
{ {
{x, y}, {x, y},
{int(x / m_pixelFactor), int(y / m_pixelFactor)}, {int(x / m_pixelFactor), int(y / m_pixelFactor)},
{x / float(m_ww), y / float(m_wh)} {x / float(m_wrect.size[0]), y / float(m_wrect.size[1])}
}; };
} }
SWindowCoord MakeCrossingEventCoord(XEvent* event) const SWindowCoord MakeCrossingEventCoord(XEvent* event) const
{ {
int x = event->xcrossing.x; int x = event->xcrossing.x;
int y = m_wh-event->xcrossing.y; int y = m_wrect.size[1]-event->xcrossing.y;
return return
{ {
{x, y}, {x, y},
{int(x / m_pixelFactor), int(y / m_pixelFactor)}, {int(x / m_pixelFactor), int(y / m_pixelFactor)},
{x / float(m_ww), y / float(m_wh)} {x / float(m_wrect.size[0]), y / float(m_wrect.size[1])}
}; };
} }
@ -1194,16 +1194,14 @@ public:
int x, y; int x, y;
XTranslateCoordinates(m_xDisp, m_windowId, DefaultRootWindow(m_xDisp), event->xexpose.x, event->xexpose.y, &x, &y, &nw); XTranslateCoordinates(m_xDisp, m_windowId, DefaultRootWindow(m_xDisp), event->xexpose.x, event->xexpose.y, &x, &y, &nw);
XGetWindowAttributes(m_xDisp, m_windowId, &wxa); XGetWindowAttributes(m_xDisp, m_windowId, &wxa);
m_wx = x - wxa.x; m_wrect.location[0] = x - wxa.x;
m_wy = y - wxa.y; m_wrect.location[1] = y - wxa.y;
m_ww = event->xexpose.width; m_wrect.size[0] = event->xexpose.width;
m_wh = event->xexpose.height; m_wrect.size[1] = event->xexpose.height;
if (m_callback) if (m_callback)
{ {
SWindowRect rect =
{ {m_wx, m_wy}, {m_ww, m_wh} };
XUnlockDisplay(m_xDisp); XUnlockDisplay(m_xDisp);
m_callback->resized(rect); m_callback->resized(m_wrect);
XLockDisplay(m_xDisp); XLockDisplay(m_xDisp);
} }
return; return;
@ -1215,17 +1213,13 @@ public:
int x, y; int x, y;
XTranslateCoordinates(m_xDisp, m_windowId, DefaultRootWindow(m_xDisp), event->xconfigure.x, event->xconfigure.y, &x, &y, &nw); XTranslateCoordinates(m_xDisp, m_windowId, DefaultRootWindow(m_xDisp), event->xconfigure.x, event->xconfigure.y, &x, &y, &nw);
XGetWindowAttributes(m_xDisp, m_windowId, &wxa); XGetWindowAttributes(m_xDisp, m_windowId, &wxa);
m_wx = x - wxa.x; m_wrect.location[0] = x - wxa.x;
m_wy = y - wxa.y; m_wrect.location[1] = y - wxa.y;
m_ww = event->xconfigure.width; m_wrect.size[0] = event->xconfigure.width;
m_wh = event->xconfigure.height; m_wrect.size[1] = event->xconfigure.height;
if (m_callback) if (m_callback)
{ m_callback->windowMoved(m_wrect);
SWindowRect rect =
{ {m_wx, m_wy}, {m_ww, m_wh} };
m_callback->windowMoved(rect);
}
return; return;
} }
case KeyPress: case KeyPress:
@ -1283,7 +1277,7 @@ public:
{ {
if (m_callback) if (m_callback)
{ {
getWindowFrame(m_wx, m_wy, m_ww, m_wh); getWindowFrame(m_wrect.location[0], m_wrect.location[1], m_wrect.size[0], m_wrect.size[1]);
EMouseButton button = translateButton(event->xbutton.button); EMouseButton button = translateButton(event->xbutton.button);
if (button != EMouseButton::None) if (button != EMouseButton::None)
{ {
@ -1318,7 +1312,7 @@ public:
{ {
if (m_callback) if (m_callback)
{ {
getWindowFrame(m_wx, m_wy, m_ww, m_wh); getWindowFrame(m_wrect.location[0], m_wrect.location[1], m_wrect.size[0], m_wrect.size[1]);
EMouseButton button = translateButton(event->xbutton.button); EMouseButton button = translateButton(event->xbutton.button);
if (button != EMouseButton::None) if (button != EMouseButton::None)
{ {
@ -1345,7 +1339,7 @@ public:
{ {
if (m_callback) if (m_callback)
{ {
getWindowFrame(m_wx, m_wy, m_ww, m_wh); getWindowFrame(m_wrect.location[0], m_wrect.location[1], m_wrect.size[0], m_wrect.size[1]);
m_callback->mouseMove(MakeMotionEventCoord(event)); m_callback->mouseMove(MakeMotionEventCoord(event));
} }
return; return;
@ -1354,7 +1348,7 @@ public:
{ {
if (m_callback) if (m_callback)
{ {
getWindowFrame(m_wx, m_wy, m_ww, m_wh); getWindowFrame(m_wrect.location[0], m_wrect.location[1], m_wrect.size[0], m_wrect.size[1]);
m_callback->mouseEnter(MakeCrossingEventCoord(event)); m_callback->mouseEnter(MakeCrossingEventCoord(event));
} }
return; return;
@ -1363,7 +1357,7 @@ public:
{ {
if (m_callback) if (m_callback)
{ {
getWindowFrame(m_wx, m_wy, m_ww, m_wh); getWindowFrame(m_wrect.location[0], m_wrect.location[1], m_wrect.size[0], m_wrect.size[1]);
m_callback->mouseLeave(MakeCrossingEventCoord(event)); m_callback->mouseLeave(MakeCrossingEventCoord(event));
} }
return; return;
@ -1372,7 +1366,7 @@ public:
{ {
if (event->xgeneric.extension == XINPUT_OPCODE) if (event->xgeneric.extension == XINPUT_OPCODE)
{ {
getWindowFrame(m_wx, m_wy, m_ww, m_wh); getWindowFrame(m_wrect.location[0], m_wrect.location[1], m_wrect.size[0], m_wrect.size[1]);
switch (event->xgeneric.evtype) switch (event->xgeneric.evtype)
{ {
case XI_Motion: case XI_Motion:
@ -1416,12 +1410,12 @@ public:
if (m_callback && didScroll) if (m_callback && didScroll)
{ {
int event_x = int(ev->event_x) >> 16; int event_x = int(ev->event_x) >> 16;
int event_y = m_wh - (int(ev->event_y) >> 16); int event_y = m_wrect.size[1] - (int(ev->event_y) >> 16);
SWindowCoord coord = SWindowCoord coord =
{ {
{event_x, event_y}, {event_x, event_y},
{int(event_x / m_pixelFactor), int(event_y / m_pixelFactor)}, {int(event_x / m_pixelFactor), int(event_y / m_pixelFactor)},
{event_x / float(m_ww), event_y / float(m_wh)} {event_x / float(m_wrect.size[0]), event_y / float(m_wrect.size[1])}
}; };
m_callback->scroll(coord, scrollDelta); m_callback->scroll(coord, scrollDelta);
} }