summaryrefslogtreecommitdiff
path: root/src/Fl_grab.cxx
diff options
context:
space:
mode:
authorBill Spitzak <spitzak@gmail.com>1999-02-03 08:43:35 +0000
committerBill Spitzak <spitzak@gmail.com>1999-02-03 08:43:35 +0000
commit8009fef12cb88c5d4944bdad9a1e641c282df303 (patch)
tree9c3cacadf5121dba5ee5ab42327ba6a9ab79402a /src/Fl_grab.cxx
parent0434a826d57f5de3ef258532cc090717db574d4e (diff)
Put Fl::grab() into it's own source file. Rewritten as suggested so that
it takes a window pointer, and grab(0) releases. You can now call grab repeatedly with the same or different values without it failing. The old Fl::grab() and Fl::release() are emulated in inline functions in Fl.H Added Fl_Menu_::copy(Fl_Menu_Item*), which will be useful for fluid, although that use is nyi. Fixes and cleanup to the code for Fl_Menu_::add(...). git-svn-id: file:///fltk/svn/fltk/trunk@268 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
Diffstat (limited to 'src/Fl_grab.cxx')
-rw-r--r--src/Fl_grab.cxx93
1 files changed, 93 insertions, 0 deletions
diff --git a/src/Fl_grab.cxx b/src/Fl_grab.cxx
new file mode 100644
index 000000000..8626a7cf6
--- /dev/null
+++ b/src/Fl_grab.cxx
@@ -0,0 +1,93 @@
+//
+// "$Id: Fl_grab.cxx,v 1.1 1999/02/03 08:43:33 bill Exp $"
+//
+// Grab/release code for the Fast Light Tool Kit (FLTK).
+//
+// Copyright 1998-1999 by Bill Spitzak and others.
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Library General Public
+// License as published by the Free Software Foundation; either
+// version 2 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Library General Public License for more details.
+//
+// You should have received a copy of the GNU Library General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+// USA.
+//
+// Please report all bugs and problems to "fltk-bugs@easysw.com".
+//
+
+#include <config.h>
+#include <FL/Fl.H>
+#include <FL/x.H>
+
+////////////////////////////////////////////////////////////////
+// "Grab" is done while menu systems are up. This has several effects:
+// Events are all sent to the "grab window", which does not even
+// have to be displayed (and in the case of Fl_Menu.C it isn't).
+// The system is also told to "grab" events and send them to this app.
+// This also modifies how Fl_Window::show() works, on X it turns on
+// override_redirect, it does similar things on WIN32.
+
+extern void fl_send_extra_move(); // in Fl.cxx
+
+#ifdef WIN32
+// We have to keep track of whether we have captured the mouse, since
+// MSWindows shows little respect for this... Grep for fl_capture to
+// see where and how this is used.
+extern HWND fl_capture;
+#endif
+
+void Fl::grab(Fl_Window* w) {
+ if (w) {
+ if (!grab_) {
+#ifdef WIN32
+ SetActiveWindow(fl_capture = fl_xid(first_window()));
+ SetCapture(fl_capture);
+#else
+ XGrabPointer(fl_display,
+ fl_xid(first_window()),
+ 1,
+ ButtonPressMask|ButtonReleaseMask|
+ ButtonMotionMask|PointerMotionMask,
+ GrabModeAsync,
+ GrabModeAsync,
+ None,
+ 0,
+ fl_event_time);
+ XGrabKeyboard(fl_display,
+ fl_xid(first_window()),
+ 1,
+ GrabModeAsync,
+ GrabModeAsync,
+ fl_event_time);
+#endif
+ }
+ grab_ = w;
+ } else {
+ if (grab_) {
+#ifdef WIN32
+ fl_capture = 0;
+ ReleaseCapture();
+#else
+ XUngrabKeyboard(fl_display, fl_event_time);
+ XUngrabPointer(fl_display, fl_event_time);
+ // this flush is done in case the picked menu item goes into
+ // an infinite loop, so we don't leave the X server locked up:
+ XFlush(fl_display);
+#endif
+ grab_ = 0;
+ fl_send_extra_move();
+ }
+ }
+}
+
+//
+// End of "$Id: Fl_grab.cxx,v 1.1 1999/02/03 08:43:33 bill Exp $".
+//