21 #include "../../SDL_internal.h"
23 #if SDL_VIDEO_DRIVER_DIRECTFB
28 #include "../../events/SDL_windowevents_c.h"
30 #define COLOR_EXPAND(col) col.r, col.g, col.b, col.a
32 static DFB_Theme theme_std = {
39 "/usr/share/fonts/truetype/freefont/FreeSans.ttf",
44 static DFB_Theme theme_none = {
55 DrawTriangle(IDirectFBSurface *
s,
int down,
int x,
int y,
int w)
84 if (windata->font !=
NULL) {
87 SDL_DFB_CHECK(windata->window_surface->SetFont(windata->window_surface, windata->font));
90 if (windata->theme.font !=
NULL)
92 DFBFontDescription fdesc;
95 fdesc.flags = DFDESC_HEIGHT;
96 fdesc.height = windata->theme.font_size;
98 dfb->CreateFont(devdata->dfb, windata->theme.font,
99 &fdesc, &windata->font));
100 SDL_DFB_CHECK(windata->window_surface->SetFont(windata->window_surface, windata->font));
105 DrawCraption(
_THIS, IDirectFBSurface *
s,
int x,
int y,
char *
text)
107 DFBSurfaceTextFlags
flags;
109 flags = DSTF_CENTER | DSTF_TOP;
118 IDirectFBSurface *
s = windata->window_surface;
119 DFB_Theme *
t = &windata->theme;
121 int d = (
t->caption_size -
t->font_size) / 2;
135 s->SetColor(
s, COLOR_EXPAND(
t->frame_color));
137 for (
i = 0;
i <
t->top_size;
i++)
138 s->DrawLine(
s, 0,
i, windata->size.w,
i);
140 for (
i = windata->size.h -
t->bottom_size; i < windata->
size.h;
i++)
141 s->DrawLine(
s, 0,
i, windata->size.w,
i);
143 for (
i = 0;
i <
t->left_size;
i++)
144 s->DrawLine(
s,
i, 0,
i, windata->size.h);
146 for (
i = windata->size.w -
t->right_size; i < windata->
size.w;
i++)
147 s->DrawLine(
s,
i, 0,
i, windata->size.h);
149 s->SetColor(
s, COLOR_EXPAND(
t->caption_color));
150 s->FillRectangle(
s,
t->left_size,
t->top_size, windata->client.w,
154 x = windata->size.w -
t->right_size -
w +
d;
156 s->SetColor(
s, COLOR_EXPAND(
t->close_color));
157 DrawTriangle(
s, 1,
x,
y,
w - 2 *
d);
159 s->SetColor(
s, COLOR_EXPAND(
t->max_color));
165 s->SetColor(
s, COLOR_EXPAND(
t->font_color));
172 dr.x =
t->left_size +
d;
173 dr.y =
t->top_size +
d;
176 s->SetBlittingFlags(
s, DSBLIT_BLEND_ALPHACHANNEL);
178 s->StretchBlit(
s, windata->icon,
NULL, &dr);
180 windata->wm_needs_redraw = 0;
187 IDirectFBWindow *dfbwin = windata->dfbwin;
190 dfbwin->GetSize(dfbwin, cw, ch);
191 *cw -= windata->theme.left_size + windata->theme.right_size;
193 windata->theme.top_size + windata->theme.caption_size +
194 windata->theme.bottom_size;
203 if (!windata->is_managed)
204 windata->theme = theme_none;
207 windata->theme = theme_none;
209 windata->theme = theme_none;
211 windata->theme = theme_std;
212 windata->theme.left_size = 0;
213 windata->theme.right_size = 0;
214 windata->theme.top_size = 0;
215 windata->theme.bottom_size = 0;
217 windata->theme = theme_std;
220 windata->client.x = windata->theme.left_size;
221 windata->client.y = windata->theme.top_size + windata->theme.caption_size;
222 windata->client.w =
w;
223 windata->client.h =
h;
225 w + windata->theme.left_size + windata->theme.right_size;
227 h + windata->theme.top_size +
228 windata->theme.caption_size + windata->theme.bottom_size;
235 WM_POS_CAPTION = 0x01,
241 WM_POS_BOTTOM = 0x40,
245 WMIsClient(DFB_WindowData *
p,
int x,
int y)
251 if (
x >=
p->client.w ||
y >=
p->client.h)
257 WMPos(DFB_WindowData *
p,
int x,
int y)
259 int pos = WM_POS_NONE;
261 if (!WMIsClient(
p,
x,
y)) {
266 p->size.w -
p->theme.right_size - 2 *
p->theme.caption_size) {
267 pos |= WM_POS_CAPTION;
269 p->size.w -
p->theme.right_size -
270 p->theme.caption_size) {
275 }
else if (
y >=
p->size.h -
p->theme.bottom_size) {
276 pos |= WM_POS_BOTTOM;
280 }
else if (
x >=
p->size.w -
p->theme.right_size) {
292 DFB_WindowData *gwindata = ((devdata->grabbed_window) ? (DFB_WindowData *) ((devdata->grabbed_window)->driverdata) :
NULL);
293 IDirectFBWindow *dfbwin = windata->dfbwin;
294 DFBWindowOptions wopts;
296 if (!windata->is_managed)
302 case DWET_BUTTONDOWN:
303 if (evt->buttons & DIBM_LEFT) {
304 int pos = WMPos(windata, evt->x, evt->y);
309 windata->wm_grab = WM_POS_NONE;
314 windata->wm_grab = WM_POS_NONE;
322 if (!(wopts & DWOP_KEEP_STACKING)) {
329 windata->wm_grab = pos;
330 if (gwindata !=
NULL)
331 SDL_DFB_CHECK(gwindata->dfbwin->UngrabPointer(gwindata->dfbwin));
333 windata->wm_lastx = evt->cx;
334 windata->wm_lasty = evt->cy;
339 if (!windata->wm_grab)
341 if (!(evt->buttons & DIBM_LEFT)) {
342 if (windata->wm_grab & (WM_POS_RIGHT | WM_POS_BOTTOM)) {
343 int dx = evt->cx - windata->wm_lastx;
344 int dy = evt->cy - windata->wm_lasty;
346 if (!(wopts & DWOP_KEEP_SIZE)) {
348 if ((windata->wm_grab & (WM_POS_BOTTOM | WM_POS_RIGHT)) == WM_POS_BOTTOM)
350 else if ((windata->wm_grab & (WM_POS_BOTTOM | WM_POS_RIGHT)) == WM_POS_RIGHT)
363 if (gwindata !=
NULL)
364 SDL_DFB_CHECK(gwindata->dfbwin->GrabPointer(gwindata->dfbwin));
365 windata->wm_grab = WM_POS_NONE;
370 if (!windata->wm_grab)
372 if (evt->buttons & DIBM_LEFT) {
373 int dx = evt->cx - windata->wm_lastx;
374 int dy = evt->cy - windata->wm_lasty;
376 if (windata->wm_grab & WM_POS_CAPTION) {
377 if (!(wopts & DWOP_KEEP_POSITION))
380 if (windata->wm_grab & (WM_POS_RIGHT | WM_POS_BOTTOM)) {
381 if (!(wopts & DWOP_KEEP_SIZE)) {
387 if ((windata->wm_grab & (WM_POS_BOTTOM | WM_POS_RIGHT)) == WM_POS_BOTTOM)
389 else if ((windata->wm_grab & (WM_POS_BOTTOM | WM_POS_RIGHT)) == WM_POS_RIGHT)
398 windata->wm_lastx = evt->cx;
399 windata->wm_lasty = evt->cy;