summaryrefslogtreecommitdiff
path: root/src/x.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/x.c')
-rw-r--r--src/x.c158
1 files changed, 158 insertions, 0 deletions
diff --git a/src/x.c b/src/x.c
index e69de29..828445f 100644
--- a/src/x.c
+++ b/src/x.c
@@ -0,0 +1,158 @@
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <X11/keysym.h>
+#include <xcb/xcb_keysyms.h>
+
+#include "x.h"
+#include "types.h"
+
+Server_context_t *init_XCB_server();
+xcb_window_t create_win(Server_context_t *info);
+
+Server_context_t *init_XCB_server()
+{
+ Server_context_t *info;
+
+ if (!(info = malloc(sizeof(Server_context_t)))) {
+ fprintf(stderr, "memory allocation failed.\n");
+ return NULL;
+ }
+
+ info->con = xcb_connect(NULL, &info->scr_nbr);
+ if (xcb_connection_has_error(info->con) > 0) {
+ fprintf(stderr, "Error opening display.\n");
+ free(info);
+ return NULL;
+ }
+
+ info->iter = xcb_setup_roots_iterator(xcb_get_setup(info->con));
+ for (; info->iter.rem; --info->scr_nbr, xcb_screen_next(&info->iter))
+ if (info->scr_nbr == 0) {
+ info->scr = info->iter.data;
+ break;
+ }
+
+ return info;
+}
+
+xcb_window_t create_win(Server_context_t *info)
+{
+ xcb_gcontext_t gc;
+ xcb_window_t win;
+ u32 vmask, vlist[2];
+
+ // create gc
+ win = info->scr->root;
+ gc = xcb_generate_id(info->con);
+ vmask = XCB_GC_FOREGROUND |
+ /*
+ XCB_GC_LINE_WIDTH |
+ XCB_GC_LINE_STYLE |
+ XCB_GC_FILL_STYLE |
+ XCB_GC_ARC_MODE |
+ */
+ XCB_GC_GRAPHICS_EXPOSURES;
+ vlist[0] = info->scr->black_pixel;
+ vlist[1] = 0;
+ xcb_create_gc (info->con, gc, win, vmask, vlist);
+
+ // create window
+ win = xcb_generate_id(info->con);
+ vmask = XCB_CW_BACK_PIXEL | XCB_CW_EVENT_MASK;
+ vlist[0] = /* 0 */ info->scr->white_pixel;
+ vlist[1] = XCB_EVENT_MASK_EXPOSURE | // window is exposed, needs to be redrawn
+ XCB_EVENT_MASK_BUTTON_PRESS |
+ XCB_EVENT_MASK_BUTTON_RELEASE |
+ XCB_EVENT_MASK_BUTTON_1_MOTION | // mouse is dragging
+ XCB_EVENT_MASK_POINTER_MOTION | // mouse is moving without clicking
+ XCB_MOTION_NOTIFY |
+ XCB_EVENT_MASK_BUTTON_MOTION |
+ /*
+ XCB_MOTION_NOTIFY |
+ XCB_EVENT_MASK_EXPOSURE |
+ XCB_EVENT_MASK_BUTTON_PRESS |
+ XCB_EVENT_MASK_BUTTON_RELEASE; // keyboard
+ XCB_KEY_PRESS |
+ XCB_EVENT_MASK_KEY_PRESS |
+ */
+ XCB_KEY_PRESS |
+ XCB_KEY_RELEASE;
+
+ xcb_create_window(info->con,
+ XCB_COPY_FROM_PARENT,
+ win,
+ info->scr->root,
+ 0, 0,
+ info->scr->width_in_pixels,
+ info->scr->height_in_pixels,
+ 10, // boarder width
+ XCB_WINDOW_CLASS_INPUT_OUTPUT,
+ info->scr->root_visual,
+ vmask, vlist
+ );
+
+ xcb_map_window(info->con, win);
+ xcb_flush(info->con);
+
+ return win;
+}
+
+xcb_cursor_t cursor_set(xcb_connection_t *c, xcb_screen_t *scr, xcb_window_t win, u32 cid)
+{
+ xcb_font_t font;
+ xcb_cursor_t ptr;
+ u32 mask;
+ u32 value_list;
+
+ font = xcb_generate_id(c);
+ xcb_open_font(c, font, strlen("cursor"), "cursor");
+ ptr = xcb_generate_id(c);
+ xcb_create_glyph_cursor(c,
+ ptr,
+ font, font,
+ cid, cid,
+ 0, 0, 0,
+ 0, 0, 0);
+
+
+ mask = XCB_CW_CURSOR;
+ value_list = ptr;
+ xcb_change_window_attributes(c, win, mask, &value_list);
+ xcb_flush(c);
+
+ return ptr;
+}
+
+void cursor_die(xcb_connection_t *c, xcb_window_t win, u32 value_list)
+{
+ value_list = 0;
+ xcb_change_window_attributes(c, win, XCB_CW_CURSOR, &value_list);
+ // xcb_free_cursor(c, value_list);
+ xcb_flush(c);
+}
+
+const char *ksym_to_str(const xcb_keysym_t *ksym)
+{
+ switch (*ksym) {
+ case XK_Escape: return "Escape";
+ case XK_q: return "q";
+ case XK_Q: return "Q";
+ case XK_l: return "l";
+ case XK_w: return "w";
+ case XK_c: return "c";
+ case XK_r: return "r";
+ default: return NULL;
+ }
+
+ return NULL;
+}
+
+void die(xcb_key_symbols_t *sym, Server_context_t *s_info, xcb_drawable_t win)
+{
+ xcb_key_symbols_free(sym);
+ xcb_free_gc(s_info->con, win);
+ xcb_disconnect(s_info->con);
+ free(s_info);
+ exit(0);
+}