From b0cdb25d3cf5e3016ce14d889a357cd963ba876d Mon Sep 17 00:00:00 2001 From: Bill Spitzak Date: Sat, 3 Jun 2000 08:37:09 +0000 Subject: [PATCH] Fixes for 1.0.8 I found: Fixed hardware overlays. The problem was the new fl_clipped() code, which tests against the current window size. The hardware overlay code did not set the current window when drawing the overlay. I needed hardware overlay for DD's code, I'm not sure if these fixes are good enough to enable this in our general release. Hardware overlay still only works on SGI Irix. Some patches to turn off the MSVC++ -Oa (assumme no aliasing) optimization flag. Suprisingly this only broke a few parts of fltk, or at least these are the only ones I found. Does not unmap child windows when the main window is iconized. This reduces flashing when the window is deiconized. Fl::key() is set to zero by all events except key down/up. This will allow you to reliably test if an event or callback was produced by a keystroke. Fixes the bug posted about stopping Escape from closing the window. User defined cursors on OpenGL windows slowed down NT a *LOT*. Some attempts to fix this by turning off the cursor while drawing the window. Filename completion in the file chooser works better on NT. Typing TAB fixes the case of everything you typed to match the shortest name that can be completed. git-svn-id: file:///fltk/svn/fltk/branches/branch-1.0@1158 ea41ed52-d2ee-0310-a9c1-e6b18d33e121 --- FL/Fl_Window.H | 6 ++--- src/Fl.cxx | 33 ++++++++++++++++++++-------- src/Fl_Gl_Window.cxx | 23 +++++++++++--------- src/Fl_Menu_Window.cxx | 6 ++--- src/Fl_win32.cxx | 47 ++++++++++++++++++++-------------------- src/Fl_x.cxx | 5 +++-- src/fl_file_chooser.cxx | 16 +++++++++++--- src/fl_show_colormap.cxx | 7 ++++-- 8 files changed, 88 insertions(+), 55 deletions(-) diff --git a/FL/Fl_Window.H b/FL/Fl_Window.H index 286e9ab98..155f6aa44 100644 --- a/FL/Fl_Window.H +++ b/FL/Fl_Window.H @@ -1,5 +1,5 @@ // -// "$Id: Fl_Window.H,v 1.12.2.2 2000/04/25 22:15:58 mike Exp $" +// "$Id: Fl_Window.H,v 1.12.2.3 2000/06/03 08:36:56 bill Exp $" // // Window header file for the Fast Light Tool Kit (FLTK). // @@ -48,11 +48,11 @@ class Fl_Window : public Fl_Group { FL_FORCE_POSITION = 16, FL_NON_MODAL = 32 }; - static FL_EXPORT Fl_Window *current_; FL_EXPORT void _Fl_Window(); // constructor innards protected: + static FL_EXPORT Fl_Window *current_; virtual FL_EXPORT void draw(); virtual FL_EXPORT void flush(); @@ -113,5 +113,5 @@ public: #endif // -// End of "$Id: Fl_Window.H,v 1.12.2.2 2000/04/25 22:15:58 mike Exp $". +// End of "$Id: Fl_Window.H,v 1.12.2.3 2000/06/03 08:36:56 bill Exp $". // diff --git a/src/Fl.cxx b/src/Fl.cxx index 227879ee7..874c55301 100644 --- a/src/Fl.cxx +++ b/src/Fl.cxx @@ -1,5 +1,5 @@ // -// "$Id: Fl.cxx,v 1.24.2.22 2000/05/16 12:26:58 mike Exp $" +// "$Id: Fl.cxx,v 1.24.2.23 2000/06/03 08:36:59 bill Exp $" // // Main event handling code for the Fast Light Tool Kit (FLTK). // @@ -360,8 +360,6 @@ void fl_fix_focus() { if (Fl::grab()) return; // don't do anything while grab is on. - Fl::e_keysym = 0; // make sure it is not confused with navigation key - // set focus based on Fl::modal() and fl_xfocus Fl_Widget* w = fl_xfocus; if (w) { @@ -600,18 +598,35 @@ Fl_Window::~Fl_Window() { hide(); } -// Child windows must respond to FL_SHOW and FL_HIDE by actually -// doing unmap operations. Outer windows assumme FL_SHOW & FL_HIDE -// are messages from X: +// FL_SHOW and FL_HIDE are called whenever the visibility of this widget +// or any parent changes. We must correctly map/unmap the system's window. + +// For top-level windows it is assummed the window has already been +// mapped or unmapped!!! This is because this should only happen when +// Fl_Window::show() or Fl_Window::hide() is called, or in response to +// iconize/deiconize events from the system. int Fl_Window::handle(int event) { if (parent()) switch (event) { case FL_SHOW: if (!shown()) show(); - else XMapWindow(fl_display, fl_xid(this)); + else XMapWindow(fl_display, fl_xid(this)); // extra map calls are harmless break; case FL_HIDE: - if (shown()) XUnmapWindow(fl_display, fl_xid(this)); + if (shown()) { + // Find what really turned invisible, if is was a parent window + // we do nothing. We need to avoid unnecessary unmap calls + // because they cause the display to blink when the parent is + // remapped. However if this or any intermediate non-window + // widget has really had hide() called directly on it, we must + // unmap because when the parent window is remapped we don't + // want to reappear. + if (visible()) { + Fl_Widget* p = parent(); for (;p->visible();p = p->parent()) {} + if (p->type() >= FL_WINDOW) break; // don't do the unmap + } + XUnmapWindow(fl_display, fl_xid(this)); + } break; } return Fl_Group::handle(event); @@ -705,5 +720,5 @@ void Fl_Window::flush() { } // -// End of "$Id: Fl.cxx,v 1.24.2.22 2000/05/16 12:26:58 mike Exp $". +// End of "$Id: Fl.cxx,v 1.24.2.23 2000/06/03 08:36:59 bill Exp $". // diff --git a/src/Fl_Gl_Window.cxx b/src/Fl_Gl_Window.cxx index f8d695884..16073c9dc 100644 --- a/src/Fl_Gl_Window.cxx +++ b/src/Fl_Gl_Window.cxx @@ -1,5 +1,5 @@ // -// "$Id: Fl_Gl_Window.cxx,v 1.12.2.11 2000/04/25 22:16:24 mike Exp $" +// "$Id: Fl_Gl_Window.cxx,v 1.12.2.12 2000/06/03 08:37:01 bill Exp $" // // OpenGL window code for the Fast Light Tool Kit (FLTK). // @@ -126,6 +126,7 @@ void Fl_Gl_Window::make_current() { } #endif // USE_COLORMAP glDrawBuffer(GL_BACK); + current_ = this; } void Fl_Gl_Window::ortho() { @@ -158,15 +159,17 @@ int fl_overlay_depth = 0; void Fl_Gl_Window::flush() { uchar save_valid = valid_; +#ifdef _WIN32 + // SGI 320 messes up overlay with user-defined cursors: + bool fixcursor = + Fl_X::i(this)->cursor && Fl_X::i(this)->cursor != fl_default_cursor; + if (fixcursor) SetCursor(0); +#endif #if HAVE_GL_OVERLAY && defined(_WIN32) - bool fixcursor = false; if (overlay && overlay != this && - ((damage()&(FL_DAMAGE_OVERLAY|FL_DAMAGE_ALL|FL_DAMAGE_EXPOSE)) + ((damage()&(FL_DAMAGE_OVERLAY|FL_DAMAGE_EXPOSE)) || !save_valid)) { - // SGI 320 messes up overlay over singlebuffer - fixcursor = !g->d; - if (fixcursor) SetCursor(0); // Draw into hardware overlay planes fl_set_gl_context(this, (GLXContext)overlay); if (fl_overlay_depth) @@ -262,11 +265,11 @@ void Fl_Gl_Window::flush() { draw(); if (overlay == this) draw_overlay(); glFlush(); -#if HAVE_GL_OVERLAY && defined(_WIN32) - if (fixcursor) SetCursor(Fl_X::i(this)->cursor); -#endif } +#ifdef _WIN32 + if (fixcursor) SetCursor(Fl_X::i(this)->cursor); +#endif valid(1); } @@ -320,5 +323,5 @@ void Fl_Gl_Window::draw_overlay() {} #endif // -// End of "$Id: Fl_Gl_Window.cxx,v 1.12.2.11 2000/04/25 22:16:24 mike Exp $". +// End of "$Id: Fl_Gl_Window.cxx,v 1.12.2.12 2000/06/03 08:37:01 bill Exp $". // diff --git a/src/Fl_Menu_Window.cxx b/src/Fl_Menu_Window.cxx index 75d4d4c58..e74763ba3 100644 --- a/src/Fl_Menu_Window.cxx +++ b/src/Fl_Menu_Window.cxx @@ -1,5 +1,5 @@ // -// "$Id: Fl_Menu_Window.cxx,v 1.8.2.1 2000/04/25 22:16:27 mike Exp $" +// "$Id: Fl_Menu_Window.cxx,v 1.8.2.2 2000/06/03 08:37:01 bill Exp $" // // Menu window code for the Fast Light Tool Kit (FLTK). // @@ -68,7 +68,7 @@ void Fl_Menu_Window::flush() { if (!gc) gc = XCreateGC(fl_display, i->xid, 0, 0); fl_gc = gc; fl_overlay = 1; - fl_clip_region(i->region); i->region = 0; + fl_clip_region(i->region); i->region = 0; current_ = this; draw(); fl_overlay = 0; #else @@ -97,5 +97,5 @@ Fl_Menu_Window::~Fl_Menu_Window() { } // -// End of "$Id: Fl_Menu_Window.cxx,v 1.8.2.1 2000/04/25 22:16:27 mike Exp $". +// End of "$Id: Fl_Menu_Window.cxx,v 1.8.2.2 2000/06/03 08:37:01 bill Exp $". // diff --git a/src/Fl_win32.cxx b/src/Fl_win32.cxx index 7436e388c..acae8ba9c 100644 --- a/src/Fl_win32.cxx +++ b/src/Fl_win32.cxx @@ -1,5 +1,5 @@ // -// "$Id: Fl_win32.cxx,v 1.33.2.24 2000/04/25 22:16:35 mike Exp $" +// "$Id: Fl_win32.cxx,v 1.33.2.25 2000/06/03 08:37:02 bill Exp $" // // WIN32-specific code for the Fast Light Tool Kit (FLTK). // @@ -240,7 +240,7 @@ double fl_wait(int timeout_flag, double time) { if (fl_msg.message == WM_FLSELECT) { // Got notification for socket for (int i = 0; i < nfds; i ++) - if (fd[i].fd == fl_msg.wParam) { + if (fd[i].fd == (int)fl_msg.wParam) { (fd[i].cb)(fd[i].fd, fd[i].arg); break; } @@ -433,7 +433,7 @@ static Fl_Window* resize_bug_fix; static LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { - static char buffer[2]; + Fl::e_keysym = 0; #if 0 // Not sure what this is, it may be left over from earlier attempts to @@ -537,26 +537,27 @@ static LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lPar case WM_DEADCHAR: case WM_SYSDEADCHAR: case WM_CHAR: - case WM_SYSCHAR: - {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; - if (GetKeyState(VK_CAPITAL)) state |= FL_CAPS_LOCK; - if (GetKeyState(VK_CONTROL)&~1) state |= FL_CTRL; - // Alt gets reported for the Alt-GR switch on foreign keyboards. - // so we need to check the event as well to get it right: - if ((lParam&(1<<29)) //same as GetKeyState(VK_MENU) + case WM_SYSCHAR: { + 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; + if (GetKeyState(VK_CAPITAL)) state |= FL_CAPS_LOCK; + if (GetKeyState(VK_CONTROL)&~1) state |= FL_CTRL; + // Alt gets reported for the Alt-GR switch on foreign keyboards. + // so we need to check the event as well to get it right: + if ((lParam&(1<<29)) //same as GetKeyState(VK_MENU) && uMsg != WM_CHAR) state |= FL_ALT; - if (GetKeyState(VK_NUMLOCK)) state |= FL_NUM_LOCK; - if (GetKeyState(VK_LWIN)&~1 || GetKeyState(VK_RWIN)&~1) { - // WIN32 bug? GetKeyState returns garbage if the user hit the - // meta key to pop up start menu. Sigh. - if ((GetAsyncKeyState(VK_LWIN)|GetAsyncKeyState(VK_RWIN))&~1) - state |= FL_META; - } - if (GetKeyState(VK_SCROLL)) state |= FL_SCROLL_LOCK; - Fl::e_state = state;} + if (GetKeyState(VK_NUMLOCK)) state |= FL_NUM_LOCK; + if (GetKeyState(VK_LWIN)&~1 || GetKeyState(VK_RWIN)&~1) { + // WIN32 bug? GetKeyState returns garbage if the user hit the + // meta key to pop up start menu. Sigh. + if ((GetAsyncKeyState(VK_LWIN)|GetAsyncKeyState(VK_RWIN))&~1) + state |= FL_META; + } + if (GetKeyState(VK_SCROLL)) state |= FL_SCROLL_LOCK; + Fl::e_state = state; if (lParam & (1<<31)) goto DEFAULT; // ignore up events after fixing shift + static char buffer[2]; if (uMsg == WM_CHAR || uMsg == WM_SYSCHAR) { buffer[0] = char(wParam); Fl::e_length = 1; @@ -571,7 +572,7 @@ static LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lPar // for (int i = lParam&0xff; i--;) while (window->parent()) window = window->window(); if (Fl::handle(FL_KEYBOARD,window)) return 0; - break; + break;} case WM_GETMINMAXINFO: Fl_X::i(window)->set_minmax((LPMINMAXINFO)lParam); @@ -966,5 +967,5 @@ void Fl_Window::make_current() { } // -// End of "$Id: Fl_win32.cxx,v 1.33.2.24 2000/04/25 22:16:35 mike Exp $". +// End of "$Id: Fl_win32.cxx,v 1.33.2.25 2000/06/03 08:37:02 bill Exp $". // diff --git a/src/Fl_x.cxx b/src/Fl_x.cxx index 3089df3b6..56aa6114d 100644 --- a/src/Fl_x.cxx +++ b/src/Fl_x.cxx @@ -1,5 +1,5 @@ // -// "$Id: Fl_x.cxx,v 1.24.2.15 2000/04/25 22:16:36 mike Exp $" +// "$Id: Fl_x.cxx,v 1.24.2.16 2000/06/03 08:37:06 bill Exp $" // // X specific code for the Fast Light Tool Kit (FLTK). // @@ -356,6 +356,7 @@ static Fl_Window* resize_bug_fix; int fl_handle(const XEvent& xevent) { + Fl::e_keysym = 0; fl_xevent = &xevent; Window xid = xevent.xany.window; @@ -889,5 +890,5 @@ void Fl_Window::make_current() { #endif // -// End of "$Id: Fl_x.cxx,v 1.24.2.15 2000/04/25 22:16:36 mike Exp $". +// End of "$Id: Fl_x.cxx,v 1.24.2.16 2000/06/03 08:37:06 bill Exp $". // diff --git a/src/fl_file_chooser.cxx b/src/fl_file_chooser.cxx index 0355a7d28..a18f5b8de 100644 --- a/src/fl_file_chooser.cxx +++ b/src/fl_file_chooser.cxx @@ -1,5 +1,5 @@ // -// "$Id: fl_file_chooser.cxx,v 1.10.2.3 2000/04/25 22:16:41 mike Exp $" +// "$Id: fl_file_chooser.cxx,v 1.10.2.4 2000/06/03 08:37:08 bill Exp $" // // File chooser widget for the Fast Light Tool Kit (FLTK). // @@ -147,6 +147,9 @@ void* FCB::item_prev(void* p) const { return ((dirent**)p)-1; } +#ifdef _MSC_VER +#pragma optimize("a",off) // without this it does not change *e +#endif static int ido_matching(const dirent* p, const char* e, const char* n) { // replace / or 1 at end with 0 and do match, then put back. yukko int save = *e; *(char*)e = 0; @@ -154,6 +157,9 @@ static int ido_matching(const dirent* p, const char* e, const char* n) { *(char*)e = save; return(r); } +#ifdef _MSC_VER +#pragma optimize("",on) +#endif int FCB::incr_height() const {return textsize()+2;} @@ -225,7 +231,11 @@ int FCB::get(char* buf) { for (dirent** r = q+1; n && r < last; r++) { if (!item_height(*r, 0)) continue; int i; - for (i=0; id_name[i]==(*r)->d_name[i]; i++); +#ifdef _WIN32 + for (i=0; id_name[i])==tolower((*r)->d_name[i]); i++) {} +#else + for (i=0; id_name[i]==(*r)->d_name[i]; i++) {} +#endif n = i; } } @@ -622,5 +632,5 @@ char* fl_file_chooser(const char* message, const char* pat, const char* fname) } // -// End of "$Id: fl_file_chooser.cxx,v 1.10.2.3 2000/04/25 22:16:41 mike Exp $". +// End of "$Id: fl_file_chooser.cxx,v 1.10.2.4 2000/06/03 08:37:08 bill Exp $". // diff --git a/src/fl_show_colormap.cxx b/src/fl_show_colormap.cxx index c446fa33d..a2b0f028c 100644 --- a/src/fl_show_colormap.cxx +++ b/src/fl_show_colormap.cxx @@ -1,5 +1,5 @@ // -// "$Id: fl_show_colormap.cxx,v 1.5.2.1 2000/04/25 22:16:45 mike Exp $" +// "$Id: fl_show_colormap.cxx,v 1.5.2.2 2000/06/03 08:37:09 bill Exp $" // // Colormap color selection dialog for the Fast Light Tool Kit (FLTK). // @@ -126,6 +126,9 @@ int ColorMenu::handle(int e) { extern char fl_override_redirect; // hack for menus +#ifdef _MSC_VER +#pragma optimize("a",off) // needed to get the done check to work +#endif Fl_Color ColorMenu::run() { if (which < 0 || which > 255) { position(Fl::event_x_root()-w()/2, Fl::event_y_root()-y()/2); @@ -147,5 +150,5 @@ Fl_Color fl_show_colormap(Fl_Color oldcol) { } // -// End of "$Id: fl_show_colormap.cxx,v 1.5.2.1 2000/04/25 22:16:45 mike Exp $". +// End of "$Id: fl_show_colormap.cxx,v 1.5.2.2 2000/06/03 08:37:09 bill Exp $". //