Created
November 18, 2020 18:26
-
-
Save alsamitech/3cdd1d058ab4b13916bcf23ee6caa6b8 to your computer and use it in GitHub Desktop.
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> | |
| // CFLAGS=-lX11 -Os | |
| /* | |
| * Alsami utils, twin | |
| **/ | |
| /* 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 (int w_x, int h_x) | |
| { | |
| text_box.width = w_x; | |
| text_box.height = h_x; | |
| 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. */ | |
| static void set_up_font () | |
| { | |
| const char * fontname = "-*-helvetica-*-r-*-*-14-*-*-*-*-*-*-*"; | |
| 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) | |
| { | |
| text_box.text = argv[1]; | |
| text_box.text_len = strlen (text_box.text); | |
| x_connect (); | |
| create_window (atoi(argv[2]),atoi(argv[3])); | |
| 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