/* 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
/* 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
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(...) \
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"); \
#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. */
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.
/* 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.
#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(...)
#define NSTRACE_RETURN_FSTYPE(fs_type)
#endif
+#ifndef NSTRACE_UNSILENCE
+#define NSTRACE_UNSILENCE()
+#endif
/* ==========================================================================
- (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
/* 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;
#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)
/* 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. */
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);