#include "termhooks.h"
#include "termchar.h"
-
+#include "menu.h"
#include "window.h"
#include "keyboard.h"
#include "buffer.h"
========================================================================== */
+void
+ns_init_events (struct input_event* ev)
+{
+ EVENT_INIT (*ev);
+ emacs_event = ev;
+}
+
+void
+ns_finish_events ()
+{
+ emacs_event = NULL;
+}
+
static void
hold_event (struct input_event *event)
{
void
-x_set_mouse_pixel_position (struct frame *f, int pix_x, int pix_y)
+frame_set_mouse_pixel_position (struct frame *f, int pix_x, int pix_y)
/* --------------------------------------------------------------------------
Programmatically reposition mouse pointer in pixel coordinates
-------------------------------------------------------------------------- */
{
- NSTRACE (x_set_mouse_pixel_position);
+ NSTRACE (frame_set_mouse_pixel_position);
ns_raise_frame (f);
#if 0
/* FIXME: this does not work, and what about GNUstep? */
#endif
}
-
-void
-x_set_mouse_position (struct frame *f, int h, int v)
-/* --------------------------------------------------------------------------
- Programmatically reposition mouse pointer in character coordinates
- -------------------------------------------------------------------------- */
-{
- int pix_x, pix_y;
-
- pix_x = FRAME_COL_TO_PIXEL_X (f, h) + FRAME_COLUMN_WIDTH (f) / 2;
- pix_y = FRAME_LINE_TO_PIXEL_Y (f, v) + FRAME_LINE_HEIGHT (f) / 2;
-
- if (pix_x < 0) pix_x = 0;
- if (pix_x > FRAME_PIXEL_WIDTH (f)) pix_x = FRAME_PIXEL_WIDTH (f);
-
- if (pix_y < 0) pix_y = 0;
- if (pix_y > FRAME_PIXEL_HEIGHT (f)) pix_y = FRAME_PIXEL_HEIGHT (f);
-
- x_set_mouse_pixel_position (f, pix_x, pix_y);
-}
-
-
static int
note_mouse_movement (struct frame *frame, CGFloat x, CGFloat y)
/* ------------------------------------------------------------------------
NS_FACE_FOREGROUND (s->face) = tmp;
}
- font->driver->draw
- (s, 0, s->nchars, s->x, s->y,
- (flags == NS_DUMPGLYPH_NORMAL && !s->background_filled_p)
- || flags == NS_DUMPGLYPH_MOUSEFACE);
+ {
+ BOOL isComposite = s->first_glyph->type == COMPOSITE_GLYPH;
+ int end = isComposite ? s->cmp_to : s->nchars;
+
+ font->driver->draw
+ (s, s->cmp_from, end, s->x, s->ybase,
+ (flags == NS_DUMPGLYPH_NORMAL && !s->background_filled_p)
+ || flags == NS_DUMPGLYPH_MOUSEFACE);
+
+ }
{
NSColor *col = (NS_FACE_FOREGROUND (s->face) != 0
block_input ();
n_emacs_events_pending = 0;
- EVENT_INIT (ev);
- emacs_event = &ev;
+ ns_init_events (&ev);
q_event_ptr = hold_quit;
/* we manage autorelease pools by allocate/reallocate each time around
nevents = n_emacs_events_pending;
n_emacs_events_pending = 0;
- emacs_event = q_event_ptr = NULL;
+ ns_finish_events ();
+ q_event_ptr = NULL;
unblock_input ();
return nevents;
ns_send_appdefined (-1);
}
- EVENT_INIT (event);
block_input ();
- emacs_event = &event;
+ ns_init_events (&event);
if (++apploopnr != 1)
{
emacs_abort ();
}
[NSApp run];
--apploopnr;
- emacs_event = NULL;
+ ns_finish_events ();
if (nr > 0 && readfds)
{
c = 's';
NSTRACE (ns_create_terminal);
- terminal = create_terminal ();
+ terminal = create_terminal (output_ns, &ns_redisplay_interface);
- terminal->type = output_ns;
terminal->display_info.ns = dpyinfo;
dpyinfo->terminal = terminal;
- terminal->rif = &ns_redisplay_interface;
-
terminal->clear_frame_hook = ns_clear_frame;
- terminal->ins_del_lines_hook = 0; /* XXX vestigial? */
- terminal->delete_glyphs_hook = 0; /* XXX vestigial? */
terminal->ring_bell_hook = ns_ring_bell;
- terminal->reset_terminal_modes_hook = NULL;
- terminal->set_terminal_modes_hook = NULL;
terminal->update_begin_hook = ns_update_begin;
terminal->update_end_hook = ns_update_end;
- terminal->set_terminal_window_hook = NULL; /* XXX vestigial? */
terminal->read_socket_hook = ns_read_socket;
terminal->frame_up_to_date_hook = ns_frame_up_to_date;
terminal->mouse_position_hook = ns_mouse_position;
terminal->frame_rehighlight_hook = ns_frame_rehighlight;
terminal->frame_raise_lower_hook = ns_frame_raise_lower;
-
terminal->fullscreen_hook = ns_fullscreen_hook;
-
+ terminal->menu_show_hook = ns_menu_show;
+ terminal->popup_dialog_hook = ns_popup_dialog;
terminal->set_vertical_scroll_bar_hook = ns_set_vertical_scroll_bar;
terminal->condemn_scroll_bars_hook = ns_condemn_scroll_bars;
terminal->redeem_scroll_bar_hook = ns_redeem_scroll_bar;
terminal->judge_scroll_bars_hook = ns_judge_scroll_bars;
-
terminal->delete_frame_hook = x_destroy_window;
terminal->delete_terminal_hook = ns_delete_terminal;
+ /* Other hooks are NULL by default. */
return terminal;
}
{
if (self = [super init])
{
-#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_9
+#ifdef NS_IMPL_COCOA
self->isFirst = YES;
#endif
#ifdef NS_IMPL_GNUSTEP
return self;
}
-#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_9
+#ifdef NS_IMPL_COCOA
- (void)run
{
- NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+#ifndef NSAppKitVersionNumber10_8
+#define NSAppKitVersionNumber10_8 1187
+#endif
- if (isFirst) [self finishLaunching];
- isFirst = NO;
+ if (NSAppKitVersionNumber <= NSAppKitVersionNumber10_8)
+ {
+ [super run];
+ return;
+ }
- shouldKeepRunning = YES;
- do
- {
- [pool release];
- pool = [[NSAutoreleasePool alloc] init];
-
- NSEvent *event =
- [self nextEventMatchingMask:NSAnyEventMask
- untilDate:[NSDate distantFuture]
- inMode:NSDefaultRunLoopMode
- dequeue:YES];
- [self sendEvent:event];
- [self updateWindows];
- } while (shouldKeepRunning);
+ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+
+ if (isFirst) [self finishLaunching];
+ isFirst = NO;
+
+ shouldKeepRunning = YES;
+ do
+ {
+ [pool release];
+ pool = [[NSAutoreleasePool alloc] init];
- [pool release];
+ NSEvent *event =
+ [self nextEventMatchingMask:NSAnyEventMask
+ untilDate:[NSDate distantFuture]
+ inMode:NSDefaultRunLoopMode
+ dequeue:YES];
+ [self sendEvent:event];
+ [self updateWindows];
+ } while (shouldKeepRunning);
+
+ [pool release];
}
- (void)stop: (id)sender
// The file dialog still leaks 7k - 10k on 10.9 though.
[super stop:sender];
}
-#endif
+#endif /* NS_IMPL_COCOA */
- (void)logNotification: (NSNotification *)notification
{