mirror of
https://github.com/projectM-visualizer/projectm.git
synced 2026-03-09 00:45:05 +00:00
blatently stolen from libvisual-hackground code base git-svn-id: https://projectm.svn.sourceforge.net/svnroot/projectm/trunk@1020 6778bc44-b910-0410-a7a0-be141de4315d
191 lines
4.6 KiB
C
191 lines
4.6 KiB
C
#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;
|
|
}
|
|
|