Mercurial > emacs
changeset 110942:4a4cd5021b94
Move nextstep/DEV-NOTES to admin/notes/nextstep.
author | Glenn Morris <rgm@gnu.org> |
---|---|
date | Mon, 11 Oct 2010 20:55:21 -0700 |
parents | 3557528e8af2 |
children | 3e933e6f8752 |
files | admin/ChangeLog admin/notes/nextstep nextstep/ChangeLog nextstep/DEV-NOTES |
diffstat | 4 files changed, 167 insertions(+), 159 deletions(-) [+] |
line wrap: on
line diff
--- a/admin/ChangeLog Mon Oct 11 20:52:07 2010 -0700 +++ b/admin/ChangeLog Mon Oct 11 20:55:21 2010 -0700 @@ -1,3 +1,7 @@ +2010-10-12 Glenn Morris <rgm@gnu.org> + + * notes/nextstep: Move here from ../nextstep/DEV-NOTES. + 2010-10-09 Glenn Morris <rgm@gnu.org> * admin.el (set-version): Add doc/emacs/emacsver.texi.
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/admin/notes/nextstep Mon Oct 11 20:55:21 2010 -0700 @@ -0,0 +1,159 @@ +This file summarizes primary aspects of the NS port architecture. If +possible, it should be updated for changes. + +Currently it summarizes the state as of: + + summer 2008 shortly after merging to trunk + + + +Startup +------- + +Init sequence: + emacs.c: ns_alloc_autorelease_pool() nsterm.m + emacs.c: ns_init_paths() nsterm.m + - override EMACSLOADPATH, etc. so resources can be found in-bundle + emacs.c: init_display() dispnew.c + - sets Vwindow_system (window-system) to 'ns + emacs.c: loadup.el -> startup.el -> ns-initialize-window-system + -> x-open-connection (nsfns.m) + - ns-list-services + -> nsterm.m: ns_term_init() + - EmacsApp sharedApplication + - read NS defaults (org.gnu.Emacs.plist) + - init X-style color list + - ns_create_terminal() + - NSApp run (goes to applicationDidFinishLaunching which terminates + event loop -- see below) + + + +Event Loop +---------- + +In an NS application, the event loop is normally managed by system and all +user code is event-driven. [NSApp run] is called by user and never returns. + +In Emacs, the event loop is managed by emacs itself. + +The NS port mediates between these two styles by intercepting the NS event +dispatch at [NSApp sendEvent]. If a special event is detected, the event loop +is broken, and control returned to Emacs. This special event is sent by +ns_send_appdefined, which is called under these circumstances: + + - if a user input event is received + - when a timeout fires + +NS event processing is instigated from Emacs through ns_select() and +ns_read_socket() in nsterm.m. Parts of the codepaths leading to these +functions are: + + + keyboard.c:read_avail_input() + -> ns_read_socket (ns_send_appdefined) -> [NSApp run] + + process.c:wait_reading_process_output() + -> ns_select -> gobble_input (global inNsSelect=1) + -> ns_read_socket (ns_send_appdefined if !expected) -> [NSApp run] + + sysdep.c:sys_select() -> read_input_waiting() + -> ns_read_socket (send_appdefined) -> [NSApp run] + [this codepath may not be used] + + +Currently ctrl-g is not detected in as many circumstances as other emacsen. +It is not certain whether this is due to the means of event loop integration, +or errors of omission in the NS code. This is an area for improvement. +Also, see the article here and its containing thread: + +http://article.gmane.org/gmane.emacs.devel/92021/match=handling%5fsignal + + + + +Text Rendering and Font Handling +-------------------------------- + +nsfont.m implements the font driver, responsible for managing fonts and +rendering text. Fonts are obtained through NSFontManager. Rendering must be +done at a low level due to emacs' fine control over this process, therefore +there are different approachs under Cocoa and GNUstep. Under GNUstep, the +original NeXT Display PostScript (DPS) APIs are available and used. Under +Cocoa, these were removed and Quartz drawing functions replaced them. + +In both cases, font glyphs are accessed through UTF8 character +representations. It would be preferable to use unicode indices, but prior +attempts at this have failed. + +Multi-script fontsets are auto-created in nsfont_make_fontset_for_font() using +the facilities of NSTextStorage and NSLayoutManager. + + +Object Architecture +------------------- + +Unlike the other GUIs, the NS interface is based on a high-level and +object-oriented API. This creates some tension in the code because emacs +itself has been architected around the low-level Xlib and Xt APIs. The NS +port tries to strike a balance between simplifying code on its side using OO +features, and keeping code as similar as possible to other ports to ease +maintenance. The following are the main classes (see nsterm.h): + +EmacsApp : NSApplication + - event loop integration, interapp comms point for Finder (NSWorkspace) msgs, + Services + - one global instance (NSApp) + - nsterm.m + +EmacsView : NSView <TextInput> + - handles rendering of text and fringe, interapp comms for drag/drop + - instance for each frame + - child of window's content view + - nsterm.m + +EmacsWindow : NSWindow + - utility override for resize handling + +EmacsScroller : NSScroller + - instance for each emacs window, renders scrollbar + - child of window's content view + - nsterm.m + +EmacsImage : NSImage + - image rendering, toolbar icons, stippling, fringe bitmaps + - instance for each image + - nsimage.m + +EmacsMenu : NSMenu + - menu management + - one tree of instances for menubar, one instance for each popup menu + - nsmenu.m + +EmacsToolbar : NSToolbar + - toolbar management, one instance for each frame + - nsmenu.m + + +EmacsDialogPanel : NSPanel + - popup dialogs, one instance for each + - nsmenu.m + +EmacsTooltip : NSObject + - tooltip popups, one instance for each + - nsmenu.m + +EmacsGlyphStorage : NSObject <NSGlyphStorage> + - utility for text rendering + - nsfont.m + +EmacsPrefsController : NSObject + - utility for preferences panel management, one global instance + - nsterm.m + - nextstep/Cocoa/Emacs.base/Contents/Resources/preferences.nib + - nextstep/GNUstep/Emacs.base/Resources/preferences.gorm + +EmacsSavePanel : NSSavePanel +EmacsOpenPanel : NSOpenPanel + - utility override for panel notifications +
--- a/nextstep/ChangeLog Mon Oct 11 20:52:07 2010 -0700 +++ b/nextstep/ChangeLog Mon Oct 11 20:55:21 2010 -0700 @@ -1,3 +1,7 @@ +2010-10-12 Glenn Morris <rgm@gnu.org> + + * DEV-NOTES: Move to ../admin/notes/nextstep. + 2010-05-07 Chong Yidong <cyd@stupidchicken.com> * Version 23.2 released.
--- a/nextstep/DEV-NOTES Mon Oct 11 20:52:07 2010 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,159 +0,0 @@ -This file summarizes primary aspects of the NS port architecture. If -possible, it should be updated for changes. - -Currently it summarizes the state as of: - - summer 2008 shortly after merging to trunk - - - -Startup -------- - -Init sequence: - emacs.c: ns_alloc_autorelease_pool() nsterm.m - emacs.c: ns_init_paths() nsterm.m - - override EMACSLOADPATH, etc. so resources can be found in-bundle - emacs.c: init_display() dispnew.c - - sets Vwindow_system (window-system) to 'ns - emacs.c: loadup.el -> startup.el -> ns-initialize-window-system - -> x-open-connection (nsfns.m) - - ns-list-services - -> nsterm.m: ns_term_init() - - EmacsApp sharedApplication - - read NS defaults (org.gnu.Emacs.plist) - - init X-style color list - - ns_create_terminal() - - NSApp run (goes to applicationDidFinishLaunching which terminates - event loop -- see below) - - - -Event Loop ----------- - -In an NS application, the event loop is normally managed by system and all -user code is event-driven. [NSApp run] is called by user and never returns. - -In Emacs, the event loop is managed by emacs itself. - -The NS port mediates between these two styles by intercepting the NS event -dispatch at [NSApp sendEvent]. If a special event is detected, the event loop -is broken, and control returned to Emacs. This special event is sent by -ns_send_appdefined, which is called under these circumstances: - - - if a user input event is received - - when a timeout fires - -NS event processing is instigated from Emacs through ns_select() and -ns_read_socket() in nsterm.m. Parts of the codepaths leading to these -functions are: - - - keyboard.c:read_avail_input() - -> ns_read_socket (ns_send_appdefined) -> [NSApp run] - - process.c:wait_reading_process_output() - -> ns_select -> gobble_input (global inNsSelect=1) - -> ns_read_socket (ns_send_appdefined if !expected) -> [NSApp run] - - sysdep.c:sys_select() -> read_input_waiting() - -> ns_read_socket (send_appdefined) -> [NSApp run] - [this codepath may not be used] - - -Currently ctrl-g is not detected in as many circumstances as other emacsen. -It is not certain whether this is due to the means of event loop integration, -or errors of omission in the NS code. This is an area for improvement. -Also, see the article here and its containing thread: - -http://article.gmane.org/gmane.emacs.devel/92021/match=handling%5fsignal - - - - -Text Rendering and Font Handling --------------------------------- - -nsfont.m implements the font driver, responsible for managing fonts and -rendering text. Fonts are obtained through NSFontManager. Rendering must be -done at a low level due to emacs' fine control over this process, therefore -there are different approachs under Cocoa and GNUstep. Under GNUstep, the -original NeXT Display PostScript (DPS) APIs are available and used. Under -Cocoa, these were removed and Quartz drawing functions replaced them. - -In both cases, font glyphs are accessed through UTF8 character -representations. It would be preferable to use unicode indices, but prior -attempts at this have failed. - -Multi-script fontsets are auto-created in nsfont_make_fontset_for_font() using -the facilities of NSTextStorage and NSLayoutManager. - - -Object Architecture -------------------- - -Unlike the other GUIs, the NS interface is based on a high-level and -object-oriented API. This creates some tension in the code because emacs -itself has been architected around the low-level Xlib and Xt APIs. The NS -port tries to strike a balance between simplifying code on its side using OO -features, and keeping code as similar as possible to other ports to ease -maintenance. The following are the main classes (see nsterm.h): - -EmacsApp : NSApplication - - event loop integration, interapp comms point for Finder (NSWorkspace) msgs, - Services - - one global instance (NSApp) - - nsterm.m - -EmacsView : NSView <TextInput> - - handles rendering of text and fringe, interapp comms for drag/drop - - instance for each frame - - child of window's content view - - nsterm.m - -EmacsWindow : NSWindow - - utility override for resize handling - -EmacsScroller : NSScroller - - instance for each emacs window, renders scrollbar - - child of window's content view - - nsterm.m - -EmacsImage : NSImage - - image rendering, toolbar icons, stippling, fringe bitmaps - - instance for each image - - nsimage.m - -EmacsMenu : NSMenu - - menu management - - one tree of instances for menubar, one instance for each popup menu - - nsmenu.m - -EmacsToolbar : NSToolbar - - toolbar management, one instance for each frame - - nsmenu.m - - -EmacsDialogPanel : NSPanel - - popup dialogs, one instance for each - - nsmenu.m - -EmacsTooltip : NSObject - - tooltip popups, one instance for each - - nsmenu.m - -EmacsGlyphStorage : NSObject <NSGlyphStorage> - - utility for text rendering - - nsfont.m - -EmacsPrefsController : NSObject - - utility for preferences panel management, one global instance - - nsterm.m - - nextstep/Cocoa/Emacs.base/Contents/Resources/preferences.nib - - nextstep/GNUstep/Emacs.base/Resources/preferences.gorm - -EmacsSavePanel : NSSavePanel -EmacsOpenPanel : NSOpenPanel - - utility override for panel notifications -