mirror of
https://github.com/ClassiCube/ClassiCube.git
synced 2025-09-14 18:15:28 -04:00
More work on input events. Now it actually logs mouse x/y.
This commit is contained in:
parent
fa1a00f472
commit
e06091a9fe
@ -11,11 +11,36 @@
|
|||||||
|
|
||||||
static NSApplication* appHandle;
|
static NSApplication* appHandle;
|
||||||
static NSWindow* winHandle;
|
static NSWindow* winHandle;
|
||||||
|
static int windowX, windowY;
|
||||||
|
|
||||||
extern void Window_CommonInit(void);
|
extern void Window_CommonInit(void);
|
||||||
extern int Window_MapKey(UInt32 key);
|
extern int Window_MapKey(UInt32 key);
|
||||||
|
|
||||||
void Window_Init(void) {
|
static void Window_RefreshBounds(void) {
|
||||||
|
NSView* view;
|
||||||
|
NSRect rect;
|
||||||
|
|
||||||
|
view = [winHandle contentView];
|
||||||
|
rect = [view frame];
|
||||||
|
|
||||||
|
windowX = (int)rect.origin.x;
|
||||||
|
windowY = (int)rect.origin.y;
|
||||||
|
Window_Width = (int)rect.size.width;
|
||||||
|
Window_Height = (int)rect.size.height;
|
||||||
|
Platform_Log2("WINPOS: %i, %i", &windowX, &windowY);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Window_SetSize1(int width, int height) {
|
||||||
|
NSSize size;
|
||||||
|
size.width = width; size.height = height;
|
||||||
|
[winHandle setContentSize: size];
|
||||||
|
}
|
||||||
|
|
||||||
|
void Window_Close1(void) {
|
||||||
|
[winHandle close];
|
||||||
|
}
|
||||||
|
|
||||||
|
void Window_Init1(void) {
|
||||||
appHandle = [NSApplication sharedApplication];
|
appHandle = [NSApplication sharedApplication];
|
||||||
[appHandle activateIgnoringOtherApps: YES];
|
[appHandle activateIgnoringOtherApps: YES];
|
||||||
Window_CommonInit();
|
Window_CommonInit();
|
||||||
@ -24,7 +49,7 @@ void Window_Init(void) {
|
|||||||
#define Display_CentreX(width) (Display_Bounds.X + (Display_Bounds.Width - width) / 2)
|
#define Display_CentreX(width) (Display_Bounds.X + (Display_Bounds.Width - width) / 2)
|
||||||
#define Display_CentreY(height) (Display_Bounds.Y + (Display_Bounds.Height - height) / 2)
|
#define Display_CentreY(height) (Display_Bounds.Y + (Display_Bounds.Height - height) / 2)
|
||||||
|
|
||||||
void Window_Create(int width, int height) {
|
void Window_Create1(int width, int height) {
|
||||||
NSRect rect;
|
NSRect rect;
|
||||||
// TODO: don't set, RefreshBounds
|
// TODO: don't set, RefreshBounds
|
||||||
Window_Width = width;
|
Window_Width = width;
|
||||||
@ -41,9 +66,10 @@ void Window_Create(int width, int height) {
|
|||||||
[winHandle initWithContentRect: rect styleMask: NSTitledWindowMask|NSClosableWindowMask|NSResizableWindowMask|NSMiniaturizableWindowMask backing:0 defer:NO];
|
[winHandle initWithContentRect: rect styleMask: NSTitledWindowMask|NSClosableWindowMask|NSResizableWindowMask|NSMiniaturizableWindowMask backing:0 defer:NO];
|
||||||
|
|
||||||
[winHandle makeKeyAndOrderFront: appHandle];
|
[winHandle makeKeyAndOrderFront: appHandle];
|
||||||
|
Window_RefreshBounds();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Window_SetTitle(const String* title) {
|
void Window_SetTitle1(const String* title) {
|
||||||
UInt8 str[600];
|
UInt8 str[600];
|
||||||
CFStringRef titleCF;
|
CFStringRef titleCF;
|
||||||
int len;
|
int len;
|
||||||
@ -61,11 +87,11 @@ static int Window_MapMouse(int button) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Window_ProcessEvents(void) {
|
void Window_ProcessEvents1(void) {
|
||||||
NSEvent* ev;
|
NSEvent* ev;
|
||||||
NSPoint loc;
|
NSPoint loc;
|
||||||
CGFloat dx, dy;
|
CGFloat dx, dy;
|
||||||
int type, key;
|
int type, key, mouseX, mouseY;
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
ev = [appHandle nextEventMatchingMask: 0xFFFFFFFFU untilDate:Nil inMode:NSDefaultRunLoopMode dequeue:YES];
|
ev = [appHandle nextEventMatchingMask: 0xFFFFFFFFU untilDate:Nil inMode:NSDefaultRunLoopMode dequeue:YES];
|
||||||
@ -109,6 +135,10 @@ void Window_ProcessEvents(void) {
|
|||||||
dx = [ev deltaX];
|
dx = [ev deltaX];
|
||||||
dy = [ev deltaY];
|
dy = [ev deltaY];
|
||||||
|
|
||||||
|
mouseX = (int)loc.x - windowX;
|
||||||
|
mouseY = (int)loc.y - windowY;
|
||||||
|
Pointer_SetPosition(0, mouseX, mouseY);
|
||||||
|
|
||||||
if (Input_RawMode) Event_RaiseMove(&PointerEvents.RawMoved, 0, dx, dy);
|
if (Input_RawMode) Event_RaiseMove(&PointerEvents.RawMoved, 0, dx, dy);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
91
src/Window.c
91
src/Window.c
@ -1446,6 +1446,7 @@ void Window_DisableRawMouse(void) { Window_DefaultDisableRawMouse(); }
|
|||||||
*#########################################################################################################################*/
|
*#########################################################################################################################*/
|
||||||
#if defined CC_BUILD_CARBON || defined CC_BUILD_COCOA
|
#if defined CC_BUILD_CARBON || defined CC_BUILD_COCOA
|
||||||
#include <ApplicationServices/ApplicationServices.h>
|
#include <ApplicationServices/ApplicationServices.h>
|
||||||
|
static int windowX, windowY;
|
||||||
|
|
||||||
static void Window_CommonInit(void) {
|
static void Window_CommonInit(void) {
|
||||||
CGDirectDisplayID display = CGMainDisplayID();
|
CGDirectDisplayID display = CGMainDisplayID();
|
||||||
@ -1555,7 +1556,6 @@ void Window_CloseKeyboard(void) { }
|
|||||||
#include <dlfcn.h>
|
#include <dlfcn.h>
|
||||||
|
|
||||||
static WindowRef win_handle;
|
static WindowRef win_handle;
|
||||||
static int windowX, windowY;
|
|
||||||
static bool win_fullscreen, showingDialog;
|
static bool win_fullscreen, showingDialog;
|
||||||
|
|
||||||
/* fullscreen is tied to OpenGL context unfortunately */
|
/* fullscreen is tied to OpenGL context unfortunately */
|
||||||
@ -1772,7 +1772,7 @@ static pascal OSErr HandleQuitMessage(const AppleEvent* ev, AppleEvent* reply, l
|
|||||||
typedef EventTargetRef (*GetMenuBarEventTarget_Func)(void);
|
typedef EventTargetRef (*GetMenuBarEventTarget_Func)(void);
|
||||||
|
|
||||||
static void Window_ConnectEvents(void) {
|
static void Window_ConnectEvents(void) {
|
||||||
static EventTypeSpec winEventTypes[] = {
|
static const EventTypeSpec winEventTypes[] = {
|
||||||
{ kEventClassKeyboard, kEventRawKeyDown },
|
{ kEventClassKeyboard, kEventRawKeyDown },
|
||||||
{ kEventClassKeyboard, kEventRawKeyRepeat },
|
{ kEventClassKeyboard, kEventRawKeyRepeat },
|
||||||
{ kEventClassKeyboard, kEventRawKeyUp },
|
{ kEventClassKeyboard, kEventRawKeyUp },
|
||||||
@ -1788,7 +1788,7 @@ static void Window_ConnectEvents(void) {
|
|||||||
{ kEventClassTextInput, kEventTextInputUnicodeForKeyEvent },
|
{ kEventClassTextInput, kEventTextInputUnicodeForKeyEvent },
|
||||||
{ kEventClassAppleEvent, kEventAppleEvent }
|
{ kEventClassAppleEvent, kEventAppleEvent }
|
||||||
};
|
};
|
||||||
static EventTypeSpec appEventTypes[] = {
|
static const EventTypeSpec appEventTypes[] = {
|
||||||
{ kEventClassMouse, kEventMouseDown },
|
{ kEventClassMouse, kEventMouseDown },
|
||||||
{ kEventClassMouse, kEventMouseUp },
|
{ kEventClassMouse, kEventMouseUp },
|
||||||
{ kEventClassMouse, kEventMouseMoved },
|
{ kEventClassMouse, kEventMouseMoved },
|
||||||
@ -3670,14 +3670,40 @@ void GLContext_SetFpsLimit(bool vsync, float minFrameMs) {
|
|||||||
#include <objc/message.h>
|
#include <objc/message.h>
|
||||||
#include <objc/runtime.h>
|
#include <objc/runtime.h>
|
||||||
static id appHandle, winHandle;
|
static id appHandle, winHandle;
|
||||||
static SEL selAlloc, selInit;
|
|
||||||
static SEL selNextEvent, selType, selSendEvent;
|
|
||||||
extern void* NSDefaultRunLoopMode;
|
extern void* NSDefaultRunLoopMode;
|
||||||
|
|
||||||
void Window_Init(void) {
|
static CC_INLINE CGFloat Send_CGFloat(id receiver, SEL sel) {
|
||||||
selAlloc = sel_registerName("alloc");
|
/* Sometimes we have to use fpret and sometimes we don't. See this for more details: */
|
||||||
selInit = sel_registerName("init");
|
/* http://www.sealiesoftware.com/blog/archive/2008/11/16/objc_explain_objc_msgSend_fpret.html */
|
||||||
|
/* return type is void*, but we cannot cast a void* to a float or double */
|
||||||
|
|
||||||
|
#ifdef __i386__
|
||||||
|
return ((CGFloat(*)(id, SEL))(void *)objc_msgSend_fpret)(receiver, sel);
|
||||||
|
#else
|
||||||
|
return ((CGFloat(*)(id, SEL))(void *)objc_msgSend)(receiver, sel);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
static CC_INLINE CGPoint Send_CGPoint(id receiver, SEL sel) {
|
||||||
|
/* on x86 and x86_64 CGPoint fit the requirements for 'struct returned in registers' */
|
||||||
|
return ((CGPoint(*)(id, SEL))(void *)objc_msgSend)(receiver, sel);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void Window_RefreshBounds(void) {
|
||||||
|
id view;
|
||||||
|
CGRect rect;
|
||||||
|
|
||||||
|
view = objc_msgSend(winHandle, sel_registerName("contentView"));
|
||||||
|
rect = ((CGRect(*)(id, SEL))(void *)objc_msgSend_stret)(view, sel_registerName("frame"));
|
||||||
|
|
||||||
|
windowX = (int)rect.origin.x;
|
||||||
|
windowY = (int)rect.origin.y;
|
||||||
|
Window_Width = (int)rect.size.width;
|
||||||
|
Window_Height = (int)rect.size.height;
|
||||||
|
Platform_Log2("WINPOS: %i, %i", &windowX, &windowY);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Window_Init(void) {
|
||||||
appHandle = objc_msgSend((id)objc_getClass("NSApplication"), sel_registerName("sharedApplication"));
|
appHandle = objc_msgSend((id)objc_getClass("NSApplication"), sel_registerName("sharedApplication"));
|
||||||
objc_msgSend(appHandle, sel_registerName("activateIgnoringOtherApps:"), true);
|
objc_msgSend(appHandle, sel_registerName("activateIgnoringOtherApps:"), true);
|
||||||
Window_CommonInit();
|
Window_CommonInit();
|
||||||
@ -3701,15 +3727,12 @@ void Window_Create(int width, int height) {
|
|||||||
rect.size.height = height;
|
rect.size.height = height;
|
||||||
// TODO: opentk seems to flip y?
|
// TODO: opentk seems to flip y?
|
||||||
|
|
||||||
winHandle = objc_msgSend((id)objc_getClass("NSWindow"), selAlloc);
|
winHandle = objc_msgSend((id)objc_getClass("NSWindow"), sel_registerName("alloc"));
|
||||||
objc_msgSend(winHandle, sel_registerName("initWithContentRect:styleMask:backing:defer:"), rect, (NSTitledWindowMask | NSClosableWindowMask | NSResizableWindowMask | NSMiniaturizableWindowMask), 0, false);
|
objc_msgSend(winHandle, sel_registerName("initWithContentRect:styleMask:backing:defer:"), rect, (NSTitledWindowMask | NSClosableWindowMask | NSResizableWindowMask | NSMiniaturizableWindowMask), 0, false);
|
||||||
|
|
||||||
// TODO: move to setVisible
|
// TODO: move to setVisible
|
||||||
objc_msgSend(winHandle, sel_registerName("makeKeyAndOrderFront:"), appHandle);
|
objc_msgSend(winHandle, sel_registerName("makeKeyAndOrderFront:"), appHandle);
|
||||||
|
Window_RefreshBounds();
|
||||||
selNextEvent = sel_registerName("nextEventMatchingMask:untilDate:inMode:dequeue:");
|
|
||||||
selType = sel_registerName("type");
|
|
||||||
selSendEvent = sel_registerName("sendEvent:");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Window_SetTitle(const String* title) {
|
void Window_SetTitle(const String* title) {
|
||||||
@ -3728,19 +3751,14 @@ int Window_GetWindowState(void) { return 0; }
|
|||||||
void Window_EnterFullscreen(void) { }
|
void Window_EnterFullscreen(void) { }
|
||||||
void Window_ExitFullscreen(void) { }
|
void Window_ExitFullscreen(void) { }
|
||||||
|
|
||||||
void Window_SetSize(int width, int height) { }
|
void Window_SetSize(int width, int height) {
|
||||||
void Window_Close(void) { }
|
CGSize size;
|
||||||
|
size.width = width; size.height = height;
|
||||||
|
objc_msgSend(winHandle, sel_registerName("setContentSize"), size);
|
||||||
|
}
|
||||||
|
|
||||||
static CC_INLINE CGFloat Send_CGFloat(id receiver, SEL sel) {
|
void Window_Close(void) {
|
||||||
/* Sometimes we have to use fpret and sometimes we don't. See this for more details: */
|
objc_msgSend(winHandle, sel_registerName("close"));
|
||||||
/* http://www.sealiesoftware.com/blog/archive/2008/11/16/objc_explain_objc_msgSend_fpret.html */
|
|
||||||
/* return type is void*, but we cannot cast a void* to a float or double */
|
|
||||||
|
|
||||||
#ifdef __i386__
|
|
||||||
return ((CGFloat(*)(id, SEL))(void *)objc_msgSend_fpret)(receiver, sel);
|
|
||||||
#else
|
|
||||||
return ((CGFloat(*)(id, SEL))(void *)objc_msgSend)(receiver, sel);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int Window_MapMouse(int button) {
|
static int Window_MapMouse(int button) {
|
||||||
@ -3752,14 +3770,14 @@ static int Window_MapMouse(int button) {
|
|||||||
|
|
||||||
void Window_ProcessEvents(void) {
|
void Window_ProcessEvents(void) {
|
||||||
id ev;
|
id ev;
|
||||||
int key, type;
|
int key, type, mouseX, mouseY;
|
||||||
CGFloat dx, dy;
|
CGFloat dx, dy;
|
||||||
CGPoint loc;
|
CGPoint loc;
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
ev = objc_msgSend(appHandle, selNextEvent, 0xFFFFFFFFU, NULL, NSDefaultRunLoopMode, true);
|
ev = objc_msgSend(appHandle, sel_registerName("nextEventMatchingMask:untilDate:inMode:dequeue:"), 0xFFFFFFFFU, NULL, NSDefaultRunLoopMode, true);
|
||||||
if (!ev) break;
|
if (!ev) break;
|
||||||
type = (int)objc_msgSend(ev, selType);
|
type = (int)objc_msgSend(ev, sel_registerName("type"));
|
||||||
|
|
||||||
// TODO: check if dialog is showing
|
// TODO: check if dialog is showing
|
||||||
// TODO: Only raise these events inside the window
|
// TODO: Only raise these events inside the window
|
||||||
@ -3789,14 +3807,20 @@ void Window_ProcessEvents(void) {
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case 22: /* NSScrollWheel */
|
case 22: /* NSScrollWheel */
|
||||||
Mouse_SetWheel(Mouse_Wheel + Send_CGFloat(ev, sel_registerName("deltaY"));
|
Mouse_SetWheel(Mouse_Wheel + Send_CGFloat(ev, sel_registerName("deltaY")));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 5: /* NSMouseMoved */
|
case 5: /* NSMouseMoved */
|
||||||
case 6: /* NSLeftMouseDragged */
|
case 6: /* NSLeftMouseDragged */
|
||||||
case 7: /* NSRightMouseDragged */
|
case 7: /* NSRightMouseDragged */
|
||||||
case 27: /* NSOtherMouseDragged */
|
case 27: /* NSOtherMouseDragged */
|
||||||
loc = [NSEvent mouseLocation];
|
loc = Send_CGPoint((id)objc_getClass("NSEvent"), sel_registerName("mouseLocation"));
|
||||||
|
|
||||||
|
mouseX = (int)loc.x - windowX;
|
||||||
|
mouseY = (int)loc.y - windowY;
|
||||||
|
Platform_Log2("MOUSE: %i, %i", &mouseX, &mouseY);
|
||||||
|
Pointer_SetPosition(0, mouseX, mouseY);
|
||||||
|
|
||||||
dx = Send_CGFloat(ev, sel_registerName("deltaX"));
|
dx = Send_CGFloat(ev, sel_registerName("deltaX"));
|
||||||
dy = Send_CGFloat(ev, sel_registerName("deltaY"));
|
dy = Send_CGFloat(ev, sel_registerName("deltaY"));
|
||||||
|
|
||||||
@ -3805,7 +3829,7 @@ void Window_ProcessEvents(void) {
|
|||||||
|
|
||||||
}
|
}
|
||||||
Platform_Log1("EVENT: %i", &type);
|
Platform_Log1("EVENT: %i", &type);
|
||||||
objc_msgSend(appHandle, selSendEvent, ev);
|
objc_msgSend(appHandle, sel_registerName("sendEvent:"), ev);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3817,9 +3841,8 @@ void Window_ShowDialog(const char* title, const char* msg) {
|
|||||||
CFStringRef titleCF, msgCF;
|
CFStringRef titleCF, msgCF;
|
||||||
id alert;
|
id alert;
|
||||||
|
|
||||||
// TODO: what if called before selAlloc is set to something
|
alert = objc_msgSend((id)objc_getClass("NSAlert"), sel_registerName("alloc"));
|
||||||
alert = objc_msgSend((id)objc_getClass("NSAlert"), selAlloc);
|
alert = objc_msgSend(alert, sel_registerName("init"));
|
||||||
alert = objc_msgSend(alert, selInit);
|
|
||||||
titleCF = CFStringCreateWithCString(NULL, title, kCFStringEncodingASCII);
|
titleCF = CFStringCreateWithCString(NULL, title, kCFStringEncodingASCII);
|
||||||
msgCF = CFStringCreateWithCString(NULL, msg, kCFStringEncodingASCII);
|
msgCF = CFStringCreateWithCString(NULL, msg, kCFStringEncodingASCII);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user