blob: 2fa6fa4f4725bf293fc753d3094d39c4541f4d42 [file] [log] [blame]
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>
//#include "lv_gl_sdl.h"
#include "x11driver.h"
#define X11_NATIVE(obj) (VISUAL_CHECK_CAST ((obj), X11Native))
// http://xander.ncl.ac.uk/game/src6/
typedef struct _X11Native X11Native;
static int native_create (SADisplay *display, VisVideoDepth depth, VisVideoAttributeOptions *vidoptions,
int width, int height, int resizable);
static int native_close (SADisplay *display);
static int native_lock (SADisplay *display);
static int native_unlock (SADisplay *display);
static int native_fullscreen (SADisplay *display, int fullscreen, int autoscale);
static int native_getvideo (SADisplay *display, VisVideo *screen);
static int native_updaterect (SADisplay *display, VisRectangle *rect);
static int native_drainevents (SADisplay *display, VisEventQueue *eventqueue);
static int get_nearest_resolution (SADisplay *display, int *width, int *height);
struct _X11Native {
VisObject object;
Display *dpy;
Window win;
int screen;
VisVideoDepth requested_depth;
int oldx;
int oldy;
int oldwidth;
int oldheight;
int resizable;
int active;
};
SADisplayDriver *x11_driver_new ()
{
SADisplayDriver *driver;
driver = visual_mem_new0 (SADisplayDriver, 1);
visual_object_initialize (VISUAL_OBJECT (driver), TRUE, NULL);
driver->create = native_create;
driver->close = native_close;
driver->lock = native_lock;
driver->unlock = native_unlock;
driver->fullscreen = native_fullscreen;
driver->getvideo = native_getvideo;
driver->updaterect = native_updaterect;
driver->drainevents = native_drainevents;
// visual_gl_set_callback_attribute_set (native_gl_attribute_set);
// visual_gl_set_callback_attribute_get (native_gl_attribute_get);
return driver;
}
static int native_create (SADisplay *display, VisVideoDepth depth, VisVideoAttributeOptions *vidoptions,
int width, int height, int resizable)
{
X11Native *native = X11_NATIVE (display->native);
Window rootwin;
if (native != NULL)
visual_object_unref (VISUAL_OBJECT (native));
native = visual_mem_new0 (X11Native, 1);
visual_object_initialize (VISUAL_OBJECT (native), TRUE, NULL);
native->dpy = XOpenDisplay (NULL);
if (native->dpy == NULL)
visual_log (VISUAL_LOG_ERROR, "Can't open X Display");
native->screen = DefaultScreen (display);
rootwin = RootWindow (native->dpy, native->screen);
native->win = XCreateSimpleWindow (native->dpy, rootwin, 10, 10, width, height, 0, 0, 0);
XMapWindow (native->dpy, native->win);
display->native = VISUAL_OBJECT (native);
return 0;
}
static int native_close (SADisplay *display)
{
return 0;
}
static int native_lock (SADisplay *display)
{
return 0;
}
static int native_unlock (SADisplay *display)
{
return 0;
}
static int native_fullscreen (SADisplay *display, int fullscreen, int autoscale)
{
X11Native *native = X11_NATIVE (display->native);
// SDL_Surface *screen = native->screen;
/*
if (fullscreen == TRUE) {
if (!(screen->flags & SDL_FULLSCREEN)) {
if (autoscale == TRUE) {
int width = display->screen->width;
int height = display->screen->height;
native->oldwidth = width;
native->oldheight = height;
get_nearest_resolution (display, &width, &height);
native_create (display, native->requested_depth, NULL, width, height, native->resizable);
}
SDL_ShowCursor (SDL_FALSE);
SDL_WM_ToggleFullScreen (screen);
}
} else {
if ((screen->flags & SDL_FULLSCREEN)) {
SDL_ShowCursor (SDL_TRUE);
SDL_WM_ToggleFullScreen (screen);
if (autoscale == TRUE)
native_create (display, native->requested_depth, NULL, native->oldwidth,
native->oldheight, native->resizable);
}
}
*/
return 0;
}
static int native_getvideo (SADisplay *display, VisVideo *screen)
{
/*
X11Native *native = X11_NATIVE (display->native);
SDL_Surface *sdlscreen = native->screen;
if (native->requested_depth == VISUAL_VIDEO_DEPTH_GL)
visual_video_set_depth (screen, VISUAL_VIDEO_DEPTH_GL);
else
visual_video_set_depth (screen, visual_video_depth_enum_from_value (sdlscreen->format->BitsPerPixel));
visual_video_set_dimension (screen, sdlscreen->w, sdlscreen->h);
visual_video_set_pitch (screen, sdlscreen->pitch);
visual_video_set_buffer (screen, sdlscreen->pixels);
*/
return 0;
}
static int native_updaterect (SADisplay *display, VisRectangle *rect)
{
X11Native *native = X11_NATIVE (display->native);
return 0;
}
static int native_drainevents (SADisplay *display, VisEventQueue *eventqueue)
{
X11Native *native = X11_NATIVE (display->native);
return 0;
}
static int get_nearest_resolution (SADisplay *display, int *width, int *height)
{
return 0;
}