aboutsummaryrefslogtreecommitdiff
path: root/common
diff options
context:
space:
mode:
Diffstat (limited to 'common')
-rw-r--r--common/ipc-client.c32
-rw-r--r--common/meson.build3
-rw-r--r--common/pango.c65
3 files changed, 93 insertions, 7 deletions
diff --git a/common/ipc-client.c b/common/ipc-client.c
index 582c5e86..117e9910 100644
--- a/common/ipc-client.c
+++ b/common/ipc-client.c
@@ -1,4 +1,4 @@
-#define _POSIX_C_SOURCE 2
+#define _POSIX_C_SOURCE 200809L
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
@@ -14,13 +14,31 @@ static const char ipc_magic[] = {'i', '3', '-', 'i', 'p', 'c'};
static const size_t ipc_header_size = sizeof(ipc_magic)+8;
char *get_socketpath(void) {
- FILE *fp = popen("sway --get-socketpath", "r");
- if (!fp) {
- return NULL;
+ const char *swaysock = getenv("SWAYSOCK");
+ if (swaysock) {
+ return strdup(swaysock);
}
- char *line = read_line(fp);
- pclose(fp);
- return line;
+ FILE *fp = popen("sway --get-socketpath 2>/dev/null", "r");
+ if (fp) {
+ char *line = read_line(fp);
+ pclose(fp);
+ if (line && *line) {
+ return line;
+ }
+ }
+ const char *i3sock = getenv("I3SOCK");
+ if (i3sock) {
+ return strdup(i3sock);
+ }
+ fp = popen("i3 --get-socketpath 2>/dev/null", "r");
+ if (fp) {
+ char *line = read_line(fp);
+ pclose(fp);
+ if (line && *line) {
+ return line;
+ }
+ }
+ return NULL;
}
int ipc_open_socket(const char *socket_path) {
diff --git a/common/meson.build b/common/meson.build
index 01736ca6..4ad47077 100644
--- a/common/meson.build
+++ b/common/meson.build
@@ -1,5 +1,7 @@
deps = [
cairo,
+ pango,
+ pangocairo,
wlroots
]
@@ -14,6 +16,7 @@ lib_sway_common = static_library(
'ipc-client.c',
'log.c',
'list.c',
+ 'pango.c',
'readline.c',
'stringop.c',
'util.c'
diff --git a/common/pango.c b/common/pango.c
new file mode 100644
index 00000000..2ae7883c
--- /dev/null
+++ b/common/pango.c
@@ -0,0 +1,65 @@
+#include <cairo/cairo.h>
+#include <pango/pangocairo.h>
+#include <stdarg.h>
+#include <stdbool.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+PangoLayout *get_pango_layout(cairo_t *cairo, const char *font,
+ const char *text, int32_t scale, bool markup) {
+ PangoLayout *layout = pango_cairo_create_layout(cairo);
+ PangoAttrList *attrs;
+ if (markup) {
+ char *buf;
+ pango_parse_markup(text, -1, 0, &attrs, &buf, NULL, NULL);
+ pango_layout_set_markup(layout, buf, -1);
+ free(buf);
+ } else {
+ attrs = pango_attr_list_new();
+ pango_layout_set_text(layout, text, -1);
+ }
+ pango_attr_list_insert(attrs, pango_attr_scale_new(scale));
+ PangoFontDescription *desc = pango_font_description_from_string(font);
+ pango_layout_set_font_description(layout, desc);
+ pango_layout_set_single_paragraph_mode(layout, 1);
+ pango_layout_set_attributes(layout, attrs);
+ pango_attr_list_unref(attrs);
+ pango_font_description_free(desc);
+ return layout;
+}
+
+void get_text_size(cairo_t *cairo, const char *font, int *width, int *height,
+ int32_t scale, bool markup, const char *fmt, ...) {
+ static char buf[2048];
+
+ va_list args;
+ va_start(args, fmt);
+ if (vsnprintf(buf, 2048, fmt, args) >= 2048) {
+ strcpy(buf, "[buffer overflow]");
+ }
+ va_end(args);
+
+ PangoLayout *layout = get_pango_layout(cairo, font, buf, scale, markup);
+ pango_cairo_update_layout(cairo, layout);
+ pango_layout_get_pixel_size(layout, width, height);
+ g_object_unref(layout);
+}
+
+void pango_printf(cairo_t *cairo, const char *font,
+ int32_t scale, bool markup, const char *fmt, ...) {
+ static char buf[2048];
+
+ va_list args;
+ va_start(args, fmt);
+ if (vsnprintf(buf, 2048, fmt, args) >= 2048) {
+ strcpy(buf, "[buffer overflow]");
+ }
+ va_end(args);
+
+ PangoLayout *layout = get_pango_layout(cairo, font, buf, scale, markup);
+ pango_cairo_update_layout(cairo, layout);
+ pango_cairo_show_layout(cairo, layout);
+ g_object_unref(layout);
+}