Difference between revisions of "Carbon interface internals"
(→Bugs) |
|||
Line 57: | Line 57: | ||
|ScreenDC||CGDisplayCapture, CGDisplayGetDrawingContext, CGDisplayRegisterReconfigurationCallback||TCarbonScreenContext|| | |ScreenDC||CGDisplayCapture, CGDisplayGetDrawingContext, CGDisplayRegisterReconfigurationCallback||TCarbonScreenContext|| | ||
|---- | |---- | ||
− | |Hints||CreateNewWindow with kHelpWindowClass||WindowFromPoint|| | + | |Hints||CreateNewWindow with kHelpWindowClass||WindowFromPoint||[[User:Tombo|Tombo]] |
|---- | |---- | ||
|TOpenDialog||NavCreateGetFileDialog|| ||[[User:Phil|Phil]] | |TOpenDialog||NavCreateGetFileDialog|| ||[[User:Phil|Phil]] |
Revision as of 19:51, 16 March 2007
│ Deutsch (de) │ English (en) │
This article applies to macOS only.
See also: Multiplatform Programming Guide
This article applies to iOS only.
See also: Multiplatform Programming Guide
This page gives an overview of the LCL Carbon interface for Mac OS X and will help new developers.
For installation and creating a first Carbon application refer to Carbon Interface.
Documentation about Carbon
"Learning Carbon" sample book chapter
Free Pascal's Carbon API unit is FPCMacOSAll.pas in /usr/local/share/fpcsrc/packages/extra/univint.
Carbon interface development basics
- Target Mac OS X version is 10.4
- Avoid using obsolete or deprecated APIs and functions (e. g. QuickDraw vs. Quartz 2D)
What is already working ?
- Forms and controls - see Roadmap Widgetset dependent components
- Creating TOpenGLControl with AGL context (see components/opengl/)
- Mouse events
- Keyboard events
What needs to be done next?
Item | Note | Dependencies | Responsible |
---|---|---|---|
TControl.Cursor | SetThemeCursor | ||
TWinControl.TabOrder + TabStop | kEventControlSetFocus | ||
TListBox + TCheckListBox | CreateListBoxControl does not function in compositing mode! We must create our own Carbon list box control. | Tombo | |
TBitBtn default glyphs | CreatePixmapIndirect | ||
TBrush Patterns | CGPatternCreate | ||
TCustomControl | Tombo | ||
TPanel | Frame3D | Tombo | |
TGraphicControl | MoveWindowOrgEx, IntersectClipRect, SaveDC, RestoreDC, RectVisible | Tombo | |
ScreenDC | CGDisplayCapture, CGDisplayGetDrawingContext, CGDisplayRegisterReconfigurationCallback | TCarbonScreenContext | |
Hints | CreateNewWindow with kHelpWindowClass | WindowFromPoint | Tombo |
TOpenDialog | NavCreateGetFileDialog | Phil | |
TSaveDialog | NavCreatePutFileDialog | Phil | |
TCalendar | maybe CreateClockControl, but it is more date time edit than calendar | ||
TFontDialog | FPShowHideFontPanel | ||
TListView | CreateDataBrowserControl | ||
TMainMenu + TPopupMenu | CreateNewMenu | Tombo | |
TNoteBook + TPage | CreateTabsControl | ||
TScrollBox | HIScrollViewCreate | ||
TStatusBar | maybe CreatePlacardControl |
Bugs
Item | Note | Dependencies | Responsible |
---|---|---|---|
ShowWindow | Maximize <-> Restore is breaked | ||
TCustomEdit.CharCase | Is ignored when typing text | ||
TMemo.WordWrap | persistent bug, when word wrap is disabled the memo doesn't scroll to caret | ||
EnumFontFamiliesEx, FindCarbonFontID | Get UTF-8 font names | UTF16ToUTF8 | Tombo |
TForm.ShowModal | Problem with repeated calling | ||
TMaskEdit | Every typed char is doubled |
Compatibility issues
Keyboard
- Apple Command key is mapped to ssCtrl per Apple Guidelines
- Apple control key is mapped to ssMeta
- Apple option key is mapped to its inscription, i.e. ssAlt
- Virtual key codes mapping (depends on keyboard language layout!)
- Shortcuts indication (ampersand)
Drawing on canvas outside OnPaint event
- paints into QuickDraw window port, maybe QDBeginCGContext, QDEndCGContext would help
TControl.Color
- background of Carbon controls is transparent
How to add a new control
For example TButton.
TButton is defined in lcl/buttons.pp. This is the platform independent part of the LCL, which is used by the normal LCL programmer.
Its widgetset class is in lcl/widgetset/wsbuttons.pp. This is the platform independent base for all widgetsets (carbon, gtk, win32, ...).
Its Carbon interface class is in lcl/interfaces/carbon/carbonwsbuttons.pp:
TCarbonWSButton = class(TWSButton) private protected public class function CreateHandle(const AWinControl: TWinControl; const AParams: TCreateParams): TLCLIntfHandle; override; end;
Every WS class that actually implements something must be registered. See the initialization section at the end of the carbonwsXXX.pp unit:
RegisterWSComponent(TCustomButton, TCarbonWSButton);
TCarbonWSButton overrides CreateHandle to create a Carbon button. The code is short and should be easily adaptable for other controls like TCheckBox.