Carbon interface internals

From Free Pascal wiki
Jump to navigationJump to search

This page gives an overview of the LCL carbon interface for MacOSX and will help new developers.

For installation and creating a first carbon application read first Carbon Interface.

What is already working ?

  • Creating a TForm
  • Creating and clicking on a TButton
  • Creating TOpenGLControl with AGL context (see components/opengl/)
  • Mouse events
  • Keyboard events (VK_ mapping for foreign keyboards needs testing)

What needs to be done next?

  • Create more controls (TEdit, TCheckBox, TRadioButton, TGroupBox)
  • Resize events (when form has been resized by user)
  • InvalidateRect
  • ShowModal (for dialogs)

Needed dependencies

  • TLabel is custom drawn in the LCL. That mean, in order to implement TLabel, first TCanvas needs to be implemented.
  • TCanvas needs GetDC/ReleaseDC, fonts, brush, pen, clipping and paint messages
  • TMenu is quite different than the gtk and win32 menus.

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, that is shown to the user.

And its widgetset class in lcl/widgetset/wsbuttons.pp. This is the platform independent base for all widgetsets (carbon, gtk, win32, ...).

Its carbon interface class 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.

Keys

  • Apple Command key is mapped to ssCtrl due to Apple Guidelines
  • Apple control key is mapped to ssMeta
  • Apple option key is mapped to its inscription, i.e. ssAlt