# HG changeset patch
# User renatofilho
# Date 1159455734 -3600
# Node ID 7174e23f76176bd4ee93657b922a8c4b9a5d2f20
# Parent  7c409a042a9ae5590952bb9127916256d5806947
[svn r21] - created maemo-ui;

diff -r 7c409a042a9a -r 7174e23f7617 gmyth/src/gmyth_tvplayer.c
--- a/gmyth/src/gmyth_tvplayer.c	Thu Sep 28 15:57:27 2006 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,684 +0,0 @@
-/**
- * GMyth Library
- *
- * @file gmyth/gmyth_tvplayer.c
- * 
- * @brief <p> This component provides playback of the remote A/V using
- * GStreamer.
- * 
- * Copyright (C) 2006 INdT - Instituto Nokia de Tecnologia.
- * @author Hallyson Luiz de Morais Melo <hallyson.melo@indt.org.br>
- *
- *//*
- * 
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-#include "gmyth_tvplayer.h"
- 
-#include <gdk/gdkx.h>
-
-#include "gmyth_context.h"
-#include "gmyth_remote_util.h"
-
-typedef struct _GstPlayerWindowStateChange
-{
-    GstElement *play;
-    GstState old_state, new_state;
-    GMythTVPlayer *tvplayer;
-} GstPlayerWindowStateChange;
-
-typedef struct _GstPlayerWindowTagFound
-{
-    GstElement *play;
-    GstTagList *taglist;
-    GMythTVPlayer *tvplayer;
-} GstPlayerWindowTagFound;
-
-/*
-static gboolean idle_state (gpointer data);
-*/
-static gboolean bus_call (GstBus * bus, GstMessage * msg, gpointer data);
-
-static void gmyth_tvplayer_class_init          (GMythTVPlayerClass *klass);
-static void gmyth_tvplayer_init                (GMythTVPlayer *object);
-
-static void gmyth_tvplayer_dispose  (GObject *object);
-static void gmyth_tvplayer_finalize (GObject *object);
-
-G_DEFINE_TYPE(GMythTVPlayer, gmyth_tvplayer, G_TYPE_OBJECT)
-
-static gboolean gmyth_tvplayer_create_pipeline (GMythTVPlayer* tvplayer);
-static void     new_pad_cb (GstElement *element, 
-                            GstPad *pad, gpointer data);
-
-static gboolean expose_cb (GtkWidget * widget, 
-                           GdkEventExpose * event, 
-                           gpointer user_data);
-
-static void
-gmyth_tvplayer_class_init (GMythTVPlayerClass *klass)
-{
-	GObjectClass *gobject_class;
-
-    gobject_class = (GObjectClass *) klass;
-	
-    gobject_class->dispose  = gmyth_tvplayer_dispose;
-    gobject_class->finalize = gmyth_tvplayer_finalize;	
-}
-
-static void
-new_pad_cb (GstElement *element, GstPad *pad, gpointer data)
-{
-	GMythTVPlayer *tvplayer = GMYTH_TVPLAYER (data);
-	GstPadLinkReturn ret;
-	char *s;
-	
-	s = gst_caps_to_string (pad->caps);
-
-	if ( s[0] == 'a') {
-		ret = gst_pad_link (pad, gst_element_get_pad (tvplayer->audioqueue, "sink"));
-	} else {
-		ret = gst_pad_link (pad, gst_element_get_pad (tvplayer->videoqueue, "sink")); 
-	}
-	
-	g_free(s);
-}
-
-static gboolean
-expose_cb (GtkWidget * widget, GdkEventExpose * event, gpointer user_data)
-{
-    GMythTVPlayer *tvplayer = GMYTH_TVPLAYER (user_data);
-
-	if (tvplayer && tvplayer->videow) {
-	    gst_x_overlay_set_xwindow_id (GST_X_OVERLAY (tvplayer->gst_videosink),
-                                  GDK_WINDOW_XWINDOW (widget->window));
-		return TRUE;
-	}
-	
-	g_warning ("GMythTVPlayer expose called before setting video window\n");
-	
-    return FALSE;
-}
-
-static void
-gmyth_tvplayer_init (GMythTVPlayer *tvplayer)
-{
-    tvplayer->gst_pipeline = NULL;
-    tvplayer->gst_source = NULL;
-    tvplayer->gst_videodec = NULL;
-    tvplayer->gst_videosink = NULL;
-    tvplayer->videoqueue = NULL;
-    tvplayer->audioqueue = NULL;
-    
-    /* GTKWidget for rendering the video */
-    tvplayer->videow = NULL;
-	tvplayer->expose_handler = 0;
-	    
-	tvplayer->backend_hostname = NULL;
-	tvplayer->backend_port = 0;
-	tvplayer->local_hostname = NULL;
-
-	tvplayer->remote_encoder = NULL;
-	tvplayer->tvchain = NULL;
-	tvplayer->proginfo = NULL;
-}
-
-static void
-gmyth_tvplayer_dispose (GObject *object)
-{
-
-	G_OBJECT_CLASS (gmyth_tvplayer_parent_class)->dispose (object);
-}
-
-static void
-gmyth_tvplayer_finalize (GObject *object)
-{
-	g_signal_handlers_destroy (object);
-
-	GMythTVPlayer *tvplayer = GMYTH_TVPLAYER (object);
-
-	g_debug ("[%s] Finalizing tvplayer", __FUNCTION__);
-	
-	if (tvplayer->videow != NULL) {
-		if (g_signal_handler_is_connected (tvplayer->videow, 
-						tvplayer->expose_handler)) {
-			g_signal_handler_disconnect (tvplayer->videow,
-				tvplayer->expose_handler);
-		}
-		g_object_unref (tvplayer->videow);
-	}
-	
-	if ( tvplayer->remote_encoder != NULL )
-		g_object_unref (tvplayer->remote_encoder);
-	if ( tvplayer->tvchain != NULL )
-		g_object_unref (tvplayer->tvchain);
-	if ( tvplayer->proginfo != NULL )
-		g_object_unref (tvplayer->proginfo);	
-
-	// Release Gstreamer elements
-	if ( tvplayer->gst_pipeline != NULL )
-		g_object_unref (tvplayer->gst_pipeline);	
-	if ( tvplayer->gst_source != NULL )
-		g_object_unref (tvplayer->gst_source);	
-	if ( tvplayer->gst_videodec != NULL )
-		g_object_unref (tvplayer->gst_videodec);	
-	if ( tvplayer->gst_videosink != NULL )
-		g_object_unref (tvplayer->gst_videosink);	
-	if ( tvplayer->videoqueue != NULL )
-		g_object_unref (tvplayer->videoqueue);	
-	if ( tvplayer->audioqueue != NULL )
-		g_object_unref (tvplayer->audioqueue);	
-
-	G_OBJECT_CLASS (gmyth_tvplayer_parent_class)->finalize (object);
-}
-
-/** Creates a new instance of GMythTVPlayer. 
- * 
- * @return a new instance of GMythTVPlayer.
- */
-GMythTVPlayer *
-gmyth_tvplayer_new ()
-{
-    GMythTVPlayer *tvplayer = 
-        GMYTH_TVPLAYER (g_object_new(GMYTH_TVPLAYER_TYPE, NULL));
-    
-    return tvplayer;
-}
-
-/** Initializes the tv player.
- *
- * @param tvplayer the object instance.
- * @return gboolean TRUE if the pipeline was created 
- * successfully, FALSE otherwise.
- */
-gboolean
-gmyth_tvplayer_initialize (GMythTVPlayer *tvplayer)
-{
-	
-    if (!gmyth_tvplayer_create_pipeline (tvplayer)) {
-    	g_warning ("[%s] Error while creating pipeline. TV Player not initialized", __FUNCTION__);
-		return FALSE;
-	} else {
-		g_debug ("[%s] GStreamer pipeline created", __FUNCTION__);	
-    }
-
-	return TRUE;
-}
-
-/** Creates the GStreamer pipeline used by the player.
- *
- * @param tvplayer the object instance.
- * @return gboolean TRUE if the pipeline was created 
- * successfully, FALSE otherwise.
- */
-static gboolean
-gmyth_tvplayer_create_pipeline (GMythTVPlayer* tvplayer)
-{
-    GstElement *pipeline;
-    GstElement *source, *parser;
-    GstElement *videodec, *videosink;
-#ifndef MAEMO_PLATFORM    
-    GstElement *audiodec, *audioconv;
-#endif
-    GstElement *audiosink;
-    GstElement *videoqueue, *audioqueue;
-
-    g_debug ("GMythTVPlayer: Setting the Gstreamer pipeline\n");
-	
-    pipeline = gst_pipeline_new ("video-player");
-    source = gst_element_factory_make ("mythtvsrc", "myth-source");
-    parser = gst_element_factory_make ("ffdemux_nuv", "nuv-demux");
-
-    /* Gstreamer Video elements */
-    videoqueue = gst_element_factory_make ("queue", "video-queue");
-    videodec = gst_element_factory_make ("ffdec_mpeg4", "video-decoder");
-#ifdef MAEMO_PLATFORM
-    videosink = gst_element_factory_make ("sdlvideosink", "image-output");
-#else
-    videosink = gst_element_factory_make ("xvimagesink", "image-output");
-#endif
-    
-    /* Gstreamer Audio elements */
-    audioqueue = gst_element_factory_make ("queue", "audio-queue");    
-#ifdef MAEMO_PLATFORM    
-    audiosink = gst_element_factory_make ("dspmp3sink", "audio-output");
-#else    
-    audiodec = gst_element_factory_make ("ffdec_mp3", "audio-decoder");
-    audioconv = gst_element_factory_make ("audioconvert", "audio-converter");
-    audiosink = gst_element_factory_make ("alsasink", "audio-output");
-#endif    
-    
-    if (!(pipeline && source && parser && videodec && videosink) ||
-    	!(videoqueue && audioqueue && audiosink)) {
-        /* FIXME: hanlde the error correctly */
-        /* video_alignment is not being created (below) 
-           and is causing problems to the ui */
-
-	    tvplayer->gst_pipeline = NULL;
-	    tvplayer->gst_videodec = NULL;
-	    tvplayer->gst_videosink = NULL;
-           
-        g_warning ("GstElement creation error!\n");
-        return FALSE;
-    }
-
-#ifndef MAEMO_PLATFORM    
-    if (!(audiodec && audioconv)) {
-        g_warning ("GstElement for audio stream creation error!");
-        return FALSE;
-    }
-#endif    
-    
-    
-    tvplayer->gst_pipeline = pipeline;
-    tvplayer->gst_source = source;
-    tvplayer->gst_videodec = videodec;
-    tvplayer->gst_videosink = videosink;
-    g_object_ref (tvplayer->gst_pipeline);
-    g_object_ref (tvplayer->gst_source);
-    g_object_ref (tvplayer->gst_videodec);
-    g_object_ref (tvplayer->gst_videosink);
-
-    tvplayer->videoqueue = videoqueue;
-    tvplayer->audioqueue = audioqueue;
-    g_object_ref (tvplayer->videoqueue);
-    g_object_ref (tvplayer->audioqueue);
-   	
-    g_object_set (G_OBJECT (videosink), "sync", TRUE, NULL);
-    g_object_set (G_OBJECT (audiosink), "sync", FALSE, NULL);
-
-    gst_bus_add_watch (gst_pipeline_get_bus (GST_PIPELINE (tvplayer->gst_pipeline)),
-                       bus_call, tvplayer);
-
-    gst_bin_add_many (GST_BIN (pipeline), source, parser, videoqueue,
-    			videodec, videosink, audioqueue, audiodec, audioconv, audiosink, NULL);
-
-    {
-//        GstCaps *rtpcaps = gst_caps_new_simple ("application/x-rtp", NULL);
-//        gst_element_link_filtered(source, parser, rtpcaps);
-    }
-    
-    gst_element_link (source, parser);
-    gst_element_link_many (videoqueue, videodec, videosink, NULL);
-    gst_element_link_many (audioqueue, audiodec, audioconv, audiosink, NULL);
-    
-    g_signal_connect (parser, "pad-added", G_CALLBACK (new_pad_cb), tvplayer);
-    
-    return TRUE;
-}
-
-/** Configures the backend and the tv player 
- * for playing the recorded content A/V.
- *
- * FIXME: Change filename to program info or other structure about the recorded
- *
- * @param tvplayer the object instance.
- * @param filename the file uri of the recorded content to be played.
- * @return TRUE if successfull, FALSE if any error happens.
- */
-gboolean
-gmyth_tvplayer_record_setup (GMythTVPlayer *tvplayer, gchar *filename)
-{
-	GMythSettings *msettings = gmyth_context_get_settings();
-	
-	// FIXME: we should receive the uri instead of filename
-	GString *hostname = gmyth_settings_get_backend_hostname (msettings);
-	int port = gmyth_settings_get_backend_port(msettings);
-	
-	GString *fullpath = g_string_new ("myth://");
-	g_string_append_printf (fullpath, "%s:%d/%s", hostname->str, port, filename);
-	
-	tvplayer->is_livetv = FALSE;
-
-	g_debug ("[%s] Setting record uri to gstreamer pipeline to %s", __FUNCTION__, fullpath->str);
-		
-    g_object_set (G_OBJECT (tvplayer->gst_source), "location",
-          fullpath->str, NULL);
-          
-    return TRUE;
-}
-
-/** Configures the backend and the tv player 
- * for playing the live tv.
- *
- * @param tvplayer the object instance.
- * @return TRUE if successfull, FALSE if any error happens.
- */
-gboolean
-gmyth_tvplayer_livetv_setup (GMythTVPlayer *tvplayer)
-{
-	GMythSettings *msettings = gmyth_context_get_settings ();
-	gboolean res = TRUE;
-
-	res = gmyth_context_check_connection();
-	if (!res) {
-		g_warning ("[%s] LiveTV can not connect to backend", __FUNCTION__);	
-		res = FALSE;
-		goto error;
-	}
-
-	tvplayer->backend_hostname = gmyth_settings_get_backend_hostname(msettings);
-	tvplayer->backend_port = gmyth_settings_get_backend_port (msettings);
-
-	tvplayer->local_hostname  = g_string_new("");    
-	gmyth_context_get_local_hostname (tvplayer->local_hostname);
-
-	if ( tvplayer->local_hostname == NULL ) {
-		res = FALSE;
-		goto error;
-	}
-
-	// Gets the remote encoder num
-	tvplayer->remote_encoder = remote_request_next_free_recorder (-1);
-
-	if ( tvplayer->remote_encoder == NULL ) {
-		g_warning ("[%s] None remote encoder available", __FUNCTION__);
-		res = FALSE;
-		goto error;
-	}
-
-	// Creates livetv chain handler
-	tvplayer->tvchain = GMYTH_TVCHAIN ( g_object_new(GMYTH_TVCHAIN_TYPE, NULL) );
-	gmyth_tvchain_initialize ( tvplayer->tvchain, tvplayer->local_hostname );
-
-	if ( tvplayer->tvchain == NULL || tvplayer->tvchain->tvchain_id == NULL ) {
-		res = FALSE;
-		goto error;
-	}
-
-	// Init remote encoder. Opens its control socket.
-	res = gmyth_remote_encoder_setup(tvplayer->remote_encoder);
-	if ( !res ) {
-		g_warning ("[%s] Fail while setting remote encoder\n", __FUNCTION__);
-		res = FALSE;
-		goto error;
-	}
-	// Spawn live tv. Uses the socket to send mythprotocol data to start livetv in the backend (remotelly)
-	res = gmyth_remote_encoder_spawntv ( tvplayer->remote_encoder,
-			gmyth_tvchain_get_id(tvplayer->tvchain) );
-	if (!res) {
-		g_warning ("[%s] Fail while spawn tv\n", __FUNCTION__);
-		res = FALSE;
-		goto error;
-	}
-
-	// Reload all TV chain from Mysql database.
-	gmyth_tvchain_reload_all (tvplayer->tvchain);
-
-	if ( tvplayer->tvchain == NULL ) {
-		res = FALSE;
-		goto error;
-	}
-
-	// Get program info from database using chanid and starttime
-	tvplayer->proginfo = gmyth_tvchain_get_program_at (tvplayer->tvchain, -1);
-	if ( tvplayer->proginfo == NULL ) {
-		g_warning ("[%s] LiveTV not successfully started.\n", __FUNCTION__ );
-		res = FALSE;
-		goto error;
-	} else {
-		g_debug ("[%s] MythLiveTV: All requests to backend to start TV were OK.\n", __FUNCTION__ );
-	}
-
-	return res;
-
-error:
-	if ( tvplayer->backend_hostname != NULL ) {
-		g_string_free( tvplayer->backend_hostname, TRUE );
-		res = FALSE;
-	}
-
-	if ( tvplayer->local_hostname != NULL ) {
-		g_string_free( tvplayer->local_hostname, TRUE );
-		res = FALSE;
-	}
-
-	if ( tvplayer->remote_encoder != NULL ) {
-		g_object_unref (tvplayer->remote_encoder);
-		tvplayer->remote_encoder = NULL;
-	}
-
-	if ( tvplayer->tvchain != NULL ) {
-		g_object_unref (tvplayer->tvchain);
-		tvplayer->tvchain = NULL;
-	}
-
-	if ( tvplayer->proginfo != NULL ) {
-		g_object_unref (tvplayer->proginfo);
-		tvplayer->proginfo = NULL;
-	}
-
-	return res;
-
-}
-
-/** Sets the GTK video widget for the tv player. 
- *
- * @param tvplayer the object instance.
- * @param videow the GTK video window.
- * @return TRUE if successfull, FALSE if any error happens.
- */
-gboolean
-gmyth_tvplayer_set_widget (GMythTVPlayer *tvplayer, GtkWidget *videow)
-{
-	tvplayer->videow = videow;
-	g_object_ref (videow);
-	
-	g_debug ("[%s] Setting widget for tv player render", __FUNCTION__);
-	
-    tvplayer->expose_handler = g_signal_connect (tvplayer->videow, "expose-event", 
-                                                 G_CALLBACK (expose_cb), tvplayer);
-
-    //g_signal_connect(miptv_ui->videow, "size_request", G_CALLBACK(cb_preferred_video_size), miptv_ui);
-
-    return TRUE;
-}
-
-static gboolean
-bus_call (GstBus * bus, GstMessage * msg, gpointer data)
-{
-    //GMythTVPlayer *tvplayer = GMYTH_TVPLAYER ( data );
-    //GMainLoop *loop = tvplayer->loop;
-
-    switch (GST_MESSAGE_TYPE (msg)) {
-        case GST_MESSAGE_EOS:
-			printf ("End of stream\n");
-            //g_idle_add ((GSourceFunc) idle_eos, data);
-            gst_element_set_state ( GST_ELEMENT (GST_MESSAGE_SRC (msg)), GST_STATE_NULL );
-	    gst_element_set_locked_state ( GST_ELEMENT (GST_MESSAGE_SRC (msg)), FALSE );
-            break;
-        case GST_MESSAGE_ERROR:
-        {
-                gchar *debug;
-                GError *err;
-
-                gst_message_parse_error (msg, &err, &debug);
-                g_free (debug);
-
-                printf ("Error: %s\n", err->message);
-                g_error_free (err);
-
-                //g_main_loop_quit (loop);
-        }
-            break;
-        default:
-            printf (gst_message_type_get_name (GST_MESSAGE_TYPE (msg)));
-            printf ("\n");
-            break;
-    }
-
-    return TRUE;
-}
-
-
-#if 0
-static gboolean
-idle_state (gpointer data)
-{
-    GstPlayerWindowStateChange *st = data;
-
-    if (st->old_state == GST_STATE_PLAYING) {
-        if (st->miptv_ui->idle_id != 0) {
-            g_source_remove (st->miptv_ui->idle_id);
-            st->miptv_ui->idle_id = 0;
-        }
-    }
-    else if (st->new_state == GST_STATE_PLAYING) {
-        if (st->miptv_ui->idle_id != 0)
-            g_source_remove (st->miptv_ui->idle_id);
-
-        st->miptv_ui->idle_id = g_idle_add (cb_iterate, st->miptv_ui);
-    }
-
-    /* new movie loaded? */
-    if (st->old_state == GST_STATE_READY && st->new_state > GST_STATE_READY) {
-
-        /* gboolean have_video = FALSE; */
-
-        gtk_widget_show (st->miptv_ui->videow);
-
-        gtk_window_resize (GTK_WINDOW (st->miptv_ui->main_window), 1, 1);
-
-    }
-
-    /* discarded movie? */
-    if (st->old_state > GST_STATE_READY && st->new_state == GST_STATE_READY) {
-
-        if (st->miptv_ui->tagcache) {
-            gst_tag_list_free (st->miptv_ui->tagcache);
-            st->miptv_ui->tagcache = NULL;
-        }
-    }
-
-    gst_object_unref (GST_OBJECT (st->play));
-    //g_object_unref (G_OBJECT (st->win));
-    g_free (st);
-
-    /* once */
-    return FALSE;
-}
-
-#endif
-
-/** Stops playing the current A/V.
- *
- * FIXME: How to proceed differently between livetv 
- * and recorded content?
- *
- * @param tvplayer the object instance.
- * @return void 
- */
-void
-gmyth_tvplayer_stop_playing (GMythTVPlayer *tvplayer) 
-{
-    g_debug ("[%s] Setting gstreamer pipeline state to NULL", __FUNCTION__);
-
-    gst_element_set_state (tvplayer->gst_pipeline, GST_STATE_NULL);
-    
-    if (tvplayer->is_livetv) {
-	    if (!gmyth_remote_encoder_stop_livetv (tvplayer->remote_encoder)) {
-	    	g_warning ("[%s] Error while stoping remote encoder", __FUNCTION__);	
-	    }
-    }
-}
-
-/** Queries if the tvplayer is active playing A/V content.
- *
- * @param tvplayer the object instance.
- * @return TRUE if the tvplayer is active, FALSE otherwise.
- */
-gboolean
-gmyth_tvplayer_is_playing (GMythTVPlayer *tvplayer)
-{
-	return (GST_STATE (tvplayer->gst_pipeline) == GST_STATE_PLAYING);
-}
-
-/** Static function that sets the tvplayer state to PLAYING.
- *
- * @param tvplayer the object instance.
- * @return TRUE if the tvplayer is active, FALSE otherwise.
- */
-static gboolean
-idle_play (gpointer data)
-{
-    GMythTVPlayer *tvplayer = GMYTH_TVPLAYER (data);
-
-	g_debug ("GMythTVPlayer: Setting pipeline state to PLAYING\n");
-
-    gst_element_set_state (tvplayer->gst_pipeline, GST_STATE_PLAYING);
-
-    return FALSE;
-}
-
-/** Start playing A/V with the tvplayer attributes.
- *
- * @param tvplayer the object instance.
- */
-void
-gmyth_tvplayer_start_playing (GMythTVPlayer *tvplayer)
-{
-
-	// FIXME: Move this to livetv_setup??
-	if (tvplayer->is_livetv) {
-
-	#if 0
-		if (!tvplayer || !(tvplayer->proginfo) || !(tvplayer->local_hostname)
-				|| !(tvplayer->gst_source)) {
-			g_warning ("GMythtvPlayer not ready to start playing\n");		
-		}
-
-		if (!(tvplayer->proginfo->pathname)) {
-			g_warning ("[%s] Playback url is null, could not play the myth content", __FUNCTION__);
-			return;
-		}
-
-		g_debug ("GMythTVPlayer: Start playing %s", tvplayer->proginfo->pathname->str);
-#endif
-		g_object_set (G_OBJECT (tvplayer->gst_source), "mythtv-live",
-				TRUE, NULL);
-#if 0
-		if ( tvplayer->tvchain != NULL ) {
-			GString *str_chainid = gmyth_tvchain_get_id(tvplayer->tvchain);
-			g_print( "[%s]\tCHAIN ID: %s\n", __FUNCTION__, str_chainid->str );
-
-			g_object_set (G_OBJECT (tvplayer->gst_source), "mythtv-live-chainid", 
-					g_strdup( str_chainid->str ), NULL);      
-			if ( str_chainid!=NULL)
-				g_string_free( str_chainid, FALSE );
-		}
-
-		if ( tvplayer->remote_encoder != NULL )	
-			g_object_set (G_OBJECT (tvplayer->gst_source), "mythtv-live-id",
-					tvplayer->remote_encoder->recorder_num, NULL );
-		g_debug ("[%s] Setting location to %s", __FUNCTION__, 
-				tvplayer->proginfo->pathname->str);
-
-		/* Sets the gstreamer properties acording to the service access address */
-		g_object_set (G_OBJECT (tvplayer->gst_source), "location",
-				tvplayer->proginfo->pathname->str, NULL);              
-#endif
-	}
-
-	g_object_set (G_OBJECT (tvplayer->gst_source), "mythtv-version",
-              MYTHTV_VERSION_DEFAULT, NULL);
-
-    g_object_set (G_OBJECT (tvplayer->gst_source), "mythtv-debug",
-              TRUE, NULL);
-
-    g_idle_add (idle_play, tvplayer);
-
-}
-
diff -r 7c409a042a9a -r 7174e23f7617 gmyth/src/gmyth_tvplayer.h
--- a/gmyth/src/gmyth_tvplayer.h	Thu Sep 28 15:57:27 2006 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,112 +0,0 @@
-/**
- * GMyth Library
- *
- * @file gmyth/gmyth_tvplayer.h
- * 
- * @brief <p> This component provides playback of the remote A/V using
- * GStreamer.
- * 
- * Copyright (C) 2006 INdT - Instituto Nokia de Tecnologia.
- * @author Hallyson Luiz de Morais Melo <hallyson.melo@indt.org.br>
- *
- *//*
- * 
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-#ifndef GMYTH_TVPLAYER_H_
-#define GMYTH_TVPLAYER_H_
-
-#include <glib-object.h>
-#include <gtk/gtk.h>
-
-/* GStreamer includes */
-#include <gst/gst.h>
-#include <gst/interfaces/xoverlay.h>
-
-#include "gmyth_remote_encoder.h"
-#include "gmyth_tvchain.h"
-#include "gmyth_common.h"
-
-G_BEGIN_DECLS
-
-#define GMYTH_TVPLAYER_TYPE               (gmyth_tvplayer_get_type ())
-#define GMYTH_TVPLAYER(obj)               (G_TYPE_CHECK_INSTANCE_CAST ((obj), GMYTH_TVPLAYER_TYPE, GMythTVPlayer))
-#define GMYTH_TVPLAYER_CLASS(klass)       (G_TYPE_CHECK_CLASS_CAST ((klass), GMYTH_TVPLAYER_TYPE, GMythTVPlayerClass))
-#define IS_GMYTH_TVPLAYER(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), GMYTH_TVPLAYER_TYPE))
-#define IS_GMYTH_TVPLAYER_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), GMYTH_TVPLAYER_TYPE))
-#define GMYTH_TVPLAYER_GET_CLASS(obj)     (G_TYPE_INSTANCE_GET_CLASS ((obj), GMYTH_TVPLAYER_TYPE, GMythTVPlayerClass))
-
-
-typedef struct _GMythTVPlayer         GMythTVPlayer;
-typedef struct _GMythTVPlayerClass    GMythTVPlayerClass;
-
-struct _GMythTVPlayerClass
-{
-    GObjectClass parent_class;
-
-      /* callbacks */
-      /*  no one for now */
-};
-
-struct _GMythTVPlayer
-{
-    GObject parent;
-    
-    GstElement *gst_pipeline;
-    GstElement *gst_source;
-    GstElement *gst_videodec;
-    GstElement *gst_videosink;
-    GstElement *videoqueue;
-    GstElement *audioqueue;
-    
-    gulong expose_handler;
-//    GMainLoop *loop;
-    
-    GtkWidget *videow;
-
-	/* Backend connection related variables */
-	GString *backend_hostname;
-	gint backend_port;
-	GString *local_hostname;
-
-	GMythRemoteEncoder *remote_encoder;
-	GMythTVChain *tvchain;
-	GMythProgramInfo *proginfo;
-	
-	gboolean is_livetv;
-};
-
-
-GType          gmyth_tvplayer_get_type (void);
-
-GMythTVPlayer* gmyth_tvplayer_new ();
-gboolean       gmyth_tvplayer_initialize (GMythTVPlayer *tvplayer);
-
-void           gmyth_tvplayer_start_playing   (GMythTVPlayer *tvplayer);
-void           gmyth_tvplayer_stop_playing    (GMythTVPlayer *tvplayer);
-
-gboolean       gmyth_tvplayer_set_widget   (GMythTVPlayer *tvplayer, 
-                                            GtkWidget *videow);
-
-gboolean       gmyth_tvplayer_is_playing   (GMythTVPlayer *tvplayer);
-
-gboolean       gmyth_tvplayer_record_setup (GMythTVPlayer *tvplayer, 
-                                            gchar *filename);
-gboolean       gmyth_tvplayer_livetv_setup (GMythTVPlayer *tvplayer);
-
-G_END_DECLS
-
-#endif /*GMYTH_TVPLAYER_H_*/
diff -r 7c409a042a9a -r 7174e23f7617 gmyth/src/mmyth_main.c
--- a/gmyth/src/mmyth_main.c	Thu Sep 28 15:57:27 2006 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,103 +0,0 @@
-
-#include <gtk/gtk.h>
-
-#include "config.h"
-
-#ifdef MAEMO_PLATFORM
-#include "hildon-widgets/hildon-program.h"
-#include "hildon-widgets/hildon-window.h"
-#endif
-
-#include "gmyth_remote_encoder.h"
-#include "gmyth_settings.h"
-#include "gmyth_context.h"
-#include "gmyth_tvchain.h"
-#include "gmyth_tvplayer.h"
-#include "gmyth_remote_util.h"
-
-#include "mmyth_ui.h"
-
-static void
-cb_destroy (GtkWidget * widget, gpointer data)
-{
-    MMythUi *mmyth_ui = (MMythUi *) data;
-
-    if (mmyth_ui->tvplayer != NULL) {
-    	if (gmyth_tvplayer_is_playing (mmyth_ui->tvplayer) )
-    		gmyth_tvplayer_stop_playing (mmyth_ui->tvplayer);
-    }
-
-	mmyth_ui_finalize (mmyth_ui);
-	
-    gtk_main_quit ();
-}
-
-#ifdef NDEBUG
-static void
-debug_error_func( const gchar*log_domain, GLogLevelFlags log_level, const gchar *message,
-	gpointer user_data )
-
-{
-	/* leave this with NO print out messages, once you need to disable debug messages! */
-	//g_print ( "[%s] DEBUG messages disabled!\n", __FUNCTION__ );
-}
-#endif
-
-gint
-main (gint argc, gchar * argv[])
-{
-    GtkWidget *window;
-    MMythUi *mmyth_ui;
-#ifdef MAEMO_PLATFORM
-    HildonProgram *program = NULL;
-#endif
-
-    /* init threads */
-    g_thread_init (NULL);
-
-    /* Initializes GTK */
-    gtk_init (&argc, &argv);
-    gst_init (&argc, &argv);
-#ifdef NDEBUG
- g_log_set_default_handler( debug_error_func, NULL );
-#endif
-
-    /* Init libmmyth context */
-    gmyth_context_initialize ();
-	
-#ifndef MAEMO_PLATFORM
-    /* create the main window */
-    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
-    gtk_widget_set_size_request (window, MAIN_WINDOW_WIDTH, MAIN_WINDOW_HEIGHT);
-    gtk_window_set_title (GTK_WINDOW (window), "Mythtv Frontend");
-#else
-    /* Creating Hildonized main view */
-    program = HILDON_PROGRAM(hildon_program_get_instance());
-    window = hildon_window_new();
-
-    //g_signal_connect(G_OBJECT(window), "delete_event", gtk_main_quit, NULL);
-
-    hildon_program_add_window(program, HILDON_WINDOW (window));
-    g_set_application_name("Maemo Mythtv"); 
-#endif
-   
-    /* Initializes MMyth Widgets */
-#ifdef MAEMO_PLATFORM
-    mmyth_ui = mmyth_ui_initialize (program, window);
-#else    
-    mmyth_ui = mmyth_ui_initialize (window);
-#endif
-    
-    //mmyth_ui->loop = g_main_loop_new (NULL, FALSE);
-
-    /* Connect destroy signal handling */
-    g_signal_connect (window, "destroy", G_CALLBACK (cb_destroy), mmyth_ui);
-
-    /* Shows main window and start gtk loop */
-    gtk_widget_show (window);
-
-    gtk_main ();
-
-    return 0;
-}
-
diff -r 7c409a042a9a -r 7174e23f7617 maemo-ui/pixmaps/Makefile.am
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/maemo-ui/pixmaps/Makefile.am	Thu Sep 28 16:02:14 2006 +0100
@@ -0,0 +1,11 @@
+# Adding the application icon
+#icondir = $(datadir)/mmyth/pixmaps
+#icon_DATA = \
+#	mmyth.png
+
+
+# Adding the application resources
+pixmapdir = $(pkgdatadir)/pixmaps
+pixmap_DATA = mmyth_logo.png
+
+EXTRA_DIST = $(pixmap_DATA)
diff -r 7c409a042a9a -r 7174e23f7617 maemo-ui/pixmaps/Makefile.in
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/maemo-ui/pixmaps/Makefile.in	Thu Sep 28 16:02:14 2006 +0100
@@ -0,0 +1,438 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+# Adding the application icon
+#icondir = $(datadir)/mmyth/pixmaps
+#icon_DATA = \
+#	mmyth.png
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = pixmaps
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_doxygen.m4 \
+	$(top_srcdir)/m4/as-version.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+SOURCES =
+DIST_SOURCES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(pixmapdir)"
+pixmapDATA_INSTALL = $(INSTALL_DATA)
+DATA = $(pixmap_DATA)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DOXYGEN_PAPER_SIZE = @DOXYGEN_PAPER_SIZE@
+DX_COND_chi_FALSE = @DX_COND_chi_FALSE@
+DX_COND_chi_TRUE = @DX_COND_chi_TRUE@
+DX_COND_chm_FALSE = @DX_COND_chm_FALSE@
+DX_COND_chm_TRUE = @DX_COND_chm_TRUE@
+DX_COND_doc_FALSE = @DX_COND_doc_FALSE@
+DX_COND_doc_TRUE = @DX_COND_doc_TRUE@
+DX_COND_dot_FALSE = @DX_COND_dot_FALSE@
+DX_COND_dot_TRUE = @DX_COND_dot_TRUE@
+DX_COND_html_FALSE = @DX_COND_html_FALSE@
+DX_COND_html_TRUE = @DX_COND_html_TRUE@
+DX_COND_latex_FALSE = @DX_COND_latex_FALSE@
+DX_COND_latex_TRUE = @DX_COND_latex_TRUE@
+DX_COND_man_FALSE = @DX_COND_man_FALSE@
+DX_COND_man_TRUE = @DX_COND_man_TRUE@
+DX_COND_pdf_FALSE = @DX_COND_pdf_FALSE@
+DX_COND_pdf_TRUE = @DX_COND_pdf_TRUE@
+DX_COND_ps_FALSE = @DX_COND_ps_FALSE@
+DX_COND_ps_TRUE = @DX_COND_ps_TRUE@
+DX_COND_rtf_FALSE = @DX_COND_rtf_FALSE@
+DX_COND_rtf_TRUE = @DX_COND_rtf_TRUE@
+DX_COND_xml_FALSE = @DX_COND_xml_FALSE@
+DX_COND_xml_TRUE = @DX_COND_xml_TRUE@
+DX_CONFIG = @DX_CONFIG@
+DX_DOCDIR = @DX_DOCDIR@
+DX_DOT = @DX_DOT@
+DX_DOXYGEN = @DX_DOXYGEN@
+DX_DVIPS = @DX_DVIPS@
+DX_EGREP = @DX_EGREP@
+DX_ENV = @DX_ENV@
+DX_FLAG_chi = @DX_FLAG_chi@
+DX_FLAG_chm = @DX_FLAG_chm@
+DX_FLAG_doc = @DX_FLAG_doc@
+DX_FLAG_dot = @DX_FLAG_dot@
+DX_FLAG_html = @DX_FLAG_html@
+DX_FLAG_man = @DX_FLAG_man@
+DX_FLAG_pdf = @DX_FLAG_pdf@
+DX_FLAG_ps = @DX_FLAG_ps@
+DX_FLAG_rtf = @DX_FLAG_rtf@
+DX_FLAG_xml = @DX_FLAG_xml@
+DX_HHC = @DX_HHC@
+DX_LATEX = @DX_LATEX@
+DX_MAKEINDEX = @DX_MAKEINDEX@
+DX_PDFLATEX = @DX_PDFLATEX@
+DX_PERL = @DX_PERL@
+DX_PROJECT = @DX_PROJECT@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+F77 = @F77@
+FFLAGS = @FFLAGS@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GMYTH_MAJORMINOR = @GMYTH_MAJORMINOR@
+GMYTH_MAJOR_VERSION = @GMYTH_MAJOR_VERSION@
+GMYTH_MICRO_VERSION = @GMYTH_MICRO_VERSION@
+GMYTH_MINOR_VERSION = @GMYTH_MINOR_VERSION@
+GMYTH_NANO_VERSION = @GMYTH_NANO_VERSION@
+GMYTH_RELEASE = @GMYTH_RELEASE@
+GMYTH_VERSION = @GMYTH_VERSION@
+GOBJECT_CFLAGS = @GOBJECT_CFLAGS@
+GOBJECT_LIBS = @GOBJECT_LIBS@
+GREP = @GREP@
+GSTBASE_CFLAGS = @GSTBASE_CFLAGS@
+GSTBASE_LIBS = @GSTBASE_LIBS@
+GST_CFLAGS = @GST_CFLAGS@
+GST_LIBS = @GST_LIBS@
+GST_MAJORMINOR = @GST_MAJORMINOR@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
+HAVE_PKGCONFIG = @HAVE_PKGCONFIG@
+HILDON_CFLAGS = @HILDON_CFLAGS@
+HILDON_LIBS = @HILDON_LIBS@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBGMYTH_CFLAGS = @LIBGMYTH_CFLAGS@
+LIBGMYTH_LIBS = @LIBGMYTH_LIBS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIBXML_CFLAGS = @LIBXML_CFLAGS@
+LIBXML_LIBS = @LIBXML_LIBS@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAEMO_PLATFORM_FALSE = @MAEMO_PLATFORM_FALSE@
+MAEMO_PLATFORM_TRUE = @MAEMO_PLATFORM_TRUE@
+MAINT = @MAINT@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
+MAKEINFO = @MAKEINFO@
+MYSQL_CFLAGS = @MYSQL_CFLAGS@
+MYSQL_LIBS = @MYSQL_LIBS@
+NDEBUG_FALSE = @NDEBUG_FALSE@
+NDEBUG_TRUE = @NDEBUG_TRUE@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+RANLIB = @RANLIB@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+WITH_GTK_FALSE = @WITH_GTK_FALSE@
+WITH_GTK_TRUE = @WITH_GTK_TRUE@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_F77 = @ac_ct_F77@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
+am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+
+# Adding the application resources
+pixmapdir = $(pkgdatadir)/pixmaps
+pixmap_DATA = mmyth_logo.png
+EXTRA_DIST = $(pixmap_DATA)
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu  pixmaps/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --gnu  pixmaps/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+
+distclean-libtool:
+	-rm -f libtool
+uninstall-info-am:
+install-pixmapDATA: $(pixmap_DATA)
+	@$(NORMAL_INSTALL)
+	test -z "$(pixmapdir)" || $(mkdir_p) "$(DESTDIR)$(pixmapdir)"
+	@list='$(pixmap_DATA)'; for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  f=$(am__strip_dir) \
+	  echo " $(pixmapDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(pixmapdir)/$$f'"; \
+	  $(pixmapDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(pixmapdir)/$$f"; \
+	done
+
+uninstall-pixmapDATA:
+	@$(NORMAL_UNINSTALL)
+	@list='$(pixmap_DATA)'; for p in $$list; do \
+	  f=$(am__strip_dir) \
+	  echo " rm -f '$(DESTDIR)$(pixmapdir)/$$f'"; \
+	  rm -f "$(DESTDIR)$(pixmapdir)/$$f"; \
+	done
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+	list='$(DISTFILES)'; for file in $$list; do \
+	  case $$file in \
+	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+	    $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+	  esac; \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+	    dir="/$$dir"; \
+	    $(mkdir_p) "$(distdir)$$dir"; \
+	  else \
+	    dir=''; \
+	  fi; \
+	  if test -d $$d/$$file; then \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile $(DATA)
+installdirs:
+	for dir in "$(DESTDIR)$(pixmapdir)"; do \
+	  test -z "$$dir" || $(mkdir_p) "$$dir"; \
+	done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-am
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic distclean-libtool
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-pixmapDATA
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-info-am uninstall-pixmapDATA
+
+.PHONY: all all-am check check-am clean clean-generic clean-libtool \
+	distclean distclean-generic distclean-libtool distdir dvi \
+	dvi-am html html-am info info-am install install-am \
+	install-data install-data-am install-exec install-exec-am \
+	install-info install-info-am install-man install-pixmapDATA \
+	install-strip installcheck installcheck-am installdirs \
+	maintainer-clean maintainer-clean-generic mostlyclean \
+	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+	uninstall uninstall-am uninstall-info-am uninstall-pixmapDATA
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff -r 7c409a042a9a -r 7174e23f7617 maemo-ui/pixmaps/mmyth_logo.png
Binary file maemo-ui/pixmaps/mmyth_logo.png has changed
diff -r 7c409a042a9a -r 7174e23f7617 maemo-ui/src/Makefile.am
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/maemo-ui/src/Makefile.am	Thu Sep 28 16:02:14 2006 +0100
@@ -0,0 +1,28 @@
+bin_PROGRAMS = mmyth
+
+mmyth_SOURCES =	\
+		mmyth_main.c			\
+		mmyth_ui.c				\
+		mmyth_uicommon.c		\
+		mmyth_epg_grid_view.c	\
+		mmyth_epg_grid_widget.c	\
+		mmyth_recordui.c		\
+		mmyth_uisettings.c		\
+		mmyth_schedulerui.c		\
+		mmyth_tvplayer.c
+
+mmyth_CFLAGS = \
+		$(GTK_CFLAGS) \
+		$(GLIB_CFLAGS) \
+		$(GST_CFLAGS) \
+		$(MYSQL_CFLAGS) \
+		$(LIBGMYTH_CFLAGS) \
+		-I$(top_srcdir)/src \
+		-DDATA_DIR=\""$(pkgdatadir)"\" \
+		-DPIX_DIR=\""$(pkgdatadir)/pixmaps/"\" \
+		-DICON_DIR=\""$(datadir)/pixmaps/"\" \
+		-g3 -O0
+
+mmyth_LDADD = 	\
+		$(LIBGMYTH_LIBS)
+
diff -r 7c409a042a9a -r 7174e23f7617 maemo-ui/src/Makefile.in
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/maemo-ui/src/Makefile.in	Thu Sep 28 16:02:14 2006 +0100
@@ -0,0 +1,699 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+bin_PROGRAMS = mmyth$(EXEEXT)
+subdir = src
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_doxygen.m4 \
+	$(top_srcdir)/m4/as-version.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+am__installdirs = "$(DESTDIR)$(bindir)"
+binPROGRAMS_INSTALL = $(INSTALL_PROGRAM)
+PROGRAMS = $(bin_PROGRAMS)
+am_mmyth_OBJECTS = mmyth-mmyth_main.$(OBJEXT) mmyth-mmyth_ui.$(OBJEXT) \
+	mmyth-mmyth_uicommon.$(OBJEXT) \
+	mmyth-mmyth_epg_grid_view.$(OBJEXT) \
+	mmyth-mmyth_epg_grid_widget.$(OBJEXT) \
+	mmyth-mmyth_recordui.$(OBJEXT) \
+	mmyth-mmyth_uisettings.$(OBJEXT) \
+	mmyth-mmyth_schedulerui.$(OBJEXT) \
+	mmyth-mmyth_tvplayer.$(OBJEXT)
+mmyth_OBJECTS = $(am_mmyth_OBJECTS)
+am__DEPENDENCIES_1 =
+mmyth_DEPENDENCIES = $(am__DEPENDENCIES_1)
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+	$(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(mmyth_SOURCES)
+DIST_SOURCES = $(mmyth_SOURCES)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DOXYGEN_PAPER_SIZE = @DOXYGEN_PAPER_SIZE@
+DX_COND_chi_FALSE = @DX_COND_chi_FALSE@
+DX_COND_chi_TRUE = @DX_COND_chi_TRUE@
+DX_COND_chm_FALSE = @DX_COND_chm_FALSE@
+DX_COND_chm_TRUE = @DX_COND_chm_TRUE@
+DX_COND_doc_FALSE = @DX_COND_doc_FALSE@
+DX_COND_doc_TRUE = @DX_COND_doc_TRUE@
+DX_COND_dot_FALSE = @DX_COND_dot_FALSE@
+DX_COND_dot_TRUE = @DX_COND_dot_TRUE@
+DX_COND_html_FALSE = @DX_COND_html_FALSE@
+DX_COND_html_TRUE = @DX_COND_html_TRUE@
+DX_COND_latex_FALSE = @DX_COND_latex_FALSE@
+DX_COND_latex_TRUE = @DX_COND_latex_TRUE@
+DX_COND_man_FALSE = @DX_COND_man_FALSE@
+DX_COND_man_TRUE = @DX_COND_man_TRUE@
+DX_COND_pdf_FALSE = @DX_COND_pdf_FALSE@
+DX_COND_pdf_TRUE = @DX_COND_pdf_TRUE@
+DX_COND_ps_FALSE = @DX_COND_ps_FALSE@
+DX_COND_ps_TRUE = @DX_COND_ps_TRUE@
+DX_COND_rtf_FALSE = @DX_COND_rtf_FALSE@
+DX_COND_rtf_TRUE = @DX_COND_rtf_TRUE@
+DX_COND_xml_FALSE = @DX_COND_xml_FALSE@
+DX_COND_xml_TRUE = @DX_COND_xml_TRUE@
+DX_CONFIG = @DX_CONFIG@
+DX_DOCDIR = @DX_DOCDIR@
+DX_DOT = @DX_DOT@
+DX_DOXYGEN = @DX_DOXYGEN@
+DX_DVIPS = @DX_DVIPS@
+DX_EGREP = @DX_EGREP@
+DX_ENV = @DX_ENV@
+DX_FLAG_chi = @DX_FLAG_chi@
+DX_FLAG_chm = @DX_FLAG_chm@
+DX_FLAG_doc = @DX_FLAG_doc@
+DX_FLAG_dot = @DX_FLAG_dot@
+DX_FLAG_html = @DX_FLAG_html@
+DX_FLAG_man = @DX_FLAG_man@
+DX_FLAG_pdf = @DX_FLAG_pdf@
+DX_FLAG_ps = @DX_FLAG_ps@
+DX_FLAG_rtf = @DX_FLAG_rtf@
+DX_FLAG_xml = @DX_FLAG_xml@
+DX_HHC = @DX_HHC@
+DX_LATEX = @DX_LATEX@
+DX_MAKEINDEX = @DX_MAKEINDEX@
+DX_PDFLATEX = @DX_PDFLATEX@
+DX_PERL = @DX_PERL@
+DX_PROJECT = @DX_PROJECT@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+F77 = @F77@
+FFLAGS = @FFLAGS@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GMYTH_MAJORMINOR = @GMYTH_MAJORMINOR@
+GMYTH_MAJOR_VERSION = @GMYTH_MAJOR_VERSION@
+GMYTH_MICRO_VERSION = @GMYTH_MICRO_VERSION@
+GMYTH_MINOR_VERSION = @GMYTH_MINOR_VERSION@
+GMYTH_NANO_VERSION = @GMYTH_NANO_VERSION@
+GMYTH_RELEASE = @GMYTH_RELEASE@
+GMYTH_VERSION = @GMYTH_VERSION@
+GOBJECT_CFLAGS = @GOBJECT_CFLAGS@
+GOBJECT_LIBS = @GOBJECT_LIBS@
+GREP = @GREP@
+GSTBASE_CFLAGS = @GSTBASE_CFLAGS@
+GSTBASE_LIBS = @GSTBASE_LIBS@
+GST_CFLAGS = @GST_CFLAGS@
+GST_LIBS = @GST_LIBS@
+GST_MAJORMINOR = @GST_MAJORMINOR@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
+HAVE_PKGCONFIG = @HAVE_PKGCONFIG@
+HILDON_CFLAGS = @HILDON_CFLAGS@
+HILDON_LIBS = @HILDON_LIBS@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBGMYTH_CFLAGS = @LIBGMYTH_CFLAGS@
+LIBGMYTH_LIBS = @LIBGMYTH_LIBS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIBXML_CFLAGS = @LIBXML_CFLAGS@
+LIBXML_LIBS = @LIBXML_LIBS@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAEMO_PLATFORM_FALSE = @MAEMO_PLATFORM_FALSE@
+MAEMO_PLATFORM_TRUE = @MAEMO_PLATFORM_TRUE@
+MAINT = @MAINT@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
+MAKEINFO = @MAKEINFO@
+MYSQL_CFLAGS = @MYSQL_CFLAGS@
+MYSQL_LIBS = @MYSQL_LIBS@
+NDEBUG_FALSE = @NDEBUG_FALSE@
+NDEBUG_TRUE = @NDEBUG_TRUE@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+RANLIB = @RANLIB@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+WITH_GTK_FALSE = @WITH_GTK_FALSE@
+WITH_GTK_TRUE = @WITH_GTK_TRUE@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_F77 = @ac_ct_F77@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
+am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+mmyth_SOURCES = \
+		mmyth_main.c			\
+		mmyth_ui.c				\
+		mmyth_uicommon.c		\
+		mmyth_epg_grid_view.c	\
+		mmyth_epg_grid_widget.c	\
+		mmyth_recordui.c		\
+		mmyth_uisettings.c		\
+		mmyth_schedulerui.c		\
+		mmyth_tvplayer.c
+
+mmyth_CFLAGS = \
+		$(GTK_CFLAGS) \
+		$(GLIB_CFLAGS) \
+		$(GST_CFLAGS) \
+		$(MYSQL_CFLAGS) \
+		$(LIBGMYTH_CFLAGS) \
+		-I$(top_srcdir)/src \
+		-DDATA_DIR=\""$(pkgdatadir)"\" \
+		-DPIX_DIR=\""$(pkgdatadir)/pixmaps/"\" \
+		-DICON_DIR=\""$(datadir)/pixmaps/"\" \
+		-g3 -O0
+
+mmyth_LDADD = \
+		$(LIBGMYTH_LIBS)
+
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .lo .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu  src/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --gnu  src/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+install-binPROGRAMS: $(bin_PROGRAMS)
+	@$(NORMAL_INSTALL)
+	test -z "$(bindir)" || $(mkdir_p) "$(DESTDIR)$(bindir)"
+	@list='$(bin_PROGRAMS)'; for p in $$list; do \
+	  p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+	  if test -f $$p \
+	     || test -f $$p1 \
+	  ; then \
+	    f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \
+	   echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \
+	   $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \
+	  else :; fi; \
+	done
+
+uninstall-binPROGRAMS:
+	@$(NORMAL_UNINSTALL)
+	@list='$(bin_PROGRAMS)'; for p in $$list; do \
+	  f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \
+	  echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \
+	  rm -f "$(DESTDIR)$(bindir)/$$f"; \
+	done
+
+clean-binPROGRAMS:
+	@list='$(bin_PROGRAMS)'; for p in $$list; do \
+	  f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+	  echo " rm -f $$p $$f"; \
+	  rm -f $$p $$f ; \
+	done
+mmyth$(EXEEXT): $(mmyth_OBJECTS) $(mmyth_DEPENDENCIES) 
+	@rm -f mmyth$(EXEEXT)
+	$(LINK) $(mmyth_LDFLAGS) $(mmyth_OBJECTS) $(mmyth_LDADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mmyth-mmyth_epg_grid_view.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mmyth-mmyth_epg_grid_widget.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mmyth-mmyth_main.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mmyth-mmyth_recordui.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mmyth-mmyth_schedulerui.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mmyth-mmyth_tvplayer.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mmyth-mmyth_ui.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mmyth-mmyth_uicommon.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mmyth-mmyth_uisettings.Po@am__quote@
+
+.c.o:
+@am__fastdepCC_TRUE@	if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(COMPILE) -c $<
+
+.c.obj:
+@am__fastdepCC_TRUE@	if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(COMPILE) -c `$(CYGPATH_W) '$<'`
+
+.c.lo:
+@am__fastdepCC_TRUE@	if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(LTCOMPILE) -c -o $@ $<
+
+mmyth-mmyth_main.o: mmyth_main.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mmyth_CFLAGS) $(CFLAGS) -MT mmyth-mmyth_main.o -MD -MP -MF "$(DEPDIR)/mmyth-mmyth_main.Tpo" -c -o mmyth-mmyth_main.o `test -f 'mmyth_main.c' || echo '$(srcdir)/'`mmyth_main.c; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/mmyth-mmyth_main.Tpo" "$(DEPDIR)/mmyth-mmyth_main.Po"; else rm -f "$(DEPDIR)/mmyth-mmyth_main.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='mmyth_main.c' object='mmyth-mmyth_main.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mmyth_CFLAGS) $(CFLAGS) -c -o mmyth-mmyth_main.o `test -f 'mmyth_main.c' || echo '$(srcdir)/'`mmyth_main.c
+
+mmyth-mmyth_main.obj: mmyth_main.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mmyth_CFLAGS) $(CFLAGS) -MT mmyth-mmyth_main.obj -MD -MP -MF "$(DEPDIR)/mmyth-mmyth_main.Tpo" -c -o mmyth-mmyth_main.obj `if test -f 'mmyth_main.c'; then $(CYGPATH_W) 'mmyth_main.c'; else $(CYGPATH_W) '$(srcdir)/mmyth_main.c'; fi`; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/mmyth-mmyth_main.Tpo" "$(DEPDIR)/mmyth-mmyth_main.Po"; else rm -f "$(DEPDIR)/mmyth-mmyth_main.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='mmyth_main.c' object='mmyth-mmyth_main.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mmyth_CFLAGS) $(CFLAGS) -c -o mmyth-mmyth_main.obj `if test -f 'mmyth_main.c'; then $(CYGPATH_W) 'mmyth_main.c'; else $(CYGPATH_W) '$(srcdir)/mmyth_main.c'; fi`
+
+mmyth-mmyth_ui.o: mmyth_ui.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mmyth_CFLAGS) $(CFLAGS) -MT mmyth-mmyth_ui.o -MD -MP -MF "$(DEPDIR)/mmyth-mmyth_ui.Tpo" -c -o mmyth-mmyth_ui.o `test -f 'mmyth_ui.c' || echo '$(srcdir)/'`mmyth_ui.c; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/mmyth-mmyth_ui.Tpo" "$(DEPDIR)/mmyth-mmyth_ui.Po"; else rm -f "$(DEPDIR)/mmyth-mmyth_ui.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='mmyth_ui.c' object='mmyth-mmyth_ui.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mmyth_CFLAGS) $(CFLAGS) -c -o mmyth-mmyth_ui.o `test -f 'mmyth_ui.c' || echo '$(srcdir)/'`mmyth_ui.c
+
+mmyth-mmyth_ui.obj: mmyth_ui.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mmyth_CFLAGS) $(CFLAGS) -MT mmyth-mmyth_ui.obj -MD -MP -MF "$(DEPDIR)/mmyth-mmyth_ui.Tpo" -c -o mmyth-mmyth_ui.obj `if test -f 'mmyth_ui.c'; then $(CYGPATH_W) 'mmyth_ui.c'; else $(CYGPATH_W) '$(srcdir)/mmyth_ui.c'; fi`; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/mmyth-mmyth_ui.Tpo" "$(DEPDIR)/mmyth-mmyth_ui.Po"; else rm -f "$(DEPDIR)/mmyth-mmyth_ui.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='mmyth_ui.c' object='mmyth-mmyth_ui.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mmyth_CFLAGS) $(CFLAGS) -c -o mmyth-mmyth_ui.obj `if test -f 'mmyth_ui.c'; then $(CYGPATH_W) 'mmyth_ui.c'; else $(CYGPATH_W) '$(srcdir)/mmyth_ui.c'; fi`
+
+mmyth-mmyth_uicommon.o: mmyth_uicommon.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mmyth_CFLAGS) $(CFLAGS) -MT mmyth-mmyth_uicommon.o -MD -MP -MF "$(DEPDIR)/mmyth-mmyth_uicommon.Tpo" -c -o mmyth-mmyth_uicommon.o `test -f 'mmyth_uicommon.c' || echo '$(srcdir)/'`mmyth_uicommon.c; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/mmyth-mmyth_uicommon.Tpo" "$(DEPDIR)/mmyth-mmyth_uicommon.Po"; else rm -f "$(DEPDIR)/mmyth-mmyth_uicommon.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='mmyth_uicommon.c' object='mmyth-mmyth_uicommon.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mmyth_CFLAGS) $(CFLAGS) -c -o mmyth-mmyth_uicommon.o `test -f 'mmyth_uicommon.c' || echo '$(srcdir)/'`mmyth_uicommon.c
+
+mmyth-mmyth_uicommon.obj: mmyth_uicommon.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mmyth_CFLAGS) $(CFLAGS) -MT mmyth-mmyth_uicommon.obj -MD -MP -MF "$(DEPDIR)/mmyth-mmyth_uicommon.Tpo" -c -o mmyth-mmyth_uicommon.obj `if test -f 'mmyth_uicommon.c'; then $(CYGPATH_W) 'mmyth_uicommon.c'; else $(CYGPATH_W) '$(srcdir)/mmyth_uicommon.c'; fi`; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/mmyth-mmyth_uicommon.Tpo" "$(DEPDIR)/mmyth-mmyth_uicommon.Po"; else rm -f "$(DEPDIR)/mmyth-mmyth_uicommon.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='mmyth_uicommon.c' object='mmyth-mmyth_uicommon.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mmyth_CFLAGS) $(CFLAGS) -c -o mmyth-mmyth_uicommon.obj `if test -f 'mmyth_uicommon.c'; then $(CYGPATH_W) 'mmyth_uicommon.c'; else $(CYGPATH_W) '$(srcdir)/mmyth_uicommon.c'; fi`
+
+mmyth-mmyth_epg_grid_view.o: mmyth_epg_grid_view.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mmyth_CFLAGS) $(CFLAGS) -MT mmyth-mmyth_epg_grid_view.o -MD -MP -MF "$(DEPDIR)/mmyth-mmyth_epg_grid_view.Tpo" -c -o mmyth-mmyth_epg_grid_view.o `test -f 'mmyth_epg_grid_view.c' || echo '$(srcdir)/'`mmyth_epg_grid_view.c; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/mmyth-mmyth_epg_grid_view.Tpo" "$(DEPDIR)/mmyth-mmyth_epg_grid_view.Po"; else rm -f "$(DEPDIR)/mmyth-mmyth_epg_grid_view.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='mmyth_epg_grid_view.c' object='mmyth-mmyth_epg_grid_view.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mmyth_CFLAGS) $(CFLAGS) -c -o mmyth-mmyth_epg_grid_view.o `test -f 'mmyth_epg_grid_view.c' || echo '$(srcdir)/'`mmyth_epg_grid_view.c
+
+mmyth-mmyth_epg_grid_view.obj: mmyth_epg_grid_view.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mmyth_CFLAGS) $(CFLAGS) -MT mmyth-mmyth_epg_grid_view.obj -MD -MP -MF "$(DEPDIR)/mmyth-mmyth_epg_grid_view.Tpo" -c -o mmyth-mmyth_epg_grid_view.obj `if test -f 'mmyth_epg_grid_view.c'; then $(CYGPATH_W) 'mmyth_epg_grid_view.c'; else $(CYGPATH_W) '$(srcdir)/mmyth_epg_grid_view.c'; fi`; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/mmyth-mmyth_epg_grid_view.Tpo" "$(DEPDIR)/mmyth-mmyth_epg_grid_view.Po"; else rm -f "$(DEPDIR)/mmyth-mmyth_epg_grid_view.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='mmyth_epg_grid_view.c' object='mmyth-mmyth_epg_grid_view.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mmyth_CFLAGS) $(CFLAGS) -c -o mmyth-mmyth_epg_grid_view.obj `if test -f 'mmyth_epg_grid_view.c'; then $(CYGPATH_W) 'mmyth_epg_grid_view.c'; else $(CYGPATH_W) '$(srcdir)/mmyth_epg_grid_view.c'; fi`
+
+mmyth-mmyth_epg_grid_widget.o: mmyth_epg_grid_widget.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mmyth_CFLAGS) $(CFLAGS) -MT mmyth-mmyth_epg_grid_widget.o -MD -MP -MF "$(DEPDIR)/mmyth-mmyth_epg_grid_widget.Tpo" -c -o mmyth-mmyth_epg_grid_widget.o `test -f 'mmyth_epg_grid_widget.c' || echo '$(srcdir)/'`mmyth_epg_grid_widget.c; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/mmyth-mmyth_epg_grid_widget.Tpo" "$(DEPDIR)/mmyth-mmyth_epg_grid_widget.Po"; else rm -f "$(DEPDIR)/mmyth-mmyth_epg_grid_widget.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='mmyth_epg_grid_widget.c' object='mmyth-mmyth_epg_grid_widget.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mmyth_CFLAGS) $(CFLAGS) -c -o mmyth-mmyth_epg_grid_widget.o `test -f 'mmyth_epg_grid_widget.c' || echo '$(srcdir)/'`mmyth_epg_grid_widget.c
+
+mmyth-mmyth_epg_grid_widget.obj: mmyth_epg_grid_widget.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mmyth_CFLAGS) $(CFLAGS) -MT mmyth-mmyth_epg_grid_widget.obj -MD -MP -MF "$(DEPDIR)/mmyth-mmyth_epg_grid_widget.Tpo" -c -o mmyth-mmyth_epg_grid_widget.obj `if test -f 'mmyth_epg_grid_widget.c'; then $(CYGPATH_W) 'mmyth_epg_grid_widget.c'; else $(CYGPATH_W) '$(srcdir)/mmyth_epg_grid_widget.c'; fi`; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/mmyth-mmyth_epg_grid_widget.Tpo" "$(DEPDIR)/mmyth-mmyth_epg_grid_widget.Po"; else rm -f "$(DEPDIR)/mmyth-mmyth_epg_grid_widget.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='mmyth_epg_grid_widget.c' object='mmyth-mmyth_epg_grid_widget.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mmyth_CFLAGS) $(CFLAGS) -c -o mmyth-mmyth_epg_grid_widget.obj `if test -f 'mmyth_epg_grid_widget.c'; then $(CYGPATH_W) 'mmyth_epg_grid_widget.c'; else $(CYGPATH_W) '$(srcdir)/mmyth_epg_grid_widget.c'; fi`
+
+mmyth-mmyth_recordui.o: mmyth_recordui.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mmyth_CFLAGS) $(CFLAGS) -MT mmyth-mmyth_recordui.o -MD -MP -MF "$(DEPDIR)/mmyth-mmyth_recordui.Tpo" -c -o mmyth-mmyth_recordui.o `test -f 'mmyth_recordui.c' || echo '$(srcdir)/'`mmyth_recordui.c; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/mmyth-mmyth_recordui.Tpo" "$(DEPDIR)/mmyth-mmyth_recordui.Po"; else rm -f "$(DEPDIR)/mmyth-mmyth_recordui.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='mmyth_recordui.c' object='mmyth-mmyth_recordui.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mmyth_CFLAGS) $(CFLAGS) -c -o mmyth-mmyth_recordui.o `test -f 'mmyth_recordui.c' || echo '$(srcdir)/'`mmyth_recordui.c
+
+mmyth-mmyth_recordui.obj: mmyth_recordui.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mmyth_CFLAGS) $(CFLAGS) -MT mmyth-mmyth_recordui.obj -MD -MP -MF "$(DEPDIR)/mmyth-mmyth_recordui.Tpo" -c -o mmyth-mmyth_recordui.obj `if test -f 'mmyth_recordui.c'; then $(CYGPATH_W) 'mmyth_recordui.c'; else $(CYGPATH_W) '$(srcdir)/mmyth_recordui.c'; fi`; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/mmyth-mmyth_recordui.Tpo" "$(DEPDIR)/mmyth-mmyth_recordui.Po"; else rm -f "$(DEPDIR)/mmyth-mmyth_recordui.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='mmyth_recordui.c' object='mmyth-mmyth_recordui.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mmyth_CFLAGS) $(CFLAGS) -c -o mmyth-mmyth_recordui.obj `if test -f 'mmyth_recordui.c'; then $(CYGPATH_W) 'mmyth_recordui.c'; else $(CYGPATH_W) '$(srcdir)/mmyth_recordui.c'; fi`
+
+mmyth-mmyth_uisettings.o: mmyth_uisettings.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mmyth_CFLAGS) $(CFLAGS) -MT mmyth-mmyth_uisettings.o -MD -MP -MF "$(DEPDIR)/mmyth-mmyth_uisettings.Tpo" -c -o mmyth-mmyth_uisettings.o `test -f 'mmyth_uisettings.c' || echo '$(srcdir)/'`mmyth_uisettings.c; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/mmyth-mmyth_uisettings.Tpo" "$(DEPDIR)/mmyth-mmyth_uisettings.Po"; else rm -f "$(DEPDIR)/mmyth-mmyth_uisettings.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='mmyth_uisettings.c' object='mmyth-mmyth_uisettings.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mmyth_CFLAGS) $(CFLAGS) -c -o mmyth-mmyth_uisettings.o `test -f 'mmyth_uisettings.c' || echo '$(srcdir)/'`mmyth_uisettings.c
+
+mmyth-mmyth_uisettings.obj: mmyth_uisettings.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mmyth_CFLAGS) $(CFLAGS) -MT mmyth-mmyth_uisettings.obj -MD -MP -MF "$(DEPDIR)/mmyth-mmyth_uisettings.Tpo" -c -o mmyth-mmyth_uisettings.obj `if test -f 'mmyth_uisettings.c'; then $(CYGPATH_W) 'mmyth_uisettings.c'; else $(CYGPATH_W) '$(srcdir)/mmyth_uisettings.c'; fi`; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/mmyth-mmyth_uisettings.Tpo" "$(DEPDIR)/mmyth-mmyth_uisettings.Po"; else rm -f "$(DEPDIR)/mmyth-mmyth_uisettings.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='mmyth_uisettings.c' object='mmyth-mmyth_uisettings.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mmyth_CFLAGS) $(CFLAGS) -c -o mmyth-mmyth_uisettings.obj `if test -f 'mmyth_uisettings.c'; then $(CYGPATH_W) 'mmyth_uisettings.c'; else $(CYGPATH_W) '$(srcdir)/mmyth_uisettings.c'; fi`
+
+mmyth-mmyth_schedulerui.o: mmyth_schedulerui.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mmyth_CFLAGS) $(CFLAGS) -MT mmyth-mmyth_schedulerui.o -MD -MP -MF "$(DEPDIR)/mmyth-mmyth_schedulerui.Tpo" -c -o mmyth-mmyth_schedulerui.o `test -f 'mmyth_schedulerui.c' || echo '$(srcdir)/'`mmyth_schedulerui.c; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/mmyth-mmyth_schedulerui.Tpo" "$(DEPDIR)/mmyth-mmyth_schedulerui.Po"; else rm -f "$(DEPDIR)/mmyth-mmyth_schedulerui.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='mmyth_schedulerui.c' object='mmyth-mmyth_schedulerui.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mmyth_CFLAGS) $(CFLAGS) -c -o mmyth-mmyth_schedulerui.o `test -f 'mmyth_schedulerui.c' || echo '$(srcdir)/'`mmyth_schedulerui.c
+
+mmyth-mmyth_schedulerui.obj: mmyth_schedulerui.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mmyth_CFLAGS) $(CFLAGS) -MT mmyth-mmyth_schedulerui.obj -MD -MP -MF "$(DEPDIR)/mmyth-mmyth_schedulerui.Tpo" -c -o mmyth-mmyth_schedulerui.obj `if test -f 'mmyth_schedulerui.c'; then $(CYGPATH_W) 'mmyth_schedulerui.c'; else $(CYGPATH_W) '$(srcdir)/mmyth_schedulerui.c'; fi`; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/mmyth-mmyth_schedulerui.Tpo" "$(DEPDIR)/mmyth-mmyth_schedulerui.Po"; else rm -f "$(DEPDIR)/mmyth-mmyth_schedulerui.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='mmyth_schedulerui.c' object='mmyth-mmyth_schedulerui.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mmyth_CFLAGS) $(CFLAGS) -c -o mmyth-mmyth_schedulerui.obj `if test -f 'mmyth_schedulerui.c'; then $(CYGPATH_W) 'mmyth_schedulerui.c'; else $(CYGPATH_W) '$(srcdir)/mmyth_schedulerui.c'; fi`
+
+mmyth-mmyth_tvplayer.o: mmyth_tvplayer.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mmyth_CFLAGS) $(CFLAGS) -MT mmyth-mmyth_tvplayer.o -MD -MP -MF "$(DEPDIR)/mmyth-mmyth_tvplayer.Tpo" -c -o mmyth-mmyth_tvplayer.o `test -f 'mmyth_tvplayer.c' || echo '$(srcdir)/'`mmyth_tvplayer.c; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/mmyth-mmyth_tvplayer.Tpo" "$(DEPDIR)/mmyth-mmyth_tvplayer.Po"; else rm -f "$(DEPDIR)/mmyth-mmyth_tvplayer.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='mmyth_tvplayer.c' object='mmyth-mmyth_tvplayer.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mmyth_CFLAGS) $(CFLAGS) -c -o mmyth-mmyth_tvplayer.o `test -f 'mmyth_tvplayer.c' || echo '$(srcdir)/'`mmyth_tvplayer.c
+
+mmyth-mmyth_tvplayer.obj: mmyth_tvplayer.c
+@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mmyth_CFLAGS) $(CFLAGS) -MT mmyth-mmyth_tvplayer.obj -MD -MP -MF "$(DEPDIR)/mmyth-mmyth_tvplayer.Tpo" -c -o mmyth-mmyth_tvplayer.obj `if test -f 'mmyth_tvplayer.c'; then $(CYGPATH_W) 'mmyth_tvplayer.c'; else $(CYGPATH_W) '$(srcdir)/mmyth_tvplayer.c'; fi`; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/mmyth-mmyth_tvplayer.Tpo" "$(DEPDIR)/mmyth-mmyth_tvplayer.Po"; else rm -f "$(DEPDIR)/mmyth-mmyth_tvplayer.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='mmyth_tvplayer.c' object='mmyth-mmyth_tvplayer.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mmyth_CFLAGS) $(CFLAGS) -c -o mmyth-mmyth_tvplayer.obj `if test -f 'mmyth_tvplayer.c'; then $(CYGPATH_W) 'mmyth_tvplayer.c'; else $(CYGPATH_W) '$(srcdir)/mmyth_tvplayer.c'; fi`
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+
+distclean-libtool:
+	-rm -f libtool
+uninstall-info-am:
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	mkid -fID $$unique
+tags: TAGS
+
+TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	    $$tags $$unique; \
+	fi
+ctags: CTAGS
+CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	test -z "$(CTAGS_ARGS)$$tags$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$tags $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && cd $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+	list='$(DISTFILES)'; for file in $$list; do \
+	  case $$file in \
+	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+	    $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+	  esac; \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+	    dir="/$$dir"; \
+	    $(mkdir_p) "$(distdir)$$dir"; \
+	  else \
+	    dir=''; \
+	  fi; \
+	  if test -d $$d/$$file; then \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile $(PROGRAMS)
+installdirs:
+	for dir in "$(DESTDIR)$(bindir)"; do \
+	  test -z "$$dir" || $(mkdir_p) "$$dir"; \
+	done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-libtool distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-exec-am: install-binPROGRAMS
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-binPROGRAMS uninstall-info-am
+
+.PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \
+	clean-generic clean-libtool ctags distclean distclean-compile \
+	distclean-generic distclean-libtool distclean-tags distdir dvi \
+	dvi-am html html-am info info-am install install-am \
+	install-binPROGRAMS install-data install-data-am install-exec \
+	install-exec-am install-info install-info-am install-man \
+	install-strip installcheck installcheck-am installdirs \
+	maintainer-clean maintainer-clean-generic mostlyclean \
+	mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
+	pdf pdf-am ps ps-am tags uninstall uninstall-am \
+	uninstall-binPROGRAMS uninstall-info-am
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff -r 7c409a042a9a -r 7174e23f7617 maemo-ui/src/mmyth_epg_grid_view.c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/maemo-ui/src/mmyth_epg_grid_view.c	Thu Sep 28 16:02:14 2006 +0100
@@ -0,0 +1,213 @@
+#include <string.h>
+#include <stdlib.h>
+#include <gtk/gtk.h>
+#include <gdk/gdkkeysyms.h>
+#include <time.h>
+
+#include "mmyth_epg_grid_view.h"
+#include "mmyth_epg_grid_widget.h"
+
+/* Service genre */
+#define GENRE_MIN               0
+#define GENRE_MAX               10
+#define GENRE_UNDEFINED         0
+#define GENRE_MOVIE             1
+#define GENRE_NEWS              2
+#define GENRE_SHOW              3
+#define GENRE_SPORTS            4
+#define GENRE_CHILDREN          5
+#define GENRE_MUSIC             6
+#define GENRE_CULTURE           7
+#define GENRE_SOCIAL            8
+#define GENRE_EDUCATION         9
+#define GENRE_LEISURE           10
+
+#define NRO_HOURS 3
+
+/* Function prototypes*/
+static void update_service_details(MMythEpgGridWidget *object, 
+                                   gpointer arg1, gpointer user_data);
+static gboolean key_press_epg_grid_view(GtkWidget * widget, 
+                                        GdkEventKey * event, 
+                                        gpointer user_data);
+
+static GtkWidget *mmyth_epg_grid_widget = NULL;
+
+/* is a GtkEventBox */
+static GtkWidget *program_details_area = NULL;
+static GtkWidget *details_main_hbox = NULL;
+static GtkWidget *details_vbox = NULL;
+static GtkWidget *details_logo_vbox = NULL;
+
+/* update signal callback from MMythEpgGridWidget */
+static void
+update_service_details(MMythEpgGridWidget *object, gpointer arg1, gpointer user_data) 
+{
+	g_return_if_fail(arg1 != NULL);
+
+	EpgGridItem *epg_grid_item = (EpgGridItem *) arg1;
+	
+	gchar sel_prog_desc[100] = "<big><b>";
+	gchar time_buffer[50];
+
+    /* FIXME: get first content from content_list*/
+    GMythProgramInfo *proginfo = (GMythProgramInfo *) epg_grid_item->proginfo;
+
+    if(proginfo) {
+        GString *prog_name = proginfo->title;    
+        GString *service_name = proginfo->chanid;
+           
+    	if(details_vbox != NULL)
+  	        gtk_container_remove (GTK_CONTAINER (details_main_hbox), details_vbox);	
+    
+        /* update service description */
+        strcat(sel_prog_desc, service_name->str);
+        strcat(sel_prog_desc, "</b></big>");
+    
+        GtkWidget *fst_line_lbl = gtk_label_new(NULL);
+        gtk_misc_set_alignment (GTK_MISC(fst_line_lbl), 0.0, 0.0); 
+        gtk_label_set_markup(GTK_LABEL(fst_line_lbl), sel_prog_desc);     
+
+        /* freeing char[] */
+        sel_prog_desc[0] = 0;
+        strcat(sel_prog_desc, "\t");
+        strcat(sel_prog_desc, prog_name->str);    
+            	        		
+        struct tm loctime_start, loctime_end;
+    
+        // Convert it to local time representation. 
+        /* FIXME: conversion from time to localtime is different
+        in different machines */
+        long int schedule_start_time = proginfo->startts;
+        long int schedule_end_time   = proginfo->endts;
+    
+        if (localtime_r(&schedule_start_time, &loctime_start) == NULL) {
+            g_warning ("localtime_r error in mmyth_epg_grid_view!\n");
+        }
+    
+        #if 0 
+            fprintf (stderr, asctime (loctime_start)); 
+        #endif
+    
+        strftime (time_buffer, 100, "  %H:%M - ", &loctime_start);
+        strcat(sel_prog_desc, time_buffer );
+    
+        if (localtime_r(&schedule_end_time, &loctime_end) == NULL) {
+            g_warning ("localtime_r error in mmyth_epg_grid_view!\n");
+        }
+
+        #if 0
+            fprintf (stderr, asctime (loctime_end));     		    
+        #endif
+    
+        strftime (time_buffer, 100, "%H:%M\n", &loctime_end);
+        strcat(sel_prog_desc, time_buffer );
+    
+        GtkWidget *snd_line_lbl = gtk_label_new(NULL);
+        gtk_misc_set_alignment (GTK_MISC(snd_line_lbl), 0.0, 0.0); 
+        gtk_label_set_markup(GTK_LABEL(snd_line_lbl), sel_prog_desc);     
+    
+        // add the current selected program description to the label
+        details_vbox = gtk_vbox_new(FALSE, 0);
+        GtkWidget *fst_line_hbox = gtk_hbox_new(FALSE, 0);        
+        
+        gtk_box_pack_start (GTK_BOX (fst_line_hbox),
+                            fst_line_lbl, FALSE, FALSE, 6);
+        gtk_box_pack_start (GTK_BOX (details_vbox),
+                            fst_line_hbox, FALSE, FALSE, 0);
+        gtk_box_pack_start (GTK_BOX (details_vbox),
+                            snd_line_lbl, FALSE, FALSE, 0);
+        gtk_box_pack_start (GTK_BOX (details_main_hbox),
+                            details_vbox, FALSE, FALSE, 0);
+        
+        gtk_widget_show_all(details_main_hbox);
+    }        
+}
+
+/* Callback for hardware keys */
+static gboolean
+key_press_epg_grid_view(GtkWidget * widget, 
+                        GdkEventKey * event, gpointer user_data)
+{
+    MMythEpgGridWidget *mmyth_epg_grid_widget = (MMythEpgGridWidget *) user_data;
+
+    return mmyth_epg_grid_widget_key_press(mmyth_epg_grid_widget, widget, event); 
+}
+
+GtkWidget *
+epg_grid_view_new (MMythUi* mmyth_ui) 
+{
+    GtkWidget *scrolled_window;
+    scrolled_window = gtk_scrolled_window_new (NULL, NULL);
+    gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
+                                    GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);                   
+    
+    gtk_widget_modify_bg(scrolled_window, GTK_STATE_NORMAL, &main_bg_color);  
+    
+    GtkWidget *main_vbox = gtk_vbox_new (FALSE, 0);      
+    //gtk_container_set_border_width(main_vbox, 4);        
+    
+    GtkWidget *details_event_box = gtk_event_box_new();               
+    gtk_widget_modify_bg(details_event_box, GTK_STATE_NORMAL, &main_bg_color);  
+    
+    program_details_area = gtk_vbox_new (FALSE, 0);
+    gtk_container_add (GTK_CONTAINER (details_event_box),
+                       program_details_area);   
+    gtk_container_set_border_width(GTK_CONTAINER (program_details_area), 4);        
+
+	details_main_hbox = gtk_hbox_new (FALSE, 10);    
+
+	gtk_box_pack_start (GTK_BOX (program_details_area),
+	                    details_main_hbox, FALSE, FALSE, 0);                    
+	                    
+	details_logo_vbox = gtk_vbox_new (FALSE, 0);      	 
+    
+	GtkWidget *details_desc_vbox = gtk_vbox_new (FALSE, 0);      
+
+    gtk_box_pack_start (GTK_BOX (details_main_hbox),
+	                    details_desc_vbox, FALSE, FALSE, 0);                    
+    gtk_box_pack_start (GTK_BOX (details_main_hbox),
+	                    details_logo_vbox, FALSE, FALSE, 0);                    	
+	
+    gtk_widget_set_size_request (program_details_area, -1, 120);          
+    
+    mmyth_epg_grid_widget = mmyth_epg_grid_widget_new();
+    g_signal_connect(mmyth_epg_grid_widget, "selection_updated", 
+                     G_CALLBACK (update_service_details), NULL);    
+
+    /* select by default the first service */
+    /* depends on mount services */
+    if (MMYTH_EPG_GRID_WIDGET(mmyth_epg_grid_widget)->epg_view_model) {
+	    GList *fst_service = (GList *) 
+	    	MMYTH_EPG_GRID_WIDGET(mmyth_epg_grid_widget)->epg_view_model->data;
+    	mmyth_epg_grid_widget_update_service(MMYTH_EPG_GRID_WIDGET(mmyth_epg_grid_widget),
+                                         fst_service);
+    }
+    
+    gtk_box_pack_start (GTK_BOX (main_vbox),
+                        details_event_box, FALSE, FALSE, 0); 
+    gtk_box_pack_start (GTK_BOX (main_vbox),
+                        gtk_hseparator_new(), FALSE, FALSE, 0);         
+    gtk_box_pack_start (GTK_BOX (main_vbox),
+                        mmyth_epg_grid_widget, FALSE, FALSE, 0);                    
+
+    gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_window),
+                                           main_vbox);    
+    
+    /* Add hardware button listener to application */
+    g_signal_connect(mmyth_ui->main_window, "key_press_event", 
+                     G_CALLBACK (key_press_epg_grid_view), mmyth_epg_grid_widget);    
+
+    gtk_widget_show_all (scrolled_window);
+    
+    return scrolled_window;
+}
+
+/*
+DVBHScheduleEvent * 
+mmyth_epg_grid_view_get_selected_schedule()
+{
+    return mmyth_epg_grid_get_selected_schedule
+            (MMYTH_EPG_GRID_WIDGET(mmyth_epg_grid_widget));
+}
+*/
diff -r 7c409a042a9a -r 7174e23f7617 maemo-ui/src/mmyth_epg_grid_view.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/maemo-ui/src/mmyth_epg_grid_view.h	Thu Sep 28 16:02:14 2006 +0100
@@ -0,0 +1,8 @@
+#ifndef MMYTH_ESG_GRID_VIEW_H_
+#define MMYTH_ESG_GRID_VIEW_H_
+
+#include "mmyth_ui.h"
+
+GtkWidget *epg_grid_view_new(MMythUi * mmyth_ui);
+
+#endif /* MMYTH_ESG_GRID_VIEW_H_ */
diff -r 7c409a042a9a -r 7174e23f7617 maemo-ui/src/mmyth_epg_grid_widget.c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/maemo-ui/src/mmyth_epg_grid_widget.c	Thu Sep 28 16:02:14 2006 +0100
@@ -0,0 +1,622 @@
+#include <gtk/gtksignal.h>
+#include <gdk/gdkevents.h>
+#include <gdk/gdkkeysyms.h>
+
+#include "mmyth_uicommon.h"
+#include "mmyth_epg_grid_widget.h"
+
+#include "gmyth_util.h" 
+#include "gmyth_epg.h"
+
+#define PIXELS_HOUR 105
+#define PROGRAM_SEPARATION 2
+
+enum {
+  SELECTION_UPDATED_SIGNAL,
+  LAST_SIGNAL
+};
+
+struct _MMythEpgGridWidgetPrivate {
+    /* private widget components */
+    GtkWidget *epg_channels_vbox;
+    GtkWidget *epg_programs_vbox;
+ 
+    GHashTable *service_model_hash;
+    
+    /* guidegrid attributes */
+    gboolean show_favorites;
+    gint current_start_channel_id;
+    
+    time_t current_start_time;
+    time_t current_end_time;
+
+    guint selected_channel_index;
+    
+    /* GList of ProgramInfo for each Channel */
+    GList * program_list[MAX_DISPLAY_CHANS];
+    GList * channel_list;
+    
+    GMythEPG *mmyth_epg;
+    
+    gint DISPLAY_CHANS;
+};
+
+static void mmyth_epg_grid_widget_class_init          (MMythEpgGridWidgetClass *klass);
+static void mmyth_epg_grid_widget_init                (MMythEpgGridWidget *object);
+static void mmyth_epg_grid_widget_private_init        (MMythEpgGridWidgetPrivate *private);
+static void mmyth_epg_grid_widget_mount_services      (MMythEpgGridWidget *object, 
+                                                       int start_time, int end_time);
+static void mmyth_epg_grid_widget_mount_header        (MMythEpgGridWidget *object);
+static void mmyth_epg_grid_widget_clicked             (GtkWidget* widget, 
+                                                       GdkEventExpose *event, 
+                                                       gpointer data);
+static GtkWidget *create_event_box_lbl                (gchar *str, int width, 
+                                                       const GdkColor *bg_color, 
+                                                       const GdkColor *fg_color);
+
+static void mmyth_epg_grid_widget_fill_programinfos(MMythEpgGridWidgetPrivate *private);
+static void mmyth_epg_grid_widget_fill_program_row_infos(
+                    MMythEpgGridWidgetPrivate *private, 
+                    unsigned int chanNum, unsigned int row);
+
+static gint mmyth_epg_grid_widget_signals[LAST_SIGNAL] = { 0 };
+
+G_DEFINE_TYPE(MMythEpgGridWidget, mmyth_epg_grid_widget, GTK_TYPE_EVENT_BOX)
+    
+static void
+mmyth_epg_grid_widget_class_init (MMythEpgGridWidgetClass *klass)
+{
+  g_type_class_add_private (klass, sizeof (MMythEpgGridWidgetPrivate));
+  
+  mmyth_epg_grid_widget_signals[SELECTION_UPDATED_SIGNAL] = g_signal_new (
+                     "selection_updated",
+					 G_TYPE_FROM_CLASS(klass), 
+					 G_SIGNAL_RUN_FIRST,
+					 0,
+                     NULL,
+                     NULL,
+					 g_cclosure_marshal_VOID__POINTER, 
+                     G_TYPE_NONE, 
+                     1,
+                     G_TYPE_POINTER);
+}
+
+static void 
+mmyth_epg_grid_widget_private_init (MMythEpgGridWidgetPrivate *private)
+{
+    time_t cur_time;
+    
+    g_return_if_fail(private != NULL);     
+
+    private->epg_channels_vbox   = NULL;
+    private->epg_programs_vbox   = NULL;
+    private->service_model_hash  = NULL;
+
+    private->show_favorites = FALSE;
+    private->current_start_channel_id = -1;
+
+    /* Selected the first diplayable channel initially */
+    private->selected_channel_index = 0;
+        
+    /* TODO fix the current start/end time */
+    private->current_start_time = time(&cur_time);
+    private->current_end_time = time(&cur_time) + 10800;   
+    
+    private->DISPLAY_CHANS = MAX_DISPLAY_CHANS;
+    
+    // TODO: Close the epg and unref it in dispose call
+    private->mmyth_epg = gmyth_epg_new ();
+    if (!gmyth_epg_connect (private->mmyth_epg)) {
+    	g_warning ("[%s] Could not connect mysql handler to db", __FUNCTION__);
+    	g_object_unref (private->mmyth_epg);
+    	private->mmyth_epg = NULL;
+    }
+}
+
+static void
+mmyth_epg_grid_widget_init (MMythEpgGridWidget *mmyth_epg_grid_widget)
+{
+    MMythEpgGridWidgetPrivate *private = 
+        MMYTH_EPG_GRID_WIDGET_GET_PRIVATE(mmyth_epg_grid_widget);
+    
+    /* init private fields */
+    mmyth_epg_grid_widget_private_init(private);
+
+    mmyth_epg_grid_widget->epg_view_model      = NULL;
+    mmyth_epg_grid_widget->selected_grid_item  = NULL;
+
+    GtkWidget *epg_event_box = GTK_WIDGET(mmyth_epg_grid_widget);
+    gtk_widget_modify_bg(epg_event_box, GTK_STATE_NORMAL, &main_bg_color);
+    gtk_widget_set_size_request (epg_event_box, 0, 125);
+    
+    GtkWidget *epg_main_hbox = gtk_hbox_new (FALSE, 10);
+    gtk_container_set_border_width(GTK_CONTAINER (epg_main_hbox), 10);
+    
+    gtk_container_add (GTK_CONTAINER (epg_event_box),
+                       epg_main_hbox);
+		        
+    /* channels vbox */
+    GtkWidget *epg_channels_vbox = gtk_vbox_new (FALSE, 3); 
+    private->epg_channels_vbox = epg_channels_vbox; 
+
+    /* programs vbox */
+    GtkWidget *epg_programs_vbox = gtk_vbox_new (FALSE, 3);
+    private->epg_programs_vbox = epg_programs_vbox;
+    
+    /* packing start */
+    gtk_box_pack_start (GTK_BOX (epg_main_hbox),
+	                epg_channels_vbox, FALSE, FALSE, 0);
+    gtk_box_pack_start (GTK_BOX (epg_main_hbox),
+                        epg_programs_vbox, FALSE, FALSE, 0);
+
+    /* table header (first line) */  
+    mmyth_epg_grid_widget_mount_header(mmyth_epg_grid_widget);                 
+    
+    /* service programs */ 
+    /* mount service programs with current time */
+    mmyth_epg_grid_widget_mount_services(mmyth_epg_grid_widget, 
+                                         private->current_start_time,
+                                         private->current_end_time);                                           
+}
+
+GtkWidget*
+mmyth_epg_grid_widget_new ()
+{
+  return GTK_WIDGET ( gtk_type_new (mmyth_epg_grid_widget_get_type ()));
+}
+
+static void
+mmyth_epg_grid_widget_mount_services(MMythEpgGridWidget *mmyth_epg_grid_widget, 
+                                     int start_time, int end_time)
+{
+    GList *proglist;
+    GList *channel_list = NULL;
+    GMythChannelInfo *channel_info;
+
+    int chanid;
+    MMythEpgGridWidgetPrivate *private = 
+        MMYTH_EPG_GRID_WIDGET_GET_PRIVATE(mmyth_epg_grid_widget);
+	
+	// update view_model
+	/* FIXME shallow free or recursive? */
+	if(mmyth_epg_grid_widget->epg_view_model != NULL) {
+		g_list_free(mmyth_epg_grid_widget->epg_view_model);
+		mmyth_epg_grid_widget->epg_view_model = NULL;
+	}
+	
+	if(private->service_model_hash != NULL) {
+		g_hash_table_destroy(private->service_model_hash);
+	}
+
+	private->service_model_hash = g_hash_table_new(NULL, NULL);
+
+    /* fill program infos from db */
+    mmyth_epg_grid_widget_fill_programinfos(private);
+    
+    channel_list = private->channel_list;
+ 
+    /* for each channel get_programs() */
+    for (chanid=0; channel_list &&
+                   chanid < private->DISPLAY_CHANS; chanid++) {
+        proglist = (GList *) private->program_list[chanid];        
+    
+        channel_info = (GMythChannelInfo *) channel_list->data;
+        channel_list = g_list_next(channel_list);        
+
+        /* Service Title*/
+        GString *name = NULL;
+        if (channel_info->channel_name)
+        	name = g_string_new (channel_info->channel_name->str);
+		
+		GdkColor title_bg_color;
+		title_bg_color.red = 5000;
+		title_bg_color.green = 9000;
+		title_bg_color.blue = 40000;        
+		
+		GdkColor title_fg_color;
+		title_fg_color.red = 60000;
+		title_fg_color.green = 60000;
+		title_fg_color.blue = 60000;        
+		
+		GtkWidget *event_box_channel = create_event_box_lbl(
+                                                        name->str, 90, 
+									                    &title_bg_color, 
+									                    &title_fg_color);
+
+        gtk_box_pack_start (GTK_BOX (private->epg_channels_vbox),
+		                    event_box_channel, FALSE, FALSE, 0);
+
+  		GtkWidget *epg_line_hbox = gtk_hbox_new (FALSE, 0);      
+
+	    GdkColor bg_color;
+	    bg_color.red = 5000;
+	    bg_color.green = 30000;
+	    bg_color.blue = 60000;        
+	
+	    GdkColor fg_color;
+	    fg_color.red = 60000;
+	    fg_color.green = 60000;
+	    fg_color.blue = 60000;        
+		
+		/* Content parsing */
+        GList *epg_grid_list = NULL;
+
+        GMythProgramInfo *proginfo;
+        int pixel_count = 0;
+        for (; proglist; proglist = proglist->next) {
+            proginfo = (GMythProgramInfo *) proglist->data;
+            
+            GString *content_name = proginfo->title;
+                    
+       	    int initial_time, last_time, duration;
+
+            int schedule_start_time = proginfo->startts;
+            int schedule_end_time   = proginfo->endts;
+
+	        initial_time = 
+                (schedule_start_time < start_time) ? start_time : schedule_start_time;
+            last_time = (schedule_end_time > end_time) ? end_time : schedule_end_time;
+	        duration = last_time - initial_time;
+		    
+            // Verify program time 
+            #if 0
+			    g_debug ("ServiceID: %d, ScheduleID: %d\n", service->id, schedule->id);
+                fprintf (stderr, "program time\nfrom = %d, to = %d\n", 
+                         schedule->validFrom, schedule->validTo); 
+                
+                struct tm loctime;
+    
+                /* Convert it to local time representation. */
+                if (localtime_r((time_t *)&schedule->validFrom, &loctime) == NULL) {
+                    g_warning ("localtime_r error in mmyth_epg_grid_widget!\n");
+                    return NULL;
+                }            
+                fprintf (stderr, asctime (&loctime)); 
+                
+                if (localtime_r((time_t *)&schedule->validTo, &loctime) == NULL) {
+                    g_warning ("localtime_r error in mmyth_epg_grid_widget!\n");
+                    return NULL;
+                } 
+                fprintf (stderr, asctime (&loctime)); 
+            #endif
+    		
+    	    /* fprintf(stderr, "duration = %d\n", duration); */
+    	    double duration_hour = duration / (double) 3600.0;
+    	    /* fprintf(stderr, "duration_hour = %lf\n", duration_hour); */
+    		
+            int size = PIXELS_HOUR * duration_hour;
+                
+            /* complete hour */
+            /* FIXME: UGLY WRONG HACK TO ALIGN PROGRAM TIME!!!*/
+            if(last_time%3600 != 0) {
+                size -= PROGRAM_SEPARATION;                
+            }
+            if(initial_time%3600 != 0) {
+                size -= PROGRAM_SEPARATION;                
+            }
+
+            pixel_count += size + PROGRAM_SEPARATION;
+	        GtkWidget *event_box = create_event_box_lbl(content_name->str, 
+							  size, &bg_color, 
+							  &fg_color);
+							  gtk_widget_add_events(event_box, 
+							  GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK);
+            
+            /* create EpgGridItem */
+            EpgGridItem *epg_grid_item = g_new(EpgGridItem, 1);
+            epg_grid_item->proginfo  = proginfo;
+            epg_grid_item->event_box = event_box;
+            epg_grid_item->object    = mmyth_epg_grid_widget;
+            
+            epg_grid_list = g_list_prepend(epg_grid_list, (gpointer) epg_grid_item);                                   		                        
+
+     	    gtk_box_pack_start (GTK_BOX (epg_line_hbox),
+	                            event_box, FALSE, FALSE, PROGRAM_SEPARATION);
+	                                 
+   	        g_signal_connect (G_OBJECT (event_box), "button-press-event",
+		                      G_CALLBACK (mmyth_epg_grid_widget_clicked), 
+                              (gpointer*) epg_grid_list);
+        }
+#if 0
+        printf("chaind = %d!!!!" chanid);fflush(stdout);
+#endif        
+
+        if(!epg_grid_list) {
+            /* No programs for current channel */
+            /* FIXME: size HARDCODED */
+            GtkWidget *event_box = create_event_box_lbl("No program list available",
+                              PIXELS_HOUR * 3, &bg_color,
+                              &fg_color);
+                              gtk_widget_add_events(event_box,
+                              GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK);
+
+            /* create EpgGridItem */
+            EpgGridItem *epg_grid_item = g_new(EpgGridItem, 1);
+            epg_grid_item->proginfo  = NULL;
+            epg_grid_item->event_box = event_box;
+            epg_grid_item->object    = mmyth_epg_grid_widget;
+
+            epg_grid_list = g_list_prepend(epg_grid_list, (gpointer) epg_grid_item);
+            
+            gtk_box_pack_start (GTK_BOX (epg_line_hbox),
+	                            event_box, FALSE, FALSE, PROGRAM_SEPARATION);            	
+	                                 
+   	        g_signal_connect (G_OBJECT (event_box), "button-press-event",
+		                      G_CALLBACK (mmyth_epg_grid_widget_clicked),
+                              (gpointer*) epg_grid_list);
+        }
+
+        epg_grid_list = g_list_reverse(epg_grid_list);
+        mmyth_epg_grid_widget->epg_view_model = 
+              g_list_append(mmyth_epg_grid_widget->epg_view_model, epg_grid_list);
+        
+	    gtk_box_pack_start (GTK_BOX (private->epg_programs_vbox),
+	                        epg_line_hbox, FALSE, FALSE,  0);                    		    		
+    }
+}
+
+static void
+mmyth_epg_grid_widget_mount_header(MMythEpgGridWidget *mmyth_epg_grid_widget)
+{	          	    
+    MMythEpgGridWidgetPrivate *private = 
+        MMYTH_EPG_GRID_WIDGET_GET_PRIVATE(mmyth_epg_grid_widget);
+    
+    struct tm hour_tm;
+    const gchar name_title[] = "Today";    
+    GtkWidget * lbl_title = gtk_label_new(name_title);
+
+    gtk_misc_set_alignment (GTK_MISC(lbl_title), 0.0, 0.5);
+    
+    gtk_box_pack_start (GTK_BOX (private->epg_channels_vbox),
+                        lbl_title, FALSE, FALSE, 0);
+
+	/* hours title line */
+    GtkWidget *epg_programs_hours_hbox = gtk_hbox_new (TRUE, 0); 
+
+    if (localtime_r((time_t *)&private->current_start_time, &hour_tm) == NULL) {
+        g_warning ("localtime_r error in mmyth_epg_grid_widget!\n");
+        return NULL;
+    }    
+
+    if (hour_tm.tm_min>30) {
+        hour_tm.tm_min = 30;
+    } else if (hour_tm.tm_min>0) {
+        hour_tm.tm_min = 0;
+    }
+        
+    gchar hour1_str[10];
+    strftime(hour1_str, 8, "%H:%M", &hour_tm);
+    GtkWidget * lbl_hour1 = gtk_label_new(hour1_str);
+    gtk_misc_set_alignment (GTK_MISC(lbl_hour1), 0.0, 0.5);    
+	
+    hour_tm.tm_hour++;
+    gchar hour2_str[10];    
+    strftime(hour2_str, 8, "%H:%M", &hour_tm);
+    GtkWidget * lbl_hour2 = gtk_label_new(hour2_str);
+    gtk_misc_set_alignment (GTK_MISC(lbl_hour2), 0.0, 0.5);        
+
+    hour_tm.tm_hour++;
+	gchar hour3_str[10];    
+    strftime(hour3_str, 8, "%H:%M", &hour_tm);
+    GtkWidget * lbl_hour3 = gtk_label_new(hour3_str);
+    gtk_misc_set_alignment (GTK_MISC(lbl_hour3), 0.0, 0.5);        
+    
+    gtk_box_pack_start (GTK_BOX (epg_programs_hours_hbox),
+                        lbl_hour1, TRUE, TRUE, 0);                    
+    gtk_box_pack_start (GTK_BOX (epg_programs_hours_hbox),
+                        lbl_hour2, TRUE, TRUE, 0);                    
+    gtk_box_pack_start (GTK_BOX (epg_programs_hours_hbox),
+                        lbl_hour3, TRUE, TRUE, 0); 
+ 
+    gtk_box_pack_start (GTK_BOX (private->epg_programs_vbox),
+                        epg_programs_hours_hbox, FALSE, FALSE, 0);                        
+}
+
+/******************************************************************************
+ *              INTERNAL CALLBACKS FOR STATE CHANGE                           *
+ *****************************************************************************/
+static void 
+mmyth_epg_grid_widget_deselect_service(MMythEpgGridWidget *mmyth_epg_grid_widget)
+{
+	EpgGridItem *epg_grid_item;
+	
+  	/* deselect*/
+    if(mmyth_epg_grid_widget->selected_grid_item != NULL) {
+    	epg_grid_item = 
+            (EpgGridItem*) mmyth_epg_grid_widget->selected_grid_item->data;
+    	gtk_widget_set_state(GTK_WIDGET(epg_grid_item->event_box), GTK_STATE_NORMAL);
+    }            
+}
+
+static void 
+mmyth_epg_grid_widget_clicked (GtkWidget* widget, 
+                               GdkEventExpose *event, gpointer data)
+{           
+    g_return_if_fail(data != NULL);
+
+    GList *epg_grid_item_list = (GList *) data;
+    EpgGridItem *epg_grid_item = (EpgGridItem *) epg_grid_item_list->data;
+
+    /* update the selected service */
+    mmyth_epg_grid_widget_update_service( epg_grid_item->object, (GList*) data );       
+}
+
+void
+mmyth_epg_grid_widget_update_service(MMythEpgGridWidget * object,
+                                     GList *selected_grid_list)
+{
+    g_return_if_fail(object != NULL);
+    g_return_if_fail(selected_grid_list != NULL);
+		
+	EpgGridItem *epg_grid_item = (EpgGridItem *) selected_grid_list->data;
+
+    mmyth_epg_grid_widget_deselect_service(epg_grid_item->object);
+
+    /* updating current selected schedule_item and schedule_list*/
+    object->selected_grid_item = selected_grid_list;
+    
+    /* set state of the event box */
+    gtk_widget_set_state(GTK_WIDGET(epg_grid_item->event_box), GTK_STATE_SELECTED);
+    /* emit update signal for listeners */
+    g_signal_emit(object, 
+                  mmyth_epg_grid_widget_signals[SELECTION_UPDATED_SIGNAL],
+                  0,
+                  (gpointer) epg_grid_item);
+}
+
+static GtkWidget * 
+create_event_box_lbl(gchar *str, int width, const GdkColor *bg_color, 
+                     const GdkColor *fg_color) 
+{
+    GtkWidget *event_box = gtk_event_box_new();
+	GtkWidget *lbl = gtk_label_new(str);
+    gtk_label_set_ellipsize(GTK_LABEL(lbl), PANGO_ELLIPSIZE_END);
+
+    gtk_widget_modify_bg(event_box, GTK_STATE_NORMAL, bg_color);    
+    gtk_widget_modify_fg(lbl, GTK_STATE_NORMAL, fg_color);    
+    
+    /* selected colors are const*/
+    GdkColor selected_bg_color;
+    selected_bg_color.red = 100;
+    selected_bg_color.green = 40000;
+    selected_bg_color.blue = 100;        
+
+    GdkColor selected_fg_color;
+    selected_fg_color.red = 100;
+    selected_fg_color.green = 100;
+    selected_fg_color.blue = 100;        
+            
+    gtk_widget_modify_bg(event_box, GTK_STATE_SELECTED, &selected_bg_color);    
+    gtk_widget_modify_fg(lbl, GTK_STATE_SELECTED, &selected_fg_color);    
+    
+    gtk_misc_set_alignment (GTK_MISC(lbl), 0.0, 0.5);    
+	gtk_container_add (GTK_CONTAINER (event_box),
+                       lbl);
+	gtk_widget_set_size_request(event_box, width, -1);
+	                       
+    return event_box;
+}
+
+/******************************************************************************
+ *                            METHODS                                         *
+ *****************************************************************************/
+
+/* Callback for hardware keys */
+gboolean
+mmyth_epg_grid_widget_key_press (MMythEpgGridWidget * object, 
+                                 GtkWidget * widget, GdkEventKey * event)
+{
+    MMythEpgGridWidgetPrivate *private = 
+        MMYTH_EPG_GRID_WIDGET_GET_PRIVATE(object);
+  
+    EpgGridItem *epg_grid_item;
+    GList *tmp;
+    
+    /* List of selected_grid_item */
+    GList *selected_view_model;
+    
+    gint channel_index;
+    
+	if(object->selected_grid_item == NULL) {
+        g_warning ("No program selected");
+	    return FALSE;
+	} 
+    
+    epg_grid_item = (EpgGridItem*) object->selected_grid_item->data;    
+    
+    channel_index = private->selected_channel_index;
+    
+    switch (event->keyval) {
+        case GDK_Up:        
+            selected_view_model = g_list_nth( object->epg_view_model, channel_index - 1 );
+            if(selected_view_model != NULL) {
+                private->selected_channel_index = channel_index - 1;
+   	            tmp = (GList *) selected_view_model->data;               
+                /* TODO: select a better centralized item 
+                   currently is picking the 1st or last item */
+                if(g_list_next(object->selected_grid_item) == NULL &&
+                   g_list_previous(object->selected_grid_item) != NULL) {
+                    /* in this case the new selected will be the last */ 
+                    tmp = g_list_last(tmp);
+                }
+
+	            /* update the selected service */
+                mmyth_epg_grid_widget_update_service( object, tmp );
+            }    
+        return TRUE;         
+        case GDK_Down:
+            selected_view_model = g_list_nth( object->epg_view_model, channel_index + 1 );            
+            if(selected_view_model != NULL) {   	            
+                private->selected_channel_index = channel_index + 1;
+   	            tmp = (GList *) selected_view_model->data;
+                /* TODO: select a better centralized item 
+                   currently is picking the 1st or last item */
+                if(g_list_next(object->selected_grid_item) == NULL &&
+                   g_list_previous(object->selected_grid_item) != NULL) {
+                    /* in this case the new selected will be the last */ 
+                    tmp = g_list_last(tmp);
+                }
+
+	            /* update the selected service */
+                mmyth_epg_grid_widget_update_service( object, tmp );
+            }
+        return TRUE;        
+        case GDK_Left:    
+            tmp = g_list_previous( object->selected_grid_item );
+            if(tmp != NULL) {
+	            /* update the selected service */
+                mmyth_epg_grid_widget_update_service( object, tmp );
+            }
+        return TRUE;        
+        case GDK_Right:
+            tmp = g_list_next( object->selected_grid_item );
+            if(tmp != NULL) {
+	            /* update the selected service */
+                mmyth_epg_grid_widget_update_service( object, tmp );
+            }
+        return TRUE;        
+	    default:
+	    return TRUE;
+    }
+    
+    return FALSE;
+}
+
+static void 
+mmyth_epg_grid_widget_fill_programinfos (MMythEpgGridWidgetPrivate *private)
+{
+    GList *channels_list = NULL;
+    int y;
+
+    if ((private->mmyth_epg != NULL) &&
+	   	(gmyth_epg_get_channel_list (private->mmyth_epg, &channels_list) < 0 )) {
+			private->channel_list = NULL;
+			return;
+    }
+    
+    private->channel_list = channels_list;
+    
+    for (y = 0; y < private->DISPLAY_CHANS && channels_list; y++) {
+        GMythChannelInfo *channel_info = (GMythChannelInfo *) channels_list->data;
+
+        mmyth_epg_grid_widget_fill_program_row_infos(
+                            private, channel_info->channel_ID, y);
+
+        channels_list = g_list_next (channels_list);
+    }
+}
+
+static void 
+mmyth_epg_grid_widget_fill_program_row_infos(MMythEpgGridWidgetPrivate *private,
+                                             guint chanNum, guint row)
+{    
+    gint res =  gmyth_epg_get_program_list (private->mmyth_epg,
+    					&(private->program_list[row]),
+                        chanNum, private->current_start_time, 
+                        private->current_end_time);
+                        
+    if (res < 0) {
+    	g_warning ("[%s] Error while retrieving epg programs", __FUNCTION__);
+    }
+}
+    
diff -r 7c409a042a9a -r 7174e23f7617 maemo-ui/src/mmyth_epg_grid_widget.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/maemo-ui/src/mmyth_epg_grid_widget.h	Thu Sep 28 16:02:14 2006 +0100
@@ -0,0 +1,74 @@
+#ifndef __MMYTH_EPG_GRID_WIDGET_H__
+#define __MMYTH_EPG_GRID_WIDGET_H__
+
+#include <glib-object.h>
+#include <gdk/gdk.h>
+#include <gtk/gtkvbox.h>
+#include <gtk/gtkeventbox.h>
+
+#include "gmyth_common.h"
+
+#define MAX_DISPLAY_CHANS 4
+
+G_BEGIN_DECLS
+
+#define MMYTH_EPG_GRID_WIDGET_TYPE               (mmyth_epg_grid_widget_get_type ())
+#define MMYTH_EPG_GRID_WIDGET(obj)               (GTK_CHECK_CAST ((obj), MMYTH_EPG_GRID_WIDGET_TYPE, MMythEpgGridWidget))
+#define MMYTH_EPG_GRID_WIDGET_CLASS(klass)       (GTK_CHECK_CLASS_CAST ((klass), MMYTH_EPG_GRID_WIDGET_TYPE, MMythEpgGridWidgetClass))
+#define IS_MMYTH_EPG_GRID_WIDGET(obj)            (GTK_CHECK_TYPE ((obj), MMYTH_EPG_GRID_WIDGET_TYPE))
+#define IS_MMYTH_EPG_GRID_WIDGET_CLASS(klass)    (GTK_CHECK_CLASS_TYPE ((klass), MMYTH_EPG_GRID_WIDGET_TYPE))
+#define MMYTH_EPG_GRID_WIDGET_GET_CLASS(obj)     (G_TYPE_INSTANCE_GET_CLASS ((obj), MMYTH_EPG_GRID_WIDGET_TYPE, MMythEpgGridWidgetClass))
+#define MMYTH_EPG_GRID_WIDGET_GET_PRIVATE(obj)   (G_TYPE_INSTANCE_GET_PRIVATE ((obj), MMYTH_EPG_GRID_WIDGET_TYPE, MMythEpgGridWidgetPrivate))
+
+
+typedef struct _MMythEpgGridWidget         MMythEpgGridWidget;
+typedef struct _MMythEpgGridWidgetClass    MMythEpgGridWidgetClass;
+typedef struct _MMythEpgGridWidgetPrivate  MMythEpgGridWidgetPrivate;
+
+struct _MMythEpgGridWidgetClass
+{
+  GtkEventBoxClass parent_class;
+
+  /* callbacks */
+  /* no one for now */
+};
+
+struct _MMythEpgGridWidget
+{
+    GtkEventBox event_box;
+
+    /* Selected Widgets Logic*/
+    /* List os Service Model in the current view
+     * the data of this list are GList for the programs
+     * of each service */
+    GList *epg_view_model;
+
+    /* Selected Schedule Item*/
+    GList *selected_grid_item;  
+};
+
+
+GType          mmyth_epg_grid_widget_get_type        (void);
+GtkWidget*     mmyth_epg_grid_widget_new             (void);
+/*DVBHScheduleEvent*    mmyth_epg_grid_get_selected_schedule  (MMythEpgGridWidget * object);*/
+void           mmyth_epg_grid_widget_update_service  (MMythEpgGridWidget * object, 
+                                                      GList *epg_grid_item_node);
+gboolean       mmyth_epg_grid_widget_key_press       (MMythEpgGridWidget * object, 
+                                                      GtkWidget * widget, 
+                                                      GdkEventKey * event);
+
+typedef struct _EpgGridItem EpgGridItem;
+
+/* FIXME: auxiliary struct */
+struct _EpgGridItem {
+
+    GMythProgramInfo *proginfo;
+    GtkWidget *event_box;
+
+    /* for callback purposes */
+    MMythEpgGridWidget *object;
+};
+
+G_END_DECLS
+
+#endif /* __MMYTH_EPG_GRID_WIDGET_H__ */
diff -r 7c409a042a9a -r 7174e23f7617 maemo-ui/src/mmyth_main.c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/maemo-ui/src/mmyth_main.c	Thu Sep 28 16:02:14 2006 +0100
@@ -0,0 +1,104 @@
+
+#include <gtk/gtk.h>
+
+#include "config.h"
+
+#ifdef MAEMO_PLATFORM
+#include "hildon-widgets/hildon-program.h"
+#include "hildon-widgets/hildon-window.h"
+#endif
+
+
+#include "gmyth_remote_encoder.h"
+#include "gmyth_settings.h"
+#include "gmyth_context.h"
+#include "gmyth_tvchain.h"
+#include "gmyth_remote_util.h"
+
+#include "mmyth_ui.h"
+#include "mmyth_tvplayer.h"
+
+static void
+cb_destroy (GtkWidget * widget, gpointer data)
+{
+    MMythUi *mmyth_ui = (MMythUi *) data;
+
+    if (mmyth_ui->tvplayer != NULL) {
+    	if (mmyth_tvplayer_is_playing (mmyth_ui->tvplayer) )
+    		mmyth_tvplayer_stop_playing (mmyth_ui->tvplayer);
+    }
+
+	mmyth_ui_finalize (mmyth_ui);
+	
+    gtk_main_quit ();
+}
+
+#ifdef NDEBUG
+static void
+debug_error_func( const gchar*log_domain, GLogLevelFlags log_level, const gchar *message,
+	gpointer user_data )
+
+{
+	/* leave this with NO print out messages, once you need to disable debug messages! */
+	//g_print ( "[%s] DEBUG messages disabled!\n", __FUNCTION__ );
+}
+#endif
+
+gint
+main (gint argc, gchar * argv[])
+{
+    GtkWidget *window;
+    MMythUi *mmyth_ui;
+#ifdef MAEMO_PLATFORM
+    HildonProgram *program = NULL;
+#endif
+
+    /* init threads */
+    g_thread_init (NULL);
+
+    /* Initializes GTK */
+    gtk_init (&argc, &argv);
+    gst_init (&argc, &argv);
+#ifdef NDEBUG
+ g_log_set_default_handler( debug_error_func, NULL );
+#endif
+
+    /* Init libmmyth context */
+    gmyth_context_initialize ();
+	
+#ifndef MAEMO_PLATFORM
+    /* create the main window */
+    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+    gtk_widget_set_size_request (window, MAIN_WINDOW_WIDTH, MAIN_WINDOW_HEIGHT);
+    gtk_window_set_title (GTK_WINDOW (window), "Mythtv Frontend");
+#else
+    /* Creating Hildonized main view */
+    program = HILDON_PROGRAM(hildon_program_get_instance());
+    window = hildon_window_new();
+
+    //g_signal_connect(G_OBJECT(window), "delete_event", gtk_main_quit, NULL);
+
+    hildon_program_add_window(program, HILDON_WINDOW (window));
+    g_set_application_name("Maemo Mythtv"); 
+#endif
+   
+    /* Initializes MMyth Widgets */
+#ifdef MAEMO_PLATFORM
+    mmyth_ui = mmyth_ui_initialize (program, window);
+#else    
+    mmyth_ui = mmyth_ui_initialize (window);
+#endif
+    
+    //mmyth_ui->loop = g_main_loop_new (NULL, FALSE);
+
+    /* Connect destroy signal handling */
+    g_signal_connect (window, "destroy", G_CALLBACK (cb_destroy), mmyth_ui);
+
+    /* Shows main window and start gtk loop */
+    gtk_widget_show (window);
+
+    gtk_main ();
+
+    return 0;
+}
+
diff -r 7c409a042a9a -r 7174e23f7617 maemo-ui/src/mmyth_recordui.c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/maemo-ui/src/mmyth_recordui.c	Thu Sep 28 16:02:14 2006 +0100
@@ -0,0 +1,332 @@
+#include<gtk/gtk.h>
+#include<glib.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "mmyth_ui.h"
+#include "mmyth_recordui.h"
+
+/* GMyth library includes */
+#include "gmyth_scheduler.h"
+#include "gmyth_util.h"
+
+enum {
+	START_DATE_COLUMN = 0,
+	TITLE_COLUMN,
+	CHAN_ID_COLUMN,
+	END_TIME_COLUMN,
+	RECORD_ID_COLUMN,
+	BASENAME_COLUMN,
+	N_COLUMNS
+};
+
+gboolean
+mmyth_recordui_reload_all (MMythRecordUI *recordui)
+{
+	gboolean res = FALSE;
+
+	res = mmyth_recordui_reload_schedule (recordui);
+		
+	res = res & mmyth_recordui_reload_record (recordui);
+	
+	
+	if (!res)
+		g_warning ("[%s] Error while reloading schedule and recording content", __FUNCTION__);
+		
+	return res;
+}
+
+gboolean
+mmyth_recordui_reload_schedule (MMythRecordUI *recordui)
+{
+	gint new_row = 0;
+	ScheduleInfo *schedule_info;
+	GList *schedule_list;
+	GtkTreeIter iter;
+    GString *start_date_time = NULL;
+    GString *end_date_time = NULL;
+    GString *str_aux = g_string_new("");
+	gint res;
+
+	gtk_tree_store_clear(recordui->sch_tree_store);	
+
+	res = gmyth_scheduler_get_schedule_list(recordui->scheduler, &(schedule_list));
+	if (res < 0) {
+		g_warning ("[%s] Retrieved NULL list of scheduled data from database", 
+                   __FUNCTION__);
+		return FALSE;
+	}
+
+	for ( ; schedule_list; schedule_list = schedule_list->next) {
+ 	  	schedule_info = (ScheduleInfo*) schedule_list->data;
+
+  	  	gtk_tree_store_insert(recordui->sch_tree_store, &iter, NULL, new_row++);
+        
+        start_date_time = gmyth_util_time_to_string(schedule_info->start_time);
+        end_date_time = gmyth_util_time_to_string(schedule_info->end_time);
+        
+        g_string_printf(str_aux, "%d", schedule_info->channel_id);
+        
+	  	gtk_tree_store_set(recordui->sch_tree_store, &iter,
+	  		START_DATE_COLUMN, start_date_time->str, 
+	  		TITLE_COLUMN, schedule_info->title->str,
+	  		CHAN_ID_COLUMN, str_aux->str,
+	  		END_TIME_COLUMN, end_date_time->str, //It doesn't appear
+	  		RECORD_ID_COLUMN, schedule_info->record_id, 
+			-1); //the last line is a hidden item to be used in searching tasks
+ 	}
+  	
+  	g_debug ("[%s] %d lines added to schedule list UI", __FUNCTION__, new_row);
+  	
+    /* free allocated memory */
+    if(!start_date_time)
+        g_string_free(start_date_time, FALSE);
+    if(!end_date_time)
+        g_string_free(end_date_time, FALSE);
+    g_string_free(str_aux,  FALSE);
+    
+  	return TRUE;
+}
+
+gboolean
+mmyth_recordui_reload_record (MMythRecordUI *recordui)
+{
+	gint new_row = 0;
+	RecordedInfo *recorded_info;
+	GList *record_list = NULL;
+	GtkTreeIter iter;
+    GString *start_date_time = NULL;
+    GString *end_date_time = NULL;
+    GString *str_aux = g_string_new("");
+	gint res;
+	
+	gtk_tree_store_clear(recordui->rec_tree_store);		
+
+	res = gmyth_scheduler_get_recorded_list(recordui->scheduler, &record_list);
+	if (res < 0) {
+		g_warning ("[%s] Retrieved NULL list of recorded data from database", __FUNCTION__);
+		return FALSE;
+	}
+	
+	for (; record_list; record_list = record_list->next) {
+ 	  	recorded_info = (RecordedInfo*) record_list->data;
+
+  	  	gtk_tree_store_insert(recordui->rec_tree_store, &iter, NULL, new_row++);
+
+        start_date_time = gmyth_util_time_to_string(recorded_info->start_time);
+        end_date_time = gmyth_util_time_to_string(recorded_info->end_time);
+
+        g_string_printf(str_aux, "%d", recorded_info->channel_id);
+
+	  	gtk_tree_store_set(recordui->rec_tree_store, &iter,
+	  		START_DATE_COLUMN, start_date_time->str, 
+	  		TITLE_COLUMN, recorded_info->title->str,
+	  		CHAN_ID_COLUMN, str_aux->str,
+	  		END_TIME_COLUMN, end_date_time->str, //It doesn't appear
+	  		RECORD_ID_COLUMN, recorded_info->record_id,
+			BASENAME_COLUMN, recorded_info->basename->str, -1); 
+            //the last line is a hidden item to be used in searching tasks	  		
+  	}
+  	
+  	g_debug ("[%s] %d lines added to record list UI", __FUNCTION__, new_row);
+  	  	
+  	return TRUE;
+}
+
+
+MMythRecordUI*
+mmyth_recordui_new(void)
+{
+	MMythRecordUI *recordui = g_new0 (MMythRecordUI, 1);
+	
+	recordui->scrolled_window = gtk_scrolled_window_new (NULL, NULL);
+	gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (recordui->scrolled_window),
+			GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+
+	recordui->viewport = gtk_viewport_new (NULL, NULL);
+  	gtk_container_add (GTK_CONTAINER (recordui->scrolled_window), recordui->viewport);
+
+  	recordui->notebook = gtk_notebook_new ();
+  	gtk_container_set_border_width (GTK_CONTAINER (recordui->notebook), 1);
+  	gtk_notebook_set_scrollable (GTK_NOTEBOOK (recordui->notebook), TRUE);
+  	gtk_notebook_popup_enable (GTK_NOTEBOOK (recordui->notebook));
+  	gtk_container_add (GTK_CONTAINER (recordui->viewport), recordui->notebook);
+  	gtk_notebook_popup_disable(GTK_NOTEBOOK (recordui->notebook));
+
+	/* Schedule tab */
+  	recordui->sch_scrolled_window = gtk_scrolled_window_new (NULL, NULL);
+  	gtk_container_add (GTK_CONTAINER (recordui->notebook), recordui->sch_scrolled_window);
+  	gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (recordui->sch_scrolled_window), 
+                                    GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+  	gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (recordui->sch_scrolled_window), 
+                                         GTK_SHADOW_IN);
+
+    /* The basename column in the sched_tree_store is not being used*/
+  	recordui->sch_tree_store = 
+        gtk_tree_store_new (N_COLUMNS, G_TYPE_STRING, G_TYPE_STRING,
+  		                    G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INT, G_TYPE_STRING );
+    
+  	recordui->sch_treeview = 
+        gtk_tree_view_new_with_model(GTK_TREE_MODEL(recordui->sch_tree_store));
+  	gtk_container_add (GTK_CONTAINER (recordui->sch_scrolled_window), 
+                       recordui->sch_treeview);
+  	recordui->sch_renderer = gtk_cell_renderer_text_new();
+  	//g_object_set(G_OBJECT(renderer1), "foreground", "green", "background", "black", NULL);
+  	recordui->sch_column1 = 
+        gtk_tree_view_column_new_with_attributes("Start time", recordui->sch_renderer, 
+                                                 "text", START_DATE_COLUMN, NULL);
+  	gtk_tree_view_append_column(GTK_TREE_VIEW(recordui->sch_treeview), 
+                                recordui->sch_column1); 
+  	recordui->sch_column2 = 
+        gtk_tree_view_column_new_with_attributes("Title", recordui->sch_renderer, 
+                                                 "text", TITLE_COLUMN, NULL);
+  	gtk_tree_view_append_column(GTK_TREE_VIEW(recordui->sch_treeview), 
+                                recordui->sch_column2);
+  	recordui->sch_column3 = 
+        gtk_tree_view_column_new_with_attributes("Channel", recordui->sch_renderer, 
+                                                 "text", CHAN_ID_COLUMN, NULL);
+  	gtk_tree_view_append_column(GTK_TREE_VIEW(recordui->sch_treeview), 
+                                recordui->sch_column3);
+  	gtk_tree_view_column_set_resizable(recordui->sch_column1, TRUE);
+  	gtk_tree_view_column_set_resizable(recordui->sch_column2, TRUE);
+  	gtk_tree_view_column_set_resizable(recordui->sch_column3, TRUE);
+  	gtk_tree_view_column_set_reorderable(recordui->sch_column1, TRUE);
+  	gtk_tree_view_column_set_reorderable(recordui->sch_column2, TRUE);
+  	gtk_tree_view_column_set_reorderable(recordui->sch_column3, TRUE);  	  	  	  	
+//  recordui->sch_column4 = 
+//      gtk_tree_view_column_new_with_attributes("", recordui->sch_renderer, "text", END_TIME_COLUMN, NULL);
+//  gtk_tree_view_append_column(GTK_TREE_VIEW(recordui->sch_treeview), 
+//                                            recordui->sch_column4);
+
+  	recordui->sch_label = gtk_label_new (("Schedule"));
+  	gtk_notebook_set_tab_label (GTK_NOTEBOOK (recordui->notebook), 
+                                gtk_notebook_get_nth_page (
+                                               GTK_NOTEBOOK (recordui->notebook), 0), 
+                                recordui->sch_label);
+
+  // Record items  tab
+  //   g_object_set(G_OBJECT(renderer2), "foreground", "blue", NULL);
+  	recordui->rec_scrolled_window = gtk_scrolled_window_new (NULL, NULL);
+  	gtk_container_add (GTK_CONTAINER (recordui->notebook), 
+                       recordui->rec_scrolled_window);
+  	gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (recordui->rec_scrolled_window), 
+                                    GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+  	gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (recordui->rec_scrolled_window), 
+                                         GTK_SHADOW_IN);
+
+  	recordui->rec_tree_store = 
+        gtk_tree_store_new (N_COLUMNS, G_TYPE_STRING, G_TYPE_STRING,
+                	        G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INT, G_TYPE_STRING);
+  	recordui->rec_treeview = 
+        gtk_tree_view_new_with_model(GTK_TREE_MODEL(recordui->rec_tree_store));
+  	gtk_container_add (GTK_CONTAINER (recordui->rec_scrolled_window), 
+                       recordui->rec_treeview);
+  	recordui->rec_renderer = gtk_cell_renderer_text_new();
+  	//g_object_set(G_OBJECT(renderer1), "foreground", "green", "background", "black", NULL);
+ 
+  	recordui->rec_column1 = 
+        gtk_tree_view_column_new_with_attributes("Start time", recordui->rec_renderer, 
+                                                 "text", START_DATE_COLUMN, NULL);
+  	gtk_tree_view_append_column(GTK_TREE_VIEW(recordui->rec_treeview), 
+                                recordui->rec_column1);
+  	recordui->rec_column2 = 
+        gtk_tree_view_column_new_with_attributes("Title", recordui->rec_renderer, 
+                                                 "text", TITLE_COLUMN, NULL);
+  	gtk_tree_view_append_column(GTK_TREE_VIEW(recordui->rec_treeview), 
+                                recordui->rec_column2);
+  	recordui->rec_column3 = 
+        gtk_tree_view_column_new_with_attributes("Channel", recordui->rec_renderer, 
+                                                 "text", CHAN_ID_COLUMN, NULL);
+  	gtk_tree_view_append_column(GTK_TREE_VIEW(recordui->rec_treeview), 
+                                recordui->rec_column3);
+  	gtk_tree_view_column_set_resizable(recordui->rec_column1, TRUE);
+  	gtk_tree_view_column_set_resizable(recordui->rec_column2, TRUE);
+  	gtk_tree_view_column_set_resizable(recordui->rec_column3, TRUE);
+  	gtk_tree_view_column_set_reorderable(recordui->rec_column1, TRUE);
+  	gtk_tree_view_column_set_reorderable(recordui->rec_column2, TRUE);
+  	gtk_tree_view_column_set_reorderable(recordui->rec_column3, TRUE);
+//  recordui->rec_column4 = gtk_tree_view_column_new_with_attributes("", recordui->rec_renderer, "text", END_TIME_COLUMN, NULL);
+//  gtk_tree_view_append_column(GTK_TREE_VIEW(recordui->rec_treeview), recordui->rec_column4);
+
+  	recordui->rec_label = gtk_label_new (("Recorded"));
+  	gtk_notebook_set_tab_label (GTK_NOTEBOOK (recordui->notebook), 
+                                gtk_notebook_get_nth_page (
+                                      GTK_NOTEBOOK (recordui->notebook), 1), 
+                                recordui->rec_label);
+  
+  	// Gets the mmyth scheduler manager
+  	recordui->scheduler = gmyth_scheduler_new ();
+    
+    /* init connection to the backend */
+    gmyth_scheduler_connect (recordui->scheduler);
+    
+	return recordui;
+}
+
+void
+mmyth_recordui_free (MMythRecordUI *recordui)
+{
+	// FIXME: Release memory here!
+    /* close connection to the backend */
+    gmyth_scheduler_disconnect (recordui->scheduler);
+}
+
+void
+mmyth_recordui_delete_selected (GtkButton *button, MMythRecordUI *recordui)
+{
+	GtkTreeSelection *selection;
+	GtkTreeModel *list_store;
+	GtkTreeIter iter;
+	int index;
+	int curr_page = 0;
+	
+	curr_page = gtk_notebook_get_current_page(GTK_NOTEBOOK(recordui->notebook));
+
+	if ( curr_page == 0) {
+		selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(recordui->sch_treeview));
+		if (selection != NULL) {
+			gtk_tree_selection_get_selected(selection, &list_store, &iter);
+			gtk_tree_model_get(list_store, &iter, RECORD_ID_COLUMN, &index, -1);
+			gmyth_scheduler_delete_schedule(recordui->scheduler, index);
+			mmyth_recordui_reload_schedule (recordui);
+			return;
+		}
+			
+	} else if (curr_page == 1) {
+		selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(recordui->rec_treeview));
+		if (selection != NULL) {
+			gtk_tree_selection_get_selected(selection, &list_store, &iter);
+			gtk_tree_model_get(list_store, &iter, RECORD_ID_COLUMN, &index, -1);
+			gmyth_scheduler_delete_recorded(recordui->scheduler, index);
+			mmyth_recordui_reload_record (recordui);
+			return;
+		}
+	}
+	
+	g_warning ("[%s] None element was removed from the list", __FUNCTION__);
+}
+
+/* FIXME: change this function name, it is returning the 
+ * basename_column that represents the nuv filename of 
+ * the recorded content */
+gchar*
+mmyth_recordui_get_selected_recorded (MMythRecordUI *recordui)
+{
+	GtkTreeSelection *selection = NULL;
+	GtkTreeModel *list_store = NULL;
+	GtkTreeIter iter;
+	gchar *path = NULL;
+
+	/* returning nuv filename, basename_column */
+	selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(recordui->rec_treeview));
+	if (gtk_tree_selection_get_selected (selection, &list_store, &iter)) {
+		gtk_tree_model_get(list_store, &iter, BASENAME_COLUMN, &path, -1);
+	}
+
+	// FIXME: MOVE THIS TO OTHER PLACE
+	return path;
+}
diff -r 7c409a042a9a -r 7174e23f7617 maemo-ui/src/mmyth_recordui.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/maemo-ui/src/mmyth_recordui.h	Thu Sep 28 16:02:14 2006 +0100
@@ -0,0 +1,48 @@
+#ifndef MMYTH_RECORD_H_
+#define MMYTH_RECORD_H_
+
+#include "gmyth_scheduler.h"
+
+typedef struct _MMythRecordUI
+{
+	GtkWidget *scrolled_window;
+	GtkWidget *viewport;
+	GtkWidget *notebook;
+	
+	GtkWidget *rec_scrolled_window;
+	GtkWidget *sch_scrolled_window;
+	GtkWidget *rec_treeview;
+	GtkWidget *sch_treeview;
+	GtkWidget *rec_label;
+	GtkWidget *sch_label;
+	
+	GtkTreeViewColumn *rec_column1;
+	GtkTreeViewColumn *rec_column2;
+	GtkTreeViewColumn *rec_column3;
+	GtkTreeViewColumn *rec_column4;
+	GtkTreeViewColumn *sch_column1;
+	GtkTreeViewColumn *sch_column2;
+	GtkTreeViewColumn *sch_column3;
+	GtkTreeViewColumn *sch_column4;
+	
+	GtkCellRenderer *rec_renderer;
+	GtkCellRenderer *sch_renderer;
+
+	GtkTreeStore *sch_tree_store;
+	GtkTreeStore *rec_tree_store;
+	
+	GMythScheduler *scheduler;
+	
+} MMythRecordUI;
+
+MMythRecordUI* mmyth_recordui_new(void);
+void mmyth_recordui_free (MMythRecordUI *recordui);
+
+void mmyth_recordui_delete_selected (GtkButton *button, MMythRecordUI *recordui);
+gboolean mmyth_recordui_reload_all (MMythRecordUI *recordui);
+gboolean mmyth_recordui_reload_schedule (MMythRecordUI *recordui);
+gboolean mmyth_recordui_reload_record (MMythRecordUI *recordui);
+
+gchar* mmyth_recordui_get_selected_recorded (MMythRecordUI *recordui);
+
+#endif /*MMYTH_RECORD_H_*/
diff -r 7c409a042a9a -r 7174e23f7617 maemo-ui/src/mmyth_schedulerui.c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/maemo-ui/src/mmyth_schedulerui.c	Thu Sep 28 16:02:14 2006 +0100
@@ -0,0 +1,368 @@
+#include <gtk/gtk.h>
+#include <glib.h>
+#include <glib/gprintf.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <string.h>
+#include <stdio.h>
+
+#include "mmyth_ui.h"
+#include "mmyth_uicommon.h"
+#include "mmyth_recordui.h"
+#include "mmyth_schedulerui.h"
+
+/* GMyth library includes */
+#include "gmyth_scheduler.h"
+#include "gmyth_common.h"
+#include "gmyth_epg.h"
+
+static void run_calendar_dialog (GtkButton *button, gpointer data);
+
+static void add_channel_field (MMythSchedulerUI *scheduler_ui, GtkWidget *vbox);
+static void add_time_field (MMythSchedulerUI *scheduler_ui, GtkWidget *vbox);
+static void add_date_field (MMythSchedulerUI *scheduler_ui, GtkWidget *vbox);
+static void add_duration_field (MMythSchedulerUI *scheduler_ui, GtkWidget *vbox);
+static void add_frequency_field (MMythSchedulerUI *scheduler_ui, GtkWidget *vbox);
+static void add_title_field (MMythSchedulerUI *scheduler_ui, GtkWidget *vbox);
+
+MMythSchedulerUI*
+mmyth_schedulerui_new (void)
+{
+	GtkWidget *scrolledwindow;	
+	GtkWidget *viewport;	
+	GtkWidget *head_hbox;
+	GtkWidget *fields_vbox;
+	GtkWidget *hseparator;
+	GtkWidget *label;
+
+	MMythSchedulerUI *scheduler_ui = g_new0 (MMythSchedulerUI, 1);
+	
+	scrolledwindow = gtk_scrolled_window_new (NULL, NULL);
+	scheduler_ui->main_widget = scrolledwindow;
+	gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow),
+  			GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+
+	//Is this needed?  
+	viewport = gtk_viewport_new (NULL, NULL);
+	gtk_container_add (GTK_CONTAINER (scrolledwindow), viewport);
+
+	//Is this needed?
+	head_hbox = gtk_hbox_new (FALSE, 0);
+	gtk_container_add (GTK_CONTAINER (viewport), head_hbox);
+
+	fields_vbox = gtk_vbox_new (FALSE, 0);
+	gtk_box_pack_start (GTK_BOX (head_hbox), fields_vbox, TRUE, TRUE, 0);
+	gtk_container_set_border_width (GTK_CONTAINER (fields_vbox), 10);
+
+	label = gtk_label_new_with_mnemonic (("Manual Schedule Recording"));
+	gtk_box_pack_start (GTK_BOX (fields_vbox), label, FALSE, FALSE, 0);
+	gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
+
+	hseparator = gtk_hseparator_new ();
+	gtk_box_pack_start (GTK_BOX (fields_vbox), hseparator, FALSE, TRUE, 0);
+
+	add_channel_field (scheduler_ui, fields_vbox);
+	add_time_field (scheduler_ui, fields_vbox);
+	add_date_field (scheduler_ui, fields_vbox);
+	add_duration_field (scheduler_ui, fields_vbox);
+	add_frequency_field (scheduler_ui, fields_vbox);
+	add_title_field (scheduler_ui, fields_vbox);
+	
+	return scheduler_ui;
+}
+
+static void
+set_date_from_calendar (GtkCalendar *calendar, gpointer data)
+{
+	char sched_date[24];
+
+	MMythSchedulerUI *scheduler_ui = (MMythSchedulerUI*) data;
+
+	// FIXME: Change this, save another value instead of month_temp, day_temp, ...	
+	gtk_calendar_get_date(GTK_CALENDAR(calendar), 
+		&(scheduler_ui->year_temp), &(scheduler_ui->month_temp), &(scheduler_ui->day_temp));
+
+	sched_date[23]='\0';
+	g_sprintf(sched_date, "%04d %02d %02d (yyyy mm dd)",
+		scheduler_ui->year_temp, scheduler_ui->month_temp+1, scheduler_ui->day_temp);
+
+	gtk_button_set_label(GTK_BUTTON(scheduler_ui->date_button), sched_date);
+
+	gtk_widget_destroy(scheduler_ui->calendar_dialog);
+	scheduler_ui->calendar_dialog = NULL;
+	scheduler_ui->calendar = NULL;
+}
+
+//calendar
+static void
+run_calendar_dialog (GtkButton *button, gpointer data)
+{
+
+	GtkWidget *dialog_vbox;
+	MMythSchedulerUI *scheduler_ui = (MMythSchedulerUI*) data;
+
+	// calendar_dialog and calendar are been released at set_date_from_calendar ()
+	scheduler_ui->calendar_dialog = gtk_dialog_new ();
+	gtk_container_set_border_width (GTK_CONTAINER (scheduler_ui->calendar_dialog), 1);
+  	gtk_window_set_title (GTK_WINDOW (scheduler_ui->calendar_dialog), "Select starting date");
+  	gtk_window_set_position (GTK_WINDOW (scheduler_ui->calendar_dialog), GTK_WIN_POS_CENTER);
+	gtk_window_set_decorated (GTK_WINDOW (scheduler_ui->calendar_dialog), FALSE);
+
+	dialog_vbox = GTK_DIALOG (scheduler_ui->calendar_dialog)->vbox;
+
+	scheduler_ui->calendar = gtk_calendar_new ();
+
+	gtk_box_pack_start (GTK_BOX (dialog_vbox), scheduler_ui->calendar, TRUE, TRUE, 0);
+	gtk_calendar_display_options (GTK_CALENDAR (scheduler_ui->calendar),
+        GTK_CALENDAR_SHOW_HEADING | GTK_CALENDAR_SHOW_DAY_NAMES);
+
+	gtk_widget_show_all (scheduler_ui->calendar_dialog);
+
+	g_signal_connect (G_OBJECT (scheduler_ui->calendar), "day-selected-double-click",
+                      G_CALLBACK (set_date_from_calendar), data);
+}
+
+
+gboolean
+mmyth_schedulerui_save (MMythSchedulerUI *scheduler_ui)
+{
+    GMythScheduler *scheduler;
+	ScheduleInfo *schedule_info;
+	GMythChannelInfo *channel_info;
+
+	GList *clist;
+	gint index, duration;
+    gint frequency;
+    struct tm start_tm;
+	
+	schedule_info = g_new0(ScheduleInfo, 1);
+    if(schedule_info == NULL) {
+        g_warning ("Error allocating memory");
+        return FALSE;
+    }
+        
+    clist = scheduler_ui->channel_list;
+      
+    index = gtk_combo_box_get_active(GTK_COMBO_BOX(scheduler_ui->channel_combobox));
+
+    if (clist != NULL)
+		clist = g_list_nth(clist, index);
+    
+    if (clist) {
+	    g_debug ("[%s] New schedule: %d", __FUNCTION__, index);
+    } else {
+	    g_warning ("[%s] Error when adding new schedule", __FUNCTION__);
+	    return FALSE;
+    }
+    
+    channel_info = clist->data;
+    
+    /* initialize schedule_info */
+    schedule_info->channel_id = channel_info->channel_ID;
+    
+    start_tm.tm_hour = 
+        (int)gtk_spin_button_get_value(GTK_SPIN_BUTTON(scheduler_ui->hour_spinbutton));
+	start_tm.tm_min = 
+        (int)gtk_spin_button_get_value(GTK_SPIN_BUTTON(scheduler_ui->min_spinbutton));
+    start_tm.tm_sec = 0;
+
+	start_tm.tm_mday = (gint)scheduler_ui->day_temp;
+	start_tm.tm_mon =  (gint)scheduler_ui->month_temp;
+	start_tm.tm_year = (gint)scheduler_ui->year_temp - 1900; //years since 1900
+
+    schedule_info->start_time = timelocal(&start_tm);
+    if (schedule_info->start_time == (time_t)(-1)) {
+        g_warning ("timelocal error!\n");
+        return FALSE;
+    }
+
+	duration = (gint) gtk_spin_button_get_value(
+                        GTK_SPIN_BUTTON(scheduler_ui->duration_spinbutton));
+    schedule_info->end_time = schedule_info->start_time + (duration*60);
+
+    /* TODO: frequency is not implemented yet */
+	frequency = gtk_combo_box_get_active(GTK_COMBO_BOX(scheduler_ui->freq_combobox));
+
+	schedule_info->title = g_string_new("");
+	g_string_printf(schedule_info->title, "%s", 
+                    gtk_entry_get_text(GTK_ENTRY(scheduler_ui->title_entry)));
+	
+    /* FIXME: Architecture change to reuse the scheduler created in the recordui! */
+    scheduler = gmyth_scheduler_new ();
+
+    gmyth_scheduler_connect(scheduler);
+
+    /* FIXME: set record_id = -1 to add a new schedule */
+    schedule_info->record_id = -1;
+    gmyth_scheduler_add_schedule (scheduler, schedule_info);
+
+    gmyth_scheduler_disconnect(scheduler);
+    
+    /* free allocated memory */
+    g_object_unref (scheduler);
+    g_free (schedule_info);
+	
+    return TRUE;
+} 
+
+static GtkWidget*
+add_line (GtkWidget *vbox, const gchar *str)
+{
+	GtkWidget *label;
+	GtkWidget *hbox = gtk_hbox_new (FALSE, 0);
+
+	gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
+	gtk_container_set_border_width (GTK_CONTAINER (hbox), 3);
+	
+	label = gtk_label_new (str);
+	gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
+	gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);	
+
+	return hbox;
+}
+
+static void
+add_channel_field (MMythSchedulerUI *scheduler_ui, GtkWidget *vbox)
+{
+	GtkWidget *combobox;
+	
+	GtkWidget *hbox = add_line (vbox, "Channel:    ");
+	
+	combobox = gtk_combo_box_new_text ();
+
+	scheduler_ui->channel_combobox = combobox;
+	gtk_box_pack_start (GTK_BOX (hbox), combobox, FALSE, FALSE, 0);
+			
+	GMythEPG *mmyth_epg = gmyth_epg_new ();
+	if (!gmyth_epg_connect (mmyth_epg)) {
+		// FIXME: Without this list the scheduler UI should not be shown!
+		g_warning ("[%s] Error when getting list of channels", __FUNCTION__);
+	}
+  	
+	if (gmyth_epg_get_channel_list (mmyth_epg, &(scheduler_ui->channel_list)) < 0) {
+		g_debug ("[%s] Error while trying to retrieve channel list", __FUNCTION__);
+	} else {
+ 		GList *clist =  scheduler_ui->channel_list;
+		GMythChannelInfo *channel_info;
+
+		while (clist != NULL) {
+  	  		channel_info = clist->data;
+  	  		clist = clist->next;
+  	  		gtk_combo_box_append_text (GTK_COMBO_BOX (scheduler_ui->channel_combobox), 
+                                       (channel_info->channel_name->str));
+  		}
+
+       gtk_combo_box_set_active(GTK_COMBO_BOX (scheduler_ui->channel_combobox), 0);
+  	}
+}
+
+static void
+add_time_field (MMythSchedulerUI *scheduler_ui, GtkWidget *vbox)
+{
+	GtkWidget *label;
+	GtkObject *spinbutton_adj;
+	GtkWidget *hbox = add_line (vbox, "Time:         ");
+
+	time_t real_time;
+	struct tm sched_time;
+
+	time(&real_time);
+
+    if (localtime_r((time_t *)&real_time, &sched_time) == NULL) {
+        g_warning ("localtime_r error in mmyth_epg_grid_view!\n");
+        return NULL;
+    }
+ 
+	if (sched_time.tm_min>30){
+  		sched_time.tm_hour = sched_time.tm_hour+1;
+  		sched_time.tm_min = 0;
+	} else if (sched_time.tm_min>0) {
+  		sched_time.tm_min = 30;
+	}
+
+  	scheduler_ui->year_temp = (guint)sched_time.tm_year + 1900;
+  	scheduler_ui->month_temp = (guint)sched_time.tm_mon;
+  	scheduler_ui->day_temp = (guint)sched_time.tm_mday;
+   
+	//hour entry
+	spinbutton_adj = gtk_adjustment_new (sched_time.tm_hour, 00, 23, 1, 10, 10);
+	scheduler_ui->hour_spinbutton = gtk_spin_button_new (GTK_ADJUSTMENT (spinbutton_adj), 1, 0);
+	gtk_box_pack_start (GTK_BOX (hbox), scheduler_ui->hour_spinbutton, FALSE, FALSE, 0);
+
+	label = gtk_label_new ((" : "));
+	gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
+	gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_RIGHT);
+	gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
+
+	//minute entry
+	spinbutton_adj = gtk_adjustment_new (sched_time.tm_min, 0, 59, 1, 10, 10);
+	scheduler_ui->min_spinbutton = gtk_spin_button_new (GTK_ADJUSTMENT (spinbutton_adj), 1, 0);
+	gtk_box_pack_start (GTK_BOX (hbox), scheduler_ui->min_spinbutton, FALSE, FALSE, 0);
+
+	label = gtk_label_new ((" (hh:mm)"));
+
+	gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
+
+}	
+
+static void
+add_date_field (MMythSchedulerUI *scheduler_ui, GtkWidget *vbox)
+{
+	char sched_date[24];
+	GtkWidget *hbox = add_line (vbox, "Date:        ");
+		
+	//sched_date = ctime(&real_time);
+  	g_sprintf (sched_date, "%04d %02d %02d (yyyy mm dd)", scheduler_ui->year_temp, scheduler_ui->month_temp+1, scheduler_ui->day_temp);
+  	sched_date[23]='\0';
+  
+  	scheduler_ui->date_button = gtk_button_new_with_label (sched_date);
+  	gtk_box_pack_start (GTK_BOX (hbox), scheduler_ui->date_button, FALSE, FALSE, 0);
+  	gtk_button_set_relief (GTK_BUTTON (scheduler_ui->date_button), GTK_RELIEF_NONE);
+
+	g_signal_connect (G_OBJECT (scheduler_ui->date_button), "clicked",
+                      G_CALLBACK (run_calendar_dialog), scheduler_ui);
+
+}
+
+static void
+add_duration_field (MMythSchedulerUI *scheduler_ui, GtkWidget *vbox)
+{
+	GtkWidget *hbox = add_line (vbox, "Duration:   ");
+	GtkWidget *label;
+	GtkObject *spinbutton_adj;
+	
+	spinbutton_adj = gtk_adjustment_new (60, 5, 360, 5, 60, 60);
+  	scheduler_ui->duration_spinbutton = gtk_spin_button_new (GTK_ADJUSTMENT (spinbutton_adj), 1, 0);
+  	gtk_box_pack_start (GTK_BOX (hbox), scheduler_ui->duration_spinbutton, FALSE, TRUE, 0);
+  	gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (scheduler_ui->duration_spinbutton), TRUE);
+
+	label = gtk_label_new ((" (minutes)     "));
+  	gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
+}
+
+static void
+add_frequency_field (MMythSchedulerUI *scheduler_ui, GtkWidget *vbox)
+{
+	
+	GtkWidget *hbox = add_line (vbox, "Frequency: ");	
+	
+	scheduler_ui->freq_combobox = gtk_combo_box_new_text ();
+	gtk_box_pack_start (GTK_BOX (hbox), scheduler_ui->freq_combobox, FALSE, FALSE, 0);
+	gtk_combo_box_append_text (GTK_COMBO_BOX (scheduler_ui->freq_combobox), ("Only this day               "));
+	gtk_combo_box_append_text (GTK_COMBO_BOX (scheduler_ui->freq_combobox), ("Daily                            "));
+	gtk_combo_box_append_text (GTK_COMBO_BOX (scheduler_ui->freq_combobox), ("Weekly                         "));
+	gtk_combo_box_set_active(GTK_COMBO_BOX (scheduler_ui->freq_combobox), 0);
+
+}
+
+static void
+add_title_field (MMythSchedulerUI *scheduler_ui, GtkWidget *vbox)
+{
+	GtkWidget *hbox = add_line (vbox, "Title:           ");
+	
+  	scheduler_ui->title_entry = gtk_entry_new ();
+  	gtk_box_pack_start (GTK_BOX (hbox), scheduler_ui->title_entry, FALSE, FALSE, 0);
+  	gtk_entry_set_text (GTK_ENTRY (scheduler_ui->title_entry), "(Optional)");
+	
+}
diff -r 7c409a042a9a -r 7174e23f7617 maemo-ui/src/mmyth_schedulerui.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/maemo-ui/src/mmyth_schedulerui.h	Thu Sep 28 16:02:14 2006 +0100
@@ -0,0 +1,45 @@
+#ifndef MMYTH_SCHEDULERECORDING_H_
+#define MMYTH_SCHEDULERECORDING_H_
+
+#include <glib.h>
+
+typedef struct _MMythSchedulerUI {
+	
+	GList *channel_list;
+	
+	GtkWidget *main_widget;
+
+	GtkWidget *channel_combobox;
+	GtkWidget *freq_combobox;
+	GtkWidget *hour_spinbutton;
+	GtkWidget *min_spinbutton;
+	GtkWidget *duration_spinbutton;
+	GtkWidget *title_entry;
+	GtkWidget *date_button;
+
+	GtkWidget *calendar_dialog;
+	GtkWidget *calendar;
+	
+	guint year_temp, month_temp, day_temp;
+} MMythSchedulerUI;
+
+typedef struct {
+    long int channel_id;
+
+    struct tm start_tm;
+
+    int duration;
+    int frequency;
+
+    GString *title;
+
+} ScheduleEntry;
+
+MMythSchedulerUI* mmyth_schedulerui_new (void);
+
+gboolean mmyth_schedulerui_save (MMythSchedulerUI *scheduler_ui);
+
+void mmyth_schedulerui_cb_schedule_button (GtkButton * button, gpointer user_data);
+
+
+#endif /*MMYTH_SCHEDULERECORDING_H_*/
diff -r 7c409a042a9a -r 7174e23f7617 maemo-ui/src/mmyth_tvplayer.c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/maemo-ui/src/mmyth_tvplayer.c	Thu Sep 28 16:02:14 2006 +0100
@@ -0,0 +1,684 @@
+/**
+ * GMyth Library
+ *
+ * @file gmyth/mmyth_tvplayer.c
+ * 
+ * @brief <p> This component provides playback of the remote A/V using
+ * GStreamer.
+ * 
+ * Copyright (C) 2006 INdT - Instituto Nokia de Tecnologia.
+ * @author Hallyson Luiz de Morais Melo <hallyson.melo@indt.org.br>
+ *
+ *//*
+ * 
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+#include "mmyth_tvplayer.h"
+ 
+#include <gdk/gdkx.h>
+
+#include "gmyth_context.h"
+#include "gmyth_remote_util.h"
+
+typedef struct _GstPlayerWindowStateChange
+{
+    GstElement *play;
+    GstState old_state, new_state;
+    MMythTVPlayer *tvplayer;
+} GstPlayerWindowStateChange;
+
+typedef struct _GstPlayerWindowTagFound
+{
+    GstElement *play;
+    GstTagList *taglist;
+    MMythTVPlayer *tvplayer;
+} GstPlayerWindowTagFound;
+
+/*
+static gboolean idle_state (gpointer data);
+*/
+static gboolean bus_call (GstBus * bus, GstMessage * msg, gpointer data);
+
+static void mmyth_tvplayer_class_init          (MMythTVPlayerClass *klass);
+static void mmyth_tvplayer_init                (MMythTVPlayer *object);
+
+static void mmyth_tvplayer_dispose  (GObject *object);
+static void mmyth_tvplayer_finalize (GObject *object);
+
+G_DEFINE_TYPE(MMythTVPlayer, mmyth_tvplayer, G_TYPE_OBJECT)
+
+static gboolean mmyth_tvplayer_create_pipeline (MMythTVPlayer* tvplayer);
+static void     new_pad_cb (GstElement *element, 
+                            GstPad *pad, gpointer data);
+
+static gboolean expose_cb (GtkWidget * widget, 
+                           GdkEventExpose * event, 
+                           gpointer user_data);
+
+static void
+mmyth_tvplayer_class_init (MMythTVPlayerClass *klass)
+{
+	GObjectClass *gobject_class;
+
+    gobject_class = (GObjectClass *) klass;
+	
+    gobject_class->dispose  = mmyth_tvplayer_dispose;
+    gobject_class->finalize = mmyth_tvplayer_finalize;	
+}
+
+static void
+new_pad_cb (GstElement *element, GstPad *pad, gpointer data)
+{
+	MMythTVPlayer *tvplayer = MMYTH_TVPLAYER (data);
+	GstPadLinkReturn ret;
+	char *s;
+	
+	s = gst_caps_to_string (pad->caps);
+
+	if ( s[0] == 'a') {
+		ret = gst_pad_link (pad, gst_element_get_pad (tvplayer->audioqueue, "sink"));
+	} else {
+		ret = gst_pad_link (pad, gst_element_get_pad (tvplayer->videoqueue, "sink")); 
+	}
+	
+	g_free(s);
+}
+
+static gboolean
+expose_cb (GtkWidget * widget, GdkEventExpose * event, gpointer user_data)
+{
+    MMythTVPlayer *tvplayer = MMYTH_TVPLAYER (user_data);
+
+	if (tvplayer && tvplayer->videow) {
+	    gst_x_overlay_set_xwindow_id (GST_X_OVERLAY (tvplayer->gst_videosink),
+                                  GDK_WINDOW_XWINDOW (widget->window));
+		return TRUE;
+	}
+	
+	g_warning ("MMythTVPlayer expose called before setting video window\n");
+	
+    return FALSE;
+}
+
+static void
+mmyth_tvplayer_init (MMythTVPlayer *tvplayer)
+{
+    tvplayer->gst_pipeline = NULL;
+    tvplayer->gst_source = NULL;
+    tvplayer->gst_videodec = NULL;
+    tvplayer->gst_videosink = NULL;
+    tvplayer->videoqueue = NULL;
+    tvplayer->audioqueue = NULL;
+    
+    /* GTKWidget for rendering the video */
+    tvplayer->videow = NULL;
+	tvplayer->expose_handler = 0;
+	    
+	tvplayer->backend_hostname = NULL;
+	tvplayer->backend_port = 0;
+	tvplayer->local_hostname = NULL;
+
+	tvplayer->remote_encoder = NULL;
+	tvplayer->tvchain = NULL;
+	tvplayer->proginfo = NULL;
+}
+
+static void
+mmyth_tvplayer_dispose (GObject *object)
+{
+
+	G_OBJECT_CLASS (mmyth_tvplayer_parent_class)->dispose (object);
+}
+
+static void
+mmyth_tvplayer_finalize (GObject *object)
+{
+	g_signal_handlers_destroy (object);
+
+	MMythTVPlayer *tvplayer = MMYTH_TVPLAYER (object);
+
+	g_debug ("[%s] Finalizing tvplayer", __FUNCTION__);
+	
+	if (tvplayer->videow != NULL) {
+		if (g_signal_handler_is_connected (tvplayer->videow, 
+						tvplayer->expose_handler)) {
+			g_signal_handler_disconnect (tvplayer->videow,
+				tvplayer->expose_handler);
+		}
+		g_object_unref (tvplayer->videow);
+	}
+	
+	if ( tvplayer->remote_encoder != NULL )
+		g_object_unref (tvplayer->remote_encoder);
+	if ( tvplayer->tvchain != NULL )
+		g_object_unref (tvplayer->tvchain);
+	if ( tvplayer->proginfo != NULL )
+		g_object_unref (tvplayer->proginfo);	
+
+	// Release Gstreamer elements
+	if ( tvplayer->gst_pipeline != NULL )
+		g_object_unref (tvplayer->gst_pipeline);	
+	if ( tvplayer->gst_source != NULL )
+		g_object_unref (tvplayer->gst_source);	
+	if ( tvplayer->gst_videodec != NULL )
+		g_object_unref (tvplayer->gst_videodec);	
+	if ( tvplayer->gst_videosink != NULL )
+		g_object_unref (tvplayer->gst_videosink);	
+	if ( tvplayer->videoqueue != NULL )
+		g_object_unref (tvplayer->videoqueue);	
+	if ( tvplayer->audioqueue != NULL )
+		g_object_unref (tvplayer->audioqueue);	
+
+	G_OBJECT_CLASS (mmyth_tvplayer_parent_class)->finalize (object);
+}
+
+/** Creates a new instance of MMythTVPlayer. 
+ * 
+ * @return a new instance of MMythTVPlayer.
+ */
+MMythTVPlayer *
+mmyth_tvplayer_new ()
+{
+    MMythTVPlayer *tvplayer = 
+        MMYTH_TVPLAYER (g_object_new(MMYTH_TVPLAYER_TYPE, NULL));
+    
+    return tvplayer;
+}
+
+/** Initializes the tv player.
+ *
+ * @param tvplayer the object instance.
+ * @return gboolean TRUE if the pipeline was created 
+ * successfully, FALSE otherwise.
+ */
+gboolean
+mmyth_tvplayer_initialize (MMythTVPlayer *tvplayer)
+{
+	
+    if (!mmyth_tvplayer_create_pipeline (tvplayer)) {
+    	g_warning ("[%s] Error while creating pipeline. TV Player not initialized", __FUNCTION__);
+		return FALSE;
+	} else {
+		g_debug ("[%s] GStreamer pipeline created", __FUNCTION__);	
+    }
+
+	return TRUE;
+}
+
+/** Creates the GStreamer pipeline used by the player.
+ *
+ * @param tvplayer the object instance.
+ * @return gboolean TRUE if the pipeline was created 
+ * successfully, FALSE otherwise.
+ */
+static gboolean
+mmyth_tvplayer_create_pipeline (MMythTVPlayer* tvplayer)
+{
+    GstElement *pipeline;
+    GstElement *source, *parser;
+    GstElement *videodec, *videosink;
+#ifndef MAEMO_PLATFORM    
+    GstElement *audiodec, *audioconv;
+#endif
+    GstElement *audiosink;
+    GstElement *videoqueue, *audioqueue;
+
+    g_debug ("MMythTVPlayer: Setting the Gstreamer pipeline\n");
+	
+    pipeline = gst_pipeline_new ("video-player");
+    source = gst_element_factory_make ("mythtvsrc", "myth-source");
+    parser = gst_element_factory_make ("ffdemux_nuv", "nuv-demux");
+
+    /* Gstreamer Video elements */
+    videoqueue = gst_element_factory_make ("queue", "video-queue");
+    videodec = gst_element_factory_make ("ffdec_mpeg4", "video-decoder");
+#ifdef MAEMO_PLATFORM
+    videosink = gst_element_factory_make ("sdlvideosink", "image-output");
+#else
+    videosink = gst_element_factory_make ("xvimagesink", "image-output");
+#endif
+    
+    /* Gstreamer Audio elements */
+    audioqueue = gst_element_factory_make ("queue", "audio-queue");    
+#ifdef MAEMO_PLATFORM    
+    audiosink = gst_element_factory_make ("dspmp3sink", "audio-output");
+#else    
+    audiodec = gst_element_factory_make ("ffdec_mp3", "audio-decoder");
+    audioconv = gst_element_factory_make ("audioconvert", "audio-converter");
+    audiosink = gst_element_factory_make ("alsasink", "audio-output");
+#endif    
+    
+    if (!(pipeline && source && parser && videodec && videosink) ||
+    	!(videoqueue && audioqueue && audiosink)) {
+        /* FIXME: hanlde the error correctly */
+        /* video_alignment is not being created (below) 
+           and is causing problems to the ui */
+
+	    tvplayer->gst_pipeline = NULL;
+	    tvplayer->gst_videodec = NULL;
+	    tvplayer->gst_videosink = NULL;
+           
+        g_warning ("GstElement creation error!\n");
+        return FALSE;
+    }
+
+#ifndef MAEMO_PLATFORM    
+    if (!(audiodec && audioconv)) {
+        g_warning ("GstElement for audio stream creation error!");
+        return FALSE;
+    }
+#endif    
+    
+    
+    tvplayer->gst_pipeline = pipeline;
+    tvplayer->gst_source = source;
+    tvplayer->gst_videodec = videodec;
+    tvplayer->gst_videosink = videosink;
+    g_object_ref (tvplayer->gst_pipeline);
+    g_object_ref (tvplayer->gst_source);
+    g_object_ref (tvplayer->gst_videodec);
+    g_object_ref (tvplayer->gst_videosink);
+
+    tvplayer->videoqueue = videoqueue;
+    tvplayer->audioqueue = audioqueue;
+    g_object_ref (tvplayer->videoqueue);
+    g_object_ref (tvplayer->audioqueue);
+   	
+    g_object_set (G_OBJECT (videosink), "sync", TRUE, NULL);
+    g_object_set (G_OBJECT (audiosink), "sync", FALSE, NULL);
+
+    gst_bus_add_watch (gst_pipeline_get_bus (GST_PIPELINE (tvplayer->gst_pipeline)),
+                       bus_call, tvplayer);
+
+    gst_bin_add_many (GST_BIN (pipeline), source, parser, videoqueue,
+    			videodec, videosink, audioqueue, audiodec, audioconv, audiosink, NULL);
+
+    {
+//        GstCaps *rtpcaps = gst_caps_new_simple ("application/x-rtp", NULL);
+//        gst_element_link_filtered(source, parser, rtpcaps);
+    }
+    
+    gst_element_link (source, parser);
+    gst_element_link_many (videoqueue, videodec, videosink, NULL);
+    gst_element_link_many (audioqueue, audiodec, audioconv, audiosink, NULL);
+    
+    g_signal_connect (parser, "pad-added", G_CALLBACK (new_pad_cb), tvplayer);
+    
+    return TRUE;
+}
+
+/** Configures the backend and the tv player 
+ * for playing the recorded content A/V.
+ *
+ * FIXME: Change filename to program info or other structure about the recorded
+ *
+ * @param tvplayer the object instance.
+ * @param filename the file uri of the recorded content to be played.
+ * @return TRUE if successfull, FALSE if any error happens.
+ */
+gboolean
+mmyth_tvplayer_record_setup (MMythTVPlayer *tvplayer, gchar *filename)
+{
+	GMythSettings *msettings = gmyth_context_get_settings();
+	
+	// FIXME: we should receive the uri instead of filename
+	GString *hostname = gmyth_settings_get_backend_hostname (msettings);
+	int port = gmyth_settings_get_backend_port(msettings);
+	
+	GString *fullpath = g_string_new ("myth://");
+	g_string_append_printf (fullpath, "%s:%d/%s", hostname->str, port, filename);
+	
+	tvplayer->is_livetv = FALSE;
+
+	g_debug ("[%s] Setting record uri to gstreamer pipeline to %s", __FUNCTION__, fullpath->str);
+		
+    g_object_set (G_OBJECT (tvplayer->gst_source), "location",
+          fullpath->str, NULL);
+          
+    return TRUE;
+}
+
+/** Configures the backend and the tv player 
+ * for playing the live tv.
+ *
+ * @param tvplayer the object instance.
+ * @return TRUE if successfull, FALSE if any error happens.
+ */
+gboolean
+mmyth_tvplayer_livetv_setup (MMythTVPlayer *tvplayer)
+{
+	GMythSettings *msettings = gmyth_context_get_settings ();
+	gboolean res = TRUE;
+
+	res = gmyth_context_check_connection();
+	if (!res) {
+		g_warning ("[%s] LiveTV can not connect to backend", __FUNCTION__);	
+		res = FALSE;
+		goto error;
+	}
+
+	tvplayer->backend_hostname = gmyth_settings_get_backend_hostname(msettings);
+	tvplayer->backend_port = gmyth_settings_get_backend_port (msettings);
+
+	tvplayer->local_hostname  = g_string_new("");    
+	gmyth_context_get_local_hostname (tvplayer->local_hostname);
+
+	if ( tvplayer->local_hostname == NULL ) {
+		res = FALSE;
+		goto error;
+	}
+
+	// Gets the remote encoder num
+	tvplayer->remote_encoder = remote_request_next_free_recorder (-1);
+
+	if ( tvplayer->remote_encoder == NULL ) {
+		g_warning ("[%s] None remote encoder available", __FUNCTION__);
+		res = FALSE;
+		goto error;
+	}
+
+	// Creates livetv chain handler
+	tvplayer->tvchain = GMYTH_TVCHAIN ( g_object_new(GMYTH_TVCHAIN_TYPE, NULL) );
+	gmyth_tvchain_initialize ( tvplayer->tvchain, tvplayer->local_hostname );
+
+	if ( tvplayer->tvchain == NULL || tvplayer->tvchain->tvchain_id == NULL ) {
+		res = FALSE;
+		goto error;
+	}
+
+	// Init remote encoder. Opens its control socket.
+	res = gmyth_remote_encoder_setup(tvplayer->remote_encoder);
+	if ( !res ) {
+		g_warning ("[%s] Fail while setting remote encoder\n", __FUNCTION__);
+		res = FALSE;
+		goto error;
+	}
+	// Spawn live tv. Uses the socket to send mythprotocol data to start livetv in the backend (remotelly)
+	res = gmyth_remote_encoder_spawntv ( tvplayer->remote_encoder,
+			gmyth_tvchain_get_id(tvplayer->tvchain) );
+	if (!res) {
+		g_warning ("[%s] Fail while spawn tv\n", __FUNCTION__);
+		res = FALSE;
+		goto error;
+	}
+
+	// Reload all TV chain from Mysql database.
+	gmyth_tvchain_reload_all (tvplayer->tvchain);
+
+	if ( tvplayer->tvchain == NULL ) {
+		res = FALSE;
+		goto error;
+	}
+
+	// Get program info from database using chanid and starttime
+	tvplayer->proginfo = gmyth_tvchain_get_program_at (tvplayer->tvchain, -1);
+	if ( tvplayer->proginfo == NULL ) {
+		g_warning ("[%s] LiveTV not successfully started.\n", __FUNCTION__ );
+		res = FALSE;
+		goto error;
+	} else {
+		g_debug ("[%s] MythLiveTV: All requests to backend to start TV were OK.\n", __FUNCTION__ );
+	}
+
+	return res;
+
+error:
+	if ( tvplayer->backend_hostname != NULL ) {
+		g_string_free( tvplayer->backend_hostname, TRUE );
+		res = FALSE;
+	}
+
+	if ( tvplayer->local_hostname != NULL ) {
+		g_string_free( tvplayer->local_hostname, TRUE );
+		res = FALSE;
+	}
+
+	if ( tvplayer->remote_encoder != NULL ) {
+		g_object_unref (tvplayer->remote_encoder);
+		tvplayer->remote_encoder = NULL;
+	}
+
+	if ( tvplayer->tvchain != NULL ) {
+		g_object_unref (tvplayer->tvchain);
+		tvplayer->tvchain = NULL;
+	}
+
+	if ( tvplayer->proginfo != NULL ) {
+		g_object_unref (tvplayer->proginfo);
+		tvplayer->proginfo = NULL;
+	}
+
+	return res;
+
+}
+
+/** Sets the GTK video widget for the tv player. 
+ *
+ * @param tvplayer the object instance.
+ * @param videow the GTK video window.
+ * @return TRUE if successfull, FALSE if any error happens.
+ */
+gboolean
+mmyth_tvplayer_set_widget (MMythTVPlayer *tvplayer, GtkWidget *videow)
+{
+	tvplayer->videow = videow;
+	g_object_ref (videow);
+	
+	g_debug ("[%s] Setting widget for tv player render", __FUNCTION__);
+	
+    tvplayer->expose_handler = g_signal_connect (tvplayer->videow, "expose-event", 
+                                                 G_CALLBACK (expose_cb), tvplayer);
+
+    //g_signal_connect(miptv_ui->videow, "size_request", G_CALLBACK(cb_preferred_video_size), miptv_ui);
+
+    return TRUE;
+}
+
+static gboolean
+bus_call (GstBus * bus, GstMessage * msg, gpointer data)
+{
+    //MMythTVPlayer *tvplayer = MMYTH_TVPLAYER ( data );
+    //GMainLoop *loop = tvplayer->loop;
+
+    switch (GST_MESSAGE_TYPE (msg)) {
+        case GST_MESSAGE_EOS:
+			printf ("End of stream\n");
+            //g_idle_add ((GSourceFunc) idle_eos, data);
+            gst_element_set_state ( GST_ELEMENT (GST_MESSAGE_SRC (msg)), GST_STATE_NULL );
+	    gst_element_set_locked_state ( GST_ELEMENT (GST_MESSAGE_SRC (msg)), FALSE );
+            break;
+        case GST_MESSAGE_ERROR:
+        {
+                gchar *debug;
+                GError *err;
+
+                gst_message_parse_error (msg, &err, &debug);
+                g_free (debug);
+
+                printf ("Error: %s\n", err->message);
+                g_error_free (err);
+
+                //g_main_loop_quit (loop);
+        }
+            break;
+        default:
+            printf (gst_message_type_get_name (GST_MESSAGE_TYPE (msg)));
+            printf ("\n");
+            break;
+    }
+
+    return TRUE;
+}
+
+
+#if 0
+static gboolean
+idle_state (gpointer data)
+{
+    GstPlayerWindowStateChange *st = data;
+
+    if (st->old_state == GST_STATE_PLAYING) {
+        if (st->miptv_ui->idle_id != 0) {
+            g_source_remove (st->miptv_ui->idle_id);
+            st->miptv_ui->idle_id = 0;
+        }
+    }
+    else if (st->new_state == GST_STATE_PLAYING) {
+        if (st->miptv_ui->idle_id != 0)
+            g_source_remove (st->miptv_ui->idle_id);
+
+        st->miptv_ui->idle_id = g_idle_add (cb_iterate, st->miptv_ui);
+    }
+
+    /* new movie loaded? */
+    if (st->old_state == GST_STATE_READY && st->new_state > GST_STATE_READY) {
+
+        /* gboolean have_video = FALSE; */
+
+        gtk_widget_show (st->miptv_ui->videow);
+
+        gtk_window_resize (GTK_WINDOW (st->miptv_ui->main_window), 1, 1);
+
+    }
+
+    /* discarded movie? */
+    if (st->old_state > GST_STATE_READY && st->new_state == GST_STATE_READY) {
+
+        if (st->miptv_ui->tagcache) {
+            gst_tag_list_free (st->miptv_ui->tagcache);
+            st->miptv_ui->tagcache = NULL;
+        }
+    }
+
+    gst_object_unref (GST_OBJECT (st->play));
+    //g_object_unref (G_OBJECT (st->win));
+    g_free (st);
+
+    /* once */
+    return FALSE;
+}
+
+#endif
+
+/** Stops playing the current A/V.
+ *
+ * FIXME: How to proceed differently between livetv 
+ * and recorded content?
+ *
+ * @param tvplayer the object instance.
+ * @return void 
+ */
+void
+mmyth_tvplayer_stop_playing (MMythTVPlayer *tvplayer) 
+{
+    g_debug ("[%s] Setting gstreamer pipeline state to NULL", __FUNCTION__);
+
+    gst_element_set_state (tvplayer->gst_pipeline, GST_STATE_NULL);
+    
+    if (tvplayer->is_livetv) {
+	    if (!gmyth_remote_encoder_stop_livetv (tvplayer->remote_encoder)) {
+	    	g_warning ("[%s] Error while stoping remote encoder", __FUNCTION__);	
+	    }
+    }
+}
+
+/** Queries if the tvplayer is active playing A/V content.
+ *
+ * @param tvplayer the object instance.
+ * @return TRUE if the tvplayer is active, FALSE otherwise.
+ */
+gboolean
+mmyth_tvplayer_is_playing (MMythTVPlayer *tvplayer)
+{
+	return (GST_STATE (tvplayer->gst_pipeline) == GST_STATE_PLAYING);
+}
+
+/** Static function that sets the tvplayer state to PLAYING.
+ *
+ * @param tvplayer the object instance.
+ * @return TRUE if the tvplayer is active, FALSE otherwise.
+ */
+static gboolean
+idle_play (gpointer data)
+{
+    MMythTVPlayer *tvplayer = MMYTH_TVPLAYER (data);
+
+	g_debug ("MMythTVPlayer: Setting pipeline state to PLAYING\n");
+
+    gst_element_set_state (tvplayer->gst_pipeline, GST_STATE_PLAYING);
+
+    return FALSE;
+}
+
+/** Start playing A/V with the tvplayer attributes.
+ *
+ * @param tvplayer the object instance.
+ */
+void
+mmyth_tvplayer_start_playing (MMythTVPlayer *tvplayer)
+{
+
+	// FIXME: Move this to livetv_setup??
+	if (tvplayer->is_livetv) {
+
+	#if 0
+		if (!tvplayer || !(tvplayer->proginfo) || !(tvplayer->local_hostname)
+				|| !(tvplayer->gst_source)) {
+			g_warning ("GMythtvPlayer not ready to start playing\n");		
+		}
+
+		if (!(tvplayer->proginfo->pathname)) {
+			g_warning ("[%s] Playback url is null, could not play the myth content", __FUNCTION__);
+			return;
+		}
+
+		g_debug ("MMythTVPlayer: Start playing %s", tvplayer->proginfo->pathname->str);
+#endif
+		g_object_set (G_OBJECT (tvplayer->gst_source), "mythtv-live",
+				TRUE, NULL);
+#if 0
+		if ( tvplayer->tvchain != NULL ) {
+			GString *str_chainid = gmyth_tvchain_get_id(tvplayer->tvchain);
+			g_print( "[%s]\tCHAIN ID: %s\n", __FUNCTION__, str_chainid->str );
+
+			g_object_set (G_OBJECT (tvplayer->gst_source), "mythtv-live-chainid", 
+					g_strdup( str_chainid->str ), NULL);      
+			if ( str_chainid!=NULL)
+				g_string_free( str_chainid, FALSE );
+		}
+
+		if ( tvplayer->remote_encoder != NULL )	
+			g_object_set (G_OBJECT (tvplayer->gst_source), "mythtv-live-id",
+					tvplayer->remote_encoder->recorder_num, NULL );
+		g_debug ("[%s] Setting location to %s", __FUNCTION__, 
+				tvplayer->proginfo->pathname->str);
+
+		/* Sets the gstreamer properties acording to the service access address */
+		g_object_set (G_OBJECT (tvplayer->gst_source), "location",
+				tvplayer->proginfo->pathname->str, NULL);              
+#endif
+	}
+
+	g_object_set (G_OBJECT (tvplayer->gst_source), "mythtv-version",
+              MYTHTV_VERSION_DEFAULT, NULL);
+
+    g_object_set (G_OBJECT (tvplayer->gst_source), "mythtv-debug",
+              TRUE, NULL);
+
+    g_idle_add (idle_play, tvplayer);
+
+}
+
diff -r 7c409a042a9a -r 7174e23f7617 maemo-ui/src/mmyth_tvplayer.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/maemo-ui/src/mmyth_tvplayer.h	Thu Sep 28 16:02:14 2006 +0100
@@ -0,0 +1,112 @@
+/**
+ * GMyth Library
+ *
+ * @file gmyth/mmyth_tvplayer.h
+ * 
+ * @brief <p> This component provides playback of the remote A/V using
+ * GStreamer.
+ * 
+ * Copyright (C) 2006 INdT - Instituto Nokia de Tecnologia.
+ * @author Hallyson Luiz de Morais Melo <hallyson.melo@indt.org.br>
+ *
+ *//*
+ * 
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+#ifndef MMYTH_TVPLAYER_H_
+#define MMYTH_TVPLAYER_H_
+
+#include <glib-object.h>
+#include <gtk/gtk.h>
+
+/* GStreamer includes */
+#include <gst/gst.h>
+#include <gst/interfaces/xoverlay.h>
+
+#include "gmyth_remote_encoder.h"
+#include "gmyth_tvchain.h"
+#include "gmyth_common.h"
+
+G_BEGIN_DECLS
+
+#define MMYTH_TVPLAYER_TYPE               (mmyth_tvplayer_get_type ())
+#define MMYTH_TVPLAYER(obj)               (G_TYPE_CHECK_INSTANCE_CAST ((obj), MMYTH_TVPLAYER_TYPE, MMythTVPlayer))
+#define MMYTH_TVPLAYER_CLASS(klass)       (G_TYPE_CHECK_CLASS_CAST ((klass), MMYTH_TVPLAYER_TYPE, MMythTVPlayerClass))
+#define IS_MMYTH_TVPLAYER(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), MMYTH_TVPLAYER_TYPE))
+#define IS_MMYTH_TVPLAYER_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), MMYTH_TVPLAYER_TYPE))
+#define MMYTH_TVPLAYER_GET_CLASS(obj)     (G_TYPE_INSTANCE_GET_CLASS ((obj), MMYTH_TVPLAYER_TYPE, MMythTVPlayerClass))
+
+
+typedef struct _MMythTVPlayer         MMythTVPlayer;
+typedef struct _MMythTVPlayerClass    MMythTVPlayerClass;
+
+struct _MMythTVPlayerClass
+{
+    GObjectClass parent_class;
+
+      /* callbacks */
+      /*  no one for now */
+};
+
+struct _MMythTVPlayer
+{
+    GObject parent;
+    
+    GstElement *gst_pipeline;
+    GstElement *gst_source;
+    GstElement *gst_videodec;
+    GstElement *gst_videosink;
+    GstElement *videoqueue;
+    GstElement *audioqueue;
+    
+    gulong expose_handler;
+//    GMainLoop *loop;
+    
+    GtkWidget *videow;
+
+	/* Backend connection related variables */
+	GString *backend_hostname;
+	gint backend_port;
+	GString *local_hostname;
+
+	GMythRemoteEncoder *remote_encoder;
+	GMythTVChain *tvchain;
+	GMythProgramInfo *proginfo;
+	
+	gboolean is_livetv;
+};
+
+
+GType          mmyth_tvplayer_get_type (void);
+
+MMythTVPlayer* mmyth_tvplayer_new ();
+gboolean       mmyth_tvplayer_initialize (MMythTVPlayer *tvplayer);
+
+void           mmyth_tvplayer_start_playing   (MMythTVPlayer *tvplayer);
+void           mmyth_tvplayer_stop_playing    (MMythTVPlayer *tvplayer);
+
+gboolean       mmyth_tvplayer_set_widget   (MMythTVPlayer *tvplayer, 
+                                            GtkWidget *videow);
+
+gboolean       mmyth_tvplayer_is_playing   (MMythTVPlayer *tvplayer);
+
+gboolean       mmyth_tvplayer_record_setup (MMythTVPlayer *tvplayer, 
+                                            gchar *filename);
+gboolean       mmyth_tvplayer_livetv_setup (MMythTVPlayer *tvplayer);
+
+G_END_DECLS
+
+#endif /*MMYTH_TVPLAYER_H_*/
diff -r 7c409a042a9a -r 7174e23f7617 maemo-ui/src/mmyth_ui.c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/maemo-ui/src/mmyth_ui.c	Thu Sep 28 16:02:14 2006 +0100
@@ -0,0 +1,814 @@
+
+#include <glib-object.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <string.h>
+#include <stdio.h>
+#include <gtk/gtk.h>
+#include <gdk/gdkx.h>
+#include <gst/interfaces/xoverlay.h>
+#include <assert.h>
+
+#include "mmyth_ui.h"
+#include "mmyth_uicommon.h"
+#include "mmyth_schedulerui.h"
+#include "mmyth_recordui.h"
+#include "mmyth_uisettings.h"
+#include "mmyth_epg_grid_view.h"
+#include "mmyth_tvplayer.h"
+
+/* GMyth library includes */
+#include "gmyth_context.h"
+
+#ifndef MAEMO_PLATFORM
+static gint button_press_handler (GtkWidget *widget, GdkEvent *event);
+#endif
+
+static MMythUiCommon *create_main_view (MMythUi * mmyth_ui);
+static MMythUiCommon *create_video_view (MMythUi * mmyth_ui);
+static MMythUiCommon *create_epg_grid_view (MMythUi * mmyth_ui);
+static MMythUiCommon *create_record_view (MMythUi * mmyth_ui);
+static MMythUiCommon *create_schedule_view (MMythUi * mmyth_ui);
+
+static void cb_video_close_button (GtkButton * button, gpointer user_data);
+static void cb_record_button (GtkButton * button, gpointer user_data);
+static void cb_menu_item_settings (GtkMenuItem *menuitem, gpointer user_data);
+
+/* main box from button box separator*/
+static GtkWidget *main_vseparator = NULL;
+
+GdkPixbuf *icon_sports, *icon_news, 
+          *icon_movies, *icon_shows, *icon_default;
+
+#ifndef MAEMO_PLATFORM
+/* FIXME: */
+static MMythUi *popup_mmyth_ui;
+#endif
+
+MMythUi *
+mmyth_ui_initialize (
+#ifdef MAEMO_PLATFORM
+	HildonProgram *program,
+#endif
+	GtkWidget * main_window)
+{
+    MMythUi *mmyth_ui;
+
+    mmyth_ui = g_new0 (MMythUi, 1);
+
+    mmyth_ui->main_window = main_window;    
+    mmyth_ui->videow = NULL;
+    mmyth_ui->mmyth_recordui = NULL;
+    mmyth_ui->mmyth_schedulerui = NULL;
+	
+    /* Horizontal box that divides the view into control and video area */
+    mmyth_ui->main_hbox = gtk_hbox_new (FALSE, 0);
+    gtk_widget_show (mmyth_ui->main_hbox);
+    g_object_ref (mmyth_ui->main_hbox);
+
+    main_bg_color.red   = 65000;
+    main_bg_color.green = 65000;
+    main_bg_color.blue  = 65000;
+    
+    
+#ifndef MAEMO_PLATFORM
+    /* Popup menu */
+    popup_mmyth_ui = mmyth_ui;
+    g_signal_connect (G_OBJECT (mmyth_ui->main_hbox), "event",
+                      G_CALLBACK (button_press_handler),
+                      G_OBJECT (mmyth_ui->main_hbox));    
+
+#else // #ifdef MAEMO
+
+    mmyth_ui->main_menu = GTK_MENU(gtk_menu_new());
+    hildon_program_set_common_menu(program, mmyth_ui->main_menu);
+
+    mmyth_ui->menu_setup = gtk_menu_item_new_with_label("Setup");
+    gtk_widget_set_size_request (GTK_WIDGET (mmyth_ui->menu_setup), 150, 40);
+    gtk_menu_append(mmyth_ui->main_menu, mmyth_ui->menu_setup);
+
+    g_signal_connect(G_OBJECT(mmyth_ui->menu_setup), "activate", G_CALLBACK(cb_menu_item_settings), mmyth_ui);
+
+    gtk_widget_show_all (GTK_WIDGET (mmyth_ui->main_menu));
+#endif
+    
+    // Main widget is mmyth_ui->main_hbox
+    mmyth_ui->main_uicommon       = create_main_view (mmyth_ui);
+
+    gtk_container_add (GTK_CONTAINER (mmyth_ui->main_window),
+                       mmyth_ui->main_hbox);
+
+    mmyth_ui_set_widget (mmyth_ui, mmyth_ui->main_uicommon);
+
+    return mmyth_ui;
+}
+
+void
+mmyth_ui_finalize (MMythUi * mmyth_ui)
+{
+    if (mmyth_ui != NULL) {
+    	if (mmyth_ui->main_uicommon)
+	    	mmyth_uicommon_free (mmyth_ui->main_uicommon);
+    	if (mmyth_ui->video_uicommon)
+		    mmyth_uicommon_free (mmyth_ui->video_uicommon);
+		if (mmyth_ui->epg_grid_uicommon)
+		    mmyth_uicommon_free (mmyth_ui->epg_grid_uicommon);
+		if (mmyth_ui->record_uicommon)
+		    mmyth_uicommon_free (mmyth_ui->record_uicommon);	    
+		if (mmyth_ui->schedule_uicommon)
+		    mmyth_uicommon_free (mmyth_ui->schedule_uicommon);
+
+	    g_free (mmyth_ui);
+    }
+}
+
+void
+mmyth_ui_set_widget (MMythUi * mmyth_ui, MMythUiCommon * new_uicommon)
+{
+	if (new_uicommon == NULL) {
+		g_warning ("MMythUI setting a NULL UI_Common as current display\n");
+		return;
+	}
+		
+    if (mmyth_ui->current_uicommon) {
+        if (mmyth_ui->current_uicommon == mmyth_ui->video_uicommon) {
+            gtk_widget_hide (mmyth_ui->current_uicommon->main_widget);
+            gtk_widget_hide (mmyth_ui->videow);
+        }
+        else {
+            gtk_container_remove (GTK_CONTAINER (mmyth_ui->main_hbox),
+                                  mmyth_ui->current_uicommon->main_widget);
+        }
+
+        gtk_container_remove (GTK_CONTAINER (mmyth_ui->main_hbox),
+                              mmyth_ui->current_uicommon->event_box);
+        gtk_container_remove (GTK_CONTAINER (mmyth_ui->main_hbox),
+                              main_vseparator);        
+
+    }
+
+    if (new_uicommon->main_widget == mmyth_ui->video_alignment) {
+        //gst_player_video_show (GST_PLAYER_VIDEO(mmyth_ui->videow));
+        gtk_widget_show (mmyth_ui->video_alignment);
+        gtk_widget_show (mmyth_ui->videow);
+    }
+    else {
+        /* FIXME: Fst call is NULL when mmyth_player_init fails */
+        if(mmyth_ui->video_alignment != NULL)
+            gtk_widget_hide (mmyth_ui->video_alignment);
+        /* FIXME: Fst call is NULL when mmyth_player_init fails */
+        if(mmyth_ui->videow != NULL)
+            gtk_widget_hide (mmyth_ui->videow);
+
+        gtk_box_pack_start (GTK_BOX (mmyth_ui->main_hbox),
+                            new_uicommon->main_widget, TRUE, TRUE, 0);
+    }
+
+    if(main_vseparator == NULL) {
+        /* FIXME: should free this variable*/
+        main_vseparator = gtk_vseparator_new();
+        g_object_ref (main_vseparator);                   
+    }  
+    gtk_box_pack_start (GTK_BOX (mmyth_ui->main_hbox),
+                        main_vseparator, FALSE, FALSE, 0);    
+    gtk_widget_show (main_vseparator);
+
+    gtk_box_pack_end (GTK_BOX (mmyth_ui->main_hbox), new_uicommon->event_box, FALSE,
+                      FALSE, 0);         
+
+    mmyth_ui->current_uicommon = new_uicommon;
+
+}
+
+/* The close callback is the same for all windows*/
+static void
+cb_not_impl_button (GtkButton * button, gpointer user_data)
+{
+    MMythUi *mmyth_ui = (MMythUi *) user_data;
+
+    GtkWidget *msg_dialog = gtk_message_dialog_new (
+                                           GTK_WINDOW(mmyth_ui->main_window),
+                                           GTK_DIALOG_MODAL |
+                                           GTK_DIALOG_DESTROY_WITH_PARENT,
+                                           GTK_MESSAGE_INFO,
+                                           GTK_BUTTONS_OK,
+                                           "Feature not implemented");
+    gtk_widget_set_size_request (msg_dialog, 350, 120);
+
+    gtk_dialog_run (GTK_DIALOG (msg_dialog));
+
+    gtk_widget_destroy(GTK_WIDGET(msg_dialog)); 
+}
+
+/******************************************************************************
+ *                        POPUP MENU WIDGET METHODS                           *
+ *****************************************************************************/
+
+static void 
+cb_menu_item_settings (GtkMenuItem *menuitem,
+                            gpointer user_data)
+{
+    
+    MMythUi *mmyth_ui = (MMythUi*) user_data;
+   
+    if (mmyth_uisettings_run (GTK_WINDOW (mmyth_ui->main_window))) {
+    	// If user changes the settings, we restart the context
+    	g_debug ("[%s] Restarting mmyth_context to new settings", __FUNCTION__);
+    	gmyth_context_initialize();
+    }
+}
+
+#ifndef MAEMO_PLATFORM
+
+static void 
+detacher (GtkWidget *attach_widget,GtkMenu *menu) 
+{
+	
+}
+
+static void
+do_popup_menu (GtkWidget *my_widget, GdkEventButton *event)
+{
+    GtkWidget *popup;
+
+  int button, event_time;
+
+  GtkWidget *item_general;
+  GtkWidget *image;
+
+  popup = gtk_menu_new ();
+
+  item_general = gtk_image_menu_item_new_with_mnemonic ("Setup");
+  gtk_widget_show (item_general);
+  gtk_container_add (GTK_CONTAINER (popup), item_general);
+
+  image = gtk_image_new_from_stock ("gtk-edit", GTK_ICON_SIZE_MENU);
+  gtk_widget_show (image);
+  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (item_general), image);
+
+  g_signal_connect (G_OBJECT(item_general), "activate", G_CALLBACK (cb_menu_item_settings), popup_mmyth_ui);
+
+    if (event) {
+      button = event->button;
+      event_time = event->time;
+    } else {
+      button = 0;
+      event_time = gtk_get_current_event_time ();
+    }
+    
+    gtk_menu_attach_to_widget (GTK_MENU (popup), my_widget, detacher);
+    gtk_menu_popup (GTK_MENU (popup), NULL, NULL, NULL, NULL, 
+                  button, event_time);
+    gtk_widget_show_all(popup);
+}
+
+/* Respond to a button-press by posting a menu passed in as widget.
+ *
+ * Note that the "widget" argument is the menu being posted, NOT
+ * the button that was pressed.
+ */
+static gint 
+button_press_handler (GtkWidget *widget, GdkEvent *event)
+{
+
+    if (event->type == GDK_BUTTON_PRESS) {
+      GdkEventButton *bevent = (GdkEventButton *) event; 
+          /* Ignore double-clicks and triple-clicks */
+      if (bevent->button == 3)
+        {
+          do_popup_menu (widget, bevent);
+          return TRUE;
+        }
+    }
+
+    /* Tell calling code that we have not handled this event; pass it on. */
+    return FALSE;
+}
+#endif
+
+/******************************************************************************
+ *                          MAIN APP VIEW METHODS                             *
+ *****************************************************************************/
+
+static void
+cb_close_button (GtkButton * button, gpointer user_data)
+{
+    MMythUi *mmyth_ui = (MMythUi *) user_data;
+
+    mmyth_ui_set_widget (mmyth_ui, mmyth_ui->main_uicommon);
+}
+
+static void
+cb_watch_tv_button (GtkButton * button, gpointer user_data)
+{
+    MMythUi *mmyth_ui = (MMythUi *) user_data;
+	gboolean res = FALSE;
+	
+	if (!(mmyth_ui->video_uicommon))
+		mmyth_ui->video_uicommon = create_video_view (mmyth_ui);
+	
+	// Creates the tv player that will retrieve the mythtv content, decode and show it
+	mmyth_ui->tvplayer = mmyth_tvplayer_new ();
+	/* choose here if this is a LiveTV session */
+	mmyth_ui->tvplayer->is_livetv = TRUE;
+
+	res = mmyth_tvplayer_initialize (mmyth_ui->tvplayer);
+
+	if (!res) {
+		g_warning ("[%s] Could not initialize tvplayer", __FUNCTION__);
+
+		g_object_unref (mmyth_ui->tvplayer);
+		mmyth_ui->tvplayer = NULL;
+
+		GtkWidget *dialog = gtk_message_dialog_new (
+				GTK_WINDOW(mmyth_ui->main_window),
+				GTK_DIALOG_DESTROY_WITH_PARENT,
+                GTK_MESSAGE_ERROR,
+                GTK_BUTTONS_CLOSE,
+			 	"MMyth found errors while starting TV Player, please check "
+			 	"the GStreamer installation");
+
+		gtk_dialog_run (GTK_DIALOG (dialog));
+		gtk_widget_destroy (dialog);
+		
+		return;
+	}
+	//res = mmyth_tvplayer_livetv_setup (mmyth_ui->tvplayer);
+	//
+	if (mmyth_ui && mmyth_ui->tvplayer && res) {
+		mmyth_tvplayer_set_widget (mmyth_ui->tvplayer, mmyth_ui->videow);
+		mmyth_tvplayer_start_playing (mmyth_ui->tvplayer);
+	} else {
+		// TODO: Show Alert with error description!
+		g_warning ("[%s] MMythUI can't initialize tv_player", __FUNCTION__);
+		g_object_unref (mmyth_ui->tvplayer);
+		mmyth_ui->tvplayer = NULL;
+		// FIXME: Show the exact error that happened
+		GtkWidget *dialog = gtk_message_dialog_new (
+				GTK_WINDOW(mmyth_ui->main_window),
+				GTK_DIALOG_DESTROY_WITH_PARENT,
+                GTK_MESSAGE_ERROR,
+                GTK_BUTTONS_CLOSE,
+                "Error while starting TV Player, please check if the backend"
+                " is running properly and a tv card is available!");
+		gtk_dialog_run (GTK_DIALOG (dialog));
+		gtk_widget_destroy (dialog);		
+		return;
+	}
+	mmyth_ui_set_widget (mmyth_ui, mmyth_ui->video_uicommon);
+	
+}
+
+static void 
+cb_epg_button (GtkButton * button, gpointer user_data)
+{
+    MMythUi *mmyth_ui = (MMythUi *) user_data;
+    
+    if (!(mmyth_ui->epg_grid_uicommon))
+    	mmyth_ui->epg_grid_uicommon = create_epg_grid_view(mmyth_ui);
+    	
+    mmyth_ui_set_widget (mmyth_ui, mmyth_ui->epg_grid_uicommon);
+}
+
+static MMythUiCommon *
+create_main_view (MMythUi * mmyth_ui)
+{
+    MMythUiCommon *ui_common;
+    GtkWidget *main_widget;
+    GtkWidget *image;
+
+	g_debug ("Creating Main UI Common");
+	
+    // FIXME: file path
+#ifdef MMYTH_DEV
+    image = gtk_image_new_from_file ("../pixmaps/mmyth_logo.png");
+#else
+    image = gtk_image_new_from_file ( PIX_DIR "mmyth_logo.png");
+#endif
+    
+    main_widget = gtk_event_box_new();
+    
+    gtk_container_add (GTK_CONTAINER (main_widget),
+                       image);
+
+
+    gtk_widget_show_all (main_widget);
+    g_object_ref (main_widget);
+
+    ui_common = mmyth_uicommon_new (main_widget,
+                                    "Watch TV", "EPG", "Recording");
+
+    /* Button signals */
+    // FIXME
+    g_signal_connect (G_OBJECT (ui_common->button1), "clicked",
+                      G_CALLBACK (cb_watch_tv_button), mmyth_ui);
+    g_signal_connect (G_OBJECT (ui_common->button2), "clicked",
+                      G_CALLBACK (cb_epg_button), mmyth_ui);
+    g_signal_connect (G_OBJECT (ui_common->button3), "clicked",
+                      G_CALLBACK (cb_record_button), mmyth_ui);
+
+    return ui_common;
+
+}
+
+/******************************************************************************
+ *                         epg GRID VIEW METHODS                              *
+ *****************************************************************************/
+
+static MMythUiCommon *
+create_epg_grid_view (MMythUi * mmyth_ui)
+{
+    MMythUiCommon *ui_common;        
+
+	g_debug ("Creating EPG Grid UI Common");
+	
+    GtkWidget *epg_grid_view = GTK_WIDGET (epg_grid_view_new (mmyth_ui));
+    
+    ui_common = mmyth_uicommon_new (epg_grid_view,
+                                    "Play", "Record",
+                                    "Close");    
+    
+    /* Button signals */
+    g_signal_connect (G_OBJECT (ui_common->button1), "clicked",
+                      G_CALLBACK (cb_not_impl_button), mmyth_ui);
+    g_signal_connect (G_OBJECT (ui_common->button2), "clicked",
+                      G_CALLBACK (cb_record_button), mmyth_ui);
+    g_signal_connect (G_OBJECT (ui_common->button3), "clicked",
+                      G_CALLBACK (cb_close_button), mmyth_ui);
+    
+    return ui_common;
+}
+/******************************************************************************
+ *                         SCHEDULE VIEW METHODS                                *
+ ******************************************************************************/
+
+static void
+cb_save_new_schedule (GtkButton *button, gpointer user_data)
+{
+    MMythUi *mmyth_ui = (MMythUi *) user_data;
+
+	if (!(mmyth_ui->schedule_uicommon))
+		mmyth_ui->schedule_uicommon = create_schedule_view(mmyth_ui);
+		
+    mmyth_schedulerui_save (mmyth_ui->mmyth_schedulerui);
+    
+    mmyth_recordui_reload_schedule (mmyth_ui->mmyth_recordui);
+    
+    mmyth_ui_set_widget (mmyth_ui, mmyth_ui->record_uicommon);
+    
+}
+
+static void
+cb_edit_scheduled (GtkTreeView * tree_view, GtkTreePath *path, 
+		           GtkTreeViewColumn *column, gpointer user_data)
+{
+    MMythUi *mmyth_ui = (MMythUi *) user_data;
+    GtkTreeSelection *selection;
+	GtkTreeModel *list_store;
+	GtkTreeIter iter;
+	int index;
+    //gint new_row = 0, record_id = 0;
+	ScheduleInfo *schedule_info;
+	GList *schedule_list;
+	//GtkTreeIter iter;
+	gint res;
+
+	//gtk_tree_store_clear(recordui->sch_tree_store);	
+
+	res = gmyth_scheduler_get_schedule_list(mmyth_ui->mmyth_recordui->scheduler, &(schedule_list));
+	if (res < 0) {
+		g_warning ("[%s] Retrieved NULL list of scheduled data from database", __FUNCTION__);
+		//return FALSE;
+	}
+	printf("\nX %d", res); fflush(stdout);
+    
+   	selection = 
+        gtk_tree_view_get_selection(GTK_TREE_VIEW(mmyth_ui->mmyth_recordui->sch_treeview));
+    
+    gtk_tree_selection_get_selected(selection, &list_store, &iter);
+	gtk_tree_model_get(list_store, &iter, 4, &index, -1);
+    
+    mmyth_ui_set_widget (mmyth_ui, mmyth_ui->schedule_uicommon);
+    
+	if (!(mmyth_ui->schedule_uicommon))
+		mmyth_ui->schedule_uicommon = create_schedule_view(mmyth_ui);
+		
+	schedule_list = g_list_nth(schedule_list, atoi(gtk_tree_path_to_string(path)));
+	schedule_info = (ScheduleInfo*) schedule_list->data;
+
+    printf("\nstarttime: %ld", schedule_info->start_time); fflush(stdout);		
+}
+
+static MMythUiCommon *
+create_schedule_view (MMythUi * mmyth_ui)
+{
+    MMythUiCommon *ui_common;        
+    GtkWidget *schedule_widget;
+    
+    g_debug ("Creating Schedule UI Common");
+
+	mmyth_ui->mmyth_schedulerui = mmyth_schedulerui_new ();
+	if (mmyth_ui->mmyth_schedulerui == NULL) {
+		g_warning ("[%s] Error while creating scheduler ui", __FUNCTION__);
+		return NULL;
+	}
+	
+	schedule_widget = mmyth_ui->mmyth_schedulerui->main_widget;
+
+    gtk_widget_show_all (schedule_widget);
+    g_object_ref (schedule_widget);
+    
+    ui_common = mmyth_uicommon_new (schedule_widget,
+                                    "Save", "Clear",
+                                    "Cancel");    
+
+    /* Button signals */
+    g_signal_connect (G_OBJECT (ui_common->button1), "clicked",
+                      G_CALLBACK (cb_save_new_schedule), mmyth_ui);
+    g_signal_connect (G_OBJECT (ui_common->button2), "clicked",
+                      G_CALLBACK (cb_not_impl_button), mmyth_ui);
+    g_signal_connect (G_OBJECT (ui_common->button3), "clicked",
+                      G_CALLBACK (cb_record_button), mmyth_ui);
+    
+    return ui_common;
+}
+/******************************************************************************
+ *                         RECORD VIEW METHODS                                *
+ ******************************************************************************/
+static void
+cb_record_button (GtkButton * button, gpointer user_data)
+{
+    MMythUi *mmyth_ui = (MMythUi *) user_data;
+
+	if (!(mmyth_ui->record_uicommon)) {
+		mmyth_ui->record_uicommon = create_record_view (mmyth_ui);
+		mmyth_ui->schedule_uicommon = create_schedule_view (mmyth_ui);
+	}
+	
+	mmyth_recordui_reload_all (mmyth_ui->mmyth_recordui);
+	
+    mmyth_ui_set_widget (mmyth_ui, mmyth_ui->record_uicommon);
+
+} 
+
+static void
+cb_record_close_button (GtkButton * button, gpointer user_data)
+{
+    MMythUi *mmyth_ui = (MMythUi *) user_data;
+
+	mmyth_ui_set_widget(mmyth_ui, mmyth_ui->main_uicommon);
+
+	mmyth_recordui_free(mmyth_ui->mmyth_recordui);
+	
+	if (mmyth_ui->record_uicommon) {
+		gtk_widget_destroy (mmyth_ui->record_uicommon->main_widget);
+		mmyth_uicommon_free(mmyth_ui->record_uicommon);
+		mmyth_ui->record_uicommon = NULL;
+	}
+
+	if (mmyth_ui->schedule_uicommon) {
+	//	mmyth_uicommon_free(mmyth_ui->schedule_uicommon);
+	}	
+} 
+
+
+
+
+static void
+play_selected_recorded (gpointer user_data)
+{
+    MMythUi *mmyth_ui = (MMythUi *) user_data;
+    gboolean res = FALSE;
+
+    gchar *path = mmyth_recordui_get_selected_recorded (mmyth_ui->mmyth_recordui);
+    
+    if (path == NULL) {
+    	// This should never happens. Play button is just activated when
+    	// a recording is selected.
+    	g_warning ("[%s] Play button pressed while none recorded is selected", __FUNCTION__);
+    	return;
+    }
+
+	if (!(mmyth_ui->video_uicommon))
+		mmyth_ui->video_uicommon = create_video_view (mmyth_ui);
+	
+	// Creates the tv player that will retrieve the mythtv content, decode and show it
+	mmyth_ui->tvplayer = mmyth_tvplayer_new ();
+	g_debug ("[%s] New TV Player created: %d\n", __FUNCTION__, (int) (mmyth_ui->tvplayer));
+	res = mmyth_tvplayer_initialize (mmyth_ui->tvplayer);
+	if (!res) {
+		g_warning ("[%s] Could not initialize tvplayer", __FUNCTION__);
+
+		g_object_unref (mmyth_ui->tvplayer);
+		mmyth_ui->tvplayer = NULL;
+
+		GtkWidget *dialog = gtk_message_dialog_new (
+				GTK_WINDOW(mmyth_ui->main_window),
+				GTK_DIALOG_DESTROY_WITH_PARENT,
+                GTK_MESSAGE_ERROR,
+                GTK_BUTTONS_CLOSE,
+			 	"MMyth found errors while starting TV Player, please check "
+			 	"the GStreamer installation");
+
+		gtk_dialog_run (GTK_DIALOG (dialog));
+		gtk_widget_destroy (dialog);
+		
+		return;
+	}		
+
+	res = mmyth_tvplayer_record_setup (mmyth_ui->tvplayer, path);
+	
+	if (mmyth_ui && mmyth_ui->tvplayer && res) {
+		mmyth_tvplayer_set_widget (mmyth_ui->tvplayer, mmyth_ui->videow);
+		mmyth_tvplayer_start_playing (mmyth_ui->tvplayer);
+	} else {
+		// TODO: Show Alert with error description!
+		g_warning ("[%s] MMythUI can't initialize tv_player", __FUNCTION__);
+		g_object_unref (mmyth_ui->tvplayer);
+		mmyth_ui->tvplayer = NULL;
+		// FIXME: Show the exact error that happened
+		GtkWidget *dialog = gtk_message_dialog_new (
+				GTK_WINDOW(mmyth_ui->main_window),
+				GTK_DIALOG_DESTROY_WITH_PARENT,
+                GTK_MESSAGE_ERROR,
+                GTK_BUTTONS_CLOSE,
+                "Error while starting TV Player, please check if the backend"
+                " is running properly and a tv card is available!");
+		gtk_dialog_run (GTK_DIALOG (dialog));
+		gtk_widget_destroy (dialog);		
+		return;
+	}
+	
+	mmyth_ui_set_widget (mmyth_ui, mmyth_ui->video_uicommon);    
+}
+
+static void
+cb_play_clicked_recorded (GtkTreeView * tree_view, GtkTreePath *path, 
+		GtkTreeViewColumn *column, gpointer user_data)
+{
+	play_selected_recorded (user_data);
+}
+
+static void
+cb_play_selected (GtkButton * button, gpointer user_data)
+{
+	play_selected_recorded (user_data);
+}
+
+static void
+cb_schedule_button (GtkButton * button, gpointer user_data)
+{
+    MMythUi *mmyth_ui = (MMythUi *) user_data;
+
+    mmyth_ui_set_widget (mmyth_ui, mmyth_ui->schedule_uicommon);
+}
+
+void
+cb_switch_page (GtkNotebook *notebook, GtkNotebookPage *page,
+		guint page_num, gpointer user_data)
+{
+    MMythUi *mmyth_ui = (MMythUi *) user_data;
+    MMythUiCommon *ui_common; 
+    
+	assert (mmyth_ui);
+	assert (mmyth_ui->record_uicommon);
+	
+    ui_common = mmyth_ui->record_uicommon;
+    
+    if (page_num == 0) { // Switched to Schedule list
+    	gtk_button_set_label (GTK_BUTTON (ui_common->button1), "New");
+		g_signal_handlers_disconnect_by_func (
+			G_OBJECT (ui_common->button1), G_CALLBACK (cb_play_selected), mmyth_ui);
+	    g_signal_connect (G_OBJECT (ui_common->button1), "clicked",
+            G_CALLBACK (cb_schedule_button), mmyth_ui);
+    } else if (page_num == 1) {
+    	gtk_button_set_label (GTK_BUTTON (ui_common->button1), "Play");
+		g_signal_handlers_disconnect_by_func (
+			G_OBJECT (ui_common->button1), G_CALLBACK (cb_schedule_button), mmyth_ui);
+	    g_signal_connect (G_OBJECT (ui_common->button1), "clicked",
+            G_CALLBACK (cb_play_selected), mmyth_ui);
+    }
+}
+                                            
+                                            
+static MMythUiCommon *
+create_record_view (MMythUi * mmyth_ui)
+{
+    MMythUiCommon *ui_common;        
+    
+   	g_debug ("Creating Record UI Common");
+   	
+	mmyth_ui->mmyth_recordui = mmyth_recordui_new ();
+
+	// FIXME: Change MMythRecordUI to a GtkWidget child and avoid this call!
+    gtk_widget_show_all (mmyth_ui->mmyth_recordui->scrolled_window);
+    
+    ui_common = mmyth_uicommon_new (mmyth_ui->mmyth_recordui->scrolled_window, "New", "Delete", "<<Back");    
+    g_object_ref (mmyth_ui->mmyth_recordui->scrolled_window);
+        
+    /* Button signals */
+    g_signal_connect (G_OBJECT (ui_common->button1), "clicked",
+                      G_CALLBACK (cb_schedule_button), mmyth_ui);
+    g_signal_connect (G_OBJECT (ui_common->button2), "clicked",
+                      G_CALLBACK (mmyth_recordui_delete_selected), mmyth_ui->mmyth_recordui);
+    g_signal_connect (G_OBJECT (ui_common->button3), "clicked",
+                      G_CALLBACK (cb_record_close_button), mmyth_ui);
+    g_signal_connect (G_OBJECT (mmyth_ui->mmyth_recordui->notebook),
+		      "switch-page", G_CALLBACK (cb_switch_page), mmyth_ui);
+    g_signal_connect (G_OBJECT (mmyth_ui->mmyth_recordui->rec_treeview),
+		      "row-activated", G_CALLBACK (cb_play_clicked_recorded), mmyth_ui);
+    g_signal_connect (G_OBJECT (mmyth_ui->mmyth_recordui->sch_treeview),
+		      "row-activated", G_CALLBACK (cb_edit_scheduled), mmyth_ui);
+    return ui_common;
+}
+
+
+/******************************************************************************
+ *                         GST VIDEO WIDGET METHODS                           *
+ *****************************************************************************/
+
+static void
+cb_video_close_button (GtkButton * button, gpointer user_data)
+{
+    MMythUi *mmyth_ui = (MMythUi *) user_data;
+	
+	g_debug ("MMythUI video close button pressed");
+	
+	if (mmyth_ui && mmyth_ui->tvplayer) {
+	    mmyth_tvplayer_stop_playing (mmyth_ui->tvplayer);
+
+		g_object_unref (mmyth_ui->tvplayer);
+		mmyth_ui->tvplayer = NULL;	    
+	} else {
+		g_warning ("cb_video_close_button called with NULL pointer\n");
+	}
+	
+    mmyth_ui_set_widget (mmyth_ui, mmyth_ui->main_uicommon);
+}
+
+
+static MMythUiCommon *
+create_video_view (MMythUi * mmyth_ui)
+{
+
+    MMythUiCommon *ui_common;
+
+	g_debug ("Creating Video UI Common");
+	
+	/* Creates widget to be user by MMythTVPlayer to draw the video */
+    mmyth_ui->videow = gtk_drawing_area_new ();
+    // FIXME: Get the widget size from settings
+    gtk_widget_set_size_request (mmyth_ui->videow, 300, 240);
+
+    //mmiptv_ui->logo = gdk_pixbuf_new_from_file ("logo.png", NULL);
+
+	// Creates an alignment to place the video widget inside
+    mmyth_ui->video_alignment = gtk_alignment_new (0.5, 0.5, 1, 1);
+    gtk_widget_hide (mmyth_ui->video_alignment);
+
+    gtk_container_add (GTK_CONTAINER (mmyth_ui->video_alignment),
+                       mmyth_ui->videow);
+
+    /* Add the gst video widget to hbox. It should never be removed. */    
+    /* FIXME: mmyth_ui->video_alignment == NULL when mmyth_player_init fails */
+    if((mmyth_ui->main_hbox != NULL) && (mmyth_ui->video_alignment != NULL)) {
+        gtk_box_pack_start (GTK_BOX (mmyth_ui->main_hbox),
+                            mmyth_ui->video_alignment, TRUE, TRUE, 0);    
+	} else {
+		g_warning ("[%s] Error while adding video_alignment to main widget", __FUNCTION__);	
+    }
+
+    g_object_ref (mmyth_ui->videow);
+    g_object_ref (mmyth_ui->video_alignment);
+
+    ui_common = mmyth_uicommon_new (mmyth_ui->video_alignment,
+                                    "  Full\nScreen", "Other\nServices",
+                                    "Close");
+                                    
+    
+    g_signal_connect (G_OBJECT (ui_common->button1), "clicked",
+                      G_CALLBACK (cb_not_impl_button), mmyth_ui);
+    g_signal_connect (G_OBJECT (ui_common->button2), "clicked",
+                      G_CALLBACK (cb_not_impl_button), mmyth_ui);    
+    g_signal_connect (G_OBJECT (ui_common->button3), "clicked",
+                      G_CALLBACK (cb_video_close_button), mmyth_ui);
+
+	if (ui_common)
+		g_debug ("Video UI_Common sucessfull created");
+		
+    return ui_common;
+}
+
+
+
+GtkWidget*
+mmyth_ui_get_video_widget (MMythUi *mmyth_ui) {
+	
+	if (mmyth_ui && mmyth_ui->videow) {
+	
+		return mmyth_ui->videow;
+	}
+	
+	return NULL;	
+}
diff -r 7c409a042a9a -r 7174e23f7617 maemo-ui/src/mmyth_ui.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/maemo-ui/src/mmyth_ui.h	Thu Sep 28 16:02:14 2006 +0100
@@ -0,0 +1,73 @@
+#ifndef MMYTH_UI_H_
+#define MMYTH_UI_H_
+
+#include <gtk/gtk.h>
+#include <gst/gst.h>
+
+#include "config.h"
+
+#ifdef MAEMO_PLATFORM
+#include "hildon-widgets/hildon-program.h"
+#include "hildon-widgets/hildon-window.h"
+#endif
+
+#include "mmyth_uicommon.h"
+#include "mmyth_recordui.h"
+#include "mmyth_schedulerui.h"
+#include "mmyth_tvplayer.h"
+
+typedef struct _MMythUi
+{
+
+    /* The main application window */
+    GtkWidget *main_window;
+    MMythUiCommon *current_uicommon;
+
+    /* Main widget components */
+    GtkWidget *main_hbox;
+    GtkWidget *video_alignment;
+    GdkPixbuf *logo;
+
+    /* Main widgets grouping */
+    MMythUiCommon *main_uicommon;
+    MMythUiCommon *video_uicommon;
+    MMythUiCommon *epg_grid_uicommon;
+    MMythUiCommon *record_uicommon;
+    MMythUiCommon *schedule_uicommon;
+    
+    GtkWidget *videow;
+    int idle_id;
+    //GstTagList *tagcache;
+    
+    MMythRecordUI *mmyth_recordui;
+    MMythSchedulerUI *mmyth_schedulerui;
+
+#ifdef MAEMO_PLATFORM
+    HildonProgram *program;
+    GtkMenu *main_menu;
+    GtkWidget *menu_setup;
+#endif
+
+    MMythTVPlayer *tvplayer;
+    
+} MMythUi;
+
+GdkPixbuf *icon_sports, *icon_news, *icon_movies, *icon_shows;
+GdkColor main_bg_color;
+
+void mmyth_set_main_widget (MMythUi * mmyth_ui, MMythUiCommon * new_ui);
+//void mmyth_play_selected(GtkButton * button, gpointer user_data);
+
+#ifdef MAEMO_PLATFORM
+MMythUi *mmyth_ui_initialize (HildonProgram *program, GtkWidget * main_window);
+#else
+MMythUi *mmyth_ui_initialize (GtkWidget * main_window);
+#endif
+
+void mmyth_ui_finalize (MMythUi * mmyth_ui);
+
+void mmyth_ui_set_widget (MMythUi * mmyth_ui, MMythUiCommon * new_uicommon);
+
+GtkWidget* mmyth_ui_get_video_widget (MMythUi *mmyth_ui);
+
+#endif /* MMYTH_UI_H_ */
diff -r 7c409a042a9a -r 7174e23f7617 maemo-ui/src/mmyth_uicommon.c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/maemo-ui/src/mmyth_uicommon.c	Thu Sep 28 16:02:14 2006 +0100
@@ -0,0 +1,134 @@
+
+#include <gtk/gtk.h>
+#include <glib.h>
+#include <glib/gprintf.h>
+
+#include "mmyth_uicommon.h"
+#include "mmyth_ui.h"
+
+static void
+refresh_time_on_screen (GtkWidget *label)
+{
+	time_t real_time;
+  	struct tm sched_time;
+	GString *time_showed;
+
+	time_showed = g_string_new("");
+	time(&real_time);
+
+    if (localtime_r((time_t *)&real_time, &sched_time) == NULL) {
+        g_error ("localtime_r error in mmyth_epg_grid_view!\n");
+        return NULL;
+    }
+
+	g_string_printf(time_showed, "%d:%02d:%02d", 
+		sched_time.tm_hour, 
+		sched_time.tm_min, 
+		sched_time.tm_sec);
+
+	gtk_label_set_text (GTK_LABEL(label), time_showed->str);
+}
+
+MMythUiCommon *
+mmyth_uicommon_new (GtkWidget * main_widget, const gchar * label1,
+                    const gchar * label2, const gchar * label3)
+{
+
+    MMythUiCommon *ui_common = g_new0 (MMythUiCommon, 1); 
+    
+    if (!main_widget) {
+    	g_warning ("MMythUICommon created with a NULL main widget\n");
+    }
+    
+    ui_common->main_widget = main_widget;
+
+    ui_common->event_box = gtk_event_box_new();
+    
+    /* Vertical box that divides the control area into two (buttons + clock) */
+    ui_common->vbox = gtk_vbox_new (FALSE, 0);  /* spacing */
+    gtk_container_set_border_width(GTK_CONTAINER (ui_common->vbox), 4);
+    
+    gtk_container_add (GTK_CONTAINER (ui_common->event_box),
+                       ui_common->vbox);
+    gtk_widget_modify_bg(ui_common->event_box, GTK_STATE_NORMAL, &main_bg_color);  
+    
+    /* Vertical box that divides the control area into four */
+    ui_common->button_vbox = gtk_vbox_new (TRUE, 0);    /* spacing */
+
+    gtk_container_set_border_width (GTK_CONTAINER (ui_common->button_vbox), 0);
+
+    /* The button 1 */
+    ui_common->button1 = gtk_button_new_with_label (label1);
+    gtk_widget_modify_bg(ui_common->button1, GTK_STATE_NORMAL, &main_bg_color);  
+    gtk_widget_set_size_request (ui_common->button1, BUTTON_WIDTH,
+                                 BUTTON_HEIGHT);
+
+    /* The button 2 */
+    ui_common->button2 = gtk_button_new_with_label (label2);
+    gtk_widget_modify_bg(ui_common->button2, GTK_STATE_NORMAL, &main_bg_color);  
+    gtk_widget_set_size_request (ui_common->button2, BUTTON_WIDTH,
+                                 BUTTON_HEIGHT);
+
+    /* The button 3 */
+    ui_common->button3 = gtk_button_new_with_label (label3);
+    gtk_widget_modify_bg(ui_common->button3, GTK_STATE_NORMAL, &main_bg_color);  
+    gtk_widget_set_size_request (ui_common->button3, BUTTON_WIDTH,
+                                 BUTTON_HEIGHT);
+
+    /* The clock label */
+    ui_common->label = gtk_label_new ("Starting...");
+    gtk_widget_show (ui_common->label);
+    ui_common->source_id = g_timeout_add(500, (GSourceFunc) refresh_time_on_screen, ui_common->label);
+
+    /* Packing components */
+    gtk_box_pack_start (GTK_BOX (ui_common->vbox),
+                        ui_common->button_vbox, TRUE, TRUE, 0);
+
+    gtk_box_pack_start (GTK_BOX (ui_common->vbox),
+                        ui_common->label, FALSE, FALSE, 0);
+
+    gtk_box_pack_start (GTK_BOX (ui_common->button_vbox),
+                        ui_common->button1, FALSE, FALSE, 0);
+
+    gtk_box_pack_start (GTK_BOX (ui_common->button_vbox),
+                        ui_common->button2, FALSE, FALSE, 0);
+
+    gtk_box_pack_start (GTK_BOX (ui_common->button_vbox),
+                        ui_common->button3, FALSE, FALSE, 0);
+
+    gtk_widget_show_all (ui_common->event_box);
+
+    /* FIXME: mmyth_ui->video_alignment == NULL when mmyth_player_init fails */
+    if(ui_common->main_widget != NULL)
+        g_object_ref (ui_common->main_widget);
+        
+    g_object_ref (ui_common->vbox);
+    g_object_ref (ui_common->button_vbox);
+    g_object_ref (ui_common->label);
+    g_object_ref (ui_common->button1);
+    g_object_ref (ui_common->button2);
+    g_object_ref (ui_common->button3);
+    g_object_ref (ui_common->event_box);
+    return ui_common;
+}
+
+void
+mmyth_uicommon_free (MMythUiCommon *ui_common)
+{
+	g_debug ("[%s] Clean uicommon used memory", __FUNCTION__);
+
+    g_source_remove (ui_common->source_id);
+    	
+    g_object_unref (ui_common->main_widget);
+    g_object_unref (ui_common->vbox);
+    g_object_unref (ui_common->button_vbox);
+    g_object_unref (ui_common->label);
+    g_object_unref (ui_common->button1);
+    g_object_unref (ui_common->button2);
+    g_object_unref (ui_common->button3);
+    g_object_unref (ui_common->event_box);    
+    
+    g_free (ui_common);
+}
+
+
diff -r 7c409a042a9a -r 7174e23f7617 maemo-ui/src/mmyth_uicommon.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/maemo-ui/src/mmyth_uicommon.h	Thu Sep 28 16:02:14 2006 +0100
@@ -0,0 +1,51 @@
+#ifndef MMYTH_UICOMMON_H_
+#define MMYTH_UICOMMON_H_
+
+#include "config.h"
+
+#include <gtk/gtk.h>
+#include <glib.h>
+
+#ifndef MAEMO_PLATFORM
+#define BUTTON_HEIGHT        50
+#define BUTTON_WIDTH        100
+#else
+#define BUTTON_HEIGHT       80
+#define BUTTON_WIDTH        150
+#endif
+
+#define MAIN_WINDOW_WIDTH	550
+#define MAIN_WINDOW_HEIGHT	250
+
+#define CHANNELS_DIALOG_WIDTH	300
+#define CHANNELS_DIALOG_HEIGHT	200
+
+#define SETTINGS_DIALOG_WIDTH	300
+#define SETTINGS_DIALOG_HEIGHT	120
+
+extern GdkColor main_bg_color;
+
+typedef struct _MMythUiCommon
+{
+    GtkWidget *main_widget;
+
+    /* event box to set the background color*/
+    GtkWidget *event_box;
+    
+    GtkWidget *vbox;
+    GtkWidget *button_vbox;
+    GtkWidget *label;
+
+    GtkWidget *button1;
+    GtkWidget *button2;
+    GtkWidget *button3;
+    
+    gint source_id;
+} MMythUiCommon;
+
+MMythUiCommon *mmyth_uicommon_new (GtkWidget * main_widget,
+                                   const gchar * label1, const gchar * label2,
+                                   const gchar * label3);
+void mmyth_uicommon_free (MMythUiCommon *ui_common);
+
+#endif /* MMYTH_UICOMMON_H_ */
diff -r 7c409a042a9a -r 7174e23f7617 maemo-ui/src/mmyth_uisettings.c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/maemo-ui/src/mmyth_uisettings.c	Thu Sep 28 16:02:14 2006 +0100
@@ -0,0 +1,169 @@
+#include<gtk/gtk.h>
+#include<glib.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "mmyth_uisettings.h"
+
+#include "gmyth_context.h"
+
+static GtkWidget *settings_dialog;
+static GtkWidget *entry_hostname;
+static GtkWidget *entry_dbname;
+static GtkWidget *entry_username;
+static GtkWidget *entry_passwd;
+static GtkWidget *entry_port;
+
+static void settings_dialog_update_data (void);
+static GtkWidget* add_entry_to_table (GtkWidget *table, GString *init_str,
+	guint pos_left, guint pos_right, guint pos_top, guint pos_bottom);
+static GtkWidget* add_label_to_table (GtkWidget *table, const gchar *str, 
+	guint pos_left, guint pos_right,  guint pos_top, guint pos_bottom);
+	
+	
+gboolean
+mmyth_uisettings_run (GtkWindow *main_window)
+{
+
+	GtkWidget *settings_table;
+	GtkWidget *label_hostname, *label_dbname;
+	GtkWidget *label_username, *label_passwd, *label_port;
+
+	GMythSettings *msettings = gmyth_context_get_settings();
+	
+	settings_dialog = gtk_dialog_new_with_buttons ("Settings",
+                                         main_window,
+                                         GTK_DIALOG_DESTROY_WITH_PARENT,
+                                         GTK_STOCK_OK,
+                                         GTK_RESPONSE_ACCEPT,
+                                         GTK_STOCK_CANCEL,
+                                         GTK_RESPONSE_REJECT,
+                                         NULL);
+                                         
+  gtk_widget_set_size_request (settings_dialog, 400, 244);
+
+/*  scrolledwindow1 = gtk_scrolled_window_new (NULL, NULL);
+  gtk_widget_show (scrolledwindow1);
+  gtk_container_add (GTK_CONTAINER (window1), scrolledwindow1);
+  gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow1), GTK_POLICY_AUTOMATIC, GTK_POLICY_NEVER);
+
+  viewport1 = gtk_viewport_new (NULL, NULL);
+  gtk_widget_show (viewport1);
+  gtk_container_add (GTK_CONTAINER (scrolledwindow1), viewport1);
+  gtk_viewport_set_shadow_type (GTK_VIEWPORT (viewport1), GTK_SHADOW_NONE);
+*/
+
+	// Creates the table and attach it to the settings dialog
+	settings_table = gtk_table_new (5, 2, FALSE);
+	gtk_widget_show (settings_table);
+	gtk_box_pack_start (GTK_BOX (GTK_DIALOG(settings_dialog)->vbox), settings_table, FALSE, TRUE, 0);
+	gtk_container_set_border_width (GTK_CONTAINER (settings_table), 3);
+	gtk_table_set_row_spacings (GTK_TABLE (settings_table), 5);
+	gtk_table_set_col_spacings (GTK_TABLE (settings_table), 10);
+
+	label_hostname = add_label_to_table (settings_table, "Host Name:", 0, 1, 0, 1);
+	label_dbname   = add_label_to_table (settings_table, "Database Name:", 0, 1, 1, 2);
+	label_username = add_label_to_table (settings_table, "Username:", 0, 1, 2, 3);
+	label_passwd = add_label_to_table (settings_table, "Password:", 0, 1, 3, 4);
+	label_port = add_label_to_table (settings_table, "Server port:", 0, 1, 4, 5);
+	
+	entry_hostname = add_entry_to_table (settings_table,
+		gmyth_settings_get_backend_hostname (msettings),
+		1, 2, 0, 1);
+	entry_dbname = add_entry_to_table (settings_table,
+		gmyth_settings_get_dbname (msettings),
+		1, 2, 1, 2 );
+	entry_username = add_entry_to_table (settings_table,
+		gmyth_settings_get_username (msettings),
+		1, 2, 2, 3 );
+	entry_passwd = add_entry_to_table (settings_table,
+		gmyth_settings_get_password (msettings),
+		1, 2, 3, 4 );
+		
+	GString *str_port = g_string_new ("");
+	g_string_printf (str_port, "%d", 
+		gmyth_settings_get_backend_port (msettings));
+	entry_port = add_entry_to_table (settings_table, str_port,
+		1, 2, 4, 5 );
+	g_string_free (str_port, TRUE);
+		
+	if (gtk_dialog_run (GTK_DIALOG (settings_dialog)) == GTK_RESPONSE_ACCEPT) {
+		settings_dialog_update_data ();
+		gtk_widget_destroy (settings_dialog);
+		return TRUE;
+	}
+	
+	gtk_widget_destroy (settings_dialog);
+	
+	return FALSE;
+	
+}
+
+static GtkWidget*
+add_label_to_table (GtkWidget *table, const gchar *str, guint pos_left, guint pos_right, 
+		guint pos_top, guint pos_bottom )
+{
+	GtkWidget *tmp_label = gtk_label_new (str);
+	
+	gtk_widget_show (tmp_label);
+	gtk_table_attach (GTK_TABLE (table), tmp_label, 
+					pos_left, pos_right, pos_top, pos_bottom,
+                    (GtkAttachOptions) (GTK_FILL),
+                    (GtkAttachOptions) (0), 0, 0);
+	gtk_misc_set_alignment (GTK_MISC (tmp_label), 0, 0.5);
+	
+	return tmp_label;
+}
+
+static GtkWidget*
+add_entry_to_table (GtkWidget *table, GString *init_str, guint pos_left, guint pos_right,
+		guint pos_top, guint pos_bottom)
+{
+	GtkWidget *tmp_entry = gtk_entry_new ();
+	gtk_widget_show (tmp_entry);
+	gtk_table_attach (GTK_TABLE (table), tmp_entry, 
+					pos_left, pos_right, pos_top, pos_bottom,
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+                    (GtkAttachOptions) (0), 0, 0);
+    if (init_str)
+		gtk_entry_set_text (GTK_ENTRY (tmp_entry), (init_str->str));
+		
+	//gtk_entry_set_invisible_char (GTK_ENTRY (entry_port), 9679);
+	
+	return tmp_entry;
+}
+
+static void
+settings_dialog_update_data (void) 
+{
+	GString *tmp_entry_text;
+	GMythSettings *msettings = gmyth_context_get_settings();
+	
+	if (!msettings) {
+		g_warning ("[%s] Could not get GMythSettings instance from context\n", __FUNCTION__);
+		return;
+	}
+		
+	tmp_entry_text = g_string_new("");
+	g_string_printf(tmp_entry_text, "%s", gtk_entry_get_text( GTK_ENTRY(entry_hostname)));
+	gmyth_settings_set_backend_hostname(msettings, tmp_entry_text);
+	
+	g_string_printf(tmp_entry_text, "%s", gtk_entry_get_text( GTK_ENTRY(entry_dbname)));
+	gmyth_settings_set_dbname(msettings, tmp_entry_text);
+	
+	g_string_printf(tmp_entry_text, "%s", gtk_entry_get_text( GTK_ENTRY(entry_username)));
+	gmyth_settings_set_username(msettings, tmp_entry_text);
+	
+	g_string_printf(tmp_entry_text, "%s", gtk_entry_get_text( GTK_ENTRY(entry_passwd)));
+	gmyth_settings_set_password(msettings, tmp_entry_text);	
+	
+	g_string_printf(tmp_entry_text, "%s", gtk_entry_get_text( GTK_ENTRY(entry_port)));
+	gmyth_settings_set_backend_port(msettings, atoi(tmp_entry_text->str));
+	
+	gmyth_settings_save (msettings);
+	
+}
diff -r 7c409a042a9a -r 7174e23f7617 maemo-ui/src/mmyth_uisettings.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/maemo-ui/src/mmyth_uisettings.h	Thu Sep 28 16:02:14 2006 +0100
@@ -0,0 +1,6 @@
+#ifndef MMYTH_SETTINGS_H_
+#define MMYTH_SETTINGS_H_
+
+gboolean mmyth_uisettings_run (GtkWindow *main_window);
+
+#endif /*MMYTH_SETTINGS_H_*/
diff -r 7c409a042a9a -r 7174e23f7617 maemo-ui/src/mmyth_videoplayer.c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/maemo-ui/src/mmyth_videoplayer.c	Thu Sep 28 16:02:14 2006 +0100
@@ -0,0 +1,369 @@
+
+#include <gst/gst.h>
+#include <gtk/gtk.h>
+#include <gdk/gdkx.h>
+#include <gst/interfaces/xoverlay.h>
+#include <unistd.h>
+
+#include "mmyth_ui.h"
+#include "mmyth_videoplayer.h"
+#include "mmyth_sdpreader.h"
+
+#include "esg_database.h"
+
+#include "ipd_demux.h"
+#include "ipd_network.h"
+
+#ifdef INDT_IP_DECAPSULATOR
+#include <sys/types.h>
+#include <signal.h>
+#endif
+
+/* Global flag/semaphore to control IP decapsulator threads */
+gboolean state_keep_running = 0;
+
+
+typedef struct _GstPlayerWindowStateChange
+{
+    GstElement *play;
+    GstState old_state, new_state;
+    MMythUi *mmyth_ui;
+} GstPlayerWindowStateChange;
+
+typedef struct _GstPlayerWindowTagFound
+{
+    GstElement *play;
+    GstTagList *taglist;
+    MMythUi *mmyth_ui;
+} GstPlayerWindowTagFound;
+
+
+GstElement *gst_pipeline, *gst_decoder, *gst_videosink;
+
+static gboolean idle_state (gpointer data);
+
+static gboolean
+bus_call (GstBus * bus, GstMessage * msg, gpointer data)
+{
+    MMythUi *mmyth_ui = (MMythUi *) data;
+    GMainLoop *loop = mmyth_ui->loop;
+
+    switch (GST_MESSAGE_TYPE (msg)) {
+        case GST_MESSAGE_EOS:
+
+            if (mmyth_ui->idle_id != 0) {
+                g_source_remove (mmyth_ui->idle_id);
+                mmyth_ui->idle_id = 0;
+            }
+
+            //g_idle_add ((GSourceFunc) idle_eos, data);
+            gst_element_set_state (GST_ELEMENT (GST_MESSAGE_SRC (msg)),
+                                   GST_STATE_READY);
+            break;
+        case GST_MESSAGE_ERROR:{
+                gchar *debug;
+                GError *err;
+
+                gst_message_parse_error (msg, &err, &debug);
+                g_free (debug);
+
+                printf ("Error: %s\n", err->message);
+                g_error_free (err);
+
+                g_main_loop_quit (loop);
+            }
+            break;
+        case GST_MESSAGE_STATE_CHANGED:{
+                GstState oldstate;
+                GstState newstate;
+                GstState pending;
+                GstPlayerWindowStateChange *st =
+                    g_new (GstPlayerWindowStateChange, 1);
+
+                gst_message_parse_state_changed (msg,
+                                                 &oldstate,
+                                                 &newstate, &pending);
+
+                st->play = mmyth_ui->play;
+                gst_object_ref (GST_OBJECT (mmyth_ui->play));
+                st->old_state = oldstate;
+                st->new_state = newstate;
+
+                st->mmyth_ui = mmyth_ui;
+
+                /* State debug messages */
+                printf ("oldstate = %s, newstate = %s, pendingstate = %s\n",
+                        gst_element_state_get_name (oldstate),
+                        gst_element_state_get_name (newstate),
+                        gst_element_state_get_name (pending));
+
+                g_idle_add ((GSourceFunc) idle_state, st);
+
+            }
+            break;
+        default:
+            printf (gst_message_type_get_name (GST_MESSAGE_TYPE (msg)));
+            printf ("\n");
+            break;
+    }
+
+    return TRUE;
+}
+
+
+static gboolean
+cb_iterate (gpointer data)
+{
+    MMythUi *mmyth_ui = (MMythUi *) data;
+    //gboolean res;
+
+    g_main_loop_run (mmyth_ui->loop);
+/*
+	if (!GST_FLAG_IS_SET (mmyth_ui->play, GST_BIN_SELF_SCHEDULABLE)) {
+    	res = gst_bin_iterate (GST_BIN (mmyth_ui->play));
+	} else {
+    	g_usleep (100);
+		res = (gst_element_get_state (mmyth_ui->play) == GST_STATE_PLAYING);
+	}
+
+	if (!res)
+    	mmyth_ui->idle_id = 0;
+    	
+    return res;
+*/
+    return FALSE;
+
+}
+
+static gboolean
+idle_state (gpointer data)
+{
+    GstPlayerWindowStateChange *st = data;
+
+    if (st->old_state == GST_STATE_PLAYING) {
+        if (st->mmyth_ui->idle_id != 0) {
+            g_source_remove (st->mmyth_ui->idle_id);
+            st->mmyth_ui->idle_id = 0;
+        }
+    }
+    else if (st->new_state == GST_STATE_PLAYING) {
+        if (st->mmyth_ui->idle_id != 0)
+            g_source_remove (st->mmyth_ui->idle_id);
+
+        st->mmyth_ui->idle_id = g_idle_add (cb_iterate, st->mmyth_ui);
+    }
+
+    /* new movie loaded? */
+    if (st->old_state == GST_STATE_READY && st->new_state > GST_STATE_READY) {
+
+        /* gboolean have_video = FALSE; */
+
+        gtk_widget_show (st->mmyth_ui->videow);
+
+        gtk_window_resize (GTK_WINDOW (st->mmyth_ui->main_window), 1, 1);
+
+    }
+
+    /* discarded movie? */
+    if (st->old_state > GST_STATE_READY && st->new_state == GST_STATE_READY) {
+
+        if (st->mmyth_ui->tagcache) {
+            gst_tag_list_free (st->mmyth_ui->tagcache);
+            st->mmyth_ui->tagcache = NULL;
+        }
+    }
+
+    gst_object_unref (GST_OBJECT (st->play));
+    //g_object_unref (G_OBJECT (st->win));
+    g_free (st);
+
+    /* once */
+    return FALSE;
+}
+
+
+
+static gboolean
+expose (GtkWidget * widget, GdkEventExpose * event, gpointer user_data)
+{
+    MMythUi *mmyth_ui = (MMythUi *) user_data;
+
+    gst_x_overlay_set_xwindow_id (GST_X_OVERLAY (mmyth_ui->videosink),
+                                  GDK_WINDOW_XWINDOW (mmyth_ui->videow->
+                                                      window));
+    return TRUE;
+}
+
+
+void
+mmyth_player_init (MMythUi * mmyth_ui)
+{
+    GstElement *play;
+    GstElement *source, *parser, *decoder, *videosink;
+
+    play = gst_pipeline_new ("video-player");
+    source = gst_element_factory_make ("udpsrc", "file-source");
+    parser = gst_element_factory_make ("rtph263pdepay", "rtp-demux");
+    decoder = gst_element_factory_make ("ffdec_h263", "mpeg-decoder");
+    videosink = gst_element_factory_make ("xvimagesink", "image-output");
+    gst_pipeline = play;
+    gst_decoder = decoder;
+    gst_videosink = videosink;
+
+    if (!(gst_pipeline && source && parser && decoder && videosink)) {
+        /* FIXME: hanlde the error correctly */
+        /* video_alignment is not being created (below) 
+           and is causing problems to the ui */
+        g_print ("GstElement creation error!\n");
+        return;
+    }
+
+    g_object_set (G_OBJECT (videosink), "sync", FALSE, NULL);
+
+    gst_bus_add_watch (gst_pipeline_get_bus (GST_PIPELINE (gst_pipeline)),
+                       bus_call, mmyth_ui);
+
+    gst_bin_add_many (GST_BIN (gst_pipeline), source, parser, decoder,
+                      videosink, NULL);
+
+    {
+        GstCaps *rtpcaps = gst_caps_new_simple ("application/x-rtp", NULL);
+        gst_element_link_filtered(source, parser, rtpcaps);
+    }
+    
+    gst_element_link_many (/*source,*/ parser, decoder, videosink, NULL);
+
+    /* actual window */
+    mmyth_ui->play = play;
+    mmyth_ui->videosink = videosink;
+    mmyth_ui->udpsource = source;
+
+    g_object_ref (mmyth_ui->play);
+    g_object_ref (mmyth_ui->videosink);
+
+    /* video widget */
+    //mmyth_ui->videow = gst_player_video_new (videosink, play);
+    mmyth_ui->videow = gtk_drawing_area_new ();
+    gtk_widget_set_size_request (mmyth_ui->videow, 300, 240);
+
+    mmyth_ui->logo = gdk_pixbuf_new_from_file ("logo.png", NULL);
+
+
+    mmyth_ui->video_alignment = gtk_alignment_new (0.5, 0.5, 0, 0);
+    gtk_widget_hide (mmyth_ui->video_alignment);
+
+    gtk_container_add (GTK_CONTAINER (mmyth_ui->video_alignment),
+                       mmyth_ui->videow);
+
+    g_signal_connect (mmyth_ui->videow, "expose-event", G_CALLBACK (expose),
+                      mmyth_ui);
+    //g_signal_connect(mmyth_ui->videow, "size_request", G_CALLBACK(cb_preferred_video_size), mmyth_ui);
+
+
+    g_object_ref (mmyth_ui->videow);
+    g_object_ref (mmyth_ui->video_alignment);
+
+    //gnome_app_set_contents (app, videow);
+    //gtk_widget_show (mmyth_ui->videow);
+
+//fail:
+//  gst_object_unref (GST_OBJECT (play));
+//  return NULL;  
+
+}
+
+void
+mmyth_player_stop (MMythUi * mmyth_ui)
+{
+    gst_element_set_state (mmyth_ui->play, GST_STATE_NULL);
+
+    if(mmyth_ui->videow != NULL)
+        gtk_widget_hide (mmyth_ui->videow);
+
+    /* Disable IP Decapsulator playing threads */
+    state_keep_running = FALSE;	
+
+}
+
+static gboolean
+idle_play (gpointer data)
+{
+    MMythUi *mmyth_ui = (MMythUi *) data;
+
+    sleep (2);
+
+    gst_element_set_state (mmyth_ui->play, GST_STATE_PLAYING);
+
+    return FALSE;
+}
+
+
+/* Run IP decapsulator play function in a new thread. The thread is finished setting the
+ * semaphore "state_keep_running" to FALSE*/
+gpointer
+run_ipd(gpointer data)
+{
+    GString *ip_addr = (GString*) data;
+
+	state_keep_running = TRUE;
+
+	printf("Inside thread\n");
+
+	ipd_mpe_play_section (ip_addr->str, &state_keep_running);
+
+	return 0;
+}
+
+void
+mmyth_play_channel (MMythUi * mmyth_ui, gint service_number)
+{
+	ESGDatabase *esg_db;
+    DVBHService *service;
+	SDPData sdp_data;
+	GString *service_ip_addr;
+	
+	/* First verifies if there is a tuned network */
+	if ( !ipd_network_is_tuned() ) {
+		/* FIXME: show alert and handle this error */
+        g_warning ("Play not possible, network not tuned");
+		return;
+	}
+
+    esg_db = esg_database_get_instance();
+    /* Gets the service structure */
+    service = (DVBHService *) esg_database_get_service_from_number
+                                 (esg_db, service_number);
+
+	/* Verifies if sdp fragment exists to this service */
+	if ( service->sdp_file == NULL ) {
+		/* FIXME: Implement error handling */
+        g_warning ("SDP fragment not available to access service");
+		return;
+    }
+	
+	/* Parses the sdp to get ipv6 address and port */
+	mmyth_sdp_parse_file (service->sdp_file->str, &sdp_data);
+
+    /* Sets the gstreamer properties acording to the service access address */
+	/* FIXME: Develop sdp_bin in gstreamer to give sdp file as pipeline config */
+    g_object_set (G_OBJECT (mmyth_ui->udpsource), "multicast_group",
+                  sdp_data.ip_addr->str, NULL);
+    g_object_set (G_OBJECT (mmyth_ui->udpsource), "port", sdp_data.video_port, NULL);
+
+    /* Shows the video widget on screen */
+    mmyth_ui_set_widget (mmyth_ui, mmyth_ui->video_uicommon);
+
+    gtk_widget_show (mmyth_ui->videow);
+    gtk_widget_queue_draw (mmyth_ui->videow);
+
+#ifdef INDT_IP_DECAPSULATOR
+    /* Will be dealocated in run_ipd */	
+	service_ip_addr = g_string_new (sdp_data.ip_addr->str);
+	
+	/* Requests the IP decapsulator to play the channel stream*/
+	g_thread_create (run_ipd, (gpointer) service_ip_addr, FALSE, NULL);
+#endif
+		
+    //gst_element_set_state (mmyth_ui->play, GST_STATE_PLAYING);
+    g_idle_add (idle_play, mmyth_ui);
+}
diff -r 7c409a042a9a -r 7174e23f7617 maemo-ui/src/mmyth_videoplayer.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/maemo-ui/src/mmyth_videoplayer.h	Thu Sep 28 16:02:14 2006 +0100
@@ -0,0 +1,12 @@
+#ifndef MMYTH_VIDEOPLAYER_H_
+#define MMYTH_VIDEOPLAYER_H_
+
+#include "mmyth_ui.h"
+
+void mmyth_player_init (MMythUi * mmyth_ui);
+void mmyth_player_stop (MMythUi * mmyth_ui);
+
+void mmyth_play_channel (MMythUi * mmyth_ui, gint service_id);
+
+
+#endif /* MMYTH_VIDEOPLAYER_H_ */
diff -r 7c409a042a9a -r 7174e23f7617 maemo-ui/src/svn-commit.tmp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/maemo-ui/src/svn-commit.tmp	Thu Sep 28 16:02:14 2006 +0100
@@ -0,0 +1,10 @@
+
+--This line, and those below, will be ignored--
+
+A    .
+M    mmyth_ui.h
+A    mmyth_main.c
+A    mmyth_tvplayer.c
+M    Makefile.am
+A    mmyth_tvplayer.h
+M    mmyth_ui.c