Index: samples/df_xine/control.c
===================================================================
RCS file: /cvs/directfb/DirectFB-extra/samples/df_xine/control.c,v
retrieving revision 1.21
diff -a -u -r1.21 control.c
--- samples/df_xine/control.c	29 Jun 2006 13:00:33 -0000	1.21
+++ samples/df_xine/control.c	20 Jan 2007 03:11:16 -0000
@@ -639,10 +639,13 @@
           }
           
           while (event->GetEvent( event, DFB_EVENT(&evt) ) == DFB_OK) {
+
+               DFXUserData* udata = (DFXUserData*) evt.data;
+
                int notice = DFX_NOTICE( evt.type );
                int actid  = DFX_ACTION( evt.type );
                int param  = DFX_PARAM( evt.type );
-               int delay  = millisec( NULL ) - (unsigned long) evt.data;
+               int delay  = millisec( NULL ) - udata->time;
           
                pthread_testcancel();
 
@@ -790,6 +793,14 @@
                               dfx_display_hide( this, -1 );
                               continue;
                     
+                         case DAI_OSD_WTEXT:
+                              dfx_display_text(this, "%s", (char*)udata->ptrparm);
+                              break;
+
+                         case DAI_SETPOSITION:
+                              dfx_control_seek( this, DCF_ALL, udata->numparm );
+                              break;
+
                          default:
                               continue;
                     }
@@ -800,6 +811,9 @@
                     if (!acquired)
                          dfx_display_hide( this, OSD_TIMEOUT );
                }
+
+               /* free the userdata that was allocated for this event */
+               free( udata );
           }
      }
 
@@ -828,7 +842,7 @@
                          break;
                     
                     magic = DFX_MAGIC( 0, 0, DAI_PLAY, DAP_PLUS );
-                    dfx_control_dispatch( this, magic, &event->tv );
+                    dfx_control_dispatch( this, magic, &event->tv, NULL, 0 );
                }
           }    break;
           
@@ -865,8 +879,9 @@
                                    dfx_event_listner, (void*) this );
 }
 
+
 void
-dfx_control_dispatch( DFXCore *this, int magic, const struct timeval *t )
+dfx_control_dispatch( DFXCore *this, int magic, const struct timeval *t, void* ptrparm, int numparm )
 {
      DFXVideoControl *ctl = &this->ctl;
 
@@ -887,10 +902,15 @@
      } 
      else {
           DFBEvent evt;
+          DFXUserData* data = (DFXUserData*)malloc(sizeof(DFXUserData));
           
+          data->time = millisec( t );
+          data->ptrparm = ptrparm;
+          data->numparm = numparm;
+
           evt.clazz     = DFEC_USER;
           evt.user.type = magic;
-          evt.user.data = (void*) millisec( t );
+          evt.user.data = data;
           ctl->event->PostEvent( ctl->event, &evt );
      }
 }
Index: samples/df_xine/df_xine.h
===================================================================
RCS file: /cvs/directfb/DirectFB-extra/samples/df_xine/df_xine.h,v
retrieving revision 1.24
diff -a -u -r1.24 df_xine.h
--- samples/df_xine/df_xine.h	23 Aug 2006 08:56:54 -0000	1.24
+++ samples/df_xine/df_xine.h	20 Jan 2007 03:11:17 -0000
@@ -213,6 +213,12 @@
 } DFXKeyControl;
 
 
+typedef struct {
+     unsigned long time;
+     void* ptrparm;
+     int   numparm;
+} DFXUserData;
+
 
 #define DGM_VIDEO          1
 #define DGM_ANIM           2
@@ -237,6 +243,8 @@
 #define DAI_OSD_HIDE      15
 #define DAI_DEINTERLACE   16
 #define DAI_ZOOM          17
+#define DAI_OSD_WTEXT     18
+#define DAI_SETPOSITION   19
 
 #define DAP_RESET          0
 #define DAP_MINUS         -1
@@ -393,7 +401,7 @@
 dfx_control_start( DFXCore *this );
 
 void
-dfx_control_dispatch( DFXCore *this, int magic, const struct timeval *tv );
+dfx_control_dispatch( DFXCore *this, int magic, const struct timeval *tv, void* ptrparm, int numparm );
 
 bool
 dfx_control_active( DFXCore *this );
Index: samples/df_xine/keymap.h
===================================================================
RCS file: /cvs/directfb/DirectFB-extra/samples/df_xine/keymap.h,v
retrieving revision 1.12
diff -a -u -r1.12 keymap.h
--- samples/df_xine/keymap.h	21 Mar 2006 10:25:08 -0000	1.12
+++ samples/df_xine/keymap.h	20 Jan 2007 03:11:17 -0000
@@ -131,6 +131,15 @@
           .stdctl = "SeekRelative-15"
      },
      {
+          .key    = 0,
+          .subkey = 0,
+          .event  = 0,
+          .actid  = DAI_SETPOSITION,
+          .param  = 0,
+          .help   = "set position in video stream",
+          .stdctl = "SetPosition%"
+     },
+     {
           .key    = DIKS_CONTROL,
           .subkey = DIKS_0,
           .event  = 0,
@@ -567,6 +576,14 @@
           .help   = "hide OSD",
           .stdctl = NULL
      },
+     {
+          .key    = 0,
+          .subkey = 0,
+          .actid  = DAI_OSD_WTEXT,
+          .param  = 0,
+          .help   = "write text to OSD",
+          .stdctl = "OSDWriteText"
+     },
 /* events */
      {
           .key    = DIKS_F1,
Index: samples/df_xine/main.c
===================================================================
RCS file: /cvs/directfb/DirectFB-extra/samples/df_xine/main.c,v
retrieving revision 1.25
diff -a -u -r1.25 main.c
--- samples/df_xine/main.c	23 Aug 2006 08:56:54 -0000	1.25
+++ samples/df_xine/main.c	20 Jan 2007 03:11:17 -0000
@@ -525,7 +525,7 @@
                magic = DFX_MAGIC( kmap[id].event, DAN_ACQUIRE,
                                   kmap[id].actid, kmap[id].param );
                                   
-          dfx_control_dispatch( this, magic, &evt->timestamp );
+          dfx_control_dispatch( this, magic, &evt->timestamp, NULL, 0 );
      } else {
           subkey = tolower( evt->key_symbol );
           id     = kmap_lookup_keycomb( key, subkey );
@@ -535,7 +535,7 @@
 
           magic = DFX_MAGIC( kmap[id].event, 0,
                              kmap[id].actid, kmap[id].param );
-          dfx_control_dispatch( this, magic, &evt->timestamp );
+          dfx_control_dispatch( this, magic, &evt->timestamp, NULL, 0 );
      }
 
      return key;
@@ -551,7 +551,7 @@
           
           magic = DFX_MAGIC( kmap[id].event, DAN_RELEASE,
                              kmap[id].actid, kmap[id].param );
-          dfx_control_dispatch( this, magic, &evt->timestamp );
+          dfx_control_dispatch( this, magic, &evt->timestamp, NULL, 0 );
 
           key = -1;
      }
@@ -624,6 +624,7 @@
      struct timeval  timeout;
 
      while (dfx_control_active( this )) {
+
           timeout.tv_sec  =  0;
           timeout.tv_usec =  500000;
 
@@ -632,14 +633,73 @@
           select( STDIN_FILENO + 1, &readset, NULL, NULL, &timeout );
 
           if (FD_ISSET( STDIN_FILENO, &readset )) {
+
                len = read( STDIN_FILENO, &c, 255 );
+
                if (len > 0) {
+
+                    char* params;
+                    char* ptrparm = NULL;
+                    int   numparm = 0;
+
                     c[len-1] = '\0';
+
+                    /* Handle optional parameter */
+
+                    /* alphanum: seperated from the command by a '$' */
+                    /* syntax: "command$parameter" */
+                    /* example: "OSDWriteText#Some Information to Display" */
+
+                    params = strchr(c, '$');
+
+                    if (params != NULL) {
+
+                         /* parameters available */
+       
+                         *params = '\0';
+                         params++;
+
+                         ptrparm = params;
+                    }
+
+                    /* numeric: seperated from the command by a '#' */
+                    /* syntax: "command#parameter" */
+                    /* example: "SetPosition%#99" */
+
+                    params = strchr(c, '#');
+
+                    if (params != NULL) {
+
+                         /* parameters available */
+
+                         *params = '\0';
+                         params++;
+
+                         numparm = atoi(params);
+                    }
+
                     key_magic = dfx_stdctl_get_action_magic( c );
+
                     if (key_magic != -1) {
-                         struct timeval tv;
-                         gettimeofday( &tv, NULL );
-                         dfx_control_dispatch( this, key_magic, &tv );
+
+                         switch( DFX_ACTION(key_magic) ) {
+
+                              struct timeval tv;
+                              gettimeofday( &tv, NULL );
+
+                              case DAI_SETPOSITION: {
+                                   dfx_control_dispatch( this, key_magic, &tv, ptrparm, numparm );
+                                   break;
+                              }
+                              case DAI_OSD_WTEXT: {
+                                   dfx_control_dispatch( this, key_magic, &tv, ptrparm, numparm );
+                                   break;
+                              }
+                              default: {
+                                   dfx_control_dispatch( this, key_magic, &tv, NULL, 0 );
+                                   break;
+                              }
+                         }
                     }
                }
           }
