1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
|
--- 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
|