X11: Disable "boxcheat" hack

For details see comment in src/Fl_x.cxx: this "Hack to speed up
bg box drawing" is now disabled for several reasons. The code
is still available if the macro ENABLE_BOXCHEAT is defined.
This commit is contained in:
Albrecht Schlosser 2022-02-22 19:55:11 +01:00
parent 406f2c33f4
commit cdd1933661
3 changed files with 35 additions and 8 deletions

View File

@ -85,7 +85,6 @@ private:
extern FL_EXPORT Fl_XFont_On_Demand fl_xfont;
extern FL_EXPORT char fl_override_redirect; // hack into Fl_X::make_xid()
extern FL_EXPORT int fl_background_pixel; // hack into Fl_X::make_xid()
#endif // FL_LIBRARY || FL_INTERNALS

View File

@ -1,7 +1,7 @@
//
// Optional argument initialization code for the Fast Light Tool Kit (FLTK).
//
// Copyright 1998-2018 by Bill Spitzak and others.
// Copyright 1998-2022 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@ -277,6 +277,7 @@ void Fl_Window::show(int argc, char **argv) {
pWindowDriver->show_with_args_begin();
// note: background_pixel is no longer used since 1.4.0, but anyway ...
// set colors first, so background_pixel is correct:
static char beenhere;
if (!beenhere) {

View File

@ -82,6 +82,32 @@ extern Fl_Widget *fl_selection_requestor;
static void open_display_i(Display *d); // open display (internal)
////////////////////////////////////////////////////////////////
// Hack to speed up bg box drawing - aka "boxcheat":
// If the boxtype of a window is a filled rectangle, we can make the
// redisplay *look* faster by using X's background pixel erasing.
// This is done by setting a flag when the window is shown for the first time.
// Note to FLTK devs:
// This can cause unexpected behavior, for instance if the box() or
// color() of a window is changed after show(), and it does presumably not
// have much effect on current systems (compared to 1998).
// It is also fragile WRT checking the box type if any other scheme than
// the default scheme is loaded.
// Hence this is disabled since FLTK 1.4.0 (AlbrechtS Feb 02, 2022)
// Note to FLTK users:
// You may define ENABLE_BOXCHEAT to use it anyway but please tell the
// FLTK devs why you believe that you need it. Should we re-enable it?
#ifdef ENABLE_BOXCHEAT
static int fl_background_pixel = -1;
static inline int can_boxcheat(Fl_Boxtype b) {
return (b == 1 || ((b & 2) && b <= 15));
}
#endif // (ENABLE_BOXCHEAT)
////////////////////////////////////////////////////////////////
// interface to poll/select call:
@ -2506,7 +2532,6 @@ Fl_X* Fl_X::set_xid(Fl_Window* win, Window winxid) {
// normally. The global variables like fl_show_iconic are so that
// subclasses of *that* class may change the behavior...
int fl_background_pixel = -1; // hack to speed up bg box drawing
int fl_disable_transient_for; // secret method of removing TRANSIENT_FOR
static const int childEventMask = ExposureMask;
@ -2623,11 +2648,14 @@ void Fl_X::make_xid(Fl_Window* win, XVisualInfo *visual, Colormap colormap)
H = sy + sh - Y;
}
#ifdef ENABLE_BOXCHEAT
if (fl_background_pixel >= 0) {
attr.background_pixel = fl_background_pixel;
fl_background_pixel = -1;
mask |= CWBackPixel;
}
#endif // (ENABLE_BOXCHEAT)
float s = 1;
#if USE_XFT
//compute adequate screen where to put the window
@ -3198,18 +3226,17 @@ void Fl_X11_Window_Driver::label(const char *name, const char *iname) {
////////////////////////////////////////////////////////////////
// Implement the virtual functions for the base Fl_Window class:
// If the box is a filled rectangle, we can make the redisplay
// *look* faster by using X's background pixel erasing.
static inline int can_boxcheat(uchar b) {return (b==1 || ((b&2) && b<=15));}
void Fl_X11_Window_Driver::show() {
if (!shown()) {
fl_open_display();
#ifdef ENABLE_BOXCHEAT
// Don't set background pixel for double-buffered windows...
if (pWindow->type() != FL_DOUBLE_WINDOW && can_boxcheat(pWindow->box())) {
fl_background_pixel = int(fl_xpixel(pWindow->color()));
}
#endif // (ENABLE_BOXCHEAT)
makeWindow();
} else {
XMapRaised(fl_display, fl_xid(pWindow));