#include #include #include #include #include #include #include #include #include "pipe.h" #include "bardata.h" Display* display; Window win; GC gc; XftFont* font = NULL; XftColor fg_color; static int width = 1000; static float width_ratio = 1; static int err_code = 1; void die(const char* fmt, ...) { va_list args; va_start(args, fmt); vfprintf(stderr, fmt, args); va_end(args); putc('\n', stderr); exit(err_code); } void load_font(const char* font_name) { XftFont* new_font = XftFontOpenName(display, DefaultScreen(display), font_name); if (new_font == NULL) { fprintf(stderr, "cannot open font %s\n", font_name); return; } if (font != NULL) { XftFontClose(display, font); } font = new_font; } void init_x(void) { display = XOpenDisplay(NULL); if (display == NULL) { die("could not open X display"); } XSetWindowAttributes win_attr = { .override_redirect = 1, .background_pixel = 0x202020, .event_mask = ExposureMask | PropertyChangeMask, }; Screen* screen = DefaultScreenOfDisplay(display); width = WidthOfScreen(screen); win = XCreateWindow( display, DefaultRootWindow(display), 0, 0, width, bar_height, 0, CopyFromParent, InputOutput, CopyFromParent, CWOverrideRedirect | CWBackPixel | CWEventMask, &win_attr ); XMapRaised(display, win); load_font("monospace:size=10"); XftColorAllocName( display, DefaultVisual(display, DefaultScreen(display)), DefaultColormap(display, DefaultScreen(display)), "#FFFFFF", &fg_color ); gc = XCreateGC(display, win, 0, NULL); XSetForeground(display, gc, 0xFFFFFF); XFlush(display); } void deinit_x(void) { XftFontClose(display, font); XUnmapWindow(display, win); XDestroyWindow(display, win); } void draw_text(const char* text, int x, int y) { XftDraw* xft_draw = XftDrawCreate( display, win, DefaultVisual(display, DefaultScreen(display)), DefaultColormap(display, DefaultScreen(display)) ); int dy = y + (bar_height - font->height) / 2 + font->ascent; XftDrawString8(xft_draw, &fg_color, font, x, dy, (const FcChar8*)text, strlen(text)); XftDrawDestroy(xft_draw); } int main(void) { init_pipe(); init_x(); while (true) { XEvent ev; while (XPending(display)) XNextEvent(display, &ev); XClearWindow(display, win); XResizeWindow(display, win, width, bar_height); draw_text("Hello, world!", 0, 0); XFlush(display); await_change(); } deinit_x(); return 0; }