[pinpoint/wip/speaker-view] add a keybinding to create/toggle speaker screen



commit faa24a3591a2fae65361b3daeeddd58f87c3bd1c
Author: �yvind Kolås <pippin gimp org>
Date:   Sun May 29 01:40:57 2011 +0100

    add a keybinding to create/toggle speaker screen

 introduction.pin |   65 ++++-----
 pinpoint.c       |   54 +++++---
 pinpoint.h       |    3 +
 pp-clutter.c     |  417 +++++++++++++++++++++++++++++++++---------------------
 4 files changed, 329 insertions(+), 210 deletions(-)
---
diff --git a/introduction.pin b/introduction.pin
index 02f0cb6..6939da5 100644
--- a/introduction.pin
+++ b/introduction.pin
@@ -2,19 +2,18 @@
 
 [bg.jpg]
 [font=Sans 50px]
-[duration=3]
-
--- [duration=4.683119]
+[duration=3.000000]
+-- [duration=1.224066]
 Welcome to pinpoint
 
--- [duration=3.776958]
+-- [duration=2.811049]
 A tool for making excellent presentations
 
--- [bowls.jpg] [duration=2.539292]
+-- [bowls.jpg] [duration=2.396589]
 It has a simple text source
 # The source can include witty comment lines
 
--- [font=monospace 18px] [shading-opacity=1.000000] [duration=7.709680]
+-- [font=monospace 18px] [shading-opacity=1.000000] [duration=2.173404]
 The current presentation thus far:
  #!/usr/bin/env pinpoint
  [font=Sans 50px]
@@ -33,7 +32,7 @@ The current presentation thus far:
  - [font=monospace 18px] [shading-opacity=1.0]
  The current presentation thus far:
 
--- [text-align=center] [duration=7.365783]
+-- [text-align=center] [duration=1.792367]
 You start by writing down the core concepts that you will be talking about. Then sort and format
 them as a pinpoint presentation in a text editor of your choice. 
 
@@ -44,97 +43,97 @@ Pinpoint reloads the presentation when it changes on disk, very useful when you'
 so keep both pinpoint and your text editor open. And remember, the less text you have, the happier
 your audience will be ;-)
 
--- [duration=5.208730]
+-- [duration=1.663685]
 Let's use some of the more 
 esoteric features of pinpoint
 
--- [bowls.jpg] [text-align=center] [duration=2.027793]
+-- [bowls.jpg] [text-align=center] [duration=1.430618]
 - [filename.jpg]
 set a custom background for an individual slide
 
--- [bunny.ogv] [fill] [duration=2.746118]
+-- [bunny.ogv] [fill] [duration=1.465077]
 You can put <b>anything</b> in the background
 
--- [linus.jpg] [fill] [bottom-left] [duration=2.707251]
+-- [linus.jpg] [fill] [bottom-left] [duration=1.324098]
 But, slides with cat pictures are best
 
--- [text-align=right] [top-right] [duration=2.866165]
+-- [text-align=right] [top-right] [duration=1.396734]
 position text in the
 [top-right]
 
--- [right] [duration=0.900697]
+-- [right] [duration=1.222382]
 [right]
 
--- [bottom-right] [duration=0.769096]
+-- [bottom-right] [duration=1.264147]
 [bottom-right]
 
--- [bottom] [duration=0.886113]
+-- [bottom] [duration=1.264479]
 [bottom]
 
--- [bottom-left] [duration=0.819249]
+-- [bottom-left] [duration=1.164848]
 [bottom-left]
 
--- [left] [duration=0.869433]
+-- [left] [duration=1.364550]
 [left]
 
--- [top-left] [duration=0.869504]
+-- [top-left] [duration=1.240191]
 [top-left]
 
--- [top] [duration=0.869362]
+-- [top] [duration=1.297619]
 [top]
 
--- [text-align=center] [duration=0.953079]
+-- [text-align=center] [duration=1.005195]
 and even in the
 [center]
 (which is the default)
 
--- [white] [bottom] [font=Monospace 100px] [text-color=black] [shading-opacity=0.000000] [duration=2.218380]
+-- [white] [bottom] [font=Monospace 100px] [text-color=black] [shading-opacity=0.000000] [duration=0.266029]
 Make text big!
 [font=Monospace 100px]
 [white][text-color=black]
 [shading-opacity=0.0][bottom]
 
--- [duration=1.787317]
+-- [duration=0.266103]
 <s>use</s> <b>pango</b> <i
 ><span foreground='red'>m<u
 >ar</u>k<sup>up</sup></span></i> for style
 
--- [duration=3.561908]
+-- [duration=0.232756]
 [no-markup]
 <s>don't use</s> <b>pango</b> <i
 ><span foreground='red'>m<u
 >ar</u>k<sup>up</sup></span></i>
 
--- [bowls.jpg] [transition=page-curl-both] [duration=1.484900]
+-- [bowls.jpg] [transition=page-curl-both] [duration=0.249426]
 need bullets?
  â?¥ use the power of unicode
 â?¢ â?½ â?© â?? â?? â?¦
 
--- [transition=text-slide-up] [duration=1.587787]
+-- [transition=text-slide-up] [duration=0.282905]
 $ pinpoint presentation.txt -o output.pdf
 Export to PDF. Handy.
 
--- [fill] [duration=2.060135]
+-- [fill] [duration=0.271180]
 [fill]
 Fill the slide with your background
 (the default is [fit])
 
--- [transition=swing] [duration=1.915374]
+-- [transition=swing] [duration=0.278247]
 Keybindings:
 
--- [transition=sheet] [duration=1.212597]
+-- [transition=sheet] [duration=0.448654]
 right, down or space - next slide
 
--- [transition=slide-left] [duration=1.196703]
+-- [transition=slide-left] [duration=0.299550]
 left or up - previous slide
 
--- [transition=slide-up] [duration=1.324502]
+-- [transition=slide-up] [duration=0.299543]
 F11 - toggle fullscreen
 
--- [transition=text-slide-down] [duration=1.309028]
+-- [transition=text-slide-down] [duration=0.382787]
 Escape - quit pinpoint
 
--- [fill] [transition=slide-in-left] [command=killall xeyes ; xeyes] [duration=1.308753]
+-- [fill] [transition=slide-in-left] [command=killall xeyes ; xeyes] [duration=0.715592]
 Enter - Run command
 Tab - Edit command
 [command=killall xeyes ; xeyes]
@@ -143,7 +142,7 @@ N.B. run pinpoint with the -m option
 and hidden or auto-hiding panels, to
 allow window management in fullscreen.
 
--- [linus.jpg] [fill] [bottom-right] [duration=1.236172]
+-- [linus.jpg] [fill] [bottom-right] [duration=0.499109]
 That's pretty much everything. 
 Told you it was simple.
 
diff --git a/pinpoint.c b/pinpoint.c
index 05b837a..a238759 100644
--- a/pinpoint.c
+++ b/pinpoint.c
@@ -112,6 +112,33 @@ PinPointRenderer *pp_cairo_renderer   (void);
 #endif
 static char * pp_serialize (void);
 
+void pp_rehearse_init (void)
+{
+  GList *iter;
+  for (iter = pp_slides; iter; iter=iter->next)
+    {
+      PinPointPoint *point = iter->data;
+        point->duration = 0.0;
+    }
+}
+
+static char *pinfile = NULL;
+
+void pp_rehearse_save (void)
+{
+  GError *error = NULL;
+  char *content = pp_serialize ();
+  if (!g_file_set_contents (pinfile, content, -1, &error))
+    {
+      printf ("Failed to save to %s %s\n", pinfile, error->message);
+    }
+  else
+    {
+      printf ("saved\n");
+    }
+  g_free (content);
+}
+
 int
 main (int    argc,
       char **argv)
@@ -134,7 +161,9 @@ main (int    argc,
       return EXIT_FAILURE;
     }
 
-  if (!argv[1])
+  pinfile = argv[1];
+
+  if (!pinfile)
     {
       g_print ("usage: %s [options] <presentation>\n", argv[0]);
       text = g_strdup ("[no-markup][transition=sheet][red]\n"
@@ -143,9 +172,9 @@ main (int    argc,
     }
   else
     {
-      if (!g_file_get_contents (argv[1], &text, NULL, NULL))
+      if (!g_file_get_contents (pinfile, &text, NULL, NULL))
         {
-          g_print ("failed to load presentation from %s\n", argv[1]);
+          g_print ("failed to load presentation from %s\n", pinfile);
           return -1;
         }
     }
@@ -172,16 +201,17 @@ main (int    argc,
 #endif
     }
 
-  if (!argv[1])
+  if (!pinfile)
     pp_rehearse = FALSE;
 
-  renderer->init (renderer, argv[1]);
+  renderer->init (renderer, pinfile);
   pp_parse_slides (renderer, text);
   g_free (text);
 
   if (pp_rehearse)
     {
-      printf ("Running in rehearsal mode, press ctrl+C to abort without saving timings back to %s\n", argv[1]);
+      pp_rehearse_init ();
+      printf ("Running in rehearsal mode, press ctrl+C to abort without saving timings back to %s\n", pinfile);
     }
 
   renderer->run (renderer);
@@ -189,15 +219,7 @@ main (int    argc,
   if (renderer->source)
     g_free (renderer->source);
   if (pp_rehearse)
-    {
-      GError *error = NULL;
-      char *content = pp_serialize ();
-      if (!g_file_set_contents (argv[1], content, -1, &error))
-        {
-          printf ("Failed to save to %s %s\n", argv[1], error->message);
-        }
-      g_free (content);
-    }
+    pp_rehearse_save ();
 
   g_list_free (pp_slides);
 
@@ -769,8 +791,6 @@ pp_parse_slides (PinPointRenderer *renderer,
                     g_string_assign (notes_str, "");
 
                     pp_slides = g_list_append (pp_slides, point);
-                    if (pp_rehearse)
-                      point->duration = 0.0;
                     point = next_point;
                   }
               }
diff --git a/pinpoint.h b/pinpoint.h
index f54d5a8..1b7fc2f 100644
--- a/pinpoint.h
+++ b/pinpoint.h
@@ -121,6 +121,9 @@ pp_get_padding (float  stage_width,
                 float  stage_height,
                 float *padding);
 
+void pp_rehearse_init (void);
+void pp_rehearse_save (void);
+
 void
 pp_get_background_position_scale (PinPointPoint *point,
                                   float          stage_width,
diff --git a/pp-clutter.c b/pp-clutter.c
index 3ac2f14..5645619 100644
--- a/pp-clutter.c
+++ b/pp-clutter.c
@@ -392,24 +392,219 @@ opacity_hover_leave (ClutterActor *actor,
                         G_CALLBACK (opacity_hover_leave), NULL); \
 
 static gboolean
-elapsed_pressed (ClutterActor *actor,
-                 ClutterEvent *event,
-                 gpointer      data)
+play_pause (ClutterActor *actor,
+            ClutterEvent *event,
+            gpointer      data)
 {
   ClutterRenderer *renderer = CLUTTER_RENDERER (data);
   if (renderer->timer_paused)
     {
       g_timer_continue (renderer->timer);
       renderer->timer_paused = FALSE;
+      clutter_text_set_text (CLUTTER_TEXT (actor), "pause");
     }
   else
     {
       g_timer_stop (renderer->timer);
       renderer->timer_paused = TRUE;
+      clutter_text_set_text (CLUTTER_TEXT (actor), "play");
     }
   return TRUE;
 }
 
+
+static gboolean
+reset_time (ClutterActor *actor,
+            ClutterEvent *event,
+            gpointer      data)
+{
+  ClutterRenderer *renderer = CLUTTER_RENDERER (data);
+  g_timer_stop (renderer->timer);
+  g_timer_start (renderer->timer);
+
+  if (renderer->timer_paused)
+    g_timer_stop (renderer->timer);
+  return TRUE;
+}
+
+
+static gboolean
+toggle_autoplay (ClutterActor *actor,
+                 ClutterEvent *event,
+                 gpointer      data)
+{
+  ClutterRenderer *renderer = CLUTTER_RENDERER (data);
+  if (renderer->autoplay)
+    renderer->autoplay = FALSE;
+  else
+    renderer->autoplay = TRUE;
+  return TRUE;
+}
+
+
+static gboolean
+start_rehearse (ClutterActor *actor,
+                ClutterEvent *event,
+                gpointer      data)
+{
+  ClutterRenderer *renderer = CLUTTER_RENDERER (data);
+  g_warning ("%s NYI\n", __FUNCTION__);
+
+  g_timer_stop (renderer->timer);
+  g_timer_start (renderer->timer);
+  renderer->timer_paused = FALSE;
+  leave_slide (renderer, TRUE);
+  pp_slidep = pp_slides;
+  show_slide (renderer, TRUE);
+  pp_rehearse = TRUE;
+  pp_rehearse_init ();
+
+  /* end of presentation */
+
+}
+
+
+static void toggle_speaker_screen (ClutterRenderer *renderer);
+
+static void
+clutter_renderer_init_speaker_screen (ClutterRenderer *renderer)
+{
+  renderer->speaker_screen = clutter_stage_new ();
+
+  renderer->speaker_notes = g_object_new (CLUTTER_TYPE_TEXT,
+                                "x", 10.0,
+                                "y", 20.0,
+                                "font-name",      "Sans 20px",
+                                "color",          &white,
+                                NULL);
+
+  renderer->speaker_time_remaining = g_object_new (CLUTTER_TYPE_TEXT,
+                                "x",           300.0,
+                                "y",           0.0,
+                                "opacity",     NORMAL_OPACITY,
+                                "font-name",   "Sans 28px",
+                                "text",        "-3",
+                                "reactive",    TRUE,
+                                "color",       &white,
+                                NULL);
+
+
+  renderer->speaker_buttons_group = clutter_group_new ();
+  renderer->speaker_rehearse = g_object_new (CLUTTER_TYPE_TEXT,
+                                "x",           0.0,
+                                "y",           0.0,
+                                "opacity",     NORMAL_OPACITY,
+                                "font-name",   "Sans 28px",
+                                "text",        "rehearse",
+                                "reactive",    TRUE,
+                                "color",       &white,
+                                NULL);
+  renderer->speaker_autoplay = g_object_new (CLUTTER_TYPE_TEXT,
+                                "x",           140.0,
+                                "y",           0.0,
+                                "opacity",     NORMAL_OPACITY,
+                                "font-name",   "Sans 28px",
+                                "text",        "autoplay",
+                                "reactive",    TRUE,
+                                "color",       &white,
+                                NULL);
+  renderer->speaker_reset_time = g_object_new (CLUTTER_TYPE_TEXT,
+                                "x",           280.0,
+                                "y",           0.0,
+                                "opacity",     NORMAL_OPACITY,
+                                "font-name",   "Sans 28px",
+                                "text",        "restart",
+                                "reactive",    TRUE,
+                                "color",       &white,
+                                NULL);
+  renderer->speaker_pause_time = g_object_new (CLUTTER_TYPE_TEXT,
+                                "x",           440.0,
+                                "y",           0.0,
+                                "opacity",     NORMAL_OPACITY,
+                                "font-name",   "Sans 28px",
+                                "text",        "pause",
+                                "reactive",    TRUE,
+                                "color",       &white,
+                                NULL);
+
+  opacity_hover(renderer->speaker_rehearse);
+
+  g_signal_connect (renderer->speaker_rehearse, "button-press-event",
+                    G_CALLBACK (start_rehearse), renderer);
+
+  opacity_hover(renderer->speaker_autoplay);
+
+  g_signal_connect (renderer->speaker_autoplay, "button-press-event",
+                    G_CALLBACK (toggle_autoplay), renderer);
+
+  opacity_hover(renderer->speaker_reset_time);
+
+  g_signal_connect (renderer->speaker_reset_time, "button-press-event",
+                    G_CALLBACK (reset_time), renderer);
+
+  opacity_hover(renderer->speaker_pause_time);
+
+  g_signal_connect (renderer->speaker_pause_time, "button-press-event",
+                    G_CALLBACK (play_pause), renderer);
+
+
+  renderer->timer_paused = FALSE;
+  renderer->timer = g_timer_new ();
+
+
+  renderer->speaker_slide_prog_bg = clutter_rectangle_new_with_color (&c_prog_bg);
+  renderer->speaker_slide_prog_time = clutter_rectangle_new_with_color (&c_prog_time);
+
+  renderer->speaker_prog_bg = clutter_rectangle_new_with_color (&c_prog_bg);
+  renderer->speaker_prog_time = clutter_rectangle_new_with_color (&c_prog_time);
+  renderer->speaker_prog_slide = clutter_rectangle_new_with_color (&c_prog_slide);
+  renderer->speaker_slide_prog_warning = clutter_rectangle_new_with_color (&red);
+  renderer->speaker_prog_warning = clutter_rectangle_new_with_color (&red);
+
+
+
+  clutter_stage_set_color (CLUTTER_STAGE (renderer->speaker_screen), &black);
+  clutter_stage_set_color (CLUTTER_STAGE (renderer->speaker_screen), &black);
+  clutter_stage_set_user_resizable (CLUTTER_STAGE (renderer->speaker_screen), TRUE);
+
+
+  clutter_container_add (CLUTTER_CONTAINER (renderer->speaker_screen),
+                         renderer->speaker_notes,
+                         renderer->speaker_prog_bg,
+                         renderer->speaker_prog_time,
+                         renderer->speaker_prog_warning,
+                         renderer->speaker_prog_slide,
+
+                         renderer->speaker_slide_prog_bg,
+                         renderer->speaker_slide_prog_time,
+                         renderer->speaker_slide_prog_warning,
+
+                         renderer->speaker_buttons_group,
+
+                         renderer->speaker_time_remaining,
+
+                         renderer->speaker_clone,
+                         NULL);
+
+  clutter_container_add (CLUTTER_CONTAINER (renderer->speaker_buttons_group),
+                         renderer->speaker_rehearse,
+                         renderer->speaker_autoplay,
+                         renderer->speaker_reset_time,
+                         renderer->speaker_pause_time,
+                         NULL);
+
+
+  clutter_actor_set_opacity (renderer->speaker_slide_prog_warning, 0);
+  clutter_actor_set_opacity (renderer->speaker_prog_warning, 0);
+
+  /* offscreen creation for actor on different stage not supported */
+  //renderer->speaker_clone = clutter_texture_new_from_actor (renderer->root);
+  renderer->speaker_clone = clutter_clone_new (renderer->root);
+  clutter_container_add (CLUTTER_CONTAINER (renderer->speaker_screen),
+                         renderer->speaker_clone,
+                         NULL);
+}
+
 static void
 clutter_renderer_init (PinPointRenderer   *pp_renderer,
                        char               *pinpoint_file)
@@ -418,9 +613,6 @@ clutter_renderer_init (PinPointRenderer   *pp_renderer,
   GFileMonitor *monitor;
   ClutterActor *stage;
 
-  if (pp_speakermode)
-    renderer->speaker_mode = TRUE; /* enable rendering of speaker window */
-
   renderer->stage = stage = clutter_stage_new ();
   renderer->root = clutter_group_new ();
   renderer->rest_y = STARTPOS;
@@ -454,136 +646,9 @@ clutter_renderer_init (PinPointRenderer   *pp_renderer,
   renderer->timer_paused = FALSE;
   renderer->timer = g_timer_new ();
 
-  if (renderer->speaker_mode)
-    {
-      renderer->speaker_screen = clutter_stage_new ();
-
-      renderer->speaker_notes = g_object_new (CLUTTER_TYPE_TEXT,
-                                    "x", 10.0,
-                                    "y", 20.0,
-                                    "font-name",      "Sans 20px",
-                                    "color",          &white,
-                                    NULL);
-
-      renderer->speaker_time_remaining = g_object_new (CLUTTER_TYPE_TEXT,
-                                    "x",           300.0,
-                                    "y",           0.0,
-                                    "opacity",     NORMAL_OPACITY,
-                                    "font-name",   "Sans 28px",
-                                    "text",        "-3",
-                                    "reactive",    TRUE,
-                                    "color",       &white,
-                                    NULL);
-
-
-      renderer->speaker_buttons_group = clutter_group_new ();
-      renderer->speaker_rehearse = g_object_new (CLUTTER_TYPE_TEXT,
-                                    "x",           0.0,
-                                    "y",           0.0,
-                                    "opacity",     NORMAL_OPACITY,
-                                    "font-name",   "Sans 28px",
-                                    "text",        "rehearse",
-                                    "reactive",    TRUE,
-                                    "color",       &white,
-                                    NULL);
-      renderer->speaker_autoplay = g_object_new (CLUTTER_TYPE_TEXT,
-                                    "x",           140.0,
-                                    "y",           0.0,
-                                    "opacity",     NORMAL_OPACITY,
-                                    "font-name",   "Sans 28px",
-                                    "text",        "autoplay",
-                                    "reactive",    TRUE,
-                                    "color",       &white,
-                                    NULL);
-      renderer->speaker_reset_time = g_object_new (CLUTTER_TYPE_TEXT,
-                                    "x",           280.0,
-                                    "y",           0.0,
-                                    "opacity",     NORMAL_OPACITY,
-                                    "font-name",   "Sans 28px",
-                                    "text",        "reset time",
-                                    "reactive",    TRUE,
-                                    "color",       &white,
-                                    NULL);
-      renderer->speaker_pause_time = g_object_new (CLUTTER_TYPE_TEXT,
-                                    "x",           440.0,
-                                    "y",           0.0,
-                                    "opacity",     NORMAL_OPACITY,
-                                    "font-name",   "Sans 28px",
-                                    "text",        "pause time",
-                                    "reactive",    TRUE,
-                                    "color",       &white,
-                                    NULL);
-
-      opacity_hover(renderer->speaker_rehearse);
-      opacity_hover(renderer->speaker_autoplay);
-      opacity_hover(renderer->speaker_pause_time);
-      opacity_hover(renderer->speaker_reset_time);
-
-
-      g_signal_connect (renderer->speaker_time_remaining, "button-press-event",
-                        G_CALLBACK (elapsed_pressed), renderer);
-
-
-      renderer->timer_paused = FALSE;
-      renderer->timer = g_timer_new ();
-
-
-      renderer->speaker_slide_prog_bg = clutter_rectangle_new_with_color (&c_prog_bg);
-      renderer->speaker_slide_prog_time = clutter_rectangle_new_with_color (&c_prog_time);
-
-      renderer->speaker_prog_bg = clutter_rectangle_new_with_color (&c_prog_bg);
-      renderer->speaker_prog_time = clutter_rectangle_new_with_color (&c_prog_time);
-      renderer->speaker_prog_slide = clutter_rectangle_new_with_color (&c_prog_slide);
-      renderer->speaker_slide_prog_warning = clutter_rectangle_new_with_color (&red);
-      renderer->speaker_prog_warning = clutter_rectangle_new_with_color (&red);
-
-
-
-      clutter_stage_set_color (CLUTTER_STAGE (renderer->speaker_screen), &black);
-      clutter_stage_set_color (CLUTTER_STAGE (renderer->speaker_screen), &black);
-      clutter_stage_set_user_resizable (CLUTTER_STAGE (renderer->speaker_screen), TRUE);
-
-
-      clutter_container_add (CLUTTER_CONTAINER (renderer->speaker_screen),
-                             renderer->speaker_notes,
-                             renderer->speaker_prog_bg,
-                             renderer->speaker_prog_time,
-                             renderer->speaker_prog_warning,
-                             renderer->speaker_prog_slide,
-
-                             renderer->speaker_slide_prog_bg,
-                             renderer->speaker_slide_prog_time,
-                             renderer->speaker_slide_prog_warning,
-
-                             renderer->speaker_buttons_group,
-
-                             renderer->speaker_time_remaining,
-
-                             renderer->speaker_clone,
-                             NULL);
-
-      clutter_container_add (CLUTTER_CONTAINER (renderer->speaker_buttons_group),
-                             renderer->speaker_rehearse,
-                             renderer->speaker_autoplay,
-                             renderer->speaker_reset_time,
-                             renderer->speaker_pause_time,
-                             NULL);
-
-
-      clutter_actor_set_opacity (renderer->speaker_slide_prog_warning, 0);
-      clutter_actor_set_opacity (renderer->speaker_prog_warning, 0);
-
-      /* offscreen creation for actor on different stage not supported */
-      //renderer->speaker_clone = clutter_texture_new_from_actor (renderer->root);
-      renderer->speaker_clone = clutter_clone_new (renderer->root);
-      clutter_container_add (CLUTTER_CONTAINER (renderer->speaker_screen),
-                             renderer->speaker_clone,
-                             NULL);
-
-
-      clutter_actor_show (renderer->speaker_screen);
-    }
 
+  if (pp_speakermode)
+    toggle_speaker_screen (renderer);
 
   clutter_actor_show (stage);
 
@@ -641,7 +706,7 @@ clutter_renderer_run (PinPointRenderer *pp_renderer)
   /* the presentaiton is not parsed at first initialization,.. */
   renderer->total_seconds = point_defaults->duration * 60;
 
-  g_timeout_add (100, (GSourceFunc)update_speaker_screen, renderer);
+  g_timeout_add (15, (GSourceFunc)update_speaker_screen, renderer);
   clutter_main ();
 }
 
@@ -825,6 +890,14 @@ clutter_renderer_free_data (PinPointRenderer *renderer,
   g_slice_free (ClutterPointData, data);
 }
 
+static void end_of_presentation (ClutterRenderer *renderer)
+{
+  if (pp_rehearse)
+    {
+      pp_rehearse_save ();
+    }
+  pp_rehearse = FALSE;
+}
 
 static void
 next_slide (ClutterRenderer *renderer)
@@ -835,6 +908,10 @@ next_slide (ClutterRenderer *renderer)
       pp_slidep = pp_slidep->next;
       show_slide (renderer, FALSE);
     }
+  else
+    {
+      end_of_presentation (renderer);
+    }
 }
 
 
@@ -849,6 +926,22 @@ prev_slide (ClutterRenderer *renderer)
     }
 }
 
+static void
+toggle_speaker_screen (ClutterRenderer *renderer)
+{
+  if (!renderer->speaker_screen)
+    clutter_renderer_init_speaker_screen (renderer);
+  if (renderer->speaker_mode)
+    {
+      renderer->speaker_mode = FALSE;
+      clutter_actor_hide (renderer->speaker_screen);
+    }
+  else
+    {
+      renderer->speaker_mode = TRUE;
+      clutter_actor_show (renderer->speaker_screen);
+    }
+}
 
 static gboolean
 key_pressed (ClutterActor    *actor,
@@ -877,6 +970,9 @@ key_pressed (ClutterActor    *actor,
         pp_set_fullscreen (CLUTTER_STAGE (renderer->stage),
                           !pp_get_fullscreen (CLUTTER_STAGE (renderer->stage)));
         break;
+      case CLUTTER_F12:
+        toggle_speaker_screen (renderer);
+        break;
       case CLUTTER_Return:
         action_slide (renderer);
         break;
@@ -893,7 +989,6 @@ key_pressed (ClutterActor    *actor,
   return TRUE;
 }
 
-
 static void leave_slide (ClutterRenderer *renderer,
                          gboolean         backwards)
 {
@@ -1021,7 +1116,6 @@ static char *pp_lookup_transition (const char *transition)
   return NULL;
 }
 
-
 static void update_commandline_shading (ClutterRenderer *renderer)
 {
   PinPointPoint *point;
@@ -1098,7 +1192,6 @@ static gboolean update_speaker_screen (ClutterRenderer *renderer)
   static float current_slide_duration = 0.0;
   static GList *current_slide = NULL;
 
-  //if (renderer->autoplay)
     {
       static float current_slide_prev = 0.0;
       float diff = g_timer_elapsed (renderer->timer, NULL) - current_slide_prev;
@@ -1120,24 +1213,26 @@ static gboolean update_speaker_screen (ClutterRenderer *renderer)
             }
           else
             {
-              clutter_actor_animate (renderer->speaker_slide_prog_warning,
-                                     CLUTTER_LINEAR, 500,
-                                     "opacity", 128,
-                                     NULL);
+              if (renderer->speaker_slide_prog_warning)
+                clutter_actor_animate (renderer->speaker_slide_prog_warning,
+                                       CLUTTER_LINEAR, 500,
+                                       "opacity", 128,
+                                       NULL);
             }
         }
       else
         {
-          clutter_actor_animate (renderer->speaker_slide_prog_warning,
-                                 CLUTTER_LINEAR, 50,
-                                 "opacity", 0,
-                                 NULL);
+          if (renderer->speaker_slide_prog_warning)
+            clutter_actor_animate (renderer->speaker_slide_prog_warning,
+                                   CLUTTER_LINEAR, 50,
+                                   "opacity", 0,
+                                   NULL);
         }
 
       current_slide_prev = g_timer_elapsed (renderer->timer, NULL);
     }
 
-  if (!pp_speakermode)
+  if (!renderer->speaker_mode)
     return TRUE;
 
   if (point->speaker_notes)
@@ -1161,7 +1256,7 @@ static gboolean update_speaker_screen (ClutterRenderer *renderer)
 
     {
       int time = renderer->total_seconds -
-                      g_timer_elapsed (renderer->timer, NULL);
+                      g_timer_elapsed (renderer->timer, NULL) + 0.5;
       if (time <= -60)
         g_string_printf (str, "%imin", time/60);
       else if (time <= 60)
@@ -1172,17 +1267,19 @@ static gboolean update_speaker_screen (ClutterRenderer *renderer)
                                str->str);
 
 
-      if (time < 0)
-        clutter_actor_animate (renderer->speaker_prog_warning,
-                               CLUTTER_LINEAR, 500,
-                               "opacity", 128,
-                               NULL);
-      else
-        clutter_actor_animate (renderer->speaker_prog_warning,
-                               CLUTTER_LINEAR, 50,
-                               "opacity", 0,
-                               NULL);
-
+      if (renderer->speaker_prog_warning)
+        {
+          if (time < 0)
+            clutter_actor_animate (renderer->speaker_prog_warning,
+                                   CLUTTER_LINEAR, 500,
+                                   "opacity", 128,
+                                   NULL);
+          else
+            clutter_actor_animate (renderer->speaker_prog_warning,
+                                   CLUTTER_LINEAR, 50,
+                                   "opacity", 0,
+                                   NULL);
+        }
     }
 
     g_string_assign (str, ""); 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]