summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Melcher <fltk@matthiasm.com>2016-02-19 22:37:41 +0000
committerMatthias Melcher <fltk@matthiasm.com>2016-02-19 22:37:41 +0000
commit399501783ccd867559c954d91a00f7d5d7ec4cb8 (patch)
tree8363659b24ecfa9bcdd9f402379896d894644888
parent052401a34e8347c87a418270986432032ac693e2 (diff)
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
-rw-r--r--FL/Fl_Window.H2
-rw-r--r--FL/Fl_Window_Driver.H2
-rw-r--r--src/Fl.cxx26
-rw-r--r--src/drivers/Cocoa/Fl_Cocoa_Window_Driver.cxx8
-rw-r--r--src/drivers/Cocoa/Fl_Cocoa_Window_Driver.h1
-rw-r--r--src/drivers/X11/Fl_X11_Window_Driver.cxx10
-rw-r--r--src/drivers/X11/Fl_X11_Window_Driver.h1
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();
};