53df6323c8
Separate the "interface specification" into multiple individual, shorter pages. Also update some outdated parts and replace references to OpenBeOS with Haiku. Change-Id: I86baa9a78c5f7a8a3c4c7aa3ac2992714afecae6 Reviewed-on: https://review.haiku-os.org/c/haiku/+/6084 Tested-by: Automation <automation@haiku-os.org> Reviewed-by: Adrien Destugues <pulkomandy@pulkomandy.tk>
173 lines
7.4 KiB
ReStructuredText
173 lines
7.4 KiB
ReStructuredText
Graphics
|
|
=========
|
|
|
|
Desktop Initialization
|
|
-----------------------
|
|
|
|
The graphics hardware is abstracted from the rest of the app_server.
|
|
When started, the server creates the desktop, which is little more than
|
|
a collection of workspaces. The desktop actually creates a DisplayDriver
|
|
and then calls the driver's method Inititialize() before calling a few
|
|
high-level routines for setup. Below is the process by which the
|
|
HWDriver class, which is used to access the primary graphics card in the
|
|
system, followed by the steps taken to set up the desktop.
|
|
|
|
Load Accelerant
|
|
...............
|
|
|
|
First of all, the available video cards are scanned by enumerating the contents of /dev/graphics.
|
|
For each device, the B_GET_ACCELERANT_SIGNATURE ioctl is used to find the corresponding accelerant
|
|
name.
|
|
|
|
The app_server looks for an accelerant matching that name in the "accelerants" subdirectory of each
|
|
add-on directory (enumerated using BPathFinder). The first matching accelerant is loaded
|
|
using load_add_on(). Then the get_accelerant_hook() function is obtained through get_image_symbol.
|
|
This is the only needed entry point for the accelerant, and can be used to call all the other
|
|
needed code, starting with B_INIT_ACCELERANT.
|
|
|
|
For more information about the accelerant hooks, see `Writing video card drivers <https://www.haiku-os.org/legacy-docs/writing-video-card-drivers/04-accelerant>`_.
|
|
|
|
Set up workspaces
|
|
.................
|
|
|
|
Workspace preferences are read in from disk. If they exist, they are
|
|
used; otherwise the default of 3 workspace, each with the settings
|
|
640x480x256@59.9Hz, is used. Each workspace is initialized to the proper
|
|
information (preferences or default). Additionally, all settings are
|
|
checked and possibly "clipped" by information gained through the driver
|
|
class. With the desktop having been given the proper settings, the
|
|
default workspace, 0, is activated.
|
|
|
|
Display
|
|
.......
|
|
|
|
Provided that everything has gone well so far, the screen is filled to
|
|
the user-set workspace color or RGB(51,102,160) Also, the global
|
|
clipboard is created, which is nothing more than a BClipboard object.
|
|
|
|
The Input Server will notify the app_server of its own existence, at which
|
|
point the cursor will be set to B_HAND_CURSOR and shown on the screen.
|
|
|
|
Window management
|
|
-----------------
|
|
|
|
Window management is a complicated issue, requiring the cooperation of a
|
|
number of different types of elements. Each BApplication, BWindow, and
|
|
BView has a counterpart in the app_server which has a role to play.
|
|
These objects are Decorators, ServerApps, ServerWindows, Layers, and
|
|
WindowBorders.
|
|
|
|
ServerApps
|
|
..........
|
|
|
|
ServerApp objects are created when a BApplication notifies the
|
|
app_server of its presence. In acknowledging the BApplication's
|
|
existence, the server creates a ServerApp which will handle future
|
|
server-app communications and notifies the BApplication of the port to
|
|
which it must send future messages.
|
|
|
|
ServerApps are each an independent thread which has a function similar
|
|
to that of a BLooper, but with additional tasks. When a BWindow is
|
|
created, it spawns a ServerWindow object to handle the new window. The
|
|
same applies to when a window is destroyed. Cursor commands and all
|
|
other BApplication functions which require server interaction are also
|
|
handled. B_QUIT_REQUESTED messages are received and passed along to the
|
|
main thread in order for the ServerApp object to be destroyed. The
|
|
server's Picasso thread also utilizes ServerApp::PingTarget in order to
|
|
determine whether the counterpart BApplication is still alive and
|
|
running.
|
|
|
|
ServerWindows
|
|
.............
|
|
|
|
ServerWindow objects' purpose is to take care of the needs of BWindows.
|
|
This includes all calls which require a trip to the server, such as
|
|
BView graphics calls and sending messages to invoke hook functions
|
|
within a window.
|
|
|
|
Layers
|
|
......
|
|
|
|
Layers are shadowed BViews and are used to handle much BView
|
|
functionality and also determine invalid screen regions. Hierarchal
|
|
functions, such as AddChild, are mirrored. Invalid regions are tracked
|
|
and generate Draw requests which are sent to the application for a
|
|
specific BView to update its part of the screen.
|
|
|
|
WindowBorders
|
|
.............
|
|
|
|
WindowBorders are a special kind of Layer with no BView counterpart,
|
|
designed to handle window management issues, such as click tests, resize
|
|
and move events, and ensuring that its decorator updates the screen
|
|
appropriately.
|
|
|
|
Decorators
|
|
..........
|
|
|
|
Decorators are addons which are intended to do one thing: draw the
|
|
window frame. The Decorator API and development information is described
|
|
in the Decorator Development Reference. They are essentially the means
|
|
by which WindowBorders draw to the screen.
|
|
|
|
How It All Works
|
|
................
|
|
|
|
The app_server is one large, complex beast because of all the tasks it
|
|
performs. It also utilizes the various objects to accomplish them. Input
|
|
messages are received from the Input Server and all messages not
|
|
specific to the server (such as Ctrl-Alt-Shift-Backspace) are passed to
|
|
the active application, if any. Mouse clicks are passed to the
|
|
ServerWindow class for hit testing. These hit tests can result in window
|
|
tabs and buttons being clicked, or mouse click messages being passed to
|
|
a specific view in a window.
|
|
|
|
These input messages which are passed to a running application will
|
|
sometimes cause things to happen inside it, such as button presses,
|
|
window closings/openings, etc. which will cause messages to be sent to
|
|
the server. These messages are sent either from a BWindow to a
|
|
ServerWindow or a BApplication to a ServerApp. When such messages are
|
|
sent, then the corresponding app_server object performs an appropriate
|
|
action.
|
|
|
|
Screen Updates
|
|
--------------
|
|
|
|
Screen updates are done entirely through the BView class or some
|
|
subclass thereof, hereafter referred to as a view. A view's drawing
|
|
commands will cause its window to store draw command messages in a
|
|
message packet. At some point Flush() will be called and the command
|
|
packet will be sent to the window's ServerWindow object inside the
|
|
server.
|
|
|
|
The ServerWindow will receive the packet, check to ensure that its size
|
|
is correct, and begin retrieving each command from the packet and
|
|
dispatching it, taking the appropriate actions. Actual drawing commands,
|
|
such as StrokeRect, will involve the ServerWindow object calling the
|
|
appropriate command in the graphics module for the Layer corresponding
|
|
to the view which sent the command.
|
|
|
|
Cursor Management
|
|
-----------------
|
|
|
|
The app_server handles all messiness to do with the cursor. The cursor
|
|
commands which are members of the BApplication class will send a message
|
|
to its ServerApp, which will then call the DisplayDriver's appropriate
|
|
function. The DisplayDriver used will actually handle the drawing of the
|
|
cursor and whether or not to do so at any given time.
|
|
|
|
In addition to the 1 bit per pixel cursors used in BeOS, Haiku also allows to create a BCursor
|
|
object from a BBitmap in any colorspace. This allows color cursors and also larger cursor sizes.
|
|
The default cursors also use greyscale and alpha channel for antialiasing.
|
|
|
|
Display Drivers
|
|
---------------
|
|
|
|
Unlike the BeOS R5 app_server, Haiku' server has an extra abstraction layer between the graphic
|
|
driver and the main drawing functions. This allows to generalize the interface and redirect the
|
|
drawing commands in various ways. For example, drawing commands can be redirected to another
|
|
machine for the remote_app_server, or drawing for a specific window can be granted direct access
|
|
to the framebuffer on a specific display and video card, while other applications go through the
|
|
normal process of drawing only to their currently exposed region only.
|
|
|