237 lines
10 KiB
ReStructuredText
237 lines
10 KiB
ReStructuredText
|
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
|
||
|
}
|
||
|
|