1998-10-20 00:46:58 +04:00
|
|
|
//
|
2005-02-25 00:55:12 +03:00
|
|
|
// "$Id$"
|
1998-10-20 00:46:58 +04:00
|
|
|
//
|
|
|
|
// Overlay window code for the Fast Light Tool Kit (FLTK).
|
|
|
|
//
|
2009-01-02 00:28:26 +03:00
|
|
|
// Copyright 1998-2009 by Bill Spitzak and others.
|
1998-10-20 00:46:58 +04:00
|
|
|
//
|
|
|
|
// 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.
|
|
|
|
//
|
2005-04-16 04:13:17 +04:00
|
|
|
// Please report all bugs and problems on the following page:
|
|
|
|
//
|
|
|
|
// http://www.fltk.org/str.php
|
1998-10-20 00:46:58 +04:00
|
|
|
//
|
1998-10-06 22:21:25 +04:00
|
|
|
|
2008-09-14 02:33:03 +04:00
|
|
|
/** \fn virtual void Fl_Overlay_Window::draw_overlay() = 0
|
|
|
|
You must subclass Fl_Overlay_Window and provide this method.
|
|
|
|
It is just like a draw() method, except it draws the overlay.
|
2008-09-17 19:44:43 +04:00
|
|
|
The overlay will have already been "cleared" when this is called. You
|
2008-09-14 02:33:03 +04:00
|
|
|
can use any of the routines described in <FL/fl_draw.H>.
|
|
|
|
*/
|
|
|
|
|
1998-10-06 22:21:25 +04:00
|
|
|
// A window using double-buffering and able to draw an overlay
|
|
|
|
// on top of that. Uses the hardware to draw the overlay if
|
|
|
|
// possible, otherwise it just draws in the front buffer.
|
|
|
|
|
|
|
|
#include <config.h>
|
|
|
|
#include <FL/Fl.H>
|
|
|
|
#include <FL/Fl_Overlay_Window.H>
|
|
|
|
#include <FL/fl_draw.H>
|
|
|
|
#include <FL/x.H>
|
|
|
|
|
|
|
|
void Fl_Overlay_Window::show() {
|
|
|
|
Fl_Double_Window::show();
|
|
|
|
if (overlay_ && overlay_ != this) overlay_->show();
|
|
|
|
}
|
|
|
|
|
|
|
|
void Fl_Overlay_Window::hide() {
|
|
|
|
Fl_Double_Window::hide();
|
|
|
|
}
|
|
|
|
|
|
|
|
void Fl_Overlay_Window::flush() {
|
2001-05-06 03:39:01 +04:00
|
|
|
#ifdef BOXX_BUGS
|
|
|
|
if (overlay_ && overlay_ != this && overlay_->shown()) {
|
|
|
|
// all drawing to windows hidden by overlay windows is ignored, fix this
|
|
|
|
XUnmapWindow(fl_display, fl_xid(overlay_));
|
|
|
|
Fl_Double_Window::flush(0);
|
|
|
|
XMapWindow(fl_display, fl_xid(overlay_));
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
#endif
|
1998-11-05 19:04:53 +03:00
|
|
|
int erase_overlay = (damage()&FL_DAMAGE_OVERLAY);
|
2002-11-19 19:37:36 +03:00
|
|
|
clear_damage((uchar)(damage()&~FL_DAMAGE_OVERLAY));
|
1998-11-05 19:04:53 +03:00
|
|
|
Fl_Double_Window::flush(erase_overlay);
|
1998-10-06 22:21:25 +04:00
|
|
|
if (overlay_ == this) draw_overlay();
|
|
|
|
}
|
|
|
|
|
|
|
|
void Fl_Overlay_Window::resize(int X, int Y, int W, int H) {
|
|
|
|
Fl_Double_Window::resize(X,Y,W,H);
|
|
|
|
if (overlay_ && overlay_!=this) overlay_->resize(0,0,w(),h());
|
|
|
|
}
|
|
|
|
|
2008-09-14 02:33:03 +04:00
|
|
|
/**
|
|
|
|
Destroys the window and all child widgets.
|
|
|
|
*/
|
1998-10-06 22:21:25 +04:00
|
|
|
Fl_Overlay_Window::~Fl_Overlay_Window() {
|
|
|
|
hide();
|
|
|
|
// delete overlay; this is done by ~Fl_Group
|
|
|
|
}
|
|
|
|
|
|
|
|
#if !HAVE_OVERLAY
|
|
|
|
|
|
|
|
int Fl_Overlay_Window::can_do_overlay() {return 0;}
|
|
|
|
|
2008-09-14 02:33:03 +04:00
|
|
|
/**
|
|
|
|
Call this to indicate that the overlay data has changed and needs to
|
|
|
|
be redrawn. The overlay will be clear until the first time this is
|
|
|
|
called, so if you want an initial display you must call this after
|
|
|
|
calling show().
|
|
|
|
*/
|
1998-11-05 19:04:53 +03:00
|
|
|
void Fl_Overlay_Window::redraw_overlay() {
|
|
|
|
overlay_ = this;
|
2002-11-19 19:37:36 +03:00
|
|
|
clear_damage((uchar)(damage()|FL_DAMAGE_OVERLAY));
|
1998-11-05 19:04:53 +03:00
|
|
|
Fl::damage(FL_DAMAGE_CHILD);
|
|
|
|
}
|
1998-10-06 22:21:25 +04:00
|
|
|
|
|
|
|
#else
|
|
|
|
|
|
|
|
extern XVisualInfo *fl_find_overlay_visual();
|
|
|
|
extern XVisualInfo *fl_overlay_visual;
|
|
|
|
extern Colormap fl_overlay_colormap;
|
|
|
|
extern unsigned long fl_transparent_pixel;
|
|
|
|
static GC gc; // the GC used by all X windows
|
|
|
|
extern uchar fl_overlay; // changes how fl_color(x) works
|
|
|
|
|
|
|
|
class _Fl_Overlay : public Fl_Window {
|
|
|
|
friend class Fl_Overlay_Window;
|
|
|
|
void flush();
|
|
|
|
void show();
|
|
|
|
public:
|
|
|
|
_Fl_Overlay(int x, int y, int w, int h) :
|
1999-10-23 09:59:27 +04:00
|
|
|
Fl_Window(x,y,w,h) {set_flag(INACTIVE);}
|
1998-10-06 22:21:25 +04:00
|
|
|
};
|
|
|
|
|
|
|
|
int Fl_Overlay_Window::can_do_overlay() {
|
|
|
|
return fl_find_overlay_visual() != 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
void _Fl_Overlay::show() {
|
|
|
|
if (shown()) {Fl_Window::show(); return;}
|
|
|
|
fl_background_pixel = int(fl_transparent_pixel);
|
|
|
|
Fl_X::make_xid(this, fl_overlay_visual, fl_overlay_colormap);
|
|
|
|
fl_background_pixel = -1;
|
|
|
|
// find the outermost window to tell wm about the colormap:
|
|
|
|
Fl_Window *w = window();
|
|
|
|
for (;;) {Fl_Window *w1 = w->window(); if (!w1) break; w = w1;}
|
|
|
|
XSetWMColormapWindows(fl_display, fl_xid(w), &(Fl_X::i(this)->xid), 1);
|
|
|
|
}
|
|
|
|
|
|
|
|
void _Fl_Overlay::flush() {
|
|
|
|
fl_window = fl_xid(this);
|
2008-09-25 22:26:33 +04:00
|
|
|
if (!gc) {
|
|
|
|
gc = XCreateGC(fl_display, fl_xid(this), 0, 0);
|
|
|
|
}
|
1998-10-06 22:21:25 +04:00
|
|
|
fl_gc = gc;
|
Cairo increment 2: Finer cairo granularity, less deps, new fltk_cairo lib
+ added new USE_CAIRO config preprocessor def.
to differentiate from HAVE_CAIRO so that we can use the cairo lib
without forcing the full fltk lib to be linked against it.
In that case, cairo autolink context functionality which needs fltk lib
instrumentation is disabled.
+ added new --enable-cairoext, which correspond to previous --enable-cairo.
now, --enable-cairo only adds HAVE_CAIRO def. and keeps fltk lib
from referencing cairo.
In both cases (--enable-cairo & --enable-cairoext), a new fltk_cairo lib is
created. This lib, similarly to local versions of png,jpeg and zlib,
is not generated if cairo is not enabled.
+ added cairo to fltk-config : now new --use-cairo flag is available
+ modified all unix like makefiles to now generate minimum cairo deps and also
new libfltk_cairo lib.
+ added new cairo subdir to permit conditional fltk_cairo lib generation.
+ vc2005 project minimum update to compile without be broken, but still needs
to create a similar fltk_cairo independent lib. For now, it works as before
with a dedicated cairo env. similar to --enable-cairoext context in unix.
+ regression tested ok with cairo disabled on win32, mac osx, mingw.
git-svn-id: file:///fltk/svn/fltk/branches/branch-1.3@6462 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
2008-10-19 05:42:35 +04:00
|
|
|
#if defined(USE_CAIRO)
|
2008-09-25 22:26:33 +04:00
|
|
|
if (Fl::cairo_autolink_context()) Fl::cairo_make_current(this); // capture gc changes automatically to update the cairo context adequately
|
|
|
|
#endif
|
1998-10-06 22:21:25 +04:00
|
|
|
fl_overlay = 1;
|
|
|
|
Fl_Overlay_Window *w = (Fl_Overlay_Window *)parent();
|
2000-11-20 22:02:20 +03:00
|
|
|
Fl_X *myi = Fl_X::i(this);
|
1998-10-19 21:53:09 +04:00
|
|
|
if (damage() != FL_DAMAGE_EXPOSE) XClearWindow(fl_display, fl_xid(this));
|
2000-11-20 22:02:20 +03:00
|
|
|
fl_clip_region(myi->region); myi->region = 0;
|
1998-10-06 22:21:25 +04:00
|
|
|
w->draw_overlay();
|
|
|
|
fl_overlay = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
void Fl_Overlay_Window::redraw_overlay() {
|
|
|
|
if (!fl_display) return; // this prevents fluid -c from opening display
|
|
|
|
if (!overlay_) {
|
|
|
|
if (can_do_overlay()) {
|
|
|
|
Fl_Group::current(this);
|
|
|
|
overlay_ = new _Fl_Overlay(0,0,w(),h());
|
|
|
|
Fl_Group::current(0);
|
|
|
|
} else {
|
|
|
|
overlay_ = this; // fake the overlay
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (shown()) {
|
1998-11-05 19:04:53 +03:00
|
|
|
if (overlay_ == this) {
|
|
|
|
clear_damage(damage()|FL_DAMAGE_OVERLAY);
|
|
|
|
Fl::damage(FL_DAMAGE_CHILD);
|
|
|
|
} else if (!overlay_->shown())
|
1998-10-06 22:21:25 +04:00
|
|
|
overlay_->show();
|
|
|
|
else
|
|
|
|
overlay_->redraw();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
1998-10-20 00:46:58 +04:00
|
|
|
//
|
2005-02-25 00:55:12 +03:00
|
|
|
// End of "$Id$".
|
1998-10-20 00:46:58 +04:00
|
|
|
//
|