aboutsummaryrefslogtreecommitdiff
path: root/Src/Wasabi/api/wnd/wndclass/appbarwnd.h
blob: 7b8fba3524cf03b99156a997083955a91e6f0297 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
#ifndef _APPBARWND_H
#define _APPBARWND_H

#include <bfc/common.h>
#include <shellapi.h>
#include <api/wnd/wndclass/clickwnd.h>

#define APPBARWND_PARENT ClickWnd

#define APPBAR_TOP_ENABLED    1
#define APPBAR_LEFT_ENABLED   2
#define APPBAR_BOTTOM_ENABLED 4
#define APPBAR_RIGHT_ENABLED  8

#define APPABR_ALL_ENABLED (APPBAR_TOP_ENABLED|APPBAR_LEFT_ENABLED|APPBAR_BOTTOM_ENABLED|APPBAR_RIGHT_ENABLED)

#define APPBAR_CALLBACK 	WM_USER + 1010

#define IDT_AUTOHIDE 	  0x10000
#define IDT_AUTOUNHIDE 	0x10001

#ifdef WIN32
#define APPBAR_NOTDOCKED -1
#define APPBAR_LEFT		ABE_LEFT
#define APPBAR_TOP	  ABE_TOP
#define APPBAR_RIGHT  ABE_RIGHT
#define APPBAR_BOTTOM ABE_BOTTOM
#else
#error port me
#endif

// todo : dispatch
class AppBar {
public:
    virtual void appbar_dock(int side)=0;
    virtual int appbar_isDocked()=0;
    virtual int appbar_getSide()=0;
    virtual void appbar_setEnabledSides(int mask)=0;
    virtual int appbar_getEnabledSides()=0;
    virtual int appbar_isSideEnabled(int side)=0;
    virtual int appbar_testDock(int x, int y, RECT *dockrect=NULL)=0;
    virtual int appbar_updateAutoHide()=0;
    virtual int appbar_updateAlwaysOnTop()=0;
    virtual int appbar_isHiding()=0;
    virtual int appbar_wantAutoHide()=0;
    virtual int appbar_wantAlwaysOnTop()=0;
    virtual int appbar_isAutoHiding()=0;
    virtual void appbar_onDock(int side) {}
    virtual void appbar_onUnDock() {}
    virtual void appbar_onSlide() {}
    virtual void appbar_posChanged()=0;
    virtual int appbar_isSideAutoHideSafe(int side)=0;
    virtual int appbar_getAutoHideWidthHeight()=0;
    virtual void appbar_setNoRestore(int no)=0;
};

// {242CFAA4-31B3-4b01-97C8-2F0A9FFDEF79}
static const GUID appBarGuid = 
{ 0x242cfaa4, 0x31b3, 0x4b01, { 0x97, 0xc8, 0x2f, 0xa, 0x9f, 0xfd, 0xef, 0x79 } };

class api_region;

// TODO: benski> only class making active use of being derived from this seems to be Layout and GuiObjectWnd
// maybe just layout ...

class AppBarWnd : public APPBARWND_PARENT, public AppBar {
  public:
    AppBarWnd();
    virtual ~AppBarWnd();

    void appbar_dock(int side);
    int appbar_isDocked();
    int appbar_getSide();

    void appbar_setEnabledSides(int mask);
    int appbar_getEnabledSides();
    int appbar_isSideEnabled(int side);

    int appbar_testDock(int x, int y, RECT *dockrect=NULL);

    int appbar_updateAutoHide();
    int appbar_updateAlwaysOnTop();

    int appbar_isSideAutoHideSafe(int side);

    virtual int appbar_wantAutoHide() { return 1; }
    virtual int appbar_wantAlwaysOnTop() { return 1; }

    int appbar_isHiding();
    int appbar_isAutoHiding();

    void appbar_posChanged();
    void appbar_setNoRestore(int no);
    virtual int appbar_getAutoHideWidthHeight() { return 2; }

    virtual LRESULT wndProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam);
    virtual void onAfterReinit();
    virtual void onSetVisible(int show);

    virtual void onRatioChanged();
  
  private:

    void appBarCallback(UINT uMsg, WPARAM wParam, LPARAM lParam);

    int registerWinAppBar();
    void unregisterWinAppBar();
    void notifyWinAppBarPosition(int side, RECT rect);
    
    OSWINDOWHANDLE getCurAutoHide(int side);

    void getDockRect(int side, RECT *rc);
    void getEdge(int side, RECT *rc);
    void straightenRect(int side, RECT *r);
    void updateDocking();
    void updateSide();
    void updateTimers();
    void resetAutoHideSide(int side);
    void setAutoHideSide(int side);
    void setAutoHideTimer();
    void setAutoUnHideTimer();
    void resetAutoHideTimer();
    void resetAutoUnHideTimer();
    void onAutoHideTimer();
    void onAutoUnHideTimer();
    void autoHide();
    void autoUnHide();
    void slideWindow(RECT *prc);
    int screenCorner(POINT *pt);
    void snapAdjust(RECT *r, int way);

    void dock(int side);
    void unDock();

    void unOwn();
    void reOwn();

    int m_registered;
    int m_side;
    int m_enabled;
    int m_cur_autohide;
    int m_cur_side;
    int m_cur_hiding;
    OSWINDOWHANDLE m_oldZOrder;
    int m_destroying;
    int m_norestore;
    int m_autohide_timer_set;
    int m_autounhide_timer_set;
    int m_sliding;
    int m_suspended;
    int m_fs;
    int m_wahidden;
};

#endif //_APPBARWND_H