glass/glass-lib-windows/src/ViewContainer.cpp

Print this page




  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