From 399501783ccd867559c954d91a00f7d5d7ec4cb8 Mon Sep 17 00:00:00 2001 From: Matthias Melcher Date: Fri, 19 Feb 2016 22:37:41 +0000 Subject: [PATCH] Add example code to Fl_Window_Driver. Some refactoring of a take_focus() function into driver structures (not too happy with it, because it has some kind of bug fix. However, shouldn't *all* Fl_Windows always have an FL_Window_Driver?) git-svn-id: file:///fltk/svn/fltk/branches/branch-1.3-porting@11196 ea41ed52-d2ee-0310-a9c1-e6b18d33e121 --- FL/Fl_Window.H | 2 ++ FL/Fl_Window_Driver.H | 2 ++ src/Fl.cxx | 26 +++++++------------- src/drivers/Cocoa/Fl_Cocoa_Window_Driver.cxx | 8 ++++++ src/drivers/Cocoa/Fl_Cocoa_Window_Driver.h | 1 + src/drivers/X11/Fl_X11_Window_Driver.cxx | 10 ++++++++ src/drivers/X11/Fl_X11_Window_Driver.h | 1 + 7 files changed, 33 insertions(+), 17 deletions(-) diff --git a/FL/Fl_Window.H b/FL/Fl_Window.H index 9881d476c..d6ffa6853 100644 --- a/FL/Fl_Window.H +++ b/FL/Fl_Window.H @@ -636,6 +636,8 @@ public: */ int decorated_h(); + Fl_Window_Driver *driver() { return i; } + }; #endif diff --git a/FL/Fl_Window_Driver.H b/FL/Fl_Window_Driver.H index f42360724..dea792669 100644 --- a/FL/Fl_Window_Driver.H +++ b/FL/Fl_Window_Driver.H @@ -38,6 +38,8 @@ public: Fl_Window_Driver(Fl_Window *); virtual ~Fl_Window_Driver(); static Fl_Window_Driver *newWindowDriver(Fl_Window *); + + virtual void take_focus() { } }; diff --git a/src/Fl.cxx b/src/Fl.cxx index a837eb6a3..c0120b13d 100644 --- a/src/Fl.cxx +++ b/src/Fl.cxx @@ -1001,24 +1001,16 @@ void Fl::focus(Fl_Widget *o) { if (!w1) w1 = o->window(); while (w1) { win=w1; w1=win->window(); } if (win) { -#ifdef __APPLE__ // PORTME: Fl_Window_Driver - platform window focus - if (fl_xfocus != win) { - Fl_X *x = Fl_X::i(win); - if (x) x->set_key_window(); - } -#elif defined(USE_X11) - if (fl_xfocus != win) { - Fl_X *x = Fl_X::i(win); - if (!Fl_X::ewmh_supported()) - win->show(); // Old WMs, XMapRaised - else if (x) // New WMs use the NETWM attribute: - Fl_X::activate_window(x->xid); - } -#elif defined(WIN32) -#elif defined(FL_PORTING) -# pragma message "FL_PORTING: handle platform specifics for change of keyboard focus here" + if (fl_xfocus != win) { + Fl_Window_Driver *drvr = win->driver(); +#ifdef USE_X11 // platform fix + if (!Fl_X::ewmh_supported()) win->show(); // Old WMs, XMapRaised + else if (drvr) drvr->take_focus(); +#else + if (drvr) drvr->take_focus(); #endif - fl_xfocus = win; + fl_xfocus = win; + } } } // take focus from the old focused window diff --git a/src/drivers/Cocoa/Fl_Cocoa_Window_Driver.cxx b/src/drivers/Cocoa/Fl_Cocoa_Window_Driver.cxx index 06ab4f79d..4a665a871 100644 --- a/src/drivers/Cocoa/Fl_Cocoa_Window_Driver.cxx +++ b/src/drivers/Cocoa/Fl_Cocoa_Window_Driver.cxx @@ -33,6 +33,14 @@ Fl_Cocoa_Window_Driver::Fl_Cocoa_Window_Driver(Fl_Window *win) } +extern Fl_Window *fl_xfocus; + + +void Fl_Cocoa_Window_Driver::take_focus() +{ + set_key_window(); +} + // // End of "$Id$". diff --git a/src/drivers/Cocoa/Fl_Cocoa_Window_Driver.h b/src/drivers/Cocoa/Fl_Cocoa_Window_Driver.h index b507e2ec4..b0c756aa1 100644 --- a/src/drivers/Cocoa/Fl_Cocoa_Window_Driver.h +++ b/src/drivers/Cocoa/Fl_Cocoa_Window_Driver.h @@ -46,6 +46,7 @@ class FL_EXPORT Fl_Cocoa_Window_Driver : public Fl_Window_Driver { public: Fl_Cocoa_Window_Driver(Fl_Window*); + virtual void take_focus(); }; diff --git a/src/drivers/X11/Fl_X11_Window_Driver.cxx b/src/drivers/X11/Fl_X11_Window_Driver.cxx index ccdcfcb5f..f6e748ca8 100644 --- a/src/drivers/X11/Fl_X11_Window_Driver.cxx +++ b/src/drivers/X11/Fl_X11_Window_Driver.cxx @@ -33,6 +33,16 @@ Fl_X11_Window_Driver::Fl_X11_Window_Driver(Fl_Window *win) } +void Fl_X11_Window_Driver::take_focus() +{ + if (!Fl_X::ewmh_supported()) + win->show(); // Old WMs, XMapRaised + else if (x) // New WMs use the NETWM attribute: + Fl_X::activate_window(x->xid); + } +} + + // // End of "$Id$". // diff --git a/src/drivers/X11/Fl_X11_Window_Driver.h b/src/drivers/X11/Fl_X11_Window_Driver.h index b391ab5a1..d6500c5a4 100644 --- a/src/drivers/X11/Fl_X11_Window_Driver.h +++ b/src/drivers/X11/Fl_X11_Window_Driver.h @@ -46,6 +46,7 @@ class FL_EXPORT Fl_X11_Window_Driver : public Fl_Window_Driver { public: Fl_X11_Window_Driver(Fl_Window*); + virtual void take_focus(); };