SDLvncviewer: make display work with SDL2

pull/3/head
Christian Beier 6 years ago
parent 4d3c7dfc04
commit 65126b5826
No known key found for this signature in database
GPG Key ID: 421BB3B45C6067F8

@ -17,13 +17,12 @@ struct { int sdl; int rfb; } buttonMapping[]={
}; };
static int enableResizable = 1, viewOnly, listenLoop, buttonMask; static int enableResizable = 1, viewOnly, listenLoop, buttonMask;
#ifdef SDL_ASYNCBLIT int sdlFlags;
int sdlFlags = SDL_HWSURFACE | SDL_ASYNCBLIT | SDL_HWACCEL;
#else
int sdlFlags = SDL_HWSURFACE | SDL_HWACCEL;
#endif
static int realWidth, realHeight, bytesPerPixel, rowStride; static int realWidth, realHeight, bytesPerPixel, rowStride;
static char *sdlPixels; static char *sdlPixels;
SDL_Texture *sdlTexture;
SDL_Renderer *sdlRenderer;
SDL_Window *sdlWindow;
static int rightAltKeyDown, leftAltKeyDown; static int rightAltKeyDown, leftAltKeyDown;
@ -32,53 +31,76 @@ static rfbBool resize(rfbClient* client) {
depth=client->format.bitsPerPixel; depth=client->format.bitsPerPixel;
if (enableResizable) if (enableResizable)
sdlFlags |= SDL_RESIZABLE; sdlFlags |= SDL_WINDOW_RESIZABLE;
client->updateRect.x = client->updateRect.y = 0; client->updateRect.x = client->updateRect.y = 0;
client->updateRect.w = width; client->updateRect.h = height; client->updateRect.w = width; client->updateRect.h = height;
rfbBool okay=SDL_VideoModeOK(width,height,depth,sdlFlags);
if(!okay)
for(depth=24;!okay && depth>4;depth/=2)
okay=SDL_VideoModeOK(width,height,depth,sdlFlags);
if(okay) {
SDL_Surface* sdl=SDL_SetVideoMode(width,height,depth,sdlFlags);
rfbClientSetClientData(client, SDL_Init, sdl);
client->width = sdl->pitch / (depth / 8);
if (sdlPixels) {
free(client->frameBuffer);
sdlPixels = NULL;
}
client->frameBuffer=sdl->pixels;
client->format.bitsPerPixel=depth;
client->format.redShift=sdl->format->Rshift;
client->format.greenShift=sdl->format->Gshift;
client->format.blueShift=sdl->format->Bshift;
client->format.redMax=sdl->format->Rmask>>client->format.redShift;
client->format.greenMax=sdl->format->Gmask>>client->format.greenShift;
client->format.blueMax=sdl->format->Bmask>>client->format.blueShift;
SetFormatAndEncodings(client);
/* (re)create the surface used as the client's framebuffer */
SDL_FreeSurface(rfbClientGetClientData(client, SDL_Init));
SDL_Surface* sdl=SDL_CreateRGBSurface(0,
width,
height,
depth,
0,0,0,0);
if(!sdl)
rfbClientErr("resize: error creating surface: %s\n", SDL_GetError());
rfbClientSetClientData(client, SDL_Init, sdl);
client->width = sdl->pitch / (depth / 8);
if (sdlPixels) {
free(client->frameBuffer);
sdlPixels = NULL;
}
client->frameBuffer=sdl->pixels;
client->format.bitsPerPixel=depth;
client->format.redShift=sdl->format->Rshift;
client->format.greenShift=sdl->format->Gshift;
client->format.blueShift=sdl->format->Bshift;
client->format.redMax=sdl->format->Rmask>>client->format.redShift;
client->format.greenMax=sdl->format->Gmask>>client->format.greenShift;
client->format.blueMax=sdl->format->Bmask>>client->format.blueShift;
SetFormatAndEncodings(client);
/* create or resize the window */
if(!sdlWindow) {
sdlWindow = SDL_CreateWindow(client->desktopName,
SDL_WINDOWPOS_UNDEFINED,
SDL_WINDOWPOS_UNDEFINED,
width,
height,
sdlFlags);
if(!sdlWindow)
rfbClientErr("resize: error creating window: %s\n", SDL_GetError());
} else { } else {
SDL_Surface* sdl=rfbClientGetClientData(client, SDL_Init); SDL_SetWindowSize(sdlWindow, width, height);
rfbClientLog("Could not set resolution %dx%d!\n",
client->width,client->height);
if(sdl) {
client->width=sdl->pitch / (depth / 8);
client->height=sdl->h;
} else {
client->width=0;
client->height=0;
}
return FALSE;
} }
SDL_WM_SetCaption(client->desktopName, "SDL");
/* create the renderer if it does not already exist */
if(!sdlRenderer) {
sdlRenderer = SDL_CreateRenderer(sdlWindow, -1, 0);
if(!sdlRenderer)
rfbClientErr("resize: error creating renderer: %s\n", SDL_GetError());
SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "linear"); /* make the scaled rendering look smoother. */
}
SDL_RenderSetLogicalSize(sdlRenderer, width, height); /* this is a departure from the SDL1.2-based version, but more in the sense of a VNC viewer in keeeping aspect ratio */
/* (re)create the texture that sits in between the surface->pixels and the renderer */
if(sdlTexture)
SDL_DestroyTexture(sdlTexture);
sdlTexture = SDL_CreateTexture(sdlRenderer,
SDL_PIXELFORMAT_ARGB8888,
SDL_TEXTUREACCESS_STREAMING,
width, height);
if(!sdlTexture)
rfbClientErr("resize: error creating texture: %s\n", SDL_GetError());
return TRUE; return TRUE;
} }
static rfbKeySym SDL_key2rfbKeySym(SDL_KeyboardEvent* e) { static rfbKeySym SDL_key2rfbKeySym(SDL_KeyboardEvent* e) {
rfbKeySym k = 0; rfbKeySym k = 0;
SDLKey sym = e->keysym.sym; /*FIXMESDLKey sym = e->keysym.sym;
switch (sym) { switch (sym) {
case SDLK_BACKSPACE: k = XK_BackSpace; break; case SDLK_BACKSPACE: k = XK_BackSpace; break;
@ -153,7 +175,7 @@ static rfbKeySym SDL_key2rfbKeySym(SDL_KeyboardEvent* e) {
case SDLK_BREAK: k = XK_Break; break; case SDLK_BREAK: k = XK_Break; break;
default: break; default: break;
} }
/* both SDL and X11 keysyms match ASCII in the range 0x01-0x7f */ // both SDL and X11 keysyms match ASCII in the range 0x01-0x7f
if (k == 0 && sym > 0x0 && sym < 0x100) { if (k == 0 && sym > 0x0 && sym < 0x100) {
k = sym; k = sym;
if (e->keysym.mod & (KMOD_LSHIFT | KMOD_RSHIFT)) { if (e->keysym.mod & (KMOD_LSHIFT | KMOD_RSHIFT)) {
@ -169,7 +191,7 @@ static rfbKeySym SDL_key2rfbKeySym(SDL_KeyboardEvent* e) {
else else
rfbClientLog("Unknown keysym: %d\n", sym); rfbClientLog("Unknown keysym: %d\n", sym);
} }
*/
return k; return k;
} }
@ -245,19 +267,29 @@ static void update(rfbClient* cl,int x,int y,int w,int h) {
w -= x; w -= x;
h -= y; h -= y;
} }
SDL_UpdateRect(rfbClientGetClientData(cl, SDL_Init), x, y, w, h); SDL_Surface *sdl = rfbClientGetClientData(cl, SDL_Init);
/* update texture from surface->pixels */
SDL_Rect r = {x,y,w,h};
if(SDL_UpdateTexture(sdlTexture, &r, sdl->pixels + y*sdl->pitch + x*4, sdl->pitch) < 0)
rfbClientErr("update: failed to update texture: %s\n", SDL_GetError());
/* copy texture to renderer and show */
if(SDL_RenderClear(sdlRenderer) < 0)
rfbClientErr("update: failed to clear renderer: %s\n", SDL_GetError());
if(SDL_RenderCopy(sdlRenderer, sdlTexture, NULL, NULL) < 0)
rfbClientErr("update: failed to copy texture to renderer: %s\n", SDL_GetError());
SDL_RenderPresent(sdlRenderer);
} }
static void setRealDimension(rfbClient *client, int w, int h) static void setRealDimension(rfbClient *client, int w, int h)
{ {
SDL_Surface* sdl; SDL_Surface* sdl;
/*FIXME
if (w < 0) { if (w < 0) {
const SDL_VideoInfo *info = SDL_GetVideoInfo(); const SDL_VideoInfo *info = SDL_GetVideoInfo();
w = info->current_h; w = info->current_h;
h = info->current_w; h = info->current_w;
} }
*/
if (w == realWidth && h == realHeight) if (w == realWidth && h == realHeight)
return; return;
@ -280,7 +312,7 @@ static void setRealDimension(rfbClient *client, int w, int h)
sdl = rfbClientGetClientData(client, SDL_Init); sdl = rfbClientGetClientData(client, SDL_Init);
if (sdl->w != w || sdl->h != h) { if (sdl->w != w || sdl->h != h) {
int depth = sdl->format->BitsPerPixel; int depth = sdl->format->BitsPerPixel;
sdl = SDL_SetVideoMode(w, h, depth, sdlFlags); //FIXMEsdl = SDL_SetVideoMode(w, h, depth, sdlFlags);
rfbClientSetClientData(client, SDL_Init, sdl); rfbClientSetClientData(client, SDL_Init, sdl);
sdlPixels = sdl->pixels; sdlPixels = sdl->pixels;
rowStride = sdl->pitch / (depth / 8); rowStride = sdl->pitch / (depth / 8);
@ -374,12 +406,14 @@ static void cleanup(rfbClient* cl)
static rfbBool handleSDLEvent(rfbClient *cl, SDL_Event *e) static rfbBool handleSDLEvent(rfbClient *cl, SDL_Event *e)
{ {
switch(e->type) { switch(e->type) {
#if SDL_MAJOR_VERSION > 1 || SDL_MINOR_VERSION >= 2 case SDL_WINDOWEVENT:
case SDL_VIDEOEXPOSE: switch (e->window.event) {
case SDL_WINDOWEVENT_EXPOSED:
SendFramebufferUpdateRequest(cl, 0, 0, SendFramebufferUpdateRequest(cl, 0, 0,
cl->width, cl->height, FALSE); cl->width, cl->height, FALSE);
break; break;
#endif }
break;
case SDL_MOUSEBUTTONUP: case SDL_MOUSEBUTTONUP:
case SDL_MOUSEBUTTONDOWN: case SDL_MOUSEBUTTONDOWN:
case SDL_MOUSEMOTION: case SDL_MOUSEMOTION:
@ -437,6 +471,7 @@ static rfbBool handleSDLEvent(rfbClient *cl, SDL_Event *e)
rfbClientCleanup(cl); rfbClientCleanup(cl);
exit(0); exit(0);
} }
/*FIXME
case SDL_ACTIVEEVENT: case SDL_ACTIVEEVENT:
if (!e->active.gain && rightAltKeyDown) { if (!e->active.gain && rightAltKeyDown) {
SendKeyEvent(cl, XK_Alt_R, FALSE); SendKeyEvent(cl, XK_Alt_R, FALSE);
@ -457,12 +492,15 @@ static rfbBool handleSDLEvent(rfbClient *cl, SDL_Event *e)
SendClientCutText(cl, data, len); SendClientCutText(cl, data, len);
} }
break; break;
*/
case SDL_SYSWMEVENT: case SDL_SYSWMEVENT:
clipboard_filter(e); clipboard_filter(e);
break; break;
/*FIXME
case SDL_VIDEORESIZE: case SDL_VIDEORESIZE:
setRealDimension(cl, e->resize.w, e->resize.h); setRealDimension(cl, e->resize.w, e->resize.h);
break; break;
*/
default: default:
rfbClientLog("ignore SDL event: 0x%x\n", e->type); rfbClientLog("ignore SDL event: 0x%x\n", e->type);
} }
@ -471,7 +509,7 @@ static rfbBool handleSDLEvent(rfbClient *cl, SDL_Event *e)
static void got_selection(rfbClient *cl, const char *text, int len) static void got_selection(rfbClient *cl, const char *text, int len)
{ {
put_scrap(T('T', 'E', 'X', 'T'), len, text); //FIXMEput_scrap(T('T', 'E', 'X', 'T'), len, text);
} }
@ -532,9 +570,7 @@ int main(int argc,char** argv) {
argc = j; argc = j;
SDL_Init(SDL_INIT_VIDEO | SDL_INIT_NOPARACHUTE); SDL_Init(SDL_INIT_VIDEO | SDL_INIT_NOPARACHUTE);
SDL_EnableUNICODE(1); //FIXME SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL);
SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY,
SDL_DEFAULT_REPEAT_INTERVAL);
atexit(SDL_Quit); atexit(SDL_Quit);
signal(SIGINT, exit); signal(SIGINT, exit);

@ -209,7 +209,8 @@ int init_scrap(void)
SDL_SetError("SDL is not running on known window manager"); SDL_SetError("SDL is not running on known window manager");
SDL_VERSION(&info.version); SDL_VERSION(&info.version);
if (SDL_GetWMInfo(&info)) { //FIXMEif (SDL_GetWMInfo(&info))
{
/* Save the information for later use */ /* Save the information for later use */
#if defined(X11_SCRAP) #if defined(X11_SCRAP)
if (info.subsystem == SDL_SYSWM_X11) { if (info.subsystem == SDL_SYSWM_X11) {

Loading…
Cancel
Save