nsxivd15264e
Remove invalid images when loading them; refactorings
+175 −357
8 files changed
- D icon.h +0 −180
- M image.c +14 −43
- M image.h +0 −2
- M main.c +84 −70
- M thumbs.c +25 −29
- M thumbs.h +3 −3
- M window.c +48 −30
- M window.h +1 −0
| @@ -1,180 +0,0 @@ | |||
| 1 | − | #ifndef ICON_H | |
| 2 | − | #define ICON_H | |
| 3 | − | ||
| 4 | − | #include <Imlib2.h> | |
| 5 | − | ||
| 6 | − | static DATA32 icon_invalid[] = { | |
| 7 | − | 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, | |
| 8 | − | 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, | |
| 9 | − | 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, | |
| 10 | − | 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, | |
| 11 | − | 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, | |
| 12 | − | 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, | |
| 13 | − | 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, | |
| 14 | − | 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, | |
| 15 | − | 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, | |
| 16 | − | 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, | |
| 17 | − | 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, | |
| 18 | − | 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, | |
| 19 | − | 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, | |
| 20 | − | 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, | |
| 21 | − | 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, | |
| 22 | − | 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xff444444, 0xff444444, | |
| 23 | − | 0xff444444, 0xff444444, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, | |
| 24 | − | 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, | |
| 25 | − | 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, | |
| 26 | − | 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, | |
| 27 | − | 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, | |
| 28 | − | 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xffbbbbbb, 0xffbbbbbb, | |
| 29 | − | 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, | |
| 30 | − | 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, | |
| 31 | − | 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, | |
| 32 | − | 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, | |
| 33 | − | 0xffbbbbbb, 0xffbbbbbb, 0xff444444, 0xff444444, 0xff444444, 0xff444444, | |
| 34 | − | 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xff444444, 0xff444444, 0xff444444, | |
| 35 | − | 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, | |
| 36 | − | 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, | |
| 37 | − | 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xff444444, 0xff444444, | |
| 38 | − | 0xff444444, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xff444444, 0xff444444, | |
| 39 | − | 0xff444444, 0xff444444, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xff444444, | |
| 40 | − | 0xff444444, 0xff444444, 0xff444444, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, | |
| 41 | − | 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, | |
| 42 | − | 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xff444444, | |
| 43 | − | 0xff444444, 0xff444444, 0xff444444, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, | |
| 44 | − | 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xffbbbbbb, 0xffbbbbbb, | |
| 45 | − | 0xffbbbbbb, 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, | |
| 46 | − | 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, | |
| 47 | − | 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, | |
| 48 | − | 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xffbbbbbb, | |
| 49 | − | 0xffbbbbbb, 0xffbbbbbb, 0xff444444, 0xff444444, 0xff444444, 0xff444444, | |
| 50 | − | 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xff444444, 0xff444444, | |
| 51 | − | 0xff444444, 0xff444444, 0xff444444, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, | |
| 52 | − | 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, | |
| 53 | − | 0xffbbbbbb, 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, | |
| 54 | − | 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xff444444, 0xff444444, | |
| 55 | − | 0xff444444, 0xff444444, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, | |
| 56 | − | 0xffbbbbbb, 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, | |
| 57 | − | 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, | |
| 58 | − | 0xffbbbbbb, 0xffbbbbbb, 0xff444444, 0xff444444, 0xff444444, 0xff444444, | |
| 59 | − | 0xff444444, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, | |
| 60 | − | 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xffbbbbbb, 0xffbbbbbb, | |
| 61 | − | 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xff444444, 0xff444444, | |
| 62 | − | 0xff444444, 0xff444444, 0xff444444, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, | |
| 63 | − | 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xff444444, 0xff444444, 0xff444444, | |
| 64 | − | 0xff444444, 0xff444444, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, | |
| 65 | − | 0xffbbbbbb, 0xffbbbbbb, 0xff444444, 0xff444444, 0xff444444, 0xff444444, | |
| 66 | − | 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, | |
| 67 | − | 0xffbbbbbb, 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, | |
| 68 | − | 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xff444444, 0xff444444, | |
| 69 | − | 0xff444444, 0xff444444, 0xff444444, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, | |
| 70 | − | 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xff444444, 0xff444444, | |
| 71 | − | 0xff444444, 0xff444444, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, | |
| 72 | − | 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xff444444, 0xff444444, | |
| 73 | − | 0xff444444, 0xff444444, 0xff444444, 0xffbbbbbb, 0xffbbbbbb, 0xff444444, | |
| 74 | − | 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xffbbbbbb, 0xffbbbbbb, | |
| 75 | − | 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, | |
| 76 | − | 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xffbbbbbb, 0xffbbbbbb, | |
| 77 | − | 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, | |
| 78 | − | 0xffbbbbbb, 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, | |
| 79 | − | 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xffbbbbbb, | |
| 80 | − | 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, | |
| 81 | − | 0xffbbbbbb, 0xffbbbbbb, 0xff444444, 0xff444444, 0xff444444, 0xff444444, | |
| 82 | − | 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, | |
| 83 | − | 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xff444444, 0xff444444, | |
| 84 | − | 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, | |
| 85 | − | 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, | |
| 86 | − | 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xff444444, 0xff444444, | |
| 87 | − | 0xff444444, 0xff444444, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, | |
| 88 | − | 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, | |
| 89 | − | 0xffbbbbbb, 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, | |
| 90 | − | 0xff444444, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, | |
| 91 | − | 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, | |
| 92 | − | 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xffbbbbbb, 0xffbbbbbb, | |
| 93 | − | 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, | |
| 94 | − | 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xff444444, 0xff444444, 0xff444444, | |
| 95 | − | 0xff444444, 0xff444444, 0xff444444, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, | |
| 96 | − | 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, | |
| 97 | − | 0xffbbbbbb, 0xffbbbbbb, 0xff444444, 0xff444444, 0xff444444, 0xff444444, | |
| 98 | − | 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, | |
| 99 | − | 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xff444444, 0xff444444, | |
| 100 | − | 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, | |
| 101 | − | 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, | |
| 102 | − | 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xff444444, 0xff444444, | |
| 103 | − | 0xff444444, 0xff444444, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, | |
| 104 | − | 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xff444444, | |
| 105 | − | 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, | |
| 106 | − | 0xff444444, 0xff444444, 0xff444444, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, | |
| 107 | − | 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, | |
| 108 | − | 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xffbbbbbb, 0xffbbbbbb, | |
| 109 | − | 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, | |
| 110 | − | 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xffbbbbbb, | |
| 111 | − | 0xffbbbbbb, 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, | |
| 112 | − | 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, | |
| 113 | − | 0xffbbbbbb, 0xffbbbbbb, 0xff444444, 0xff444444, 0xff444444, 0xff444444, | |
| 114 | − | 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, | |
| 115 | − | 0xffbbbbbb, 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, | |
| 116 | − | 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xff444444, 0xff444444, | |
| 117 | − | 0xff444444, 0xff444444, 0xff444444, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, | |
| 118 | − | 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xff444444, 0xff444444, | |
| 119 | − | 0xff444444, 0xff444444, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, | |
| 120 | − | 0xffbbbbbb, 0xffbbbbbb, 0xff444444, 0xff444444, 0xff444444, 0xff444444, | |
| 121 | − | 0xff444444, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, | |
| 122 | − | 0xffbbbbbb, 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, | |
| 123 | − | 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, | |
| 124 | − | 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xffbbbbbb, 0xffbbbbbb, | |
| 125 | − | 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xff444444, 0xff444444, 0xff444444, | |
| 126 | − | 0xff444444, 0xff444444, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, | |
| 127 | − | 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xff444444, 0xff444444, | |
| 128 | − | 0xff444444, 0xff444444, 0xff444444, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, | |
| 129 | − | 0xffbbbbbb, 0xffbbbbbb, 0xff444444, 0xff444444, 0xff444444, 0xff444444, | |
| 130 | − | 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xff444444, 0xff444444, | |
| 131 | − | 0xff444444, 0xff444444, 0xff444444, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, | |
| 132 | − | 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, | |
| 133 | − | 0xffbbbbbb, 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, | |
| 134 | − | 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xff444444, 0xff444444, | |
| 135 | − | 0xff444444, 0xff444444, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xff444444, | |
| 136 | − | 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xffbbbbbb, 0xffbbbbbb, | |
| 137 | − | 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, | |
| 138 | − | 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xff444444, 0xff444444, | |
| 139 | − | 0xff444444, 0xff444444, 0xff444444, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, | |
| 140 | − | 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xffbbbbbb, 0xffbbbbbb, | |
| 141 | − | 0xffbbbbbb, 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xffbbbbbb, | |
| 142 | − | 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, | |
| 143 | − | 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, | |
| 144 | − | 0xffbbbbbb, 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xffbbbbbb, | |
| 145 | − | 0xffbbbbbb, 0xffbbbbbb, 0xff444444, 0xff444444, 0xff444444, 0xff444444, | |
| 146 | − | 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xff444444, 0xff444444, 0xff444444, | |
| 147 | − | 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, | |
| 148 | − | 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, | |
| 149 | − | 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xff444444, 0xff444444, | |
| 150 | − | 0xff444444, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xff444444, 0xff444444, | |
| 151 | − | 0xff444444, 0xff444444, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, | |
| 152 | − | 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, | |
| 153 | − | 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, | |
| 154 | − | 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, | |
| 155 | − | 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, | |
| 156 | − | 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xffbbbbbb, 0xffbbbbbb, | |
| 157 | − | 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, | |
| 158 | − | 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, | |
| 159 | − | 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, | |
| 160 | − | 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, | |
| 161 | − | 0xffbbbbbb, 0xffbbbbbb, 0xff444444, 0xff444444, 0xff444444, 0xff444444, | |
| 162 | − | 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, | |
| 163 | − | 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, | |
| 164 | − | 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, | |
| 165 | − | 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, | |
| 166 | − | 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xff444444, 0xff444444, | |
| 167 | − | 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, | |
| 168 | − | 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, | |
| 169 | − | 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, | |
| 170 | − | 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, | |
| 171 | − | 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, | |
| 172 | − | 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, | |
| 173 | − | 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, | |
| 174 | − | 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, | |
| 175 | − | 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, | |
| 176 | − | 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, | |
| 177 | − | 0xff444444, 0xff444444, 0xff444444, 0xff444444 | |
| 178 | − | }; | |
| 179 | − | ||
| 180 | − | #endif /* ICON_H */ | |
| @@ -16,8 +16,9 @@ | |||
| 16 | 16 | * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |
| 17 | 17 | */ | |
| 18 | 18 | ||
| 19 | + | #include <unistd.h> | |
| 20 | + | ||
| 19 | 21 | #include "config.h" | |
| 20 | − | #include "icon.h" | |
| 21 | 22 | #include "image.h" | |
| 22 | 23 | #include "options.h" | |
| 23 | 24 | #include "util.h" | |
| @@ -26,15 +27,11 @@ int zl_cnt; | |||
| 26 | 27 | float zoom_min; | |
| 27 | 28 | float zoom_max; | |
| 28 | 29 | ||
| 29 | − | Imlib_Image *im_invalid; | |
| 30 | − | ||
| 31 | 30 | void img_init(img_t *img, win_t *win) { | |
| 32 | 31 | zl_cnt = sizeof(zoom_levels) / sizeof(zoom_levels[0]); | |
| 33 | 32 | zoom_min = zoom_levels[0] / 100.0; | |
| 34 | 33 | zoom_max = zoom_levels[zl_cnt - 1] / 100.0; | |
| 35 | 34 | ||
| 36 | − | im_invalid = imlib_create_image_using_data(32, 32, icon_invalid); | |
| 37 | − | ||
| 38 | 35 | if (img) { | |
| 39 | 36 | img->im = NULL; | |
| 40 | 37 | img->zoom = options->zoom; | |
| @@ -51,43 +48,20 @@ void img_init(img_t *img, win_t *win) { | |||
| 51 | 48 | } | |
| 52 | 49 | } | |
| 53 | 50 | ||
| 54 | − | void img_free(img_t* img) { | |
| 55 | − | imlib_context_set_image(im_invalid); | |
| 56 | − | imlib_free_image(); | |
| 57 | − | } | |
| 58 | − | ||
| 59 | − | int img_check(const char *filename) { | |
| 60 | − | Imlib_Image *im; | |
| 61 | − | ||
| 62 | − | if (!filename) | |
| 63 | − | return 0; | |
| 64 | − | ||
| 65 | − | if ((im = imlib_load_image(filename))) { | |
| 66 | − | imlib_context_set_image(im); | |
| 67 | − | imlib_image_set_changes_on_disk(); | |
| 68 | − | imlib_free_image(); | |
| 69 | − | return 1; | |
| 70 | − | } else { | |
| 71 | − | warn("invalid file: %s", filename); | |
| 72 | − | return 0; | |
| 73 | − | } | |
| 74 | − | } | |
| 75 | − | ||
| 76 | 51 | int img_load(img_t *img, const char *filename) { | |
| 77 | 52 | if (!img || !filename) | |
| 78 | 53 | return 0; | |
| 79 | 54 | ||
| 80 | − | if ((img->im = imlib_load_image(filename))) { | |
| 81 | − | imlib_context_set_image(img->im); | |
| 82 | − | imlib_image_set_changes_on_disk(); | |
| 83 | − | imlib_context_set_anti_alias(img->aa); | |
| 84 | − | img->scalemode = options->scalemode; | |
| 85 | − | } else { | |
| 86 | − | warn("invalid file: %s", filename); | |
| 87 | − | imlib_context_set_image(im_invalid); | |
| 88 | − | imlib_context_set_anti_alias(0); | |
| 55 | + | if (access(filename, R_OK) || !(img->im = imlib_load_image(filename))) { | |
| 56 | + | warn("could not open image: %s", filename); | |
| 57 | + | return 0; | |
| 89 | 58 | } | |
| 90 | 59 | ||
| 60 | + | imlib_context_set_image(img->im); | |
| 61 | + | imlib_image_set_changes_on_disk(); | |
| 62 | + | imlib_context_set_anti_alias(img->aa); | |
| 63 | + | ||
| 64 | + | img->scalemode = options->scalemode; | |
| 91 | 65 | img->re = 0; | |
| 92 | 66 | img->checkpan = 0; | |
| 93 | 67 | ||
| @@ -151,12 +125,12 @@ void img_render(img_t *img, win_t *win) { | |||
| 151 | 125 | int sx, sy, sw, sh; | |
| 152 | 126 | int dx, dy, dw, dh; | |
| 153 | 127 | ||
| 154 | − | if (!img || !win) | |
| 128 | + | if (!img || !img->im || !win) | |
| 155 | 129 | return; | |
| 156 | 130 | ||
| 157 | − | if (!img->im || img->scalemode != SCALE_ZOOM) { | |
| 131 | + | if (img->scalemode != SCALE_ZOOM) { | |
| 158 | 132 | img_fit(img, win); | |
| 159 | − | if ((!img->im || img->scalemode == SCALE_DOWN) && img->zoom > 1.0) | |
| 133 | + | if (img->scalemode == SCALE_DOWN && img->zoom > 1.0) | |
| 160 | 134 | img->zoom = 1.0; | |
| 161 | 135 | } | |
| 162 | 136 | ||
| @@ -204,10 +178,7 @@ void img_render(img_t *img, win_t *win) { | |||
| 204 | 178 | ||
| 205 | 179 | win_clear(win); | |
| 206 | 180 | ||
| 207 | − | if (img->im) | |
| 208 | − | imlib_context_set_image(img->im); | |
| 209 | − | else | |
| 210 | − | imlib_context_set_image(im_invalid); | |
| 181 | + | imlib_context_set_image(img->im); | |
| 211 | 182 | ||
| 212 | 183 | if (imlib_image_has_alpha() && !img->alpha) | |
| 213 | 184 | win_draw_rect(win, win->pm, dx, dy, dw, dh, True, 0, win->white); | |
| @@ -54,9 +54,7 @@ typedef struct { | |||
| 54 | 54 | } img_t; | |
| 55 | 55 | ||
| 56 | 56 | void img_init(img_t*, win_t*); | |
| 57 | − | void img_free(img_t*); | |
| 58 | 57 | ||
| 59 | − | int img_check(const char*); | |
| 60 | 58 | int img_load(img_t*, const char*); | |
| 61 | 59 | void img_close(img_t*, int); | |
| 62 | 60 | ||
| @@ -40,6 +40,14 @@ | |||
| 40 | 40 | #include "commands.h" | |
| 41 | 41 | #endif | |
| 42 | 42 | ||
| 43 | + | #define FNAME_CNT 1024 | |
| 44 | + | #define TITLE_LEN 256 | |
| 45 | + | ||
| 46 | + | #define TO_WIN_RESIZE 75000 | |
| 47 | + | #define TO_IMAGE_DRAG 1000 | |
| 48 | + | #define TO_CURSOR_HIDE 1500000 | |
| 49 | + | #define TO_THUMBS_LOAD 75000 | |
| 50 | + | ||
| 43 | 51 | typedef enum { | |
| 44 | 52 | MODE_NORMAL = 0, | |
| 45 | 53 | MODE_THUMBS | |
| @@ -52,42 +60,74 @@ img_t img; | |||
| 52 | 60 | tns_t tns; | |
| 53 | 61 | win_t win; | |
| 54 | 62 | ||
| 55 | − | #define FNAME_CNT 1024 | |
| 56 | 63 | const char **filenames; | |
| 57 | 64 | int filecnt, fileidx; | |
| 58 | 65 | size_t filesize; | |
| 59 | 66 | ||
| 60 | − | #define TITLE_LEN 256 | |
| 61 | 67 | char win_title[TITLE_LEN]; | |
| 62 | 68 | ||
| 69 | + | int timo_cursor; | |
| 70 | + | int timo_redraw; | |
| 71 | + | unsigned char drag; | |
| 72 | + | int mox, moy; | |
| 73 | + | ||
| 63 | 74 | void cleanup() { | |
| 64 | 75 | static int in = 0; | |
| 65 | 76 | ||
| 66 | 77 | if (!in++) { | |
| 67 | 78 | img_close(&img, 0); | |
| 68 | − | img_free(&img); | |
| 69 | − | tns_free(&tns, &win); | |
| 79 | + | tns_free(&tns); | |
| 70 | 80 | win_close(&win); | |
| 71 | 81 | } | |
| 72 | 82 | } | |
| 73 | 83 | ||
| 84 | + | void remove_file(int n, unsigned char silent) { | |
| 85 | + | if (n < 0 || n >= filecnt) | |
| 86 | + | return; | |
| 87 | + | ||
| 88 | + | if (filecnt == 1) { | |
| 89 | + | if (!silent) | |
| 90 | + | fprintf(stderr, "sxiv: no more files to display\n"); | |
| 91 | + | cleanup(); | |
| 92 | + | exit(!silent); | |
| 93 | + | } | |
| 94 | + | ||
| 95 | + | if (n + 1 < filecnt) | |
| 96 | + | memmove(filenames + n, filenames + n + 1, (filecnt - n - 1) * | |
| 97 | + | sizeof(const char*)); | |
| 98 | + | if (n + 1 < tns.cnt) { | |
| 99 | + | memmove(tns.thumbs + n, tns.thumbs + n + 1, (tns.cnt - n - 1) * | |
| 100 | + | sizeof(thumb_t)); | |
| 101 | + | memset(tns.thumbs + tns.cnt - 1, 0, sizeof(thumb_t)); | |
| 102 | + | } | |
| 103 | + | ||
| 104 | + | --filecnt; | |
| 105 | + | if (n < tns.cnt) | |
| 106 | + | --tns.cnt; | |
| 107 | + | } | |
| 108 | + | ||
| 74 | 109 | int load_image(int new) { | |
| 75 | − | int ret = 0; | |
| 76 | 110 | struct stat fstats; | |
| 77 | 111 | ||
| 78 | 112 | if (new >= 0 && new < filecnt) { | |
| 79 | 113 | win_set_cursor(&win, CURSOR_WATCH); | |
| 80 | 114 | img_close(&img, 0); | |
| 115 | + | ||
| 116 | + | while (!img_load(&img, filenames[new])) { | |
| 117 | + | remove_file(new, 0); | |
| 118 | + | if (new >= filecnt) | |
| 119 | + | new = filecnt - 1; | |
| 120 | + | } | |
| 81 | 121 | fileidx = new; | |
| 82 | − | if (!stat(filenames[fileidx], &fstats)) | |
| 122 | + | if (!stat(filenames[new], &fstats)) | |
| 83 | 123 | filesize = fstats.st_size; | |
| 84 | 124 | else | |
| 85 | 125 | filesize = 0; | |
| 86 | − | if (!(ret = img_load(&img, filenames[fileidx]))) | |
| 126 | + | ||
| 127 | + | if (!timo_cursor) | |
| 87 | 128 | win_set_cursor(&win, CURSOR_NONE); | |
| 88 | 129 | } | |
| 89 | − | ||
| 90 | − | return ret; | |
| 130 | + | return 1; | |
| 91 | 131 | } | |
| 92 | 132 | ||
| 93 | 133 | void update_title() { | |
| @@ -100,16 +140,11 @@ void update_title() { | |||
| 100 | 140 | tns.cnt ? tns.sel + 1 : 0, tns.cnt, | |
| 101 | 141 | tns.cnt ? filenames[tns.sel] : ""); | |
| 102 | 142 | } else { | |
| 103 | − | if (img.im) { | |
| 104 | − | size = filesize; | |
| 105 | − | size_readable(&size, &unit); | |
| 106 | − | n = snprintf(win_title, TITLE_LEN, "sxiv: [%d/%d] <%d%%> (%.2f%s) %s", | |
| 107 | − | fileidx + 1, filecnt, (int) (img.zoom * 100.0), size, unit, | |
| 108 | − | filenames[fileidx]); | |
| 109 | − | } else { | |
| 110 | − | n = snprintf(win_title, TITLE_LEN, "sxiv: [%d/%d] invalid: %s", | |
| 111 | − | fileidx + 1, filecnt, filenames[fileidx]); | |
| 112 | − | } | |
| 143 | + | size = filesize; | |
| 144 | + | size_readable(&size, &unit); | |
| 145 | + | n = snprintf(win_title, TITLE_LEN, "sxiv: [%d/%d] <%d%%> (%.2f%s) %s", | |
| 146 | + | fileidx + 1, filecnt, (int) (img.zoom * 100.0), size, unit, | |
| 147 | + | filenames[fileidx]); | |
| 113 | 148 | } | |
| 114 | 149 | ||
| 115 | 150 | if (n >= TITLE_LEN) { | |
| @@ -128,7 +163,7 @@ int check_append(const char *filename) { | |||
| 128 | 163 | if (access(filename, R_OK)) { | |
| 129 | 164 | warn("could not open file: %s", filename); | |
| 130 | 165 | return 0; | |
| 131 | − | } else if (options->all || img_check(filename)) { | |
| 166 | + | } else { | |
| 132 | 167 | if (fileidx == filecnt) { | |
| 133 | 168 | filecnt *= 2; | |
| 134 | 169 | filenames = (const char**) s_realloc(filenames, | |
| @@ -136,8 +171,6 @@ int check_append(const char *filename) { | |||
| 136 | 171 | } | |
| 137 | 172 | filenames[fileidx++] = filename; | |
| 138 | 173 | return 1; | |
| 139 | − | } else { | |
| 140 | − | return 0; | |
| 141 | 174 | } | |
| 142 | 175 | } | |
| 143 | 176 | ||
| @@ -155,7 +188,7 @@ int main(int argc, char **argv) { | |||
| 155 | 188 | ||
| 156 | 189 | if (options->clean_cache) { | |
| 157 | 190 | tns_init(&tns, 0); | |
| 158 | − | tns_clear_cache(&tns); | |
| 191 | + | tns_clean_cache(&tns); | |
| 159 | 192 | exit(0); | |
| 160 | 193 | } | |
| 161 | 194 | ||
| @@ -208,26 +241,27 @@ int main(int argc, char **argv) { | |||
| 208 | 241 | fileidx = 0; | |
| 209 | 242 | ||
| 210 | 243 | if (!filecnt) { | |
| 211 | − | fprintf(stderr, "sxiv: no valid image filename given, aborting\n"); | |
| 244 | + | fprintf(stderr, "sxiv: no valid image file given, aborting\n"); | |
| 212 | 245 | exit(1); | |
| 213 | 246 | } | |
| 214 | 247 | ||
| 215 | − | win_open(&win); | |
| 248 | + | win_init(&win); | |
| 216 | 249 | img_init(&img, &win); | |
| 217 | 250 | ||
| 218 | 251 | if (options->thumbnails) { | |
| 219 | 252 | mode = MODE_THUMBS; | |
| 220 | 253 | tns_init(&tns, filecnt); | |
| 221 | − | win_clear(&win); | |
| 222 | − | win_draw(&win); | |
| 254 | + | while (!tns_load(&tns, 0, filenames[0], 0)) | |
| 255 | + | remove_file(0, 0); | |
| 256 | + | tns.cnt = 1; | |
| 223 | 257 | } else { | |
| 224 | 258 | mode = MODE_NORMAL; | |
| 225 | 259 | tns.thumbs = NULL; | |
| 226 | 260 | load_image(fileidx); | |
| 227 | − | img_render(&img, &win); | |
| 228 | 261 | } | |
| 229 | 262 | ||
| 230 | − | update_title(); | |
| 263 | + | win_open(&win); | |
| 264 | + | ||
| 231 | 265 | run(); | |
| 232 | 266 | cleanup(); | |
| 233 | 267 | ||
| @@ -292,42 +326,9 @@ int run_command(const char *cline, Bool reload) { | |||
| 292 | 326 | } | |
| 293 | 327 | #endif /* EXT_COMMANDS */ | |
| 294 | 328 | ||
| 295 | − | void remove_file(int n) { | |
| 296 | − | if (n < 0 || n >= filecnt) | |
| 297 | − | return; | |
| 298 | − | ||
| 299 | − | if (filecnt == 1) { | |
| 300 | − | cleanup(); | |
| 301 | − | exit(0); | |
| 302 | − | } | |
| 303 | − | ||
| 304 | − | if (n + 1 < filecnt) | |
| 305 | − | memmove(filenames + n, filenames + n + 1, (filecnt - n - 1) * | |
| 306 | − | sizeof(const char*)); | |
| 307 | − | if (n + 1 < tns.cnt) { | |
| 308 | − | memmove(tns.thumbs + n, tns.thumbs + n + 1, (tns.cnt - n - 1) * | |
| 309 | − | sizeof(thumb_t)); | |
| 310 | − | memset(tns.thumbs + tns.cnt - 1, 0, sizeof(thumb_t)); | |
| 311 | − | } | |
| 312 | − | ||
| 313 | − | --filecnt; | |
| 314 | − | if (n < tns.cnt) | |
| 315 | − | --tns.cnt; | |
| 316 | − | } | |
| 317 | − | ||
| 318 | 329 | ||
| 319 | 330 | /* event handling */ | |
| 320 | 331 | ||
| 321 | − | #define TO_WIN_RESIZE 75000; | |
| 322 | − | #define TO_IMAGE_DRAG 1000; | |
| 323 | − | #define TO_CURSOR_HIDE 1500000; | |
| 324 | − | #define TO_THUMBS_LOAD 75000; | |
| 325 | − | int timo_cursor; | |
| 326 | − | int timo_redraw; | |
| 327 | − | ||
| 328 | − | unsigned char drag; | |
| 329 | − | int mox, moy; | |
| 330 | − | ||
| 331 | 332 | void redraw() { | |
| 332 | 333 | if (mode == MODE_NORMAL) { | |
| 333 | 334 | img_render(&img, &win); | |
| @@ -363,16 +364,24 @@ void on_keypress(XKeyEvent *kev) { | |||
| 363 | 364 | win_set_cursor(&win, CURSOR_WATCH); | |
| 364 | 365 | if (run_command(commands[x].cmdline, commands[x].reload)) { | |
| 365 | 366 | if (mode == MODE_NORMAL) { | |
| 367 | + | if (fileidx < tns.cnt) | |
| 368 | + | tns_load(&tns, fileidx, filenames[fileidx], 1); | |
| 366 | 369 | img_close(&img, 1); | |
| 367 | 370 | load_image(fileidx); | |
| 368 | − | tns_load(&tns, &win, fileidx, filenames[fileidx]); | |
| 369 | 371 | } else { | |
| 370 | − | tns_load(&tns, &win, tns.sel, filenames[tns.sel]); | |
| 372 | + | if (!tns_load(&tns, tns.sel, filenames[tns.sel], 0)) { | |
| 373 | + | remove_file(tns.sel, 0); | |
| 374 | + | tns.dirty = 1; | |
| 375 | + | if (tns.sel >= tns.cnt) | |
| 376 | + | tns.sel = tns.cnt - 1; | |
| 377 | + | } | |
| 371 | 378 | } | |
| 372 | 379 | redraw(); | |
| 373 | 380 | } | |
| 374 | 381 | if (mode == MODE_THUMBS) | |
| 375 | 382 | win_set_cursor(&win, CURSOR_ARROW); | |
| 383 | + | else if (!timo_cursor) | |
| 384 | + | win_set_cursor(&win, CURSOR_NONE); | |
| 376 | 385 | return; | |
| 377 | 386 | } | |
| 378 | 387 | } | |
| @@ -487,7 +496,7 @@ void on_keypress(XKeyEvent *kev) { | |||
| 487 | 496 | changed = 1; | |
| 488 | 497 | break; | |
| 489 | 498 | case XK_D: | |
| 490 | − | remove_file(fileidx); | |
| 499 | + | remove_file(fileidx, 1); | |
| 491 | 500 | changed = load_image(fileidx >= filecnt ? filecnt - 1 : fileidx); | |
| 492 | 501 | break; | |
| 493 | 502 | case XK_r: | |
| @@ -532,11 +541,12 @@ void on_keypress(XKeyEvent *kev) { | |||
| 532 | 541 | tns.sel = tns.cnt - 1; | |
| 533 | 542 | changed = tns.dirty = 1; | |
| 534 | 543 | } | |
| 544 | + | break; | |
| 535 | 545 | ||
| 536 | 546 | /* miscellaneous */ | |
| 537 | 547 | case XK_D: | |
| 538 | 548 | if (tns.sel < tns.cnt) { | |
| 539 | − | remove_file(tns.sel); | |
| 549 | + | remove_file(tns.sel, 1); | |
| 540 | 550 | changed = tns.dirty = 1; | |
| 541 | 551 | if (tns.sel >= tns.cnt) | |
| 542 | 552 | tns.sel = tns.cnt - 1; | |
| @@ -663,17 +673,21 @@ void run() { | |||
| 663 | 673 | struct timeval tt, t0, t1; | |
| 664 | 674 | XEvent ev; | |
| 665 | 675 | ||
| 666 | − | timo_cursor = timo_redraw = 0; | |
| 667 | 676 | drag = 0; | |
| 677 | + | timo_cursor = mode == MODE_NORMAL ? TO_CURSOR_HIDE : 0; | |
| 678 | + | ||
| 679 | + | redraw(); | |
| 668 | 680 | ||
| 669 | 681 | while (1) { | |
| 670 | 682 | if (mode == MODE_THUMBS && tns.cnt < filecnt) { | |
| 671 | 683 | win_set_cursor(&win, CURSOR_WATCH); | |
| 672 | 684 | gettimeofday(&t0, 0); | |
| 673 | 685 | ||
| 674 | − | while (!XPending(win.env.dpy) && tns.cnt < filecnt) { | |
| 675 | − | /* tns.cnt is increased inside tns_load */ | |
| 676 | − | tns_load(&tns, &win, tns.cnt, filenames[tns.cnt]); | |
| 686 | + | while (tns.cnt < filecnt && !XPending(win.env.dpy)) { | |
| 687 | + | if (tns_load(&tns, tns.cnt, filenames[tns.cnt], 0)) | |
| 688 | + | ++tns.cnt; | |
| 689 | + | else | |
| 690 | + | remove_file(tns.cnt, 0); | |
| 677 | 691 | gettimeofday(&t1, 0); | |
| 678 | 692 | if (TV_TO_DOUBLE(t1) - TV_TO_DOUBLE(t0) >= 0.25) | |
| 679 | 693 | break; | |
| @@ -27,8 +27,6 @@ | |||
| 27 | 27 | #include "thumbs.h" | |
| 28 | 28 | #include "util.h" | |
| 29 | 29 | ||
| 30 | − | extern Imlib_Image *im_invalid; | |
| 31 | − | ||
| 32 | 30 | const int thumb_dim = THUMB_SIZE + 10; | |
| 33 | 31 | char *cache_dir = NULL; | |
| 34 | 32 | ||
| @@ -131,7 +129,7 @@ void tns_cache_write(thumb_t *t, Bool force) { | |||
| 131 | 129 | } | |
| 132 | 130 | } | |
| 133 | 131 | ||
| 134 | − | void tns_clear_cache(tns_t *tns) { | |
| 132 | + | void tns_clean_cache(tns_t *tns) { | |
| 135 | 133 | int dirlen, delete; | |
| 136 | 134 | char *cfile, *filename, *tpos; | |
| 137 | 135 | r_dir_t dir; | |
| @@ -195,7 +193,7 @@ void tns_init(tns_t *tns, int cnt) { | |||
| 195 | 193 | } | |
| 196 | 194 | } | |
| 197 | 195 | ||
| 198 | − | void tns_free(tns_t *tns, win_t *win) { | |
| 196 | + | void tns_free(tns_t *tns) { | |
| 199 | 197 | int i; | |
| 200 | 198 | ||
| 201 | 199 | if (!tns) | |
| @@ -218,22 +216,21 @@ void tns_free(tns_t *tns, win_t *win) { | |||
| 218 | 216 | } | |
| 219 | 217 | } | |
| 220 | 218 | ||
| 221 | − | void tns_load(tns_t *tns, win_t *win, int n, const char *filename) { | |
| 219 | + | int tns_load(tns_t *tns, int n, const char *filename, unsigned char silent) { | |
| 222 | 220 | int w, h; | |
| 223 | 221 | int use_cache, cached = 0; | |
| 224 | 222 | float z, zw, zh; | |
| 225 | 223 | thumb_t *t; | |
| 226 | 224 | Imlib_Image *im; | |
| 227 | 225 | ||
| 228 | − | if (!tns || !tns->thumbs || !win || !filename) | |
| 229 | − | return; | |
| 226 | + | if (!tns || !tns->thumbs || !filename) | |
| 227 | + | return 0; | |
| 230 | 228 | ||
| 231 | − | if (n >= tns->cap) | |
| 232 | − | return; | |
| 233 | − | else if (n >= tns->cnt) | |
| 234 | − | tns->cnt = n + 1; | |
| 229 | + | if (n < 0 || n >= tns->cap) | |
| 230 | + | return 0; | |
| 235 | 231 | ||
| 236 | 232 | t = &tns->thumbs[n]; | |
| 233 | + | t->filename = filename; | |
| 237 | 234 | ||
| 238 | 235 | if (t->im) { | |
| 239 | 236 | imlib_context_set_image(t->im); | |
| @@ -245,36 +242,35 @@ void tns_load(tns_t *tns, win_t *win, int n, const char *filename) { | |||
| 245 | 242 | cached = 1; | |
| 246 | 243 | } | |
| 247 | 244 | ||
| 248 | − | if (cached || (im = imlib_load_image(filename))) | |
| 249 | − | imlib_context_set_image(im); | |
| 250 | − | else | |
| 251 | − | imlib_context_set_image(im_invalid); | |
| 245 | + | if (!cached && | |
| 246 | + | (access(filename, R_OK) || !(im = imlib_load_image(filename)))) | |
| 247 | + | { | |
| 248 | + | if (!silent) | |
| 249 | + | warn("could not open image: %s", filename); | |
| 250 | + | return 0; | |
| 251 | + | } | |
| 252 | + | ||
| 253 | + | imlib_context_set_image(im); | |
| 254 | + | imlib_context_set_anti_alias(1); | |
| 252 | 255 | ||
| 253 | 256 | w = imlib_image_get_width(); | |
| 254 | 257 | h = imlib_image_get_height(); | |
| 255 | − | ||
| 256 | − | if (im) { | |
| 257 | − | t->filename = filename; | |
| 258 | − | zw = (float) THUMB_SIZE / (float) w; | |
| 259 | − | zh = (float) THUMB_SIZE / (float) h; | |
| 260 | − | z = MIN(zw, zh); | |
| 261 | − | } else { | |
| 262 | − | t->filename = NULL; | |
| 263 | − | z = 1.0; | |
| 264 | − | } | |
| 265 | − | ||
| 258 | + | zw = (float) THUMB_SIZE / (float) w; | |
| 259 | + | zh = (float) THUMB_SIZE / (float) h; | |
| 260 | + | z = MIN(zw, zh); | |
| 266 | 261 | t->w = z * w; | |
| 267 | 262 | t->h = z * h; | |
| 268 | 263 | ||
| 269 | − | imlib_context_set_anti_alias(1); | |
| 270 | 264 | if (!(t->im = imlib_create_cropped_scaled_image(0, 0, w, h, t->w, t->h))) | |
| 271 | 265 | die("could not allocate memory"); | |
| 272 | − | if (im) | |
| 273 | − | imlib_free_image_and_decache(); | |
| 266 | + | ||
| 267 | + | imlib_free_image_and_decache(); | |
| 268 | + | ||
| 274 | 269 | if (use_cache && !cached) | |
| 275 | 270 | tns_cache_write(t, False); | |
| 276 | 271 | ||
| 277 | 272 | tns->dirty = 1; | |
| 273 | + | return 1; | |
| 278 | 274 | } | |
| 279 | 275 | ||
| 280 | 276 | void tns_check_view(tns_t *tns, Bool scrolled) { | |
| @@ -52,12 +52,12 @@ typedef struct { | |||
| 52 | 52 | unsigned char dirty; | |
| 53 | 53 | } tns_t; | |
| 54 | 54 | ||
| 55 | − | void tns_clear_cache(tns_t*); | |
| 55 | + | void tns_clean_cache(tns_t*); | |
| 56 | 56 | ||
| 57 | 57 | void tns_init(tns_t*, int); | |
| 58 | − | void tns_free(tns_t*, win_t*); | |
| 58 | + | void tns_free(tns_t*); | |
| 59 | 59 | ||
| 60 | − | void tns_load(tns_t*, win_t*, int, const char*); | |
| 60 | + | int tns_load(tns_t*, int, const char*, unsigned char); | |
| 61 | 61 | ||
| 62 | 62 | void tns_render(tns_t*, win_t*); | |
| 63 | 63 | void tns_highlight(tns_t*, win_t*, int, Bool); | |
| @@ -34,27 +34,9 @@ static GC gc; | |||
| 34 | 34 | ||
| 35 | 35 | Atom wm_delete_win; | |
| 36 | 36 | ||
| 37 | − | void win_set_sizehints(win_t *win) { | |
| 38 | − | XSizeHints sizehints; | |
| 39 | − | ||
| 40 | − | if (!win) | |
| 41 | − | return; | |
| 42 | − | ||
| 43 | − | sizehints.flags = PMinSize | PMaxSize; | |
| 44 | − | sizehints.min_width = win->w; | |
| 45 | − | sizehints.max_width = win->w; | |
| 46 | − | sizehints.min_height = win->h; | |
| 47 | − | sizehints.max_height = win->h; | |
| 48 | − | XSetWMNormalHints(win->env.dpy, win->xwin, &sizehints); | |
| 49 | − | } | |
| 50 | − | ||
| 51 | − | void win_open(win_t *win) { | |
| 37 | + | void win_init(win_t *win) { | |
| 52 | 38 | win_env_t *e; | |
| 53 | − | XClassHint classhint; | |
| 54 | 39 | XColor col; | |
| 55 | − | char none_data[] = {0, 0, 0, 0, 0, 0, 0, 0}; | |
| 56 | − | Pixmap none; | |
| 57 | − | int gmask; | |
| 58 | 40 | ||
| 59 | 41 | if (!win) | |
| 60 | 42 | return; | |
| @@ -75,18 +57,52 @@ void win_open(win_t *win) { | |||
| 75 | 57 | ||
| 76 | 58 | if (XAllocNamedColor(e->dpy, DefaultColormap(e->dpy, e->scr), BG_COLOR, | |
| 77 | 59 | &col, &col)) | |
| 60 | + | { | |
| 78 | 61 | win->bgcol = col.pixel; | |
| 79 | − | else | |
| 62 | + | } else { | |
| 80 | 63 | die("could not allocate color: %s", BG_COLOR); | |
| 64 | + | } | |
| 65 | + | ||
| 81 | 66 | if (XAllocNamedColor(e->dpy, DefaultColormap(e->dpy, e->scr), SEL_COLOR, | |
| 82 | 67 | &col, &col)) | |
| 68 | + | { | |
| 83 | 69 | win->selcol = col.pixel; | |
| 84 | − | else | |
| 85 | − | die("could not allocate color: %s", BG_COLOR); | |
| 70 | + | } else { | |
| 71 | + | die("could not allocate color: %s", SEL_COLOR); | |
| 72 | + | } | |
| 86 | 73 | ||
| 74 | + | win->xwin = 0; | |
| 87 | 75 | win->pm = 0; | |
| 88 | 76 | win->fullscreen = 0; | |
| 89 | − | ||
| 77 | + | } | |
| 78 | + | ||
| 79 | + | void win_set_sizehints(win_t *win) { | |
| 80 | + | XSizeHints sizehints; | |
| 81 | + | ||
| 82 | + | if (!win || !win->xwin) | |
| 83 | + | return; | |
| 84 | + | ||
| 85 | + | sizehints.flags = PMinSize | PMaxSize; | |
| 86 | + | sizehints.min_width = win->w; | |
| 87 | + | sizehints.max_width = win->w; | |
| 88 | + | sizehints.min_height = win->h; | |
| 89 | + | sizehints.max_height = win->h; | |
| 90 | + | XSetWMNormalHints(win->env.dpy, win->xwin, &sizehints); | |
| 91 | + | } | |
| 92 | + | ||
| 93 | + | void win_open(win_t *win) { | |
| 94 | + | win_env_t *e; | |
| 95 | + | XClassHint classhint; | |
| 96 | + | XColor col; | |
| 97 | + | char none_data[] = {0, 0, 0, 0, 0, 0, 0, 0}; | |
| 98 | + | Pixmap none; | |
| 99 | + | int gmask; | |
| 100 | + | ||
| 101 | + | if (!win) | |
| 102 | + | return; | |
| 103 | + | ||
| 104 | + | e = &win->env; | |
| 105 | + | ||
| 90 | 106 | /* determine window offsets, width & height */ | |
| 91 | 107 | if (!options->geometry) | |
| 92 | 108 | gmask = 0; | |
| @@ -125,7 +141,9 @@ void win_open(win_t *win) { | |||
| 125 | 141 | ||
| 126 | 142 | if (!XAllocNamedColor(e->dpy, DefaultColormap(e->dpy, e->scr), "black", | |
| 127 | 143 | &col, &col)) | |
| 144 | + | { | |
| 128 | 145 | die("could not allocate color: black"); | |
| 146 | + | } | |
| 129 | 147 | none = XCreateBitmapFromData(e->dpy, win->xwin, none_data, 8, 8); | |
| 130 | 148 | cnone = XCreatePixmapCursor(e->dpy, none, none, &col, &col, 0, 0); | |
| 131 | 149 | ||
| @@ -151,7 +169,7 @@ void win_open(win_t *win) { | |||
| 151 | 169 | } | |
| 152 | 170 | ||
| 153 | 171 | void win_close(win_t *win) { | |
| 154 | − | if (!win) | |
| 172 | + | if (!win || !win->xwin) | |
| 155 | 173 | return; | |
| 156 | 174 | ||
| 157 | 175 | XFreeCursor(win->env.dpy, carrow); | |
| @@ -183,7 +201,7 @@ int win_configure(win_t *win, XConfigureEvent *c) { | |||
| 183 | 201 | } | |
| 184 | 202 | ||
| 185 | 203 | int win_moveresize(win_t *win, int x, int y, unsigned int w, unsigned int h) { | |
| 186 | − | if (!win) | |
| 204 | + | if (!win || !win->xwin) | |
| 187 | 205 | return 0; | |
| 188 | 206 | ||
| 189 | 207 | x = MAX(0, x); | |
| @@ -211,7 +229,7 @@ void win_toggle_fullscreen(win_t *win) { | |||
| 211 | 229 | XEvent ev; | |
| 212 | 230 | XClientMessageEvent *cm; | |
| 213 | 231 | ||
| 214 | − | if (!win) | |
| 232 | + | if (!win || !win->xwin) | |
| 215 | 233 | return; | |
| 216 | 234 | ||
| 217 | 235 | win->fullscreen ^= 1; | |
| @@ -236,7 +254,7 @@ void win_clear(win_t *win) { | |||
| 236 | 254 | win_env_t *e; | |
| 237 | 255 | XGCValues gcval; | |
| 238 | 256 | ||
| 239 | − | if (!win) | |
| 257 | + | if (!win || !win->xwin) | |
| 240 | 258 | return; | |
| 241 | 259 | ||
| 242 | 260 | e = &win->env; | |
| @@ -251,7 +269,7 @@ void win_clear(win_t *win) { | |||
| 251 | 269 | } | |
| 252 | 270 | ||
| 253 | 271 | void win_draw(win_t *win) { | |
| 254 | − | if (!win) | |
| 272 | + | if (!win || !win->xwin) | |
| 255 | 273 | return; | |
| 256 | 274 | ||
| 257 | 275 | XSetWindowBackgroundPixmap(win->env.dpy, win->xwin, win->pm); | |
| @@ -276,7 +294,7 @@ void win_draw_rect(win_t *win, Pixmap pm, int x, int y, int w, int h, | |||
| 276 | 294 | } | |
| 277 | 295 | ||
| 278 | 296 | void win_set_title(win_t *win, const char *title) { | |
| 279 | − | if (!win) | |
| 297 | + | if (!win || !win->xwin) | |
| 280 | 298 | return; | |
| 281 | 299 | ||
| 282 | 300 | if (!title) | |
| @@ -296,7 +314,7 @@ void win_set_title(win_t *win, const char *title) { | |||
| 296 | 314 | } | |
| 297 | 315 | ||
| 298 | 316 | void win_set_cursor(win_t *win, win_cur_t cursor) { | |
| 299 | − | if (!win) | |
| 317 | + | if (!win || !win->xwin) | |
| 300 | 318 | return; | |
| 301 | 319 | ||
| 302 | 320 | switch (cursor) { | |
| @@ -60,6 +60,7 @@ typedef struct { | |||
| 60 | 60 | ||
| 61 | 61 | extern Atom wm_delete_win; | |
| 62 | 62 | ||
| 63 | + | void win_init(win_t*); | |
| 63 | 64 | void win_open(win_t*); | |
| 64 | 65 | void win_close(win_t*); | |
| 65 | 66 | ||