Responding to resize events with Xlib
This page was created on Sun Oct 03 2010 and last changed on Sat Oct 05 2024.
This program is very similar
to A simple text
window using Xlib, which creates an X window with some centred
text. This program adds the ability to respond to resize events. In
the function select_window
, the
mask StructureNotifyMask
is added to the selected
inputs. In the function event_loop
, the loop is set to
check for a type of event ConfigureNotify
, and if this
event occurs, and it involves a resize of the window, to adjust the
size of our X window accordingly. The text remains centred in the
window after the resize.
#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 | /* Add StructureNotifyMask to send us events involving resizing of the window, etc. */ StructureNotifyMask); 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 (); } /* Respond to ConfigureNotify, the type of event sent by the server if the window is resized. */ else if (e.type == ConfigureNotify) { XConfigureEvent xce = e.xconfigure; /* This event type is generated for a variety of happenings, so check whether the window has been resized. */ if (xce.width != text_box.width || xce.height != text_box.height) { text_box.width = xce.width; text_box.height = xce.height; draw_screen (); } } } } int main (int argc, char ** argv) { text_box.text = "Hello World"; text_box.text_len = strlen (text_box.text); x_connect (); create_window (); set_up_gc (); set_up_font (); event_loop (); return 0; }
Copyright © Ben Bullock 2009-2024. All
rights reserved.
For comments, questions, and corrections, please email
Ben Bullock
(benkasminbullock@gmail.com).
/
Privacy /
Disclaimer