X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/d8462361f2d087d6f7c745305c61a266843ee19c..0e963201d03d9229bb8ac4323291d2b0119526ed:/src/nsterm.h diff --git a/src/nsterm.h b/src/nsterm.h index 9035ee1a32..6ca584e677 100644 --- a/src/nsterm.h +++ b/src/nsterm.h @@ -1,5 +1,5 @@ /* 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. @@ -59,6 +59,300 @@ typedef CGFloat EmacsCGFloat; typedef float EmacsCGFloat; #endif +/* ========================================================================== + + Trace support + + ========================================================================== */ + +/* 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 + indentation and vertical lines. Extra information is printed using + horizontal lines that connect to the vertical line. + + The return value is represented using the arrow "->>". For simple + functions, the arrow can be printed on the same line as the + function name. If more output is printed, it is connected to the + vertical line of the function. + + 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, 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 + +#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(...) \ + do \ + { \ + if (nstrace_enabled) \ + { \ + fprintf (stderr, "%-10s:%5d: [%5d]%.*s", \ + __FILE__, __LINE__, nstrace_num++, \ + 2*nstrace_depth, " | | | | | | | | | | | | | | | .."); \ + fprintf (stderr, __VA_ARGS__); \ + fprintf (stderr, "\n"); \ + } \ + } \ + while(0) + +#define NSTRACE_MSG(...) NSTRACE_MSG_NO_DASHES("+--- " __VA_ARGS__) + + + +/* Macros for printing complex types. + + NSTRACE_FMT_what -- Printf format string for "what". + NSTRACE_ARG_what(x) -- Printf argument for "what". */ + +#define NSTRACE_FMT_SIZE "(W:%.0f H:%.0f)" +#define NSTRACE_ARG_SIZE(elt) (elt).width, (elt).height + +#define NSTRACE_FMT_POINT "(X:%.0f Y:%.0f)" +#define NSTRACE_ARG_POINT(elt) (elt).x, (elt).y + +#define NSTRACE_FMT_RECT NSTRACE_FMT_POINT "/" NSTRACE_FMT_SIZE +#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. */ + +#define NSTRACE_SIZE(str,size) \ + NSTRACE_MSG (str ": " NSTRACE_FMT_SIZE, \ + NSTRACE_ARG_SIZE (size)); + +#define NSTRACE_POINT(str,point) \ + NSTRACE_MSG (str ": " NSTRACE_FMT_POINT, \ + NSTRACE_ARG_POINT (point)); + +#define NSTRACE_RECT(str,rect) \ + NSTRACE_MSG (str ": " NSTRACE_FMT_RECT, \ + NSTRACE_ARG_RECT (rect)); + +#define NSTRACE_FSTYPE(str,fs_type) \ + NSTRACE_MSG (str ": " NSTRACE_FMT_FSTYPE, \ + NSTRACE_ARG_FSTYPE (fs_type)); + + +/* Return value macros. + + NSTRACE_RETURN(fmt, ...) - Print a return value, support printf-style + format string and arguments. + + NSTRACE_RETURN_what(obj) - Print a return value of kind WHAT. + + NSTRACE_FMT_RETURN - A string literal representing a returned + value. Useful when creating a format string + to printf-like constructs like NSTRACE(). */ + +#define NSTRACE_FMT_RETURN "->>" + +#define NSTRACE_RETURN(...) \ + NSTRACE_MSG_NO_DASHES ("+" NSTRACE_FMT_RETURN " " __VA_ARGS__) + +#define NSTRACE_RETURN_SIZE(size) \ + NSTRACE_RETURN(NSTRACE_FMT_SIZE, NSTRACE_ARG_SIZE(size)) + +#define NSTRACE_RETURN_POINT(point) \ + NSTRACE_RETURN(NSTRACE_FMT_POINT, NSTRACE_ARG_POINT(point)) + +#define NSTRACE_RETURN_RECT(rect) \ + NSTRACE_RETURN(NSTRACE_FMT_RECT, NSTRACE_ARG_RECT(rect)) + + +/* Function enter macros. + + NSTRACE (fmt, ...) -- Enable trace output in current block + (typically a function). Accepts printf-style + arguments. + + NSTRACE_WHEN (cond, fmt, ...) -- Enable trace output when COND is true. + + NSTRACE_UNLESS (cond, fmt, ...) -- Enable trace output unless COND is + true. */ + + + +#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 = 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(...) +#endif + +#ifndef NSTRACE_MSG +#define NSTRACE_MSG(...) +#endif + +#ifndef NSTRACE_SIZE +#define NSTRACE_SIZE(str,size) +#endif + +#ifndef NSTRACE_POINT +#define NSTRACE_POINT(str,point) +#endif + +#ifndef NSTRACE_RECT +#define NSTRACE_RECT(str,rect) +#endif + +#ifndef NSTRACE_FSTYPE +#define NSTRACE_FSTYPE(str,fs_type) +#endif + +#ifndef NSTRACE_RETURN_SIZE +#define NSTRACE_RETURN_SIZE(size) +#endif + +#ifndef NSTRACE_RETURN_POINT +#define NSTRACE_RETURN_POINT(point) +#endif + +#ifndef NSTRACE_RETURN_RECT +#define NSTRACE_RETURN_RECT(rect) +#endif + +#ifndef NSTRACE_RETURN_FSTYPE +#define NSTRACE_RETURN_FSTYPE(fs_type) +#endif + +#ifndef NSTRACE_UNSILENCE +#define NSTRACE_UNSILENCE() +#endif + + /* ========================================================================== NSColor, EmacsColor category. @@ -174,6 +468,14 @@ typedef float EmacsCGFloat; #ifdef NS_IMPL_GNUSTEP - (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 @@ -341,13 +643,12 @@ typedef float EmacsCGFloat; NSBitmapImageRep *bmRep; /* used for accessing pixel data */ unsigned char *pixmapData[5]; /* shortcut to access pixel data */ NSColor *stippleMask; + unsigned long xbm_fg; } + 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; + fg: (unsigned long)fg bg: (unsigned long)bg; - setXBMColor: (NSColor *)color; - initForXPMWithDepth: (int)depth width: (int)width height: (int)height; - (void)setPixmapData; @@ -397,6 +698,7 @@ typedef float EmacsCGFloat; - condemn; - reprieve; - (bool)judge; ++ (CGFloat)scrollerWidth; @end @@ -678,6 +980,9 @@ struct ns_output /* Non-zero if we are zooming (maximizing) the frame. */ int zooming; + + /* Non-zero if we are doing an animation, e.g. toggling the tool bar. */ + int in_animation; }; /* this dummy decl needed to support TTYs */ @@ -864,7 +1169,8 @@ extern void syms_of_nsselect (void); /* 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_from_XBM (unsigned char *bits, int width, int height, + unsigned long fg, unsigned long bg); extern void *ns_image_for_XPM (int width, int height, int depth); extern void *ns_image_from_file (Lisp_Object file); extern bool ns_load_image (struct frame *f, struct image *img,