1bef1ed93SStephan Aßmus 2bef1ed93SStephan Aßmus #include <Application.h> 3*e76d86d5SStephan Aßmus #include <DirectWindow.h> 4bef1ed93SStephan Aßmus #include <View.h> 5bef1ed93SStephan Aßmus 6bef1ed93SStephan Aßmus #include <stdio.h> 7bef1ed93SStephan Aßmus #include <stdlib.h> 8bef1ed93SStephan Aßmus 9*e76d86d5SStephan Aßmus #include "AccelerantHWInterface.h" 10bef1ed93SStephan Aßmus #include "Desktop.h" 11*e76d86d5SStephan Aßmus #include "DirectWindowBuffer.h" 12bef1ed93SStephan Aßmus #include "DrawingEngine.h" 13*e76d86d5SStephan Aßmus #include "DrawView.h" 14bef1ed93SStephan Aßmus #include "ViewLayer.h" 15bef1ed93SStephan Aßmus #include "WindowLayer.h" 16bef1ed93SStephan Aßmus 17bef1ed93SStephan Aßmus class App : public BApplication { 18bef1ed93SStephan Aßmus public: 19bef1ed93SStephan Aßmus App(); 20bef1ed93SStephan Aßmus 21bef1ed93SStephan Aßmus virtual void ReadyToRun(); 22bef1ed93SStephan Aßmus }; 23bef1ed93SStephan Aßmus 24*e76d86d5SStephan Aßmus class Window : public BDirectWindow { 25bef1ed93SStephan Aßmus public: 26bef1ed93SStephan Aßmus Window(const char* title); 270b78f37eSStephan Aßmus virtual ~Window(); 28bef1ed93SStephan Aßmus 29a825e403SStephan Aßmus virtual bool QuitRequested(); 30a825e403SStephan Aßmus 31*e76d86d5SStephan Aßmus virtual void DirectConnected(direct_buffer_info* info); 32*e76d86d5SStephan Aßmus 33bef1ed93SStephan Aßmus void AddWindow(BRect frame, const char* name); 34bef1ed93SStephan Aßmus void Test(); 35bef1ed93SStephan Aßmus private: 36bef1ed93SStephan Aßmus DrawView* fView; 37bef1ed93SStephan Aßmus Desktop* fDesktop; 38a825e403SStephan Aßmus bool fQuit; 39*e76d86d5SStephan Aßmus DirectWindowBuffer fBuffer; 40*e76d86d5SStephan Aßmus AccelerantHWInterface fInterface; 41*e76d86d5SStephan Aßmus DrawingEngine fEngine; 42*e76d86d5SStephan Aßmus 43bef1ed93SStephan Aßmus }; 44bef1ed93SStephan Aßmus 450b78f37eSStephan Aßmus // constructor 46bef1ed93SStephan Aßmus App::App() 47bef1ed93SStephan Aßmus : BApplication("application/x-vnd.stippi.ClippingTest") 48bef1ed93SStephan Aßmus { 49bef1ed93SStephan Aßmus srand(real_time_clock_usecs()); 50bef1ed93SStephan Aßmus } 51bef1ed93SStephan Aßmus 520b78f37eSStephan Aßmus // ReadyToRun 53bef1ed93SStephan Aßmus void 54bef1ed93SStephan Aßmus App::ReadyToRun() 55bef1ed93SStephan Aßmus { 56bef1ed93SStephan Aßmus Window* win = new Window("clipping"); 57bef1ed93SStephan Aßmus win->Show(); 58bef1ed93SStephan Aßmus 59bef1ed93SStephan Aßmus win->Test(); 60bef1ed93SStephan Aßmus } 61bef1ed93SStephan Aßmus 620b78f37eSStephan Aßmus // constructor 63bef1ed93SStephan Aßmus Window::Window(const char* title) 64*e76d86d5SStephan Aßmus : BDirectWindow(BRect(50, 50, 800, 650), title, 65*e76d86d5SStephan Aßmus B_TITLED_WINDOW_LOOK, B_NORMAL_WINDOW_FEEL, B_ASYNCHRONOUS_CONTROLS), 66*e76d86d5SStephan Aßmus fQuit(false), 67*e76d86d5SStephan Aßmus fBuffer(), 68*e76d86d5SStephan Aßmus fInterface(), 69*e76d86d5SStephan Aßmus fEngine(&fInterface, &fBuffer) 70bef1ed93SStephan Aßmus { 71*e76d86d5SStephan Aßmus fInterface.Initialize(); 72bef1ed93SStephan Aßmus fView = new DrawView(Bounds()); 73bef1ed93SStephan Aßmus AddChild(fView); 74bef1ed93SStephan Aßmus fView->MakeFocus(true); 75*e76d86d5SStephan Aßmus 76*e76d86d5SStephan Aßmus fDesktop = new Desktop(fView, &fEngine); 77*e76d86d5SStephan Aßmus fDesktop->Run(); 78bef1ed93SStephan Aßmus } 79bef1ed93SStephan Aßmus 800b78f37eSStephan Aßmus // destructor 81bef1ed93SStephan Aßmus Window::~Window() 82bef1ed93SStephan Aßmus { 83bef1ed93SStephan Aßmus fDesktop->Lock(); 84bef1ed93SStephan Aßmus fDesktop->Quit(); 85bef1ed93SStephan Aßmus } 86bef1ed93SStephan Aßmus 87a825e403SStephan Aßmus // QuitRequested 88a825e403SStephan Aßmus bool 89a825e403SStephan Aßmus Window::QuitRequested() 90a825e403SStephan Aßmus { 91a825e403SStephan Aßmus if (!fQuit) { 92a825e403SStephan Aßmus fDesktop->PostMessage(MSG_QUIT); 93a825e403SStephan Aßmus fQuit = true; 94a825e403SStephan Aßmus return false; 95a825e403SStephan Aßmus } 96a825e403SStephan Aßmus return true; 97a825e403SStephan Aßmus } 98a825e403SStephan Aßmus 99*e76d86d5SStephan Aßmus // DirectConnected 100*e76d86d5SStephan Aßmus void 101*e76d86d5SStephan Aßmus Window::DirectConnected(direct_buffer_info* info) 102*e76d86d5SStephan Aßmus { 103*e76d86d5SStephan Aßmus // TODO: for some reason, this deadlocks 104*e76d86d5SStephan Aßmus // on B_DIRECT_STOP... be aware 105*e76d86d5SStephan Aßmus fDesktop->LockClipping(); 106*e76d86d5SStephan Aßmus 107*e76d86d5SStephan Aßmus fEngine.Lock(); 108*e76d86d5SStephan Aßmus 109*e76d86d5SStephan Aßmus switch(info->buffer_state & B_DIRECT_MODE_MASK) { 110*e76d86d5SStephan Aßmus case B_DIRECT_START: 111*e76d86d5SStephan Aßmus case B_DIRECT_MODIFY: 112*e76d86d5SStephan Aßmus fBuffer.SetTo(info); 113*e76d86d5SStephan Aßmus fDesktop->SetOffset(info->window_bounds.left, info->window_bounds.top); 114*e76d86d5SStephan Aßmus break; 115*e76d86d5SStephan Aßmus case B_DIRECT_STOP: 116*e76d86d5SStephan Aßmus fBuffer.SetTo(NULL); 117*e76d86d5SStephan Aßmus break; 118*e76d86d5SStephan Aßmus } 119*e76d86d5SStephan Aßmus 120*e76d86d5SStephan Aßmus fDesktop->SetMasterClipping(&fBuffer.WindowClipping()); 121*e76d86d5SStephan Aßmus 122*e76d86d5SStephan Aßmus fEngine.Unlock(); 123*e76d86d5SStephan Aßmus 124*e76d86d5SStephan Aßmus fDesktop->UnlockClipping(); 125*e76d86d5SStephan Aßmus } 126*e76d86d5SStephan Aßmus 127bef1ed93SStephan Aßmus // AddWindow 128bef1ed93SStephan Aßmus void 129bef1ed93SStephan Aßmus Window::AddWindow(BRect frame, const char* name) 130bef1ed93SStephan Aßmus { 131bef1ed93SStephan Aßmus WindowLayer* window = new WindowLayer(frame, name, 132bef1ed93SStephan Aßmus fDesktop->GetDrawingEngine(), 133bef1ed93SStephan Aßmus fDesktop); 1340b78f37eSStephan Aßmus 1350b78f37eSStephan Aßmus // add a coupld children 1360b78f37eSStephan Aßmus frame.OffsetTo(B_ORIGIN); 1370b78f37eSStephan Aßmus frame.InsetBy(5.0, 5.0); 1380b78f37eSStephan Aßmus if (frame.IsValid()) { 1390b78f37eSStephan Aßmus ViewLayer* layer1 = new ViewLayer(frame, "View 1", 1400b78f37eSStephan Aßmus B_FOLLOW_ALL, 1410b78f37eSStephan Aßmus B_FULL_UPDATE_ON_RESIZE, 1420b78f37eSStephan Aßmus (rgb_color){ 180, 180, 180, 255 }); 1430b78f37eSStephan Aßmus 1440b78f37eSStephan Aßmus frame.OffsetTo(B_ORIGIN); 1450b78f37eSStephan Aßmus frame.InsetBy(15.0, 15.0); 1460b78f37eSStephan Aßmus if (frame.IsValid()) { 1470b78f37eSStephan Aßmus 148f5180663SStephan Aßmus BRect f = frame; 149f5180663SStephan Aßmus f.bottom = f.top + f.Height() / 3 - 3; 150f5180663SStephan Aßmus f.right = f.left + f.Width() / 3 - 3; 1510b78f37eSStephan Aßmus 152f5180663SStephan Aßmus // top row of views 153f5180663SStephan Aßmus ViewLayer* layer; 154f5180663SStephan Aßmus layer = new ViewLayer(f, "View", B_FOLLOW_LEFT | B_FOLLOW_TOP, 155f5180663SStephan Aßmus B_FULL_UPDATE_ON_RESIZE, (rgb_color){ 120, 120, 120, 255 }); 156f5180663SStephan Aßmus layer1->AddChild(layer); 1570b78f37eSStephan Aßmus 158f5180663SStephan Aßmus f.OffsetBy(f.Width() + 6, 0); 1590b78f37eSStephan Aßmus 160f5180663SStephan Aßmus layer = new ViewLayer(f, "View", B_FOLLOW_LEFT_RIGHT | B_FOLLOW_TOP, 161f5180663SStephan Aßmus B_FULL_UPDATE_ON_RESIZE, (rgb_color){ 120, 120, 120, 255 }); 162f5180663SStephan Aßmus layer1->AddChild(layer); 1630b78f37eSStephan Aßmus 164f5180663SStephan Aßmus f.OffsetBy(f.Width() + 6, 0); 165f5180663SStephan Aßmus 166f5180663SStephan Aßmus layer = new ViewLayer(f, "View", B_FOLLOW_RIGHT | B_FOLLOW_TOP, 167f5180663SStephan Aßmus B_FULL_UPDATE_ON_RESIZE, (rgb_color){ 120, 120, 120, 255 }); 168f5180663SStephan Aßmus layer1->AddChild(layer); 169f5180663SStephan Aßmus 170f5180663SStephan Aßmus // middle row of views 171f5180663SStephan Aßmus f = frame; 172f5180663SStephan Aßmus f.bottom = f.top + f.Height() / 3 - 3; 173f5180663SStephan Aßmus f.right = f.left + f.Width() / 3 - 3; 174f5180663SStephan Aßmus f.OffsetBy(0, f.Height() + 6); 175f5180663SStephan Aßmus 176f5180663SStephan Aßmus layer = new ViewLayer(f, "View", B_FOLLOW_LEFT | B_FOLLOW_TOP_BOTTOM, 177f5180663SStephan Aßmus B_FULL_UPDATE_ON_RESIZE, (rgb_color){ 120, 120, 120, 255 }); 178f5180663SStephan Aßmus layer1->AddChild(layer); 179f5180663SStephan Aßmus 180f5180663SStephan Aßmus f.OffsetBy(f.Width() + 6, 0); 181f5180663SStephan Aßmus 182f5180663SStephan Aßmus layer = new ViewLayer(f, "View", B_FOLLOW_ALL, 183f5180663SStephan Aßmus B_FULL_UPDATE_ON_RESIZE, (rgb_color){ 120, 120, 120, 255 }); 184f5180663SStephan Aßmus layer1->AddChild(layer); 185f5180663SStephan Aßmus 186f5180663SStephan Aßmus f.OffsetBy(f.Width() + 6, 0); 187f5180663SStephan Aßmus 188f5180663SStephan Aßmus layer = new ViewLayer(f, "View", B_FOLLOW_RIGHT | B_FOLLOW_TOP_BOTTOM, 189f5180663SStephan Aßmus B_FULL_UPDATE_ON_RESIZE, (rgb_color){ 120, 120, 120, 255 }); 190f5180663SStephan Aßmus layer1->AddChild(layer); 191f5180663SStephan Aßmus 192f5180663SStephan Aßmus // bottom row of views 193f5180663SStephan Aßmus f = frame; 194f5180663SStephan Aßmus f.bottom = f.top + f.Height() / 3 - 3; 195f5180663SStephan Aßmus f.right = f.left + f.Width() / 3 - 3; 196f5180663SStephan Aßmus f.OffsetBy(0, 2 * f.Height() + 12); 197f5180663SStephan Aßmus 198f5180663SStephan Aßmus layer = new ViewLayer(f, "View", B_FOLLOW_LEFT | B_FOLLOW_BOTTOM, 199f5180663SStephan Aßmus B_FULL_UPDATE_ON_RESIZE, (rgb_color){ 120, 120, 120, 255 }); 200f5180663SStephan Aßmus layer1->AddChild(layer); 201f5180663SStephan Aßmus 202f5180663SStephan Aßmus f.OffsetBy(f.Width() + 6, 0); 203f5180663SStephan Aßmus 204748533bbSStephan Aßmus // layer = new ViewLayer(f, "View", B_FOLLOW_LEFT_RIGHT | B_FOLLOW_BOTTOM, 205748533bbSStephan Aßmus layer = new ViewLayer(f, "View", B_FOLLOW_LEFT | B_FOLLOW_BOTTOM, 206f5180663SStephan Aßmus B_FULL_UPDATE_ON_RESIZE, (rgb_color){ 120, 120, 120, 255 }); 207f5180663SStephan Aßmus layer1->AddChild(layer); 208f5180663SStephan Aßmus 209f5180663SStephan Aßmus f.OffsetBy(f.Width() + 6, 0); 210f5180663SStephan Aßmus 211748533bbSStephan Aßmus // layer = new ViewLayer(f, "View", B_FOLLOW_RIGHT | B_FOLLOW_BOTTOM, 212748533bbSStephan Aßmus layer = new ViewLayer(f, "View", B_FOLLOW_LEFT | B_FOLLOW_BOTTOM, 213f5180663SStephan Aßmus B_FULL_UPDATE_ON_RESIZE, (rgb_color){ 120, 120, 120, 255 }); 214f5180663SStephan Aßmus layer1->AddChild(layer); 2150b78f37eSStephan Aßmus } 2160b78f37eSStephan Aßmus 2170b78f37eSStephan Aßmus window->AddChild(layer1); 2180b78f37eSStephan Aßmus } 2190b78f37eSStephan Aßmus 220bef1ed93SStephan Aßmus window->Run(); 221bef1ed93SStephan Aßmus 222bef1ed93SStephan Aßmus BMessage message(MSG_ADD_WINDOW); 223bef1ed93SStephan Aßmus message.AddPointer("window", (void*)window); 224bef1ed93SStephan Aßmus fDesktop->PostMessage(&message); 225bef1ed93SStephan Aßmus } 226bef1ed93SStephan Aßmus 227bef1ed93SStephan Aßmus // Test 228bef1ed93SStephan Aßmus void 229bef1ed93SStephan Aßmus Window::Test() 230bef1ed93SStephan Aßmus { 231f5180663SStephan Aßmus BRect frame(20, 20, 330, 230); 2324dd89c69SStephan Aßmus // AddWindow(frame, "Window 1"); 2334dd89c69SStephan Aßmus // AddWindow(frame, "Window 2"); 234f5180663SStephan Aßmus for (int32 i = 0; i < 20; i++) { 235f5180663SStephan Aßmus BString name("Window "); 236f5180663SStephan Aßmus frame.OffsetBy(20, 15); 237f5180663SStephan Aßmus name << i + 1; 238f5180663SStephan Aßmus AddWindow(frame, name.String()); 239f5180663SStephan Aßmus } 240f5180663SStephan Aßmus 241d0e89d53SStephan Aßmus /* frame.Set(10, 80, 320, 290); 242f5180663SStephan Aßmus for (int32 i = 20; i < 40; i++) { 243f5180663SStephan Aßmus BString name("Window "); 244f5180663SStephan Aßmus frame.OffsetBy(20, 15); 245f5180663SStephan Aßmus name << i + 1; 246f5180663SStephan Aßmus AddWindow(frame, name.String()); 247f5180663SStephan Aßmus } 248d0e89d53SStephan Aßmus 2494dd89c69SStephan Aßmus frame.Set(20, 140, 330, 230); 250f5180663SStephan Aßmus for (int32 i = 40; i < 60; i++) { 251f5180663SStephan Aßmus BString name("Window "); 252f5180663SStephan Aßmus frame.OffsetBy(20, 15); 253f5180663SStephan Aßmus name << i + 1; 254f5180663SStephan Aßmus AddWindow(frame, name.String()); 255f5180663SStephan Aßmus } 256f5180663SStephan Aßmus 257f5180663SStephan Aßmus frame.Set(20, 200, 330, 230); 258f5180663SStephan Aßmus for (int32 i = 60; i < 80; i++) { 259f5180663SStephan Aßmus BString name("Window "); 260f5180663SStephan Aßmus frame.OffsetBy(20, 15); 261f5180663SStephan Aßmus name << i + 1; 262f5180663SStephan Aßmus AddWindow(frame, name.String()); 263f5180663SStephan Aßmus } 264f5180663SStephan Aßmus 265f5180663SStephan Aßmus frame.Set(20, 260, 330, 230); 266f5180663SStephan Aßmus // 99 windows are ok, the 100th looper does not run anymore, 267f5180663SStephan Aßmus // I guess I'm hitting a BeOS limit (max loopers per app?) 268f5180663SStephan Aßmus for (int32 i = 80; i < 99; i++) { 269f5180663SStephan Aßmus BString name("Window "); 270f5180663SStephan Aßmus frame.OffsetBy(20, 15); 271f5180663SStephan Aßmus name << i + 1; 272f5180663SStephan Aßmus AddWindow(frame, name.String()); 273f5180663SStephan Aßmus }*/ 274bef1ed93SStephan Aßmus } 275bef1ed93SStephan Aßmus 276bef1ed93SStephan Aßmus // main 277bef1ed93SStephan Aßmus int 278bef1ed93SStephan Aßmus main(int argc, const char* argv[]) 279bef1ed93SStephan Aßmus { 280727653f7SStephan Aßmus srand((long int)system_time()); 281727653f7SStephan Aßmus 282bef1ed93SStephan Aßmus App app; 283bef1ed93SStephan Aßmus app.Run(); 284bef1ed93SStephan Aßmus return 0; 285bef1ed93SStephan Aßmus } 286