Huw Davies : winemac: Update the thread' s active_keyboard_layout on keyboard change.
Alexandre Julliard
julliard at winehq.org
Wed Nov 20 13:38:58 CST 2013
Module: wine
Branch: master
Commit: 22008f7fd99b01e5f63780311825cf4e403d2e65
URL: http://source.winehq.org/git/wine.git/?a=commit;h=22008f7fd99b01e5f63780311825cf4e403d2e65
Author: Huw Davies <huw at codeweavers.com>
Date: Wed Nov 20 15:30:36 2013 +0000
winemac: Update the thread's active_keyboard_layout on keyboard change.
---
dlls/winemac.drv/cocoa_app.m | 34 ++++++++++++++++------------------
dlls/winemac.drv/cocoa_event.m | 1 +
dlls/winemac.drv/keyboard.c | 39 +++++++++++++++++++++++++--------------
dlls/winemac.drv/macdrv.h | 1 +
dlls/winemac.drv/macdrv_cocoa.h | 4 +++-
dlls/winemac.drv/macdrv_main.c | 5 ++++-
6 files changed, 50 insertions(+), 34 deletions(-)
diff --git a/dlls/winemac.drv/cocoa_app.m b/dlls/winemac.drv/cocoa_app.m
index 284023b..af56872 100644
--- a/dlls/winemac.drv/cocoa_app.m
+++ b/dlls/winemac.drv/cocoa_app.m
@@ -374,15 +374,15 @@ int macdrv_err_on;
- (void) keyboardSelectionDidChange
{
- TISInputSourceRef inputSource;
+ TISInputSourceRef inputSourceLayout;
inputSourceIsInputMethodValid = FALSE;
- inputSource = TISCopyCurrentKeyboardLayoutInputSource();
- if (inputSource)
+ inputSourceLayout = TISCopyCurrentKeyboardLayoutInputSource();
+ if (inputSourceLayout)
{
CFDataRef uchr;
- uchr = TISGetInputSourceProperty(inputSource,
+ uchr = TISGetInputSourceProperty(inputSourceLayout,
kTISPropertyUnicodeKeyLayoutData);
if (uchr)
{
@@ -393,6 +393,7 @@ int macdrv_err_on;
event->keyboard_changed.keyboard_type = self.keyboardType;
event->keyboard_changed.iso_keyboard = (KBGetLayoutType(self.keyboardType) == kKeyboardISO);
event->keyboard_changed.uchr = CFDataCreateCopy(NULL, uchr);
+ event->keyboard_changed.input_source = TISCopyCurrentKeyboardInputSource();
if (event->keyboard_changed.uchr)
{
@@ -407,7 +408,7 @@ int macdrv_err_on;
macdrv_release_event(event);
}
- CFRelease(inputSource);
+ CFRelease(inputSourceLayout);
}
}
@@ -2218,31 +2219,28 @@ void macdrv_window_rejected_focus(const macdrv_event *event)
}
/***********************************************************************
- * macdrv_get_keyboard_layout
+ * macdrv_get_input_source_info
*
- * Returns the keyboard layout uchr data.
+ * Returns the keyboard layout uchr data, keyboard type and input source.
*/
-CFDataRef macdrv_copy_keyboard_layout(CGEventSourceKeyboardType* keyboard_type, int* is_iso)
+void macdrv_get_input_source_info(CFDataRef* uchr, CGEventSourceKeyboardType* keyboard_type, int* is_iso, TISInputSourceRef* input_source)
{
- __block CFDataRef result = NULL;
-
OnMainThread(^{
- TISInputSourceRef inputSource;
+ TISInputSourceRef inputSourceLayout;
- inputSource = TISCopyCurrentKeyboardLayoutInputSource();
- if (inputSource)
+ inputSourceLayout = TISCopyCurrentKeyboardLayoutInputSource();
+ if (inputSourceLayout)
{
- CFDataRef uchr = TISGetInputSourceProperty(inputSource,
+ CFDataRef data = TISGetInputSourceProperty(inputSourceLayout,
kTISPropertyUnicodeKeyLayoutData);
- result = CFDataCreateCopy(NULL, uchr);
- CFRelease(inputSource);
+ *uchr = CFDataCreateCopy(NULL, data);
+ CFRelease(inputSourceLayout);
*keyboard_type = [WineApplicationController sharedController].keyboardType;
*is_iso = (KBGetLayoutType(*keyboard_type) == kKeyboardISO);
+ *input_source = TISCopyCurrentKeyboardInputSource();
}
});
-
- return result;
}
/***********************************************************************
diff --git a/dlls/winemac.drv/cocoa_event.m b/dlls/winemac.drv/cocoa_event.m
index 13f9695..00f6f8e 100644
--- a/dlls/winemac.drv/cocoa_event.m
+++ b/dlls/winemac.drv/cocoa_event.m
@@ -641,6 +641,7 @@ void macdrv_release_event(macdrv_event *event)
break;
case KEYBOARD_CHANGED:
CFRelease(event->keyboard_changed.uchr);
+ CFRelease(event->keyboard_changed.input_source);
break;
case QUERY_EVENT:
macdrv_release_query(event->query_event.query);
diff --git a/dlls/winemac.drv/keyboard.c b/dlls/winemac.drv/keyboard.c
index 52f97da..cc0df4e 100644
--- a/dlls/winemac.drv/keyboard.c
+++ b/dlls/winemac.drv/keyboard.c
@@ -555,6 +555,28 @@ static void update_layout_list(void)
}
/***********************************************************************
+ * macdrv_get_hkl_from_source
+ *
+ * Find the HKL associated with a given input source.
+ */
+HKL macdrv_get_hkl_from_source(TISInputSourceRef input)
+{
+ struct layout *layout;
+ HKL ret = 0;
+
+ EnterCriticalSection(&layout_list_section);
+
+ update_layout_list();
+ layout = get_layout_from_source(input);
+ if (layout) ret = layout->hkl;
+
+ LeaveCriticalSection(&layout_list_section);
+
+ return ret;
+}
+
+
+/***********************************************************************
* macdrv_compute_keyboard_layout
*/
void macdrv_compute_keyboard_layout(struct macdrv_thread_data *thread_data)
@@ -1027,6 +1049,7 @@ void macdrv_keyboard_changed(const macdrv_event *event)
thread_data->keyboard_layout_uchr = CFDataCreateCopy(NULL, event->keyboard_changed.uchr);
thread_data->keyboard_type = event->keyboard_changed.keyboard_type;
thread_data->iso_keyboard = event->keyboard_changed.iso_keyboard;
+ thread_data->active_keyboard_layout = macdrv_get_hkl_from_source(event->keyboard_changed.input_source);
thread_data->dead_key_state = 0;
macdrv_compute_keyboard_layout(thread_data);
@@ -1327,22 +1350,10 @@ INT CDECL macdrv_GetKeyNameText(LONG lparam, LPWSTR buffer, INT size)
*/
HKL CDECL macdrv_GetKeyboardLayout(DWORD thread_id)
{
- if (!thread_id || thread_id == GetCurrentThreadId())
- {
- struct macdrv_thread_data *thread_data = macdrv_thread_data();
- if (thread_data && thread_data->active_keyboard_layout)
- return thread_data->active_keyboard_layout;
- }
- else
+ if (thread_id && thread_id != GetCurrentThreadId())
FIXME("couldn't return keyboard layout for thread %04x\n", thread_id);
- /* FIXME: Use TISGetInputSourceProperty() and kTISPropertyInputSourceLanguages
- * to get input source language ID string. Use
- * CFLocaleGetWindowsLocaleCodeFromLocaleIdentifier() to convert that
- * to a Windows locale ID and from there to a layout handle.
- */
-
- return get_locale_keyboard_layout();
+ return macdrv_init_thread_data()->active_keyboard_layout;
}
diff --git a/dlls/winemac.drv/macdrv.h b/dlls/winemac.drv/macdrv.h
index d49a3c0..120fa51 100644
--- a/dlls/winemac.drv/macdrv.h
+++ b/dlls/winemac.drv/macdrv.h
@@ -178,6 +178,7 @@ extern void macdrv_compute_keyboard_layout(struct macdrv_thread_data *thread_dat
extern void macdrv_keyboard_changed(const macdrv_event *event) DECLSPEC_HIDDEN;
extern void macdrv_key_event(HWND hwnd, const macdrv_event *event) DECLSPEC_HIDDEN;
extern void macdrv_hotkey_press(const macdrv_event *event) DECLSPEC_HIDDEN;
+extern HKL macdrv_get_hkl_from_source(TISInputSourceRef input_source) DECLSPEC_HIDDEN;
extern void macdrv_displays_changed(const macdrv_event *event) DECLSPEC_HIDDEN;
diff --git a/dlls/winemac.drv/macdrv_cocoa.h b/dlls/winemac.drv/macdrv_cocoa.h
index 1c2277f..ca53507 100644
--- a/dlls/winemac.drv/macdrv_cocoa.h
+++ b/dlls/winemac.drv/macdrv_cocoa.h
@@ -241,6 +241,7 @@ typedef struct macdrv_event {
CFDataRef uchr;
CGEventSourceKeyboardType keyboard_type;
int iso_keyboard;
+ TISInputSourceRef input_source;
} keyboard_changed;
struct {
int button;
@@ -411,7 +412,8 @@ extern int macdrv_send_text_input_event(int pressed, unsigned int flags, int rep
/* keyboard */
-extern CFDataRef macdrv_copy_keyboard_layout(CGEventSourceKeyboardType* keyboard_type, int* is_iso) DECLSPEC_HIDDEN;
+extern void macdrv_get_input_source_info(CFDataRef* uchr,CGEventSourceKeyboardType* keyboard_type, int* is_iso,
+ TISInputSourceRef* input_source) DECLSPEC_HIDDEN;
extern CFArrayRef macdrv_create_input_source_list(void) DECLSPEC_HIDDEN;
extern const CFStringRef macdrv_input_source_input_key DECLSPEC_HIDDEN;
extern const CFStringRef macdrv_input_source_type_key DECLSPEC_HIDDEN;
diff --git a/dlls/winemac.drv/macdrv_main.c b/dlls/winemac.drv/macdrv_main.c
index 5cdd13c..ba15706 100644
--- a/dlls/winemac.drv/macdrv_main.c
+++ b/dlls/winemac.drv/macdrv_main.c
@@ -255,6 +255,7 @@ static void set_queue_display_fd(int fd)
struct macdrv_thread_data *macdrv_init_thread_data(void)
{
struct macdrv_thread_data *data = macdrv_thread_data();
+ TISInputSourceRef input_source;
if (data) return data;
@@ -270,7 +271,9 @@ struct macdrv_thread_data *macdrv_init_thread_data(void)
ExitProcess(1);
}
- data->keyboard_layout_uchr = macdrv_copy_keyboard_layout(&data->keyboard_type, &data->iso_keyboard);
+ macdrv_get_input_source_info(&data->keyboard_layout_uchr, &data->keyboard_type, &data->iso_keyboard, &input_source);
+ data->active_keyboard_layout = macdrv_get_hkl_from_source(input_source);
+ CFRelease(input_source);
macdrv_compute_keyboard_layout(data);
set_queue_display_fd(macdrv_get_event_queue_fd(data->queue));
More information about the wine-cvs
mailing list