Example #1
0
bool_t
ucnf_canonical_composition
  (codepoint_t first, codepoint_t second, codepoint_t *composite)
{
  size_t pos;
  codepoint_t h = first ^ second; /* hash value */
  
  if (h < comp_hash_length && (0 != (pos = (size_t)comp_hash[h])))
  {
    /* comp_map contains a 0-terminated sequence of pairs: (first,result)
    (Another composing pair having first cannot have the same hash value,
    so the second part is omitted.) */
    const uint16_t *p;
    for (p = (uint16_t *)comp_map + (pos-1); *p; p++)
    {
      codepoint_t f,r;
      utf16_decode(&p,&f), p++;
      utf16_decode(&p,&r);
      if (f == first)
      {
        *composite = r;
        return 1;
      }
    }
  }

  return 0;
}
Example #2
0
LRESULT CALLBACK glwtWin32WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    GLWTWindow *win = (GLWTWindow*)GetWindowLongPtr(hwnd, 0);

    if(win)
    {
        switch(uMsg)
        {
            case WM_PAINT:
                if(win->win_callback)
                {
                    GLWTWindowEvent event;
                    event.window = win;
                    event.type = GLWT_WINDOW_EXPOSE;
                    event.dummy.dummy = 0;
                    win->win_callback(win, &event, win->userdata);
                }

                ValidateRect(hwnd, NULL);
                return 0;

            case WM_KEYUP:
            case WM_KEYDOWN:
            case WM_SYSKEYUP:
            case WM_SYSKEYDOWN:
                if(win->win_callback)
                {
                    GLWTWindowEvent event;
                    event.window = win;
                    event.type = (uMsg == WM_KEYDOWN || uMsg == WM_SYSKEYDOWN) ? GLWT_WINDOW_KEY_DOWN : GLWT_WINDOW_KEY_UP;
                    event.key.keysym = translate_key(wParam, lParam);
                    event.key.scancode = (lParam >> 16) & 0xff;
                    event.key.mod = GetModifiers();
                    win->win_callback(win, &event, win->userdata);
                }

                if(uMsg == WM_SYSKEYUP || uMsg == WM_SYSKEYDOWN)
                    break;
                return 0;

            case WM_LBUTTONUP:
            case WM_LBUTTONDOWN:
            case WM_MBUTTONUP:
            case WM_MBUTTONDOWN:
            case WM_RBUTTONUP:
            case WM_RBUTTONDOWN:
            case WM_XBUTTONUP:
            case WM_XBUTTONDOWN:
            case WM_MOUSEWHEEL:
            case WM_MOUSEHWHEEL:
                if(win->win_callback)
                {
                    GLWTWindowEvent event;

                    event.window = win;
                    event.type = (
                        uMsg == WM_LBUTTONUP ||
                        uMsg == WM_MBUTTONUP ||
                        uMsg == WM_RBUTTONUP ||
                        uMsg == WM_XBUTTONUP ||
                        uMsg == WM_MOUSEWHEEL ||
                        uMsg == WM_MOUSEHWHEEL
                        ) ? GLWT_WINDOW_BUTTON_DOWN : GLWT_WINDOW_BUTTON_UP;
                    event.button.x = LOWORD(lParam);
                    event.button.y = HIWORD(lParam);
                    event.button.button =
                        (uMsg == WM_LBUTTONUP || uMsg == WM_LBUTTONDOWN) ? 0 :
                        (uMsg == WM_MBUTTONUP || uMsg == WM_MBUTTONDOWN) ? 1 :
                        (uMsg == WM_RBUTTONUP || uMsg == WM_RBUTTONDOWN) ? 2 :
                        (uMsg == WM_XBUTTONUP || uMsg == WM_XBUTTONDOWN) ? (HIWORD(wParam) == XBUTTON1 ? 5 : 6) :
                        (uMsg == WM_MOUSEWHEEL) ? (GET_WHEEL_DELTA_WPARAM(wParam) < 0 ? 3 : 4) :
                        (uMsg == WM_MOUSEHWHEEL) ? (GET_WHEEL_DELTA_WPARAM(wParam) < 0 ? 7 : 8) :
                        0;

                    event.button.mod = GetModifiers();
                    win->win_callback(win, &event, win->userdata);
                }

                return 0;

            case WM_MOUSEMOVE:
                if(win->win_callback)
                {
                    GLWTWindowEvent event;

                    event.window = win;
                    event.type = GLWT_WINDOW_MOUSE_MOTION;
                    event.motion.x = GET_X_LPARAM(lParam);
                    event.motion.y = GET_Y_LPARAM(lParam);
                    event.motion.buttons  =
                        (wParam & MK_LBUTTON  ? (1 << 0) : 0) |
                        (wParam & MK_RBUTTON  ? (1 << 1) : 0) |
                        (wParam & MK_MBUTTON  ? (1 << 2) : 0) |
                        (wParam & MK_XBUTTON1 ? (1 << 5) : 0) |
                        (wParam & MK_XBUTTON2 ? (1 << 6) : 0);
                    win->win_callback(win, &event, win->userdata);
                }

                {
                    TRACKMOUSEEVENT tme;
                    tme.cbSize = sizeof(tme);
                    tme.dwFlags = TME_QUERY;
                    tme.hwndTrack = hwnd;
                    TrackMouseEvent(&tme);

                    if(tme.dwFlags != TME_LEAVE)
                    {
                        tme.cbSize = sizeof(tme);
                        tme.dwFlags = TME_HOVER|TME_LEAVE;
                        tme.hwndTrack = hwnd;
                        tme.dwHoverTime = 1;
                        TrackMouseEvent(&tme);
                    }
                }

                return 0;

            case WM_SETFOCUS:
            case WM_KILLFOCUS:
                if(win->win_callback)
                {
                    GLWTWindowEvent event;
                    event.window = win;
                    event.type = uMsg == WM_SETFOCUS ? GLWT_WINDOW_FOCUS_IN : GLWT_WINDOW_FOCUS_OUT;
                    event.dummy.dummy = 0;
                    win->win_callback(win, &event, win->userdata);
                }

                return 0;

            case WM_MOUSEHOVER:
            case WM_MOUSELEAVE:
                if(win->win_callback)
                {
                    GLWTWindowEvent event;
                    event.window = win;
                    event.type = (uMsg == WM_MOUSEHOVER ? GLWT_WINDOW_MOUSE_ENTER : GLWT_WINDOW_MOUSE_LEAVE);
                    event.dummy.dummy = 0;
                    win->win_callback(win, &event, win->userdata);
                }

                {
                    TRACKMOUSEEVENT tme;
                    tme.cbSize = sizeof(tme);
                    tme.dwFlags = uMsg == WM_MOUSEHOVER ? TME_LEAVE : TME_HOVER;
                    tme.hwndTrack = hwnd;
                    tme.dwHoverTime = 1;
                    TrackMouseEvent(&tme);
                }

                return 0;

            case WM_SHOWWINDOW:
                if(win->win_callback)
                {
                    GLWTWindowEvent event;
                    event.window = win;
                    event.type = (wParam == TRUE ? GLWT_WINDOW_SHOW : GLWT_WINDOW_HIDE);
                    event.dummy.dummy = 0;
                    win->win_callback(win, &event, win->userdata);
                }

                return 0;

            case WM_SIZE:
                if(win->win_callback)
                {
                    GLWTWindowEvent event;
                    event.window = win;
                    event.type = GLWT_WINDOW_RESIZE;
                    event.resize.width = LOWORD(lParam);
                    event.resize.height = HIWORD(lParam);
                    win->win_callback(win, &event, win->userdata);
                }

                return 0;

            case WM_CLOSE:
                win->closed = 1;

                if(win->win_callback)
                {
                    GLWTWindowEvent event;
                    event.window = win;
                    event.type = GLWT_WINDOW_CLOSE;
                    event.dummy.dummy = 0;
                    win->win_callback(win, &event, win->userdata);
                }

                return 0;

            case WM_SYSCHAR:
            case WM_CHAR:
                if(win->win_callback)
                {
                    GLWTWindowEvent event;
                    event.window = win;
                    event.type = GLWT_WINDOW_CHARACTER_INPUT;
                    event.character.unicode = utf16_decode((unsigned int)wParam);

                    win->win_callback(win, &event, win->userdata);
                }

                return 0;

            default:
                break;

        }
    }