From c936f265b0681d8b301b5dc8514b3c1a593f44fd Mon Sep 17 00:00:00 2001 From: Matthew Allum Date: Fri, 27 May 2005 14:02:39 +0000 Subject: [PATCH] more select hacking --- ChangeLog | 23 +++ clutter/cltr-animator.c | 76 +++++++++- clutter/cltr-animator.h | 4 +- clutter/cltr-button.c | 34 +++-- clutter/cltr-label.c | 41 ++++- clutter/cltr-label.h | 2 + clutter/cltr-list.c | 8 +- clutter/cltr-widget.c | 2 +- examples/select.c | 328 ++++++++++++++++++++++++++++++---------- 9 files changed, 408 insertions(+), 110 deletions(-) diff --git a/ChangeLog b/ChangeLog index 17f1fb63a..aab1f431b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,26 @@ +2005-05-27 mallum,,, + + * clutter/cltr-animator.c: (cltr_animator_zoom_new), + (cltr_animator_move_new), (cltr_animator_fullzoom_new), + (cltr_animator_new), (cltr_animator_set_args), + (cltr_animator_wrapped_zoom_paint), (cltr_animator_reset), + (cltr_animator_timeout_cb), (cltr_animator_run): + * clutter/cltr-animator.h: + * clutter/cltr-button.c: (cltr_button_set_label), + (cltr_button_paint): + * clutter/cltr-label.c: (cltr_label_new), (cltr_label_set_text), + (cltr_label_get_text), (cltr_label_show), + (cltr_label_handle_xevent), (cltr_label_paint): + * clutter/cltr-label.h: + * clutter/cltr-list.c: (cltr_list_paint): + * clutter/cltr-widget.c: + * examples/select.c: (usage), (video_ctrl_hide), + (video_ctrl_stop_cb), (video_ctrl_play_cb), + (video_ctrl_seek_begin_cb), (init_video_ctrl), (show_video_ctrl), + (populate), (cell_to_item), (zoom_video_out), (init_show_controls), + (handle_xevent), (zoom_out_complete), (zoom_in_complete): + More select hacking ... + 2005-05-23 mallum,,, * clutter/cltr-button.c: (cltr_button_new_with_label), diff --git a/clutter/cltr-animator.c b/clutter/cltr-animator.c index ce5aa0a3f..a47277015 100644 --- a/clutter/cltr-animator.c +++ b/clutter/cltr-animator.c @@ -4,7 +4,10 @@ struct CltrAnimator { - CltrWidget *widget; + CltrWidget *widget; + + CltrAnimatorType type; + gint fps; int n_steps, step; @@ -15,8 +18,11 @@ struct CltrAnimator int zoom_end_x1, zoom_end_y1, zoom_end_x2, zoom_end_y2; int zoom_start_x1, zoom_start_y1, zoom_start_x2, zoom_start_y2; + + int move_start_x1, move_start_y1, move_end_x1, move_end_y1; }; + static void cltr_animator_wrapped_paint(CltrWidget *widget); @@ -33,6 +39,8 @@ cltr_animator_zoom_new(CltrWidget *widget, { CltrAnimator *anim = g_malloc0(sizeof(CltrAnimator)); + anim->type = CltrAnimatorZoom; + anim->zoom_end_x1 = dst_x1; anim->zoom_end_x2 = dst_x2; anim->zoom_end_y1 = dst_y1; @@ -55,6 +63,34 @@ cltr_animator_zoom_new(CltrWidget *widget, return anim; } +CltrAnimator* +cltr_animator_move_new(CltrWidget *widget, + int src_x1, + int src_y1, + int dst_x1, + int dst_y1) +{ + CltrAnimator *anim = g_malloc0(sizeof(CltrAnimator)); + + anim->type = CltrAnimatorMove; + + anim->move_start_x1 = src_x1; + anim->move_start_y1 = src_y1; + anim->move_end_x1 = dst_x1; + anim->move_end_y1 = dst_y1; + + anim->wrapped_paint_func = widget->paint; + + anim->widget = widget; + widget->anim = anim; + + anim->n_steps = 10; + anim->step = 0; + anim->fps = 50; + + return anim; +} + CltrAnimator* cltr_animator_fullzoom_new(CltrWidget *widget, @@ -65,6 +101,8 @@ cltr_animator_fullzoom_new(CltrWidget *widget, { CltrAnimator *anim = g_malloc0(sizeof(CltrAnimator)); + anim->type = CltrAnimatorFullZoom; + anim->zoom_end_x1 = x1; anim->zoom_end_x2 = x2; anim->zoom_end_y1 = y1; @@ -101,7 +139,27 @@ cltr_animator_set_args(CltrAnimator *anim) } static void -cltr_animator_wrapped_paint(CltrWidget *widget) +cltr_animator_wrapped_move_paint(CltrWidget *widget) +{ + CltrAnimator *anim = widget->anim; + int orig_x, orig_y; + + float f = (float)anim->step/anim->n_steps; + + orig_x = widget->x; + orig_y = widget->y; + + widget->x = anim->move_start_x1 + ( (anim->move_end_x1 - anim->move_start_x1) * f ); + widget->x = anim->move_start_y1 + ( (anim->move_end_y1 - anim->move_start_y1) * f ); + + anim->wrapped_paint_func(widget); + + widget->x = orig_x; + widget->y = orig_y; +} + +static void +cltr_animator_wrapped_zoom_paint(CltrWidget *widget) { CltrAnimator *anim = widget->anim; float tx = 0.0, ty = 0.0; @@ -222,7 +280,19 @@ cltr_animator_run(CltrAnimator *anim, anim->anim_finish_cb = finish_callback; anim->anim_finish_data = finish_data; - anim->widget->paint = cltr_animator_wrapped_paint; + + switch (anim->type) + { + case CltrAnimatorZoom: + anim->widget->paint = cltr_animator_wrapped_zoom_paint; + break; + case CltrAnimatorFullZoom: + /* anim->widget->paint = cltr_animator_wrapped_fullzoom_paint; */ + break; + case CltrAnimatorMove: + anim->widget->paint = cltr_animator_wrapped_move_paint; + break; + } anim->step = 0; diff --git a/clutter/cltr-animator.h b/clutter/cltr-animator.h index c6bbb9db0..d0014cdc1 100644 --- a/clutter/cltr-animator.h +++ b/clutter/cltr-animator.h @@ -7,7 +7,9 @@ typedef struct CltrAnimator CltrAnimator; typedef enum CltrAnimatorType { - CltrAnimatorFullZoom + CltrAnimatorZoom, + CltrAnimatorFullZoom, + CltrAnimatorMove } CltrAnimatorType; diff --git a/clutter/cltr-button.c b/clutter/cltr-button.c index d022ae8d2..c353b2a77 100644 --- a/clutter/cltr-button.c +++ b/clutter/cltr-button.c @@ -98,22 +98,20 @@ cltr_button_set_label(CltrButton *button, if (button->label) { - cltr_widget_remove_child(CLTR_WIDGET(button), - CLTR_WIDGET(button->label)); - - cltr_widget_unref(CLTR_WIDGET(button)); - /* XXX free up pre-existing label */ + cltr_label_set_text(button->label, text); } + else + { + button->label = CLTR_LABEL(cltr_label_new(text, font, col)); - button->label = CLTR_LABEL(cltr_label_new(text, font, col)); + x = (cltr_widget_width(CLTR_WIDGET(button)) - cltr_widget_width(CLTR_WIDGET(button->label)))/2; - x = (cltr_widget_width(CLTR_WIDGET(button)) - cltr_widget_width(CLTR_WIDGET(button->label)))/2; + y = (cltr_widget_height(CLTR_WIDGET(button)) - cltr_widget_height(CLTR_WIDGET(button->label)))/2; - y = (cltr_widget_height(CLTR_WIDGET(button)) - cltr_widget_height(CLTR_WIDGET(button->label)))/2; - - cltr_widget_add_child(CLTR_WIDGET(button), - CLTR_WIDGET(button->label), - x, y); + cltr_widget_add_child(CLTR_WIDGET(button), + CLTR_WIDGET(button->label), + x, y); + } } CltrWidget* @@ -259,6 +257,10 @@ cltr_button_handle_xevent (CltrWidget *widget, XEvent *xev) static void cltr_button_paint(CltrWidget *widget) { + PixbufPixel bgcol = { 0xe7, 0xe7, 0xe7, 0xff }; + PixbufPixel boxcol = { 0xd7, 0xd7, 0xd7, 0xff }; + PixbufPixel hlfontcol = { 0xe6, 0x99, 0x99, 0xff }; + CltrButton *button = CLTR_BUTTON(widget); CLTR_MARK(); @@ -270,20 +272,20 @@ cltr_button_paint(CltrWidget *widget) switch (button->state) { case CltrButtonStateFocused: - glColor4f(1.0, 1.0, 0.0, 1.0); + cltr_glu_set_color(&hlfontcol); break; case CltrButtonStateActive: - glColor4f(1.0, 0.0, 0.0, 1.0); + glColor4f(1.0, 1.0, 1.0, 1.0); break; default: - glColor4f(1.0, 1.0, 1.0, 1.0); + cltr_glu_set_color(&bgcol); } cltr_glu_rounded_rect(cltr_widget_abs_x(widget), cltr_widget_abs_y(widget), cltr_widget_abs_x2(widget), cltr_widget_abs_y2(widget), - 2, 5, + 1, 2, NULL); glDisable(GL_BLEND); diff --git a/clutter/cltr-label.c b/clutter/cltr-label.c index 764f2c6e6..df1e3baa1 100644 --- a/clutter/cltr-label.c +++ b/clutter/cltr-label.c @@ -7,7 +7,7 @@ struct CltrLabel char *text; Pixbuf *pixb; - PixbufPixel *col; + PixbufPixel col; CltrFont *font; CltrTexture *texture; }; @@ -54,7 +54,8 @@ cltr_label_new(const char *text, } label->font = font; /* XXX Ref The font XXX*/ - label->col = col; /* XXX Ref The Col XXX*/ + + memcpy(&label->col, col, sizeof(PixbufPixel)); label->widget.width = width; label->widget.height = height; @@ -68,8 +69,10 @@ cltr_label_new(const char *text, } void -cltr_label_set_text(CltrLabel *label) +cltr_label_set_text(CltrLabel *label, char *text) { + int width,height; + if (label->texture) cltr_texture_unref(label->texture); @@ -79,7 +82,34 @@ cltr_label_set_text(CltrLabel *label) if (label->text) free(label->text); - /* XXX TODO */ + font_get_pixel_size (label->font, text, &width, &height); + + if (width && height) + { + PixbufPixel bg = { 0x00, 0x00, 0x00, 0x00 }; + PixbufPixel col = { 0xff, 0xff, 0xff, 0xff }; + + label->widget.width = width; + label->widget.height = height; + + CLTR_DBG("** setting label to %s ***", text); + + label->text = strdup(text); + label->pixb = pixbuf_new(width, height); + + pixbuf_fill_rect(label->pixb, 0, 0, -1, -1, &bg); + + font_draw(label->font, + label->pixb, + label->text, + 0, + 0, + &label->col); + + label->texture = cltr_texture_new(label->pixb); + + } + } const char* @@ -109,6 +139,7 @@ cltr_label_paint(CltrWidget *widget) if (label->text) { + glPushMatrix(); glEnable(GL_TEXTURE_2D); @@ -117,7 +148,7 @@ cltr_label_paint(CltrWidget *widget) glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - glColor4f(1.0, 1.0, 1.0, 1.0); + /* glColor4f(1.0, 1.0, 1.0, 1.0); */ cltr_texture_render_to_gl_quad(label->texture, cltr_widget_abs_x(widget), diff --git a/clutter/cltr-label.h b/clutter/cltr-label.h index 1be877c31..d66ba4946 100644 --- a/clutter/cltr-label.h +++ b/clutter/cltr-label.h @@ -12,5 +12,7 @@ cltr_label_new(const char *text, CltrFont *font, PixbufPixel *col); +void +cltr_label_set_text(CltrLabel *label, char *text); #endif diff --git a/clutter/cltr-list.c b/clutter/cltr-list.c index 226799092..6bbd5334c 100644 --- a/clutter/cltr-list.c +++ b/clutter/cltr-list.c @@ -386,7 +386,7 @@ cltr_list_paint(CltrWidget *widget) PixbufPixel col = { 0xff, 0, 0, 0xff }; PixbufPixel bgcol = { 0xe7, 0xe7, 0xe7, 0xff }; PixbufPixel boxcol = { 0xd7, 0xd7, 0xd7, 0xff }; - PixbufPixel hlfontcol = { 0xff, 0x33, 0x66, 0xff }; + PixbufPixel hlfontcol = { 0xe6, 0x99, 0x99, 0xff }; CLTR_MARK(); @@ -471,12 +471,12 @@ cltr_list_paint(CltrWidget *widget) cltr_glu_set_color(&hlfontcol); else glColor4f(0.4, 0.4, 0.4, 1.0); - + cltr_texture_render_to_gl_quad(cell->text_texture, vx2 + PAD, vy1, - cltr_rect_x2(cell->rect) - PAD, - vy1 + (list->cell_height/2) - PAD); + cltr_rect_x2(cell->rect) - (2*PAD), + vy1 + (list->cell_height/2) - (2*PAD)); } diff --git a/clutter/cltr-widget.c b/clutter/cltr-widget.c index 3d1233796..908bbb56b 100644 --- a/clutter/cltr-widget.c +++ b/clutter/cltr-widget.c @@ -189,7 +189,7 @@ cltr_widget_add_child(CltrWidget *widget, CltrWidget *child, int x, int y) void cltr_widget_remove_child(CltrWidget *widget, CltrWidget *child) { - g_list_remove(widget->children, child); + widget->children = g_list_remove(widget->children, child); child->parent = NULL; child->x = 0; diff --git a/examples/select.c b/examples/select.c index 0bb80b076..1697bdc4b 100644 --- a/examples/select.c +++ b/examples/select.c @@ -9,10 +9,16 @@ typedef struct DemoApp CltrWidget *list; CltrWidget *video; CltrWidget *win; - VideoCtrls *video_ctrls; + GList *items; + /* video stuff */ + gboolean paused; + VideoCtrls *video_ctrls; + + gboolean ignore_next_xevent_hack; + } DemoApp; struct ItemEntry @@ -29,6 +35,9 @@ enum { VIDEO_STOP_BTN, VIDEO_REWND_BTN, VIDEO_FFWD_BTN, + VIDEO_VOLUP_BTN, + VIDEO_VOLDOWN_BTN, + VIDEO_BEGIN_BTN, N_VIDEO_BTNS }; @@ -44,6 +53,12 @@ struct VideoCtrls static void zoom_out_complete (CltrAnimator *anim, void *userdata); +static void +zoom_video_out(DemoApp *app); + +void +handle_xevent(CltrWidget *win, XEvent *xev, void *cookie); + int usage(char *progname) { @@ -53,6 +68,71 @@ usage(char *progname) /* video control buttons */ +void +video_ctrl_hide(DemoApp *app) +{ + cltr_widget_hide(app->video_ctrls->container); + + cltr_window_focus_widget(CLTR_WINDOW(app->win), app->video); + + app->ignore_next_xevent_hack = TRUE; /* urg */ + cltr_window_on_xevent(CLTR_WINDOW(app->win), handle_xevent, app); +} + +void +video_ctrl_stop_cb(CltrButton *button, void *cookie) +{ + DemoApp *app = (DemoApp*)cookie; + + cltr_widget_hide(app->video_ctrls->container); + + cltr_window_focus_widget(CLTR_WINDOW(app->win), app->list); + + zoom_video_out(app); +} + +void +video_ctrl_play_cb(CltrButton *button, void *cookie) +{ + DemoApp *app = (DemoApp*)cookie; + VideoCtrls *v = app->video_ctrls; + + PixbufPixel col = { 0xff, 0xff, 0xff, 0xff }; + + if (app->paused) + { + cltr_video_play (CLTR_VIDEO(app->video), NULL); + + cltr_button_set_label(CLTR_BUTTON(v->buttons[VIDEO_PLAY_BTN]), + "PAUSE", v->font, &col); + + app->paused = FALSE; + + video_ctrl_hide(app); + } + else + { + cltr_button_set_label(CLTR_BUTTON(v->buttons[VIDEO_PLAY_BTN]), + "PLAY", v->font, &col); + + cltr_video_pause (CLTR_VIDEO(app->video)); + + app->paused = TRUE; + + cltr_widget_queue_paint(v->buttons[VIDEO_PLAY_BTN]); + } +} + +void +video_ctrl_seek_begin_cb(CltrButton *button, void *cookie) +{ + DemoApp *app = (DemoApp*)cookie; + + video_ctrl_hide(app); + + cltr_video_seek (CLTR_VIDEO(app->video), 0.0, NULL); +} + void init_video_ctrl(DemoApp *app) { @@ -68,55 +148,68 @@ init_video_ctrl(DemoApp *app) height += 6; - v->container = cltr_overlay_new(width, height * N_VIDEO_BTNS); + v->container = cltr_overlay_new(width, height * 3 /*N_VIDEO_BTNS*/); - v->buttons[VIDEO_PLAY_BTN] = cltr_button_new(width, height); + v->buttons[VIDEO_PLAY_BTN] = cltr_button_new(width, height-1); - cltr_button_set_label(v->buttons[VIDEO_PLAY_BTN], - "PlAY", v->font, &col); + cltr_button_set_label(CLTR_BUTTON(v->buttons[VIDEO_PLAY_BTN]), + "PAUSE", v->font, &col); + + cltr_button_on_activate(CLTR_BUTTON(v->buttons[VIDEO_PLAY_BTN]), + video_ctrl_play_cb, (void *)app); cltr_widget_add_child(v->container, v->buttons[VIDEO_PLAY_BTN], x, y); y += height; - v->buttons[VIDEO_STOP_BTN] = cltr_button_new(width, height); + v->buttons[VIDEO_STOP_BTN] = cltr_button_new(width, height-1); - cltr_button_set_label(v->buttons[VIDEO_STOP_BTN], + cltr_button_set_label(CLTR_BUTTON(v->buttons[VIDEO_STOP_BTN]), "STOP", v->font, &col); + cltr_button_on_activate(CLTR_BUTTON(v->buttons[VIDEO_STOP_BTN]), + video_ctrl_stop_cb, (void *)app); + cltr_widget_add_child(v->container, v->buttons[VIDEO_STOP_BTN], x, y); y += height; - v->buttons[VIDEO_REWND_BTN] = cltr_button_new(width, height); + v->buttons[VIDEO_REWND_BTN] = cltr_button_new(width, height-1); - cltr_button_set_label(v->buttons[VIDEO_REWND_BTN], - "RWND", + cltr_button_set_label(CLTR_BUTTON(v->buttons[VIDEO_REWND_BTN]), + "BEGIN", v->font, &col); + cltr_button_on_activate(CLTR_BUTTON(v->buttons[VIDEO_REWND_BTN]), + video_ctrl_seek_begin_cb, (void *)app); + cltr_widget_add_child(v->container, v->buttons[VIDEO_REWND_BTN], x, y); + y += height; - v->buttons[VIDEO_FFWD_BTN] = cltr_button_new(width, height); + /* + v->buttons[VIDEO_FFWD_BTN] = cltr_button_new(width, height-1); - cltr_button_set_label(v->buttons[VIDEO_FFWD_BTN], + cltr_button_set_label(CLTR_BUTTON(v->buttons[VIDEO_FFWD_BTN]), "FFWD", v->font, &col); cltr_widget_add_child(v->container, v->buttons[VIDEO_FFWD_BTN], x, y); + y += height; - + + */ cltr_widget_add_child(app->video, v->container, 100, 100); - /* focus */ + /* focus - URG !*/ cltr_widget_set_focus_next(v->buttons[VIDEO_PLAY_BTN], v->buttons[VIDEO_STOP_BTN], @@ -126,6 +219,18 @@ init_video_ctrl(DemoApp *app) v->buttons[VIDEO_PLAY_BTN], CLTR_NORTH); + cltr_widget_set_focus_next(v->buttons[VIDEO_STOP_BTN], + v->buttons[VIDEO_REWND_BTN], + CLTR_SOUTH); + + cltr_widget_set_focus_next(v->buttons[VIDEO_REWND_BTN], + v->buttons[VIDEO_STOP_BTN], + CLTR_NORTH); + + cltr_widget_set_focus_next(v->buttons[VIDEO_REWND_BTN], + v->buttons[VIDEO_PLAY_BTN], + CLTR_SOUTH); + } void @@ -168,6 +273,8 @@ populate(DemoApp *app, char *path) gint i = 0; ItemEntry *new_item; char *img_path; + char *seek_path, *seek_data = NULL; + gint64 seek_time = 0; /* Eeek! */ if (!(g_str_has_suffix (entry, ".mpg") || @@ -193,6 +300,13 @@ populate(DemoApp *app, char *path) if (i > 0) new_item->nice_name[i] = '\0'; + seek_path = g_strconcat(path, "/", new_item->nice_name, ".seek", NULL); + + if (g_file_get_contents (seek_path, &seek_data, NULL, NULL)) + { + seek_time = atol(seek_data); + } + img_path = g_strconcat(path, "/", new_item->nice_name, ".png", NULL); pixb = pixbuf_new_from_file(img_path); @@ -207,6 +321,8 @@ populate(DemoApp *app, char *path) new_item->uri = g_strconcat("file://", path, "/", entry, NULL); new_item->path = g_strdup(path); + new_item->stoptime = seek_time; + app->items = g_list_append(app->items, new_item); g_free(img_path); @@ -242,6 +358,108 @@ cell_to_item(DemoApp *app, CltrListCell *cell) } +void +zoom_video_out(DemoApp *app) +{ + ItemEntry *item; + char filename[1024]; + Pixbuf *spixb, *dpixb; + int dstx, dsty, dstw, dsth; + PixbufPixel col = { 0, 0, 0, 0xff }; + int x1, y1, x2, y2; + FILE *fp; + + cltr_video_pause (CLTR_VIDEO(app->video)); + + item = cell_to_item(app, cltr_list_get_active_cell(CLTR_LIST(app->list))); + + item->stoptime = cltr_video_get_time (CLTR_VIDEO(app->video)); + + snprintf(filename, 1024, "%s/%s.png", item->path, item->nice_name); + + spixb = cltr_video_get_pixbuf (CLTR_VIDEO(app->video)); + + /* fixup pixbuf so scaled like video + * + */ + + /* XXX wrongly assume width > height */ + + dstw = spixb->width; + + dsth = (spixb->width * cltr_widget_height(app->win)) + / cltr_widget_width(app->win) ; + + printf("dsth %i, spixb h %i\n", dsth, spixb->height); + + dsty = (dsth - spixb->height)/2; dstx = 0; + + dpixb = pixbuf_new(dstw, dsth); + pixbuf_fill_rect(dpixb, 0, 0, -1, -1, &col); + pixbuf_copy(spixb, dpixb, 0, 0, + spixb->width, spixb->height, dstx, dsty); + + cltr_list_cell_set_pixbuf(cltr_list_get_active_cell(app->list), + dpixb); + + pixbuf_write_png(dpixb, filename); + + /* reset the viewing pixbuf */ + + pixbuf_unref(dpixb); + + /* write out the seektime too */ + + snprintf(filename, 1024, "%s/%s.seek", item->path, item->nice_name); + + fp = fopen(filename, "w"); + + if (fp) + { + fprintf(fp, "%li", item->stoptime); + fclose(fp); + } + + cltr_list_get_active_cell_video_box_co_ords(CLTR_LIST(app->list), + &x1, &y1, &x2, &y2); + + cltr_video_stop (CLTR_VIDEO(app->video)); + + /* zoom out, XXX old anim needs freeing */ + + app->anim = cltr_animator_zoom_new(app->list, + x1, y1, x2, y2, + 0,0,800,600); + + printf("got return, seek time %li, %i, %i \n", + cltr_video_get_time (CLTR_VIDEO(app->video)), + x1, y1); + + cltr_widget_show(app->list); + + cltr_animator_run(app->anim, zoom_out_complete, app); + + return; +} + +void +init_show_controls(DemoApp *app) +{ + /* + app->anim = cltr_animator_move_new(app->video_ctrls->container, + -100, 200, + 100, 200); + + cltr_widget_show_all(app->video_ctrls->container); + + cltr_animator_run(app->anim, NULL, app); + */ + + cltr_widget_show_all(app->video_ctrls->container); + cltr_window_focus_widget(CLTR_WINDOW(app->win), + app->video_ctrls->buttons[VIDEO_PLAY_BTN]); + cltr_window_on_xevent(CLTR_WINDOW(app->win), NULL, NULL); +} void handle_xevent(CltrWidget *win, XEvent *xev, void *cookie) @@ -249,6 +467,16 @@ handle_xevent(CltrWidget *win, XEvent *xev, void *cookie) KeySym kc; DemoApp *app = (DemoApp*)cookie; + /* + * XXX really need to think about not queuing xevents in + * the current queue or something :/ + */ + if (app->ignore_next_xevent_hack) + { + app->ignore_next_xevent_hack = FALSE; + return; + } + if (xev->type == KeyPress) { XKeyEvent *xkeyev = &xev->xkey; @@ -259,71 +487,8 @@ handle_xevent(CltrWidget *win, XEvent *xev, void *cookie) { case XK_Return: { - ItemEntry *item; - char filename[1024]; - Pixbuf *spixb, *dpixb; - int dstx, dsty, dstw, dsth; - PixbufPixel col = { 0, 0, 0, 0xff }; - int x1, y1, x2, y2; - - cltr_video_pause (CLTR_VIDEO(app->video)); - - item = cell_to_item(app, cltr_list_get_active_cell(app->list)); - - item->stoptime = cltr_video_get_time (app->video); - - snprintf(filename, 1024, "%s/%s.png", item->path, item->nice_name); - - spixb = cltr_video_get_pixbuf (app->video); - - /* fixup pixbuf so scaled like video - * - */ - - /* XXX wrongly assume width > height */ - - dstw = spixb->width; - - dsth = (spixb->width * cltr_widget_height(win)) - / cltr_widget_width(win) ; - - printf("dsth %i, spixb h %i\n", dsth, spixb->height); - - dsty = (dsth - spixb->height)/2; dstx = 0; - - dpixb = pixbuf_new(dstw, dsth); - pixbuf_fill_rect(dpixb, 0, 0, -1, -1, &col); - pixbuf_copy(spixb, dpixb, 0, 0, - spixb->width, spixb->height, dstx, dsty); - - cltr_list_cell_set_pixbuf(cltr_list_get_active_cell(app->list), - dpixb); - - pixbuf_write_png(dpixb, filename); - - - /* reset the viewing pixbuf */ - - pixbuf_unref(dpixb); - - cltr_list_get_active_cell_video_box_co_ords(CLTR_LIST(app->list), - &x1, &y1, &x2, &y2); - - cltr_video_stop (CLTR_VIDEO(app->video)); - - /* zoom out, XXX old anim needs freeing */ - - app->anim = cltr_animator_zoom_new(app->list, - x1, y1, x2, y2, - 0,0,800,600); - - printf("got return, seek time %li, %i, %i \n", - cltr_video_get_time (CLTR_VIDEO(app->video)), - x1, y1); - - cltr_widget_show(app->list); - - cltr_animator_run(app->anim, zoom_out_complete, app); + init_show_controls(app); + /* zoom_video_out(app); */ } break; } @@ -355,6 +520,8 @@ zoom_in_complete (CltrAnimator *anim, void *userdata) item = cell_to_item(app, cltr_list_get_active_cell(app->list)); + app->paused = FALSE; + cltr_video_set_source(CLTR_VIDEO(app->video), item->uri); if (item->stoptime) @@ -371,11 +538,12 @@ zoom_in_complete (CltrAnimator *anim, void *userdata) cltr_video_seek_time (CLTR_VIDEO(app->video), item->stoptime, NULL); } + cltr_widget_show(app->video); cltr_widget_hide(CLTR_WIDGET(app->list)); - show_video_ctrl(app); + cltr_window_on_xevent(CLTR_WINDOW(app->win), handle_xevent, app); }