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)
75 s->FillTriangle(s, x1, y1, x2, y2, x3, y3);
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;
111 s->DrawString(s, text, -1, x, y, flags);
118 IDirectFBSurface *s = windata->window_surface;
119 DFB_Theme *
t = &windata->theme;
121 int d = (t->caption_size - t->font_size) / 2;
133 LoadFont(
_this, window);
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));
164 if (*window->
title) {
165 s->SetColor(s, COLOR_EXPAND(t->font_color));
166 DrawCraption(
_this, s, (x - w) / 2, t->top_size + d, window->
title);
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;
GLuint GLfloat GLfloat GLfloat x1
int DirectFB_WM_ProcessEvent(_THIS, SDL_Window *window, DFBWindowEvent *evt)
GLint GLint GLint GLint GLint x
GLfloat GLfloat GLfloat GLfloat h
GLfixed GLfixed GLfixed y2
void DirectFB_RaiseWindow(_THIS, SDL_Window *window)
void DirectFB_WM_AdjustWindowLayout(SDL_Window *window, int flags, int w, int h)
int SDL_SendWindowEvent(SDL_Window *window, Uint8 windowevent, int data1, int data2)
#define SDL_DFB_RELEASE(x)
static SDL_VideoDevice * _this
#define SDL_DFB_DEVICEDATA(dev)
SDL_PRINTF_FORMAT_STRING const char int SDL_PRINTF_FORMAT_STRING const char int SDL_PRINTF_FORMAT_STRING const char int SDL_PRINTF_FORMAT_STRING const char const char SDL_SCANF_FORMAT_STRING const char return SDL_ThreadFunction const char void return Uint32 return Uint32 SDL_AssertionHandler void SDL_SpinLock SDL_atomic_t int int return SDL_atomic_t return void void void return void return int return SDL_AudioSpec SDL_AudioSpec return int int return return int SDL_RWops int SDL_AudioSpec Uint8 ** d
DFBResult DirectFB_WM_GetClientSize(_THIS, SDL_Window *window, int *cw, int *ch)
GLubyte GLubyte GLubyte GLubyte w
GLint GLint GLint GLint GLint GLint y
#define SDL_RestoreWindow
return Display return Display Bool Bool int int int return Display XEvent Bool(*) XPointer return Display return Display Drawable _Xconst char unsigned int unsigned int return Display Pixmap Pixmap XColor XColor unsigned int unsigned int return Display _Xconst char char int char return Display Visual unsigned int int int char unsigned int unsigned int in i)
static char text[MAX_TEXT_LENGTH]
#define SDL_DFB_WINDOWDATA(win)
EGLSurface EGLNativeWindowType * window
void DirectFB_WM_RedrawLayout(_THIS, SDL_Window *window)
#define SDL_DFB_CHECK(x...)
The type used to identify a window.
#define SDL_MaximizeWindow