FLTK logo

[master] 281ec24 - Box types can now defined and draw their own focus frame, STR 2145, #659

FLTK matrix user chat room
(using Element browser app)   FLTK gitter user chat room   GitHub FLTK Project   FLTK News RSS Feed  
  FLTK Apps      FLTK Library      Forums      Links     Login 
 All Forums  |  Back to fltk.commit  ]
 
Previous Message ]Next Message ]

[master] 281ec24 - Box types can now defined and draw their own focus frame, STR 2145, #659 "Matthias Melcher" 03:47 Apr 26  
 
commit 281ec24c8f4b7daf7cc4e7c30b640cbe0b33d037
Author:     Matthias Melcher <github@matthiasm.com>
AuthorDate: Fri Apr 26 12:42:11 2024 +0200
Commit:     Matthias Melcher <github@matthiasm.com>
CommitDate: Fri Apr 26 12:42:11 2024 +0200

    Box types can now defined and draw their own focus frame, STR 2145, #659

 FL/Enumerations.H            |  3 +-
 FL/Fl.H                      |  7 +++-
 FL/fl_draw.H                 |  1 +
 src/Fl_Tree_Item.cxx         | 23 +------------
 src/Fl_Widget.cxx            | 20 +-----------
 src/Fl_get_system_colors.cxx |  5 +--
 src/fl_boxtype.cxx           | 78 ++++++++++++++++++++++++++++++++++++--------
 src/fl_diamond_box.cxx       | 22 +++++++++++--
 src/fl_gleam.cxx             |  2 +-
 src/fl_gtk.cxx               |  8 +++--
 src/fl_oval_box.cxx          | 23 ++++++++++---
 src/fl_oxy.cxx               |  7 ++--
 src/fl_plastic.cxx           |  8 ++---
 src/fl_round_box.cxx         | 17 ++++++++--
 src/fl_rounded_box.cxx       | 23 ++++++++++---
 src/fl_shadow_box.cxx        |  2 +-
 16 files changed, 163 insertions(+), 86 deletions(-)

diff --git FL/Enumerations.H FL/Enumerations.H
index 6da9985..3d5bc7f 100644
--- FL/Enumerations.H
+++ FL/Enumerations.H
@@ -694,7 +694,8 @@ enum Fl_Boxtype { // boxtypes (if you change these you must also change fl_boxty
   _FL_OXY_ROUND_DOWN_BOX,       ///< oxy version of FL_ROUND_DOWN_BOX, use FL_OXY_ROUND_DOWN_BOX
   _FL_OXY_BUTTON_UP_BOX,        ///< FL_OXY_BUTTON_UP_BOX (new boxtype ?), use FL_OXY_BUTTON_UP_BOX
   _FL_OXY_BUTTON_DOWN_BOX,      ///< FL_OXY_BUTTON_DOWN_BOX (new boxtype ?), use FL_OXY_BUTTON_DOWN_BOX
-  FL_FREE_BOXTYPE               ///< the first free box type for creation of new box types
+  FL_FREE_BOXTYPE,              ///< the first free box type for creation of new box types
+  FL_MAX_BOXTYPE = 255          ///< highest legal index for a box type
 };
 
 #ifndef FL_DOXYGEN
diff --git FL/Fl.H FL/Fl.H
index e35ebe2..fef27fa 100644
--- FL/Fl.H
+++ FL/Fl.H
@@ -88,6 +88,9 @@ typedef void (Fl_Label_Measure_F)(const Fl_Label *label, int &width, int &height
 /** Signature of some box drawing functions passed as parameters */
 typedef void (Fl_Box_Draw_F)(int x, int y, int w, int h, Fl_Color color);
 
+/** Signature of box focus frame drawing functions */
+typedef void (Fl_Box_Draw_Focus_F)(Fl_Boxtype bt, int x, int y, int w, int h, Fl_Color fg, Fl_Color bg);
+
 /** Signature of timeout callback functions passed as parameters.
   Please see Fl::add_timeout() for details.
 */
@@ -1215,7 +1218,9 @@ public:
 
   // boxtypes:
   static Fl_Box_Draw_F *get_boxtype(Fl_Boxtype);
-  static void set_boxtype(Fl_Boxtype, Fl_Box_Draw_F*,uchar,uchar,uchar,uchar);
+  static void set_boxtype(Fl_Boxtype, Fl_Box_Draw_F*,
+                          uchar, uchar, uchar, uchar, 
+                          Fl_Box_Draw_Focus_F* =NULL);
   static void set_boxtype(Fl_Boxtype, Fl_Boxtype from);
   static int box_dx(Fl_Boxtype);
   static int box_dy(Fl_Boxtype);
diff --git FL/fl_draw.H FL/fl_draw.H
index 7cf3f68..14137c5 100644
--- FL/fl_draw.H
+++ FL/fl_draw.H
@@ -976,6 +976,7 @@ FL_EXPORT void fl_draw(const char *str, int x, int y, int w, int h, Fl_Align ali
 FL_EXPORT void fl_frame(const char *s, int x, int y, int w, int h);
 FL_EXPORT void fl_frame2(const char *s, int x, int y, int w, int h);
 FL_EXPORT void fl_draw_box(Fl_Boxtype, int x, int y, int w, int h, Fl_Color);
+FL_EXPORT void fl_draw_box_focus(Fl_Boxtype, int x, int y, int w, int h, Fl_Color, Fl_Color);
 
 // basic GUI objects (check marks, arrows, more to come ...):
 
diff --git src/Fl_Tree_Item.cxx src/Fl_Tree_Item.cxx
index c7b9d81..544170a 100644
--- src/Fl_Tree_Item.cxx
+++ src/Fl_Tree_Item.cxx
@@ -800,27 +800,6 @@ Fl_Tree_Item *Fl_Tree_Item::find_clicked(const Fl_Tree_Prefs &prefs, int yonly)
          static_cast<const Fl_Tree_Item &>(*this).find_clicked(prefs, yonly)));
 }
 
-static void draw_item_focus(Fl_Boxtype B, Fl_Color fg, Fl_Color bg, int X, int Y, int W, int H) {
-  // Pasted from Fl_Widget::draw_focus(); we don't have access to this method
-  if (!Fl::visible_focus()) return;
-  switch (B) {
-    case FL_DOWN_BOX:
-    case FL_DOWN_FRAME:
-    case FL_THIN_DOWN_BOX:
-    case FL_THIN_DOWN_FRAME:
-      X ++;
-      Y ++;
-    default:
-      break;
-  }
-  X += Fl::box_dx(B);
-  Y += Fl::box_dy(B);
-  W -= Fl::box_dw(B)+1;
-  H -= Fl::box_dh(B)+1;
-  fl_color(fl_contrast(fg, bg));
-  fl_focus_rect(X, Y, W, H);
-}
-
 /// Return the item's 'visible' height. Takes into account the item's:
 ///    - visibility (if !is_visible(), returns 0)
 ///    - labelfont() height: if label() != NULL
@@ -1137,7 +1116,7 @@ void Fl_Tree_Item::draw(int X, int &Y, int W, Fl_Tree_Item *itemfocus,
            Fl::visible_focus() &&
            Fl::focus() == tree() &&
            prefs.selectmode() != FL_TREE_SELECT_NONE ) {
-        draw_item_focus(FL_NO_BOX,fg,bg,label_x()+1,label_y()+1,label_w()-1,label_h()-1);
+        fl_draw_box_focus(FL_NO_BOX, label_x()+1, label_y()+1, label_w()-1, label_h()-1, fg, bg);
       }
     }                   // end drawthis
   }                     // end clipped
diff --git src/Fl_Widget.cxx src/Fl_Widget.cxx
index c5b59f5..bf2ff03 100644
--- src/Fl_Widget.cxx
+++ src/Fl_Widget.cxx
@@ -213,25 +213,7 @@ Fl_Widget::~Fl_Widget() {
 void Fl_Widget::draw_focus(Fl_Boxtype bt, int X, int Y, int W, int H, Fl_Color bg) const {
   if (!Fl::visible_focus()) return;
   if (!visible_focus()) return;
-  switch (bt) {
-    case FL_DOWN_BOX:
-    case FL_DOWN_FRAME:
-    case FL_THIN_DOWN_BOX:
-    case FL_THIN_DOWN_FRAME:
-      X ++;
-      Y ++;
-    default:
-      break;
-  }
-  X += Fl::box_dx(bt);
-  Y += Fl::box_dy(bt);
-  W -= Fl::box_dw(bt)+1;
-  H -= Fl::box_dh(bt)+1;
-
-  Fl_Color savecolor = fl_color();
-  fl_color(fl_contrast(FL_BLACK, bg));
-  fl_focus_rect(X, Y, W, H);
-  fl_color(savecolor);
+  fl_draw_box_focus(bt, X, Y, W, H, FL_BLACK, bg);
 }
 
 void Fl_Widget::activate() {
diff --git src/Fl_get_system_colors.cxx src/Fl_get_system_colors.cxx
index ecc08a5..24bf8e4 100644
--- src/Fl_get_system_colors.cxx
+++ src/Fl_get_system_colors.cxx
@@ -144,6 +144,7 @@ extern void     fl_thin_up_box(int, int, int, int, Fl_Color);
 extern void     fl_thin_down_box(int, int, int, int, Fl_Color);
 extern void     fl_round_up_box(int, int, int, int, Fl_Color);
 extern void     fl_round_down_box(int, int, int, int, Fl_Color);
+extern void     fl_round_focus(Fl_Boxtype, int, int, int, int, Fl_Color, Fl_Color);
 
 extern void     fl_up_frame(int, int, int, int, Fl_Color);
 extern void     fl_down_frame(int, int, int, int, Fl_Color);
@@ -359,8 +360,8 @@ int Fl::reload_scheme() {
     set_boxtype(FL_DOWN_BOX,        fl_down_box, D1, D1, D2, D2);
     set_boxtype(FL_THIN_UP_BOX,     fl_thin_up_box, 1, 1, 2, 2);
     set_boxtype(FL_THIN_DOWN_BOX,   fl_thin_down_box, 1, 1, 2, 2);
-    set_boxtype(_FL_ROUND_UP_BOX,   fl_round_up_box, 3, 3, 6, 6);
-    set_boxtype(_FL_ROUND_DOWN_BOX, fl_round_down_box, 3, 3, 6, 6);
+    set_boxtype(_FL_ROUND_UP_BOX,   fl_round_up_box, 3, 3, 6, 6, fl_round_focus);
+    set_boxtype(_FL_ROUND_DOWN_BOX, fl_round_down_box, 3, 3, 6, 6, fl_round_focus);
 
     // Use standard size scrollbars...
     Fl::scrollbar_size(16);
diff --git src/fl_boxtype.cxx src/fl_boxtype.cxx
index 708635f..ea8571b 100644
--- src/fl_boxtype.cxx
+++ src/fl_boxtype.cxx
@@ -288,8 +288,9 @@ static struct {
   Fl_Box_Draw_F *f;
   uchar dx, dy, dw, dh;
   int set;
-} fl_box_table[256] = {
-// must match list in Enumerations.H!!!
+  Fl_Box_Draw_Focus_F *ff;
+} fl_box_table[FL_MAX_BOXTYPE+1] = {
+  // must match list in Enumerations.H!!!
   {fl_no_box,           0,0,0,0,1},
   {fl_flat_box,         0,0,0,0,1}, // FL_FLAT_BOX
   {fl_up_box,           D1,D1,D2,D2,1},
@@ -412,13 +413,15 @@ int Fl::box_dw(Fl_Boxtype t) {return fl_box_table[t].dw;}
 int Fl::box_dh(Fl_Boxtype t) {return fl_box_table[t].dh;}
 
 /**
-  Sets the drawing function for a given box type.
-  \param[in] t box type
-  \param[in] f box drawing function
-*/
-void fl_internal_boxtype(Fl_Boxtype t, Fl_Box_Draw_F* f) {
+ Sets the drawing function for a given box type.
+ \param[in] t box type
+ \param[in] f box drawing function
+ \param[in] ff optional box focus rectangle drawing function
+ */
+void fl_internal_boxtype(Fl_Boxtype t, Fl_Box_Draw_F* f, Fl_Box_Draw_Focus_F* ff) {
   if (!fl_box_table[t].set) {
     fl_box_table[t].f   = f;
+    fl_box_table[t].ff  = ff;
     fl_box_table[t].set = 1;
   }
 }
@@ -427,16 +430,30 @@ void fl_internal_boxtype(Fl_Boxtype t, Fl_Box_Draw_F* f) {
 Fl_Box_Draw_F *Fl::get_boxtype(Fl_Boxtype t) {
   return fl_box_table[t].f;
 }
-/** Sets the function to call to draw a specific boxtype. */
+
+/**
+ Sets the function to call to draw a specific box type.
+
+ \param[in] t  index of the box type between 0 (FL_NO_BOX) and up to and
+ including FL_MAX_BOXTYPE
+ \param[in] f  callback function that draws the box
+ \param[in] dx, dy top left frame width, distance in pixels to box contents
+ \param[in] dw, dh left plus right frame width, top plus bottom frame width
+ \param[in] ff optional callback that draws the box focus, defaults
+ to a rectangle, inset by dx, dy, dw, dh
+ */
 void Fl::set_boxtype(Fl_Boxtype t, Fl_Box_Draw_F* f,
-                     uchar a, uchar b, uchar c, uchar d) {
+                     uchar dx, uchar dy, uchar dw, uchar dh,
+                     Fl_Box_Draw_Focus_F* ff) {
   fl_box_table[t].f   = f;
   fl_box_table[t].set = 1;
-  fl_box_table[t].dx  = a;
-  fl_box_table[t].dy  = b;
-  fl_box_table[t].dw  = c;
-  fl_box_table[t].dh  = d;
+  fl_box_table[t].dx  = dx;
+  fl_box_table[t].dy  = dy;
+  fl_box_table[t].dw  = dw;
+  fl_box_table[t].dh  = dh;
+  fl_box_table[t].ff  = ff;
 }
+
 /** Copies the from boxtype. */
 void Fl::set_boxtype(Fl_Boxtype to, Fl_Boxtype from) {
   fl_box_table[to] = fl_box_table[from];
@@ -452,6 +469,41 @@ void fl_draw_box(Fl_Boxtype t, int x, int y, int w, int h, Fl_Color c) {
   if (t && fl_box_table[t].f) fl_box_table[t].f(x,y,w,h,c);
 }
 
+/**
+ Draws the focus rectangle inside a box using given type, position, size and color.
+ Boxes can set their own focus drawing callback. The focus frame does not
+ need to be a rectangle at all, but should fit inside the shape of the box.
+ \param[in] bt box type
+ \param[in] x, y, w, h position and size
+ \param[in] fg, bg foreground and background color
+ */
+void fl_draw_box_focus(Fl_Boxtype bt, int x, int y, int w, int h, Fl_Color fg, Fl_Color bg) {
+  if (!Fl::visible_focus()) return;
+  if ((bt >= 0) && (bt <= FL_MAX_BOXTYPE) && (fl_box_table[bt].ff)) {
+    fl_box_table[bt].ff(bt, x, y, w, h, fg, bg);
+    return;
+  }
+  switch (bt) {
+    case FL_DOWN_BOX:
+    case FL_DOWN_FRAME:
+    case FL_THIN_DOWN_BOX:
+    case FL_THIN_DOWN_FRAME:
+      x++;
+      y++;
+    default:
+      break;
+  }
+  x += Fl::box_dx(bt);
+  y += Fl::box_dy(bt);
+  w -= Fl::box_dw(bt)+1;
+  h -= Fl::box_dh(bt)+1;
+
+  Fl_Color savecolor = fl_color();
+  fl_color(fl_contrast(fg, bg));
+  fl_focus_rect(x, y, w, h);
+  fl_color(savecolor);
+}
+
 /** Draws the widget box according its box style */
 void Fl_Widget::draw_box() const {
   if (box_) draw_box((Fl_Boxtype)box_, x_, y_, w_, h_, color_);
diff --git src/fl_diamond_box.cxx src/fl_diamond_box.cxx
index e5f7749..414e5de 100644
--- src/fl_diamond_box.cxx
+++ src/fl_diamond_box.cxx
@@ -59,9 +59,25 @@ static void fl_diamond_down_box(int x,int y,int w,int h,Fl_Color bgcolor) {
   fl_color(g[(int)'A']); fl_loop(x+3, y1, x1, y+3, x+w-3, y1, x1, y+h-3);
 }
 
-extern void fl_internal_boxtype(Fl_Boxtype, Fl_Box_Draw_F*);
+void fl_diamond_focus(Fl_Boxtype bt, int x, int y, int w, int h, Fl_Color fg, Fl_Color bg) {
+  w &= -2;
+  h &= -2;
+  x += Fl::box_dx(bt)+4;
+  y += Fl::box_dy(bt)+4;
+  w -= Fl::box_dw(bt)+8;
+  h -= Fl::box_dh(bt)+8;
+  int x1 = x+w/2;
+  int y1 = y+h/2;
+  Fl_Color savecolor = fl_color();
+  fl_color(fl_contrast(fg, bg));
+  fl_line_style(FL_DOT);
+  fl_loop(x,y1, x1,y, x+w,y1, x1,y+h);
+  fl_line_style(FL_SOLID);
+  fl_color(savecolor);
+}
+extern void fl_internal_boxtype(Fl_Boxtype, Fl_Box_Draw_F*, Fl_Box_Draw_Focus_F* =NULL);
 Fl_Boxtype fl_define_FL_DIAMOND_BOX() {
-  fl_internal_boxtype(_FL_DIAMOND_DOWN_BOX, fl_diamond_down_box);
-  fl_internal_boxtype(_FL_DIAMOND_UP_BOX,fl_diamond_up_box);
+  fl_internal_boxtype(_FL_DIAMOND_DOWN_BOX, fl_diamond_down_box, fl_diamond_focus);
+  fl_internal_boxtype(_FL_DIAMOND_UP_BOX, fl_diamond_up_box, fl_diamond_focus);
   return _FL_DIAMOND_UP_BOX;
 }
diff --git src/fl_gleam.cxx src/fl_gleam.cxx
index c75472d..d7f80ad 100644
--- src/fl_gleam.cxx
+++ src/fl_gleam.cxx
@@ -164,7 +164,7 @@ static void thin_down_box(int x, int y, int w, int h, Fl_Color c) {
   frame_rect_down(x, y, w, h, c, fl_color_average(c, FL_BLACK, .45f), .35f, 0.85f);
 }
 
-extern void fl_internal_boxtype(Fl_Boxtype, Fl_Box_Draw_F*);
+extern void fl_internal_boxtype(Fl_Boxtype, Fl_Box_Draw_F*, Fl_Box_Draw_Focus_F* =NULL);
 
 Fl_Boxtype fl_define_FL_GLEAM_UP_BOX() {
   fl_internal_boxtype(_FL_GLEAM_UP_BOX, up_box);
diff --git src/fl_gtk.cxx src/fl_gtk.cxx
index 5319f6e..495ca18 100644
--- src/fl_gtk.cxx
+++ src/fl_gtk.cxx
@@ -24,7 +24,7 @@
 #include <FL/Fl.H>
 #include <FL/fl_draw.H>
 
-extern void fl_internal_boxtype(Fl_Boxtype, Fl_Box_Draw_F*);
+extern void fl_internal_boxtype(Fl_Boxtype, Fl_Box_Draw_F*, Fl_Box_Draw_Focus_F* =NULL);
 
 
 static void gtk_color(Fl_Color c) {
@@ -283,6 +283,8 @@ static void gtk_round_down_box(int x, int y, int w, int h, Fl_Color c) {
 
 #endif
 
+extern void fl_rounded_focus(Fl_Boxtype bt, int x, int y, int w, int h, Fl_Color fg, Fl_Color bg);
+
 Fl_Boxtype fl_define_FL_GTK_UP_BOX() {
   fl_internal_boxtype(_FL_GTK_UP_BOX, gtk_up_box);
   fl_internal_boxtype(_FL_GTK_DOWN_BOX, gtk_down_box);
@@ -292,8 +294,8 @@ Fl_Boxtype fl_define_FL_GTK_UP_BOX() {
   fl_internal_boxtype(_FL_GTK_THIN_DOWN_BOX, gtk_thin_down_box);
   fl_internal_boxtype(_FL_GTK_THIN_UP_FRAME, gtk_thin_up_frame);
   fl_internal_boxtype(_FL_GTK_THIN_DOWN_FRAME, gtk_thin_down_frame);
-  fl_internal_boxtype(_FL_GTK_ROUND_UP_BOX, gtk_round_up_box);
-  fl_internal_boxtype(_FL_GTK_ROUND_DOWN_BOX, gtk_round_down_box);
+  fl_internal_boxtype(_FL_GTK_ROUND_UP_BOX, gtk_round_up_box, fl_rounded_focus);
+  fl_internal_boxtype(_FL_GTK_ROUND_DOWN_BOX, gtk_round_down_box, fl_rounded_focus);
 
   return _FL_GTK_UP_BOX;
 }
diff --git src/fl_oval_box.cxx src/fl_oval_box.cxx
index 9a0e196..3d8d27f 100644
--- src/fl_oval_box.cxx
+++ src/fl_oval_box.cxx
@@ -45,11 +45,24 @@ static void fl_oval_shadow_box(int x, int y, int w, int h, Fl_Color c) {
   fl_oval_box(x,y,w,h,c);
 }
 
-extern void fl_internal_boxtype(Fl_Boxtype, Fl_Box_Draw_F*);
+void fl_oval_focus(Fl_Boxtype bt, int x, int y, int w, int h, Fl_Color fg, Fl_Color bg) {
+  x += Fl::box_dx(bt)+1;
+  y += Fl::box_dy(bt)+1;
+  w -= Fl::box_dw(bt)+2;
+  h -= Fl::box_dh(bt)+2;
+  Fl_Color savecolor = fl_color();
+  fl_color(fl_contrast(fg, bg));
+  fl_line_style(FL_DOT);
+  fl_arc(x, y, w, h, 0, 360);
+  fl_line_style(FL_SOLID);
+  fl_color(savecolor);
+}
+
+extern void fl_internal_boxtype(Fl_Boxtype, Fl_Box_Draw_F*, Fl_Box_Draw_Focus_F* =NULL);
 Fl_Boxtype fl_define_FL_OVAL_BOX() {
-  fl_internal_boxtype(_FL_OSHADOW_BOX,fl_oval_shadow_box);
-  fl_internal_boxtype(_FL_OVAL_FRAME,fl_oval_frame);
-  fl_internal_boxtype(_FL_OFLAT_BOX,fl_oval_flat_box);
-  fl_internal_boxtype(_FL_OVAL_BOX,fl_oval_box);
+  fl_internal_boxtype(_FL_OSHADOW_BOX, fl_oval_shadow_box, fl_oval_focus);
+  fl_internal_boxtype(_FL_OVAL_FRAME, fl_oval_frame, fl_oval_focus);
+  fl_internal_boxtype(_FL_OFLAT_BOX, fl_oval_flat_box, fl_oval_focus);
+  fl_internal_boxtype(_FL_OVAL_BOX, fl_oval_box, fl_oval_focus);
   return _FL_OVAL_BOX;
 }
diff --git src/fl_oxy.cxx src/fl_oxy.cxx
index 59909fd..763f501 100644
--- src/fl_oxy.cxx
+++ src/fl_oxy.cxx
@@ -504,7 +504,8 @@ void round_down_box(int x, int y, int w, int h, Fl_Color col) {
 }
 
 
-extern void fl_internal_boxtype(Fl_Boxtype, Fl_Box_Draw_F *);
+extern void fl_rounded_focus(Fl_Boxtype bt, int x, int y, int w, int h, Fl_Color fg, Fl_Color bg);
+extern void fl_internal_boxtype(Fl_Boxtype, Fl_Box_Draw_F*, Fl_Box_Draw_Focus_F* =NULL);
 
 Fl_Boxtype fl_define_FL_OXY_UP_BOX() {
 
@@ -516,8 +517,8 @@ Fl_Boxtype fl_define_FL_OXY_UP_BOX() {
   fl_internal_boxtype(_FL_OXY_THIN_DOWN_BOX, thin_down_box);
   fl_internal_boxtype(_FL_OXY_THIN_UP_FRAME, thin_up_frame);
   fl_internal_boxtype(_FL_OXY_THIN_DOWN_FRAME, thin_down_frame);
-  fl_internal_boxtype(_FL_OXY_ROUND_UP_BOX, round_up_box);
-  fl_internal_boxtype(_FL_OXY_ROUND_DOWN_BOX, round_down_box);
+  fl_internal_boxtype(_FL_OXY_ROUND_UP_BOX, round_up_box, fl_rounded_focus);
+  fl_internal_boxtype(_FL_OXY_ROUND_DOWN_BOX, round_down_box, fl_rounded_focus);
   fl_internal_boxtype(_FL_OXY_BUTTON_UP_BOX, button_up_box);
   fl_internal_boxtype(_FL_OXY_BUTTON_DOWN_BOX, button_down_box);
 
diff --git src/fl_plastic.cxx src/fl_plastic.cxx
index eda2337..bc89783 100644
--- src/fl_plastic.cxx
+++ src/fl_plastic.cxx
@@ -348,8 +348,8 @@ static void down_round(int x, int y, int w, int h, Fl_Color c) {
 }
 
 
-extern void fl_internal_boxtype(Fl_Boxtype, Fl_Box_Draw_F*);
-
+extern void fl_rounded_focus(Fl_Boxtype bt, int x, int y, int w, int h, Fl_Color fg, Fl_Color bg);
+extern void fl_internal_boxtype(Fl_Boxtype, Fl_Box_Draw_F*, Fl_Box_Draw_Focus_F* =NULL);
 
 Fl_Boxtype fl_define_FL_PLASTIC_UP_BOX() {
   fl_internal_boxtype(_FL_PLASTIC_UP_BOX, up_box);
@@ -358,8 +358,8 @@ Fl_Boxtype fl_define_FL_PLASTIC_UP_BOX() {
   fl_internal_boxtype(_FL_PLASTIC_DOWN_FRAME, down_frame);
   fl_internal_boxtype(_FL_PLASTIC_THIN_UP_BOX, thin_up_box);
   fl_internal_boxtype(_FL_PLASTIC_THIN_DOWN_BOX, down_box);
-  fl_internal_boxtype(_FL_PLASTIC_ROUND_UP_BOX, up_round);
-  fl_internal_boxtype(_FL_PLASTIC_ROUND_DOWN_BOX, down_round);
+  fl_internal_boxtype(_FL_PLASTIC_ROUND_UP_BOX, up_round, fl_rounded_focus);
+  fl_internal_boxtype(_FL_PLASTIC_ROUND_DOWN_BOX, down_round, fl_rounded_focus);
 
   return _FL_PLASTIC_UP_BOX;
 }
diff --git src/fl_round_box.cxx src/fl_round_box.cxx
index 54c8ebb..88cbcfc 100644
--- src/fl_round_box.cxx
+++ src/fl_round_box.cxx
@@ -108,9 +108,20 @@ void fl_round_up_box(int x, int y, int w, int h, Fl_Color bgcolor) {
   draw(CLOSED,      x,   y, w,   h, 0, (Fl_Color)g[(int)'A']);
 }
 
-extern void fl_internal_boxtype(Fl_Boxtype, Fl_Box_Draw_F*);
+void fl_round_focus(Fl_Boxtype bt, int x, int y, int w, int h, Fl_Color fg, Fl_Color bg) {
+  x += Fl::box_dx(bt);
+  y += Fl::box_dy(bt);
+  w -= Fl::box_dw(bt);
+  h -= Fl::box_dh(bt);
+  Fl_Color savecolor = fl_color();
+  fl_line_style(FL_DOT);
+  draw(CLOSED, x, y, w, h, 0, fl_contrast(fg, bg));
+  fl_line_style(FL_SOLID);
+}
+
+extern void fl_internal_boxtype(Fl_Boxtype, Fl_Box_Draw_F*, Fl_Box_Draw_Focus_F* =NULL);
 Fl_Boxtype fl_define_FL_ROUND_UP_BOX() {
-  fl_internal_boxtype(_FL_ROUND_DOWN_BOX, fl_round_down_box);
-  fl_internal_boxtype(_FL_ROUND_UP_BOX, fl_round_up_box);
+  fl_internal_boxtype(_FL_ROUND_DOWN_BOX, fl_round_down_box, fl_round_focus);
+  fl_internal_boxtype(_FL_ROUND_UP_BOX, fl_round_up_box, fl_round_focus);
   return _FL_ROUND_UP_BOX;
 }
diff --git src/fl_rounded_box.cxx src/fl_rounded_box.cxx
index f1b3511..9b64f52 100644
--- src/fl_rounded_box.cxx
+++ src/fl_rounded_box.cxx
@@ -62,20 +62,33 @@ static void fl_rshadow_box(int x, int y, int w, int h, Fl_Color c) {
   fl_rounded_box(x, y, w, h, c);
 }
 
-extern void fl_internal_boxtype(Fl_Boxtype, Fl_Box_Draw_F*);
+void fl_rounded_focus(Fl_Boxtype bt, int x, int y, int w, int h, Fl_Color fg, Fl_Color bg) {
+  x += Fl::box_dx(bt);
+  y += Fl::box_dy(bt);
+  w -= Fl::box_dw(bt)+1;
+  h -= Fl::box_dh(bt)+1;
+  Fl_Color savecolor = fl_color();
+  fl_color(fl_contrast(fg, bg));
+  fl_line_style(FL_DOT);
+  rbox(0, x+1, y+1, w-1, h-1);
+  fl_line_style(FL_SOLID);
+  fl_color(savecolor);
+}
+
+extern void fl_internal_boxtype(Fl_Boxtype, Fl_Box_Draw_F*, Fl_Box_Draw_Focus_F* =NULL);
 
 Fl_Boxtype fl_define_FL_ROUNDED_BOX() {
-  fl_internal_boxtype(_FL_ROUNDED_FRAME, fl_rounded_frame);
-  fl_internal_boxtype(_FL_ROUNDED_BOX, fl_rounded_box);
+  fl_internal_boxtype(_FL_ROUNDED_FRAME, fl_rounded_frame, fl_rounded_focus);
+  fl_internal_boxtype(_FL_ROUNDED_BOX, fl_rounded_box, fl_rounded_focus);
   return _FL_ROUNDED_BOX;
 }
 
 Fl_Boxtype fl_define_FL_RFLAT_BOX() {
-  fl_internal_boxtype(_FL_RFLAT_BOX, fl_rflat_box);
+  fl_internal_boxtype(_FL_RFLAT_BOX, fl_rflat_box, fl_rounded_focus);
   return _FL_RFLAT_BOX;
 }
 
 Fl_Boxtype fl_define_FL_RSHADOW_BOX() {
-  fl_internal_boxtype(_FL_RSHADOW_BOX, fl_rshadow_box);
+  fl_internal_boxtype(_FL_RSHADOW_BOX, fl_rshadow_box, fl_rounded_focus);
   return _FL_RSHADOW_BOX;
 }
diff --git src/fl_shadow_box.cxx src/fl_shadow_box.cxx
index d89d09b..57b0cf0 100644
--- src/fl_shadow_box.cxx
+++ src/fl_shadow_box.cxx
@@ -36,7 +36,7 @@ static void fl_shadow_box(int x, int y, int w, int h, Fl_Color c) {
   fl_shadow_frame(x,y,w,h,FL_GRAY0);
 }
 
-extern void fl_internal_boxtype(Fl_Boxtype, Fl_Box_Draw_F*);
+extern void fl_internal_boxtype(Fl_Boxtype, Fl_Box_Draw_F*, Fl_Box_Draw_Focus_F* =NULL);
 Fl_Boxtype fl_define_FL_SHADOW_BOX() {
   fl_internal_boxtype(_FL_SHADOW_FRAME, fl_shadow_frame);
   fl_internal_boxtype(_FL_SHADOW_BOX, fl_shadow_box);
Direct Link to Message ]
 
     
Previous Message ]Next Message ]
 
 

Comments are owned by the poster. All other content is copyright 1998-2024 by Bill Spitzak and others. This project is hosted by The FLTK Team. Please report site problems to 'erco@seriss.com'.