104
100
strcpy(osdmessagetext, m);
106
102
showosdmessage = 1;
107
stoposd = time(NULL) + duration;
108
osdx = (screen_w - strlen (osdmessagetext)) / 2;
103
stoposd = time(NULL) + duration;
104
osdx = (screen_w - strlen(osdmessagetext)) / 2;
112
static void osdpercent(int duration, int min, int max, int val, const char *desc, const char *unit)
108
static void osdpercent(int duration, int min, int max, int val,
109
const char *desc, const char *unit)
115
* prints a bar for setting values
111
/* prints a bar for setting values */
120
step = (float)screen_w / (float)(max - min);
115
step = (float)screen_w / (float)(max - min);
121
116
where = (val - min) * step;
122
osdmessage (duration, "%s: %i%s", desc, val, unit);
117
osdmessage(duration, "%s: %i%s", desc, val, unit);
124
119
posbar[screen_w - 1] = '|';
126
for (i = 0; i < screen_w; i++)
121
for (i = 0; i < screen_w; i++) {
137
131
if (where != (screen_w - 1))
138
posbar[screen_w - 1] = '|';
132
posbar[screen_w - 1] = '|';
140
134
posbar[screen_w] = '\0';
143
137
static int resize(void)
145
screen_w = caca_get_width();
146
screen_h = caca_get_height();
149
caca_free_bitmap(cbitmap);
151
cbitmap = caca_create_bitmap(bpp, image_width, image_height,
152
depth * image_width, rmask, gmask, bmask,
156
mp_msg(MSGT_VO, MSGL_FATAL, "vo_caca: caca_create_bitmap failed!\n");
139
screen_w = caca_get_canvas_width(canvas);
140
screen_h = caca_get_canvas_height(canvas);
142
caca_free_dither(dither);
144
dither = caca_create_dither(bpp, image_width, image_height,
146
rmask, gmask, bmask, amask);
147
if (dither == NULL) {
148
mp_msg(MSGT_VO, MSGL_FATAL, "vo_caca: caca_create_dither failed!\n");
152
/* Default libcaca features */
153
caca_set_dither_antialias(dither, dither_antialias);
154
caca_set_dither_charset(dither, dither_charset);
155
caca_set_dither_color(dither, dither_color);
156
caca_set_dither_algorithm(dither, dither_algo);
161
161
static int config(uint32_t width, uint32_t height, uint32_t d_width,
162
uint32_t d_height, uint32_t flags, char *title, uint32_t format)
162
uint32_t d_height, uint32_t flags, char *title,
164
165
image_height = height;
166
167
image_format = format;
168
169
showosdmessage = 0;
174
175
static int draw_frame(uint8_t *src[])
176
caca_draw_bitmap(0, 0, screen_w, screen_h, cbitmap, src[0]);
177
caca_dither_bitmap(canvas, 0, 0, screen_w, screen_h, dither, src[0]);
185
186
static void flip_page(void)
190
if (time(NULL) >= stoposd)
196
caca_putstr(osdx, osdy, osdmessagetext);
199
caca_putstr(0, posbary, posbar);
206
static void check_events (void)
210
if ((cev = caca_get_event(CACA_EVENT_ANY)))
212
if (cev & CACA_EVENT_RESIZE)
216
} else if (cev & CACA_EVENT_KEY_RELEASE)
218
int key = (cev & 0x00ffffff);
219
enum caca_feature cf;
224
/* Toggle dithering method */
225
cf = 1 + caca_get_feature(CACA_DITHERING);
226
if (cf > CACA_DITHERING_MAX)
227
cf = CACA_DITHERING_MIN;
228
caca_set_feature(cf);
229
osdmessage(MESSAGE_DURATION, "Using %s", caca_get_feature_name(cf));
234
/* Toggle antialiasing method */
235
cf = 1 + caca_get_feature(CACA_ANTIALIASING);
236
if (cf > CACA_ANTIALIASING_MAX)
237
cf = CACA_ANTIALIASING_MIN;
238
caca_set_feature(cf);
239
osdmessage(MESSAGE_DURATION, "Using %s", caca_get_feature_name(cf));
244
/* Toggle background method */
245
cf = 1 + caca_get_feature(CACA_BACKGROUND);
246
if (cf > CACA_BACKGROUND_MAX)
247
cf = CACA_BACKGROUND_MIN;
248
caca_set_feature(cf);
249
osdmessage(MESSAGE_DURATION, "Using %s", caca_get_feature_name(cf));
253
mplayer_put_key(KEY_UP);
256
mplayer_put_key(KEY_DOWN);
259
mplayer_put_key(KEY_LEFT);
262
mplayer_put_key(KEY_RIGHT);
264
case CACA_KEY_ESCAPE:
265
mplayer_put_key(KEY_ESC);
267
case CACA_KEY_PAGEUP:
268
mplayer_put_key(KEY_PAGE_UP);
270
case CACA_KEY_PAGEDOWN:
271
mplayer_put_key(KEY_PAGE_DOWN);
273
case CACA_KEY_RETURN:
274
mplayer_put_key(KEY_ENTER);
277
mplayer_put_key(KEY_HOME);
280
mplayer_put_key(KEY_END);
284
mplayer_put_key (key);
188
if (showosdmessage) {
189
if (time(NULL) >= stoposd) {
194
caca_put_str(canvas, osdx, osdy, osdmessagetext);
196
caca_put_str(canvas, 0, posbary, posbar);
200
caca_refresh_display(display);
203
static void set_next_str(const char * const *list, const char **str,
207
for (ind = 0; list[ind]; ind += 2) {
208
if (strcmp(list[ind], *str) == 0) {
209
if (list[ind + 2] == NULL)
211
*str = list[ind + 2];
212
*msg = list[ind + 3];
221
static const struct mp_keymap keysym_map[] = {
222
{CACA_KEY_RETURN, KEY_ENTER}, {CACA_KEY_ESCAPE, KEY_ESC},
223
{CACA_KEY_UP, KEY_DOWN}, {CACA_KEY_DOWN, KEY_DOWN},
224
{CACA_KEY_LEFT, KEY_LEFT}, {CACA_KEY_RIGHT, KEY_RIGHT},
225
{CACA_KEY_PAGEUP, KEY_PAGE_UP}, {CACA_KEY_PAGEDOWN, KEY_PAGE_DOWN},
226
{CACA_KEY_HOME, KEY_HOME}, {CACA_KEY_END, KEY_END},
227
{CACA_KEY_INSERT, KEY_INSERT}, {CACA_KEY_DELETE, KEY_DELETE},
228
{CACA_KEY_BACKSPACE, KEY_BACKSPACE}, {CACA_KEY_TAB, KEY_TAB},
229
{CACA_KEY_PAUSE, KEY_PAUSE},
230
{CACA_KEY_F1, KEY_F+1}, {CACA_KEY_F2, KEY_F+2},
231
{CACA_KEY_F3, KEY_F+3}, {CACA_KEY_F4, KEY_F+4},
232
{CACA_KEY_F5, KEY_F+5}, {CACA_KEY_F6, KEY_F+6},
233
{CACA_KEY_F7, KEY_F+7}, {CACA_KEY_F8, KEY_F+8},
234
{CACA_KEY_F9, KEY_F+9}, {CACA_KEY_F10, KEY_F+10},
235
{CACA_KEY_F11, KEY_F+11}, {CACA_KEY_F12, KEY_F+12},
236
{CACA_KEY_F13, KEY_F+13}, {CACA_KEY_F14, KEY_F+14},
237
{CACA_KEY_F15, KEY_F+15},
241
static void check_events(void)
244
while (caca_get_event(display, CACA_EVENT_ANY, &cev, 0)) {
247
case CACA_EVENT_RESIZE:
248
caca_refresh_display(display);
251
case CACA_EVENT_QUIT:
252
mplayer_put_key(KEY_CLOSE_WIN);
254
case CACA_EVENT_MOUSE_MOTION:
255
vo_mouse_movement(cev.data.mouse.x, cev.data.mouse.y);
257
case CACA_EVENT_MOUSE_PRESS:
258
if (!vo_nomouse_input)
259
mplayer_put_key((MOUSE_BTN0 + cev.data.mouse.button - 1) | MP_KEY_DOWN);
261
case CACA_EVENT_MOUSE_RELEASE:
262
if (!vo_nomouse_input)
263
mplayer_put_key(MOUSE_BTN0 + cev.data.mouse.button - 1);
265
case CACA_EVENT_KEY_PRESS:
267
int key = cev.data.key.ch;
268
int mpkey = lookup_keymap_table(keysym_map, key);
269
const char *msg_name;
272
mplayer_put_key(mpkey);
277
/* Toggle dithering algorithm */
278
set_next_str(caca_get_dither_algorithm_list(dither), &dither_algo, &msg_name);
279
caca_set_dither_algorithm(dither, dither_algo);
280
osdmessage(MESSAGE_DURATION, "Using %s", msg_name);
285
/* Toggle antialiasing method */
286
set_next_str(caca_get_dither_antialias_list(dither), &dither_antialias, &msg_name);
287
caca_set_dither_antialias(dither, dither_antialias);
288
osdmessage(MESSAGE_DURATION, "Using %s", msg_name);
293
/* Toggle charset method */
294
set_next_str(caca_get_dither_charset_list(dither), &dither_charset, &msg_name);
295
caca_set_dither_charset(dither, dither_charset);
296
osdmessage(MESSAGE_DURATION, "Using %s", msg_name);
301
/* Toggle color method */
302
set_next_str(caca_get_dither_color_list(dither), &dither_color, &msg_name);
303
caca_set_dither_color(dither, dither_color);
304
osdmessage(MESSAGE_DURATION, "Using %s", msg_name);
309
mplayer_put_key(key);
291
317
static void uninit(void)
293
caca_free_bitmap(cbitmap);
319
caca_free_dither(dither);
321
caca_free_display(display);
322
caca_free_canvas(canvas);
299
326
static void draw_osd(void)
301
328
if (vo_osd_progbar_type != -1)
302
osdpercent(MESSAGE_DURATION, 0, 255,
303
vo_osd_progbar_value, sub_osd_names[vo_osd_progbar_type],
329
osdpercent(MESSAGE_DURATION, 0, 255, vo_osd_progbar_value,
330
sub_osd_names[vo_osd_progbar_type], "");
307
333
static int preinit(const char *arg)
311
mp_msg(MSGT_VO, MSGL_ERR, "vo_caca: Unknown subdevice: %s\n", arg);
317
mp_msg(MSGT_VO, MSGL_ERR, "vo_caca: failed to initialize\n");
321
caca_set_window_title("MPlayer");
323
/* Default libcaca features */
324
caca_set_feature(CACA_ANTIALIASING_PREFILTER);
325
caca_set_feature(CACA_DITHERING_RANDOM);
336
mp_msg(MSGT_VO, MSGL_ERR, "vo_caca: Unknown subdevice: %s\n", arg);
340
canvas = caca_create_canvas(0, 0);
341
if (canvas == NULL) {
342
mp_msg(MSGT_VO, MSGL_ERR, "vo_caca: failed to create canvas\n");
346
display = caca_create_display(canvas);
348
if (display == NULL) {
349
mp_msg(MSGT_VO, MSGL_ERR, "vo_caca: failed to create display\n");
350
caca_free_canvas(canvas);
354
caca_set_display_title(display, "MPlayer");