]> code.delx.au - gnu-emacs/blobdiff - src/nsterm.h
Add a note how to use `tramp-own-remote-path'
[gnu-emacs] / src / nsterm.h
index 3fb8cfc9cd878f1bf63dfcc54b2f9a5e7d15b43f..862ff2ec6462e5b771b87866c2926cff48db5185 100644 (file)
@@ -1,13 +1,13 @@
 /* Definitions and headers for communication with NeXT/Open/GNUstep API.
-   Copyright (C) 1989, 1993, 2005, 2008-2015 Free Software Foundation,
+   Copyright (C) 1989, 1993, 2005, 2008-2016 Free Software Foundation,
    Inc.
 
 This file is part of GNU Emacs.
 
 GNU Emacs is free software: you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
+the Free Software Foundation, either version 3 of the License, or (at
+your option) any later version.
 
 GNU Emacs is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -67,12 +67,27 @@ typedef float EmacsCGFloat;
 
 /* Uncomment the following line to enable trace.
 
+   Uncomment suitable NSTRACE_GROUP_xxx lines to trace more.
+
    Hint: keep the trailing whitespace -- the version control system
    will reject accidental commits. */
 
 /* #define NSTRACE_ENABLED 1          */
 
 
+/* When non-zero, trace output is enabled for all parts, except those
+   explicitly disabled. */
+/* #define NSTRACE_ALL_GROUPS     1     */
+
+/* When non-zero, trace output is enabled in the corresponding part. */
+/* #define NSTRACE_GROUP_EVENTS  1     */
+/* #define NSTRACE_GROUP_UPDATES 1     */
+/* #define NSTRACE_GROUP_FRINGE  1     */
+/* #define NSTRACE_GROUP_COLOR   1     */
+/* #define NSTRACE_GROUP_GLYPHS  1     */
+/* #define NSTRACE_GROUP_FOCUS   1     */
+
+
 /* Print a call tree containing all annotated functions.
 
    The call structure of the functions is represented using
@@ -87,60 +102,94 @@ typedef float EmacsCGFloat;
    The first column contains the file name, the second the line
    number, and the third a number increasing for each trace line.
 
+   Note, when trace output from several threads are mixed, the output
+   can become misaligned, as all threads (currently) share one state.
+   This is post prominent when the EVENTS part is enabled.
+
    Note that the trace system, when enabled, use the GCC/Clang
-   "cleanup" extension.
-
-   For example (long lines manually split to reduce width):
-
-nsterm.m  : 1600: [ 4428]  ns_fullscreen_hook
-nsterm.m  : 7006: [ 4429]  | handleFS
-nsterm.m  : 7035: [ 4430]  | +--- FULLSCREEN_MAXIMIZED
-nsterm.m  : 7627: [ 4431]  | | performZoom
-nsterm.m  : 7636: [ 4432]  | | | zoom
-nsterm.m  :  874: [ 4433]  | | | | ns_update_auto_hide_menu_bar
-nsterm.m  : 6615: [ 4434]  | | | | [windowWillUseStandardFrame:
-                                       defaultFrame:(X:0 Y:0)/(W:1600 H:1177)]
-nsterm.m  :   99: [ 4435]  | | | | +--- fs_state: FULLSCREEN_NONE
-nsterm.m  :  119: [ 4436]  | | | | +--- fs_before_fs: -1
-nsterm.m  :  115: [ 4437]  | | | | +--- next_maximized: FULLSCREEN_MAXIMIZED
-nsterm.m  : 6619: [ 4438]  | | | | +--- ns_userRect: (X:0 Y:0)/(W:0 H:0)
-nsterm.m  : 6620: [ 4439]  | | | | +--- [sender frame]:
-                                                      (X:0 Y:626)/(W:595 H:551)
-nsterm.m  : 6644: [ 4440]  | | | | +--- ns_userRect (2):
-                                                      (X:0 Y:626)/(W:595 H:551)
-nsterm.m  : 6684: [ 4441]  | | | | +--- FULLSCREEN_MAXIMIZED
-nsterm.m  : 7057: [ 4442]  | | | | | setFSValue
-nsterm.m  :  115: [ 4443]  | | | | | +--- value: FULLSCREEN_MAXIMIZED
-nsterm.m  : 6711: [ 4444]  | | | | +--- Final ns_userRect:
-                                                      (X:0 Y:626)/(W:595 H:551)
-nsterm.m  : 6712: [ 4445]  | | | | +--- Final maximized_width: 1600
-nsterm.m  : 6713: [ 4446]  | | | | +--- Final maximized_height: 1177
-nsterm.m  :  119: [ 4447]  | | | | +--- Final next_maximized: -1
-nsterm.m  : 6209: [ 4448]  | | | | | windowWillResize: toSize: (W:1600 H:1177)
-nsterm.m  : 6210: [ 4449]  | | | | | +--- [sender frame]:
-                                                      (X:0 Y:626)/(W:595 H:551)
-nsterm.m  :  115: [ 4450]  | | | | | +--- fs_state: FULLSCREEN_MAXIMIZED
-nsterm.m  : 6274: [ 4451]  | | | | | +--- cols: 223  rows: 79
-nsterm.m  : 6299: [ 4452]  | | | | | +->> (W:1596 H:1167)
-nsterm.m  : 6718: [ 4453]  | | | | +->> (X:0 Y:0)/(W:1600 H:1177)
-
-   Here, "ns_fullscreen_hook" calls "handleFS", which is turn calls
-   "performZoom".  This function calls "[super performZoom]", which
-   isn't annoted (so it doesn't show up in the trace).  However, it
-   calls "zoom" which is annotated so it is part of the call trace.
-   Later, the method "windowWillUseStandardFrame" and the function
-   "setFSValue" are called.  The lines with "+---" contain extra
-   information and lines containing "->>" represent return values. */
+   "cleanup" extension. */
+
+/*   For example, the following is the output of `M-x
+     toggle-frame-maximized RET'.
+
+     (Long lines manually split to reduced width):
+
+nsterm.m  : 1608: [  354]  ns_fullscreen_hook
+nsterm.m  : 7180: [  355]  | [EmacsView handleFS]
+nsterm.m  : 7209: [  356]  | +--- FULLSCREEN_MAXIMIZED
+nsterm.m  : 7706: [  357]  | | [EmacsWindow performZoom:]
+nsterm.m  : 7715: [  358]  | | | [EmacsWindow zoom:]
+nsterm.m  :  882: [  359]  | | | | ns_update_auto_hide_menu_bar
+nsterm.m  : 6752: [  360]  | | | |
+  [EmacsView windowWillUseStandardFrame:defaultFrame:(X:0 Y:0)/(W:1600 H:1177)]
+nsterm.m  : 6753: [  361]  | | | | +--- fs_state: FULLSCREEN_NONE
+nsterm.m  : 6754: [  362]  | | | | +--- fs_before_fs: -1
+nsterm.m  : 6755: [  363]  | | | | +--- next_maximized: FULLSCREEN_MAXIMIZED
+nsterm.m  : 6756: [  364]  | | | | +--- ns_userRect: (X:0 Y:0)/(W:0 H:0)
+nsterm.m  : 6757: [  365]  | | | | +---
+                                      [sender frame]: (X:0 Y:626)/(W:595 H:551)
+nsterm.m  : 6781: [  366]  | | | | +---
+                                     ns_userRect (2): (X:0 Y:626)/(W:595 H:551)
+nsterm.m  : 6821: [  367]  | | | | +--- FULLSCREEN_MAXIMIZED
+nsterm.m  : 7232: [  368]  | | | | |
+                                    [EmacsView setFSValue:FULLSCREEN_MAXIMIZED]
+nsterm.m  : 6848: [  369]  | | | | +---
+                                   Final ns_userRect: (X:0 Y:626)/(W:595 H:551)
+nsterm.m  : 6849: [  370]  | | | | +--- Final maximized_width: 1600
+nsterm.m  : 6850: [  371]  | | | | +--- Final maximized_height: 1177
+nsterm.m  : 6851: [  372]  | | | | +--- Final next_maximized: -1
+nsterm.m  : 6322: [  373]  | | | | |
+                           [EmacsView windowWillResize:toSize: (W:1600 H:1177)]
+nsterm.m  : 6323: [  374]  | | | | | +---
+                                      [sender frame]: (X:0 Y:626)/(W:595 H:551)
+nsterm.m  : 6324: [  375]  | | | | | +--- fs_state: FULLSCREEN_MAXIMIZED
+nsterm.m  : 7027: [  376]  | | | | | | [EmacsView isFullscreen]
+nsterm.m  : 6387: [  377]  | | | | | +--- cols: 223  rows: 79
+nsterm.m  : 6412: [  378]  | | | | | +->> (W:1596 H:1167)
+nsterm.m  : 6855: [  379]  | | | | +->> (X:0 Y:0)/(W:1600 H:1177)
+*/
 
 #ifndef NSTRACE_ENABLED
 #define NSTRACE_ENABLED 0
 #endif
 
 #if NSTRACE_ENABLED
-extern int nstrace_num;
-extern int nstrace_depth;
+
+#ifndef NSTRACE_ALL_GROUPS
+#define NSTRACE_ALL_GROUPS 0
+#endif
+
+#ifndef NSTRACE_GROUP_EVENTS
+#define NSTRACE_GROUP_EVENTS NSTRACE_ALL_GROUPS
+#endif
+
+#ifndef NSTRACE_GROUP_UPDATES
+#define NSTRACE_GROUP_UPDATES NSTRACE_ALL_GROUPS
+#endif
+
+#ifndef NSTRACE_GROUP_FRINGE
+#define NSTRACE_GROUP_FRINGE NSTRACE_ALL_GROUPS
+#endif
+
+#ifndef NSTRACE_GROUP_COLOR
+#define NSTRACE_GROUP_COLOR NSTRACE_ALL_GROUPS
+#endif
+
+#ifndef NSTRACE_GROUP_GLYPHS
+#define NSTRACE_GROUP_GLYPHS NSTRACE_ALL_GROUPS
+#endif
+
+#ifndef NSTRACE_GROUP_FOCUS
+#define NSTRACE_GROUP_FOCUS NSTRACE_ALL_GROUPS
+#endif
+
+extern volatile int nstrace_num;
+extern volatile int nstrace_depth;
+extern volatile int nstrace_enabled_global;
 
 void nstrace_leave(int *);
+void nstrace_restore_global_trace_state(int *);
+char const * nstrace_fullscreen_type_name (int);
 
 /* printf-style trace output.  Output is aligned with contained heading. */
 #define NSTRACE_MSG_NO_DASHES(...)                                          \
@@ -149,7 +198,7 @@ void nstrace_leave(int *);
       if (nstrace_enabled)                                                  \
         {                                                                   \
           fprintf (stderr, "%-10s:%5d: [%5d]%.*s",                          \
-                   __FILE__, __LINE__, ++nstrace_num,                       \
+                   __FILE__, __LINE__, nstrace_num++,                       \
                    2*nstrace_depth, "  | | | | | | | | | | | | | | | ..");  \
           fprintf (stderr, __VA_ARGS__);                                    \
           fprintf (stderr, "\n");                                           \
@@ -176,6 +225,9 @@ void nstrace_leave(int *);
 #define NSTRACE_ARG_RECT(elt)   \
   NSTRACE_ARG_POINT((elt).origin), NSTRACE_ARG_SIZE((elt).size)
 
+#define NSTRACE_FMT_FSTYPE      "%s"
+#define NSTRACE_ARG_FSTYPE(elt) nstrace_fullscreen_type_name(elt)
+
 
 /* Macros for printing complex types as extra information. */
 
@@ -192,14 +244,8 @@ void nstrace_leave(int *);
                NSTRACE_ARG_RECT (rect));
 
 #define NSTRACE_FSTYPE(str,fs_type)                                     \
-  do                                                                    \
-    {                                                                   \
-      if (nstrace_enabled)                                              \
-        {                                                               \
-          ns_print_fullscreen_type_name(str, fs_type);                  \
-        }                                                               \
-    }                                                                   \
-  while(0)
+  NSTRACE_MSG (str ": " NSTRACE_FMT_FSTYPE,                             \
+               NSTRACE_ARG_FSTYPE (fs_type));
 
 
 /* Return value macros.
@@ -230,7 +276,7 @@ void nstrace_leave(int *);
 
 /* Function enter macros.
 
-   NSTRACE (fmt, ...) -- Enable trace output in curent block
+   NSTRACE (fmt, ...) -- Enable trace output in current block
                          (typically a function).  Accepts printf-style
                          arguments.
 
@@ -242,17 +288,25 @@ void nstrace_leave(int *);
 
 
 #define NSTRACE_WHEN(cond, ...)                                         \
+  __attribute__((cleanup(nstrace_restore_global_trace_state)))          \
+  int nstrace_saved_enabled_global = nstrace_enabled_global;            \
   __attribute__((cleanup(nstrace_leave)))                               \
-  int nstrace_enabled = (cond);                                         \
+  int nstrace_enabled = nstrace_enabled_global && (cond);               \
   if (nstrace_enabled) { ++nstrace_depth; }                             \
+  else { nstrace_enabled_global = 0; }                                  \
   NSTRACE_MSG_NO_DASHES(__VA_ARGS__);
 
+/* Unsilence called functions.
+
+   Concretely, this us used to allow "event" functions to be silenced
+   while trace output can be printed for functions they call. */
+#define NSTRACE_UNSILENCE() do { nstrace_enabled_global = 1; } while(0)
+
 #endif /* NSTRACE_ENABLED */
 
 #define NSTRACE(...)              NSTRACE_WHEN(1, __VA_ARGS__)
 #define NSTRACE_UNLESS(cond, ...) NSTRACE_WHEN(!(cond), __VA_ARGS__)
 
-
 /* Non-trace replacement versions. */
 #ifndef NSTRACE_WHEN
 #define NSTRACE_WHEN(...)
@@ -294,6 +348,9 @@ void nstrace_leave(int *);
 #define NSTRACE_RETURN_FSTYPE(fs_type)
 #endif
 
+#ifndef NSTRACE_UNSILENCE
+#define NSTRACE_UNSILENCE()
+#endif
 
 
 /* ==========================================================================
@@ -412,6 +469,13 @@ void nstrace_leave(int *);
 - (void)windowDidMove: (id)sender;
 #endif
 - (int)fullscreenState;
+
+/* Non-notification versions of NSView methods. Used for direct calls. */
+- (void)windowWillEnterFullScreen;
+- (void)windowDidEnterFullScreen;
+- (void)windowWillExitFullScreen;
+- (void)windowDidExitFullScreen;
+- (void)windowDidBecomeKey;
 @end
 
 
@@ -612,11 +676,13 @@ void nstrace_leave(int *);
    /* offset to the bottom of knob of last mouse down */
    CGFloat last_mouse_offset;
    float min_portion;
-   int pixel_height;
+   int pixel_length;
    enum scroll_bar_part last_hit_part;
 
    BOOL condemned;
 
+   BOOL horizontal;
+
    /* optimize against excessive positioning calls generated by emacs */
    int em_position;
    int em_portion;
@@ -948,7 +1014,7 @@ struct x_output
 #define FRAME_NS_TITLEBAR_HEIGHT(f) ((f)->output_data.ns->titlebar_height)
 #define FRAME_TOOLBAR_HEIGHT(f) ((f)->output_data.ns->toolbar_height)
 
-#define FRAME_DEFAULT_FACE(f) FACE_FROM_ID (f, DEFAULT_FACE_ID)
+#define FRAME_DEFAULT_FACE(f) FACE_FROM_ID_OR_NULL (f, DEFAULT_FACE_ID)
 
 #define FRAME_NS_VIEW(f) ((f)->output_data.ns->view)
 #define FRAME_CURSOR_COLOR(f) ((f)->output_data.ns->cursor_color)
@@ -980,10 +1046,10 @@ struct x_output
 
 /* 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)
+#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)
 
 /* Difference btwn char-line-calculated and actual SB heights.
    This is only a concern for rendering when SB on top. */
@@ -1077,6 +1143,8 @@ extern void  ns_retain_object (void *obj);
 extern void *ns_alloc_autorelease_pool (void);
 extern void ns_release_autorelease_pool (void *);
 extern const char *ns_get_defaults_value (const char *key);
+extern void ns_init_locale (void);
+
 
 /* in nsmenu */
 extern void update_frame_tool_bar (struct frame *f);