diff options
author | Jesse Luehrs <doy@tozt.net> | 2014-04-17 00:25:36 -0400 |
---|---|---|
committer | Jesse Luehrs <doy@tozt.net> | 2014-04-17 00:25:36 -0400 |
commit | 68690fbfb66df3e5f22ff235e3b23f1f4cc6b257 (patch) | |
tree | c269a2b663b0f28cc9408291a50fa8f6e5dda57d | |
parent | 07d4e10eae5d46f39cf26f57175c2b26524eefca (diff) | |
download | runes-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.c | 5 | ||||
-rw-r--r-- | display.h | 1 | ||||
-rw-r--r-- | parser.c | 4 | ||||
-rw-r--r-- | parser.l | 4 | ||||
-rw-r--r-- | window-xlib.c | 36 | ||||
-rw-r--r-- | window-xlib.h | 3 |
6 files changed, 31 insertions, 22 deletions
@@ -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; @@ -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); @@ -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) @@ -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 |