Просмотр исходного кода

Make Windows compatible with TextInput changes.

Joachim Meyer 9 лет назад
Родитель
Сommit
162ed71b32

+ 1 - 1
build/windows/win32/PolycodeCore/PolycodeCore.vcxproj.filters

@@ -480,7 +480,7 @@
       <Filter>Header Files</Filter>
     </ClInclude>
     <ClInclude Include="..\..\..\..\include\polycode\view\win32\PolycodeView.h">
-      <Filter>Source Files</Filter>
+      <Filter>Header Files</Filter>
     </ClInclude>
   </ItemGroup>
 </Project>

+ 3 - 2
include/polycode/core/PolyWinCore.h

@@ -128,7 +128,7 @@ namespace Polycode {
 		std::vector<TouchInfo> touches;
 		int touchType;
 		PolyKEY keyCode;
-		wchar_t unicodeChar;		
+		String text;
 		char mouseButton;	
 		static const int EVENTBASE_PLATFORMEVENT = 0x300;
 		static const int INPUT_EVENT = EVENTBASE_PLATFORMEVENT+0;
@@ -197,7 +197,7 @@ public:
 		void Render();
 		void setVSync(bool vSyncVal);
 
-		void handleKeyDown(LPARAM lParam, WPARAM wParam, wchar_t unicodeChar);
+		void handleKeyDown(LPARAM lParam, WPARAM wParam);
 		void handleKeyUp(LPARAM lParam, WPARAM wParam);
 		void handleMouseMove(LPARAM lParam, WPARAM wParam);
 		void handleMouseWheel(LPARAM lParam, WPARAM wParam);
@@ -205,6 +205,7 @@ public:
 		void handleMouseUp(int mouseCode,LPARAM lParam, WPARAM wParam);
 		void handleTouchEvent(LPARAM lParam, WPARAM wParam);
 		void handlePointerUpdate(LPARAM lParam, WPARAM wParam);
+		void handleTextInput(LPARAM lParam, WPARAM wParam);
 
 		void handleVideoModeChange(VideoModeChangeInfo *modeInfo);
 

+ 1 - 1
include/polycode/modules/ui/PolyUITreeContainer.h

@@ -41,7 +41,7 @@ namespace Polycode {
 		UITree *getRootNode();
 		Entity *scrollChild;
 		
-		void onKeyDown(PolyKEY key, wchar_t charCode);
+		void onKeyDown(PolyKEY key);
 		void onGainFocus();
 		
 		/**

+ 1 - 1
include/polycode/modules/ui/PolyUIWindow.h

@@ -42,7 +42,7 @@ namespace Polycode {
 			
 			void showWindow();
 			void hideWindow();
-			void onKeyDown(PolyKEY key, wchar_t charCode);
+			void onKeyDown(PolyKEY key);
 			virtual void onClose();
 			void onLoseFocus();
 			

+ 27 - 7
src/core/PolyWinCore.cpp

@@ -334,6 +334,12 @@ void Win32Core::setVideoMode(int xRes, int yRes, bool fullScreen, bool vSync, in
 	}
 	else {
 
+		bool menu;
+		if (GetMenu(hWnd))
+			menu = true;
+		else
+			menu = false;
+
 		RECT rect;
 		rect.left = 0;
 		rect.top = 0;
@@ -341,11 +347,11 @@ void Win32Core::setVideoMode(int xRes, int yRes, bool fullScreen, bool vSync, in
 		rect.bottom = yRes;
 		if (resizable){
 			SetWindowLongPtr(hWnd, GWL_STYLE, WS_OVERLAPPEDWINDOW | WS_SYSMENU | WS_VISIBLE);
-			AdjustWindowRect(&rect, WS_OVERLAPPEDWINDOW | WS_SYSMENU, FALSE);
+			AdjustWindowRect(&rect, WS_OVERLAPPEDWINDOW | WS_SYSMENU, menu);
 		}
 		else {
 			SetWindowLongPtr(hWnd, GWL_STYLE, WS_CAPTION | WS_POPUP | WS_SYSMENU | WS_VISIBLE);
-			AdjustWindowRect(&rect, WS_CAPTION | WS_POPUP | WS_SYSMENU, FALSE);
+			AdjustWindowRect(&rect, WS_CAPTION | WS_POPUP | WS_SYSMENU, menu);
 		}
 		MoveWindow(hWnd, 0, 0, rect.right-rect.left, rect.bottom-rect.top, TRUE);
 
@@ -653,13 +659,12 @@ PolyKEY Win32Core::mapKey(LPARAM lParam, WPARAM wParam) {
 	return keyMap[(unsigned int)wParam];
 }
 
-void Win32Core::handleKeyDown(LPARAM lParam, WPARAM wParam, wchar_t unicodeChar) {
+void Win32Core::handleKeyDown(LPARAM lParam, WPARAM wParam) {
 	lockMutex(eventMutex);
 	Win32Event newEvent;
 	newEvent.eventGroup = Win32Event::INPUT_EVENT;
 	newEvent.eventCode = InputEvent::EVENT_KEYDOWN;
 	newEvent.keyCode = mapKey(lParam, wParam);
-	newEvent.unicodeChar = unicodeChar;
 	win32Events.push_back(newEvent);
 	unlockMutex(eventMutex);
 }
@@ -670,7 +675,6 @@ void Win32Core::handleKeyUp(LPARAM lParam, WPARAM wParam) {
 	newEvent.eventGroup = Win32Event::INPUT_EVENT;
 	newEvent.eventCode = InputEvent::EVENT_KEYUP;
 	newEvent.keyCode = mapKey(lParam, wParam);
-	newEvent.unicodeChar = 0;
 	win32Events.push_back(newEvent);
 	unlockMutex(eventMutex);
 }
@@ -860,6 +864,19 @@ void Win32Core::handleMouseUp(int mouseCode,LPARAM lParam, WPARAM wParam) {
 	unlockMutex(eventMutex);
 }
 
+void Win32Core::handleTextInput(LPARAM lParam, WPARAM wParam) {
+	Win32Event newEvent;
+	newEvent.eventGroup = Win32Event::INPUT_EVENT;
+	newEvent.text = String(wParam);
+	newEvent.eventCode = InputEvent::EVENT_TEXTINPUT;
+	if ((unsigned char) newEvent.text[0] < ' ' || newEvent.text[0] == 127) {
+		return;
+	}
+	lockMutex(eventMutex);
+	win32Events.push_back(newEvent);
+	unlockMutex(eventMutex);
+}
+
 bool Win32Core::checkSpecialKeyEvents(PolyKEY key) {
 	
 	if(key == KEY_a && (input->getKeyState(KEY_LCTRL) || input->getKeyState(KEY_RCTRL))) {
@@ -932,11 +949,14 @@ void Win32Core::checkEvents() {
 					break;	
 					case InputEvent::EVENT_KEYDOWN:
 						if(!checkSpecialKeyEvents((event.keyCode))) {
-							input->setKeyState(event.keyCode, (char)event.unicodeChar, true, getTicks());
+							input->setKeyState(event.keyCode, true, getTicks());
 						}
 					break;
 					case InputEvent::EVENT_KEYUP:
-						input->setKeyState(event.keyCode, (char)event.unicodeChar, false, getTicks());
+						input->setKeyState(event.keyCode, false, getTicks());
+					break;
+					case InputEvent::EVENT_TEXTINPUT:
+						input->textInput(event.text);
 					break;
 				}
 			break;

+ 7 - 5
src/ide/PolycodeWinIDEView.cpp

@@ -228,12 +228,8 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
 				m.wParam = wParam;
 				m.lParam = lParam;
 				m.time = 0;
-				if ( PeekMessage(&m, hWnd, 0, WM_USER, PM_NOREMOVE) && (m.message == WM_CHAR) ) {
-					GetMessage(&m, hWnd, 0, WM_USER);
-						unicodeChar = (wchar_t)m.wParam;
-				}
 
-			core->handleKeyDown(lParam,wParam, unicodeChar);
+			core->handleKeyDown(lParam,wParam);
 		}
 	break;
 	case WM_KEYUP:
@@ -241,6 +237,12 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
 		if(core)
 			core->handleKeyUp(lParam,wParam);
 	break;
+	//case WM_UNICHAR:
+	//	if (wParam == UNICODE_NOCHAR)
+	//		break;
+	case WM_CHAR:
+		core->handleTextInput(lParam, wParam);
+	break;
 	case WM_CLOSE:
 	{
 		globalApp->saveConfigFile();

+ 15 - 13
src/view/win32/PolycodeView.cpp

@@ -127,19 +127,15 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
 	case WM_KEYDOWN:
 	case WM_SYSKEYDOWN:
 		if(core) {
-				wchar_t unicodeChar = 0;
-				MSG m;
-				m.hwnd = hWnd;
-				m.message = message;
-				m.wParam = wParam;
-				m.lParam = lParam;
-				m.time = 0;
-				if ( PeekMessage(&m, hWnd, 0, WM_USER, PM_NOREMOVE) && (m.message == WM_CHAR) ) {
-					GetMessage(&m, hWnd, 0, WM_USER);
-						unicodeChar = (wchar_t)m.wParam;
-				}
-
-			core->handleKeyDown(lParam,wParam, unicodeChar);
+			wchar_t unicodeChar = 0;
+			MSG m;
+			m.hwnd = hWnd;
+			m.message = message;
+			m.wParam = wParam;
+			m.lParam = lParam;
+			m.time = 0;
+
+			core->handleKeyDown(lParam,wParam);
 		}
 	break;
 	case WM_KEYUP:
@@ -147,6 +143,12 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
 		if(core)
 			core->handleKeyUp(lParam,wParam);
 	break;
+	//case WM_UNICHAR:
+	//	if (wParam == UNICODE_NOCHAR)
+	//		break;
+	case WM_CHAR:
+		core->handleTextInput(lParam, wParam);
+		break;
 	case WM_CLOSE:
 		if(core)
 			core->Shutdown();