From 6f1edc1604341b32e13371c8a4ad431e9a00cc87 Mon Sep 17 00:00:00 2001 From: crupest Date: Thu, 21 Oct 2021 21:29:06 +0800 Subject: ... --- .DS_Store | Bin 0 -> 6148 bytes demos/input_method/CMakeLists.txt | 14 +++++++++++++- src/osx/gui/InputMethod.mm | 11 +++++++++-- src/osx/gui/UiApplication.mm | 10 ++++++---- src/osx/gui/Window.mm | 13 +++++++++---- src/osx/gui/WindowPrivate.h | 4 ++-- 6 files changed, 39 insertions(+), 13 deletions(-) create mode 100644 .DS_Store diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 00000000..dc6511b8 Binary files /dev/null and b/.DS_Store differ diff --git a/demos/input_method/CMakeLists.txt b/demos/input_method/CMakeLists.txt index 98e36e29..4c94bcbd 100644 --- a/demos/input_method/CMakeLists.txt +++ b/demos/input_method/CMakeLists.txt @@ -1,2 +1,14 @@ -add_executable(demo_input_method main.cpp) + +if(NOT APPLE) + add_executable(demo_input_method main.cpp) +else() + add_executable(demo_input_method MACOSX_BUNDLE main.cpp) + set_target_properties(demo_input_method PROPERTIES + BUNDLE TRUE + MACOSX_BUNDLE_GUI_IDENTIFIER life.crupest.cru.demo_input_method + MACOSX_BUNDLE_BUNDLE_NAME demo_input_method + ) +endif() + target_link_libraries(demo_input_method PRIVATE cru_demo_base) + diff --git a/src/osx/gui/InputMethod.mm b/src/osx/gui/InputMethod.mm index 2331d8b7..2c4ac643 100644 --- a/src/osx/gui/InputMethod.mm +++ b/src/osx/gui/InputMethod.mm @@ -3,6 +3,7 @@ #import #include "InputMethodPrivate.h" #include "WindowPrivate.h" +#include "cru/common/Logger.hpp" #include "cru/osx/Convert.hpp" #include "cru/osx/gui/Window.hpp" @@ -54,9 +55,15 @@ OsxInputMethodContext::OsxInputMethodContext(OsxWindow* window) OsxInputMethodContext::~OsxInputMethodContext() {} -void OsxInputMethodContext::EnableIME() { p_->Activate(); } +void OsxInputMethodContext::EnableIME() { + log::Debug(u"Enable IME."); + p_->Activate(); +} -void OsxInputMethodContext::DisableIME() { p_->Deactivate(); } +void OsxInputMethodContext::DisableIME() { + log::Debug(u"Disable IME."); + p_->Deactivate(); +} bool OsxInputMethodContext::ShouldManuallyDrawCompositionText() { return true; } diff --git a/src/osx/gui/UiApplication.mm b/src/osx/gui/UiApplication.mm index 11763af6..d6cf14f3 100644 --- a/src/osx/gui/UiApplication.mm +++ b/src/osx/gui/UiApplication.mm @@ -17,7 +17,7 @@ #include #include -@interface AppDelegate : NSObject +@interface CruAppDelegate : NSObject - (id)init:(cru::platform::gui::osx::details::OsxUiApplicationPrivate*)p; - (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication*)sender; - (void)applicationWillTerminate:(NSNotification*)notification; @@ -32,7 +32,7 @@ class OsxUiApplicationPrivate { public: explicit OsxUiApplicationPrivate(OsxUiApplication* osx_ui_application) : osx_ui_application_(osx_ui_application) { - app_delegate_ = [[AppDelegate alloc] init:this]; + app_delegate_ = [[CruAppDelegate alloc] init:this]; } CRU_DELETE_COPY(OsxUiApplicationPrivate) @@ -44,7 +44,7 @@ class OsxUiApplicationPrivate { private: OsxUiApplication* osx_ui_application_; - AppDelegate* app_delegate_; + CruAppDelegate* app_delegate_; std::vector> quit_handlers_; long long current_timer_id_ = 1; @@ -67,6 +67,8 @@ void OsxUiApplicationPrivate::CallQuitHandlers() { OsxUiApplication::OsxUiApplication() : OsxGuiResource(this), p_(new details::OsxUiApplicationPrivate(this)) { + [NSApplication sharedApplication]; + // Add stdio logger. log::Logger::GetInstance()->AddSource(std::make_unique()); @@ -165,7 +167,7 @@ void OsxUiApplication::UnregisterWindow(OsxWindow* window) { } } -@implementation AppDelegate { +@implementation CruAppDelegate { cru::platform::gui::osx::details::OsxUiApplicationPrivate* _p; } diff --git a/src/osx/gui/Window.mm b/src/osx/gui/Window.mm index 56a1405d..8e21518e 100644 --- a/src/osx/gui/Window.mm +++ b/src/osx/gui/Window.mm @@ -149,14 +149,14 @@ bool OsxWindow::IsVisible() { void OsxWindow::SetVisible(bool is_visible) { if (p_->window_) { if (is_visible) { - [p_->window_ orderFront:p_->window_]; + [p_->window_ orderFront:nil]; } else { - [p_->window_ orderOut:p_->window_]; + [p_->window_ orderOut:nil]; } } else { if (is_visible) { CreateWindow(); - [p_->window_ orderFront:p_->window_]; + [p_->window_ orderFront:nil]; } } } @@ -220,6 +220,7 @@ void OsxWindow::CreateWindow() { NSWindowStyleMask style_mask = CalcWindowStyleMask(p_->frame_); p_->window_ = [[CruWindow alloc] init:p_.get() contentRect:content_rect style:style_mask]; + Ensures(p_->window_); [p_->window_ setDelegate:p_->window_delegate_]; @@ -281,11 +282,14 @@ IInputMethodContext* OsxWindow::GetInputMethodContext() { return p_->input_metho defer:false]; _p = p; - [self setIgnoresMouseEvents:FALSE]; [self setAcceptsMouseMovedEvents:YES]; return self; } + +- (BOOL)canBecomeKeyWindow { + return YES; +} @end @implementation CruView { @@ -340,6 +344,7 @@ IInputMethodContext* OsxWindow::GetInputMethodContext() { return p_->input_metho - (void)mouseDown:(NSEvent*)event { // cru::log::TagDebug(u"CruView", u"Recieved mouse down."); + [[self window] makeKeyWindow]; cru::platform::gui::KeyModifier key_modifier; if (event.modifierFlags & NSEventModifierFlagControl) diff --git a/src/osx/gui/WindowPrivate.h b/src/osx/gui/WindowPrivate.h index 7b788ba6..e3b93f8a 100644 --- a/src/osx/gui/WindowPrivate.h +++ b/src/osx/gui/WindowPrivate.h @@ -68,8 +68,8 @@ class OsxWindowPrivate { bool frame_; Rect content_rect_; - NSWindow* window_; - CruWindowDelegate* window_delegate_; + NSWindow* window_ = nil; + CruWindowDelegate* window_delegate_ = nil; CGLayerRef draw_layer_; -- cgit v1.2.3