--- src/KXLsound.c.old 2007-05-13 21:59:27.000000000 +0200 +++ src/KXLsound.c 2007-05-13 22:09:19.000000000 +0200 @@ -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"); --- src/KXL.h.old 2007-05-13 22:25:11.000000000 +0200 +++ src/KXL.h 2007-05-13 22:25:47.000000000 +0200 @@ -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 { --- src/KXLimage.c.old 2007-05-13 22:29:02.000000000 +0200 +++ src/KXLimage.c 2007-05-13 22:29:33.000000000 +0200 @@ -1,4 +1,5 @@ #include +#include #include "KXL.h" extern KXL_Window *KXL_Root; --- src/KXLvisual.c.old 2007-05-13 22:22:34.000000000 +0200 +++ src/KXLvisual.c 2007-05-13 22:28:39.000000000 +0200 @@ -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