--- a/src/KXLsound.c +++ b/src/KXLsound.c @@ -4,6 +4,9 @@ #include #include #include +#include +#include +#include #include "KXL.h" #define MIN(a, b) (((a) < (b)) ? (a) : (b)) @@ -22,7 +24,7 @@ struct { Uint16 ListCnt; Sint32 ID; - Sint32 Pipe[2]; + int Pipe[2]; Sint32 Device; Uint16 PlayCnt; KXL_SoundControl PlaySound[MAX_SOUNDS_PLAYING]; @@ -242,11 +244,19 @@ KXL_SoundOk = False; KXL_LoadSoundData(path, fname); - // device check - if ((KXL_SoundData.Device = open("/dev/dsp", O_WRONLY)) == -1) { - fprintf(stderr, "KXL error message\nnot found sound card\n"); + // Open the sound device in non-blocking mode, because ALSA's OSS + // emulation and some broken OSS drivers would make a blocking call + // wait forever until the device is available. Since this breaks the + // OSS spec, we immediately put it back to blocking mode if the + // operation was successful. + KXL_SoundData.Device = open("/dev/dsp", O_WRONLY|O_NDELAY); + if (KXL_SoundData.Device < 0) { + fprintf(stderr, "KXL error message\ncould not open sound card (%s)\n", + strerror(errno)); return; } + fcntl( KXL_SoundData.Device, F_SETFL, + fcntl( KXL_SoundData.Device, F_GETFL ) &~ FNDELAY ); // create pipe if (pipe(KXL_SoundData.Pipe) < 0) { fprintf(stderr, "KXL error message\npipe error\n"); --- a/src/KXL.h +++ b/src/KXL.h @@ -205,6 +205,7 @@ KXL_Frame *Frame; // Pointer of frame structure GC FontGC; // GC of font XFontStruct *WinFont; // Pointer of font structrue + Bool DetectAutoRepeat; // Does the server have detectable auto repeat } KXL_Window; // RGBE palette typedef struct { --- a/src/KXLimage.c +++ b/src/KXLimage.c @@ -1,4 +1,5 @@ #include +#include #include "KXL.h" extern KXL_Window *KXL_Root; --- a/src/KXLvisual.c +++ b/src/KXLvisual.c @@ -1,4 +1,6 @@ #include +#include +#include #include "KXL.h" //================================================================ @@ -364,7 +366,11 @@ KXL_ReSizeFrame(w, h); KXL_Clear_Frame(0, 0, w, h); // Auto repeat off - XAutoRepeatOff(KXL_Root->Display); + XkbSetDetectableAutoRepeat(KXL_Root->Display, True, + &KXL_Root->DetectAutoRepeat); + if(!KXL_Root->DetectAutoRepeat) { + XAutoRepeatOff(KXL_Root->Display); + } } //============================================================== @@ -377,7 +383,9 @@ XFreeGC(KXL_Root->Display, KXL_Root->Frame->Gc); KXL_Free(KXL_Root->Frame); // Auto repeat on - XAutoRepeatOn(KXL_Root->Display); + if(!KXL_Root->DetectAutoRepeat) { + XAutoRepeatOn(KXL_Root->Display); + } // Delete font XFreeGC(KXL_Root->Display, KXL_Root->FontGC); // Delete window