40 #include "com_sun_glass_events_DndEvent.h"
41 #include "com_sun_glass_events_TouchEvent.h"
42
43 static UINT LangToCodePage(LANGID idLang)
44 {
45 WCHAR strCodePage[8];
46 // use the LANGID to create a LCID
47 LCID idLocale = MAKELCID(idLang, SORT_DEFAULT);
48 // get the ANSI code page associated with this locale
49 if (::GetLocaleInfo(idLocale, LOCALE_IDEFAULTANSICODEPAGE,
50 strCodePage, sizeof(strCodePage) / sizeof(WCHAR)) > 0)
51 {
52 return _wtoi(strCodePage);
53 } else {
54 return ::GetACP();
55 }
56 }
57
58 namespace {
59
60 bool IsPenEvent()
61 {
62 // http://msdn.microsoft.com/en-us/library/windows/desktop/ms703320(v=vs.85).aspx
63
64 enum {
65 SIGNATURE = 0xFF515700,
66 MASK = 0xFFFFFF00
67 };
68
69 const LPARAM v = GetMessageExtraInfo();
70
71 return ((v & MASK) == SIGNATURE);
72 }
73
74 } // namespace
75
76 ViewContainer::ViewContainer() :
77 m_view(NULL),
78 m_bTrackingMouse(FALSE),
79 m_manipProc(NULL),
80 m_inertiaProc(NULL),
81 m_gestureSupportCls(NULL),
82 m_lastMouseMovePosition(-1),
83 m_mouseButtonDownCounter(0)
84 {
85 m_kbLayout = ::GetKeyboardLayout(0);
86 m_idLang = LOWORD(m_kbLayout);
500 }
501
502 // get screen coords
503 POINT ptAbs = pt;
504 if (type == com_sun_glass_events_MouseEvent_WHEEL) {
505 ::ScreenToClient(hwnd, &pt);
506 } else {
507 ::ClientToScreen(hwnd, &ptAbs);
508 }
509
510 // unmirror the x coordinate
511 LONG style = ::GetWindowLong(hwnd, GWL_EXSTYLE);
512 if (style & WS_EX_LAYOUTRTL) {
513 RECT rect = {0};
514 ::GetClientRect(hwnd, &rect);
515 pt.x = max(0, rect.right - rect.left) - pt.x;
516 }
517
518 jint jModifiers = GetModifiers();
519
520 const jboolean isSynthesized = jboolean(IsPenEvent());
521
522 JNIEnv *env = GetEnv();
523
524 if (!m_bTrackingMouse && type != com_sun_glass_events_MouseEvent_EXIT) {
525 TRACKMOUSEEVENT trackData;
526 trackData.cbSize = sizeof(trackData);
527 trackData.dwFlags = TME_LEAVE;
528 trackData.hwndTrack = hwnd;
529 trackData.dwHoverTime = HOVER_DEFAULT;
530 if (::TrackMouseEvent(&trackData)) {
531 // Mouse tracking will be canceled automatically upon receiving WM_MOUSELEAVE
532 m_bTrackingMouse = TRUE;
533 }
534 env->CallVoidMethod(GetView(), javaIDs.View.notifyMouse,
535 com_sun_glass_events_MouseEvent_ENTER,
536 com_sun_glass_events_MouseEvent_BUTTON_NONE,
537 pt.x, pt.y, ptAbs.x, ptAbs.y,
538 jModifiers, JNI_FALSE, isSynthesized);
539 CheckAndClearException(env);
540
|
40 #include "com_sun_glass_events_DndEvent.h"
41 #include "com_sun_glass_events_TouchEvent.h"
42
43 static UINT LangToCodePage(LANGID idLang)
44 {
45 WCHAR strCodePage[8];
46 // use the LANGID to create a LCID
47 LCID idLocale = MAKELCID(idLang, SORT_DEFAULT);
48 // get the ANSI code page associated with this locale
49 if (::GetLocaleInfo(idLocale, LOCALE_IDEFAULTANSICODEPAGE,
50 strCodePage, sizeof(strCodePage) / sizeof(WCHAR)) > 0)
51 {
52 return _wtoi(strCodePage);
53 } else {
54 return ::GetACP();
55 }
56 }
57
58 namespace {
59
60 bool IsTouchEvent()
61 {
62 // http://msdn.microsoft.com/en-us/library/windows/desktop/ms703320(v=vs.85).aspx
63
64 enum {
65 SIGNATURE = 0xFF515780,
66 MASK = 0xFFFFFF80
67 };
68
69 const LPARAM v = GetMessageExtraInfo();
70
71 return ((v & MASK) == SIGNATURE);
72 }
73
74 } // namespace
75
76 ViewContainer::ViewContainer() :
77 m_view(NULL),
78 m_bTrackingMouse(FALSE),
79 m_manipProc(NULL),
80 m_inertiaProc(NULL),
81 m_gestureSupportCls(NULL),
82 m_lastMouseMovePosition(-1),
83 m_mouseButtonDownCounter(0)
84 {
85 m_kbLayout = ::GetKeyboardLayout(0);
86 m_idLang = LOWORD(m_kbLayout);
500 }
501
502 // get screen coords
503 POINT ptAbs = pt;
504 if (type == com_sun_glass_events_MouseEvent_WHEEL) {
505 ::ScreenToClient(hwnd, &pt);
506 } else {
507 ::ClientToScreen(hwnd, &ptAbs);
508 }
509
510 // unmirror the x coordinate
511 LONG style = ::GetWindowLong(hwnd, GWL_EXSTYLE);
512 if (style & WS_EX_LAYOUTRTL) {
513 RECT rect = {0};
514 ::GetClientRect(hwnd, &rect);
515 pt.x = max(0, rect.right - rect.left) - pt.x;
516 }
517
518 jint jModifiers = GetModifiers();
519
520 const jboolean isSynthesized = jboolean(IsTouchEvent());
521
522 JNIEnv *env = GetEnv();
523
524 if (!m_bTrackingMouse && type != com_sun_glass_events_MouseEvent_EXIT) {
525 TRACKMOUSEEVENT trackData;
526 trackData.cbSize = sizeof(trackData);
527 trackData.dwFlags = TME_LEAVE;
528 trackData.hwndTrack = hwnd;
529 trackData.dwHoverTime = HOVER_DEFAULT;
530 if (::TrackMouseEvent(&trackData)) {
531 // Mouse tracking will be canceled automatically upon receiving WM_MOUSELEAVE
532 m_bTrackingMouse = TRUE;
533 }
534 env->CallVoidMethod(GetView(), javaIDs.View.notifyMouse,
535 com_sun_glass_events_MouseEvent_ENTER,
536 com_sun_glass_events_MouseEvent_BUTTON_NONE,
537 pt.x, pt.y, ptAbs.x, ptAbs.y,
538 jModifiers, JNI_FALSE, isSynthesized);
539 CheckAndClearException(env);
540
|