nsterm.h 27.1 KB
Newer Older
1
/* Definitions and headers for communication with NeXT/Open/GNUstep API.
2
   Copyright (C) 1989, 1993, 2005, 2008-2014 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
#ifdef NS_IMPL_COCOA
30 31 32 33 34 35
#ifndef MAC_OS_X_VERSION_10_4
#define MAC_OS_X_VERSION_10_4 1040
#endif
#ifndef MAC_OS_X_VERSION_10_5
#define MAC_OS_X_VERSION_10_5 1050
#endif
36 37 38
#ifndef MAC_OS_X_VERSION_10_6
#define MAC_OS_X_VERSION_10_6 1060
#endif
39 40 41 42 43 44
#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
45 46 47
#ifndef MAC_OS_X_VERSION_10_9
#define MAC_OS_X_VERSION_10_9 1090
#endif
48 49 50 51 52

#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_7
#define HAVE_NATIVE_FS
#endif

53
#endif /* NS_IMPL_COCOA */
54

55 56
#ifdef __OBJC__

Glenn Morris's avatar
Glenn Morris committed
57
/* CGFloat on GNUstep may be 4 or 8 byte, but functions expect float* for some
58
   versions.
59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
   On Cocoa >= 10.5, functions expect CGFloat*. Make compatible type.  */
#ifdef NS_IMPL_COCOA

#ifndef NS_HAVE_NSINTEGER
#if defined (__LP64__) && __LP64__
typedef double CGFloat;
typedef long NSInteger;
typedef unsigned long NSUInteger;
#else
typedef float CGFloat;
typedef int NSInteger;
typedef unsigned int NSUInteger;
#endif /* not LP64 */
#endif /* not NS_HAVE_NSINTEGER */

typedef CGFloat EmacsCGFloat;

#elif GNUSTEP_GUI_MAJOR_VERSION > 0 || GNUSTEP_GUI_MINOR_VERSION >= 22
77 78 79 80 81
typedef CGFloat EmacsCGFloat;
#else
typedef float EmacsCGFloat;
#endif

82 83 84 85 86 87 88 89 90 91 92 93
/* ==========================================================================

   NSColor, EmacsColor category.

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

@end

94 95 96 97 98 99 100 101 102
/* ==========================================================================

   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
103 104 105 106
#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_9
  BOOL shouldKeepRunning;
  BOOL isFirst;
#endif
107
#ifdef NS_IMPL_GNUSTEP
Jan Djärv's avatar
Jan Djärv committed
108
  BOOL applicationDidFinishLaunchingCalled;
109 110 111
@public
  int nextappdefined;
#endif
112
}
113
- (void)logNotification: (NSNotification *)notification;
114
- (void)antialiasThresholdDidChange:(NSNotification *)notification;
115 116
- (void)sendEvent: (NSEvent *)theEvent;
- (void)showPreferencesWindow: (id)sender;
117
- (BOOL) openFile: (NSString *)fileName;
118
- (void)fd_handler: (id)unused;
119 120
- (void)timeout_handler: (NSTimer *)timedEntry;
- (BOOL)fulfillService: (NSString *)name withArg: (NSString *)arg;
121 122 123
#ifdef NS_IMPL_GNUSTEP
- (void)sendFromMainThread:(id)unused;
#endif
124 125
@end

126 127 128 129 130 131 132
#ifdef NS_IMPL_GNUSTEP
/* Dummy class to get rid of startup warnings.  */
@interface EmacsDocument : NSDocument
{
}
@end
#endif
133 134 135 136 137 138 139 140 141

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

   The main Emacs view

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

@class EmacsToolbar;

142 143 144 145 146
#if defined (NS_IMPL_COCOA) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6
@interface EmacsView : NSView <NSTextInput, NSWindowDelegate>
#else
@interface EmacsView : NSView <NSTextInput>
#endif
147
   {
148
#ifdef NS_IMPL_COCOA
149
   char *old_title;
150 151
   BOOL maximizing_resize;
#endif
152 153 154
   BOOL windowClosing;
   NSString *workingText;
   BOOL processingCompose;
155 156
   int fs_state, fs_before_fs, next_maximized;
   int tibar_height, tobar_height, bwidth;
157 158
   int maximized_width, maximized_height;
   NSWindow *nonfs_window;
159
   BOOL fs_is_native;
160 161 162 163 164
@public
   struct frame *emacsframe;
   int rows, cols;
   int scrollbarsNeedingUpdate;
   EmacsToolbar *toolbar;
165
   NSRect ns_userRect;
Jan Djärv's avatar
Jan Djärv committed
166
   BOOL wait_for_tool_bar;
167 168 169
   }

/* AppKit-side interface */
170
- menuDown: (id)sender;
171 172 173 174 175 176 177 178 179 180 181 182 183
- 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;
184
- (void) updateFrameSize: (BOOL) delay;
185 186 187
- (void) handleFS;
- (void) setFSValue: (int)value;
- (void) toggleFullScreen: (id) sender;
188 189 190
- (BOOL) fsIsNative;
- (BOOL) isFullscreen;
#ifdef HAVE_NATIVE_FS
Paul Eggert's avatar
Paul Eggert committed
191
- (void) updateCollectionBehavior;
192
#endif
193 194

#ifdef NS_IMPL_GNUSTEP
195
- (void)windowDidMove: (id)sender;
196
#endif
197 198 199 200 201 202 203 204 205 206 207
@end


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


208 209 210 211 212 213
/* Fullscreen version of the above.  */
@interface EmacsFSWindow : EmacsWindow
{
}
@end

214 215 216 217 218 219
/* ==========================================================================

   The main menu implementation

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

220 221 222 223 224
#if defined (NS_IMPL_COCOA) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6
@interface EmacsMenu : NSMenu  <NSMenuDelegate>
#else
@interface EmacsMenu : NSMenu
#endif
225 226 227 228 229 230 231 232
{
  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
233
- (NSString *)parseKeyEquiv: (const char *)key;
234
- (NSMenuItem *)addItemWithWidgetValue: (void *)wvptr;
235
- (void)fillWithWidgetValue: (void *)wvptr;
Jan Djärv's avatar
Jan Djärv committed
236
- (void)fillWithWidgetValue: (void *)wvptr frame: (struct frame *)f;
Jan D's avatar
Jan D committed
237
- (EmacsMenu *)addSubmenuWithTitle: (const char *)title forFrame: (struct frame *)f;
238 239
- (void) clear;
- (Lisp_Object)runMenuAt: (NSPoint)p forFrame: (struct frame *)f
240
                 keymaps: (bool)keymaps;
241 242 243 244 245 246 247 248 249 250 251
@end


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

   Toolbar

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

@class EmacsImage;

252 253 254 255 256
#if defined (NS_IMPL_COCOA) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6
@interface EmacsToolbar : NSToolbar <NSToolbarDelegate>
#else
@interface EmacsToolbar : NSToolbar
#endif
257 258 259 260 261 262 263 264 265
   {
     EmacsView *emacsView;
     NSMutableDictionary *identifierToItem;
     NSMutableArray *activeIdentifiers;
     NSArray *prevIdentifiers;
     unsigned long enablement, prevEnablement;
   }
- initForView: (EmacsView *)view withIdentifier: (NSString *)identifier;
- (void) clearActive;
266
- (void) clearAll;
267
- (BOOL) changed;
268 269 270
- (void) addDisplayItemWithImage: (EmacsImage *)img
                             idx: (int)idx
                             tag: (int)tag
Jan D's avatar
Jan D committed
271
                        helpText: (const char *)help
272
                         enabled: (BOOL)enabled;
273

274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294
/* 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;
295
   BOOL timer_fired, window_closed;
296
   Lisp_Object dialog_return;
297
   Lisp_Object *button_values;
298 299
   }
- initFromContents: (Lisp_Object)menu isQuestion: (BOOL)isQ;
300 301 302 303
- (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;
304
- (Lisp_Object)runDialogAt: (NSPoint)p;
305
- (void)timeout_handler: (NSTimer *)timedEntry;
306 307
@end

308 309 310 311 312
#if defined (NS_IMPL_COCOA) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6
@interface EmacsTooltip : NSObject <NSWindowDelegate>
#else
@interface EmacsTooltip : NSObject
#endif
313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329
  {
    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
330
   This and next override methods to handle keyboard input in panels.
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 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395

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

@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
{
  id imageListNext;
  int refCount;
  NSBitmapImageRep *bmRep; /* used for accessing pixel data */
  unsigned char *pixmapData[5]; /* shortcut to access pixel data */
  NSColor *stippleMask;
}
+ allocInitFromFile: (Lisp_Object)file;
- reference;
- imageListSetNext: (id)arg;
- imageListNext;
- (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
  {
396
   struct window *window;
397 398 399 400
   struct frame *frame;
   NSResponder *prevResponder;

   /* offset to the bottom of knob of last mouse down */
401
   CGFloat last_mouse_offset;
402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430
   float min_portion;
   int pixel_height;
   int last_hit_part;

   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;
- (void)dealloc;

- 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;
- judge;
@end


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

431
   Rendering
432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451

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

#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;
452
extern NSString *ns_app_name;
453
extern EmacsMenu *mainMenu, *svcsMenu, *dockMenu;
454 455

/* Apple removed the declaration, but kept the implementation */
456
#if defined (NS_IMPL_COCOA)
457 458 459 460 461 462 463 464 465 466 467 468 469 470 471
@interface NSApplication (EmacsApp)
- (void)setAppleMenu: (NSMenu *)menu;
@end
#endif

#endif  /* __OBJC__ */



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

   Non-OO stuff

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

472 473 474 475 476 477 478 479 480 481 482
/* 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)
483
#define KEY_NS_SHOW_PREFS              ((1<<28)|(0<<16)|14)
484

485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501
/* 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
{
502 503
  ptrdiff_t size;
  ptrdiff_t avail;
504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532
#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
533
  char *name;  /* PostScript name, uniquely identifies on NS systems */
534 535 536 537

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

  float width;  /* Maximum advance for the font.  */
538 539 540 541 542 543
  float height;
  float underpos;
  float underwidth;
  float size;
#ifdef __OBJC__
  NSFont *nsfont;
544
#if defined (NS_IMPL_COCOA)
545
  CGFontRef cgfont;
546
#else /* GNUstep */
547 548 549 550 551 552 553 554
  void *cgfont;
#endif
#else /* ! OBJC */
  void *nsfont;
  void *cgfont;
#endif
  char bold, ital;  /* convenience flags */
  char synthItal;
555
  XCharStruct max_bounds;
556 557
  /* we compute glyph codes and metrics on-demand in blocks of 256 indexed
     by hibyte, lobyte */
Juanma Barranquero's avatar
Juanma Barranquero committed
558
  unsigned short **glyphs; /* map Unicode index to glyph */
559 560 561 562 563 564 565 566 567 568 569 570 571
  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;

572
  /* This is a cons cell of the form (NAME . FONT-LIST-CACHE).  */
573 574 575 576 577 578 579 580 581 582 583 584
  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;
585 586
  ptrdiff_t bitmaps_size;
  ptrdiff_t bitmaps_last;
587 588 589

  struct ns_color_table *color_table;

590
  /* DPI resolution of this screen */
591 592
  double resx, resy;

593
  /* Mask of things that cause the mouse to be grabbed */
594 595 596 597 598 599 600 601
  int grabbed;

  int n_planes;

  int color_p;

  Window root_window;

602
  /* Xism */
603 604
  XrmDatabase xrdb;

605
  /* The cursor to use for vertical scroll bars. */
606 607
  Cursor vertical_scroll_bar_cursor;

608 609 610
  /* Information about the range of text currently shown in
     mouse-face.  */
  Mouse_HLInfo mouse_highlight;
611

612 613
  struct frame *x_highlight_frame;
  struct frame *x_focus_frame;
614 615 616

  /* The frame where the mouse was last time we reported a mouse event.  */
  struct frame *last_mouse_frame;
617 618 619 620 621 622 623 624

  /* 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;
625 626 627 628 629 630 631 632 633 634 635 636 637

  /* 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
638 639 640
};

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

643
extern struct ns_display_info *ns_display_info_for_name (Lisp_Object name);
644 645 646 647 648 649

struct ns_output
{
#ifdef __OBJC__
  EmacsView *view;
  id miniimage;
650
  NSColor *cursor_color;
651 652 653 654 655 656
  NSColor *foreground_color;
  NSColor *background_color;
  EmacsToolbar *toolbar;
#else
  void *view;
  void *miniimage;
657
  void *cursor_color;
658 659 660 661 662
  void *foreground_color;
  void *background_color;
  void *toolbar;
#endif

663
  /* NSCursors init'ed in initFrameFromEmacs */
664 665 666 667 668 669
  Cursor text_cursor;
  Cursor nontext_cursor;
  Cursor modeline_cursor;
  Cursor hand_cursor;
  Cursor hourglass_cursor;
  Cursor horizontal_drag_cursor;
670
  Cursor vertical_drag_cursor;
671

672
  /* NS-specific */
673 674
  Cursor current_pointer;

675
  /* lord knows why Emacs needs to know about our Window ids.. */
676 677 678 679 680 681 682 683 684 685
  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 */

686 687
  int icon_top;
  int icon_left;
688 689 690 691 692 693 694 695 696 697 698 699 700

  /* 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;
701 702 703

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

706
/* this dummy decl needed to support TTYs */
707 708
struct x_output
{
709
  int unused;
710 711 712 713
};


/* This gives the ns_display_info structure for the display F is on.  */
714
#define FRAME_DISPLAY_INFO(f) ((f)->output_data.ns->display_info)
715 716 717 718 719 720 721
#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)
722
#define FRAME_X_SCREEN(f) (0)
723
#define FRAME_X_VISUAL(f) FRAME_DISPLAY_INFO(f)->visual
724 725 726 727 728 729 730

#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)
731
#define FRAME_TOOLBAR_HEIGHT(f) ((f)->output_data.ns->toolbar_height)
732 733 734 735

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

#define FRAME_NS_VIEW(f) ((f)->output_data.ns->view)
736
#define FRAME_CURSOR_COLOR(f) ((f)->output_data.ns->cursor_color)
737 738 739 740 741
#define FRAME_POINTER_TYPE(f) ((f)->output_data.ns->current_pointer)

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

#ifdef __OBJC__
742
#define XNS_SCROLL_BAR(vec) ((id) XSAVE_POINTER (vec, 0))
743
#else
744
#define XNS_SCROLL_BAR(vec) XSAVE_POINTER (vec, 0)
745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761
#endif

/* Compute pixel size for vertical scroll bars */
#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)

/* 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)

762
/* XXX: fix for GNUstep inconsistent accounting for titlebar */
763 764 765 766 767 768
#ifdef NS_IMPL_GNUSTEP
#define NS_TOP_POS(f) ((f)->top_pos + 18)
#else
#define NS_TOP_POS(f) ((f)->top_pos)
#endif

769
#define FRAME_NS_FONT_TABLE(f) (FRAME_DISPLAY_INFO (f)->font_table)
770 771 772 773 774 775 776 777 778 779 780 781 782

#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. */
#define FIRST_CHAR_POSITION(f) \
  (! (FRAME_HAS_VERTICAL_SCROLL_BARS_ON_LEFT (f)) ? 0 \
   : FRAME_SCROLL_BAR_COLS (f))

783
extern struct ns_display_info *ns_term_init (Lisp_Object display_name);
784 785 786 787 788 789 790 791 792
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


793

794 795 796 797 798 799
/* 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;
800
void ns_dump_glyphstring (struct glyph_string *s);
801 802 803

/* Implemented in nsterm, published in or needed from nsfns. */
extern Lisp_Object Qfontsize;
Dmitry Antipov's avatar
Dmitry Antipov committed
804
extern Lisp_Object ns_list_fonts (struct frame *f, Lisp_Object pattern,
805 806 807 808 809
                                  int size, int maxnames);
extern void ns_clear_frame (struct frame *f);

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

810 811 812 813 814
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
815 816
extern Lisp_Object ns_get_local_selection (Lisp_Object selection_name,
                                           Lisp_Object target_type);
817 818
extern void nxatoms_of_nsselect (void);
extern int ns_lisp_to_cursor_type (Lisp_Object arg);
819
extern Lisp_Object ns_cursor_type_to_lisp (int arg);
820
extern void ns_set_name_as_filename (struct frame *f);
821
extern void ns_set_doc_edited (void);
822

823
extern bool
824 825
ns_defined_color (struct frame *f,
                  const char *name,
826 827
                  XColor *color_def, bool alloc,
                  bool makeIndex);
828 829
extern void
ns_query_color (void *col, XColor *color_def, int setPixel);
830 831

#ifdef __OBJC__
832
extern Lisp_Object ns_color_to_lisp (NSColor *col);
833 834 835 836
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);
837
extern const char *ns_get_pending_menu_title (void);
838
extern void ns_check_menu_open (NSMenu *menu);
839
extern void ns_check_pending_open_menu (void);
840 841 842 843 844
#endif

/* C access to ObjC functionality */
extern void  ns_release_object (void *obj);
extern void  ns_retain_object (void *obj);
845 846 847
extern void *ns_alloc_autorelease_pool (void);
extern void ns_release_autorelease_pool (void *);
extern const char *ns_get_defaults_value (const char *key);
848 849

/* in nsmenu */
Dmitry Antipov's avatar
Dmitry Antipov committed
850 851 852
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,
853
    int menu_bar_items_used, Lisp_Object vector, void *client_data);
Dmitry Antipov's avatar
Dmitry Antipov committed
854
extern Lisp_Object find_and_return_menu_selection (struct frame *f,
855
                                                   bool keymaps,
856
                                                   void *client_data);
Eli Zaretskii's avatar
Eli Zaretskii committed
857 858
extern Lisp_Object ns_popup_dialog (Lisp_Object position, Lisp_Object header,
                                    Lisp_Object contents);
859

860 861 862
#define NSAPP_DATA2_RUNASSCRIPT 10
extern void ns_run_ascript (void);

863 864 865
#define NSAPP_DATA2_RUNFILEDIALOG 11
extern void ns_run_file_dialog (void);

866
extern const char *ns_etc_directory (void);
867
extern const char *ns_exec_path (void);
868
extern const char *ns_load_path (void);
869 870 871 872
extern void syms_of_nsterm (void);
extern void syms_of_nsfns (void);
extern void syms_of_nsmenu (void);
extern void syms_of_nsselect (void);
873 874 875 876 877 878

/* 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);
879 880
extern bool ns_load_image (struct frame *f, struct image *img,
			   Lisp_Object spec_file, Lisp_Object spec_data);
881 882 883 884 885 886
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
887 888
extern int x_display_pixel_height (struct ns_display_info *);
extern int x_display_pixel_width (struct ns_display_info *);
889

890
/* This in nsterm.m */
891
extern void x_destroy_window (struct frame *f);
892
extern int ns_select (int nfds, fd_set *readfds, fd_set *writefds,
893
		      fd_set *exceptfds, struct timespec const *timeout,
894
		      sigset_t const *sigmask);
895 896 897
extern unsigned long ns_get_rgb_color (struct frame *f,
                                       float r, float g, float b, float a);

898 899 900 901 902 903 904
/* From nsterm.m, needed in nsfont.m. */
#ifdef __OBJC__
extern void
ns_draw_text_decoration (struct glyph_string *s, struct face *face,
                         NSColor *defaultCol, CGFloat width, CGFloat x);
#endif

905 906 907 908 909 910 911 912 913 914 915 916 917
#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]
/* 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 */