1

I am using the fl_width function to create widgets whose size depends on their label (e.g., some Fl_Box). In the documentation for this function one reads

FL_EXPORT double fl_width (const char *txt)

Returns the typographical width of a nul-terminated string using the current font face and size.

I encountered anyway some strange behaviors on my Linux machine when I run even a simple program as the following one.

#include <FL/Fl.H>
#include <FL/fl_draw.H>
#include <FL/Fl_Double_Window.H>
#include <FL/Fl_Box.H>

#include <iostream>

int main(){

    Fl_Double_Window* W = new Fl_Double_Window(200,100,"Test");

    W->begin();

        // Creation of the char array
        const char*  s1 = "text";

        // Usage of the fl_width
        double I1  = fl_width(s1);

        // Print the result
        std::cout << I1 << std::endl;

        // A Fl_Box for comparinson
        Fl_Box* B1 = new Fl_Box(50,10,100,30,"New Box");
        B1 -> box(FL_UP_BOX);

        // Another box whose width depends on the length of its label: 
        Fl_Box* B2 = new Fl_Box(50,50,(int)I1,30,s1);
        B2 -> box(FL_UP_BOX);

    W->end();
    W->show();
    return  Fl::run();

}

In this case I get -1 as a result for the length of s1, as it is evident also from the second Fl_Box that actually does not appear.

Same result when I use a std::string with its c_str() method. Where did I get wrong? Have I have to include some other header files?

My setup is the following: Ubuntu 20.04.04, FLTK 1.3.8, gcc version 9.4.0.


On other projects on my MacBook Pro (MacOS 11) I did not have any problems.

Eddymage
  • 1,008
  • 1
  • 7
  • 22
  • I think you need to invoke `fl_font` prior to this function in order to set current font face and size – user7860670 Jul 11 '22 at 08:35
  • @user7860670 Do you mean the `Fl::set_fonts()` function? In this latter case, it does not work. I think that the default font is already set, so I do not understand how I should invoke `fl_font`. – Eddymage Jul 11 '22 at 18:00
  • @user7860670 It seems that you were right: the documentation on the header file on my machine is complete: I looked only on the header file on the online documentation and not the function description [here](https://www.fltk.org/doc-1.3/group__fl__attributes.html#ga80203d2dd1e06550e7a35d6bb72f9bd6). Thanks for pointing to the right direction! – Eddymage Jul 13 '22 at 11:17

1 Answers1

1

One should invoke fl_font(Fl_Font face, Fl_Fontsize fsize) first.

As user7860670 suggested in the comments to the question, one have to invoke fl_font(Fl_Font face, Fl_Fontsize fsize) for having a proper behaviour for the fl_width() function. This is also explained in the documentation of fl_font and in the (local) header file fl_draw.H.

The example code below shows how to call this function and how setting different sizes impacts on the further computations.

#include <FL/Fl.H>
#include <FL/fl_draw.H>
#include <FL/Fl_Double_Window.H>
#include <FL/Fl_Box.H>

#include <iostream>

int main(){

    Fl_Double_Window* W = new Fl_Double_Window(200,150,"Test");

    W->begin();

        // Creation of the char array
        const char*  s1 = "text";
        fl_font(0,20);
        std::cout <<  "The initial size is set to " << fl_size() << std::endl;

        // Usage of the fl_width
        double I1  = fl_width(s1);

        // Print the result
        std::cout << "The length hence is " << I1 << std::endl;

        // A Fl_Box for comparinson
        Fl_Box* B1 = new Fl_Box(50,10,100,30,"New Box");
        B1 -> box(FL_UP_BOX);
        // Another box whose width depends on the length of its label: 
        Fl_Box* B2 = new Fl_Box(50,50,(int)I1,30,s1);
        B2 -> box(FL_UP_BOX);

        // Another Box which shows that actually fl_width() returns a number depending on the size of the font
        fl_font(0,40);
        std::cout <<  "The new size is set to " << fl_size() << std::endl;
        double I2  = fl_width(s1);
        std::cout << "The new length hence is " << I2 << std::endl;
        Fl_Box* B3 = new Fl_Box(50,90,(int)I2,30,s1);
        B3 -> box(FL_UP_BOX);

    W->end();
    W->show();
    return  Fl::run();

}
Eddymage
  • 1,008
  • 1
  • 7
  • 22