#include #include #include #include #include #include #include #define PROMPT_BUFSIZE 32 #define X_ENTER_KEY 36 #define X_Q_KEY 24 #define X_W_KEY 25 #define X_E_KEY 26 #define X_A_KEY 38 #define X_S_KEY 39 #define X_D_KEY 40 int main(void) { char text_prompt_buffer[PROMPT_BUFSIZE] = ""; Display *display; Window window; XEvent event; Colormap colormap; int screen; XColor background_color; XColor foreground_color; XTextItem text_prompt; XGCValues text_prompt_formatting; GC text_prompt_gc; int text_buffer_space; unsigned int channel_step; int is_prompt = 0; unsigned int winsize_x; unsigned int winsize_y; XFontStruct* font; XWindowAttributes win_info; if((display = XOpenDisplay(NULL)) == NULL) { printf("Couldn't open display due to fatal error: %s\n", strerror(errno)); exit(errno); } screen = DefaultScreen(display); //background colormap colormap = DefaultColormap(display, screen); background_color.red = 1000; background_color.green = 0; background_color.blue = 60000; //text colormap foreground_color.red = 0xffff - background_color.red; foreground_color.green = 0xffff - background_color.green; foreground_color.blue = 0xffff - background_color.blue; XAllocColor(display, colormap, &background_color); XAllocColor(display, colormap, &foreground_color); window = XCreateSimpleWindow(display, RootWindow(display, screen), 10, 10, 100, 100, 0, background_color.pixel, background_color.pixel); //last arg is color XMapWindow(display, window); XSelectInput(display, window, KeyPressMask | ExposureMask); XGetWindowAttributes(display, window, &win_info); channel_step = 0xffff / pow((win_info.depth / 3), 2) ; //text struct text_prompt.chars = text_prompt_buffer; text_prompt.nchars = strlen(text_prompt_buffer); text_prompt.delta = 0; //what? text_prompt.font = None; //text formatting struct text_prompt_formatting.foreground = foreground_color.pixel; text_prompt_gc = XCreateGC(display, window, GCForeground | GCLineWidth, &text_prompt_formatting); font = XLoadQueryFont(display, "-*-helvetica-medium-r-normal-*-20-*"); XSetFont(display, text_prompt_gc, font->fid); for(;;) { XNextEvent(display, &event); XGetWindowAttributes(display, window, &win_info); winsize_x = win_info.width; winsize_y = win_info.height; switch (event.type) { case KeyPress: printf("%i\n", event.xkey.keycode); if(is_prompt) { XClearWindow(display, window); text_buffer_space = PROMPT_BUFSIZE - text_prompt.nchars; if(event.xkey.keycode == X_ENTER_KEY) { if(text_buffer_space < PROMPT_BUFSIZE) { text_prompt.nchars--; } } else if(text_buffer_space > 0) { text_prompt.nchars += XLookupString(&event.xkey, text_prompt_buffer + text_prompt.nchars, text_buffer_space, NULL, NULL); } } else { printf("%i\n", win_info.depth); switch(event.xkey.keycode) { case X_ENTER_KEY: break; case X_Q_KEY: printf("Before: %i\n", background_color.red); XFreeColors(display, colormap, &background_color.pixel, 1, NULL); printf("Step: %i\n", channel_step); background_color.red += channel_step; //TODO: change me to depth printf("After: %i\n", background_color.red); XAllocColor(display, colormap, &background_color); break; case X_W_KEY: break; case X_E_KEY: break; case X_A_KEY: break; case X_S_KEY: break; case X_D_KEY: break; default: break; } } XDrawText(display, window, text_prompt_gc, 10, winsize_y - 10, &text_prompt, 1); break; case Expose: XDrawText(display, window, text_prompt_gc, 10, winsize_y - 10, &text_prompt, 1); printf("exposed\n"); break; default: break; } } return 0; }