aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2014-04-17 00:25:36 -0400
committerJesse Luehrs <doy@tozt.net>2014-04-17 00:25:36 -0400
commit68690fbfb66df3e5f22ff235e3b23f1f4cc6b257 (patch)
treec269a2b663b0f28cc9408291a50fa8f6e5dda57d
parent07d4e10eae5d46f39cf26f57175c2b26524eefca (diff)
downloadrunes-68690fbfb66df3e5f22ff235e3b23f1f4cc6b257.tar.gz
runes-68690fbfb66df3e5f22ff235e3b23f1f4cc6b257.zip
move this entirely into the backend
again, it's not safe to have things from other threads calling into xlib, and cairo calls on the backend_cr count as calling into xlib
-rw-r--r--display.c5
-rw-r--r--display.h1
-rw-r--r--parser.c4
-rw-r--r--parser.l4
-rw-r--r--window-xlib.c36
-rw-r--r--window-xlib.h3
6 files changed, 31 insertions, 22 deletions
diff --git a/display.c b/display.c
index ee6b85b..eb6893f 100644
--- a/display.c
+++ b/display.c
@@ -278,11 +278,6 @@ void runes_display_hide_cursor(RunesTerm *t)
t->hide_cursor = 1;
}
-void runes_display_visual_bell(RunesTerm *t)
-{
- runes_window_backend_visual_bell(t);
-}
-
void runes_display_save_cursor(RunesTerm *t)
{
t->saved_row = t->row;
diff --git a/display.h b/display.h
index f35c1c2..0b4538c 100644
--- a/display.h
+++ b/display.h
@@ -24,7 +24,6 @@ void runes_display_set_bg_color(RunesTerm *t, cairo_pattern_t *color);
void runes_display_reset_bg_color(RunesTerm *t);
void runes_display_show_cursor(RunesTerm *t);
void runes_display_hide_cursor(RunesTerm *t);
-void runes_display_visual_bell(RunesTerm *t);
void runes_display_save_cursor(RunesTerm *t);
void runes_display_restore_cursor(RunesTerm *t);
void runes_display_use_alternate_buffer(RunesTerm *t);
diff --git a/parser.c b/parser.c
index ec8683f..e81e368 100644
--- a/parser.c
+++ b/parser.c
@@ -2234,7 +2234,7 @@ static void runes_parser_handle_text(RunesTerm *t, char *text, size_t len)
static void runes_parser_handle_bel(RunesTerm *t)
{
- runes_display_visual_bell(t);
+ runes_window_backend_request_visual_bell(t);
}
static void runes_parser_handle_bs(RunesTerm *t)
@@ -2274,7 +2274,7 @@ static void runes_parser_handle_ri(RunesTerm *t)
static void runes_parser_handle_vb(RunesTerm *t)
{
- runes_display_visual_bell(t);
+ runes_window_backend_request_visual_bell(t);
}
static void runes_parser_handle_decsc(RunesTerm *t)
diff --git a/parser.l b/parser.l
index c610ec0..a6586e1 100644
--- a/parser.l
+++ b/parser.l
@@ -202,7 +202,7 @@ static void runes_parser_handle_text(RunesTerm *t, char *text, size_t len)
static void runes_parser_handle_bel(RunesTerm *t)
{
- runes_display_visual_bell(t);
+ runes_window_backend_request_visual_bell(t);
}
static void runes_parser_handle_bs(RunesTerm *t)
@@ -242,7 +242,7 @@ static void runes_parser_handle_ri(RunesTerm *t)
static void runes_parser_handle_vb(RunesTerm *t)
{
- runes_display_visual_bell(t);
+ runes_window_backend_request_visual_bell(t);
}
static void runes_parser_handle_decsc(RunesTerm *t)
diff --git a/window-xlib.c b/window-xlib.c
index c51ffe2..4c375ca 100644
--- a/window-xlib.c
+++ b/window-xlib.c
@@ -17,7 +17,8 @@ static char *atom_names[RUNES_NUM_ATOMS] = {
"_NET_WM_NAME",
"UTF8_STRING",
"WM_PROTOCOLS",
- "RUNES_FLUSH"
+ "RUNES_FLUSH",
+ "RUNES_VISUAL_BELL"
};
struct function_key {
@@ -198,6 +199,21 @@ void runes_window_backend_request_flush(RunesTerm *t)
XUnlockDisplay(t->w.dpy);
}
+void runes_window_backend_request_visual_bell(RunesTerm *t)
+{
+ XEvent e;
+
+ e.xclient.type = ClientMessage;
+ e.xclient.window = t->w.w;
+ e.xclient.format = 32;
+ e.xclient.data.l[0] = t->w.atoms[RUNES_ATOM_RUNES_VISUAL_BELL];
+
+ XSendEvent(t->w.dpy, t->w.w, False, NoEventMask, &e);
+ XLockDisplay(t->w.dpy);
+ XFlush(t->w.dpy);
+ XUnlockDisplay(t->w.dpy);
+}
+
void runes_window_backend_request_close(RunesTerm *t)
{
XEvent e;
@@ -250,16 +266,6 @@ void runes_window_backend_set_window_title(
(unsigned char *)name, len);
}
-void runes_window_backend_visual_bell(RunesTerm *t)
-{
- cairo_pattern_t *white;
-
- white = cairo_pattern_create_rgb(1.0, 1.0, 1.0);
- cairo_set_source(t->backend_cr, white);
- cairo_paint(t->backend_cr);
- runes_window_backend_flush(t);
-}
-
void runes_window_backend_cleanup(RunesTerm *t)
{
RunesWindowBackend *w = &t->w;
@@ -397,6 +403,14 @@ static void runes_window_backend_process_event(uv_work_t *req, int status)
else if (a == w->atoms[RUNES_ATOM_RUNES_FLUSH]) {
runes_window_backend_flush(t);
}
+ else if (a == w->atoms[RUNES_ATOM_RUNES_VISUAL_BELL]) {
+ cairo_pattern_t *white;
+
+ white = cairo_pattern_create_rgb(1.0, 1.0, 1.0);
+ cairo_set_source(t->backend_cr, white);
+ cairo_paint(t->backend_cr);
+ runes_window_backend_flush(t);
+ }
break;
}
default:
diff --git a/window-xlib.h b/window-xlib.h
index 703ec9d..df5eabb 100644
--- a/window-xlib.h
+++ b/window-xlib.h
@@ -13,6 +13,7 @@ enum runes_atoms {
RUNES_ATOM_UTF8_STRING,
RUNES_ATOM_WM_PROTOCOLS,
RUNES_ATOM_RUNES_FLUSH,
+ RUNES_ATOM_RUNES_VISUAL_BELL,
RUNES_NUM_ATOMS
};
@@ -32,12 +33,12 @@ typedef struct {
void runes_window_backend_create_window(RunesTerm *t, int argc, char *argv[]);
void runes_window_backend_start_loop(RunesTerm *t);
void runes_window_backend_request_flush(RunesTerm *t);
+void runes_window_backend_request_visual_bell(RunesTerm *t);
void runes_window_backend_request_close(RunesTerm *t);
void runes_window_backend_get_size(RunesTerm *t, int *xpixel, int *ypixel);
void runes_window_backend_set_icon_name(RunesTerm *t, char *name, size_t len);
void runes_window_backend_set_window_title(
RunesTerm *t, char *name, size_t len);
-void runes_window_backend_visual_bell(RunesTerm *t);
void runes_window_backend_cleanup(RunesTerm *t);
#endif