53 0xff00, |
53 0xff00, |
54 0xff00, |
54 0xff00, |
55 0xff00 |
55 0xff00 |
56 }; |
56 }; |
57 |
57 |
|
58 |
|
59 /* XPM */ |
|
60 static const char *arrow[] = { |
|
61 /* width height num_colors chars_per_pixel */ |
|
62 " 32 32 3 1", |
|
63 /* colors */ |
|
64 "X c #000000", |
|
65 ". c #ffffff", |
|
66 " c None", |
|
67 /* pixels */ |
|
68 "X ", |
|
69 "XX ", |
|
70 "X.X ", |
|
71 "X..X ", |
|
72 "X...X ", |
|
73 "X....X ", |
|
74 "X.....X ", |
|
75 "X......X ", |
|
76 "X.......X ", |
|
77 "X........X ", |
|
78 "X.....XXXXX ", |
|
79 "X..X..X ", |
|
80 "X.X X..X ", |
|
81 "XX X..X ", |
|
82 "X X..X ", |
|
83 " X..X ", |
|
84 " X..X ", |
|
85 " X..X ", |
|
86 " XX ", |
|
87 " ", |
|
88 " ", |
|
89 " ", |
|
90 " ", |
|
91 " ", |
|
92 " ", |
|
93 " ", |
|
94 " ", |
|
95 " ", |
|
96 " ", |
|
97 " ", |
|
98 " ", |
|
99 " ", |
|
100 "0,0" |
|
101 }; |
|
102 |
|
103 static SDL_Cursor *create_arrow_cursor() |
|
104 { |
|
105 int i, row, col; |
|
106 Uint8 data[4*32]; |
|
107 Uint8 mask[4*32]; |
|
108 int hot_x, hot_y; |
|
109 |
|
110 i = -1; |
|
111 for ( row=0; row<32; ++row ) { |
|
112 for ( col=0; col<32; ++col ) { |
|
113 if ( col % 8 ) { |
|
114 data[i] <<= 1; |
|
115 mask[i] <<= 1; |
|
116 } else { |
|
117 ++i; |
|
118 data[i] = mask[i] = 0; |
|
119 } |
|
120 switch (arrow[4+row][col]) { |
|
121 case 'X': |
|
122 data[i] |= 0x01; |
|
123 mask[i] |= 0x01; |
|
124 break; |
|
125 case '.': |
|
126 mask[i] |= 0x01; |
|
127 break; |
|
128 case ' ': |
|
129 break; |
|
130 } |
|
131 } |
|
132 } |
|
133 sscanf(arrow[4+row], "%d,%d", &hot_x, &hot_y); |
|
134 return SDL_CreateCursor(data, mask, 32, 32, hot_x, hot_y); |
|
135 } |
|
136 |
|
137 |
58 int main(int argc, char *argv[]) |
138 int main(int argc, char *argv[]) |
59 { |
139 { |
60 SDL_Surface *screen; |
140 SDL_Surface *screen; |
61 SDL_bool quit = SDL_FALSE, first_time = SDL_TRUE; |
141 SDL_bool quit = SDL_FALSE, first_time = SDL_TRUE; |
62 SDL_Cursor *cursor; |
142 SDL_Cursor *cursor[2]; |
63 SDL_Rect update_area; |
143 int current; |
64 |
144 |
65 /* Load the SDL library */ |
145 /* Load the SDL library */ |
66 if ( SDL_Init(SDL_INIT_VIDEO) < 0 ) { |
146 if ( SDL_Init(SDL_INIT_VIDEO) < 0 ) { |
67 fprintf(stderr, "Couldn't initialize SDL: %s\n",SDL_GetError()); |
147 fprintf(stderr, "Couldn't initialize SDL: %s\n",SDL_GetError()); |
68 return(1); |
148 return(1); |
72 if (screen==NULL) { |
152 if (screen==NULL) { |
73 fprintf(stderr, "Couldn't initialize video mode: %s\n",SDL_GetError()); |
153 fprintf(stderr, "Couldn't initialize video mode: %s\n",SDL_GetError()); |
74 return(1); |
154 return(1); |
75 } |
155 } |
76 |
156 |
77 update_area.x = update_area.y = 0; |
|
78 update_area.w = screen->w; |
|
79 update_area.h = screen->h; |
|
80 |
|
81 SDL_FillRect(screen, NULL, 0x664422); |
157 SDL_FillRect(screen, NULL, 0x664422); |
82 |
158 |
83 cursor = SDL_CreateCursor((Uint8 *)cursor_data, (Uint8 *)cursor_mask, |
159 cursor[0] = SDL_CreateCursor((Uint8 *)cursor_data, (Uint8 *)cursor_mask, |
84 16, 16, 8, 8); |
160 16, 16, 8, 8); |
85 if (cursor==NULL) { |
161 if (cursor[0]==NULL) { |
86 fprintf(stderr, "Couldn't initialize cursor: %s\n",SDL_GetError()); |
162 fprintf(stderr, "Couldn't initialize test cursor: %s\n",SDL_GetError()); |
87 return(1); |
163 SDL_Quit(); |
88 } |
164 return(1); |
89 |
165 } |
90 SDL_SetCursor(cursor); |
166 cursor[1] = create_arrow_cursor(); |
|
167 if (cursor[1]==NULL) { |
|
168 fprintf(stderr, "Couldn't initialize arrow cursor: %s\n",SDL_GetError()); |
|
169 SDL_FreeCursor(cursor[0]); |
|
170 SDL_Quit(); |
|
171 return(1); |
|
172 } |
|
173 |
|
174 current = 0; |
|
175 SDL_SetCursor(cursor[current]); |
91 |
176 |
92 while (!quit) { |
177 while (!quit) { |
93 SDL_Event event; |
178 SDL_Event event; |
94 while (SDL_PollEvent(&event)) { |
179 while (SDL_PollEvent(&event)) { |
95 switch(event.type) { |
180 switch(event.type) { |
|
181 case SDL_MOUSEBUTTONDOWN: |
|
182 current = !current; |
|
183 SDL_SetCursor(cursor[current]); |
|
184 break; |
96 case SDL_KEYDOWN: |
185 case SDL_KEYDOWN: |
97 if (event.key.keysym.sym == SDLK_ESCAPE) { |
186 if (event.key.keysym.sym == SDLK_ESCAPE) { |
98 quit = SDL_TRUE; |
187 quit = SDL_TRUE; |
99 } |
188 } |
100 break; |
189 break; |
101 case SDL_QUIT: |
190 case SDL_QUIT: |
102 quit = SDL_TRUE; |
191 quit = SDL_TRUE; |
103 break; |
192 break; |
104 } |
193 } |
105 } |
194 } |
106 if (screen->flags & SDL_DOUBLEBUF) { |
195 SDL_Flip(screen); |
107 SDL_Flip(screen); |
|
108 } else { |
|
109 if (first_time) { |
|
110 SDL_UpdateRects(screen, 1, &update_area); |
|
111 first_time = SDL_FALSE; |
|
112 } |
|
113 } |
|
114 SDL_Delay(1); |
196 SDL_Delay(1); |
115 } |
197 } |
116 |
198 |
117 SDL_FreeCursor(cursor); |
199 SDL_FreeCursor(cursor[0]); |
|
200 SDL_FreeCursor(cursor[1]); |
118 |
201 |
119 SDL_Quit(); |
202 SDL_Quit(); |
120 return(0); |
203 return(0); |
121 } |
204 } |