From 67d2f102d9a512373780fad217e6bb06dd2b34ec Mon Sep 17 00:00:00 2001 From: Michael R Sweet Date: Thu, 15 Oct 1998 14:38:16 +0000 Subject: [PATCH] More WIN32 fixes from Gustavo Hime. git-svn-id: file:///fltk/svn/fltk/trunk@13 ea41ed52-d2ee-0310-a9c1-e6b18d33e121 --- FL/win32.H | 4 +- src/Fl_Double_Window.cxx | 5 ++- src/Fl_win32.cxx | 80 +++++++++++++++++++++++----------------- 3 files changed, 52 insertions(+), 37 deletions(-) diff --git a/FL/win32.H b/FL/win32.H index 93f307668..dbb812a34 100644 --- a/FL/win32.H +++ b/FL/win32.H @@ -83,10 +83,10 @@ extern MSG fl_msg; extern HDC fl_makeDC(HBITMAP); #define fl_begin_offscreen(b) \ - HDC _sgc=fl_gc; Window _sw=fl_window; fl_gc=fl_makeDC(b); fl_window=b; + HDC _sgc=fl_gc; Window _sw=fl_window; fl_gc=fl_makeDC(b); fl_window=(HWND)b #define fl_end_offscreen() \ - ReleaseDC(fl_window,fl_gc); fl_window=_sw; fl_gc = _sgc + DeleteDC(fl_gc); fl_window=_sw; fl_gc = _sgc void fl_copy_offscreen(int x,int y,int w,int h,HBITMAP pixmap,int srcx,int srcy); #define fl_delete_offscreen(bitmap) DeleteObject(bitmap); diff --git a/src/Fl_Double_Window.cxx b/src/Fl_Double_Window.cxx index 4c1bc3812..4cc060870 100644 --- a/src/Fl_Double_Window.cxx +++ b/src/Fl_Double_Window.cxx @@ -72,7 +72,7 @@ void fl_copy_offscreen(int x,int y,int w,int h,HBITMAP bitmap,int srcx,int srcy) HDC new_gc = CreateCompatibleDC(fl_gc); SelectObject(new_gc, bitmap); BitBlt(fl_gc, x, y, w, h, new_gc, srcx, srcy, SRCCOPY); - ReleaseDC(bitmap, new_gc); + DeleteDC(new_gc); } extern void fl_restore_clip(); @@ -95,12 +95,13 @@ void Fl_Double_Window::flush() { clear_damage(~0); } #ifdef WIN32 + fl_clip_region(i->region); i->region = 0; if (DAMAGE_TEST()) { HDC _sgc = fl_gc; fl_gc = fl_makeDC(i->other_xid); fl_restore_clip(); // duplicate region into new gc draw(); - ReleaseDC(i->other_xid, fl_gc); + DeleteDC(fl_gc); fl_gc = _sgc; } #else // X: diff --git a/src/Fl_win32.cxx b/src/Fl_win32.cxx index 5060e51a3..1247ef3d0 100644 --- a/src/Fl_win32.cxx +++ b/src/Fl_win32.cxx @@ -161,29 +161,29 @@ static int mouse_event(Fl_Window *window, int what, int button, // convert a MSWindows VK_x to an Fltk (X) Keysym: // See also the inverse converter in Fl_get_key_win32.C // This table is in numeric order by VK: -static const struct {unsigned short vk, fltk, extended;} vktab[] = { +static const struct {unsigned short vk, fltk;} vktab[] = { {VK_BACK, FL_BackSpace}, {VK_TAB, FL_Tab}, {VK_CLEAR, FL_KP+'5'}, - {VK_RETURN, FL_Enter, FL_KP_Enter}, - {VK_SHIFT, FL_Shift_L, FL_Shift_R}, - {VK_CONTROL, FL_Control_L, FL_Control_R}, - {VK_MENU, FL_Alt_L, FL_Alt_R}, + {VK_RETURN, FL_Enter}, + {VK_SHIFT, FL_Shift_L}, + {VK_CONTROL, FL_Control_L}, + {VK_MENU, FL_Alt_L}, {VK_PAUSE, FL_Pause}, {VK_CAPITAL, FL_Caps_Lock}, {VK_ESCAPE, FL_Escape}, {VK_SPACE, ' '}, - {VK_PRIOR, FL_KP+'9', FL_Page_Up}, - {VK_NEXT, FL_KP+'3', FL_Page_Down}, - {VK_END, FL_KP+'1', FL_End}, - {VK_HOME, FL_KP+'7', FL_Home}, - {VK_LEFT, FL_KP+'4', FL_Left}, - {VK_UP, FL_KP+'8', FL_Up}, - {VK_RIGHT, FL_KP+'6', FL_Right}, - {VK_DOWN, FL_KP+'2', FL_Down}, - {VK_SNAPSHOT, FL_Print}, // does not work on NT - {VK_INSERT, FL_KP+'0', FL_Insert}, - {VK_DELETE, FL_KP+'.', FL_Delete}, + {VK_PRIOR, FL_KP+'9'}, + {VK_NEXT, FL_KP+'3'}, + {VK_END, FL_KP+'1'}, + {VK_HOME, FL_KP+'7'}, + {VK_LEFT, FL_KP+'4'}, + {VK_UP, FL_KP+'8'}, + {VK_RIGHT, FL_KP+'6'}, + {VK_DOWN, FL_KP+'2'}, + {VK_SNAPSHOT, FL_Print}, // does not work on NT + {VK_INSERT, FL_KP+'0'}, + {VK_DELETE, FL_KP+'.'}, {VK_LWIN, FL_Meta_L}, {VK_RWIN, FL_Meta_R}, {VK_APPS, FL_Menu}, @@ -208,19 +208,35 @@ static const struct {unsigned short vk, fltk, extended;} vktab[] = { }; static int ms2fltk(int vk, int extended) { static unsigned short vklut[256]; - static unsigned short extendedlut[256]; if (!vklut[1]) { // init the table unsigned int i; for (i = 0; i < 256; i++) vklut[i] = tolower(i); for (i=VK_F1; i<=VK_F16; i++) vklut[i] = i+(FL_F-(VK_F1-1)); for (i=VK_NUMPAD0; i<=VK_NUMPAD9; i++) vklut[i] = i+(FL_KP+'0'-VK_NUMPAD0); - for (i = 0; i < sizeof(vktab)/sizeof(*vktab); i++) { + for (i = 0; i < sizeof(vktab)/sizeof(*vktab); i++) vklut[vktab[i].vk] = vktab[i].fltk; - extendedlut[vktab[i].vk] = vktab[i].extended; - } - for (i = 0; i < 256; i++) if (!extendedlut[i]) extendedlut[i] = vklut[i]; } - return extended ? extendedlut[vk] : vklut[vk]; + if (extended) + { + //this is lame, have to check the vk code to make it faster + switch (vk) { + case VK_INSERT: return FL_Insert; + case VK_DELETE: return FL_Delete; + case VK_END: return FL_End; + case VK_DOWN: return FL_Down; + case VK_NEXT: return FL_Page_Down; + case VK_LEFT: return FL_Left; + case VK_RIGHT: return FL_Right; + case VK_HOME: return FL_Home; + case VK_UP: return FL_Up; + case VK_PRIOR: return FL_Page_Up; + case VK_SHIFT: return FL_Shift_R; + case VK_CONTROL : return FL_Control_R; + case VK_MENU: return FL_Alt_R; + case VK_RETURN: return FL_KP_Enter; + } + } + return vklut[vk]; } #if USE_COLORMAP @@ -317,10 +333,19 @@ static LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lPar goto STUPID_MICROSOFT; } // otherwise use it as a 0-character key... + // otherwise use it as a 0-character key... case WM_DEADCHAR: case WM_SYSDEADCHAR: + buffer[0] = 0; + Fl::e_text = buffer; + Fl::e_length = 0; + goto GETSTATE; case WM_CHAR: case WM_SYSCHAR: + buffer[0] = char(wParam); + Fl::e_text = buffer; + Fl::e_length = 1; + GETSTATE: {ulong state = Fl::e_state & 0xff000000; // keep the mouse button state // if GetKeyState is expensive we might want to comment some of these out: if (GetKeyState(VK_SHIFT)&~1) state |= FL_SHIFT; @@ -335,17 +360,6 @@ static LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lPar if (GetKeyState(VK_SCROLL)) state |= FL_SCROLL_LOCK; Fl::e_state = state;} if (lParam & (1<<31)) goto DEFAULT; // ignore up events after fixing shift - if (uMsg == WM_CHAR || uMsg == WM_SYSCHAR) { - buffer[0] = char(wParam); - Fl::e_length = 1; - } else if (Fl::e_keysym >= FL_KP && Fl::e_keysym <= FL_KP_Last) { - buffer[0] = Fl::e_keysym-FL_KP; - Fl::e_length = 1; - } else { - buffer[0] = 0; - Fl::e_length = 0; - } - Fl::e_text = buffer; // for (int i = lParam&0xff; i--;) while (window->parent()) window = window->window(); if (Fl::handle(FL_KEYBOARD,window)) return 0;