haiku/headers/os/interface/Window.h

414 lines
12 KiB
C
Raw Normal View History

/*
* Copyright 2001-2015, Haiku, Inc. All rights reserved.
* Distributed under the terms of the MIT License.
*/
#ifndef _WINDOW_H
#define _WINDOW_H
#include <Looper.h>
#include <StorageDefs.h>
#include <View.h>
class BButton;
class BMenuBar;
class BMenuItem;
class BMessage;
class BMessageRunner;
class BMessenger;
class BView;
namespace BPrivate {
class PortLink;
};
enum window_type {
B_UNTYPED_WINDOW = 0,
2015-04-14 23:36:19 +03:00
B_TITLED_WINDOW = 1,
B_MODAL_WINDOW = 3,
B_DOCUMENT_WINDOW = 11,
B_BORDERED_WINDOW = 20,
B_FLOATING_WINDOW = 21
};
enum window_look {
B_BORDERED_WINDOW_LOOK = 20,
B_NO_BORDER_WINDOW_LOOK = 19,
B_TITLED_WINDOW_LOOK = 1,
B_DOCUMENT_WINDOW_LOOK = 11,
B_MODAL_WINDOW_LOOK = 3,
B_FLOATING_WINDOW_LOOK = 7
};
enum window_feel {
B_NORMAL_WINDOW_FEEL = 0,
B_MODAL_SUBSET_WINDOW_FEEL = 2,
B_MODAL_APP_WINDOW_FEEL = 1,
B_MODAL_ALL_WINDOW_FEEL = 3,
B_FLOATING_SUBSET_WINDOW_FEEL = 5,
B_FLOATING_APP_WINDOW_FEEL = 4,
B_FLOATING_ALL_WINDOW_FEEL = 6
};
enum window_alignment {
B_BYTE_ALIGNMENT = 0,
B_PIXEL_ALIGNMENT = 1
};
// window flags
enum {
B_NOT_MOVABLE = 0x00000001,
B_NOT_CLOSABLE = 0x00000020,
B_NOT_ZOOMABLE = 0x00000040,
B_NOT_MINIMIZABLE = 0x00004000,
B_NOT_RESIZABLE = 0x00000002,
B_NOT_H_RESIZABLE = 0x00000004,
B_NOT_V_RESIZABLE = 0x00000008,
B_AVOID_FRONT = 0x00000080,
B_AVOID_FOCUS = 0x00002000,
B_WILL_ACCEPT_FIRST_CLICK = 0x00000010,
B_OUTLINE_RESIZE = 0x00001000,
B_NO_WORKSPACE_ACTIVATION = 0x00000100,
B_NOT_ANCHORED_ON_ACTIVATE = 0x00020000,
B_ASYNCHRONOUS_CONTROLS = 0x00080000,
B_QUIT_ON_WINDOW_CLOSE = 0x00100000,
B_SAME_POSITION_IN_ALL_WORKSPACES = 0x00200000,
B_AUTO_UPDATE_SIZE_LIMITS = 0x00400000,
B_CLOSE_ON_ESCAPE = 0x00800000,
B_NO_SERVER_SIDE_WINDOW_MODIFIERS = 0x00000200
};
#define B_CURRENT_WORKSPACE 0
#define B_ALL_WORKSPACES 0xffffffff
// MoveOnScreen() flags
enum {
B_DO_NOT_RESIZE_TO_FIT = 0x0001,
B_MOVE_IF_PARTIALLY_OFFSCREEN = 0x0002
};
class BWindow : public BLooper {
public:
BWindow(BRect frame, const char* title,
window_type type, uint32 flags,
uint32 workspace = B_CURRENT_WORKSPACE);
BWindow(BRect frame, const char* title,
window_look look, window_feel feel,
uint32 flags, uint32 workspace
= B_CURRENT_WORKSPACE);
virtual ~BWindow();
BWindow(BMessage* archive);
static BArchivable* Instantiate(BMessage* archive);
virtual status_t Archive(BMessage* archive,
bool deep = true) const;
virtual void Quit();
void Close() { Quit(); }
void AddChild(BView* child, BView* before = NULL);
void AddChild(BLayoutItem* child);
bool RemoveChild(BView* child);
int32 CountChildren() const;
BView* ChildAt(int32 index) const;
virtual void DispatchMessage(BMessage* message,
BHandler* handler);
virtual void MessageReceived(BMessage* message);
virtual void FrameMoved(BPoint newPosition);
virtual void WorkspacesChanged(uint32 oldWorkspaces,
uint32 newWorkspaces);
virtual void WorkspaceActivated(int32 workspace,
bool state);
virtual void FrameResized(float newWidth, float newHeight);
virtual void Minimize(bool minimize);
virtual void Zoom(BPoint origin, float width, float height);
void Zoom();
void SetZoomLimits(float maxWidth, float maxHeight);
virtual void ScreenChanged(BRect screenSize,
color_space depth);
void SetPulseRate(bigtime_t rate);
bigtime_t PulseRate() const;
void AddShortcut(uint32 key, uint32 modifiers,
BMessage* message);
void AddShortcut(uint32 key, uint32 modifiers,
BMessage* message, BHandler* target);
2012-11-04 20:33:42 +04:00
bool HasShortcut(uint32 key, uint32 modifiers);
void RemoveShortcut(uint32 key, uint32 modifiers);
void SetDefaultButton(BButton* button);
BButton* DefaultButton() const;
virtual void MenusBeginning();
virtual void MenusEnded();
bool NeedsUpdate() const;
void UpdateIfNeeded();
BView* FindView(const char* viewName) const;
BView* FindView(BPoint) const;
BView* CurrentFocus() const;
void Activate(bool = true);
2014-06-12 03:00:46 +04:00
virtual void WindowActivated(bool focus);
void ConvertToScreen(BPoint* point) const;
BPoint ConvertToScreen(BPoint point) const;
void ConvertFromScreen(BPoint* point) const;
BPoint ConvertFromScreen(BPoint point) const;
void ConvertToScreen(BRect* rect) const;
BRect ConvertToScreen(BRect rect) const;
void ConvertFromScreen(BRect* rect) const;
BRect ConvertFromScreen(BRect rect) const;
void MoveBy(float dx, float dy);
void MoveTo(BPoint);
void MoveTo(float x, float y);
void ResizeBy(float dx, float dy);
void ResizeTo(float width, float height);
void ResizeToPreferred();
void CenterIn(const BRect& rect);
void CenterOnScreen();
void CenterOnScreen(screen_id id);
void MoveOnScreen(uint32 flags = 0);
virtual void Show();
virtual void Hide();
bool IsHidden() const;
bool IsMinimized() const;
void Flush() const;
void Sync() const;
status_t SendBehind(const BWindow* window);
void DisableUpdates();
void EnableUpdates();
void BeginViewTransaction();
// referred as OpenViewTransaction()
// in BeBook
void EndViewTransaction();
// referred as CommitViewTransaction()
// in BeBook
bool InViewTransaction() const;
BRect Bounds() const;
BRect Frame() const;
BRect DecoratorFrame() const;
BSize Size() const;
const char* Title() const;
void SetTitle(const char* title);
bool IsFront() const;
bool IsActive() const;
void SetKeyMenuBar(BMenuBar* bar);
BMenuBar* KeyMenuBar() const;
void SetSizeLimits(float minWidth, float maxWidth,
float minHeight, float maxHeight);
void GetSizeLimits(float* minWidth, float* maxWidth,
float* minHeight, float* maxHeight);
void UpdateSizeLimits();
status_t SetDecoratorSettings(const BMessage& settings);
status_t GetDecoratorSettings(BMessage* settings) const;
uint32 Workspaces() const;
void SetWorkspaces(uint32);
BView* LastMouseMovedView() const;
virtual BHandler* ResolveSpecifier(BMessage* message,
int32 index, BMessage* specifier,
int32 what, const char* property);
virtual status_t GetSupportedSuites(BMessage* data);
status_t AddToSubset(BWindow* window);
status_t RemoveFromSubset(BWindow* window);
virtual status_t Perform(perform_code code, void* data);
status_t SetType(window_type type);
window_type Type() const;
status_t SetLook(window_look look);
window_look Look() const;
status_t SetFeel(window_feel feel);
window_feel Feel() const;
status_t SetFlags(uint32);
uint32 Flags() const;
bool IsModal() const;
bool IsFloating() const;
status_t SetWindowAlignment(window_alignment mode,
int32 h, int32 hOffset = 0,
int32 width = 0, int32 widthOffset = 0,
int32 v = 0, int32 vOffset = 0,
int32 height = 0, int32 heightOffset = 0);
status_t GetWindowAlignment(
window_alignment* mode = NULL,
int32* h = NULL, int32* hOffset = NULL,
int32* width = NULL,
int32* widthOffset = NULL,
int32* v = NULL, int32* vOffset = NULL,
int32* height = NULL,
int32* heightOffset = NULL) const;
virtual bool QuitRequested();
virtual thread_id Run();
virtual void SetLayout(BLayout* layout);
BLayout* GetLayout() const;
void InvalidateLayout(bool descendants = false);
void Layout(bool force);
Set*UIColor, etc. The inseparable changes necessary to support live color updating across the system in a sane, safe, and performant manner. BView gains: HasSystemColors() HasDefaultColors() AdoptSystemColors() AdoptParentColors() AdoptViewColor(BView*) SetViewUIColor(color_which, float tint) SetHighUIColor(... SetLowUIColor(... ViewUIColor(float* tint) HighUIColor(... LowUIColor(... DelayedInvalidate() BWindow gains a simple helper method: IsOffscreenWindow() BMessage gains: AddColor() FindColor() GetColor() HasColor() * allegedly this API is deprecated, but I implemented it anyway ReplaceColor() SetColor() Previous private ColorTools methods are made public and moved into GraphicsDefs: mix_color, blend_color, disable_color These are fully compatible with BeOS dan0 R5.1 methods and are just code cleanup of BeOS example code under the OpenTracker license. In addition, four new colors are created: B_LINK_TEXT_COLOR B_LINK_HOVER_COLOR B_LINK_ACTIVE_COLOR B_LINK_VISITED_COLOR These changes are documented in their proper user documentation files. In addition, due to a history rewrite, B_FOLLOW_LEFT_TOP has been defined and used in lieu of B_FOLLOW_TOP | B_FOLLOW_LEFT and is included in this commit. On the app_server side, the following has changed: Add DelayedMessage - a system by which messages can be sent at a scheduled time, and can also be merged according to set rules. A single thread is used to service the message queue and multiple recipients can be set for each message. Desktop gains the ability to add message ports to a DelayedMessage so that said messages can target either all applications or all windows, as needed. Desktop maintains a BMessage which is used to queue up all pending color changes and the delayed messaging system is used to enact these changes after a short period of time has passed. This prevents abuse and allows the system to merge repeated set_ui_color events into one event for client applications, improving performance drastically. In addition, B_COLORS_UPDATED is sent to the BApplication, which forwards the message to each BWindow. This is done to improve performance over having the app_server independently informing each window. Decorator changes are live now, which required some reworking. Signed-off-by: Augustin Cavalier <waddlesplash@gmail.com>
2015-12-10 21:52:48 +03:00
bool IsOffscreenWindow() const;
private:
// FBC padding and forbidden methods
virtual void _ReservedWindow2();
virtual void _ReservedWindow3();
virtual void _ReservedWindow4();
virtual void _ReservedWindow5();
virtual void _ReservedWindow6();
virtual void _ReservedWindow7();
virtual void _ReservedWindow8();
BWindow();
BWindow(BWindow&);
BWindow& operator=(BWindow&);
private:
typedef BLooper inherited;
Next big step in the event handling: * RootLayer's mouse event processing is now at its minimum - the EventDispatcher handles them now. As a result, a window will now get only one message per event. * RootLayer adds "_view_token" to mouse moved messages that specify the view currently under the cursor. * There is now a mouse event layer in RootLayer that gets preferred when it's set - this is now used for the window moving instead of the previous mechanism. * changed the previous DistributeMessage() to an UnpackMessage() method following Adi's suggestion. * caveat: some things might be functionally broken in RootLayer now because of removing the mouse notification stuff. * "be:transit" handling is now done completely client side by BWindow::_SanitizeMessage(() (similar to what the input_server does). This should also make the mechanism pretty robust, since every B_MOUSE_MOVED message can now trigger the view transit (in case a message is lost). B_WINDOW_ACTIVATED messages should be generated client side as well. * renamed AS_LAYER_GET_MOUSE_COORDS to AS_GET_MOUSE as it's not a layer specific command, and also gets the mouse buttons. * B_MOUSE_* messages from the up server now contain only a "screen_where" field; "where" (in window's coordinates) and "be:view_where" are added in BMessage::_SanitizeMessage(). * messages that don't have a valid target in the looper are now dropped instead of being sent to the looper - this should be done in BLooper as well, though. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@15087 a95241bf-73f2-0310-859d-f6bbb57e9c96
2005-11-23 18:17:58 +03:00
struct unpack_cookie;
class Shortcut;
friend class BAlert;
friend class BApplication;
friend class BBitmap;
friend class BView;
friend class BMenuItem;
friend class BWindowScreen;
friend class BDirectWindow;
friend class BFilePanel;
friend class BWindowStack;
friend void _set_menu_sem_(BWindow* w, sem_id sem);
friend status_t _safe_get_server_token_(const BLooper*, int32*);
BWindow(BRect frame, int32 bitmapToken);
void _InitData(BRect frame, const char* title,
window_look look, window_feel feel,
uint32 flags, uint32 workspace,
int32 bitmapToken = -1);
virtual void task_looper();
BPoint AlertPosition(const BRect& frame);
virtual BMessage* ConvertToMessage(void* raw, int32 code);
void AddShortcut(uint32 key, uint32 modifiers,
BMenuItem* item);
BHandler* _DetermineTarget(BMessage* message,
BHandler* target);
bool _IsFocusMessage(BMessage* message);
bool _UnpackMessage(unpack_cookie& state,
BMessage** _message, BHandler** _target,
bool* _usePreferred);
void _SanitizeMessage(BMessage* message,
BHandler* target, bool usePreferred);
bool _StealMouseMessage(BMessage* message,
bool& deleteMessage);
uint32 _TransitForMouseMoved(BView* view,
BView* viewUnderMouse) const;
bool InUpdate();
void _DequeueAll();
window_type _ComposeType(window_look look,
window_feel feel) const;
void _DecomposeType(window_type type,
window_look* look,
window_feel* feel) const;
void SetIsFilePanel(bool yes);
bool IsFilePanel() const;
void _CreateTopView();
void _AdoptResize();
void _SetFocus(BView* focusView,
bool notifyIputServer = false);
void _SetName(const char* title);
Shortcut* _FindShortcut(uint32 key, uint32 modifiers);
BView* _FindView(BView* view, BPoint point) const;
BView* _FindView(int32 token);
BView* _LastViewChild(BView* parent);
BView* _FindNextNavigable(BView* focus, uint32 flags);
BView* _FindPreviousNavigable(BView* focus,
uint32 flags);
void _Switcher(int32 rawKey, uint32 modifiers,
bool repeat);
bool _HandleKeyDown(BMessage* event);
bool _HandleUnmappedKeyDown(BMessage* event);
void _KeyboardNavigation();
void _GetDecoratorSize(float* _borderWidth,
float* _tabHeight) const;
void _SendShowOrHideMessage();
private:
char* fTitle;
int32 _unused0;
bool fInTransaction;
bool fActive;
short fShowLevel;
uint32 fFlags;
BView* fTopView;
BView* fFocus;
BView* fLastMouseMovedView;
uint32 _unused1;
BMenuBar* fKeyMenuBar;
BButton* fDefaultButton;
BList fShortcuts;
int32 fTopViewToken;
bool fUpdateRequested;
bool fOffscreen;
bool fIsFilePanel;
bool _unused4;
bigtime_t fPulseRate;
bool _unused5;
bool fMinimized;
bool fNoQuitShortcut;
bool _unused6;
sem_id fMenuSem;
float fMaxZoomHeight;
float fMaxZoomWidth;
float fMinHeight;
float fMinWidth;
float fMaxHeight;
float fMaxWidth;
BRect fFrame;
window_look fLook;
window_feel fFeel;
int32 fLastViewToken;
::BPrivate::PortLink* fLink;
BMessageRunner* fPulseRunner;
BRect fPreviousFrame;
uint32 _reserved[9];
};
#endif // _WINDOW_H