summaryrefslogtreecommitdiff
blob: 245e714abb0730da72caca7b67f91b99b0c9095a (plain)
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