summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Djärv <jan.h.d@swipnet.se>2012-10-12 19:50:39 +0200
committerJan Djärv <jan.h.d@swipnet.se>2012-10-12 19:50:39 +0200
commit167e3640f16a3825f6189111caf86a743e5282e5 (patch)
treebb181f0246ce672d9e8b3c552349011feede653c
parentc40239dff913de4a404f97568a755deb2086db76 (diff)
downloademacs-167e3640f16a3825f6189111caf86a743e5282e5.tar.gz
* 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).
-rw-r--r--src/ChangeLog11
-rw-r--r--src/nsterm.m39
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 <jan.h.d@swipnet.se>
+
+ * 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 <lekktu@gmail.com>
* 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);
}