diff options
| author | Anders Lindgren | 2016-02-20 16:24:40 +0100 |
|---|---|---|
| committer | Anders Lindgren | 2016-02-20 16:24:40 +0100 |
| commit | c5f72aa573bc45b82ad6479ae0eba5ffc7916fb9 (patch) | |
| tree | 2d8062ffe5f85110144978cc05bd0805b57ef036 | |
| parent | 6de26a78de83ca9a8f096056e91c14fdb2aedc84 (diff) | |
| download | emacs-c5f72aa573bc45b82ad6479ae0eba5ffc7916fb9.tar.gz emacs-c5f72aa573bc45b82ad6479ae0eba5ffc7916fb9.zip | |
Update NextStep readme and add wish list.
* nextstep/README: Rewritten from scratch. New sections on
"History", "Overview of Cocoa and Objective-C", "Guidelines",
"Tracing Support", and "GNUStep". Expanded the "See Also" section.
* nextstep/WISHLIST: New file containing list of issues and ideas
associated with the NS port of Emacs.
| -rw-r--r-- | nextstep/README | 102 | ||||
| -rw-r--r-- | nextstep/WISHLIST | 247 |
2 files changed, 346 insertions, 3 deletions
diff --git a/nextstep/README b/nextstep/README index 45b9b23ee10..c16d55b35b9 100644 --- a/nextstep/README +++ b/nextstep/README | |||
| @@ -1,4 +1,100 @@ | |||
| 1 | This directory contains files needed to build Emacs on Nextstep-based | ||
| 2 | platforms, including GNUstep and Mac OS X (using the Cocoa libraries). | ||
| 3 | 1 | ||
| 4 | See the INSTALL file in this directory for compilation instructions. | 2 | NS -- the Cocoa interface for OS X and compatible systems |
| 3 | --------------------------------------------------------- | ||
| 4 | |||
| 5 | This directory contains files needed to build Emacs on system based on | ||
| 6 | NextStep (NS), including OS X (Mac) and GNUstep, using the Cocoa API. | ||
| 7 | |||
| 8 | |||
| 9 | HISTORY | ||
| 10 | |||
| 11 | Up to Emacs 22, the OS X interface was implemented using the C-based | ||
| 12 | Carbon API. Starting with Emacs 23, the interface was rewritten in | ||
| 13 | Objective-C using the Cocoa API. Meanwhile, the Carbon interface has | ||
| 14 | been maintained independently under the name "mac". | ||
| 15 | |||
| 16 | |||
| 17 | OVERVIEW OF COCOA AND OBJECTIVE-C | ||
| 18 | |||
| 19 | Cocoa is an API for the Objective-C language, an objective oriented | ||
| 20 | superset of C. Anybody with experience with iOS or modern OS X | ||
| 21 | application development should feel at home. | ||
| 22 | |||
| 23 | A method call in Objective-C differs from most other languages in the | ||
| 24 | fact that it doesn't have a normal name. Instead, the method name is | ||
| 25 | made up of the name of each parameter. An exception to this rule are | ||
| 26 | methods without parameters. | ||
| 27 | |||
| 28 | The following calls a method in the object `anObject'. | ||
| 29 | |||
| 30 | [anObject alpha:1 beta:2 gamma:3]; | ||
| 31 | |||
| 32 | Classes are declared like the following: | ||
| 33 | |||
| 34 | @interface AClassName | ||
| 35 | { | ||
| 36 | // A class method. | ||
| 37 | + (TYPE)name1:(TYPE)param1 | ||
| 38 | |||
| 39 | // An object method. | ||
| 40 | - (TYPE)name1:(TYPE)param1 name2:(TYPE)param2; | ||
| 41 | } | ||
| 42 | @end | ||
| 43 | |||
| 44 | |||
| 45 | GUIDELINES | ||
| 46 | |||
| 47 | * Adhere the to the FSF philosophy that a feature in GNU software | ||
| 48 | should not only be available on non-free systems. | ||
| 49 | |||
| 50 | * People with varying Cocoa and Objective-C skills will read and | ||
| 51 | modify the NS code over a long period of time. Keep the code simple | ||
| 52 | and avoid language constructs that makes the code hard to maintain. | ||
| 53 | |||
| 54 | * Don't use macros and types intended for the XCode Interface Builder, | ||
| 55 | like `IBAction'. | ||
| 56 | |||
| 57 | * The NS interface should work on all version of OS X from 10.6.8 | ||
| 58 | (Snow Leopard) to the latest official release. | ||
| 59 | |||
| 60 | * Under OS X, it is possible to build Emacs using NS, X11, or console | ||
| 61 | only. A new OS X feature should work in all appropriate builds. | ||
| 62 | |||
| 63 | |||
| 64 | TRACING SUPPORT | ||
| 65 | |||
| 66 | The NS interface features a printf-based trace package that prints the | ||
| 67 | call tree of selected functions in the Cocoa interface, plus various | ||
| 68 | extra information. It can be enabled by uncommenting the line | ||
| 69 | defining `NSTRACE_ENABLED' in "nsterm.h". To enable more output, | ||
| 70 | uncomment the lines defining symbols starting with `NSTRACE_GROUP'. | ||
| 71 | |||
| 72 | |||
| 73 | GNUSTEP AND OTHER COMPATIBLE SYSTEMS | ||
| 74 | |||
| 75 | The NS interface works on system compatible with OS X, for example | ||
| 76 | GNUstep. Even though they are less frequently used, this is important | ||
| 77 | for a number of reasons: | ||
| 78 | |||
| 79 | * It supports the GNUstep project and provides an Emacs with the same | ||
| 80 | look-and-feel as the rest of the system. | ||
| 81 | |||
| 82 | * This allows other Emacs developers to test their changes on the NS | ||
| 83 | interface without having access to an OS X machine. | ||
| 84 | |||
| 85 | * If a feature in the NS interface work on free systems like GNUstep, | ||
| 86 | this meets the FSF requirement that features in GNU software should | ||
| 87 | not only be available on non-free systems. | ||
| 88 | |||
| 89 | |||
| 90 | SEE ALSO | ||
| 91 | |||
| 92 | The src/ns... files contains the C and Objective-C parts. | ||
| 93 | |||
| 94 | The lisp/term/ns-win.el file contains the lisp part of the NS | ||
| 95 | interface. | ||
| 96 | |||
| 97 | The INSTALL file in this directory for compilation instructions. | ||
| 98 | |||
| 99 | The WISHLIST file in this directory for a list of ideas for future | ||
| 100 | development of the NS interface. | ||
diff --git a/nextstep/WISHLIST b/nextstep/WISHLIST new file mode 100644 index 00000000000..673f091b7b4 --- /dev/null +++ b/nextstep/WISHLIST | |||
| @@ -0,0 +1,247 @@ | |||
| 1 | -*- org -*- | ||
| 2 | |||
| 3 | Wish list for the "NS" OS X Emacs port | ||
| 4 | -------------------------------------- | ||
| 5 | |||
| 6 | Note: This document is written using "org-mode", a plain-text | ||
| 7 | format supporting outlines. To expand a heading, press TAB. To | ||
| 8 | expand all headings and subheadings, press S-TAB until Emacs | ||
| 9 | responds "SHOW ALL". | ||
| 10 | |||
| 11 | * Introduction | ||
| 12 | |||
| 13 | This is a wishlist for future development of the "NS" Emacs user | ||
| 14 | interface whose primary use is the official Emacs version on OS X. | ||
| 15 | |||
| 16 | This list should be seen as a complement to the bug- and wishlist on | ||
| 17 | [[http://debbugs.gnu.org/cgi/pkgreport.cgi?package%3Demacs][debbugs]], the Emacs bug tracker. | ||
| 18 | |||
| 19 | * Missing features | ||
| 20 | |||
| 21 | This sections contains features found in other official Emacs ports. | ||
| 22 | |||
| 23 | ** Support for "xwidget" | ||
| 24 | |||
| 25 | Emacs 25 has support for "xwidgets", a system to include operating | ||
| 26 | system components into an Emacs buffer. The components range from | ||
| 27 | simple buttons to "webkit" (effectively, a web browser). | ||
| 28 | |||
| 29 | Currently, "xwidget" only works for the "gtk+" framework but it is | ||
| 30 | designed to be compatible with multiple Emacs ports. | ||
| 31 | |||
| 32 | ** Respect `frame-inhibit-implied-resize' | ||
| 33 | |||
| 34 | When the variable `frame-inhibit-implied-resize' is non-nil, frames | ||
| 35 | should not be resized when operations like changing font or toggling | ||
| 36 | the tool bar is performed. | ||
| 37 | |||
| 38 | Unfortunately, the tool bar (and possible other operations) always | ||
| 39 | resize the frame. | ||
| 40 | |||
| 41 | ** Support `proced' (implement `process-attributes') | ||
| 42 | |||
| 43 | Unfortunately, a user-level process like Emacs does not have the | ||
| 44 | privileges to get information about other processes under OS X. | ||
| 45 | |||
| 46 | There are other ways to do this: | ||
| 47 | |||
| 48 | 1) Spawn "ps" and parse the output ("ps" has superuser privileges). | ||
| 49 | |||
| 50 | 2) Sign Emacs as part of the distribution process. | ||
| 51 | |||
| 52 | 3) Ask the user to self-sign Emacs, if this feature is of interest. | ||
| 53 | |||
| 54 | Anders Lindgren <andlind@gmail.com> has implemented | ||
| 55 | `process-attributes' for OS X -- which currently only work when | ||
| 56 | running Emacs as root. | ||
| 57 | |||
| 58 | [[http://emacsredux.com/blog/2013/05/02/manage-processes-with-proced/][See this article by Bozhidar Batsov for an overview of Proced.]] | ||
| 59 | |||
| 60 | ** Tooltip properties | ||
| 61 | |||
| 62 | Tooltip properties like the background color and font are hard wired, | ||
| 63 | even though Emacs allow a user to customize such features. | ||
| 64 | |||
| 65 | * New features | ||
| 66 | |||
| 67 | This section contains features unique to the NS and/or OS X. | ||
| 68 | |||
| 69 | ** PressAndHold for writing accented character | ||
| 70 | |||
| 71 | On OS X, many application supports the press and hold pattern to | ||
| 72 | invoke a menu of accented characters. (See example at [[https://support.apple.com/en-us/HT201586][Apple]].) | ||
| 73 | |||
| 74 | Currently, this doesn't work in Emacs. | ||
| 75 | |||
| 76 | Note that "ns-win.el" explicitly disables this. | ||
| 77 | |||
| 78 | Note: This feature might not be allowed to be implemented until also | ||
| 79 | implemented in Emacs for a free system. | ||
| 80 | |||
| 81 | ** Floating scroll bars | ||
| 82 | |||
| 83 | In modern OS X applications, the scroll bar often float over the | ||
| 84 | content, and is invisible unless actually used. This makes user | ||
| 85 | interface less cluttered and more area could be used to contain text. | ||
| 86 | |||
| 87 | With floating scroll bars, the user interface would look like it does | ||
| 88 | when they are disabled today. However, they will be made visible when | ||
| 89 | a scroll action is initiated, e.g. by putting two fingers on a | ||
| 90 | trackpad. | ||
| 91 | |||
| 92 | Note: This feature might not be allowed to be implemented until also | ||
| 93 | implemented in Emacs for a free system. | ||
| 94 | |||
| 95 | * Features from the "mac" port | ||
| 96 | |||
| 97 | This section contains features available in the "mac" Emacs port. | ||
| 98 | |||
| 99 | As the "mac" port (as of this writing) isn't an official Emacs port, | ||
| 100 | it might contain features not following the FSF rule "must exist on | ||
| 101 | free systems". | ||
| 102 | |||
| 103 | The "mac" port is based on the Emacs 22 C-based Carbon interface. It | ||
| 104 | has been maintained in parallel to the official Cocoa-based NS | ||
| 105 | interface. The Carbon interface has been enhanced, and a number of the | ||
| 106 | features of that interface could be implemented NS. | ||
| 107 | |||
| 108 | ** Smooth scrolling -- maybe not a good idea | ||
| 109 | |||
| 110 | Today, by default, scrolling with a trackpad makes the text move in | ||
| 111 | steps of five lines. (Scrolling with SHIFT scrolls one line at a | ||
| 112 | time.) | ||
| 113 | |||
| 114 | The "mac" port provides smooth, pixel-based, scrolling. This is a very | ||
| 115 | popular features. However, there are drawbacks to this method: what | ||
| 116 | happens if only a fraction of a line is visible at the top of a | ||
| 117 | window, is the partially visible text considered part of the window or | ||
| 118 | not? (Technically, what should `window-start' return.) | ||
| 119 | |||
| 120 | An alternative would be to make one-line scrolling the default on NS | ||
| 121 | (or in Emacs in general). | ||
| 122 | |||
| 123 | Note: This feature might not be allowed to be implemented until also | ||
| 124 | implemented in Emacs for a free system. | ||
| 125 | |||
| 126 | ** Mouse gestures | ||
| 127 | |||
| 128 | The "mac" port defines the gestures `swipe-left/right/up/down', | ||
| 129 | `magnify-up/down', and `rotate-left/right'. | ||
| 130 | |||
| 131 | It also binds the magnification commands to change the font | ||
| 132 | size. (This should be not be done in a specific interface, instead | ||
| 133 | Emacs should do this binding globally.) | ||
| 134 | |||
| 135 | Note: This feature might not be allowed to be implemented until also | ||
| 136 | implemented in Emacs for a free system. | ||
| 137 | |||
| 138 | ** Synthesize bold fonts | ||
| 139 | |||
| 140 | * Open issues | ||
| 141 | |||
| 142 | This section contains issues where there is an ongoing debate. | ||
| 143 | |||
| 144 | ** Key bindings of CMD and ALT | ||
| 145 | |||
| 146 | Currently in the "ns" port, ALT is bound to Meta and CMD is bound to | ||
| 147 | Super -- allowing the user to use typical OS X commands like CMD-A to | ||
| 148 | mark everything. | ||
| 149 | |||
| 150 | Unfortunately, when using an international keyboard, you can't type | ||
| 151 | normal characters like "(" etc. | ||
| 152 | |||
| 153 | There are many alternative key bindings. One solution is to bind CMD | ||
| 154 | to Meta and pass ALT to the system. In fact, this is what Emacs did up | ||
| 155 | to, and including, version 22. Also, this is how the "mac" port binds | ||
| 156 | the keys. | ||
| 157 | |||
| 158 | One could envision asymmetrical variants as well, however, this is | ||
| 159 | inappropriate for the default setting. | ||
| 160 | |||
| 161 | See the discussion on emacs-devel [[https://lists.gnu.org/archive/html/emacs-devel/2015-12/msg01575.html][part 1]] and [[https://lists.gnu.org/archive/html/emacs-devel/2016-01/msg00008.html][part 2]]. | ||
| 162 | |||
| 163 | * Bugs | ||
| 164 | |||
| 165 | This sections contains a small selection of bugs which are hard to | ||
| 166 | fix. For other bugs, see the official bug tracker debbugs.gnu.org. | ||
| 167 | |||
| 168 | ** Incorrect translation of Super modifier with Ctrl or Meta on OS X | ||
| 169 | |||
| 170 | When pressing `M-s-a', Emacs replies "M-s-å is undefined". What | ||
| 171 | happened is a mix of Emacs view that Meta and Super has been pressed, | ||
| 172 | and OS X view that ALT-a should yield "å". | ||
| 173 | |||
| 174 | The bug reports suggests two different patched, unfortunately, none | ||
| 175 | work properly. For example: | ||
| 176 | |||
| 177 | Use a Swedish keyboard layout | ||
| 178 | |||
| 179 | (setq ns-alternate-modifier nil) | ||
| 180 | |||
| 181 | "CMD-ALT-9" | ||
| 182 | |||
| 183 | Today, this correctly yields that s-] is undefined. With the either | ||
| 184 | of the two patches, Emacs responds that s-9 was pressed. | ||
| 185 | |||
| 186 | More investigation is needed to fix this problem. | ||
| 187 | |||
| 188 | Links: | ||
| 189 | - [[http://debbugs.gnu.org/cgi/bugreport.cgi?bug%3D19977][bug#19977]] | ||
| 190 | - [[http://debbugs.gnu.org/cgi/bugreport.cgi?bug%3D21330][bug#21330]] | ||
| 191 | - [[http://debbugs.gnu.org/cgi/bugreport.cgi?bug%3D21551][bug#21551]] | ||
| 192 | |||
| 193 | ** Toggline the toolbar in fullheight or maximized modes | ||
| 194 | |||
| 195 | The toolbar, in the NS interface, is not considered part of the text | ||
| 196 | area. When it is toggled, the Emacs frame change height accordingly. | ||
| 197 | |||
| 198 | Unfortunately, this also occurs when the frame is in fullheight or | ||
| 199 | maximized modes (N.B. this is not the same as "fullscreen"). The | ||
| 200 | effect is that the full frame size either increases (stretching down | ||
| 201 | below the lower edge of the screen) or decreases (leaving space | ||
| 202 | between the lower edge of the frame and the lower edge of the screen). | ||
| 203 | |||
| 204 | A better solution would be for the frame to retain its size, | ||
| 205 | i.e. change the text area. | ||
| 206 | |||
| 207 | This is related to the `frame-inhibit-implied-resize' issue. | ||
| 208 | |||
| 209 | * Internal development features | ||
| 210 | |||
| 211 | ** Regression test system (or at least a checklist) | ||
| 212 | |||
| 213 | Today, after each change to the user interface, Emacs must be manually | ||
| 214 | tested. Often, small details are overlooked ("Oh, I didn't test | ||
| 215 | toggling the tool-bar in one of the full screen modes, when multiple | ||
| 216 | frame were open -- silly me.") | ||
| 217 | |||
| 218 | It would be an enormous help if this could be tested automatically. | ||
| 219 | Many features are generic, however, the NS interface provides a number | ||
| 220 | of unique features. | ||
| 221 | |||
| 222 | *** Existing packages | ||
| 223 | |||
| 224 | Note that there is a generic UI test named "[[http://debbugs.gnu.org/cgi/bugreport.cgi?bug%3D21415#284][frame-test.el]]". The NS | ||
| 225 | interface pass this, with the exception of two toolbar related | ||
| 226 | errors. | ||
| 227 | |||
| 228 | *** Anders frame test | ||
| 229 | |||
| 230 | Anders Lindgren <andlind@gmail.com> has implmented some (very basic) | ||
| 231 | tests for full screen, toolbar, and auto-hiding the menu bar. | ||
| 232 | |||
| 233 | ** Make sure all build variants work | ||
| 234 | |||
| 235 | Emacs can be build in a number of different ways. For each feature, | ||
| 236 | consider if is really is "NS" specific, or if it should be applied to | ||
| 237 | all build versions. | ||
| 238 | |||
| 239 | - With the "NS" interface. This is the normal way to build Emacs on | ||
| 240 | OS X. | ||
| 241 | |||
| 242 | - With the "X11" interface. On OS X, this is mainly of interest to | ||
| 243 | developers of Emacs to get a "reference" interface implementations. | ||
| 244 | However, it might be of interest for people working remotely, as X11 | ||
| 245 | applications can be used over a network connection. | ||
| 246 | |||
| 247 | - Console only. | ||