From 5a6a7eb009cde5c0613418a11b0fb637f0cd9468 Mon Sep 17 00:00:00 2001 From: Albrecht Schlosser Date: Mon, 1 Dec 2025 18:36:04 +0100 Subject: Add background (`bg`) attribute to table of boxtypes This is a first step to fix some background (re-)drawing issues in widgets. A new bit in the array of boxtypes can be used to determine if a particular boxtype uses a solid background (e.g. all FL_*_BOX types) or if the parent widget is responsible for drawing it (FL_NO_BOX and all FL_*_FRAME) types, and maybe more ... The old struct member `set` in the struct of boxtypes has been renamed to `flags` and is now used as a bit field. Except these changes, this first commit fixes the focus box drawing of specific boxtypes, as seen in unittest_schemes.cxx in the Fl_Check_Button with label "Check", and very likely more. --- src/Fl_Button.cxx | 40 +++++++++++++++++++++++----------------- 1 file changed, 23 insertions(+), 17 deletions(-) (limited to 'src/Fl_Button.cxx') diff --git a/src/Fl_Button.cxx b/src/Fl_Button.cxx index e586e5ffa..3df97875b 100644 --- a/src/Fl_Button.cxx +++ b/src/Fl_Button.cxx @@ -1,7 +1,7 @@ // // Button widget for the Fast Light Tool Kit (FLTK). // -// Copyright 1998-2014 by Bill Spitzak and others. +// Copyright 1998-2025 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 @@ -150,28 +150,34 @@ int Fl_Button::handle(int event) { if (when() & FL_WHEN_RELEASE) do_callback(FL_REASON_RELEASED); return 1; case FL_SHORTCUT: - if (!(shortcut() ? - Fl::test_shortcut(shortcut()) : test_shortcut())) return 0; - if (Fl::visible_focus() && handle(FL_FOCUS)) Fl::focus(this); + if (!(shortcut() ? Fl::test_shortcut(shortcut()) : test_shortcut())) + return 0; + if (Fl::visible_focus() && handle(FL_FOCUS)) + Fl::focus(this); goto triggered_by_keyboard; - case FL_FOCUS : - case FL_UNFOCUS : + case FL_FOCUS: + case FL_UNFOCUS: if (Fl::visible_focus()) { - if (box() == FL_NO_BOX) { - // Widgets with the FL_NO_BOX boxtype need a parent to - // redraw, since it is responsible for redrawing the - // background... - int X = x() > 0 ? x() - 1 : 0; - int Y = y() > 0 ? y() - 1 : 0; - if (window()) window()->damage(FL_DAMAGE_ALL, X, Y, w() + 2, h() + 2); + if (!Fl::box_bg(box())) { + // Widgets with boxtypes that don't draw the background need a parent + // to redraw, since it is responsible for drawing the background... + if (window()) { + int X = x() > 0 ? x() - 1 : 0; + int Y = y() > 0 ? y() - 1 : 0; + window()->damage(FL_DAMAGE_ALL, X, Y, w() + 2, h() + 2); + } } else { - if (box() && (fl_box(box())==box())) redraw(); - else redraw_label(); + if (box() && (fl_box(box()) == box())) // ? FIXME ? + redraw(); + else + redraw_label(); } return 1; - } else return 0; + } else { + return 0; + } /* NOTREACHED */ - case FL_KEYBOARD : + case FL_KEYBOARD: if (Fl::focus() == this && Fl::event_key() == ' ' && !(Fl::event_state() & (FL_SHIFT | FL_CTRL | FL_ALT | FL_META))) { triggered_by_keyboard: // from FL_SHORTCUT -- cgit v1.2.3