diff options
author | Jeff Becker <ampernand@gmail.com> | 2016-10-17 10:05:29 -0400 |
---|---|---|
committer | Jeff Becker <ampernand@gmail.com> | 2016-10-17 10:05:29 -0400 |
commit | ce1da9219745261f04610cd1846c6438d7ab8c4d (patch) | |
tree | 39b309ca99ca3b9843eb1aeb3e40ec9f7a062f9f /include | |
parent | c7364b21084917e6dc4b166a8a2e9896fda6573d (diff) | |
download | wterm-ce1da9219745261f04610cd1846c6438d7ab8c4d.zip wterm-ce1da9219745261f04610cd1846c6438d7ab8c4d.tar.gz wterm-ce1da9219745261f04610cd1846c6438d7ab8c4d.tar.bz2 |
make it compile
Diffstat (limited to 'include')
-rw-r--r-- | include/arg.h | 63 | ||||
-rw-r--r-- | include/config.h | 400 | ||||
-rw-r--r-- | include/wld/drm-private.h | 46 | ||||
-rw-r--r-- | include/wld/drm.h | 52 | ||||
-rw-r--r-- | include/wld/pixman.h | 44 | ||||
-rw-r--r-- | include/wld/wayland-private.h | 60 | ||||
-rw-r--r-- | include/wld/wayland.h | 84 | ||||
-rw-r--r-- | include/wld/wld-private.h | 243 | ||||
-rw-r--r-- | include/wld/wld.h | 283 |
9 files changed, 1275 insertions, 0 deletions
diff --git a/include/arg.h b/include/arg.h new file mode 100644 index 0000000..4df77a7 --- /dev/null +++ b/include/arg.h @@ -0,0 +1,63 @@ +/* + * Copy me if you can. + * by 20h + */ + +#ifndef ARG_H__ +#define ARG_H__ + +extern char *argv0; + +/* use main(int argc, char *argv[]) */ +#define ARGBEGIN for (argv0 = *argv, argv++, argc--;\ + argv[0] && argv[0][1]\ + && argv[0][0] == '-';\ + argc--, argv++) {\ + char argc_;\ + char **argv_;\ + int brk_;\ + if (argv[0][1] == '-' && argv[0][2] == '\0') {\ + argv++;\ + argc--;\ + break;\ + }\ + for (brk_ = 0, argv[0]++, argv_ = argv;\ + argv[0][0] && !brk_;\ + argv[0]++) {\ + if (argv_ != argv)\ + break;\ + argc_ = argv[0][0];\ + switch (argc_) + +/* Handles obsolete -NUM syntax */ +#define ARGNUM case '0':\ + case '1':\ + case '2':\ + case '3':\ + case '4':\ + case '5':\ + case '6':\ + case '7':\ + case '8':\ + case '9' + +#define ARGEND }\ + } + +#define ARGC() argc_ + +#define ARGNUMF(base) (brk_ = 1, estrtol(argv[0], (base))) + +#define EARGF(x) ((argv[0][1] == '\0' && argv[1] == NULL)?\ + ((x), abort(), (char *)0) :\ + (brk_ = 1, (argv[0][1] != '\0')?\ + (&argv[0][1]) :\ + (argc--, argv++, argv[0]))) + +#define ARGF() ((argv[0][1] == '\0' && argv[1] == NULL)?\ + (char *)0 :\ + (brk_ = 1, (argv[0][1] != '\0')?\ + (&argv[0][1]) :\ + (argc--, argv++, argv[0]))) + +#endif diff --git a/include/config.h b/include/config.h index e69de29..4e3c1da 100644 --- a/include/config.h +++ b/include/config.h @@ -0,0 +1,400 @@ +/* See LICENSE file for copyright and license details. */ + +/* + * appearance + * + * font: see http://freedesktop.org/software/fontconfig/fontconfig-user.html + */ +static char font[] = "Liberation Mono:pixelsize=12:antialias=false:autohint=false"; +static int borderpx = 2; + +/* + * terminal transparency + */ +static uint8_t term_alpha = 0xaa; + +/* + * What program is execed by st depends of these precedence rules: + * 1: program passed with -e + * 2: utmp option + * 3: SHELL environment variable + * 4: value of shell in /etc/passwd + * 5: value of shell in config.h + */ +static char shell[] = "/bin/sh"; +static char *utmp = NULL; +static char stty_args[] = "stty raw -echo -iexten echonl"; + +/* identification sequence returned in DA and DECID */ +static char vtiden[] = "\033[?6c"; + +/* Kerning / character bounding-box multipliers */ +static float cwscale = 1.0; +static float chscale = 1.0; + +/* + * word delimiter string + * + * More advanced example: " `'\"()[]{}" + */ +static char worddelimiters[] = " "; + +/* selection timeouts (in milliseconds) */ +static unsigned int doubleclicktimeout = 300; +static unsigned int tripleclicktimeout = 600; + +/* key repeat timeouts (in milliseconds) */ +static unsigned int keyrepeatdelay = 500; +static unsigned int keyrepeatinterval = 25; + +/* alt screens */ +static int allowaltscreen = 1; + +/* + * blinking timeout (set to 0 to disable blinking) for the terminal blinking + * attribute. + */ +static unsigned int blinktimeout = 800; + +/* + * thickness of underline and bar cursors + */ +static unsigned int cursorthickness = 2; + +/* + * bell volume. It must be a value between -100 and 100. Use 0 for disabling + * it + */ +/* XXX: Wayland does not have a bell. + * static int bellvolume = 0; + */ + +/* TERM value */ +static char termname[] = "st-256color"; + +static unsigned int tabspaces = 8; + + +/* Terminal colors (16 first used in escape sequence) */ +static const char *colorname[] = { + /* 8 normal colors */ + "black", + "red3", + "green3", + "yellow3", + "blue2", + "magenta3", + "cyan3", + "gray90", + + /* 8 bright colors */ + "gray50", + "red", + "green", + "yellow", + "#5c5cff", + "magenta", + "cyan", + "white", + + [255] = 0, + /* more colors can be added after 255 to use with DefaultXX */ +}; + + +/* + * Default colors (colorname index) + * foreground, background, cursor + */ +static unsigned int defaultfg = 7; +static unsigned int defaultbg = 0; +static unsigned int defaultcs = 255; + + +/* + * Default shape of the mouse cursor + */ +static char mouseshape[] = "xterm"; + +/* + * Colors used, when the specific fg == defaultfg. So in reverse mode this + * will reverse too. Another logic would only make the simple feature too + * complex. + */ +static unsigned int defaultitalic = 11; +static unsigned int defaultunderline = 7; + +/* Internal mouse shortcuts. */ +/* Beware that overloading Button1 will disable the selection. */ +static Mousekey mshortcuts[] = { + /* button mask string */ + { -1, MOD_MASK_NONE, "" } +}; + +static Axiskey ashortcuts[] = { + /* axis direction mask string */ + { AXIS_VERTICAL, +1, MOD_MASK_ANY, "\031"}, + { AXIS_VERTICAL, -1, MOD_MASK_ANY, "\005"}, +}; + +/* Internal keyboard shortcuts. */ +#define MODKEY MOD_MASK_ALT + +static Shortcut shortcuts[] = { + /* modifier key function argument */ + { MOD_MASK_CTRL, XKB_KEY_Print, toggleprinter, {.i = 0} }, + { MOD_MASK_SHIFT, XKB_KEY_Print, printscreen, {.i = 0} }, + { MOD_MASK_ANY, XKB_KEY_Print, printsel, {.i = 0} }, + { MODKEY|MOD_MASK_SHIFT, XKB_KEY_Prior, wlzoom, {.f = +1} }, + { MODKEY|MOD_MASK_SHIFT, XKB_KEY_Next, wlzoom, {.f = -1} }, + { MODKEY|MOD_MASK_SHIFT, XKB_KEY_Home, wlzoomreset, {.f = 0} }, + { MOD_MASK_SHIFT, XKB_KEY_Insert, selpaste, {.i = 0} }, + { MODKEY, XKB_KEY_Num_Lock, numlock, {.i = 0} }, +}; + +/* + * Special keys (change & recompile st.info accordingly) + * + * Mask value: + * * Use MOD_MASK_ANY to match the key no matter modifiers state + * * Use MOD_MASK_NONE to match the key alone (no modifiers) + * appkey value: + * * 0: no value + * * > 0: keypad application mode enabled + * * = 2: term.numlock = 1 + * * < 0: keypad application mode disabled + * appcursor value: + * * 0: no value + * * > 0: cursor application mode enabled + * * < 0: cursor application mode disabled + * crlf value + * * 0: no value + * * > 0: crlf mode is enabled + * * < 0: crlf mode is disabled + * + * Be careful with the order of the definitions because st searches in + * this table sequentially, so any MOD_MASK_ANY must be in the last + * position for a key. + */ + +/* + * If you want keys other than the X11 function keys (0xFD00 - 0xFFFF) + * to be mapped below, add them to this array. + */ +static xkb_keysym_t mappedkeys[] = { -1 }; + +/* State bits to ignore when matching key or button events. */ +static uint ignoremod = 0; + +/* Override mouse-select while mask is active (when MODE_MOUSE is set). + * Note that if you want to use MOD_MASK_SHIFT with selmasks, set this to an + * other modifier, set to 0 to not use it. */ +static uint forceselmod = MOD_MASK_SHIFT; + +static Key key[] = { + /* keysym mask string appkey appcursor crlf */ + { XKB_KEY_KP_Home, MOD_MASK_SHIFT, "\033[2J", 0, -1, 0}, + { XKB_KEY_KP_Home, MOD_MASK_SHIFT, "\033[1;2H", 0, +1, 0}, + { XKB_KEY_KP_Home, MOD_MASK_ANY, "\033[H", 0, -1, 0}, + { XKB_KEY_KP_Home, MOD_MASK_ANY, "\033[1~", 0, +1, 0}, + { XKB_KEY_KP_Up, MOD_MASK_ANY, "\033Ox", +1, 0, 0}, + { XKB_KEY_KP_Up, MOD_MASK_ANY, "\033[A", 0, -1, 0}, + { XKB_KEY_KP_Up, MOD_MASK_ANY, "\033OA", 0, +1, 0}, + { XKB_KEY_KP_Down, MOD_MASK_ANY, "\033Or", +1, 0, 0}, + { XKB_KEY_KP_Down, MOD_MASK_ANY, "\033[B", 0, -1, 0}, + { XKB_KEY_KP_Down, MOD_MASK_ANY, "\033OB", 0, +1, 0}, + { XKB_KEY_KP_Left, MOD_MASK_ANY, "\033Ot", +1, 0, 0}, + { XKB_KEY_KP_Left, MOD_MASK_ANY, "\033[D", 0, -1, 0}, + { XKB_KEY_KP_Left, MOD_MASK_ANY, "\033OD", 0, +1, 0}, + { XKB_KEY_KP_Right, MOD_MASK_ANY, "\033Ov", +1, 0, 0}, + { XKB_KEY_KP_Right, MOD_MASK_ANY, "\033[C", 0, -1, 0}, + { XKB_KEY_KP_Right, MOD_MASK_ANY, "\033OC", 0, +1, 0}, + { XKB_KEY_KP_Prior, MOD_MASK_SHIFT, "\033[5;2~", 0, 0, 0}, + { XKB_KEY_KP_Prior, MOD_MASK_ANY, "\033[5~", 0, 0, 0}, + { XKB_KEY_KP_Begin, MOD_MASK_ANY, "\033[E", 0, 0, 0}, + { XKB_KEY_KP_End, MOD_MASK_CTRL, "\033[J", -1, 0, 0}, + { XKB_KEY_KP_End, MOD_MASK_CTRL, "\033[1;5F", +1, 0, 0}, + { XKB_KEY_KP_End, MOD_MASK_SHIFT, "\033[K", -1, 0, 0}, + { XKB_KEY_KP_End, MOD_MASK_SHIFT, "\033[1;2F", +1, 0, 0}, + { XKB_KEY_KP_End, MOD_MASK_ANY, "\033[4~", 0, 0, 0}, + { XKB_KEY_KP_Next, MOD_MASK_SHIFT, "\033[6;2~", 0, 0, 0}, + { XKB_KEY_KP_Next, MOD_MASK_ANY, "\033[6~", 0, 0, 0}, + { XKB_KEY_KP_Insert, MOD_MASK_SHIFT, "\033[2;2~", +1, 0, 0}, + { XKB_KEY_KP_Insert, MOD_MASK_SHIFT, "\033[4l", -1, 0, 0}, + { XKB_KEY_KP_Insert, MOD_MASK_CTRL, "\033[L", -1, 0, 0}, + { XKB_KEY_KP_Insert, MOD_MASK_CTRL, "\033[2;5~", +1, 0, 0}, + { XKB_KEY_KP_Insert, MOD_MASK_ANY, "\033[4h", -1, 0, 0}, + { XKB_KEY_KP_Insert, MOD_MASK_ANY, "\033[2~", +1, 0, 0}, + { XKB_KEY_KP_Delete, MOD_MASK_CTRL, "\033[M", -1, 0, 0}, + { XKB_KEY_KP_Delete, MOD_MASK_CTRL, "\033[3;5~", +1, 0, 0}, + { XKB_KEY_KP_Delete, MOD_MASK_SHIFT, "\033[2K", -1, 0, 0}, + { XKB_KEY_KP_Delete, MOD_MASK_SHIFT, "\033[3;2~", +1, 0, 0}, + { XKB_KEY_KP_Delete, MOD_MASK_ANY, "\033[P", -1, 0, 0}, + { XKB_KEY_KP_Delete, MOD_MASK_ANY, "\033[3~", +1, 0, 0}, + { XKB_KEY_KP_Multiply, MOD_MASK_ANY, "\033Oj", +2, 0, 0}, + { XKB_KEY_KP_Add, MOD_MASK_ANY, "\033Ok", +2, 0, 0}, + { XKB_KEY_KP_Enter, MOD_MASK_ANY, "\033OM", +2, 0, 0}, + { XKB_KEY_KP_Enter, MOD_MASK_ANY, "\r", -1, 0, -1}, + { XKB_KEY_KP_Enter, MOD_MASK_ANY, "\r\n", -1, 0, +1}, + { XKB_KEY_KP_Subtract, MOD_MASK_ANY, "\033Om", +2, 0, 0}, + { XKB_KEY_KP_Decimal, MOD_MASK_ANY, "\033On", +2, 0, 0}, + { XKB_KEY_KP_Divide, MOD_MASK_ANY, "\033Oo", +2, 0, 0}, + { XKB_KEY_KP_0, MOD_MASK_ANY, "\033Op", +2, 0, 0}, + { XKB_KEY_KP_1, MOD_MASK_ANY, "\033Oq", +2, 0, 0}, + { XKB_KEY_KP_2, MOD_MASK_ANY, "\033Or", +2, 0, 0}, + { XKB_KEY_KP_3, MOD_MASK_ANY, "\033Os", +2, 0, 0}, + { XKB_KEY_KP_4, MOD_MASK_ANY, "\033Ot", +2, 0, 0}, + { XKB_KEY_KP_5, MOD_MASK_ANY, "\033Ou", +2, 0, 0}, + { XKB_KEY_KP_6, MOD_MASK_ANY, "\033Ov", +2, 0, 0}, + { XKB_KEY_KP_7, MOD_MASK_ANY, "\033Ow", +2, 0, 0}, + { XKB_KEY_KP_8, MOD_MASK_ANY, "\033Ox", +2, 0, 0}, + { XKB_KEY_KP_9, MOD_MASK_ANY, "\033Oy", +2, 0, 0}, + { XKB_KEY_Up, MOD_MASK_SHIFT, "\033[1;2A", 0, 0, 0}, + { XKB_KEY_Up, MOD_MASK_CTRL, "\033[1;5A", 0, 0, 0}, + { XKB_KEY_Up, MOD_MASK_ALT, "\033[1;3A", 0, 0, 0}, + { XKB_KEY_Up, MOD_MASK_ANY, "\033[A", 0, -1, 0}, + { XKB_KEY_Up, MOD_MASK_ANY, "\033OA", 0, +1, 0}, + { XKB_KEY_Down, MOD_MASK_SHIFT, "\033[1;2B", 0, 0, 0}, + { XKB_KEY_Down, MOD_MASK_CTRL, "\033[1;5B", 0, 0, 0}, + { XKB_KEY_Down, MOD_MASK_ALT, "\033[1;3B", 0, 0, 0}, + { XKB_KEY_Down, MOD_MASK_ANY, "\033[B", 0, -1, 0}, + { XKB_KEY_Down, MOD_MASK_ANY, "\033OB", 0, +1, 0}, + { XKB_KEY_Left, MOD_MASK_SHIFT, "\033[1;2D", 0, 0, 0}, + { XKB_KEY_Left, MOD_MASK_CTRL, "\033[1;5D", 0, 0, 0}, + { XKB_KEY_Left, MOD_MASK_ALT, "\033[1;3D", 0, 0, 0}, + { XKB_KEY_Left, MOD_MASK_ANY, "\033[D", 0, -1, 0}, + { XKB_KEY_Left, MOD_MASK_ANY, "\033OD", 0, +1, 0}, + { XKB_KEY_Right, MOD_MASK_SHIFT, "\033[1;2C", 0, 0, 0}, + { XKB_KEY_Right, MOD_MASK_CTRL, "\033[1;5C", 0, 0, 0}, + { XKB_KEY_Right, MOD_MASK_ALT, "\033[1;3C", 0, 0, 0}, + { XKB_KEY_Right, MOD_MASK_ANY, "\033[C", 0, -1, 0}, + { XKB_KEY_Right, MOD_MASK_ANY, "\033OC", 0, +1, 0}, + { XKB_KEY_ISO_Left_Tab, MOD_MASK_SHIFT, "\033[Z", 0, 0, 0}, + { XKB_KEY_Return, MOD_MASK_ALT, "\033\r", 0, 0, -1}, + { XKB_KEY_Return, MOD_MASK_ALT, "\033\r\n", 0, 0, +1}, + { XKB_KEY_Return, MOD_MASK_ANY, "\r", 0, 0, -1}, + { XKB_KEY_Return, MOD_MASK_ANY, "\r\n", 0, 0, +1}, + { XKB_KEY_Insert, MOD_MASK_SHIFT, "\033[4l", -1, 0, 0}, + { XKB_KEY_Insert, MOD_MASK_SHIFT, "\033[2;2~", +1, 0, 0}, + { XKB_KEY_Insert, MOD_MASK_CTRL, "\033[L", -1, 0, 0}, + { XKB_KEY_Insert, MOD_MASK_CTRL, "\033[2;5~", +1, 0, 0}, + { XKB_KEY_Insert, MOD_MASK_ANY, "\033[4h", -1, 0, 0}, + { XKB_KEY_Insert, MOD_MASK_ANY, "\033[2~", +1, 0, 0}, + { XKB_KEY_Delete, MOD_MASK_CTRL, "\033[M", -1, 0, 0}, + { XKB_KEY_Delete, MOD_MASK_CTRL, "\033[3;5~", +1, 0, 0}, + { XKB_KEY_Delete, MOD_MASK_SHIFT, "\033[2K", -1, 0, 0}, + { XKB_KEY_Delete, MOD_MASK_SHIFT, "\033[3;2~", +1, 0, 0}, + { XKB_KEY_Delete, MOD_MASK_ANY, "\033[P", -1, 0, 0}, + { XKB_KEY_Delete, MOD_MASK_ANY, "\033[3~", +1, 0, 0}, + { XKB_KEY_BackSpace, MOD_MASK_NONE, "\177", 0, 0, 0}, + { XKB_KEY_Home, MOD_MASK_SHIFT, "\033[2J", 0, -1, 0}, + { XKB_KEY_Home, MOD_MASK_SHIFT, "\033[1;2H", 0, +1, 0}, + { XKB_KEY_Home, MOD_MASK_ANY, "\033[H", 0, -1, 0}, + { XKB_KEY_Home, MOD_MASK_ANY, "\033[1~", 0, +1, 0}, + { XKB_KEY_End, MOD_MASK_CTRL, "\033[J", -1, 0, 0}, + { XKB_KEY_End, MOD_MASK_CTRL, "\033[1;5F", +1, 0, 0}, + { XKB_KEY_End, MOD_MASK_SHIFT, "\033[K", -1, 0, 0}, + { XKB_KEY_End, MOD_MASK_SHIFT, "\033[1;2F", +1, 0, 0}, + { XKB_KEY_End, MOD_MASK_ANY, "\033[4~", 0, 0, 0}, + { XKB_KEY_Prior, MOD_MASK_CTRL, "\033[5;5~", 0, 0, 0}, + { XKB_KEY_Prior, MOD_MASK_SHIFT, "\033[5;2~", 0, 0, 0}, + { XKB_KEY_Prior, MOD_MASK_ANY, "\033[5~", 0, 0, 0}, + { XKB_KEY_Next, MOD_MASK_CTRL, "\033[6;5~", 0, 0, 0}, + { XKB_KEY_Next, MOD_MASK_SHIFT, "\033[6;2~", 0, 0, 0}, + { XKB_KEY_Next, MOD_MASK_ANY, "\033[6~", 0, 0, 0}, + { XKB_KEY_F1, MOD_MASK_NONE, "\033OP" , 0, 0, 0}, + { XKB_KEY_F1, /* F13 */ MOD_MASK_SHIFT, "\033[1;2P", 0, 0, 0}, + { XKB_KEY_F1, /* F25 */ MOD_MASK_CTRL, "\033[1;5P", 0, 0, 0}, + { XKB_KEY_F1, /* F37 */ MOD_MASK_LOGO, "\033[1;6P", 0, 0, 0}, + { XKB_KEY_F1, /* F49 */ MOD_MASK_ALT, "\033[1;3P", 0, 0, 0}, + { XKB_KEY_F2, MOD_MASK_NONE, "\033OQ" , 0, 0, 0}, + { XKB_KEY_F2, /* F14 */ MOD_MASK_SHIFT, "\033[1;2Q", 0, 0, 0}, + { XKB_KEY_F2, /* F26 */ MOD_MASK_CTRL, "\033[1;5Q", 0, 0, 0}, + { XKB_KEY_F2, /* F38 */ MOD_MASK_LOGO, "\033[1;6Q", 0, 0, 0}, + { XKB_KEY_F2, /* F50 */ MOD_MASK_ALT, "\033[1;3Q", 0, 0, 0}, + { XKB_KEY_F3, MOD_MASK_NONE, "\033OR" , 0, 0, 0}, + { XKB_KEY_F3, /* F15 */ MOD_MASK_SHIFT, "\033[1;2R", 0, 0, 0}, + { XKB_KEY_F3, /* F27 */ MOD_MASK_CTRL, "\033[1;5R", 0, 0, 0}, + { XKB_KEY_F3, /* F39 */ MOD_MASK_LOGO, "\033[1;6R", 0, 0, 0}, + { XKB_KEY_F3, /* F51 */ MOD_MASK_ALT, "\033[1;3R", 0, 0, 0}, + { XKB_KEY_F4, MOD_MASK_NONE, "\033OS" , 0, 0, 0}, + { XKB_KEY_F4, /* F16 */ MOD_MASK_SHIFT, "\033[1;2S", 0, 0, 0}, + { XKB_KEY_F4, /* F28 */ MOD_MASK_CTRL, "\033[1;5S", 0, 0, 0}, + { XKB_KEY_F4, /* F40 */ MOD_MASK_LOGO, "\033[1;6S", 0, 0, 0}, + { XKB_KEY_F4, /* F52 */ MOD_MASK_ALT, "\033[1;3S", 0, 0, 0}, + { XKB_KEY_F5, MOD_MASK_NONE, "\033[15~", 0, 0, 0}, + { XKB_KEY_F5, /* F17 */ MOD_MASK_SHIFT, "\033[15;2~", 0, 0, 0}, + { XKB_KEY_F5, /* F29 */ MOD_MASK_CTRL, "\033[15;5~", 0, 0, 0}, + { XKB_KEY_F5, /* F41 */ MOD_MASK_LOGO, "\033[15;6~", 0, 0, 0}, + { XKB_KEY_F5, /* F53 */ MOD_MASK_ALT, "\033[15;3~", 0, 0, 0}, + { XKB_KEY_F6, MOD_MASK_NONE, "\033[17~", 0, 0, 0}, + { XKB_KEY_F6, /* F18 */ MOD_MASK_SHIFT, "\033[17;2~", 0, 0, 0}, + { XKB_KEY_F6, /* F30 */ MOD_MASK_CTRL, "\033[17;5~", 0, 0, 0}, + { XKB_KEY_F6, /* F42 */ MOD_MASK_LOGO, "\033[17;6~", 0, 0, 0}, + { XKB_KEY_F6, /* F54 */ MOD_MASK_ALT, "\033[17;3~", 0, 0, 0}, + { XKB_KEY_F7, MOD_MASK_NONE, "\033[18~", 0, 0, 0}, + { XKB_KEY_F7, /* F19 */ MOD_MASK_SHIFT, "\033[18;2~", 0, 0, 0}, + { XKB_KEY_F7, /* F31 */ MOD_MASK_CTRL, "\033[18;5~", 0, 0, 0}, + { XKB_KEY_F7, /* F43 */ MOD_MASK_LOGO, "\033[18;6~", 0, 0, 0}, + { XKB_KEY_F7, /* F55 */ MOD_MASK_ALT, "\033[18;3~", 0, 0, 0}, + { XKB_KEY_F8, MOD_MASK_NONE, "\033[19~", 0, 0, 0}, + { XKB_KEY_F8, /* F20 */ MOD_MASK_SHIFT, "\033[19;2~", 0, 0, 0}, + { XKB_KEY_F8, /* F32 */ MOD_MASK_CTRL, "\033[19;5~", 0, 0, 0}, + { XKB_KEY_F8, /* F44 */ MOD_MASK_LOGO, "\033[19;6~", 0, 0, 0}, + { XKB_KEY_F8, /* F56 */ MOD_MASK_ALT, "\033[19;3~", 0, 0, 0}, + { XKB_KEY_F9, MOD_MASK_NONE, "\033[20~", 0, 0, 0}, + { XKB_KEY_F9, /* F21 */ MOD_MASK_SHIFT, "\033[20;2~", 0, 0, 0}, + { XKB_KEY_F9, /* F33 */ MOD_MASK_CTRL, "\033[20;5~", 0, 0, 0}, + { XKB_KEY_F9, /* F45 */ MOD_MASK_LOGO, "\033[20;6~", 0, 0, 0}, + { XKB_KEY_F9, /* F57 */ MOD_MASK_ALT, "\033[20;3~", 0, 0, 0}, + { XKB_KEY_F10, MOD_MASK_NONE, "\033[21~", 0, 0, 0}, + { XKB_KEY_F10, /* F22 */ MOD_MASK_SHIFT, "\033[21;2~", 0, 0, 0}, + { XKB_KEY_F10, /* F34 */ MOD_MASK_CTRL, "\033[21;5~", 0, 0, 0}, + { XKB_KEY_F10, /* F46 */ MOD_MASK_LOGO, "\033[21;6~", 0, 0, 0}, + { XKB_KEY_F10, /* F58 */ MOD_MASK_ALT, "\033[21;3~", 0, 0, 0}, + { XKB_KEY_F11, MOD_MASK_NONE, "\033[23~", 0, 0, 0}, + { XKB_KEY_F11, /* F23 */ MOD_MASK_SHIFT, "\033[23;2~", 0, 0, 0}, + { XKB_KEY_F11, /* F35 */ MOD_MASK_CTRL, "\033[23;5~", 0, 0, 0}, + { XKB_KEY_F11, /* F47 */ MOD_MASK_LOGO, "\033[23;6~", 0, 0, 0}, + { XKB_KEY_F11, /* F59 */ MOD_MASK_ALT, "\033[23;3~", 0, 0, 0}, + { XKB_KEY_F12, MOD_MASK_NONE, "\033[24~", 0, 0, 0}, + { XKB_KEY_F12, /* F24 */ MOD_MASK_SHIFT, "\033[24;2~", 0, 0, 0}, + { XKB_KEY_F12, /* F36 */ MOD_MASK_CTRL, "\033[24;5~", 0, 0, 0}, + { XKB_KEY_F12, /* F48 */ MOD_MASK_LOGO, "\033[24;6~", 0, 0, 0}, + { XKB_KEY_F12, /* F60 */ MOD_MASK_ALT, "\033[24;3~", 0, 0, 0}, + { XKB_KEY_F13, MOD_MASK_NONE, "\033[1;2P", 0, 0, 0}, + { XKB_KEY_F14, MOD_MASK_NONE, "\033[1;2Q", 0, 0, 0}, + { XKB_KEY_F15, MOD_MASK_NONE, "\033[1;2R", 0, 0, 0}, + { XKB_KEY_F16, MOD_MASK_NONE, "\033[1;2S", 0, 0, 0}, + { XKB_KEY_F17, MOD_MASK_NONE, "\033[15;2~", 0, 0, 0}, + { XKB_KEY_F18, MOD_MASK_NONE, "\033[17;2~", 0, 0, 0}, + { XKB_KEY_F19, MOD_MASK_NONE, "\033[18;2~", 0, 0, 0}, + { XKB_KEY_F20, MOD_MASK_NONE, "\033[19;2~", 0, 0, 0}, + { XKB_KEY_F21, MOD_MASK_NONE, "\033[20;2~", 0, 0, 0}, + { XKB_KEY_F22, MOD_MASK_NONE, "\033[21;2~", 0, 0, 0}, + { XKB_KEY_F23, MOD_MASK_NONE, "\033[23;2~", 0, 0, 0}, + { XKB_KEY_F24, MOD_MASK_NONE, "\033[24;2~", 0, 0, 0}, + { XKB_KEY_F25, MOD_MASK_NONE, "\033[1;5P", 0, 0, 0}, + { XKB_KEY_F26, MOD_MASK_NONE, "\033[1;5Q", 0, 0, 0}, + { XKB_KEY_F27, MOD_MASK_NONE, "\033[1;5R", 0, 0, 0}, + { XKB_KEY_F28, MOD_MASK_NONE, "\033[1;5S", 0, 0, 0}, + { XKB_KEY_F29, MOD_MASK_NONE, "\033[15;5~", 0, 0, 0}, + { XKB_KEY_F30, MOD_MASK_NONE, "\033[17;5~", 0, 0, 0}, + { XKB_KEY_F31, MOD_MASK_NONE, "\033[18;5~", 0, 0, 0}, + { XKB_KEY_F32, MOD_MASK_NONE, "\033[19;5~", 0, 0, 0}, + { XKB_KEY_F33, MOD_MASK_NONE, "\033[20;5~", 0, 0, 0}, + { XKB_KEY_F34, MOD_MASK_NONE, "\033[21;5~", 0, 0, 0}, + { XKB_KEY_F35, MOD_MASK_NONE, "\033[23;5~", 0, 0, 0}, +}; + +/* + * Selection types' masks. + * Use the same masks as usual. + * Button1Mask is always unset, to make masks match between ButtonPress. + * ButtonRelease and MotionNotify. + * If no match is found, regular selection is used. + */ +static uint selmasks[] = { + [SEL_RECTANGULAR] = MOD_MASK_ALT, +}; + diff --git a/include/wld/drm-private.h b/include/wld/drm-private.h new file mode 100644 index 0000000..6c36088 --- /dev/null +++ b/include/wld/drm-private.h @@ -0,0 +1,46 @@ +/* wld: drm-private.h + * + * Copyright (c) 2013, 2014 Michael Forney + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#ifndef WLD_DRM_PRIVATE_H +#define WLD_DRM_PRIVATE_H + +#include "wld-private.h" + +struct drm_driver +{ + const char * name; + bool (* device_supported)(uint32_t vendor_id, uint32_t device_id); + struct wld_context * (* create_context)(int drm_fd); +}; + +#if WITH_DRM_INTEL +extern const struct drm_driver intel_drm_driver; +#endif +#if WITH_DRM_NOUVEAU +extern const struct drm_driver nouveau_drm_driver; +#endif +extern const struct drm_driver dumb_drm_driver; +extern const struct wld_context_impl * dumb_context_impl; + +#endif + diff --git a/include/wld/drm.h b/include/wld/drm.h new file mode 100644 index 0000000..20ee3e8 --- /dev/null +++ b/include/wld/drm.h @@ -0,0 +1,52 @@ +/* wld: drm.h + * + * Copyright (c) 2013, 2014 Michael Forney + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#ifndef WLD_DRM_H +#define WLD_DRM_H + +#include <stdbool.h> +#include <stdint.h> + +#define WLD_DRM_ID (0x02 << 24) + +enum wld_drm_object_type +{ + WLD_DRM_OBJECT_HANDLE = WLD_DRM_ID, + WLD_DRM_OBJECT_PRIME_FD, +}; + +enum wld_drm_flags +{ + WLD_DRM_FLAG_SCANOUT = 0x1, + WLD_DRM_FLAG_TILED = 0x2 +}; + +/** + * Create a new WLD context from an opened DRM device file descriptor. + */ +struct wld_context * wld_drm_create_context(int fd); + +bool wld_drm_is_dumb(struct wld_context * context); + +#endif + diff --git a/include/wld/pixman.h b/include/wld/pixman.h new file mode 100644 index 0000000..c864385 --- /dev/null +++ b/include/wld/pixman.h @@ -0,0 +1,44 @@ +/* wld: pixman.h + * + * Copyright (c) 2013, 2014 Michael Forney + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#ifndef WLD_PIXMAN_H +#define WLD_PIXMAN_H + +#include <stdint.h> + +#define WLD_PIXMAN_ID (0x01 << 24) + +enum wld_pixman_object_type +{ + WLD_PIXMAN_OBJECT_IMAGE = WLD_PIXMAN_ID +}; + +extern struct wld_context * wld_pixman_context; + +static inline struct wld_context * wld_pixman_create_context() +{ + return wld_pixman_context; +} + +#endif + diff --git a/include/wld/wayland-private.h b/include/wld/wayland-private.h new file mode 100644 index 0000000..f52e3ae --- /dev/null +++ b/include/wld/wayland-private.h @@ -0,0 +1,60 @@ +/* wld: wayland-private.h + * + * Copyright (c) 2013, 2014 Michael Forney + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#ifndef WLD_WAYLAND_PRIVATE_H +#define WLD_WAYLAND_PRIVATE_H + +#include "wld.h" + +struct buffer; +struct wl_display; +struct wl_event_queue; +struct wl_buffer; + +struct wayland_context +{ + struct wld_context base; + const struct wayland_impl * impl; + struct wl_display * display; + struct wl_event_queue * queue; +}; + +struct wayland_impl +{ + struct wayland_context * (* create_context)(struct wl_display * display, + struct wl_event_queue * queue); + bool (* has_format)(struct wld_context * context, uint32_t format); +}; + +#if WITH_WAYLAND_DRM +extern const struct wayland_impl drm_wayland_impl; +#endif + +#if WITH_WAYLAND_SHM +extern const struct wayland_impl shm_wayland_impl; +#endif + +bool wayland_buffer_add_exporter(struct buffer * buffer, struct wl_buffer * wl); + +#endif + diff --git a/include/wld/wayland.h b/include/wld/wayland.h new file mode 100644 index 0000000..3127ee6 --- /dev/null +++ b/include/wld/wayland.h @@ -0,0 +1,84 @@ +/* wld: wayland.h + * + * Copyright (c) 2013, 2014 Michael Forney + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#ifndef WLD_WAYLAND_H +#define WLD_WAYLAND_H + +#include <stdbool.h> +#include <stdint.h> + +struct wl_display; +struct wl_surface; + +#define WLD_WAYLAND_ID (0x3 << 24) + +enum wld_wayland_interface_id +{ + /** + * Give up on trying any new interfaces. This can be considered as a + * sentinel for wld_wayland_create_context. + */ + WLD_NONE = -2, + + /** + * Try any available interface. + */ + WLD_ANY = -1, + WLD_DRM, + WLD_SHM +}; + +enum wld_wayland_object_type +{ + WLD_WAYLAND_OBJECT_BUFFER = WLD_WAYLAND_ID +}; + +/** + * Create a new WLD context which uses various available Wayland interfaces + * (such as wl_shm and wl_drm) to create wl_buffers backed by implementations + * specific to the interface. + * + * You can specify the particular interface you want to use by specifying them + * as arguments. Interfaces will be tried in the order they are given. + * + * The last argument must be either WLD_NONE or WLD_ANY. + * + * @see enum wld_wayland_interface_id + */ +struct wld_context * wld_wayland_create_context + (struct wl_display * display, enum wld_wayland_interface_id id, ...); + +struct wld_surface * wld_wayland_create_surface(struct wld_context * context, + uint32_t width, uint32_t height, + uint32_t format, uint32_t flags, + struct wl_surface * surface); + +/** + * Check if the wayland implementation supports a particular pixel format. + * + * @see enum wld_format + */ +bool wld_wayland_has_format(struct wld_context * context, uint32_t format); + +#endif + diff --git a/include/wld/wld-private.h b/include/wld/wld-private.h new file mode 100644 index 0000000..e812b11 --- /dev/null +++ b/include/wld/wld-private.h @@ -0,0 +1,243 @@ +/* wld: wld-private.h + * + * Copyright (c) 2013, 2014 Michael Forney + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#ifndef WLD_PRIVATE_H +#define WLD_PRIVATE_H + +#include "wld.h" + +#include <assert.h> +#include <stdbool.h> +#include <stdint.h> +#include <ft2build.h> +#include FT_FREETYPE_H +#include FT_BITMAP_H + +#define ARRAY_LENGTH(array) (sizeof (array) / sizeof (array)[0]) +#if ENABLE_DEBUG +# define DEBUG(format, ...) \ + fprintf(stderr, "# %s: " format, __func__, ## __VA_ARGS__) +#else +# define DEBUG(format, ...) +#endif + +#define EXPORT __attribute__((visibility("default"))) +#define CONTAINER_OF(ptr, type, member) \ + ((type *)((uintptr_t) ptr - offsetof(type, member))) +#define IMPL(impl_type, base_type) \ + static inline struct impl_type * impl_type(struct base_type * object) \ + { \ + assert(object->impl == &base_type ## _impl); \ + return (struct impl_type *) object; \ + } + +struct wld_font_context +{ + FT_Library library; +}; + +struct glyph +{ + FT_Bitmap bitmap; + + /** + * The offset from the origin to the top left corner of the bitmap. + */ + int16_t x, y; + + /** + * The width to advance to the origin of the next character. + */ + uint16_t advance; +}; + +struct font +{ + struct wld_font base; + + struct wld_font_context * context; + FT_Face face; + struct glyph ** glyphs; +}; + +struct wld_context_impl +{ + struct wld_renderer * (* create_renderer)(struct wld_context * context); + struct buffer * (* create_buffer)(struct wld_context * context, + uint32_t width, uint32_t height, + uint32_t format, uint32_t flags); + struct buffer * (* import_buffer)(struct wld_context * context, + uint32_t type, union wld_object object, + uint32_t width, uint32_t height, + uint32_t format, uint32_t pitch); + struct wld_surface * (* create_surface)(struct wld_context * context, + uint32_t width, uint32_t height, + uint32_t format, uint32_t flags); + void (* destroy)(struct wld_context * context); +}; + +struct wld_renderer_impl +{ + uint32_t (* capabilities)(struct wld_renderer * renderer, + struct buffer * buffer); + bool (* set_target)(struct wld_renderer * renderer, struct buffer * buffer); + void (* fill_rectangle)(struct wld_renderer * renderer, + uint32_t color, int32_t x, int32_t y, + uint32_t width, uint32_t height); + void (* fill_region)(struct wld_renderer * renderer, + uint32_t color, pixman_region32_t * region); + void (* copy_rectangle)(struct wld_renderer * renderer, struct buffer * src, + int32_t dst_x, int32_t dst_y, + int32_t src_x, int32_t src_y, + uint32_t width, uint32_t height); + void (* copy_region)(struct wld_renderer * renderer, struct buffer * src, + int32_t dst_x, int32_t dst_y, + pixman_region32_t * region); + void (* draw_text)(struct wld_renderer * renderer, + struct font * font, uint32_t color, + int32_t x, int32_t y, const char * text, uint32_t length, + struct wld_extents * extents); + void (* flush)(struct wld_renderer * renderer); + void (* destroy)(struct wld_renderer * renderer); +}; + +struct buffer +{ + struct wld_buffer base; + + unsigned references, map_references; + struct wld_exporter * exporters; + struct wld_destructor * destructors; +}; + +struct wld_buffer_impl +{ + bool (* map)(struct buffer * buffer); + bool (* unmap)(struct buffer * buffer); + void (* destroy)(struct buffer * buffer); +}; + +struct wld_surface_impl +{ + pixman_region32_t * (* damage)(struct wld_surface * surface, + pixman_region32_t * damage); + struct buffer * (* back)(struct wld_surface * surface); + struct buffer * (* take)(struct wld_surface * surface); + bool (* release)(struct wld_surface * surface, struct buffer * buffer); + bool (* swap)(struct wld_surface * surface); + void (* destroy)(struct wld_surface * surface); +}; + +struct buffer_socket +{ + const struct buffer_socket_impl * impl; +}; + +struct buffer_socket_impl +{ + bool (* attach)(struct buffer_socket * socket, struct buffer * buffer); + void (* process)(struct buffer_socket * socket); + void (* destroy)(struct buffer_socket * socket); +}; + +bool font_ensure_glyph(struct font * font, FT_UInt glyph_index); + +/** + * Returns the number of bytes per pixel for the given format. + */ +static inline uint8_t format_bytes_per_pixel(enum wld_format format) +{ + switch (format) + { + case WLD_FORMAT_ARGB8888: + case WLD_FORMAT_XRGB8888: + return 4; + default: + return 0; + } +} + +static inline pixman_format_code_t format_wld_to_pixman(uint32_t format) +{ + switch (format) + { + case WLD_FORMAT_ARGB8888: + return PIXMAN_a8r8g8b8; + case WLD_FORMAT_XRGB8888: + return PIXMAN_x8r8g8b8; + default: + return 0; + } +} + +static inline uint32_t format_pixman_to_wld(pixman_format_code_t format) +{ + switch (format) + { + case PIXMAN_a8r8g8b8: + return WLD_FORMAT_ARGB8888; + case PIXMAN_x8r8g8b8: + return WLD_FORMAT_XRGB8888; + default: + return 0; + } +} + +/** + * This default fill_region method is implemented in terms of fill_rectangle. + */ +void default_fill_region(struct wld_renderer * renderer, uint32_t color, + pixman_region32_t * region); + +/** + * This default copy_region method is implemented in terms of copy_rectangle. + */ +void default_copy_region(struct wld_renderer * renderer, struct buffer * buffer, + int32_t dst_x, int32_t dst_y, + pixman_region32_t * region); + +struct wld_surface * default_create_surface(struct wld_context * context, + uint32_t width, uint32_t height, + uint32_t format, uint32_t flags); + +struct wld_surface * buffered_surface_create(struct wld_context * context, + uint32_t width, uint32_t height, + uint32_t format, uint32_t flags, + struct buffer_socket * socket); + +void context_initialize(struct wld_context * context, + const struct wld_context_impl * impl); + +void renderer_initialize(struct wld_renderer * renderer, + const struct wld_renderer_impl * impl); + +void buffer_initialize(struct buffer * buffer, + const struct wld_buffer_impl * impl, + uint32_t width, uint32_t height, + uint32_t format, uint32_t pitch); + +void surface_initialize(struct wld_surface * surface, + const struct wld_surface_impl * impl); + +#endif + diff --git a/include/wld/wld.h b/include/wld/wld.h new file mode 100644 index 0000000..c36081c --- /dev/null +++ b/include/wld/wld.h @@ -0,0 +1,283 @@ +/* wld: wld.h + * + * Copyright (c) 2013, 2014 Michael Forney + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#ifndef WLD_H +#define WLD_H + +#include <stdbool.h> +#include <stdint.h> +#include <pixman.h> +#include <fontconfig/fontconfig.h> + +#define WLD_USER_ID (0xff << 24) + +#define __WLD_FOURCC(a, b, c, d) ( (a) \ + | ((b) << 8) \ + | ((c) << 16) \ + | ((d) << 24) ) + +/** + * Supported pixel formats. + * + * These formats can safely be interchanged with GBM and wl_drm formats. + */ +enum wld_format +{ + WLD_FORMAT_XRGB8888 = __WLD_FOURCC('X', 'R', '2', '4'), + WLD_FORMAT_ARGB8888 = __WLD_FOURCC('A', 'R', '2', '4') +}; + +enum wld_flags +{ + WLD_FLAG_MAP = 0x1 << 16 +}; + +bool wld_lookup_named_color(const char * name, uint32_t * color); + +/**** WLD Context ****/ + +enum wld_object_type +{ + WLD_OBJECT_DATA +}; + +union wld_object +{ + void * ptr; + uint32_t u32; + int i; +}; + +struct wld_context +{ + const struct wld_context_impl * const impl; +}; + +struct wld_renderer * wld_create_renderer(struct wld_context * context); + +struct wld_buffer * wld_create_buffer(struct wld_context * context, + uint32_t width, uint32_t height, + uint32_t format, uint32_t flags); + +struct wld_buffer * wld_import_buffer(struct wld_context * context, + uint32_t type, union wld_object object, + uint32_t width, uint32_t height, + uint32_t format, uint32_t pitch); + +struct wld_surface * wld_create_surface(struct wld_context * context, + uint32_t width, uint32_t height, + uint32_t format, uint32_t flags); + +void wld_destroy_context(struct wld_context * context); + +/**** Font Handling ****/ + +struct wld_extents +{ + uint32_t advance; +}; + +struct wld_font +{ + uint32_t ascent, descent; + uint32_t height; + uint32_t max_advance; +}; + +/** + * Create a new font context. + * + * This sets up the underlying FreeType library. + */ +struct wld_font_context * wld_font_create_context(); + +/** + * Destroy a font context. + */ +void wld_font_destroy_context(struct wld_font_context * context); + +/** + * Open a new font from the given fontconfig match. + */ +struct wld_font * wld_font_open_pattern(struct wld_font_context * context, + FcPattern * match); + +/** + * Open a new font from a fontconfig pattern string. + */ +struct wld_font * wld_font_open_name(struct wld_font_context * context, + const char * name); + +/** + * Close a font. + */ +void wld_font_close(struct wld_font * font); + +/** + * Check if the given font has a particular character (in UTF-32), and if so, + * load the glyph. + */ +bool wld_font_ensure_char(struct wld_font * font, uint32_t character); + +/** + * Calculate the text extents of the given UTF-8 string. + * + * @param length The maximum number of bytes in the string to process + */ +void wld_font_text_extents_n(struct wld_font * font, + const char * text, int32_t length, + struct wld_extents * extents); + +static inline void wld_font_text_extents(struct wld_font * font, + const char * text, + struct wld_extents * extents) +{ + wld_font_text_extents_n(font, text, INT32_MAX, extents); +} + +/**** Buffers ****/ + +struct wld_exporter +{ + bool (* export)(struct wld_exporter * exporter, struct wld_buffer * buffer, + uint32_t type, union wld_object * object); + struct wld_exporter * next; +}; + +struct wld_destructor +{ + void (* destroy)(struct wld_destructor * destructor); + struct wld_destructor * next; +}; + +struct wld_buffer +{ + const struct wld_buffer_impl * const impl; + + uint32_t width, height, pitch; + enum wld_format format; + pixman_region32_t damage; + void * map; +}; + +bool wld_map(struct wld_buffer * buffer); +bool wld_unmap(struct wld_buffer * buffer); + +bool wld_export(struct wld_buffer * buffer, + uint32_t type, union wld_object * object); + +void wld_buffer_add_exporter(struct wld_buffer * buffer, + struct wld_exporter * exporter); + +void wld_buffer_add_destructor(struct wld_buffer * buffer, + struct wld_destructor * destructor); + +/** + * Increase the reference count of a buffer. + */ +void wld_buffer_reference(struct wld_buffer * buffer); + +/** + * Decrease the reference count of a buffer. + * + * When the reference count drops to zero, the buffer will be destroyed. + */ +void wld_buffer_unreference(struct wld_buffer * buffer); + +/**** Surfaces ****/ + +struct wld_surface +{ + const struct wld_surface_impl * const impl; +}; + +pixman_region32_t * wld_surface_damage(struct wld_surface * surface, + pixman_region32_t * new_damage); + +struct wld_buffer * wld_surface_take(struct wld_surface * surface); + +void wld_surface_release(struct wld_surface * surface, + struct wld_buffer * buffer); + +bool wld_swap(struct wld_surface * surface); + +void wld_destroy_surface(struct wld_surface * surface); + +/**** Renderers ****/ + +struct wld_renderer +{ + const struct wld_renderer_impl * const impl; + struct wld_buffer * target; +}; + +enum wld_capability +{ + WLD_CAPABILITY_READ = 1<<0, + WLD_CAPABILITY_WRITE = 1<<1, +}; + +void wld_destroy_renderer(struct wld_renderer * renderer); + +uint32_t wld_capabilities(struct wld_renderer * renderer, + struct wld_buffer * buffer); + +bool wld_set_target_buffer(struct wld_renderer * renderer, + struct wld_buffer * buffer); + +bool wld_set_target_surface(struct wld_renderer * renderer, + struct wld_surface * surface); + +void wld_fill_rectangle(struct wld_renderer * renderer, uint32_t color, + int32_t x, int32_t y, uint32_t width, uint32_t height); + +void wld_fill_region(struct wld_renderer * renderer, uint32_t color, + pixman_region32_t * region); + +void wld_copy_rectangle(struct wld_renderer * renderer, + struct wld_buffer * buffer, + int32_t dst_x, int32_t dst_y, + int32_t src_x, int32_t src_y, + uint32_t width, uint32_t height); + +void wld_copy_region(struct wld_renderer * renderer, + struct wld_buffer * buffer, + int32_t dst_x, int32_t dst_y, pixman_region32_t * region); + +/** + * Draw a UTF-8 text string to the given buffer. + * + * @param length The maximum number of bytes in the string to process. If + * length is -1, then draw until a NULL byte is found. + * @param extents If not NULL, will be initialized to the extents of the + * drawn text + */ +void wld_draw_text(struct wld_renderer * renderer, + struct wld_font * font, uint32_t color, + int32_t x, int32_t y, const char * text, uint32_t length, + struct wld_extents * extents); + +void wld_flush(struct wld_renderer * renderer); + +#endif + |