diff --git a/libs/define.c b/libs/define.c deleted file mode 100644 index 08d9c40..0000000 --- a/libs/define.c +++ /dev/null @@ -1,10 +0,0 @@ -/* See LICENSE file for copyright and license details. */ - -#define INTERSECT(x,y,w,h,r) (MAX(0, MIN((x)+(w),(r).x_org+(r).width) - MAX((x),(r).x_org)) \ - && MAX(0, MIN((y)+(h),(r).y_org+(r).height) - MAX((y),(r).y_org))) -#define LENGTH(X) (sizeof X / sizeof X[0]) -#define TEXTW(X) (draw_font_getwidth(draw, (X), False) + sp.lrpad) -#define TEXTWM(X) (draw_font_getwidth(draw, (X), True) + sp.lrpad) -#define NUMBERSMAXDIGITS 100 -#define NUMBERSBUFSIZE (NUMBERSMAXDIGITS * 2) + 1 -#define MAXITEMLENGTH 1024 diff --git a/libs/draw/draw.c b/libs/draw/draw.c index 4d2f139..0f5a928 100644 --- a/libs/draw/draw.c +++ b/libs/draw/draw.c @@ -8,7 +8,6 @@ #include #include "draw.h" -#include "../main.h" #ifndef X11 #define USEX 0 @@ -26,7 +25,7 @@ #include #endif -void cairo_set_source_hex(cairo_t* cr, const char *col, int alpha) { +void draw_cairo_set_source_hex(cairo_t* cr, const char *col, int alpha) { unsigned int hex; sscanf(col, "#%x", &hex); @@ -40,7 +39,7 @@ void cairo_set_source_hex(cairo_t* cr, const char *col, int alpha) { #if USEX Draw_t *draw_create_x11(Display *dpy, int screen, Window root, unsigned int w, unsigned int h, Visual *visual, unsigned int depth, Colormap cmap, int protocol) { - Draw_t *draw = ecalloc(1, sizeof(Draw_t)); + Draw_t *draw = draw_calloc(1, sizeof(Draw_t)); draw->protocol = protocol; draw->dpy = dpy; @@ -61,7 +60,7 @@ Draw_t *draw_create_x11(Display *dpy, int screen, Window root, unsigned int w, u #if USEWAYLAND Draw_t *draw_create_wl(int protocol) { - Draw_t *draw = ecalloc(1, sizeof(Draw_t)); + Draw_t *draw = draw_calloc(1, sizeof(Draw_t)); draw->protocol = protocol; @@ -112,10 +111,10 @@ static Fnt *font_create(Draw_t *draw, const char *fontname) { PangoFontMetrics *metrics; if (!fontname) { - die("spmenu: no font specified."); + draw_die("font_create(): no font specified."); } - font = ecalloc(1, sizeof(Fnt)); + font = draw_calloc(1, sizeof(Fnt)); font->dpy = draw->dpy; fontmap = pango_cairo_font_map_new(); @@ -176,7 +175,7 @@ void draw_arrow(Draw_t *draw, int x, int y, unsigned int w, unsigned int h, int } cairo_t *cr = cairo_create(sf); - cairo_set_source_hex(cr, prevcol, prevalpha); + draw_cairo_set_source_hex(cr, prevcol, prevalpha); cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE); cairo_rectangle(cr, x, y, w, h); @@ -187,7 +186,7 @@ void draw_arrow(Draw_t *draw, int x, int y, unsigned int w, unsigned int h, int cairo_line_to(cr, x, y + h); cairo_close_path(cr); - cairo_set_source_hex(cr, nextcol, nextalpha); + draw_cairo_set_source_hex(cr, nextcol, nextalpha); cairo_fill(cr); cairo_destroy(cr); @@ -208,7 +207,7 @@ void draw_circle(Draw_t *draw, int x, int y, unsigned int w, unsigned int h, int cairo_t *cr = cairo_create(sf); - cairo_set_source_hex(cr, prevcol, prevalpha); + draw_cairo_set_source_hex(cr, prevcol, prevalpha); cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE); // draw rectangle @@ -226,7 +225,7 @@ void draw_circle(Draw_t *draw, int x, int y, unsigned int w, unsigned int h, int cairo_arc(cr, cx, cy, rad, start, end); cairo_close_path(cr); - cairo_set_source_hex(cr, nextcol, nextalpha); + draw_cairo_set_source_hex(cr, nextcol, nextalpha); cairo_fill(cr); cairo_destroy(cr); @@ -248,10 +247,10 @@ void draw_rect(Draw_t *draw, int x, int y, unsigned int w, unsigned int h, int f cairo_t *cr = cairo_create(sf); if (!cr) { - die("failed to create cairo context"); + draw_die("draw_rect(): failed to create cairo context"); } - cairo_set_source_hex(cr, invert ? bgcol : fgcol, invert ? bgalpha : fgalpha); + draw_cairo_set_source_hex(cr, invert ? bgcol : fgcol, invert ? bgalpha : fgalpha); cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE); if (filled) { @@ -292,7 +291,7 @@ int draw_text(Draw_t *draw, int x, int y, unsigned int w, unsigned int h, unsign draw->d = cairo_create(draw->surface); // draw bg - cairo_set_source_hex(draw->d, invert ? fgcol : bgcol, invert ? fgalpha : bgalpha); + draw_cairo_set_source_hex(draw->d, invert ? fgcol : bgcol, invert ? fgalpha : bgalpha); cairo_set_operator(draw->d, CAIRO_OPERATOR_SOURCE); cairo_rectangle(draw->d, x - lpad, y, w + lpad, h); cairo_fill(draw->d); @@ -328,7 +327,7 @@ int draw_text(Draw_t *draw, int x, int y, unsigned int w, unsigned int h, unsign pango_layout_set_single_paragraph_mode(draw->font->layout, True); // draw fg - cairo_set_source_hex(draw->d, fgcol, fgalpha); + draw_cairo_set_source_hex(draw->d, fgcol, fgalpha); cairo_move_to(draw->d, x, y + (h - draw->font->h) / 2); // update and show layout @@ -433,3 +432,28 @@ unsigned int draw_fontset_getwidth_clamp(Draw_t *draw, const char *text, unsigne tmp = draw_text(draw, 0, 0, 0, 0, 0, text, n, markup, "#000000", "#000000", 255, 255); return MIN(n, tmp); } + +void draw_die(const char *fmt, ...) { + va_list ap; + + va_start(ap, fmt); + vfprintf(stderr, fmt, ap); + va_end(ap); + + if (fmt[0] && fmt[strlen(fmt)-1] == ':') { + fputc(' ', stderr); + perror(NULL); + } else { + fputc('\n', stderr); + } + + exit(1); +} + +void *draw_calloc(size_t nmemb, size_t size) { + void *p; + + if (!(p = calloc(nmemb, size))) + draw_die("draw_calloc:"); + return p; +} diff --git a/libs/draw/draw.h b/libs/draw/draw.h index 95b085f..1425ea2 100644 --- a/libs/draw/draw.h +++ b/libs/draw/draw.h @@ -33,7 +33,7 @@ typedef struct { } Draw_t; /* Cairo color convertion */ -void cairo_set_source_hex(cairo_t* cr, const char *col, int alpha); +void draw_cairo_set_source_hex(cairo_t* cr, const char *col, int alpha); /* Cairo image drawing */ void draw_img(Draw_t *draw, int x, int y); @@ -67,3 +67,7 @@ void draw_circle(Draw_t *draw, int x, int y, unsigned int w, unsigned int h, int /* Screenshot functions */ void draw_save_screen(Draw_t *draw, const char *file); + +/* Misc */ +void draw_die(const char *fmt, ...); +void *draw_calloc(size_t nmemb, size_t size); diff --git a/libs/main.c b/libs/main.c index bb8555e..f0a27d5 100644 --- a/libs/main.c +++ b/libs/main.c @@ -1,18 +1,45 @@ /* See LICENSE file for copyright and license details. */ + #include #include #include #include -#include "main.h" +#ifndef MAX +#define MAX(A, B) ((A) > (B) ? (A) : (B)) +#endif +#ifndef MIN +#define MIN(A, B) ((A) < (B) ? (A) : (B)) +#endif +#ifndef BETWEEN +#define BETWEEN(X, A, B) ((A) <= (X) && (X) <= (B)) +#endif +#ifndef INTERSECT +#define INTERSECT(x,y,w,h,r) (MAX(0, MIN((x)+(w),(r).x_org+(r).width) - MAX((x),(r).x_org)) \ + && MAX(0, MIN((y)+(h),(r).y_org+(r).height) - MAX((y),(r).y_org))) +#endif +#ifndef LENGTH +#define LENGTH(X) (sizeof X / sizeof X[0]) +#endif +#ifndef TEXTW +#define TEXTW(X) (draw_font_getwidth(draw, (X), False) + sp.lrpad) +#endif +#ifndef TEXTWM +#define TEXTWM(X) (draw_font_getwidth(draw, (X), True) + sp.lrpad) +#endif +#ifndef NUMBERSMAXDIGITS +#define NUMBERSMAXDIGITS 100 +#endif +#ifndef NUMBERSBUFSIZE +#define NUMBERSBUFSIZE (NUMBERSMAXDIGITS * 2) + 1 +#endif +#ifndef MAXITEMLENGTH +#define MAXITEMLENGTH 1024 +#endif -void * ecalloc(size_t nmemb, size_t size) { - void *p; - - if (!(p = calloc(nmemb, size))) - die("calloc:"); - return p; -} +size_t sp_strncpy(char *restrict dst, const char *restrict src, size_t size); +void die(const char *fmt, ...); +void *ecalloc(size_t nmemb, size_t size); size_t sp_strncpy(char *restrict dst, const char *restrict src, size_t size) { int offset; @@ -55,3 +82,11 @@ void die(const char *fmt, ...) { exit(1); } + +void *ecalloc(size_t nmemb, size_t size) { + void *p; + + if (!(p = calloc(nmemb, size))) + die("calloc:"); + return p; +} diff --git a/libs/main.h b/libs/main.h deleted file mode 100644 index 33f45eb..0000000 --- a/libs/main.h +++ /dev/null @@ -1,13 +0,0 @@ -/* See LICENSE file for copyright and license details. */ - -#ifndef MAX -#define MAX(A, B) ((A) > (B) ? (A) : (B)) -#endif -#ifndef MIN -#define MIN(A, B) ((A) < (B) ? (A) : (B)) -#endif -#define BETWEEN(X, A, B) ((A) <= (X) && (X) <= (B)) - -void die(const char *fmt, ...); -void *ecalloc(size_t nmemb, size_t size); -size_t sp_strncpy(char *dest, const char *src, size_t size); diff --git a/libs/rtl.c b/libs/rtl.c index ccb3021..967959b 100644 --- a/libs/rtl.c +++ b/libs/rtl.c @@ -1,5 +1,9 @@ /* See LICENSE file for copyright and license details. */ +#if USERTL +#include +#endif + static char fribidi_text[BUFSIZ] = ""; static void apply_fribidi(char *str); diff --git a/meson.build b/meson.build index 0a199a4..9c9dd1b 100644 --- a/meson.build +++ b/meson.build @@ -10,7 +10,6 @@ cc = meson.get_compiler('c') project_source_files = [ 'libs/draw/draw.c', 'spmenu.c', - 'libs/main.c', ] project_dependencies = [ diff --git a/spmenu.c b/spmenu.c index a563b33..2605e8b 100644 --- a/spmenu.c +++ b/spmenu.c @@ -12,90 +12,62 @@ #include #include #include +#include "libs/draw/draw.h" +#include "libs/main.c" -// set version #ifndef VERSION #define VERSION "unknown" #endif -// check if we should enable right to left language support #ifndef RTL #define USERTL 0 #else #define USERTL 1 #endif -// check if we should enable image support #ifndef IMAGE #define USEIMAGE 0 #else #define USEIMAGE 1 #endif -// check if we should enable multimonitor support using libXinerama #ifndef XINERAMA #define USEXINERAMA 0 #else #define USEXINERAMA 1 #endif -// check if we should enable config file support using libconfig #ifndef CONFIG #define USECONFIG 0 #else #define USECONFIG 1 #endif -// check if we should enable .Xresources support #ifndef XRESOURCES #define USEXRESOURCES 0 #else #define USEXRESOURCES 1 #endif -// check if we should enable Wayland support #ifndef WAYLAND #define USEWAYLAND 0 #else #define USEWAYLAND 1 #endif -// check if we should enable X11 support #ifndef X11 #define USEX 0 #else #define USEX 1 #endif -// check if we should enable regex matching #ifndef REGEX #define USEREGEX 0 #else #define USEREGEX 1 #endif -// include fribidi used for right to left language support -#if USERTL -#include -#endif - -// include libraries used for image support -#if USEIMAGE -#include -#include -#include -#include -#endif - -// include Xlib -#if USEX -#include -#endif - -// include macros and other defines -#include "libs/define.c" - -enum { // click enum +enum { ClickWindow, ClickPrompt, ClickInput, @@ -209,8 +181,6 @@ static struct item *selecteditem; // selected item static struct item *mouseitem; // clicked item // various headers -#include "libs/draw/draw.h" -#include "libs/main.h" #include "libs/draw.h" #include "libs/stream.h" #include "libs/arg.h" @@ -262,7 +232,7 @@ static char *(*fstrstr)(const char *, const char *) = cistrstr; #if USEX static void pastesel(void); -static void grabfocus(void); // focus doesn't need to be grabbed on wayland +static void grabfocus(void); #endif static char **list; @@ -273,6 +243,20 @@ static size_t listsize; static char *fonts[] = { font }; +// include functions +#include "libs/img.c" +#include "libs/icon.c" +#include "libs/rtl.c" +#include "libs/sort.c" +#include "libs/match.c" +#include "libs/schemes.c" +#include "libs/draw.c" +#include "libs/conf/config.c" +#include "libs/argv.c" +#include "libs/history.c" +#include "libs/arg.c" +#include "libs/stream.c" + #if USEX static Key keys[] = { { -1, 0, XK_Return, selectitem, {.i = +1 } }, @@ -349,20 +333,6 @@ static WlMouse wl_buttons[] = { }; #endif -// include functions -#include "libs/img.c" -#include "libs/icon.c" -#include "libs/rtl.c" -#include "libs/sort.c" -#include "libs/match.c" -#include "libs/schemes.c" -#include "libs/draw.c" -#include "libs/conf/config.c" -#include "libs/argv.c" -#include "libs/history.c" -#include "libs/arg.c" -#include "libs/stream.c" - #include "libs/x11/inc.c" #include "libs/wl/inc.c"