more select hacking
authorMatthew Allum <mallum@openedhand.com>
Fri, 27 May 2005 14:02:39 +0000 (14:02 +0000)
committerMatthew Allum <mallum@openedhand.com>
Fri, 27 May 2005 14:02:39 +0000 (14:02 +0000)
ChangeLog
clutter/cltr-animator.c
clutter/cltr-animator.h
clutter/cltr-button.c
clutter/cltr-label.c
clutter/cltr-label.h
clutter/cltr-list.c
clutter/cltr-widget.c
examples/select.c

index 17f1fb6..aab1f43 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,26 @@
+2005-05-27  mallum,,,  <mallum@openedhand.com>
+
+       * 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,,,  <mallum@openedhand.com>
 
        * clutter/cltr-button.c: (cltr_button_new_with_label),
index ce5aa0a..a472770 100644 (file)
@@ -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;
 
index c6bbb9d..d0014cd 100644 (file)
@@ -7,7 +7,9 @@ typedef struct CltrAnimator CltrAnimator;
 
 typedef enum CltrAnimatorType
 {
-  CltrAnimatorFullZoom
+  CltrAnimatorZoom,
+  CltrAnimatorFullZoom,
+  CltrAnimatorMove
 }
 CltrAnimatorType;
 
index d022ae8..c353b2a 100644 (file)
@@ -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);
index 764f2c6..df1e3ba 100644 (file)
@@ -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),
index 1be877c..d66ba49 100644 (file)
@@ -12,5 +12,7 @@ cltr_label_new(const char  *text,
               CltrFont    *font,
               PixbufPixel *col);
 
+void
+cltr_label_set_text(CltrLabel *label, char *text);
 
 #endif
index 2267990..6bbd533 100644 (file)
@@ -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));
 
          }
 
index 3d12337..908bbb5 100644 (file)
@@ -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;
index 0bb80b0..1697bdc 100644 (file)
@@ -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)
 {
@@ -54,6 +69,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)
 {
   VideoCtrls *v;
@@ -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-1);
 
-  v->buttons[VIDEO_PLAY_BTN] = cltr_button_new(width, height);
+  cltr_button_set_label(CLTR_BUTTON(v->buttons[VIDEO_PLAY_BTN]),
+                       "PAUSE", v->font, &col);
 
-  cltr_button_set_label(v->buttons[VIDEO_PLAY_BTN],
-                       "PlAY", 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);
 }