mirror of
https://github.com/gnif/LookingGlass.git
synced 2024-11-25 23:07:18 +00:00
[client] x11/sdl: get the border dimensions from the backend
This commit is contained in:
parent
6b1e310343
commit
dbb18a6ecb
@ -23,6 +23,7 @@ Place, Suite 330, Boston, MA 02111-1307 USA
|
|||||||
|
|
||||||
#include "app.h"
|
#include "app.h"
|
||||||
#include "kb.h"
|
#include "kb.h"
|
||||||
|
#include "common/types.h"
|
||||||
#include "common/debug.h"
|
#include "common/debug.h"
|
||||||
|
|
||||||
struct SDLDSState
|
struct SDLDSState
|
||||||
@ -146,8 +147,20 @@ static bool sdlEventFilter(SDL_Event * event)
|
|||||||
|
|
||||||
case SDL_WINDOWEVENT_SIZE_CHANGED:
|
case SDL_WINDOWEVENT_SIZE_CHANGED:
|
||||||
case SDL_WINDOWEVENT_RESIZED:
|
case SDL_WINDOWEVENT_RESIZED:
|
||||||
app_handleResizeEvent(event->window.data1, event->window.data2);
|
{
|
||||||
|
struct Border border;
|
||||||
|
SDL_GetWindowBordersSize(
|
||||||
|
app_getWindow(),
|
||||||
|
&border.top,
|
||||||
|
&border.left,
|
||||||
|
&border.bottom,
|
||||||
|
&border.right
|
||||||
|
);
|
||||||
|
|
||||||
|
app_handleResizeEvent(event->window.data1, event->window.data2,
|
||||||
|
border);
|
||||||
return true;
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
case SDL_WINDOWEVENT_MOVED:
|
case SDL_WINDOWEVENT_MOVED:
|
||||||
app_updateWindowPos(event->window.data1, event->window.data2);
|
app_updateWindowPos(event->window.data1, event->window.data2);
|
||||||
|
@ -46,6 +46,11 @@ struct X11DSState
|
|||||||
bool keyboardGrabbed;
|
bool keyboardGrabbed;
|
||||||
bool entered;
|
bool entered;
|
||||||
bool focused;
|
bool focused;
|
||||||
|
struct Rect rect;
|
||||||
|
struct Border border;
|
||||||
|
|
||||||
|
Atom aNetReqFrameExtents;
|
||||||
|
Atom aNetFrameExtents;
|
||||||
|
|
||||||
// clipboard members
|
// clipboard members
|
||||||
Atom aSelection;
|
Atom aSelection;
|
||||||
@ -93,6 +98,25 @@ static bool x11Init(SDL_SysWMinfo * info)
|
|||||||
x11.display = info->info.x11.display;
|
x11.display = info->info.x11.display;
|
||||||
x11.window = info->info.x11.window;
|
x11.window = info->info.x11.window;
|
||||||
|
|
||||||
|
x11.aNetReqFrameExtents =
|
||||||
|
XInternAtom(x11.display, "_NET_REQUEST_FRAME_EXTENTS", True);
|
||||||
|
x11.aNetFrameExtents =
|
||||||
|
XInternAtom(x11.display, "_NET_FRAME_EXTENTS", True);
|
||||||
|
|
||||||
|
if (x11.aNetReqFrameExtents)
|
||||||
|
{
|
||||||
|
XEvent reqevent =
|
||||||
|
{
|
||||||
|
.type = ClientMessage,
|
||||||
|
.xclient.window = x11.window,
|
||||||
|
.xclient.format = 32,
|
||||||
|
.xclient.message_type = x11.aNetReqFrameExtents
|
||||||
|
};
|
||||||
|
|
||||||
|
XSendEvent(x11.display, DefaultRootWindow(x11.display), False,
|
||||||
|
SubstructureNotifyMask | SubstructureRedirectMask, &reqevent);
|
||||||
|
}
|
||||||
|
|
||||||
int major = 2;
|
int major = 2;
|
||||||
int minor = 3;
|
int minor = 3;
|
||||||
if (XIQueryVersion(x11.display, &major, &minor) != Success)
|
if (XIQueryVersion(x11.display, &major, &minor) != Success)
|
||||||
@ -318,8 +342,13 @@ static bool x11EventFilter(SDL_Event * event)
|
|||||||
&y,
|
&y,
|
||||||
&child);
|
&child);
|
||||||
|
|
||||||
|
x11.rect.x = x;
|
||||||
|
x11.rect.y = y;
|
||||||
|
x11.rect.w = xe.xconfigure.width;
|
||||||
|
x11.rect.h = xe.xconfigure.height;
|
||||||
|
|
||||||
app_updateWindowPos(x, y);
|
app_updateWindowPos(x, y);
|
||||||
app_handleResizeEvent(xe.xconfigure.width, xe.xconfigure.height);
|
app_handleResizeEvent(x11.rect.w, x11.rect.h, x11.border);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -560,13 +589,44 @@ static bool x11EventFilter(SDL_Event * event)
|
|||||||
case PropertyNotify:
|
case PropertyNotify:
|
||||||
if (xe.xproperty.display != x11.display ||
|
if (xe.xproperty.display != x11.display ||
|
||||||
xe.xproperty.window != x11.window ||
|
xe.xproperty.window != x11.window ||
|
||||||
xe.xproperty.atom != x11.aSelData ||
|
xe.xproperty.state != PropertyNewValue)
|
||||||
xe.xproperty.state != PropertyNewValue ||
|
|
||||||
x11.lowerBound == 0)
|
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
if (xe.xproperty.atom == x11.aNetFrameExtents)
|
||||||
|
{
|
||||||
|
Atom type;
|
||||||
|
int fmt;
|
||||||
|
unsigned long num, bytes;
|
||||||
|
unsigned char *data;
|
||||||
|
|
||||||
|
if (XGetWindowProperty(x11.display, x11.window,
|
||||||
|
x11.aNetFrameExtents, 0, 4, False, AnyPropertyType,
|
||||||
|
&type, &fmt, &num, &bytes, &data) != Success)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
if (num >= 4)
|
||||||
|
{
|
||||||
|
long *cardinal = (long *)data;
|
||||||
|
x11.border.left = cardinal[0];
|
||||||
|
x11.border.right = cardinal[1];
|
||||||
|
x11.border.top = cardinal[2];
|
||||||
|
x11.border.bottom = cardinal[3];
|
||||||
|
app_handleResizeEvent(x11.rect.w, x11.rect.h, x11.border);
|
||||||
|
}
|
||||||
|
|
||||||
|
XFree(data);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (xe.xproperty.atom == x11.aSelData)
|
||||||
|
{
|
||||||
|
if (x11.lowerBound == 0)
|
||||||
|
return false;
|
||||||
x11CBSelectionIncr(xe.xproperty);
|
x11CBSelectionIncr(xe.xproperty);
|
||||||
return true;
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
if (xe.type == x11.eventBase + XFixesSelectionNotify)
|
if (xe.type == x11.eventBase + XFixesSelectionNotify)
|
||||||
|
@ -19,6 +19,7 @@ Place, Suite 330, Boston, MA 02111-1307 USA
|
|||||||
|
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
|
||||||
|
#include "common/types.h"
|
||||||
#include "interface/displayserver.h"
|
#include "interface/displayserver.h"
|
||||||
|
|
||||||
SDL_Window * app_getWindow(void);
|
SDL_Window * app_getWindow(void);
|
||||||
@ -30,7 +31,7 @@ bool app_cursorWantsRaw(void);
|
|||||||
bool app_cursorInWindow(void);
|
bool app_cursorInWindow(void);
|
||||||
void app_updateCursorPos(double x, double y);
|
void app_updateCursorPos(double x, double y);
|
||||||
void app_updateWindowPos(int x, int y);
|
void app_updateWindowPos(int x, int y);
|
||||||
void app_handleResizeEvent(int w, int h);
|
void app_handleResizeEvent(int w, int h, const struct Border border);
|
||||||
void app_handleMouseGrabbed(double ex, double ey);
|
void app_handleMouseGrabbed(double ex, double ey);
|
||||||
void app_handleMouseNormal(double ex, double ey);
|
void app_handleMouseNormal(double ex, double ey);
|
||||||
void app_handleMouseBasic(void);
|
void app_handleMouseBasic(void);
|
||||||
|
@ -458,8 +458,8 @@ void app_handleMouseNormal(double ex, double ey)
|
|||||||
const int ty = (local.y <= 0.0) ? floor(local.y) : ceil(local.y);
|
const int ty = (local.y <= 0.0) ? floor(local.y) : ceil(local.y);
|
||||||
|
|
||||||
if (core_isValidPointerPos(
|
if (core_isValidPointerPos(
|
||||||
g_state.windowPos.x + g_state.border.x + tx,
|
g_state.windowPos.x + g_state.border.left + tx,
|
||||||
g_state.windowPos.y + g_state.border.y + ty))
|
g_state.windowPos.y + g_state.border.top + ty))
|
||||||
{
|
{
|
||||||
core_setCursorInView(false);
|
core_setCursorInView(false);
|
||||||
|
|
||||||
@ -570,14 +570,9 @@ void app_updateWindowPos(int x, int y)
|
|||||||
g_state.windowPos.y = y;
|
g_state.windowPos.y = y;
|
||||||
}
|
}
|
||||||
|
|
||||||
void app_handleResizeEvent(int w, int h)
|
void app_handleResizeEvent(int w, int h, const struct Border border)
|
||||||
{
|
{
|
||||||
SDL_GetWindowBordersSize(g_state.window,
|
memcpy(&g_state.border, &border, sizeof(border));
|
||||||
&g_state.border.y,
|
|
||||||
&g_state.border.x,
|
|
||||||
&g_state.border.h,
|
|
||||||
&g_state.border.w
|
|
||||||
);
|
|
||||||
|
|
||||||
/* don't do anything else if the window dimensions have not changed */
|
/* don't do anything else if the window dimensions have not changed */
|
||||||
if (g_state.windowW == w && g_state.windowH == h)
|
if (g_state.windowW == w && g_state.windowH == h)
|
||||||
|
@ -58,7 +58,7 @@ struct AppState
|
|||||||
int windowCX, windowCY;
|
int windowCX, windowCY;
|
||||||
LG_RendererRotate rotate;
|
LG_RendererRotate rotate;
|
||||||
bool focused;
|
bool focused;
|
||||||
SDL_Rect border;
|
struct Border border;
|
||||||
SDL_Point srcSize;
|
SDL_Point srcSize;
|
||||||
LG_RendererRect dstRect;
|
LG_RendererRect dstRect;
|
||||||
bool posInfoValid;
|
bool posInfoValid;
|
||||||
|
@ -25,6 +25,16 @@ struct DoublePoint
|
|||||||
double x, y;
|
double x, y;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct Rect
|
||||||
|
{
|
||||||
|
int x, y, w, h;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct Border
|
||||||
|
{
|
||||||
|
int left, top, right, bottom;
|
||||||
|
};
|
||||||
|
|
||||||
typedef enum FrameType
|
typedef enum FrameType
|
||||||
{
|
{
|
||||||
FRAME_TYPE_INVALID ,
|
FRAME_TYPE_INVALID ,
|
||||||
|
Loading…
Reference in New Issue
Block a user