int DirectFB_CreateWindow(_THIS, SDL_Window * window) { SDL_DFB_DEVICEDATA(_this); SDL_DFB_DISPLAYDATA(window); DFB_WindowData *windata = NULL; DFBWindowOptions wopts; DFBWindowDescription desc; int x, y; int bshaped = 0; SDL_DFB_ALLOC_CLEAR(window->driverdata, sizeof(DFB_WindowData)); SDL_memset(&desc, 0, sizeof(DFBWindowDescription)); windata = (DFB_WindowData *) window->driverdata; windata->is_managed = devdata->has_own_wm; #if 1 SDL_DFB_CHECKERR(devdata->dfb->SetCooperativeLevel(devdata->dfb, DFSCL_NORMAL)); SDL_DFB_CHECKERR(dispdata->layer->SetCooperativeLevel(dispdata->layer, DLSCL_ADMINISTRATIVE)); #endif /* FIXME ... ughh, ugly */ if (window->x == -1000 && window->y == -1000) bshaped = 1; /* Fill the window description. */ x = window->x; y = window->y; DirectFB_WM_AdjustWindowLayout(window, window->flags, window->w, window->h); /* Create Window */ desc.caps = 0; desc.flags = DWDESC_WIDTH | DWDESC_HEIGHT | DWDESC_POSX | DWDESC_POSY | DWDESC_SURFACE_CAPS; if (bshaped) { desc.flags |= DWDESC_CAPS; desc.caps |= DWCAPS_ALPHACHANNEL; } else { desc.flags |= DWDESC_PIXELFORMAT; } if (!(window->flags & SDL_WINDOW_BORDERLESS)) desc.caps |= DWCAPS_NODECORATION; desc.posx = x; desc.posy = y; desc.width = windata->size.w; desc.height = windata->size.h; desc.pixelformat = dispdata->pixelformat; desc.surface_caps = DSCAPS_PREMULTIPLIED; #if DIRECTFB_MAJOR_VERSION == 1 && DIRECTFB_MINOR_VERSION >= 6 if (window->flags & SDL_WINDOW_OPENGL) { desc.surface_caps |= DSCAPS_GL; } #endif /* Create the window. */ SDL_DFB_CHECKERR(dispdata->layer->CreateWindow(dispdata->layer, &desc, &windata->dfbwin)); /* Set Options */ SDL_DFB_CHECK(windata->dfbwin->GetOptions(windata->dfbwin, &wopts)); /* explicit rescaling of surface */ wopts |= DWOP_SCALE; if (window->flags & SDL_WINDOW_RESIZABLE) { wopts &= ~DWOP_KEEP_SIZE; } else { wopts |= DWOP_KEEP_SIZE; } if (window->flags & SDL_WINDOW_FULLSCREEN) { wopts |= DWOP_KEEP_POSITION | DWOP_KEEP_STACKING | DWOP_KEEP_SIZE; SDL_DFB_CHECK(windata->dfbwin->SetStackingClass(windata->dfbwin, DWSC_UPPER)); } if (bshaped) { wopts |= DWOP_SHAPED | DWOP_ALPHACHANNEL; wopts &= ~DWOP_OPAQUE_REGION; } SDL_DFB_CHECK(windata->dfbwin->SetOptions(windata->dfbwin, wopts)); /* See what we got */ SDL_DFB_CHECK(DirectFB_WM_GetClientSize (_this, window, &window->w, &window->h)); /* Get the window's surface. */ SDL_DFB_CHECKERR(windata->dfbwin->GetSurface(windata->dfbwin, &windata->window_surface)); /* And get a subsurface for rendering */ SDL_DFB_CHECKERR(windata->window_surface-> GetSubSurface(windata->window_surface, &windata->client, &windata->surface)); SDL_DFB_CHECK(windata->dfbwin->SetOpacity(windata->dfbwin, 0xFF)); /* Create Eventbuffer */ SDL_DFB_CHECKERR(windata->dfbwin->CreateEventBuffer(windata->dfbwin, &windata-> eventbuffer)); SDL_DFB_CHECKERR(windata->dfbwin-> EnableEvents(windata->dfbwin, DWET_ALL)); /* Create a font */ /* FIXME: once during Video_Init */ windata->font = NULL; /* Make it the top most window. */ SDL_DFB_CHECK(windata->dfbwin->RaiseToTop(windata->dfbwin)); /* remember parent */ /* windata->sdlwin = window; */ /* Add to list ... */ windata->next = devdata->firstwin; windata->opacity = 0xFF; devdata->firstwin = window; /* Draw Frame */ DirectFB_WM_RedrawLayout(_this, window); return 0; error: SDL_DFB_RELEASE(windata->surface); SDL_DFB_RELEASE(windata->dfbwin); return -1; }
int DirectFB_CreateWindow(_THIS, SDL_Window * window) { SDL_DFB_DEVICEDATA(_this); SDL_DFB_DISPLAYDATA(_this, window); DFB_WindowData *windata = NULL; DFBWindowOptions wopts; DFBWindowDescription desc; IDirectFBFont *font; int ret, x, y; SDL_DFB_CALLOC(window->driverdata, 1, sizeof(DFB_WindowData)); windata = (DFB_WindowData *) window->driverdata; windata->is_managed = devdata->has_own_wm; SDL_DFB_CHECKERR(devdata->dfb->SetCooperativeLevel(devdata->dfb, DFSCL_NORMAL)); SDL_DFB_CHECKERR(dispdata->layer->SetCooperativeLevel(dispdata->layer, DLSCL_ADMINISTRATIVE)); /* Fill the window description. */ if (window->x == SDL_WINDOWPOS_CENTERED) { x = (dispdata->cw - window->w) / 2; } else if (window->x == SDL_WINDOWPOS_UNDEFINED) { x = 0; } else { x = window->x; } if (window->y == SDL_WINDOWPOS_CENTERED) { y = (dispdata->ch - window->h) / 2; } else if (window->y == SDL_WINDOWPOS_UNDEFINED) { y = 0; } else { y = window->y; } if (window->flags & SDL_WINDOW_FULLSCREEN) { x = 0; y = 0; } DirectFB_WM_AdjustWindowLayout(window); /* Create Window */ desc.flags = DWDESC_WIDTH | DWDESC_HEIGHT | DWDESC_PIXELFORMAT | DWDESC_POSX | DWDESC_POSY | DWDESC_SURFACE_CAPS; desc.posx = x; desc.posy = y; desc.width = windata->size.w; desc.height = windata->size.h; desc.pixelformat = dispdata->pixelformat; desc.surface_caps = DSCAPS_PREMULTIPLIED; /* Create the window. */ SDL_DFB_CHECKERR(dispdata->layer->CreateWindow(dispdata->layer, &desc, &windata->window)); /* Set Options */ windata->window->GetOptions(windata->window, &wopts); if (window->flags & SDL_WINDOW_RESIZABLE) wopts |= DWOP_SCALE; else wopts |= DWOP_KEEP_SIZE; if (window->flags & SDL_WINDOW_FULLSCREEN) { wopts |= DWOP_KEEP_POSITION | DWOP_KEEP_STACKING | DWOP_KEEP_SIZE; windata->window->SetStackingClass(windata->window, DWSC_UPPER); } windata->window->SetOptions(windata->window, wopts); /* See what we got */ SDL_DFB_CHECKERR(DirectFB_WM_GetClientSize (_this, window, &window->w, &window->h)); /* Get the window's surface. */ SDL_DFB_CHECKERR(windata->window->GetSurface(windata->window, &windata->window_surface)); /* And get a subsurface for rendering */ SDL_DFB_CHECKERR(windata->window_surface-> GetSubSurface(windata->window_surface, &windata->client, &windata->surface)); windata->window->SetOpacity(windata->window, 0xFF); /* Create Eventbuffer */ SDL_DFB_CHECKERR(windata->window->CreateEventBuffer(windata->window, &windata-> eventbuffer)); SDL_DFB_CHECKERR(windata->window-> EnableEvents(windata->window, DWET_ALL)); /* Create a font */ /* FIXME: once during Video_Init */ if (windata->is_managed) { DFBFontDescription fdesc; fdesc.flags = DFDESC_HEIGHT; fdesc.height = windata->theme.font_size; font = NULL; SDL_DFB_CHECK(devdata-> dfb->CreateFont(devdata->dfb, windata->theme.font, &fdesc, &font)); windata->window_surface->SetFont(windata->window_surface, font); SDL_DFB_RELEASE(font); } /* Make it the top most window. */ windata->window->RaiseToTop(windata->window); /* remember parent */ windata->window = window; /* Add to list ... */ windata->next = devdata->firstwin; windata->opacity = 0xFF; devdata->firstwin = windata; /* Draw Frame */ DirectFB_WM_RedrawLayout(window); return 0; error: SDL_DFB_RELEASE(windata->window); SDL_DFB_RELEASE(windata->surface); return -1; }