Created
July 27, 2012 10:50
-
-
Save submachine/3187399 to your computer and use it in GitHub Desktop.
A program that takes: font, string, and renders accordingly using Xlib. Almost a verbatim copy of the one at: http://www.lemoda.net/c/xlib-text-box/index.html
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <string.h> | |
#include <stdlib.h> | |
#include <stdio.h> | |
#include <X11/Xlib.h> | |
/* The window which contains the text. */ | |
struct | |
{ | |
int width; | |
int height; | |
char *text; | |
int text_len; | |
/* X Windows related variables. */ | |
Display *display; | |
int screen; | |
Window root; | |
Window window; | |
GC gc; | |
XFontStruct *font; | |
unsigned long black_pixel; | |
unsigned long white_pixel; | |
} | |
text_box; | |
/* Connect to the display, set up the basic variables. */ | |
static void | |
x_connect () | |
{ | |
text_box.display = XOpenDisplay (NULL); | |
if (!text_box.display) | |
{ | |
fprintf (stderr, "Could not open display.\n"); | |
exit (1); | |
} | |
text_box.screen = DefaultScreen (text_box.display); | |
text_box.root = RootWindow (text_box.display, text_box.screen); | |
text_box.black_pixel = BlackPixel (text_box.display, text_box.screen); | |
text_box.white_pixel = WhitePixel (text_box.display, text_box.screen); | |
} | |
/* Create the window. */ | |
static void | |
create_window () | |
{ | |
text_box.width = 300; | |
text_box.height = 300; | |
text_box.window = XCreateSimpleWindow (text_box.display, text_box.root, 1, /* x */ | |
1, /* y */ | |
text_box.width, text_box.height, 0, /* border width */ | |
text_box.black_pixel, /* border pixel */ | |
text_box. | |
white_pixel /* background */ ); | |
XSelectInput (text_box.display, text_box.window, ExposureMask); | |
XMapWindow (text_box.display, text_box.window); | |
} | |
/* Set up the GC (Graphics Context). */ | |
static void | |
set_up_gc () | |
{ | |
text_box.screen = DefaultScreen (text_box.display); | |
text_box.gc = XCreateGC (text_box.display, text_box.window, 0, 0); | |
XSetBackground (text_box.display, text_box.gc, text_box.white_pixel); | |
XSetForeground (text_box.display, text_box.gc, text_box.black_pixel); | |
} | |
/* Set up the text font. */ | |
const char *fontname; | |
static void | |
set_up_font () | |
{ | |
text_box.font = XLoadQueryFont (text_box.display, fontname); | |
/* If the font could not be loaded, revert to the "fixed" font. */ | |
if (!text_box.font) | |
{ | |
fprintf (stderr, "unable to load font %s: using fixed\n", fontname); | |
text_box.font = XLoadQueryFont (text_box.display, "fixed"); | |
} | |
XSetFont (text_box.display, text_box.gc, text_box.font->fid); | |
} | |
/* Draw the window. */ | |
static void | |
draw_screen () | |
{ | |
int x; | |
int y; | |
int direction; | |
int ascent; | |
int descent; | |
XCharStruct overall; | |
/* Centre the text in the middle of the box. */ | |
XTextExtents (text_box.font, text_box.text, text_box.text_len, | |
&direction, &ascent, &descent, &overall); | |
x = (text_box.width - overall.width) / 2; | |
y = text_box.height / 2 + (ascent - descent) / 2; | |
XClearWindow (text_box.display, text_box.window); | |
XDrawString (text_box.display, text_box.window, text_box.gc, | |
x, y, text_box.text, text_box.text_len); | |
} | |
/* Loop over events. */ | |
static void | |
event_loop () | |
{ | |
while (1) | |
{ | |
XEvent e; | |
XNextEvent (text_box.display, &e); | |
if (e.type == Expose) | |
{ | |
draw_screen (); | |
} | |
} | |
} | |
int | |
main (int argc, char **argv) | |
{ | |
if (argc < 3) | |
return 0; | |
fontname = argv[1]; | |
text_box.text = argv[2]; | |
text_box.text_len = strlen (text_box.text); | |
x_connect (); | |
create_window (); | |
set_up_gc (); | |
set_up_font (); | |
event_loop (); | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment