Преглед на файлове

added events Enter/Leave support

ncannasse преди 6 години
родител
ревизия
a84c4f0ba9
променени са 1 файла, в които са добавени 29 реда и са изтрити 6 реда
  1. 29 6
      libs/directx/window.c

+ 29 - 6
libs/directx/window.c

@@ -50,12 +50,17 @@ typedef struct {
 	dx_event events[MAX_EVENTS];
 	int event_count;
 	int next_event;
+	bool is_over;
 } dx_events;
 
 typedef struct HWND__ dx_window;
 
 static dx_window *cur_clip_cursor_window = NULL;
 
+static dx_events *get_events(HWND wnd) {
+	return (dx_events*)GetWindowLongPtr(wnd,GWLP_USERDATA);
+}
+
 static void updateClipCursor(HWND wnd) {
 	if (cur_clip_cursor_window == wnd) {
 		RECT rect;
@@ -69,7 +74,7 @@ static void updateClipCursor(HWND wnd) {
 }
 
 static dx_event *addEvent( HWND wnd, EventType type ) {
-	dx_events *buf = (dx_events*)GetWindowLongPtr(wnd,GWLP_USERDATA);
+	dx_events *buf = get_events(wnd);
 	dx_event *e;
 	if( buf->event_count == MAX_EVENTS )
 		e = &buf->events[MAX_EVENTS-1];
@@ -101,7 +106,7 @@ static LRESULT CALLBACK WndProc( HWND wnd, UINT umsg, WPARAM wparam, LPARAM lpar
 		break;
 	case WM_SIZE:
 		{
-			dx_events *buf = (dx_events*)GetWindowLongPtr(wnd,GWLP_USERDATA);
+			dx_events *buf = get_events(wnd);
 			if( buf->event_count > buf->next_event && buf->events[buf->event_count-1].type == WindowState && buf->events[buf->event_count-1].state == Resize )
 				buf->event_count--;
 		}
@@ -115,11 +120,29 @@ static LRESULT CALLBACK WndProc( HWND wnd, UINT umsg, WPARAM wparam, LPARAM lpar
 	case WM_RBUTTONUP: addMouse(MouseUp,3); break;
 	case WM_XBUTTONUP: addMouse(MouseDown,3 + HIWORD(wparam)); break;
 	case WM_XBUTTONDOWN: addMouse(MouseUp,3 + HIWORD(wparam)); break;
-	case WM_MOUSEMOVE: addMouse(MouseMove,0); break;
 	case WM_MOUSEWHEEL: addMouse(MouseWheel,0); e->wheelDelta = ((int)(short)HIWORD(wparam)) / 120; break;
 	case WM_SYSCOMMAND:
 		if( wparam == SC_KEYMENU && (lparam>>16) <= 0 )
 			return 0;
+		break;	
+	case WM_MOUSEMOVE: 
+		{
+			dx_events *evt = get_events(wnd);
+			if( !evt->is_over ) {
+				TRACKMOUSEEVENT ev;
+				ev.cbSize = sizeof(ev);
+				ev.dwFlags = TME_LEAVE;
+				ev.hwndTrack = wnd;
+				TrackMouseEvent(&ev);
+				evt->is_over = true;
+				addState(Enter);
+			}
+			addMouse(MouseMove,0); 
+		}
+		break;
+	case WM_MOUSELEAVE:
+		addState(Leave);
+		get_events(wnd)->is_over = false;
 		break;
 	case WM_KEYDOWN:
 	case WM_SYSKEYDOWN:
@@ -127,7 +150,7 @@ static LRESULT CALLBACK WndProc( HWND wnd, UINT umsg, WPARAM wparam, LPARAM lpar
 	case WM_SYSKEYUP:
 		// right alt has triggered a control !
 		if( wparam == VK_MENU && lparam & (1<<24) ) {
-			dx_events *buf = (dx_events*)GetWindowLongPtr(wnd,GWLP_USERDATA);
+			dx_events *buf = get_events(wnd);
 			if( buf->event_count > buf->next_event && buf->events[buf->event_count-1].type == (umsg == WM_KEYUP ? KeyUp : KeyDown) && buf->events[buf->event_count-1].keyCode == (VK_CONTROL|256) ) {
 				buf->event_count--;
 				//printf("CANCEL\n");
@@ -302,14 +325,14 @@ HL_PRIM void HL_NAME(win_destroy)(dx_window *win) {
 		cur_clip_cursor_window = NULL;
 		ClipCursor(NULL);
 	}
-	dx_events *buf = (dx_events*)GetWindowLongPtr(win,GWLP_USERDATA);
+	dx_events *buf = get_events(win);
 	free(buf);
 	SetWindowLongPtr(win,GWLP_USERDATA,0);
 	DestroyWindow(win);
 }
 
 HL_PRIM bool HL_NAME(win_get_next_event)( dx_window *win, dx_event *e ) {
-	dx_events *buf = (dx_events*)GetWindowLongPtr(win,GWLP_USERDATA);
+	dx_events *buf = get_events(win);
 	hl_type *save;
 	if( !buf ) {
 		e->type = Quit;