nsterm.h 27.2 KB
Newer Older
1
/* Definitions and headers for communication with NeXT/Open/GNUstep API.
Paul Eggert's avatar
Paul Eggert committed
2
   Copyright (C) 1989, 1993, 2005, 2008-2015 Free Software Foundation,
3
   Inc.
4 5 6

This file is part of GNU Emacs.

7
GNU Emacs is free software: you can redistribute it and/or modify
8
it under the terms of the GNU General Public License as published by
9 10
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
11 12 13 14 15 16 17

GNU Emacs is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
18 19
along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.  */

20 21 22 23 24

#include "dispextern.h"
#include "frame.h"
#include "character.h"
#include "font.h"
25
#include "sysselect.h"
26 27 28

#ifdef HAVE_NS

29 30 31 32
#ifdef NS_IMPL_COCOA
#ifndef MAC_OS_X_VERSION_10_6
#define MAC_OS_X_VERSION_10_6 1060
#endif
33 34 35 36 37 38
#ifndef MAC_OS_X_VERSION_10_7
#define MAC_OS_X_VERSION_10_7 1070
#endif
#ifndef MAC_OS_X_VERSION_10_8
#define MAC_OS_X_VERSION_10_8 1080
#endif
39 40 41
#ifndef MAC_OS_X_VERSION_10_9
#define MAC_OS_X_VERSION_10_9 1090
#endif
42 43 44 45 46

#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_7
#define HAVE_NATIVE_FS
#endif

47
#endif /* NS_IMPL_COCOA */
48

49 50
#ifdef __OBJC__

Glenn Morris's avatar
Glenn Morris committed
51
/* CGFloat on GNUstep may be 4 or 8 byte, but functions expect float* for some
52
   versions.
53 54 55 56
   On Cocoa >= 10.5, functions expect CGFloat*. Make compatible type.  */
#ifdef NS_IMPL_COCOA
typedef CGFloat EmacsCGFloat;
#elif GNUSTEP_GUI_MAJOR_VERSION > 0 || GNUSTEP_GUI_MINOR_VERSION >= 22
57 58 59 60 61
typedef CGFloat EmacsCGFloat;
#else
typedef float EmacsCGFloat;
#endif

62 63 64 65 66 67 68 69 70 71 72 73
/* ==========================================================================

   NSColor, EmacsColor category.

   ========================================================================== */
@interface NSColor (EmacsColor)
+ (NSColor *)colorForEmacsRed:(CGFloat)red green:(CGFloat)green
                         blue:(CGFloat)blue alpha:(CGFloat)alpha;
- (NSColor *)colorUsingDefaultColorSpace;

@end

74 75 76 77 78 79 80 81 82
/* ==========================================================================

   The Emacs application

   ========================================================================== */

/* We override sendEvent: as a means to stop/start the event loop */
@interface EmacsApp : NSApplication
{
Jan Djärv's avatar
Jan Djärv committed
83
#ifdef NS_IMPL_COCOA
Jan Djärv's avatar
Jan Djärv committed
84 85 86
  BOOL shouldKeepRunning;
  BOOL isFirst;
#endif
87
#ifdef NS_IMPL_GNUSTEP
Jan Djärv's avatar
Jan Djärv committed
88
  BOOL applicationDidFinishLaunchingCalled;
89 90 91
@public
  int nextappdefined;
#endif
92
}
93
- (void)logNotification: (NSNotification *)notification;
94
- (void)antialiasThresholdDidChange:(NSNotification *)notification;
95 96
- (void)sendEvent: (NSEvent *)theEvent;
- (void)showPreferencesWindow: (id)sender;
97
- (BOOL) openFile: (NSString *)fileName;
98
- (void)fd_handler: (id)unused;
99 100
- (void)timeout_handler: (NSTimer *)timedEntry;
- (BOOL)fulfillService: (NSString *)name withArg: (NSString *)arg;
101 102 103
#ifdef NS_IMPL_GNUSTEP
- (void)sendFromMainThread:(id)unused;
#endif
104 105
@end

106 107 108 109 110 111 112
#ifdef NS_IMPL_GNUSTEP
/* Dummy class to get rid of startup warnings.  */
@interface EmacsDocument : NSDocument
{
}
@end
#endif
113 114 115 116 117 118 119 120 121

/* ==========================================================================

   The main Emacs view

   ========================================================================== */

@class EmacsToolbar;

122
#ifdef NS_IMPL_COCOA
123 124 125 126
@interface EmacsView : NSView <NSTextInput, NSWindowDelegate>
#else
@interface EmacsView : NSView <NSTextInput>
#endif
127
   {
128
#ifdef NS_IMPL_COCOA
129
   char *old_title;
130 131
   BOOL maximizing_resize;
#endif
132 133 134
   BOOL windowClosing;
   NSString *workingText;
   BOOL processingCompose;
135 136
   int fs_state, fs_before_fs, next_maximized;
   int tibar_height, tobar_height, bwidth;
137 138
   int maximized_width, maximized_height;
   NSWindow *nonfs_window;
139
   BOOL fs_is_native;
140 141 142 143 144
@public
   struct frame *emacsframe;
   int rows, cols;
   int scrollbarsNeedingUpdate;
   EmacsToolbar *toolbar;
145
   NSRect ns_userRect;
146
   BOOL wait_for_tool_bar;
147 148 149
   }

/* AppKit-side interface */
150
- menuDown: (id)sender;
151 152 153 154 155 156 157 158 159 160 161 162 163
- toolbarClicked: (id)item;
- toggleToolbar: (id)sender;
- (void)keyDown: (NSEvent *)theEvent;
- (void)mouseDown: (NSEvent *)theEvent;
- (void)mouseUp: (NSEvent *)theEvent;
- setMiniwindowImage: (BOOL)setMini;

/* Emacs-side interface */
- initFrameFromEmacs: (struct frame *) f;
- (void) setRows: (int) r andColumns: (int) c;
- (void) setWindowClosing: (BOOL)closing;
- (EmacsToolbar *) toolbar;
- (void) deleteWorkingText;
164
- (void) updateFrameSize: (BOOL) delay;
165 166 167
- (void) handleFS;
- (void) setFSValue: (int)value;
- (void) toggleFullScreen: (id) sender;
168 169 170
- (BOOL) fsIsNative;
- (BOOL) isFullscreen;
#ifdef HAVE_NATIVE_FS
Paul Eggert's avatar
Paul Eggert committed
171
- (void) updateCollectionBehavior;
172
#endif
173 174

#ifdef NS_IMPL_GNUSTEP
175
- (void)windowDidMove: (id)sender;
176
#endif
177 178 179 180 181 182 183 184 185 186 187
@end


/* Small utility used for processing resize events under Cocoa. */
@interface EmacsWindow : NSWindow
{
  NSPoint grabOffset;
}
@end


188 189 190 191 192 193
/* Fullscreen version of the above.  */
@interface EmacsFSWindow : EmacsWindow
{
}
@end

194 195 196 197 198 199
/* ==========================================================================

   The main menu implementation

   ========================================================================== */

200
#ifdef NS_IMPL_COCOA
201 202 203 204
@interface EmacsMenu : NSMenu  <NSMenuDelegate>
#else
@interface EmacsMenu : NSMenu
#endif
205 206 207 208 209 210 211 212
{
  struct frame *frame;
  unsigned long keyEquivModMask;
}

- initWithTitle: (NSString *)title frame: (struct frame *)f;
- (void)setFrame: (struct frame *)f;
- (void)menuNeedsUpdate: (NSMenu *)menu; /* (delegate method) */
Jan D's avatar
Jan D committed
213
- (NSString *)parseKeyEquiv: (const char *)key;
214
- (NSMenuItem *)addItemWithWidgetValue: (void *)wvptr;
215
- (void)fillWithWidgetValue: (void *)wvptr;
Jan Djärv's avatar
Jan Djärv committed
216
- (void)fillWithWidgetValue: (void *)wvptr frame: (struct frame *)f;
Jan D's avatar
Jan D committed
217
- (EmacsMenu *)addSubmenuWithTitle: (const char *)title forFrame: (struct frame *)f;
218 219
- (void) clear;
- (Lisp_Object)runMenuAt: (NSPoint)p forFrame: (struct frame *)f
220
                 keymaps: (bool)keymaps;
221 222 223 224 225 226 227 228 229 230 231
@end


/* ==========================================================================

   Toolbar

   ========================================================================== */

@class EmacsImage;

232
#ifdef NS_IMPL_COCOA
233 234 235 236
@interface EmacsToolbar : NSToolbar <NSToolbarDelegate>
#else
@interface EmacsToolbar : NSToolbar
#endif
237 238 239 240 241 242 243 244 245
   {
     EmacsView *emacsView;
     NSMutableDictionary *identifierToItem;
     NSMutableArray *activeIdentifiers;
     NSArray *prevIdentifiers;
     unsigned long enablement, prevEnablement;
   }
- initForView: (EmacsView *)view withIdentifier: (NSString *)identifier;
- (void) clearActive;
246
- (void) clearAll;
247
- (BOOL) changed;
248 249 250
- (void) addDisplayItemWithImage: (EmacsImage *)img
                             idx: (int)idx
                             tag: (int)tag
Jan D's avatar
Jan D committed
251
                        helpText: (const char *)help
252
                         enabled: (BOOL)enabled;
253

254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274
/* delegate methods */
- (NSToolbarItem *)toolbar: (NSToolbar *)toolbar
     itemForItemIdentifier: (NSString *)itemIdentifier
 willBeInsertedIntoToolbar: (BOOL)flag;
- (NSArray *)toolbarDefaultItemIdentifiers: (NSToolbar *)toolbar;
- (NSArray *)toolbarAllowedItemIdentifiers: (NSToolbar *)toolbar;
@end


/* ==========================================================================

   Message / question windows

   ========================================================================== */

@interface EmacsDialogPanel : NSPanel
   {
   NSTextField *command;
   NSTextField *title;
   NSMatrix *matrix;
   int rows, cols;
275
   BOOL timer_fired, window_closed;
276
   Lisp_Object dialog_return;
277
   Lisp_Object *button_values;
278 279
   }
- initFromContents: (Lisp_Object)menu isQuestion: (BOOL)isQ;
280 281 282 283
- (void)process_dialog: (Lisp_Object)list;
- (void)addButton: (char *)str value: (int)tag row: (int)row;
- (void)addString: (char *)str row: (int)row;
- (void)addSplit;
284
- (Lisp_Object)runDialogAt: (NSPoint)p;
285
- (void)timeout_handler: (NSTimer *)timedEntry;
286 287
@end

288
#ifdef NS_IMPL_COCOA
289 290 291 292
@interface EmacsTooltip : NSObject <NSWindowDelegate>
#else
@interface EmacsTooltip : NSObject
#endif
293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309
  {
    NSWindow *win;
    NSTextField *textField;
    NSTimer *timer;
  }
- init;
- (void) setText: (char *)text;
- (void) showAtX: (int)x Y: (int)y for: (int)seconds;
- (void) hide;
- (BOOL) isActive;
- (NSRect) frame;
@end


/* ==========================================================================

   File open/save panels
310
   This and next override methods to handle keyboard input in panels.
311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370

   ========================================================================== */

@interface EmacsSavePanel : NSSavePanel
{
}
@end
@interface EmacsOpenPanel : NSOpenPanel
{
}
@end

@interface EmacsFileDelegate : NSObject
{
}
- (BOOL)panel: (id)sender isValidFilename: (NSString *)filename;
- (BOOL)panel: (id)sender shouldShowFilename: (NSString *)filename;
- (NSString *)panel: (id)sender userEnteredFilename: (NSString *)filename
          confirmed: (BOOL)okFlag;
@end


/* ==========================================================================

   Images and stippling

   ========================================================================== */

@interface EmacsImage : NSImage
{
  NSBitmapImageRep *bmRep; /* used for accessing pixel data */
  unsigned char *pixmapData[5]; /* shortcut to access pixel data */
  NSColor *stippleMask;
}
+ allocInitFromFile: (Lisp_Object)file;
- (void)dealloc;
- initFromXBM: (unsigned char *)bits width: (int)w height: (int)h
         flip: (BOOL)flip;
- initFromSkipXBM: (unsigned char *)bits width: (int)w height: (int)h
             flip: (BOOL)flip length: (int)length;
- setXBMColor: (NSColor *)color;
- initForXPMWithDepth: (int)depth width: (int)width height: (int)height;
- (void)setPixmapData;
- (unsigned long)getPixelAtX: (int)x Y: (int)y;
- (void)setPixelAtX: (int)x Y: (int)y toRed: (unsigned char)r
               green: (unsigned char)g blue: (unsigned char)b
              alpha:(unsigned char)a;
- (void)setAlphaAtX: (int)x Y: (int)y to: (unsigned char)a;
- (NSColor *)stippleMask;
@end


/* ==========================================================================

   Scrollbars

   ========================================================================== */

@interface EmacsScroller : NSScroller
  {
371
   struct window *window;
372 373 374 375
   struct frame *frame;
   NSResponder *prevResponder;

   /* offset to the bottom of knob of last mouse down */
376
   CGFloat last_mouse_offset;
377 378
   float min_portion;
   int pixel_height;
379
   enum scroll_bar_part last_hit_part;
380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398

   BOOL condemned;

   /* optimize against excessive positioning calls generated by emacs */
   int em_position;
   int em_portion;
   int em_whole;
   }

- initFrame: (NSRect )r window: (Lisp_Object)win;
- (void)setFrame: (NSRect)r;

- setPosition: (int) position portion: (int) portion whole: (int) whole;
- (int) checkSamePosition: (int)position portion: (int)portion
                    whole: (int)whole;
- (void) sendScrollEventAtLoc: (float)loc fromEvent: (NSEvent *)e;
- repeatScroll: (NSTimer *)sender;
- condemn;
- reprieve;
399
- (bool)judge;
400 401 402 403 404
@end


/* ==========================================================================

405
   Rendering
406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425

   ========================================================================== */

#ifdef NS_IMPL_COCOA
/* rendering util */
@interface EmacsGlyphStorage : NSObject <NSGlyphStorage>
{
@public
  NSAttributedString *attrStr;
  NSMutableDictionary *dict;
  CGGlyph *cglyphs;
  unsigned long maxChar, maxGlyph;
  long i, len;
}
- initWithCapacity: (unsigned long) c;
- (void) setString: (NSString *)str font: (NSFont *)font;
@end
#endif	/* NS_IMPL_COCOA */

extern NSArray *ns_send_types, *ns_return_types;
426
extern NSString *ns_app_name;
427
extern EmacsMenu *mainMenu, *svcsMenu, *dockMenu;
428 429

/* Apple removed the declaration, but kept the implementation */
430
#if defined (NS_IMPL_COCOA)
431 432 433 434 435 436 437 438 439 440 441 442 443 444 445
@interface NSApplication (EmacsApp)
- (void)setAppleMenu: (NSMenu *)menu;
@end
#endif

#endif  /* __OBJC__ */



/* ==========================================================================

   Non-OO stuff

   ========================================================================== */

446 447 448 449 450 451 452 453 454 455 456
/* Special keycodes that we pass down the event chain */
#define KEY_NS_POWER_OFF               ((1<<28)|(0<<16)|1)
#define KEY_NS_OPEN_FILE               ((1<<28)|(0<<16)|2)
#define KEY_NS_OPEN_TEMP_FILE          ((1<<28)|(0<<16)|3)
#define KEY_NS_CHANGE_FONT             ((1<<28)|(0<<16)|7)
#define KEY_NS_OPEN_FILE_LINE          ((1<<28)|(0<<16)|8)
#define KEY_NS_PUT_WORKING_TEXT        ((1<<28)|(0<<16)|9)
#define KEY_NS_UNPUT_WORKING_TEXT      ((1<<28)|(0<<16)|10)
#define KEY_NS_SPI_SERVICE_CALL        ((1<<28)|(0<<16)|11)
#define KEY_NS_NEW_FRAME               ((1<<28)|(0<<16)|12)
#define KEY_NS_TOGGLE_TOOLBAR          ((1<<28)|(0<<16)|13)
457
#define KEY_NS_SHOW_PREFS              ((1<<28)|(0<<16)|14)
458

459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475
/* could use list to store these, but rest of emacs has a big infrastructure
   for managing a table of bitmap "records" */
struct ns_bitmap_record
{
#ifdef __OBJC__
  EmacsImage *img;
#else
  void *img;
#endif
  char *file;
  int refcount;
  int height, width, depth;
};

/* this to map between emacs color indices and NSColor objects */
struct ns_color_table
{
476 477
  ptrdiff_t size;
  ptrdiff_t avail;
478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506
#ifdef __OBJC__
  NSColor **colors;
  NSMutableSet *empty_indices;
#else
  void **items;
  void *availIndices;
#endif
};
#define NS_COLOR_CAPACITY 256

#define RGB_TO_ULONG(r, g, b) (((r) << 16) | ((g) << 8) | (b))
#define ARGB_TO_ULONG(a, r, g, b) (((a) << 24) | ((r) << 16) | ((g) << 8) | (b))

#define ALPHA_FROM_ULONG(color) ((color) >> 24)
#define RED_FROM_ULONG(color) (((color) >> 16) & 0xff)
#define GREEN_FROM_ULONG(color) (((color) >> 8) & 0xff)
#define BLUE_FROM_ULONG(color) ((color) & 0xff)

/* Do not change `* 0x101' in the following lines to `<< 8'.  If
   changed, image masks in 1-bit depth will not work. */
#define RED16_FROM_ULONG(color) (RED_FROM_ULONG(color) * 0x101)
#define GREEN16_FROM_ULONG(color) (GREEN_FROM_ULONG(color) * 0x101)
#define BLUE16_FROM_ULONG(color) (BLUE_FROM_ULONG(color) * 0x101)

/* this extends font backend font */
struct nsfont_info
{
  struct font font;

Juanma Barranquero's avatar
Juanma Barranquero committed
507
  char *name;  /* PostScript name, uniquely identifies on NS systems */
508 509 510 511

  /* The following metrics are stored as float rather than int. */

  float width;  /* Maximum advance for the font.  */
512 513 514 515 516 517
  float height;
  float underpos;
  float underwidth;
  float size;
#ifdef __OBJC__
  NSFont *nsfont;
518
#if defined (NS_IMPL_COCOA)
519
  CGFontRef cgfont;
520
#else /* GNUstep */
521 522 523 524 525 526 527 528
  void *cgfont;
#endif
#else /* ! OBJC */
  void *nsfont;
  void *cgfont;
#endif
  char bold, ital;  /* convenience flags */
  char synthItal;
529
  XCharStruct max_bounds;
530 531
  /* we compute glyph codes and metrics on-demand in blocks of 256 indexed
     by hibyte, lobyte */
Juanma Barranquero's avatar
Juanma Barranquero committed
532
  unsigned short **glyphs; /* map Unicode index to glyph */
533 534 535 536 537 538 539 540 541 542 543 544 545
  struct font_metrics **metrics;
};


/* init'd in ns_initialize_display_info () */
struct ns_display_info
{
  /* Chain of all ns_display_info structures.  */
  struct ns_display_info *next;

  /* The generic display parameters corresponding to this NS display. */
  struct terminal *terminal;

546
  /* This is a cons cell of the form (NAME . FONT-LIST-CACHE).  */
547 548 549 550 551 552 553 554 555 556 557 558
  Lisp_Object name_list_element;

  /* The number of fonts loaded. */
  int n_fonts;

  /* Minimum width over all characters in all fonts in font_table.  */
  int smallest_char_width;

  /* Minimum font height over all fonts in font_table.  */
  int smallest_font_height;

  struct ns_bitmap_record *bitmaps;
559 560
  ptrdiff_t bitmaps_size;
  ptrdiff_t bitmaps_last;
561 562 563

  struct ns_color_table *color_table;

564
  /* DPI resolution of this screen */
565 566
  double resx, resy;

567
  /* Mask of things that cause the mouse to be grabbed */
568 569 570 571 572 573 574 575
  int grabbed;

  int n_planes;

  int color_p;

  Window root_window;

576
  /* Xism */
577 578
  XrmDatabase xrdb;

579
  /* The cursor to use for vertical scroll bars. */
580 581
  Cursor vertical_scroll_bar_cursor;

582 583 584
  /* The cursor to use for horizontal scroll bars. */
  Cursor horizontal_scroll_bar_cursor;

585 586 587
  /* Information about the range of text currently shown in
     mouse-face.  */
  Mouse_HLInfo mouse_highlight;
588

589 590
  struct frame *x_highlight_frame;
  struct frame *x_focus_frame;
591 592 593

  /* The frame where the mouse was last time we reported a mouse event.  */
  struct frame *last_mouse_frame;
594 595 596 597 598 599 600 601

  /* The frame where the mouse was last time we reported a mouse motion.  */
  struct frame *last_mouse_motion_frame;

  /* Position where the mouse was last time we reported a motion.
     This is a position on last_mouse_motion_frame.  */
  int last_mouse_motion_x;
  int last_mouse_motion_y;
602 603 604 605 606 607 608 609 610 611 612 613 614

  /* Where the mouse was last time we reported a mouse position.  */
  NSRect last_mouse_glyph;

  /* Time of last mouse movement.  */
  Time last_mouse_movement_time;

  /* The scroll bar in which the last motion event occurred.  */
#ifdef __OBJC__
  EmacsScroller *last_mouse_scroll_bar;
#else
  void *last_mouse_scroll_bar;
#endif
615 616 617
};

/* This is a chain of structures for all the NS displays currently in use.  */
618
extern struct ns_display_info *x_display_list;
619

620
extern struct ns_display_info *ns_display_info_for_name (Lisp_Object name);
621 622 623 624 625 626

struct ns_output
{
#ifdef __OBJC__
  EmacsView *view;
  id miniimage;
627
  NSColor *cursor_color;
628 629 630 631 632 633
  NSColor *foreground_color;
  NSColor *background_color;
  EmacsToolbar *toolbar;
#else
  void *view;
  void *miniimage;
634
  void *cursor_color;
635 636 637 638 639
  void *foreground_color;
  void *background_color;
  void *toolbar;
#endif

640
  /* NSCursors init'ed in initFrameFromEmacs */
641 642 643 644 645 646
  Cursor text_cursor;
  Cursor nontext_cursor;
  Cursor modeline_cursor;
  Cursor hand_cursor;
  Cursor hourglass_cursor;
  Cursor horizontal_drag_cursor;
647
  Cursor vertical_drag_cursor;
648

649
  /* NS-specific */
650 651
  Cursor current_pointer;

652
  /* lord knows why Emacs needs to know about our Window ids.. */
653 654 655 656 657 658 659 660 661 662
  Window window_desc, parent_desc;
  char explicit_parent;

  struct font *font;
  int baseline_offset;

  /* If a fontset is specified for this frame instead of font, this
     value contains an ID of the fontset, else -1.  */
  int fontset; /* only used with font_backend */

663 664
  int icon_top;
  int icon_left;
665 666 667 668 669 670 671 672 673 674 675 676 677

  /* The size of the extra width currently allotted for vertical
     scroll bars, in pixels.  */
  int vertical_scroll_bar_extra;

  /* The height of the titlebar decoration (included in NSWindow's frame). */
  int titlebar_height;

  /* The height of the toolbar if displayed, else 0. */
  int toolbar_height;

  /* This is the Emacs structure for the NS display this frame is on.  */
  struct ns_display_info *display_info;
678 679 680

  /* Non-zero if we are zooming (maximizing) the frame.  */
  int zooming;
681 682
};

683
/* this dummy decl needed to support TTYs */
684 685
struct x_output
{
686
  int unused;
687 688 689 690
};


/* This gives the ns_display_info structure for the display F is on.  */
691
#define FRAME_DISPLAY_INFO(f) ((f)->output_data.ns->display_info)
692 693 694 695 696 697 698
#define FRAME_X_OUTPUT(f) ((f)->output_data.ns)
#define FRAME_NS_WINDOW(f) ((f)->output_data.ns->window_desc)
#define FRAME_X_WINDOW(f) ((f)->output_data.ns->window_desc)

/* This is the `Display *' which frame F is on.  */
#define FRAME_NS_DISPLAY(f) (0)
#define FRAME_X_DISPLAY(f) (0)
699
#define FRAME_X_SCREEN(f) (0)
700
#define FRAME_X_VISUAL(f) FRAME_DISPLAY_INFO(f)->visual
701 702 703 704 705 706 707

#define FRAME_FOREGROUND_COLOR(f) ((f)->output_data.ns->foreground_color)
#define FRAME_BACKGROUND_COLOR(f) ((f)->output_data.ns->background_color)

#define NS_FACE_FOREGROUND(f) ((f)->foreground)
#define NS_FACE_BACKGROUND(f) ((f)->background)
#define FRAME_NS_TITLEBAR_HEIGHT(f) ((f)->output_data.ns->titlebar_height)
708
#define FRAME_TOOLBAR_HEIGHT(f) ((f)->output_data.ns->toolbar_height)
709 710 711 712

#define FRAME_DEFAULT_FACE(f) FACE_FROM_ID (f, DEFAULT_FACE_ID)

#define FRAME_NS_VIEW(f) ((f)->output_data.ns->view)
713
#define FRAME_CURSOR_COLOR(f) ((f)->output_data.ns->cursor_color)
714 715 716 717 718
#define FRAME_POINTER_TYPE(f) ((f)->output_data.ns->current_pointer)

#define FRAME_FONT(f) ((f)->output_data.ns->font)

#ifdef __OBJC__
719
#define XNS_SCROLL_BAR(vec) ((id) XSAVE_POINTER (vec, 0))
720
#else
721
#define XNS_SCROLL_BAR(vec) XSAVE_POINTER (vec, 0)
722 723 724
#endif

/* Compute pixel size for vertical scroll bars */
725 726 727 728 729 730 731 732 733 734 735 736 737 738
#define NS_SCROLL_BAR_WIDTH(f)						\
  (FRAME_HAS_VERTICAL_SCROLL_BARS (f)					\
   ? rint (FRAME_CONFIG_SCROLL_BAR_WIDTH (f) > 0			\
	   ? FRAME_CONFIG_SCROLL_BAR_WIDTH (f)				\
	   : (FRAME_SCROLL_BAR_COLS (f) * FRAME_COLUMN_WIDTH (f)))	\
   : 0)

/* Compute pixel size for horizontal scroll bars */
#define NS_SCROLL_BAR_HEIGHT(f)						\
  (FRAME_HAS_HORIZONTAL_SCROLL_BARS (f)					\
   ? rint (FRAME_CONFIG_SCROLL_BAR_HEIGHT (f) > 0			\
	   ? FRAME_CONFIG_SCROLL_BAR_HEIGHT (f)				\
	   : (FRAME_SCROLL_BAR_LINES (f) * FRAME_LINE_HEIGHT (f)))	\
   : 0)
739 740 741 742 743 744 745 746

/* Difference btwn char-column-calculated and actual SB widths.
   This is only a concern for rendering when SB on left. */
#define NS_SCROLL_BAR_ADJUST(w, f)		\
(WINDOW_HAS_VERTICAL_SCROLL_BAR_ON_LEFT (w) ?	\
    (FRAME_SCROLL_BAR_COLS (f) * FRAME_COLUMN_WIDTH (f)	\
        - NS_SCROLL_BAR_WIDTH (f)) : 0)

747 748 749 750 751 752 753
/* Difference btwn char-line-calculated and actual SB heights.
   This is only a concern for rendering when SB on top. */
#define NS_SCROLL_BAR_ADJUST_HORIZONTALLY(w, f)		\
  (WINDOW_HAS_HORIZONTAL_SCROLL_BARS (w) ?		\
   (FRAME_SCROLL_BAR_LINES (f) * FRAME_LINE_HEIGHT (f)	\
    - NS_SCROLL_BAR_HEIGHT (f)) : 0)

754
/* XXX: fix for GNUstep inconsistent accounting for titlebar */
755 756 757 758 759 760
#ifdef NS_IMPL_GNUSTEP
#define NS_TOP_POS(f) ((f)->top_pos + 18)
#else
#define NS_TOP_POS(f) ((f)->top_pos)
#endif

761
#define FRAME_NS_FONT_TABLE(f) (FRAME_DISPLAY_INFO (f)->font_table)
762 763 764 765 766 767 768 769 770

#define FRAME_FONTSET(f) ((f)->output_data.ns->fontset)

#define FRAME_BASELINE_OFFSET(f) ((f)->output_data.ns->baseline_offset)
#define BLACK_PIX_DEFAULT(f) 0x000000
#define WHITE_PIX_DEFAULT(f) 0xFFFFFF

/* First position where characters can be shown (instead of scrollbar, if
   it is on left. */
771 772
#define FIRST_CHAR_POSITION(f)				\
  (! (FRAME_HAS_VERTICAL_SCROLL_BARS_ON_LEFT (f)) ? 0	\
773 774
   : FRAME_SCROLL_BAR_COLS (f))

775
extern struct ns_display_info *ns_term_init (Lisp_Object display_name);
776 777 778 779 780 781 782 783 784
extern void ns_term_shutdown (int sig);

/* constants for text rendering */
#define NS_DUMPGLYPH_NORMAL             0
#define NS_DUMPGLYPH_CURSOR             1
#define NS_DUMPGLYPH_FOREGROUND         2
#define NS_DUMPGLYPH_MOUSEFACE          3


785

786 787 788 789 790 791
/* In nsfont, called from fontset.c */
extern void nsfont_make_fontset_for_font (Lisp_Object name,
                                         Lisp_Object font_object);

/* In nsfont, for debugging */
struct glyph_string;
792
void ns_dump_glyphstring (struct glyph_string *s);
793 794 795

/* Implemented in nsterm, published in or needed from nsfns. */
extern Lisp_Object Qfontsize;
Dmitry Antipov's avatar
Dmitry Antipov committed
796
extern Lisp_Object ns_list_fonts (struct frame *f, Lisp_Object pattern,
797 798 799 800 801
                                  int size, int maxnames);
extern void ns_clear_frame (struct frame *f);

extern const char *ns_xlfd_to_fontname (const char *xlfd);

802 803 804 805 806
extern Lisp_Object ns_map_event_to_object (void);
#ifdef __OBJC__
extern Lisp_Object ns_string_from_pasteboard (id pb);
extern void ns_string_to_pasteboard (id pb, Lisp_Object str);
#endif
807 808
extern Lisp_Object ns_get_local_selection (Lisp_Object selection_name,
                                           Lisp_Object target_type);
809 810
extern void nxatoms_of_nsselect (void);
extern int ns_lisp_to_cursor_type (Lisp_Object arg);
811
extern Lisp_Object ns_cursor_type_to_lisp (int arg);
812
extern void ns_set_name_as_filename (struct frame *f);
813
extern void ns_set_doc_edited (void);
814

815
extern bool
816 817
ns_defined_color (struct frame *f,
                  const char *name,
818 819
                  XColor *color_def, bool alloc,
                  bool makeIndex);
820 821
extern void
ns_query_color (void *col, XColor *color_def, int setPixel);
822 823

#ifdef __OBJC__
824
extern Lisp_Object ns_color_to_lisp (NSColor *col);
825 826 827 828
extern int ns_lisp_to_color (Lisp_Object color, NSColor **col);
extern NSColor *ns_lookup_indexed_color (unsigned long idx, struct frame *f);
extern unsigned long ns_index_color (NSColor *color, struct frame *f);
extern void ns_free_indexed_color (unsigned long idx, struct frame *f);
829
extern const char *ns_get_pending_menu_title (void);
830
extern void ns_check_menu_open (NSMenu *menu);
831
extern void ns_check_pending_open_menu (void);
832 833 834 835 836
#endif

/* C access to ObjC functionality */
extern void  ns_release_object (void *obj);
extern void  ns_retain_object (void *obj);
837 838 839
extern void *ns_alloc_autorelease_pool (void);
extern void ns_release_autorelease_pool (void *);
extern const char *ns_get_defaults_value (const char *key);
840 841

/* in nsmenu */
Dmitry Antipov's avatar
Dmitry Antipov committed
842 843 844
extern void update_frame_tool_bar (struct frame *f);
extern void free_frame_tool_bar (struct frame *f);
extern void find_and_call_menu_selection (struct frame *f,
845
    int menu_bar_items_used, Lisp_Object vector, void *client_data);
Dmitry Antipov's avatar
Dmitry Antipov committed
846
extern Lisp_Object find_and_return_menu_selection (struct frame *f,
847
                                                   bool keymaps,
848
                                                   void *client_data);
849
extern Lisp_Object ns_popup_dialog (struct frame *, Lisp_Object header,
Eli Zaretskii's avatar
Eli Zaretskii committed
850
                                    Lisp_Object contents);
851

852 853 854
#define NSAPP_DATA2_RUNASSCRIPT 10
extern void ns_run_ascript (void);

855 856 857
#define NSAPP_DATA2_RUNFILEDIALOG 11
extern void ns_run_file_dialog (void);

858
extern const char *ns_etc_directory (void);
859
extern const char *ns_exec_path (void);
860
extern const char *ns_load_path (void);
861 862 863 864
extern void syms_of_nsterm (void);
extern void syms_of_nsfns (void);
extern void syms_of_nsmenu (void);
extern void syms_of_nsselect (void);
865 866 867 868 869 870

/* From nsimage.m, needed in image.c */
struct image;
extern void *ns_image_from_XBM (unsigned char *bits, int width, int height);
extern void *ns_image_for_XPM (int width, int height, int depth);
extern void *ns_image_from_file (Lisp_Object file);
871 872
extern bool ns_load_image (struct frame *f, struct image *img,
			   Lisp_Object spec_file, Lisp_Object spec_data);
873 874 875 876 877 878
extern int ns_image_width (void *img);
extern int ns_image_height (void *img);
extern unsigned long ns_get_pixel (void *img, int x, int y);
extern void ns_put_pixel (void *img, int x, int y, unsigned long argb);
extern void ns_set_alpha (void *img, int x, int y, unsigned char a);

Jan D's avatar
Jan D committed
879 880
extern int x_display_pixel_height (struct ns_display_info *);
extern int x_display_pixel_width (struct ns_display_info *);
881

882
/* This in nsterm.m */
883
extern void x_destroy_window (struct frame *f);
884
extern int ns_select (int nfds, fd_set *readfds, fd_set *writefds,
885
		      fd_set *exceptfds, struct timespec const *timeout,
886
		      sigset_t const *sigmask);
887 888 889
extern unsigned long ns_get_rgb_color (struct frame *f,
                                       float r, float g, float b, float a);

890 891 892
extern void ns_init_events ();
extern void ns_finish_events ();

893
#ifdef __OBJC__
894
/* From nsterm.m, needed in nsfont.m. */
895 896 897
extern void
ns_draw_text_decoration (struct glyph_string *s, struct face *face,
                         NSColor *defaultCol, CGFloat width, CGFloat x);
898 899 900 901
/* Needed in nsfns.m.  */
extern void
ns_set_represented_filename (NSString* fstr, struct frame *f);

902 903
#endif

904 905 906 907 908 909 910 911 912 913 914 915
#ifdef NS_IMPL_GNUSTEP
extern char gnustep_base_version[];  /* version tracking */
#endif

#define MINWIDTH 10
#define MINHEIGHT 10

/* Screen max coordinate
 Using larger coordinates causes movewindow/placewindow to abort */
#define SCREENMAX 16000

#define NS_SCROLL_BAR_WIDTH_DEFAULT     [EmacsScroller scrollerWidth]
916
#define NS_SCROLL_BAR_HEIGHT_DEFAULT    [EmacsScroller scrollerHeight]
917
/* This is to match emacs on other platforms, ugly though it is. */
918 919
#define NS_SELECTION_BG_COLOR_DEFAULT	@"LightGoldenrod2";
#define NS_SELECTION_FG_COLOR_DEFAULT	@"Black";
920 921 922 923 924 925 926 927
#define RESIZE_HANDLE_SIZE 12

/* Little utility macros */
#define IN_BOUND(min, x, max) (((x) < (min)) \
                                ? (min) : (((x)>(max)) ? (max) : (x)))
#define SCREENMAXBOUND(x) (IN_BOUND (-SCREENMAX, x, SCREENMAX))

#endif	/* HAVE_NS */