summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorben <ben.nagy@arachnida.blog>2024-10-08 16:20:36 -0700
committerben <ben.nagy@arachnida.blog>2024-10-08 16:20:36 -0700
commit88be7c1ea7b8a0eb1909b3ad43ebb8c0ee37a052 (patch)
tree0c7dee867d4f1449de7297e4dd049c8f529f4485 /src
parent3b65d725ff54fd389b9930dc3cda5af6a6c028ed (diff)
Connection to X, GC and window creation
Diffstat (limited to 'src')
-rw-r--r--src/Makefile4
-rw-r--r--src/main.c43
-rw-r--r--src/scapx.c89
-rw-r--r--src/scapx.h21
-rw-r--r--src/x.c0
5 files changed, 105 insertions, 52 deletions
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 <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+// 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 <stdio.h>
-#include <stdlib.h>
#include <xcb/xcb.h>
+#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
--- /dev/null
+++ b/src/x.c