haiku/docs/develop/servers/app_server/WinBorder.rst

237 lines
10 KiB
ReStructuredText
Raw Normal View History

WinBorder class : public Layer
##############################
WinBorder objects provide window management functionality and ensure
that the border for each window is drawn.
Member Functions
================
WinBorder(BRect r, const char \*name, int32 resize, int32 flags, ServerWindow \*win)
------------------------------------------------------------------------------------
1. Pass parameters to Layer constructor
2. Instantiate a decorator
3. Initialize visible and full regions via Decorator::GetFootprint()
~WinBorder(void)
----------------
1. Delete decorator instance
void RequestDraw(void)
----------------------
Reimplements Layer::RequestDraw() because it has no corresponding BView
1. if IsDirty()==false, return
2. Iterate through each BRect in the invalid region and call Decorator::Draw(BRect) for each invalid rectangle
3. Perform recursive child calls as in Layer::RequestDraw()
void MoveBy(BPoint pt), void MoveBy(float x, float y)
-----------------------------------------------------
Moves the WinBorder's position on screen - reimplements Layer::MoveBy()
1. Call the decorator's MoveBy()
2. Call Layer::MoveBy()
void ResizeBy(BPoint pt), void ResizeBy(float x, float y)
---------------------------------------------------------
Resizes the WinBorder - reimplements Layer::MoveBy()
1. Call the decorator's ResizeBy()
2. Call Layer::ResizeBy()
void MouseDown(int8 \*buffer)
-----------------------------
Figures out what to do with B_MOUSE_DOWN messages sent to the window's border.
1. Extract data from the buffer
2. Call the decorator's Clicked() function
3. Feed return value to a switch() function (table below)
4. Call the ServerWindow's Activate() function
+-----------------------------------+-----------------------------------+
| CLICK_MOVETOBACK | call MoveToBack() |
+-----------------------------------+-----------------------------------+
| CLICK_MOVETOFRONT | call MoveToFront() |
+-----------------------------------+-----------------------------------+
| CLICK_CLOSE | 1) call SetCloseButton(true) |
| | |
| | 2) call decorator->DrawClose |
+-----------------------------------+-----------------------------------+
| CLICK_ZOOM | 1) call SetZoomButton(true) |
| | |
| | 2) call decorator->DrawZoom |
+-----------------------------------+-----------------------------------+
| CLICK_MINIMIZE | 1) call SetMinimizeButton(true) |
| | |
| | 2) call decorator->DrawMinimize |
+-----------------------------------+-----------------------------------+
| CLICK_DRAG | 1) call MoveToFront() |
| | |
| | 2) call set_is_win_moving(true) |
| | |
| | 3) Save the mouse position |
+-----------------------------------+-----------------------------------+
| CLICK_RESIZE | 1) call MoveToFront() |
| | |
| | 2) call set_is_win_resizing(true) |
+-----------------------------------+-----------------------------------+
| CLICK_NONE | do nothing |
+-----------------------------------+-----------------------------------+
| default: | Spew an error to stderr and |
| | return |
+-----------------------------------+-----------------------------------+
void MouseUp(int8 \*buffer)
---------------------------
Figures out what to do with B_MOUSE_UP messages sent to the window's border.
1. Extract data from the buffer
2. Call the decorator's Clicked() function
3. Feed return value to a switch() function (table below)
4. if is_resizing_window, call set_is_resizing_window(false)
5. if is_moving_window, call set_is_moving_window(false)
+-----------------------------------+-----------------------------------+
| CLICK_MOVETOBACK | call MoveToBack() |
+-----------------------------------+-----------------------------------+
| CLICK_MOVETOFRONT | call MoveToFront() |
+-----------------------------------+-----------------------------------+
| CLICK_CLOSE | 1) call SetCloseButton(false) |
| | |
| | 2) call decorator->DrawClose |
| | |
| | 3) send B_QUIT_REQUESTED to the |
| | target BWindow |
+-----------------------------------+-----------------------------------+
| CLICK_ZOOM | 1) call SetZoomButton(false) |
| | |
| | 2) call decorator->DrawZoom |
| | |
| | 3) send B_ZOOM to the target |
| | BWindow |
+-----------------------------------+-----------------------------------+
| CLICK_MINIMIZE | 1) call SetMinimizeButton(false) |
| | |
| | 2) call decorator->DrawMinimize |
| | |
| | 3) send B_MINIMIZE to the target |
| | BWindow |
+-----------------------------------+-----------------------------------+
| CLICK_DRAG | call set_is_win_moving(false) |
+-----------------------------------+-----------------------------------+
| CLICK_RESIZE | call set_is_win_resizing(false) |
+-----------------------------------+-----------------------------------+
| CLICK_NONE | do nothing |
+-----------------------------------+-----------------------------------+
| default: | Spew an error to stderr |
+-----------------------------------+-----------------------------------+
void MouseMoved(int8 \*buffer)
------------------------------
Figures out what to do with B_MOUSE_MOVED messages sent to the window's border.
1. Extract data from the buffer
2. Call the decorator's Clicked() function
3. If not CLICK_CLOSE and decorator->GetClose is true, call SetClose(false) and DrawClose()
4. If not CLICK_ZOOM and decorator->GetZoom is true, call SetZoom(false) and DrawZoom()
5. If not CLICK_MINIMIZE and decorator->GetMinimize is true, call SetMinimize(false) and DrawMinimize()
6. if CLICK_RESIZE or its variants, call CursorManager::SetCursor() with the appropriate system cursor.
7. if is_moving_window() is true, calculate the amount the mouse has moved and call decorator->MoveBy() followed by Layer::MoveBy()
8. if is_resizing_window() is true, calculate the amount the mouse has moved and call decorator->ResizeBy() followed by Layer::ResizeBy()
void UpdateDecorator(void)
--------------------------
Hook function called by the WinBorder's ServerWindow when the decorator used is changed.
1. Delete the current decorator
2. Call instantiate_decorator
3. Get the new decorator's footprint region and assign it to the full and visible regions
4. Call RebuildRegions and then RequestDraw
void UpdateColors(void)
-----------------------
Hook function called by the WinBorder's ServerWindow when system colors change
1. Call the decorator's SetColors(), passing the SystemPalette's GetGUIColors() value
void UpdateFont(void)
---------------------
Hook function called by the WinBorder's ServerWindow when system fonts change
| TODO: implementation details
void UpdateScreen(void)
-----------------------
Hook function called by the WinBorder's ServerWindow when screen
attributes change
1. Call the decorator's UpdateScreen and then RequestDraw
void RebuildRegions(bool recursive=true)
----------------------------------------
Reimplementation of Layer::RebuildRegions which changes it such that
lower siblings are clipped to the footprint instead of the frame.
void Activate(bool state)
-------------------------
This function is never directly called except from within
set_active_winborder. It exists to force redraw and set the internal
state information to the proper values for when a window receives or
loses focus.
1. call the decorator's SetFocus(state)
2. set the internal is_active flag to state
3. iterate through each rectangle in the visible region and call the decorator's Draw on it.
Global Functions
================
bool is_moving_window(void), void set_is_moving_window(bool state)
------------------------------------------------------------------
These two functions set and return the variable
winborder_private::is_moving_a_window.
bool is_resizing_window(void), void set_is_resizing_window(bool state)
----------------------------------------------------------------------
These two functions set and return the variable
winborder_private::is_resizing_a_window.
void set_active_winborder(WinBorder \*win), WinBorder \* get_active_winborder(void)
-----------------------------------------------------------------------------------
These two functions set and return the variable winborder_private::active_winborder
Namespaces
==========
.. code-block:: cpp
winborder_private {
bool is_moving_a_window
bool is_resizing_a_window
WinBorder *active_winborder
}