0

I have a piece of code, that displays a text on screen. The same code when ran on Ubuntu 16.04 with Xserver version 1.18.4 displayed proper output, but when compiled and ran on Ubuntu 18.04 with Xserver version 1.20.4 , it just displays a white blank screen.

#include <iostream>
#include<unistd.h>
#include <sstream>
#include <string>              
#include <X11/Xlib.h>            
#include <X11/Xutil.h>          
#include <X11/Xft/Xft.h> 
#include <X11/extensions/XShm.h>      
#include <sys/ipc.h> 
#include <sys/shm.h>
using namespace std;  
int main()
{
    Display *display = XOpenDisplay(NULL);
    Screen *scn = DefaultScreenOfDisplay(display);
    int screen_num = DefaultScreen(display);
    int screen_width = DisplayWidth(display, screen_num);
    int screen_height = DisplayHeight(display, screen_num);
    int defaultScnDepth = DefaultDepthOfScreen(scn);
    Visual *visual = DefaultVisualOfScreen(scn);
    Window window=XCreateSimpleWindow(display,RootWindow(display,screen_num), 50, 50, 400, 400, 2 ,BlackPixel(display,screen_num),WhitePixel(display,screen_num));
    XMapWindow(display, window);
    XShmSegmentInfo shmInfo;
    XImage *xImage;
    Pixmap backPixmap;
    (xImage) = XShmCreateImage(display, visual, defaultScnDepth, ZPixmap, NULL, &shmInfo, screen_width, screen_height);
    shmInfo.shmid = shmget(IPC_PRIVATE, (xImage)->bytes_per_line * (xImage)->height, IPC_CREAT | 0777);
    shmInfo.shmaddr = (char *) shmat(shmInfo.shmid, 0, 0);
    xImage->data = shmInfo.shmaddr;
    shmInfo.readOnly = False;
    XShmAttach(display, &shmInfo);
    (backPixmap) = XShmCreatePixmap(display, window, (char *) (shmInfo.shmaddr), &shmInfo, (xImage)->width, (xImage)->height, (xImage)->depth);
    XGCValues values;
    GC gc = XCreateGC(display, backPixmap, 0, &values);
    XSync(display, false);
    Drawable drawable = backPixmap;
    visual = DefaultVisual(display, DefaultScreen(display));
    Colormap colormap = XCreateColormap(display, window, visual, AllocNone);
    const char *text = "Hello";
    XftDraw *xftDraw = NULL;
    XRenderColor xrFGColor, xrBGColor;
    XftColor     xftFGColor, xftBGColor;
    XftFont *font = NULL;
    font = XftFontOpenName( display, DefaultScreen( display ), "morpheus-18" );  
    xftDraw = XftDrawCreate(display, drawable, visual, colormap);
    std::istringstream strStream(text);
    std::string line;
    while(std::getline(strStream, line))

    {
        xrFGColor.red =  0xffff;
        xrFGColor.green =  0xffff;
        xrFGColor.blue =  0x0;
        xrFGColor.alpha= 0xffff;
        XftColorAllocValue(display, visual, colormap, &xrFGColor, &xftFGColor);
        //  Overlay Text
        XftDrawString8(xftDraw, &xftFGColor, font, 50, 50, (XftChar8 *) text, strlen(text));
        XftColorFree(display, visual, colormap, &xftFGColor);
    }

    XftDrawDestroy(xftDraw);
    XShmPutImage(display, window, gc, xImage, 0, 0, 0, 0, 400, 400, false);
    XSync(display, false);
    getchar();

}

It would be very helpful , if anyone could guide me to what is going wrong here.

I also have another scenario where I am running this example on a custom Linux OS. It was running fine until Xserver on the OS was upgraded to 1.19.6, post which I am able to see on display if I am drawing a rectangle, but texts are not being displayed. It would be really helpful if someone could help me figure it out.

  • Stupid question (just to sort it out): Are you sure about the font which is found on the server in quest for `"morpheus-18"`? If I remember right X11 has a quite flexible font matching but the returned font doesn't always look like expected. (I remember having seen Xm and Xt applications with tiny, unreadable text just because the X11 font manager decided that Helvetica 3 point is the next best matching font when the actual requested was not available.) – Scheff's Cat Nov 21 '19 at 07:08
  • Yeah , I have also tried loading font directly from a font file(.ttf) and even with that I saw different behaviours with X version, which is not expected. Hope that clears..@Scheff – Shubham Jha Nov 21 '19 at 07:15
  • It works well in Ubuntu 20.04 – kenn Nov 13 '21 at 12:01

0 Answers0