Fix cross-window focus throwing on X11, similar to the Mac case. STR #3129

git-svn-id: file:///fltk/svn/fltk/branches/branch-1.3@10276 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
This commit is contained in:
Lauri Kasanen 2014-09-05 12:33:35 +00:00
parent d1d203ca57
commit 005bfa4294
3 changed files with 26 additions and 2 deletions

1
FL/x.H
View File

@ -160,6 +160,7 @@ public:
static void x(Fl_Window* wi, int X) {wi->x(X);} static void x(Fl_Window* wi, int X) {wi->x(X);}
static void y(Fl_Window* wi, int Y) {wi->y(Y);} static void y(Fl_Window* wi, int Y) {wi->y(Y);}
static int ewmh_supported(); static int ewmh_supported();
static void activate_window(Window w);
}; };
extern FL_EXPORT char fl_override_redirect; // hack into Fl_X::make_xid() extern FL_EXPORT char fl_override_redirect; // hack into Fl_X::make_xid()

View File

@ -922,10 +922,17 @@ void Fl::focus(Fl_Widget *o) {
if (fl_xfocus != win) { if (fl_xfocus != win) {
Fl_X *x = Fl_X::i(win); Fl_X *x = Fl_X::i(win);
if (x) x->set_key_window(); if (x) x->set_key_window();
} }
#elif defined(USE_X11)
if (fl_xfocus != win) {
Fl_X *x = Fl_X::i(win);
win->show(); // Old WMs, XMapRaised
// New WMs use the NETWM attribute:
if (x) Fl_X::activate_window(x->xid);
}
#endif #endif
fl_xfocus = win; fl_xfocus = win;
} }
} }
// take focus from the old focused window // take focus from the old focused window
fl_oldfocus = 0; fl_oldfocus = 0;

View File

@ -356,6 +356,7 @@ static Atom fl_NET_WM_STATE_FULLSCREEN;
static Atom fl_NET_WM_FULLSCREEN_MONITORS; static Atom fl_NET_WM_FULLSCREEN_MONITORS;
static Atom fl_NET_WORKAREA; static Atom fl_NET_WORKAREA;
static Atom fl_NET_WM_ICON; static Atom fl_NET_WM_ICON;
static Atom fl_NET_ACTIVE_WINDOW;
/* /*
X defines 32-bit-entities to have a format value of max. 32, X defines 32-bit-entities to have a format value of max. 32,
@ -667,6 +668,7 @@ void fl_open_display(Display* d) {
fl_NET_WM_FULLSCREEN_MONITORS = XInternAtom(d, "_NET_WM_FULLSCREEN_MONITORS", 0); fl_NET_WM_FULLSCREEN_MONITORS = XInternAtom(d, "_NET_WM_FULLSCREEN_MONITORS", 0);
fl_NET_WORKAREA = XInternAtom(d, "_NET_WORKAREA", 0); fl_NET_WORKAREA = XInternAtom(d, "_NET_WORKAREA", 0);
fl_NET_WM_ICON = XInternAtom(d, "_NET_WM_ICON", 0); fl_NET_WM_ICON = XInternAtom(d, "_NET_WM_ICON", 0);
fl_NET_ACTIVE_WINDOW = XInternAtom(d, "_NET_ACTIVE_WINDOW", 0);
if (sizeof(Atom) < 4) if (sizeof(Atom) < 4)
atom_bits = sizeof(Atom) * 8; atom_bits = sizeof(Atom) * 8;
@ -2205,6 +2207,20 @@ int Fl_X::ewmh_supported() {
return result; return result;
} }
extern Fl_Window *fl_xfocus;
void Fl_X::activate_window(Window w) {
if (!ewmh_supported())
return;
Fl_X *x = Fl_X::i(fl_xfocus);
if (!x)
return;
send_wm_event(w, fl_NET_ACTIVE_WINDOW, 1 /* application */,
0 /* timestamp */, x->xid /* previously active window */);
}
/* Change an existing window to fullscreen */ /* Change an existing window to fullscreen */
void Fl_Window::fullscreen_x() { void Fl_Window::fullscreen_x() {
if (Fl_X::ewmh_supported()) { if (Fl_X::ewmh_supported()) {