Added: GetMousePosition and SetMousePosition methods

~g2k
This commit is contained in:
2005-07-02 01:47:23 -04:00
parent 17565c41c1
commit 705ee5ba09
2 changed files with 51 additions and 2 deletions

View File

@@ -13,6 +13,7 @@
#include <GL/gl.h> #include <GL/gl.h>
#include <GL/glu.h> #include <GL/glu.h>
#endif #endif
#include "vector.h"
namespace OpenArena namespace OpenArena
{ {
@@ -31,6 +32,8 @@ namespace OpenArena
void SetOnResize(ResizeFunc function); void SetOnResize(ResizeFunc function);
void SwapBuffers(); void SwapBuffers();
void Resize(GLsizei width, GLsizei height); void Resize(GLsizei width, GLsizei height);
Vec2i GetMousePosition();
void SetMousePosition(Vec2i pos);
#ifdef __linux #ifdef __linux
Display* GetDisplay(); Display* GetDisplay();

View File

@@ -252,6 +252,12 @@ bool OpenArena::Window::Open()
attributes.colormap = cmap; attributes.colormap = cmap;
attributes.border_pixel = 0; attributes.border_pixel = 0;
attributes.event_mask = ExposureMask |
KeyPressMask | KeyReleaseMask |
ButtonPressMask | ButtonReleaseMask |
// PointerMotionMask | ButtonMotionMask |
StructureNotifyMask;
if(fullscreen) if(fullscreen)
{ {
XF86VidModeSwitchToMode(display, screen, modes[bestMode]); XF86VidModeSwitchToMode(display, screen, modes[bestMode]);
@@ -259,7 +265,6 @@ bool OpenArena::Window::Open()
XFree(modes); XFree(modes);
attributes.override_redirect = true; attributes.override_redirect = true;
attributes.event_mask = ExposureMask | KeyPressMask | ButtonPressMask | StructureNotifyMask;
window = XCreateWindow(display, RootWindow(display, vi->screen), 0, 0, width, height, 0, vi->depth, InputOutput, vi->visual, CWBorderPixel | CWColormap | CWEventMask | CWOverrideRedirect, &attributes); window = XCreateWindow(display, RootWindow(display, vi->screen), 0, 0, width, height, 0, vi->depth, InputOutput, vi->visual, CWBorderPixel | CWColormap | CWEventMask | CWOverrideRedirect, &attributes);
XWarpPointer(display, None, window, 0, 0, 0, 0, 0, 0); XWarpPointer(display, None, window, 0, 0, 0, 0, 0, 0);
XMapRaised(display, window); XMapRaised(display, window);
@@ -268,7 +273,6 @@ bool OpenArena::Window::Open()
} }
else else
{ {
attributes.event_mask = ExposureMask | KeyPressMask | KeyReleaseMask | ButtonPressMask | ButtonReleaseMask | StructureNotifyMask;
window = XCreateWindow(display, RootWindow(display, vi->screen), 0, 0, width, height, 0, vi->depth, InputOutput, vi->visual, CWBorderPixel | CWColormap | CWEventMask, &attributes); window = XCreateWindow(display, RootWindow(display, vi->screen), 0, 0, width, height, 0, vi->depth, InputOutput, vi->visual, CWBorderPixel | CWColormap | CWEventMask, &attributes);
wmDelete = XInternAtom(display, "WM_DELETE_WINDOW", true); wmDelete = XInternAtom(display, "WM_DELETE_WINDOW", true);
XSetWMProtocols(display, window, &wmDelete, 1); XSetWMProtocols(display, window, &wmDelete, 1);
@@ -373,3 +377,45 @@ Display* OpenArena::Window::GetDisplay()
return display; return display;
} }
#endif #endif
Vec2i OpenArena::Window::GetMousePosition()
{
#ifdef __linux
::Window rootWindow;
::Window childWindow;
int rootX;
int rootY;
int mouseX;
int mouseY;
unsigned int mask;
if(!XQueryPointer(display, window, &rootWindow, &childWindow, &rootX, &rootY, &mouseX, &mouseY, &mask))
{
return Vec2i(-1,-1);
}
else
{
printf("X:%d, Root X:%d\n", mouseX, rootX);
return Vec2i(mouseX, mouseY);
}
#endif
#ifdef WIN32
POINT pos;
GetCursorPos(&pos);
return Vec2i(pos.x, pos.y);
#endif
}
void OpenArena::Window::SetMousePosition(Vec2i pos)
{
#ifdef __linux
Vec2i current = GetMousePosition();
Vec2i middle = Vec2i(width, height)/2;
Vec2i dest = middle - current;
XWarpPointer(display, None, None, 0, 0, 0, 0, dest.x, dest.y);
#endif
#ifdef WIN32
SetCursorPos(pos.x, pos.y);
#endif
}