Date: Mon, 18 Feb 2002 16:46:59 +1200
From: Julian Kinraid <jkinraid@clear.net.nz> Subject: Patches for photon port of SDL Hi, A couple more patches for photon and the nto audio. Adds mouse grabbing support, fixed cursor images, unicode keyboard events (though no unicode data on kye release, is that a problem?), hopefully fixing some audio lag problems, and a few other fixes. Thanks, Julian Kinraid --HG-- extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%40284
This commit is contained in:
parent
b6348eb051
commit
b961568eee
6 changed files with 137 additions and 114 deletions
|
@ -55,7 +55,7 @@ static int device_no = 0;
|
||||||
#define DEFAULT_CPARAMS_VOICES 1
|
#define DEFAULT_CPARAMS_VOICES 1
|
||||||
#define DEFAULT_CPARAMS_FRAG_SIZE 4096 //was 512
|
#define DEFAULT_CPARAMS_FRAG_SIZE 4096 //was 512
|
||||||
#define DEFAULT_CPARAMS_FRAGS_MIN 1
|
#define DEFAULT_CPARAMS_FRAGS_MIN 1
|
||||||
#define DEFAULT_CPARAMS_FRAGS_MAX -1
|
#define DEFAULT_CPARAMS_FRAGS_MAX 1
|
||||||
|
|
||||||
/* Open the audio device for playback, and don't block if busy */
|
/* Open the audio device for playback, and don't block if busy */
|
||||||
#define OPEN_FLAGS SND_PCM_OPEN_PLAYBACK
|
#define OPEN_FLAGS SND_PCM_OPEN_PLAYBACK
|
||||||
|
@ -384,9 +384,9 @@ static int NTO_OpenAudio(_THIS, SDL_AudioSpec *spec)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* enable count status parameter */
|
/* enable count status parameter */
|
||||||
if ((rval = snd_plugin_set_disable(audio_handle, PLUGIN_DISABLE_MMAP))<0)
|
if ((rval = snd_pcm_plugin_set_disable(audio_handle, PLUGIN_DISABLE_MMAP))<0)
|
||||||
{
|
{
|
||||||
SDL_SetError("snd_plugin_set_disable failed: %s\n", snd_strerror(rval));
|
SDL_SetError("snd_pcm_plugin_set_disable failed: %s\n", snd_strerror(rval));
|
||||||
return(-1);
|
return(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -55,7 +55,7 @@ SDL_keysym *ph_TranslateKey(PhKeyEvent_t *key, SDL_keysym *keysym);
|
||||||
(idea shamelessly lifted from GII -- thanks guys! :)
|
(idea shamelessly lifted from GII -- thanks guys! :)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
#if 0
|
||||||
static int ph_KeyRepeat(_THIS, PhKeyEvent_t* keyevent)
|
static int ph_KeyRepeat(_THIS, PhKeyEvent_t* keyevent)
|
||||||
{
|
{
|
||||||
// PhEvent_t* peekevent;
|
// PhEvent_t* peekevent;
|
||||||
|
@ -89,78 +89,33 @@ static int ph_KeyRepeat(_THIS, PhKeyEvent_t* keyevent)
|
||||||
}
|
}
|
||||||
return(repeated);
|
return(repeated);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
*/
|
static int ph_WarpedMotion(_THIS, PhEvent_t *winEvent)
|
||||||
|
|
||||||
/* Note: The X server buffers and accumulates mouse motion events, so
|
|
||||||
the motion event generated by the warp may not appear exactly as we
|
|
||||||
expect it to. We work around this (and improve performance) by only
|
|
||||||
warping the pointer when it reaches the edge, and then wait for it.
|
|
||||||
*/
|
|
||||||
/*
|
|
||||||
#define MOUSE_FUDGE_FACTOR 8
|
|
||||||
|
|
||||||
static inline int X11_WarpedMotion(_THIS, XEvent *xevent)
|
|
||||||
{
|
{
|
||||||
int w, h, i;
|
PhPointerEvent_t *pointer = PhGetData( winEvent );
|
||||||
int deltax, deltay;
|
PhRect_t *rect = PhGetRects( winEvent );
|
||||||
|
|
||||||
|
int centre_x, centre_y;
|
||||||
|
int dx, dy, abs_x, abs_y;
|
||||||
int posted;
|
int posted;
|
||||||
|
|
||||||
w = SDL_VideoSurface->w;
|
centre_x = SDL_VideoSurface->w / 2;
|
||||||
h = SDL_VideoSurface->h;
|
centre_y = SDL_VideoSurface->h / 2;
|
||||||
deltax = xevent->xmotion.x - mouse_last.x;
|
|
||||||
deltay = xevent->xmotion.y - mouse_last.y;
|
dx = rect->ul.x - centre_x;
|
||||||
#ifdef DEBUG_MOTION
|
dy = rect->ul.y - centre_y;
|
||||||
printf("Warped mouse motion: %d,%d\n", deltax, deltay);
|
|
||||||
#endif
|
posted = SDL_PrivateMouseMotion( 0, 1, dx, dy );
|
||||||
mouse_last.x = xevent->xmotion.x;
|
|
||||||
mouse_last.y = xevent->xmotion.y;
|
/* Move mouse cursor to middle of the window */
|
||||||
posted = SDL_PrivateMouseMotion(0, 1, deltax, deltay);
|
PtGetAbsPosition( window, &abs_x, &abs_y );
|
||||||
|
PhMoveCursorAbs( PhInputGroup(NULL),
|
||||||
|
abs_x + centre_x,
|
||||||
|
abs_y + centre_y );
|
||||||
|
|
||||||
if ( (xevent->xmotion.x < MOUSE_FUDGE_FACTOR) ||
|
|
||||||
(xevent->xmotion.x > (w-MOUSE_FUDGE_FACTOR)) ||
|
|
||||||
(xevent->xmotion.y < MOUSE_FUDGE_FACTOR) ||
|
|
||||||
(xevent->xmotion.y > (h-MOUSE_FUDGE_FACTOR)) ) {
|
|
||||||
// Get the events that have accumulated
|
|
||||||
/* while ( XCheckTypedEvent(SDL_Display, MotionNotify, xevent) ) {
|
|
||||||
deltax = xevent->xmotion.x - mouse_last.x;
|
|
||||||
deltay = xevent->xmotion.y - mouse_last.y;
|
|
||||||
#ifdef DEBUG_MOTION
|
|
||||||
printf("Extra mouse motion: %d,%d\n", deltax, deltay);
|
|
||||||
#endif
|
|
||||||
mouse_last.x = xevent->xmotion.x;
|
|
||||||
mouse_last.y = xevent->xmotion.y;
|
|
||||||
posted += SDL_PrivateMouseMotion(0, 1, deltax, deltay);
|
|
||||||
}
|
|
||||||
mouse_last.x = w/2;
|
|
||||||
mouse_last.y = h/2;
|
|
||||||
XWarpPointer(SDL_Display, None, SDL_Window, 0, 0, 0, 0,
|
|
||||||
mouse_last.x, mouse_last.y);
|
|
||||||
for ( i=0; i<10; ++i ) {
|
|
||||||
XMaskEvent(SDL_Display, PointerMotionMask, xevent);
|
|
||||||
if ( (xevent->xmotion.x >
|
|
||||||
(mouse_last.x-MOUSE_FUDGE_FACTOR)) &&
|
|
||||||
(xevent->xmotion.x <
|
|
||||||
(mouse_last.x+MOUSE_FUDGE_FACTOR)) &&
|
|
||||||
(xevent->xmotion.y >
|
|
||||||
(mouse_last.y-MOUSE_FUDGE_FACTOR)) &&
|
|
||||||
(xevent->xmotion.y <
|
|
||||||
(mouse_last.y+MOUSE_FUDGE_FACTOR)) ) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
#ifdef DEBUG_XEVENTS
|
|
||||||
printf("Lost mouse motion: %d,%d\n", xevent->xmotion.x, xevent->xmotion.y);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
#ifdef DEBUG_XEVENTS
|
|
||||||
if ( i == 10 ) {
|
|
||||||
printf("Warning: didn't detect mouse warp motion\n");
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
return(posted);
|
return(posted);
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
|
|
||||||
/* Control which motion flags the window has set, a flags value of -1 sets
|
/* Control which motion flags the window has set, a flags value of -1 sets
|
||||||
* MOTION_BUTTON and MOTION_NOBUTTON */
|
* MOTION_BUTTON and MOTION_NOBUTTON */
|
||||||
|
@ -226,8 +181,13 @@ static int ph_DispatchEvent(_THIS)
|
||||||
if ( SDL_VideoSurface ) {
|
if ( SDL_VideoSurface ) {
|
||||||
pointerEvent = PhGetData( event );
|
pointerEvent = PhGetData( event );
|
||||||
rect = PhGetRects( event );
|
rect = PhGetRects( event );
|
||||||
posted = SDL_PrivateMouseMotion(0, 0,
|
if( mouse_relative )
|
||||||
rect->ul.x, rect->ul.y);
|
{
|
||||||
|
posted = ph_WarpedMotion(this, event);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
posted = SDL_PrivateMouseMotion(0, 0,
|
||||||
|
rect->ul.x, rect->ul.y);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -291,10 +251,11 @@ static int ph_DispatchEvent(_THIS)
|
||||||
{
|
{
|
||||||
set_motion_sensitivity(this, -1);
|
set_motion_sensitivity(this, -1);
|
||||||
posted = SDL_PrivateAppActive(1, SDL_APPINPUTFOCUS);
|
posted = SDL_PrivateAppActive(1, SDL_APPINPUTFOCUS);
|
||||||
|
#if 0
|
||||||
/* Queue entry into fullscreen mode */
|
/* Queue entry into fullscreen mode */
|
||||||
switch_waiting = 0x01 | SDL_FULLSCREEN;
|
switch_waiting = 0x01 | SDL_FULLSCREEN;
|
||||||
switch_time = SDL_GetTicks() + 1500;
|
switch_time = SDL_GetTicks() + 1500;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/* request to quit */
|
/* request to quit */
|
||||||
|
@ -302,6 +263,13 @@ static int ph_DispatchEvent(_THIS)
|
||||||
{
|
{
|
||||||
posted = SDL_PrivateQuit();
|
posted = SDL_PrivateQuit();
|
||||||
}
|
}
|
||||||
|
else if (winEvent->event_f==Ph_WM_RESIZE)
|
||||||
|
{
|
||||||
|
PhDim_t *size;
|
||||||
|
|
||||||
|
PtGetResource( window, Pt_ARG_DIM, &size, 0 );
|
||||||
|
SDL_PrivateResize(size->w,size->h);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -445,6 +413,7 @@ void ph_PumpEvents(_THIS)
|
||||||
Uint32 now;
|
Uint32 now;
|
||||||
|
|
||||||
now = SDL_GetTicks();
|
now = SDL_GetTicks();
|
||||||
|
#if 0
|
||||||
if ( pending || !SDL_VideoSurface ) {
|
if ( pending || !SDL_VideoSurface ) {
|
||||||
/* Try again later... */
|
/* Try again later... */
|
||||||
if ( switch_waiting & SDL_FULLSCREEN ) {
|
if ( switch_waiting & SDL_FULLSCREEN ) {
|
||||||
|
@ -473,6 +442,7 @@ void ph_PumpEvents(_THIS)
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -573,6 +543,7 @@ SDL_keysym *ph_TranslateKey(PhKeyEvent_t *key, SDL_keysym *keysym)
|
||||||
This member is valid only if Pk_KF_Sym_Valid is set in the key_flags.
|
This member is valid only if Pk_KF_Sym_Valid is set in the key_flags.
|
||||||
We will assume it is valid.
|
We will assume it is valid.
|
||||||
*/
|
*/
|
||||||
|
/* FIXME: This needs to check whether the cap & scancode is valid */
|
||||||
cap = key->key_cap;
|
cap = key->key_cap;
|
||||||
switch (cap>>8) {
|
switch (cap>>8) {
|
||||||
case 0x00: /* Latin 1 */
|
case 0x00: /* Latin 1 */
|
||||||
|
@ -599,10 +570,27 @@ SDL_keysym *ph_TranslateKey(PhKeyEvent_t *key, SDL_keysym *keysym)
|
||||||
keysym->sym = MISC_keymap[cap&0xFF];
|
keysym->sym = MISC_keymap[cap&0xFF];
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
fprintf(stderr,"Photon: Unknown key_cap, cap = 0x%.4x\n", (unsigned int)cap);
|
/* fprintf(stderr,"Photon: Unknown key_cap, cap = 0x%.4x\n", (unsigned int)cap); */
|
||||||
|
keysym->sym = SDLK_UNKNOWN;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
keysym->scancode = key->key_scan;
|
keysym->scancode = key->key_scan;
|
||||||
|
keysym->unicode = 0;
|
||||||
|
if( SDL_TranslateUNICODE )
|
||||||
|
{
|
||||||
|
char utf8[MB_CUR_MAX];
|
||||||
|
int utf8len;
|
||||||
|
wchar_t unicode;
|
||||||
|
|
||||||
|
utf8len = PhKeyToMb( utf8, key );
|
||||||
|
if( utf8len > 0 )
|
||||||
|
{
|
||||||
|
utf8len = mbtowc( &unicode, utf8, utf8len );
|
||||||
|
if( utf8len > 0)
|
||||||
|
keysym->unicode = unicode;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return (keysym);
|
return (keysym);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -175,8 +175,10 @@ int ph_SetupOCImage(_THIS, SDL_Surface *screen) //Offscreen context
|
||||||
|
|
||||||
void ph_DestroyImage(_THIS, SDL_Surface *screen)
|
void ph_DestroyImage(_THIS, SDL_Surface *screen)
|
||||||
{
|
{
|
||||||
|
#if 0
|
||||||
if(SDL_Image == NULL)
|
if(SDL_Image == NULL)
|
||||||
return;
|
return;
|
||||||
|
#endif
|
||||||
|
|
||||||
if (OCImage.offscreen_context != NULL)
|
if (OCImage.offscreen_context != NULL)
|
||||||
{
|
{
|
||||||
|
@ -188,21 +190,21 @@ void ph_DestroyImage(_THIS, SDL_Surface *screen)
|
||||||
OCImage.FrameData1 = NULL;
|
OCImage.FrameData1 = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (SDL_Image->image)
|
if (SDL_Image)
|
||||||
{
|
{
|
||||||
// SDL_Image->flags=Ph_RELEASE_IMAGE;
|
// SDL_Image->flags=Ph_RELEASE_IMAGE;
|
||||||
// PhReleaseImage(SDL_Image);
|
// PhReleaseImage(SDL_Image);
|
||||||
PgShmemDestroy(SDL_Image->image); // Use this if you using shared memory, or uncomment
|
if (SDL_Image->image)
|
||||||
|
PgShmemDestroy(SDL_Image->image); // Use this if you using shared memory, or uncomment
|
||||||
// lines above if not (and comment this line ;-)
|
// lines above if not (and comment this line ;-)
|
||||||
free(SDL_Image);
|
free(SDL_Image);
|
||||||
|
SDL_Image = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( screen )
|
if ( screen )
|
||||||
{
|
{
|
||||||
screen->pixels = NULL;
|
screen->pixels = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
SDL_Image = NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int ph_ResizeImage(_THIS, SDL_Surface *screen, Uint32 flags)
|
int ph_ResizeImage(_THIS, SDL_Surface *screen, Uint32 flags)
|
||||||
|
|
|
@ -62,6 +62,7 @@ WMcursor *ph_CreateWMCursor(_THIS,
|
||||||
{
|
{
|
||||||
WMcursor* cursor;
|
WMcursor* cursor;
|
||||||
int clen, i;
|
int clen, i;
|
||||||
|
unsigned char bit, databit, maskbit;
|
||||||
|
|
||||||
/* Allocate and initialize the cursor memory */
|
/* Allocate and initialize the cursor memory */
|
||||||
if ((cursor = (WMcursor*)malloc(sizeof(WMcursor))) == NULL)
|
if ((cursor = (WMcursor*)malloc(sizeof(WMcursor))) == NULL)
|
||||||
|
@ -70,13 +71,13 @@ WMcursor *ph_CreateWMCursor(_THIS,
|
||||||
return(NULL);
|
return(NULL);
|
||||||
}
|
}
|
||||||
memset(cursor,0,sizeof(WMcursor));
|
memset(cursor,0,sizeof(WMcursor));
|
||||||
|
|
||||||
cursor->ph_cursor = (PhCursorDef_t *) malloc(sizeof(PhCursorDef_t) + 32*4*2);
|
cursor->ph_cursor = (PhCursorDef_t *) malloc(sizeof(PhCursorDef_t) + 32*4*2);
|
||||||
if(cursor->ph_cursor == NULL)
|
if(cursor->ph_cursor == NULL)
|
||||||
printf("cursor malloc failed\n");
|
printf("cursor malloc failed\n");
|
||||||
|
|
||||||
memset(cursor->ph_cursor,0,(sizeof(PhCursorDef_t) + 32*4*2));
|
memset(cursor->ph_cursor,0,(sizeof(PhCursorDef_t) + 32*4*2));
|
||||||
|
|
||||||
cursor->ph_cursor->hdr.type =Ph_RDATA_CURSOR;
|
cursor->ph_cursor->hdr.type =Ph_RDATA_CURSOR;
|
||||||
cursor->ph_cursor->size1.x = (short)w;
|
cursor->ph_cursor->size1.x = (short)w;
|
||||||
cursor->ph_cursor->size1.y = (short)h;
|
cursor->ph_cursor->size1.y = (short)h;
|
||||||
|
@ -90,18 +91,27 @@ WMcursor *ph_CreateWMCursor(_THIS,
|
||||||
cursor->ph_cursor->offset2.y = (short)hot_y;
|
cursor->ph_cursor->offset2.y = (short)hot_y;
|
||||||
cursor->ph_cursor->bytesperline2 = (char)w/8;
|
cursor->ph_cursor->bytesperline2 = (char)w/8;
|
||||||
cursor->ph_cursor->color2 = Pg_BLACK;
|
cursor->ph_cursor->color2 = Pg_BLACK;
|
||||||
|
|
||||||
clen = (w/8)*h;
|
clen = (w/8)*h;
|
||||||
|
|
||||||
/* Copy the mask and the data to different
|
/* Copy the mask and the data to different
|
||||||
bitmap planes */
|
bitmap planes */
|
||||||
for ( i=0; i<clen; ++i )
|
for ( i=0; i<clen; ++i )
|
||||||
{
|
{
|
||||||
cursor->ph_cursor->images[i] = data[i];
|
for ( bit = 0; bit < 8; bit++ )
|
||||||
cursor->ph_cursor->images[i+clen] = mask[i];
|
{
|
||||||
}
|
databit = data[i] & (1 << bit);
|
||||||
|
maskbit = mask[i] & (1 << bit);
|
||||||
//#bytes following the hdr struct
|
|
||||||
|
cursor->ph_cursor->images[i] |=
|
||||||
|
(databit == 0) ? maskbit : 0;
|
||||||
|
/* If the databit != 0, treat it as a black pixel and
|
||||||
|
* ignore the maskbit (can't do an inverted color) */
|
||||||
|
cursor->ph_cursor->images[i+clen] |= databit;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* #bytes following the hdr struct */
|
||||||
cursor->ph_cursor->hdr.len =sizeof(PhCursorDef_t) + clen*2 - sizeof(PhRegionDataHdr_t);
|
cursor->ph_cursor->hdr.len =sizeof(PhCursorDef_t) + clen*2 - sizeof(PhRegionDataHdr_t);
|
||||||
|
|
||||||
return (cursor);
|
return (cursor);
|
||||||
|
@ -113,7 +123,6 @@ PhCursorDef_t ph_GetWMPhCursor(WMcursor *cursor)
|
||||||
return(*cursor->ph_cursor);
|
return(*cursor->ph_cursor);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int ph_ShowWMCursor(_THIS, WMcursor *cursor)
|
int ph_ShowWMCursor(_THIS, WMcursor *cursor)
|
||||||
{
|
{
|
||||||
PtArg_t args[3];
|
PtArg_t args[3];
|
||||||
|
@ -130,13 +139,13 @@ int ph_ShowWMCursor(_THIS, WMcursor *cursor)
|
||||||
|
|
||||||
if ( cursor != NULL ) {
|
if ( cursor != NULL ) {
|
||||||
PtSetArg( &args[0], Pt_ARG_CURSOR_TYPE, Ph_CURSOR_BITMAP, 0 );
|
PtSetArg( &args[0], Pt_ARG_CURSOR_TYPE, Ph_CURSOR_BITMAP, 0 );
|
||||||
// Could set next to any PgColor_t value
|
/* Could set next to any PgColor_t value */
|
||||||
PtSetArg( &args[1], Pt_ARG_CURSOR_COLOR,Ph_CURSOR_DEFAULT_COLOR , 0 );
|
PtSetArg( &args[1], Pt_ARG_CURSOR_COLOR,Ph_CURSOR_DEFAULT_COLOR , 0 );
|
||||||
PtSetArg( &args[2], Pt_ARG_BITMAP_CURSOR, cursor->ph_cursor, (cursor->ph_cursor->hdr.len + sizeof(PhRegionDataHdr_t)) );
|
PtSetArg( &args[2], Pt_ARG_BITMAP_CURSOR, cursor->ph_cursor, (cursor->ph_cursor->hdr.len + sizeof(PhRegionDataHdr_t)) );
|
||||||
nargs = 3;
|
nargs = 3;
|
||||||
cursor_is_defined = 1;
|
cursor_is_defined = 1;
|
||||||
}
|
}
|
||||||
else // Ph_CURSOR_NONE
|
else /* Ph_CURSOR_NONE */
|
||||||
{
|
{
|
||||||
PtSetArg( &args[0], Pt_ARG_CURSOR_TYPE,Ph_CURSOR_NONE, 0);
|
PtSetArg( &args[0], Pt_ARG_CURSOR_TYPE,Ph_CURSOR_NONE, 0);
|
||||||
nargs = 1;
|
nargs = 1;
|
||||||
|
@ -161,13 +170,22 @@ int ph_ShowWMCursor(_THIS, WMcursor *cursor)
|
||||||
|
|
||||||
void ph_WarpWMCursor(_THIS, Uint16 x, Uint16 y)
|
void ph_WarpWMCursor(_THIS, Uint16 x, Uint16 y)
|
||||||
{
|
{
|
||||||
SDL_Lock_EventThread();
|
short abs_x, abs_y;
|
||||||
PhMoveCursorRel( PhInputGroup(NULL), x, y );
|
|
||||||
SDL_Unlock_EventThread();
|
SDL_Lock_EventThread();
|
||||||
|
PtGetAbsPosition( window, &abs_x, &abs_y );
|
||||||
|
PhMoveCursorAbs( PhInputGroup(NULL), x + abs_x, y + abs_y );
|
||||||
|
SDL_Unlock_EventThread();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void ph_CheckMouseMode(_THIS)
|
void ph_CheckMouseMode(_THIS)
|
||||||
{
|
{
|
||||||
mouse_relative = 1;
|
/* If the mouse is hidden and input is grabbed, we use relative mode */
|
||||||
|
if ( !(SDL_cursorstate & CURSOR_VISIBLE) &&
|
||||||
|
(this->input_grab != SDL_GRAB_OFF) ) {
|
||||||
|
mouse_relative = 1;
|
||||||
|
} else {
|
||||||
|
mouse_relative = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -111,7 +111,7 @@ static SDL_VideoDevice *ph_CreateDevice(int devindex)
|
||||||
device->SetCaption = ph_SetCaption;
|
device->SetCaption = ph_SetCaption;
|
||||||
device->SetIcon = NULL;
|
device->SetIcon = NULL;
|
||||||
device->IconifyWindow = ph_IconifyWindow;
|
device->IconifyWindow = ph_IconifyWindow;
|
||||||
device->GrabInput = NULL;
|
device->GrabInput = ph_GrabInput;
|
||||||
device->GetWMInfo = NULL;
|
device->GetWMInfo = NULL;
|
||||||
device->FreeWMCursor = ph_FreeWMCursor;
|
device->FreeWMCursor = ph_FreeWMCursor;
|
||||||
device->CreateWMCursor = ph_CreateWMCursor;
|
device->CreateWMCursor = ph_CreateWMCursor;
|
||||||
|
@ -329,7 +329,7 @@ static SDL_Surface *ph_SetVideoMode(_THIS, SDL_Surface *current,
|
||||||
|
|
||||||
/* Get the true height and width */
|
/* Get the true height and width */
|
||||||
|
|
||||||
current->flags = (flags|(~SDL_RESIZABLE)); /* no resize for Direct Context */
|
current->flags = (flags & (~SDL_RESIZABLE)); /* no resize for Direct Context */
|
||||||
|
|
||||||
/* Begin direct mode */
|
/* Begin direct mode */
|
||||||
ph_EnterFullScreen(this);
|
ph_EnterFullScreen(this);
|
||||||
|
@ -342,11 +342,11 @@ static SDL_Surface *ph_SetVideoMode(_THIS, SDL_Surface *current,
|
||||||
if (flags & SDL_HWSURFACE) /* Use offscreen memory iff SDL_HWSURFACE flag is set */
|
if (flags & SDL_HWSURFACE) /* Use offscreen memory iff SDL_HWSURFACE flag is set */
|
||||||
{
|
{
|
||||||
/* Hardware surface is Offsceen Context. ph_ResizeImage handles the switch */
|
/* Hardware surface is Offsceen Context. ph_ResizeImage handles the switch */
|
||||||
current->flags = (flags|(~SDL_RESIZABLE)); /* no stretch blit in offscreen context */
|
current->flags = (flags & (~SDL_RESIZABLE)); /* no stretch blit in offscreen context */
|
||||||
}
|
}
|
||||||
else /* must be SDL_SWSURFACE */
|
else /* must be SDL_SWSURFACE */
|
||||||
{
|
{
|
||||||
current->flags = (flags|SDL_RESIZABLE); /* yes we can resize as this is a software surface */
|
current->flags = (flags | SDL_RESIZABLE); /* yes we can resize as this is a software surface */
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef HAVE_OPENGL
|
#ifdef HAVE_OPENGL
|
||||||
|
@ -415,10 +415,7 @@ static SDL_Surface *ph_SetVideoMode(_THIS, SDL_Surface *current,
|
||||||
|
|
||||||
static void ph_VideoQuit(_THIS)
|
static void ph_VideoQuit(_THIS)
|
||||||
{
|
{
|
||||||
if (SDL_Image != NULL)
|
ph_DestroyImage(this, SDL_VideoSurface);
|
||||||
{
|
|
||||||
ph_DestroyImage(this, SDL_VideoSurface);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (currently_fullscreen)
|
if (currently_fullscreen)
|
||||||
{
|
{
|
||||||
|
|
|
@ -233,19 +233,15 @@ void ph_SetCaption(_THIS, const char *title, const char *icon)
|
||||||
/* Iconify current window */
|
/* Iconify current window */
|
||||||
int ph_IconifyWindow(_THIS)
|
int ph_IconifyWindow(_THIS)
|
||||||
{
|
{
|
||||||
WmApiContext_t context=WmCreateContext();
|
PhWindowEvent_t windowevent;
|
||||||
WmWindowDefinition_t **wininfo=malloc(sizeof(WmWindowDefinition_t)*2);
|
|
||||||
int num;
|
|
||||||
|
|
||||||
SDL_Lock_EventThread();
|
SDL_Lock_EventThread();
|
||||||
WmGetFocusList(context,2,&num,wininfo);
|
memset( &windowevent, 0, sizeof (event) );
|
||||||
WmPerformFrameAction(context, wininfo[0]->rid,Pt_ACTION_MIN);
|
windowevent.event_f = Ph_WM_HIDE;
|
||||||
|
windowevent.event_state = Ph_WM_EVSTATE_HIDE;
|
||||||
WmDestroyContext (context);
|
windowevent.rid = PtWidgetRid( window );
|
||||||
SDL_Unlock_EventThread();
|
PtForwardWindowEvent( &windowevent );
|
||||||
free(wininfo);
|
SDL_Unlock_EventThread();
|
||||||
|
|
||||||
return (0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SDL_GrabMode ph_GrabInputNoLock(_THIS, SDL_GrabMode mode)
|
SDL_GrabMode ph_GrabInputNoLock(_THIS, SDL_GrabMode mode)
|
||||||
|
@ -255,7 +251,29 @@ SDL_GrabMode ph_GrabInputNoLock(_THIS, SDL_GrabMode mode)
|
||||||
|
|
||||||
SDL_GrabMode ph_GrabInput(_THIS, SDL_GrabMode mode)
|
SDL_GrabMode ph_GrabInput(_THIS, SDL_GrabMode mode)
|
||||||
{
|
{
|
||||||
return(mode);
|
short abs_x, abs_y;
|
||||||
|
|
||||||
|
SDL_Lock_EventThread();
|
||||||
|
/* mode = ph_GrabInputNoLock(this, mode);*/
|
||||||
|
|
||||||
|
if( mode == SDL_GRAB_OFF )
|
||||||
|
{
|
||||||
|
PtSetResource(window, Pt_ARG_WINDOW_STATE, Pt_FALSE,
|
||||||
|
Ph_WM_STATE_ISALTKEY );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
PtSetResource(window, Pt_ARG_WINDOW_STATE, Pt_TRUE,
|
||||||
|
Ph_WM_STATE_ISALTKEY );
|
||||||
|
|
||||||
|
PtGetAbsPosition( window, &abs_x, &abs_y );
|
||||||
|
PhMoveCursorAbs( PhInputGroup( NULL ),
|
||||||
|
abs_x + SDL_VideoSurface->w/2,
|
||||||
|
abs_y + SDL_VideoSurface->h/2 );
|
||||||
|
}
|
||||||
|
|
||||||
|
SDL_Unlock_EventThread();
|
||||||
|
return(mode);
|
||||||
}
|
}
|
||||||
|
|
||||||
int ph_GetWMInfo(_THIS, SDL_SysWMinfo *info)
|
int ph_GetWMInfo(_THIS, SDL_SysWMinfo *info)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue