color/src/color.c
2020-07-23 18:54:46 -05:00

165 lines
4.0 KiB
C

#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#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;
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);
//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 {
switch(event.xkey.keycode) {
case X_ENTER_KEY:
break;
case X_Q_KEY:
printf("%i\n", background_color.red);
XFreeColors(display, colormap, &background_color.pixel, 1, NULL);
background_color.red += 1000;
printf("%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;
}