From 88be7c1ea7b8a0eb1909b3ad43ebb8c0ee37a052 Mon Sep 17 00:00:00 2001 From: ben Date: Tue, 8 Oct 2024 16:20:36 -0700 Subject: Connection to X, GC and window creation --- src/Makefile | 4 +-- src/main.c | 43 ----------------------------- src/scapx.c | 89 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/scapx.h | 21 +++++++++----- src/x.c | 0 5 files changed, 105 insertions(+), 52 deletions(-) delete mode 100644 src/main.c create mode 100644 src/scapx.c create mode 100644 src/x.c (limited to 'src') diff --git a/src/Makefile b/src/Makefile index 4b00009..7b4ec09 100644 --- a/src/Makefile +++ b/src/Makefile @@ -3,12 +3,12 @@ CFLAGS = -Wall -Wextra -Wpedantic -std=c99 -Wunreachable-code -Werror-implici LD_CFLAGS = -lxcb BIN_DIR = ../bin TARGET = $(BIN_DIR)/scapx -#SRC = main.c +SRC = scapx.c #HEADERS = scapx.h all: - $(CC) $(CFLAGS) $(LD_CFLAGS) -o $(BIN_DIR)/scapx main.c + $(CC) $(CFLAGS) $(LD_CFLAGS) -o $(BIN_DIR)/scapx $(SRC) $(BIN_DIR): mkdir -p $(BIN_DIR) diff --git a/src/main.c b/src/main.c deleted file mode 100644 index 0230dfd..0000000 --- a/src/main.c +++ /dev/null @@ -1,43 +0,0 @@ -#include "scapx.h" - - -Scr_info *init_XCB_server() -{ - Scr_info *info = malloc(sizeof(Scr_info)); - if (!info) { - fprintf(stderr, "memory allocation failed.\n"); - return NULL; - } - - info->con = xcb_connect(NULL, NULL); - if (xcb_connection_has_error(info->con) > 0) { - fprintf(stderr, "Error opening display.\n"); - free(info); - return NULL; - } - - const xcb_setup_t *setup = xcb_get_setup(info->con); - info->scr = xcb_setup_roots_iterator(setup).data; - - return info; -} - -int main() -{ - Scr_info *info = init_XCB_server(); - - if (!info || !info->scr) { - fprintf(stderr, "Error opening display.\n"); - if (info) { - xcb_disconnect(info->con); - free(info); - } - exit(EXIT_FAILURE); - } - - // TODO: event loop - - xcb_disconnect(info->con); - free(info); - return 0; -} diff --git a/src/scapx.c b/src/scapx.c new file mode 100644 index 0000000..09b597e --- /dev/null +++ b/src/scapx.c @@ -0,0 +1,89 @@ +// std +#include +#include +#include + +// local +#include "scapx.h" +#include "defs.h" + +// TODO: move this all to x.c + +static Server_context_t *init_XCB_server(); +static xcb_window_t create_win(Server_context_t *info); + +static 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; +} + +static 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_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] = info->scr->white_pixel; + vlist[1] = XCB_EVENT_MASK_EXPOSURE; + + xcb_create_window(info->con, + XCB_COPY_FROM_PARENT, + win, + info->scr->root, + 0, 0, + 150, 150, + 10, + XCB_WINDOW_CLASS_INPUT_OUTPUT, + info->scr->root_visual, + vmask, vlist + ); + xcb_map_window(info->con, win); + xcb_flush(info->con); + + return win; +} + +int main(int argc, char **argv) +{ + // TODO: Parse flags + + Server_context_t *serv_context = init_XCB_server(); + xcb_drawable_t win = create_win(serv_context); + pause(); + + xcb_disconnect(serv_context->con); + free(serv_context); + return 0; +} diff --git a/src/scapx.h b/src/scapx.h index 0615e47..00659d5 100644 --- a/src/scapx.h +++ b/src/scapx.h @@ -1,17 +1,24 @@ #ifndef SCAPX_H #define SCAPX_H -#include -#include #include +#define OPTS(msg) \ + do { \ + fprintf(stderr, "Usage: scapx\n"); \ + fprintf(stderr, "%s\n\n\n", msg); \ + fprintf(stdout, "-d, --display\t\t capture a specific display\n"); \ + fprintf(stdout, "-a, --a\t\t\t capture all displays\n"); \ + fprintf(stdout, "-h, --help\t\t print this menu and quit. Alternatively, man scapx\n"); \ + fprintf(stdout, "-v, --version\t\t print program version and quit\n\n"); \ + exit(EXIT_FAILURE); \ + } while (0) + typedef struct { xcb_connection_t *con; xcb_screen_t *scr; -} Scr_info; - - -/* Connects to the X Server, and accesses the screen */ -Scr_info *init_XCB_server(); + xcb_screen_iterator_t iter; + int scr_nbr; +} Server_context_t; #endif diff --git a/src/x.c b/src/x.c new file mode 100644 index 0000000..e69de29 -- cgit v1.2.3