|
|
|
--- a/src/KXLsound.c
|
|
|
|
+++ b/src/KXLsound.c
|
|
|
|
@@ -4,6 +4,9 @@
|
|
|
|
#include <sys/ioctl.h>
|
|
|
|
#include <sys/time.h>
|
|
|
|
#include <linux/soundcard.h>
|
|
|
|
+#include <stdlib.h>
|
|
|
|
+#include <errno.h>
|
|
|
|
+#include <string.h>
|
|
|
|
#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 <stdio.h>
|
|
|
|
+#include <stdlib.h>
|
|
|
|
#include "KXL.h"
|
|
|
|
|
|
|
|
extern KXL_Window *KXL_Root;
|
|
|
|
--- a/src/KXLvisual.c
|
|
|
|
+++ b/src/KXLvisual.c
|
|
|
|
@@ -1,4 +1,6 @@
|
|
|
|
#include <stdio.h>
|
|
|
|
+#include <stdlib.h>
|
|
|
|
+#include <string.h>
|
|
|
|
#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
|