cx11freetype2

How can i add line breaks when rendering Text using X11,


I am making an application that renders texts according to style mentioned on screen using X Windows System and Xft. My code is working fine as shown below.

#include <X11/Xlib.h>
#include <X11/Xft/Xft.h>
char * nowShowing() 
{
 return strdup("This is a sample text This is rendered with new Driver installed This is a sample text his is rendered with new Driver installed"); 
}
int main()
{
XftFont *font;
XftDraw *draw;
XRenderColor render_color;
XftColor xft_color;
char *str;
str = nowShowing();
int x = 70;
int y = 150;
Display *dis = XOpenDisplay (0);
int screen = DefaultScreen (dis);
Window  w = XCreateSimpleWindow (dis, RootWindow (dis, screen),
                                 0, 0, 1200, 300, 1,
                                 BlackPixel (dis, screen),
                                 WhitePixel (dis, screen));
XEvent ev;

render_color.red = 0;
render_color.green =0;
render_color.blue = 0;
render_color.alpha = 0xffff;

XftColorAllocValue (dis,
                    DefaultVisual(dis, screen),
                    DefaultColormap(dis, screen),
                    &render_color,
                    &xft_color);

//font = XftFontOpen(dis, screen,
  //                 XFT_FAMILY, XftTypeString, "charter",
  //                 XFT_SIZE, XftTypeDouble, 20.0,
   //                 NULL);
font = XftFontOpenName(dis,screen,"URW Palladio L:style=Bold Italic"); //it takes a Fontconfig pattern string

draw = XftDrawCreate(dis, w,
                     DefaultVisual(dis, screen),
                     DefaultColormap(dis, screen));

XSelectInput (dis, w, ExposureMask);
XMapWindow (dis, w);
for (;;)
{
    XNextEvent (dis, &ev);
    if (ev.type == Expose)
        XftDrawString8(draw, &xft_color, font, x, y, (XftChar8 *) str,
                       strlen(str));
}
return 0;
}

But i am wondering that how can i add line breaks in the text entered. I tried using "/n" and also tried to make array and used loops but it didn't work.


Solution

  • New line "\n" will not be rendered by Xft. You need to render each line separately with proper offset, depending on font size and desired spacing. I have modified the ending block of your code with sample text rendered two times on separate lines.

    if (ev.type == Expose)
        {
         int fonth = font->ascent + font->descent;
    
         XftDrawString8(draw, &xft_color, font, x, y, (XftChar8 *) str,
                       strlen(str));
         XftDrawString8(draw, &xft_color, font, x, y+fonth, (XftChar8 *) str,
                       strlen(str));
        }