1 #include <Application.h>
11 // usage example for simple rects
12 port_id port
= find_port("drawing_debugger_port");
14 write_port_etc(port
, 'RECT', &interestingRect
, sizeof(BRect
),
15 B_RELATIVE_TIMEOUT
, 0);
19 // usage example for regions
20 port_id port
= find_port("drawing_debugger_port");
22 int32 rectCount
= region
->CountRects();
23 for (int32 i
= 0; i
< rectCount
; i
++) {
24 BRect interestingRect
= region
->RectAt(i
);
25 write_port_etc(port
, 'RECT', &interestingRect
, sizeof(BRect
),
26 B_RELATIVE_TIMEOUT
, 0);
33 class DrawingDebuggerView
: public BView
{
35 DrawingDebuggerView(BRect frame
);
36 virtual ~DrawingDebuggerView();
38 virtual void Draw(BRect updateRect
);
41 static int32
_PortListener(void *data
);
44 BView
* fOffscreenView
;
45 thread_id fListenerThread
;
50 class DrawingDebuggerWindow
: public BWindow
{
52 DrawingDebuggerWindow(BRect frame
);
55 DrawingDebuggerView
* fView
;
59 class DrawingDebuggerApp
: public BApplication
{
64 DrawingDebuggerWindow
* fWindow
;
72 result
.red
= system_time() % 256;
73 result
.green
= (system_time() >> 8) % 256;
74 result
.blue
= (system_time() >> 16) % 256;
79 DrawingDebuggerApp::DrawingDebuggerApp()
80 : BApplication("application/x.vnd-Haiku.DrawingDebugger")
82 fWindow
= new DrawingDebuggerWindow(BRect(200, 200, 999, 799));
87 DrawingDebuggerWindow::DrawingDebuggerWindow(BRect frame
)
88 : BWindow(frame
, "DrawingDebugger", B_TITLED_WINDOW
,
89 B_QUIT_ON_WINDOW_CLOSE
)
91 fView
= new DrawingDebuggerView(frame
.OffsetToSelf(0, 0));
96 DrawingDebuggerView::DrawingDebuggerView(BRect frame
)
97 : BView(frame
, "DrawingDebuggerView", B_FOLLOW_ALL
, B_WILL_DRAW
)
99 fBitmap
= new BBitmap(frame
, B_RGB32
, true);
100 fOffscreenView
= new BView(frame
, "OffscreenView", B_FOLLOW_NONE
, 0);
101 fOffscreenView
->SetViewColor(B_TRANSPARENT_32_BIT
);
102 fBitmap
->AddChild(fOffscreenView
);
104 fStopListener
= false;
105 fListenerThread
= spawn_thread(_PortListener
, "port_listener",
106 B_NORMAL_PRIORITY
, this);
107 resume_thread(fListenerThread
);
111 DrawingDebuggerView::~DrawingDebuggerView()
113 fStopListener
= true;
114 int32 returnCode
= B_OK
;
115 wait_for_thread(fListenerThread
, &returnCode
);
121 DrawingDebuggerView::Draw(BRect updateRect
)
123 DrawBitmap(fBitmap
, updateRect
, updateRect
);
128 DrawingDebuggerView::_PortListener(void *data
)
130 DrawingDebuggerView
*view
= (DrawingDebuggerView
*)data
;
131 port_id port
= create_port(1000, "drawing_debugger_port");
133 printf("failed to create port\n");
137 size_t bufferSize
= 1024;
138 uint8
*buffer
= (uint8
*)malloc(bufferSize
);
142 while (!view
->fStopListener
) {
144 status_t result
= read_port_etc(port
, &code
, buffer
, bufferSize
,
145 B_RELATIVE_TIMEOUT
, 100000);
146 if (result
== B_INTERRUPTED
|| result
== B_TIMED_OUT
)
149 printf("failed to read from port\n");
156 BRect
*rect
= (BRect
*)buffer
;
157 view
->fBitmap
->Lock();
158 view
->fOffscreenView
->SetHighColor(random_color());
159 view
->fOffscreenView
->FillRect(*rect
, B_SOLID_HIGH
);
160 view
->fOffscreenView
->Sync();
161 view
->fBitmap
->Unlock();
164 view
->Invalidate(*rect
);
165 view
->UnlockLooper();
170 printf("unsupported code '%.4s'\n", (char *)&code
);
182 main(int argc
, const char *argv
[])
184 DrawingDebuggerApp
*app
= new DrawingDebuggerApp();