From 167e3640f16a3825f6189111caf86a743e5282e5 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Jan=20Dj=C3=A4rv?= Date: Fri, 12 Oct 2012 19:50:39 +0200 Subject: [PATCH] * nsterm.m (hold_event_q): New static variable. (EV_TRAILER, sendScrollEventAtLoc:fromEvent:): Call hold_event if ! q_event_ptr. (hold_event): New function. (ns_read_socket): If hold_event_q have events, store them and return. (setPosition:portion:whole:): Send SIGIO to ourselves if apploopnr is zero (Bug#12384). --- src/ChangeLog | 11 +++++++++++ src/nsterm.m | 39 +++++++++++++++++++++++++++++++++++++-- 2 files changed, 48 insertions(+), 2 deletions(-) diff --git a/src/ChangeLog b/src/ChangeLog index 42f96587ccc..d6429501059 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,14 @@ +2012-10-12 Jan Djärv + + * nsterm.m (hold_event_q): New static variable. + (EV_TRAILER, sendScrollEventAtLoc:fromEvent:): Call hold_event if + ! q_event_ptr. + (hold_event): New function. + (ns_read_socket): If hold_event_q have events, store them and + return (Bug#12384). + (setPosition:portion:whole:): Send SIGIO to ourselves if apploopnr + is zero (Bug#12384). + 2012-10-12 Juanma Barranquero * makefile.w32-in ($(BLD)/w32select.$(O)): Update dependencies. diff --git a/src/nsterm.m b/src/nsterm.m index 1d935fc76de..98dd0a8aab1 100644 --- a/src/nsterm.m +++ b/src/nsterm.m @@ -208,6 +208,13 @@ static NSMutableArray *ns_pending_files, *ns_pending_service_names, *ns_pending_service_args; static BOOL ns_do_open_file = NO; +static struct { + struct input_event *q; + int nr, cap; +} hold_event_q = { + NULL, 0, 0 +}; + /* Convert modifiers in a NeXTstep event to emacs style modifiers. */ #define NS_FUNCTION_KEY_MASK 0x800000 #define NSLeftControlKeyMask (0x000001 | NSControlKeyMask) @@ -273,7 +280,7 @@ static BOOL ns_do_open_file = NO; kbd_buffer_store_event_hold (emacs_event, q_event_ptr); \ } \ else \ - kbd_buffer_store_event (emacs_event); \ + hold_event (emacs_event); \ EVENT_INIT (*emacs_event); \ ns_send_appdefined (-1); \ } @@ -292,6 +299,19 @@ void x_set_frame_alpha (struct frame *f); ========================================================================== */ +static void +hold_event (struct input_event *event) +{ + if (hold_event_q.nr == hold_event_q.cap) + { + if (hold_event_q.cap == 0) hold_event_q.cap = 10; + else hold_event_q.cap *= 2; + hold_event_q.q = (struct input_event *) + xrealloc (hold_event_q.q, hold_event_q.cap * sizeof (*hold_event_q.q)); + } + + hold_event_q.q[hold_event_q.nr++] = *event; +} static Lisp_Object append2 (Lisp_Object list, Lisp_Object item) @@ -3348,6 +3368,15 @@ ns_read_socket (struct terminal *terminal, struct input_event *hold_quit) if ([NSApp modalWindow] != nil) return -1; + if (hold_event_q.nr > 0) + { + int i; + for (i = 0; i < hold_event_q.nr; ++i) + kbd_buffer_store_event_hold (&hold_event_q.q[i], hold_quit); + hold_event_q.nr = 0; + return i; + } + block_input (); n_emacs_events_pending = 0; EVENT_INIT (ev); @@ -6645,6 +6674,12 @@ not_in_argv (NSString *arg) [self setFloatValue: pos knobProportion: por]; #endif } + + /* Events may come here even if the event loop is not running. + If we don't enter the event loop, the scroll bar will not update. + So send SIGIO to ourselves. */ + if (apploopnr == 0) kill (0, SIGIO); + return self; } @@ -6685,7 +6720,7 @@ not_in_argv (NSString *arg) kbd_buffer_store_event_hold (emacs_event, q_event_ptr); } else - kbd_buffer_store_event (emacs_event); + hold_event (emacs_event); EVENT_INIT (*emacs_event); ns_send_appdefined (-1); } -- 2.39.2