X-Git-Url: https://git.hcoop.net/bpt/emacs.git/blobdiff_plain/bba633792b813249a47dde828cbf84cdb946ba60..026b174672c427b035009911de305992a94098d6:/src/nsterm.m diff --git a/src/nsterm.m b/src/nsterm.m index 842ff194c4..c6450804f5 100644 --- a/src/nsterm.m +++ b/src/nsterm.m @@ -54,7 +54,7 @@ GNUstep port and post-20 update by Adrian Robert (arobert@cogsci.ucsd.edu) #include "termhooks.h" #include "termchar.h" - +#include "menu.h" #include "window.h" #include "keyboard.h" #include "buffer.h" @@ -396,6 +396,19 @@ void x_set_frame_alpha (struct frame *f); ========================================================================== */ +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) { @@ -1799,12 +1812,12 @@ x_set_frame_alpha (struct frame *f) 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? */ @@ -1816,28 +1829,6 @@ x_set_mouse_pixel_position (struct frame *f, int pix_x, int pix_y) #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) /* ------------------------------------------------------------------------ @@ -3355,10 +3346,16 @@ ns_draw_glyph_string (struct glyph_string *s) 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 @@ -3600,8 +3597,7 @@ ns_read_socket (struct terminal *terminal, struct input_event *hold_quit) 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 @@ -3642,7 +3638,8 @@ ns_read_socket (struct terminal *terminal, struct input_event *hold_quit) 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; @@ -3737,16 +3734,15 @@ ns_select (int nfds, fd_set *readfds, fd_set *writefds, 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'; @@ -4153,38 +4149,30 @@ ns_create_terminal (struct ns_display_info *dpyinfo) 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; } @@ -4465,7 +4453,7 @@ ns_term_shutdown (int sig) { 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 @@ -4476,30 +4464,40 @@ ns_term_shutdown (int sig) 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 @@ -4509,7 +4507,7 @@ ns_term_shutdown (int sig) // The file dialog still leaks 7k - 10k on 10.9 though. [super stop:sender]; } -#endif +#endif /* NS_IMPL_COCOA */ - (void)logNotification: (NSNotification *)notification {