From ee4ab86c3cbf8d03ea3bf0441943fc6928d91f09 Mon Sep 17 00:00:00 2001 From: Matthias Melcher Date: Thu, 3 Aug 2023 17:35:19 +0200 Subject: #211: adds optional parameter for Fl_Input_::drawtext() Does not change the original API but adds a function and keeps the original automatic. --- FL/Fl_Input_.H | 3 +++ src/Fl_Input_.cxx | 50 ++++++++++++++++++++++++++++++++++++-------------- 2 files changed, 39 insertions(+), 14 deletions(-) diff --git a/FL/Fl_Input_.H b/FL/Fl_Input_.H index 8c7a887f2..a800d7e49 100644 --- a/FL/Fl_Input_.H +++ b/FL/Fl_Input_.H @@ -193,6 +193,9 @@ protected: /* Draw the text in the passed bounding box. */ void drawtext(int, int, int, int); + /* Draw the text in the passed bounding box. */ + void drawtext(int, int, int, int, bool draw_active); + /* Move the cursor to the column given by up_down_pos. */ int up_down_position(int, int keepmark=0); diff --git a/src/Fl_Input_.cxx b/src/Fl_Input_.cxx index e7cb7bbfb..4fc429aa3 100644 --- a/src/Fl_Input_.cxx +++ b/src/Fl_Input_.cxx @@ -287,19 +287,38 @@ void Fl_Input_::setfont() const { fl_font(textfont(), textsize()); } +/** + Draws the text in the passed bounding box. + + If damage() & FL_DAMAGE_ALL is true, this assumes the + area has already been erased to color(). Otherwise it does + minimal update and erases the area itself. + + \param X, Y, W, H area that must be redrawn + */ +void Fl_Input_::drawtext(int X, int Y, int W, int H) { + drawtext(X, Y, W, H, (Fl::focus()==this)); +} + /** Draws the text in the passed bounding box. - If damage() & FL_DAMAGE_ALL is true, this assumes the - area has already been erased to color(). Otherwise it does - minimal update and erases the area itself. + This version of `drawtext` allows the user to control whether the widget is + drawn as acitive, i.e. with the text cursor, or inactive. This is useful for + compound widgets where the input should be shown as active when actually + the container widget is the active one. + + A caller should not draw the widget with `active` set if another text + widget may indeed be the active widget. \param X, Y, W, H area that must be redrawn + \param draw_active if set, the cursor will be drawn, even if the widget is not active + \see Fl_Input_::drawtext(int X, int Y, int W, int H) */ -void Fl_Input_::drawtext(int X, int Y, int W, int H) { +void Fl_Input_::drawtext(int X, int Y, int W, int H, bool draw_active) { int do_mu = !(damage()&FL_DAMAGE_ALL); - if (Fl::focus()!=this && !size()) { + if (!draw_active && !size()) { if (do_mu) { // we have to erase it if cursor was there draw_box(box(), X-Fl::box_dx(box()), Y-Fl::box_dy(box()), W+Fl::box_dw(box()), H+Fl::box_dh(box()), color()); @@ -308,7 +327,7 @@ void Fl_Input_::drawtext(int X, int Y, int W, int H) { } int selstart, selend; - if (Fl::focus()!=this && /*Fl::selection_owner()!=this &&*/ Fl::pushed()!=this) + if (!draw_active && /*Fl::selection_owner()!=this &&*/ Fl::pushed()!=this) selstart = selend = 0; else if (insert_position() <= mark()) { selstart = insert_position(); selend = mark(); @@ -330,7 +349,7 @@ void Fl_Input_::drawtext(int X, int Y, int W, int H) { e = expand(p, buf); if (insert_position() >= p-value() && insert_position() <= e-value()) { curx = int(expandpos(p, value()+insert_position(), buf, 0)+.5); - if (Fl::focus()==this && !was_up_down) up_down_pos = curx; + if (draw_active && !was_up_down) up_down_pos = curx; cury = lines*height; int newscroll = xscroll_; if (curx > newscroll+W-threshold) { @@ -451,10 +470,13 @@ void Fl_Input_::drawtext(int X, int Y, int W, int H) { CONTINUE2: // draw the cursor: - if (Fl::focus() == this && ( - (Fl::screen_driver()->has_marked_text() && Fl::compose_state) || - selstart == selend) && - insert_position() >= p-value() && insert_position() <= e-value()) { + if ( draw_active + && ( (Fl::screen_driver()->has_marked_text() && Fl::compose_state) + || selstart == selend + ) + && insert_position() >= p-value() + && insert_position() <= e-value() + ) { fl_color(cursor_color()); // cursor position may need to be recomputed (see STR #2486) curx = int(expandpos(p, value()+insert_position(), buf, 0)+.5); @@ -487,9 +509,9 @@ void Fl_Input_::drawtext(int X, int Y, int W, int H) { } fl_pop_clip(); - if (Fl::focus() == this) { - fl_set_spot(textfont(), textsize(), - (int)xpos+curx, Y+ypos_cur-fl_descent(), W, H, window()); //fix issue #270 + if (draw_active) { + fl_set_spot(textfont(), textsize(), + (int)xpos+curx, Y+ypos_cur-fl_descent(), W, H, window()); //fix issue #270 } } -- cgit v1.2.3