maemo-ui/src/mmyth_ui.c
author rosfran
Mon May 14 19:32:44 2007 +0100 (2007-05-14)
branchtrunk
changeset 647 ceb89d5fc325
parent 244 c88244670b08
child 754 cb885ee44618
permissions -rw-r--r--
[svn r653] Some new tests: stringlist and LiveTV Monitor Handler.
renatofilho@20
     1
renatofilho@20
     2
#include <glib-object.h>
renatofilho@20
     3
#include <sys/types.h>
renatofilho@20
     4
#include <sys/stat.h>
renatofilho@20
     5
#include <unistd.h>
renatofilho@20
     6
#include <string.h>
renatofilho@20
     7
#include <stdio.h>
renatofilho@20
     8
#include <gtk/gtk.h>
renatofilho@20
     9
#include <gdk/gdkx.h>
renatofilho@20
    10
#include <gst/interfaces/xoverlay.h>
renatofilho@20
    11
#include <assert.h>
renatofilho@20
    12
renatofilho@20
    13
#include "mmyth_ui.h"
renatofilho@20
    14
#include "mmyth_uicommon.h"
renatofilho@20
    15
#include "mmyth_schedulerui.h"
renatofilho@20
    16
#include "mmyth_recordui.h"
renatofilho@20
    17
#include "mmyth_uisettings.h"
renatofilho@20
    18
#include "mmyth_epg_grid_view.h"
renatofilho@20
    19
#include "mmyth_tvplayer.h"
renatofilho@20
    20
renatofilho@20
    21
/* GMyth library includes */
renatofilho@20
    22
renatofilho@20
    23
#ifndef MAEMO_PLATFORM
renatofilho@20
    24
static gint button_press_handler (GtkWidget *widget, GdkEvent *event);
renatofilho@20
    25
#endif
renatofilho@20
    26
renatofilho@20
    27
static MMythUiCommon *create_main_view (MMythUi * mmyth_ui);
renatofilho@20
    28
static MMythUiCommon *create_video_view (MMythUi * mmyth_ui);
renatofilho@20
    29
static MMythUiCommon *create_epg_grid_view (MMythUi * mmyth_ui);
renatofilho@20
    30
static MMythUiCommon *create_record_view (MMythUi * mmyth_ui);
renatofilho@20
    31
static MMythUiCommon *create_schedule_view (MMythUi * mmyth_ui);
renatofilho@20
    32
renatofilho@20
    33
static void cb_video_close_button (GtkButton * button, gpointer user_data);
renatofilho@20
    34
static void cb_record_button (GtkButton * button, gpointer user_data);
renatofilho@20
    35
static void cb_menu_item_settings (GtkMenuItem *menuitem, gpointer user_data);
renatofilho@20
    36
renatofilho@20
    37
/* main box from button box separator*/
renatofilho@20
    38
static GtkWidget *main_vseparator = NULL;
renatofilho@20
    39
renatofilho@20
    40
GdkPixbuf *icon_sports, *icon_news, 
renatofilho@20
    41
          *icon_movies, *icon_shows, *icon_default;
renatofilho@20
    42
renatofilho@20
    43
#ifndef MAEMO_PLATFORM
renatofilho@20
    44
/* FIXME: */
renatofilho@20
    45
static MMythUi *popup_mmyth_ui;
renatofilho@20
    46
#endif
renatofilho@20
    47
renatofilho@20
    48
MMythUi *
renatofilho@20
    49
mmyth_ui_initialize (
renatofilho@20
    50
#ifdef MAEMO_PLATFORM
renatofilho@20
    51
	HildonProgram *program,
renatofilho@20
    52
#endif
renatofilho@20
    53
	GtkWidget * main_window)
renatofilho@20
    54
{
renatofilho@20
    55
    MMythUi *mmyth_ui;
renatofilho@20
    56
renatofilho@20
    57
    mmyth_ui = g_new0 (MMythUi, 1);
renatofilho@20
    58
morphbr@268
    59
    mmyth_ui->backend_info = gmyth_backend_info_new_full( "localhost", "mythtv", "mythtv", "mythconverg", 6543 );
rosfran@208
    60
renatofilho@20
    61
    mmyth_ui->main_window = main_window;    
renatofilho@20
    62
    mmyth_ui->videow = NULL;
renatofilho@20
    63
    mmyth_ui->mmyth_recordui = NULL;
renatofilho@20
    64
    mmyth_ui->mmyth_schedulerui = NULL;
renatofilho@20
    65
	
renatofilho@20
    66
    /* Horizontal box that divides the view into control and video area */
renatofilho@20
    67
    mmyth_ui->main_hbox = gtk_hbox_new (FALSE, 0);
renatofilho@20
    68
    gtk_widget_show (mmyth_ui->main_hbox);
renatofilho@20
    69
    g_object_ref (mmyth_ui->main_hbox);
renatofilho@20
    70
renatofilho@20
    71
    main_bg_color.red   = 65000;
renatofilho@20
    72
    main_bg_color.green = 65000;
renatofilho@20
    73
    main_bg_color.blue  = 65000;
renatofilho@20
    74
    
renatofilho@20
    75
    
renatofilho@20
    76
#ifndef MAEMO_PLATFORM
renatofilho@20
    77
    /* Popup menu */
renatofilho@20
    78
    popup_mmyth_ui = mmyth_ui;
renatofilho@20
    79
    g_signal_connect (G_OBJECT (mmyth_ui->main_hbox), "event",
renatofilho@20
    80
                      G_CALLBACK (button_press_handler),
renatofilho@20
    81
                      G_OBJECT (mmyth_ui->main_hbox));    
renatofilho@20
    82
renatofilho@20
    83
#else // #ifdef MAEMO
renatofilho@20
    84
renatofilho@20
    85
    mmyth_ui->main_menu = GTK_MENU(gtk_menu_new());
renatofilho@20
    86
    hildon_program_set_common_menu(program, mmyth_ui->main_menu);
renatofilho@20
    87
renatofilho@20
    88
    mmyth_ui->menu_setup = gtk_menu_item_new_with_label("Setup");
renatofilho@20
    89
    gtk_widget_set_size_request (GTK_WIDGET (mmyth_ui->menu_setup), 150, 40);
renatofilho@20
    90
    gtk_menu_append(mmyth_ui->main_menu, mmyth_ui->menu_setup);
renatofilho@20
    91
renatofilho@20
    92
    g_signal_connect(G_OBJECT(mmyth_ui->menu_setup), "activate", G_CALLBACK(cb_menu_item_settings), mmyth_ui);
renatofilho@20
    93
renatofilho@20
    94
    gtk_widget_show_all (GTK_WIDGET (mmyth_ui->main_menu));
renatofilho@20
    95
#endif
renatofilho@20
    96
    
renatofilho@20
    97
    // Main widget is mmyth_ui->main_hbox
renatofilho@20
    98
    mmyth_ui->main_uicommon       = create_main_view (mmyth_ui);
renatofilho@20
    99
renatofilho@20
   100
    gtk_container_add (GTK_CONTAINER (mmyth_ui->main_window),
renatofilho@20
   101
                       mmyth_ui->main_hbox);
renatofilho@20
   102
renatofilho@20
   103
    mmyth_ui_set_widget (mmyth_ui, mmyth_ui->main_uicommon);
renatofilho@20
   104
renatofilho@20
   105
    return mmyth_ui;
renatofilho@20
   106
}
renatofilho@20
   107
renatofilho@20
   108
void
renatofilho@20
   109
mmyth_ui_finalize (MMythUi * mmyth_ui)
renatofilho@20
   110
{
renatofilho@20
   111
    if (mmyth_ui != NULL) {
renatofilho@20
   112
    	if (mmyth_ui->main_uicommon)
renatofilho@20
   113
	    	mmyth_uicommon_free (mmyth_ui->main_uicommon);
renatofilho@20
   114
    	if (mmyth_ui->video_uicommon)
renatofilho@20
   115
		    mmyth_uicommon_free (mmyth_ui->video_uicommon);
renatofilho@20
   116
		if (mmyth_ui->epg_grid_uicommon)
renatofilho@20
   117
		    mmyth_uicommon_free (mmyth_ui->epg_grid_uicommon);
renatofilho@20
   118
		if (mmyth_ui->record_uicommon)
renatofilho@20
   119
		    mmyth_uicommon_free (mmyth_ui->record_uicommon);	    
renatofilho@20
   120
		if (mmyth_ui->schedule_uicommon)
renatofilho@20
   121
		    mmyth_uicommon_free (mmyth_ui->schedule_uicommon);
renatofilho@20
   122
renatofilho@20
   123
	    g_free (mmyth_ui);
renatofilho@20
   124
    }
renatofilho@20
   125
}
renatofilho@20
   126
renatofilho@20
   127
void
renatofilho@20
   128
mmyth_ui_set_widget (MMythUi * mmyth_ui, MMythUiCommon * new_uicommon)
renatofilho@20
   129
{
renatofilho@20
   130
	if (new_uicommon == NULL) {
renatofilho@20
   131
		g_warning ("MMythUI setting a NULL UI_Common as current display\n");
renatofilho@20
   132
		return;
renatofilho@20
   133
	}
renatofilho@20
   134
		
renatofilho@20
   135
    if (mmyth_ui->current_uicommon) {
renatofilho@20
   136
        if (mmyth_ui->current_uicommon == mmyth_ui->video_uicommon) {
renatofilho@20
   137
            gtk_widget_hide (mmyth_ui->current_uicommon->main_widget);
renatofilho@20
   138
            gtk_widget_hide (mmyth_ui->videow);
renatofilho@20
   139
        }
renatofilho@20
   140
        else {
renatofilho@20
   141
            gtk_container_remove (GTK_CONTAINER (mmyth_ui->main_hbox),
renatofilho@20
   142
                                  mmyth_ui->current_uicommon->main_widget);
renatofilho@20
   143
        }
renatofilho@20
   144
renatofilho@20
   145
        gtk_container_remove (GTK_CONTAINER (mmyth_ui->main_hbox),
renatofilho@20
   146
                              mmyth_ui->current_uicommon->event_box);
renatofilho@20
   147
        gtk_container_remove (GTK_CONTAINER (mmyth_ui->main_hbox),
renatofilho@20
   148
                              main_vseparator);        
renatofilho@20
   149
renatofilho@20
   150
    }
renatofilho@20
   151
renatofilho@20
   152
    if (new_uicommon->main_widget == mmyth_ui->video_alignment) {
renatofilho@20
   153
        //gst_player_video_show (GST_PLAYER_VIDEO(mmyth_ui->videow));
renatofilho@20
   154
        gtk_widget_show (mmyth_ui->video_alignment);
renatofilho@20
   155
        gtk_widget_show (mmyth_ui->videow);
renatofilho@20
   156
    }
renatofilho@20
   157
    else {
renatofilho@20
   158
        /* FIXME: Fst call is NULL when mmyth_player_init fails */
renatofilho@20
   159
        if(mmyth_ui->video_alignment != NULL)
renatofilho@20
   160
            gtk_widget_hide (mmyth_ui->video_alignment);
renatofilho@20
   161
        /* FIXME: Fst call is NULL when mmyth_player_init fails */
renatofilho@20
   162
        if(mmyth_ui->videow != NULL)
renatofilho@20
   163
            gtk_widget_hide (mmyth_ui->videow);
renatofilho@20
   164
renatofilho@20
   165
        gtk_box_pack_start (GTK_BOX (mmyth_ui->main_hbox),
renatofilho@20
   166
                            new_uicommon->main_widget, TRUE, TRUE, 0);
renatofilho@20
   167
    }
renatofilho@20
   168
renatofilho@20
   169
    if(main_vseparator == NULL) {
renatofilho@20
   170
        /* FIXME: should free this variable*/
renatofilho@20
   171
        main_vseparator = gtk_vseparator_new();
renatofilho@20
   172
        g_object_ref (main_vseparator);                   
renatofilho@20
   173
    }  
renatofilho@20
   174
    gtk_box_pack_start (GTK_BOX (mmyth_ui->main_hbox),
renatofilho@20
   175
                        main_vseparator, FALSE, FALSE, 0);    
renatofilho@20
   176
    gtk_widget_show (main_vseparator);
renatofilho@20
   177
renatofilho@20
   178
    gtk_box_pack_end (GTK_BOX (mmyth_ui->main_hbox), new_uicommon->event_box, FALSE,
renatofilho@20
   179
                      FALSE, 0);         
renatofilho@20
   180
renatofilho@20
   181
    mmyth_ui->current_uicommon = new_uicommon;
renatofilho@20
   182
renatofilho@20
   183
}
renatofilho@20
   184
renatofilho@20
   185
/* The close callback is the same for all windows*/
renatofilho@20
   186
static void
renatofilho@20
   187
cb_not_impl_button (GtkButton * button, gpointer user_data)
renatofilho@20
   188
{
renatofilho@20
   189
    MMythUi *mmyth_ui = (MMythUi *) user_data;
renatofilho@20
   190
renatofilho@20
   191
    GtkWidget *msg_dialog = gtk_message_dialog_new (
renatofilho@20
   192
                                           GTK_WINDOW(mmyth_ui->main_window),
renatofilho@20
   193
                                           GTK_DIALOG_MODAL |
renatofilho@20
   194
                                           GTK_DIALOG_DESTROY_WITH_PARENT,
renatofilho@20
   195
                                           GTK_MESSAGE_INFO,
renatofilho@20
   196
                                           GTK_BUTTONS_OK,
renatofilho@20
   197
                                           "Feature not implemented");
renatofilho@20
   198
    gtk_widget_set_size_request (msg_dialog, 350, 120);
renatofilho@20
   199
renatofilho@20
   200
    gtk_dialog_run (GTK_DIALOG (msg_dialog));
renatofilho@20
   201
renatofilho@20
   202
    gtk_widget_destroy(GTK_WIDGET(msg_dialog)); 
renatofilho@20
   203
}
renatofilho@20
   204
renatofilho@20
   205
/******************************************************************************
renatofilho@20
   206
 *                        POPUP MENU WIDGET METHODS                           *
renatofilho@20
   207
 *****************************************************************************/
renatofilho@20
   208
renatofilho@20
   209
static void 
renatofilho@20
   210
cb_menu_item_settings (GtkMenuItem *menuitem,
renatofilho@20
   211
                            gpointer user_data)
renatofilho@20
   212
{
renatofilho@20
   213
    
renatofilho@20
   214
    MMythUi *mmyth_ui = (MMythUi*) user_data;
renatofilho@20
   215
   
renatofilho@20
   216
    if (mmyth_uisettings_run (GTK_WINDOW (mmyth_ui->main_window))) {
renatofilho@20
   217
    	// If user changes the settings, we restart the context
renatofilho@20
   218
    	g_debug ("[%s] Restarting mmyth_context to new settings", __FUNCTION__);
rosfran@208
   219
    	//gmyth_context_initialize();
renatofilho@20
   220
    }
renatofilho@20
   221
}
renatofilho@20
   222
renatofilho@20
   223
#ifndef MAEMO_PLATFORM
renatofilho@20
   224
renatofilho@20
   225
static void 
renatofilho@20
   226
detacher (GtkWidget *attach_widget,GtkMenu *menu) 
renatofilho@20
   227
{
renatofilho@20
   228
	
renatofilho@20
   229
}
renatofilho@20
   230
renatofilho@20
   231
static void
renatofilho@20
   232
do_popup_menu (GtkWidget *my_widget, GdkEventButton *event)
renatofilho@20
   233
{
renatofilho@20
   234
    GtkWidget *popup;
renatofilho@20
   235
renatofilho@20
   236
  int button, event_time;
renatofilho@20
   237
renatofilho@20
   238
  GtkWidget *item_general;
renatofilho@20
   239
  GtkWidget *image;
renatofilho@20
   240
renatofilho@20
   241
  popup = gtk_menu_new ();
renatofilho@20
   242
renatofilho@20
   243
  item_general = gtk_image_menu_item_new_with_mnemonic ("Setup");
renatofilho@20
   244
  gtk_widget_show (item_general);
renatofilho@20
   245
  gtk_container_add (GTK_CONTAINER (popup), item_general);
renatofilho@20
   246
renatofilho@20
   247
  image = gtk_image_new_from_stock ("gtk-edit", GTK_ICON_SIZE_MENU);
renatofilho@20
   248
  gtk_widget_show (image);
renatofilho@20
   249
  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (item_general), image);
renatofilho@20
   250
renatofilho@20
   251
  g_signal_connect (G_OBJECT(item_general), "activate", G_CALLBACK (cb_menu_item_settings), popup_mmyth_ui);
renatofilho@20
   252
renatofilho@20
   253
    if (event) {
renatofilho@20
   254
      button = event->button;
renatofilho@20
   255
      event_time = event->time;
renatofilho@20
   256
    } else {
renatofilho@20
   257
      button = 0;
renatofilho@20
   258
      event_time = gtk_get_current_event_time ();
renatofilho@20
   259
    }
renatofilho@20
   260
    
renatofilho@20
   261
    gtk_menu_attach_to_widget (GTK_MENU (popup), my_widget, detacher);
renatofilho@20
   262
    gtk_menu_popup (GTK_MENU (popup), NULL, NULL, NULL, NULL, 
renatofilho@20
   263
                  button, event_time);
renatofilho@20
   264
    gtk_widget_show_all(popup);
renatofilho@20
   265
}
renatofilho@20
   266
renatofilho@20
   267
/* Respond to a button-press by posting a menu passed in as widget.
renatofilho@20
   268
 *
renatofilho@20
   269
 * Note that the "widget" argument is the menu being posted, NOT
renatofilho@20
   270
 * the button that was pressed.
renatofilho@20
   271
 */
renatofilho@20
   272
static gint 
renatofilho@20
   273
button_press_handler (GtkWidget *widget, GdkEvent *event)
renatofilho@20
   274
{
renatofilho@20
   275
renatofilho@20
   276
    if (event->type == GDK_BUTTON_PRESS) {
renatofilho@20
   277
      GdkEventButton *bevent = (GdkEventButton *) event; 
renatofilho@20
   278
          /* Ignore double-clicks and triple-clicks */
renatofilho@20
   279
      if (bevent->button == 3)
renatofilho@20
   280
        {
renatofilho@20
   281
          do_popup_menu (widget, bevent);
renatofilho@20
   282
          return TRUE;
renatofilho@20
   283
        }
renatofilho@20
   284
    }
renatofilho@20
   285
renatofilho@20
   286
    /* Tell calling code that we have not handled this event; pass it on. */
renatofilho@20
   287
    return FALSE;
renatofilho@20
   288
}
renatofilho@20
   289
#endif
renatofilho@20
   290
renatofilho@20
   291
/******************************************************************************
renatofilho@20
   292
 *                          MAIN APP VIEW METHODS                             *
renatofilho@20
   293
 *****************************************************************************/
renatofilho@20
   294
renatofilho@20
   295
static void
renatofilho@20
   296
cb_close_button (GtkButton * button, gpointer user_data)
renatofilho@20
   297
{
renatofilho@20
   298
    MMythUi *mmyth_ui = (MMythUi *) user_data;
renatofilho@20
   299
renatofilho@20
   300
    mmyth_ui_set_widget (mmyth_ui, mmyth_ui->main_uicommon);
renatofilho@20
   301
}
renatofilho@20
   302
renatofilho@20
   303
static void
renatofilho@20
   304
cb_watch_tv_button (GtkButton * button, gpointer user_data)
renatofilho@20
   305
{
renatofilho@20
   306
    MMythUi *mmyth_ui = (MMythUi *) user_data;
renatofilho@20
   307
	gboolean res = FALSE;
renatofilho@20
   308
	
renatofilho@20
   309
	if (!(mmyth_ui->video_uicommon))
renatofilho@20
   310
		mmyth_ui->video_uicommon = create_video_view (mmyth_ui);
renatofilho@20
   311
	
renatofilho@20
   312
	// Creates the tv player that will retrieve the mythtv content, decode and show it
renatofilho@20
   313
	mmyth_ui->tvplayer = mmyth_tvplayer_new ();
renatofilho@20
   314
	/* choose here if this is a LiveTV session */
renatofilho@20
   315
	mmyth_ui->tvplayer->is_livetv = TRUE;
renatofilho@20
   316
rosfran@208
   317
	res = mmyth_tvplayer_initialize (mmyth_ui->tvplayer, mmyth_ui->backend_info);
renatofilho@20
   318
renatofilho@20
   319
	if (!res) {
renatofilho@20
   320
		g_warning ("[%s] Could not initialize tvplayer", __FUNCTION__);
renatofilho@20
   321
renatofilho@20
   322
		g_object_unref (mmyth_ui->tvplayer);
renatofilho@20
   323
		mmyth_ui->tvplayer = NULL;
renatofilho@20
   324
renatofilho@20
   325
		GtkWidget *dialog = gtk_message_dialog_new (
renatofilho@20
   326
				GTK_WINDOW(mmyth_ui->main_window),
renatofilho@20
   327
				GTK_DIALOG_DESTROY_WITH_PARENT,
renatofilho@20
   328
                GTK_MESSAGE_ERROR,
renatofilho@20
   329
                GTK_BUTTONS_CLOSE,
renatofilho@20
   330
			 	"MMyth found errors while starting TV Player, please check "
renatofilho@20
   331
			 	"the GStreamer installation");
renatofilho@20
   332
renatofilho@20
   333
		gtk_dialog_run (GTK_DIALOG (dialog));
renatofilho@20
   334
		gtk_widget_destroy (dialog);
renatofilho@20
   335
		
renatofilho@20
   336
		return;
renatofilho@20
   337
	}
renatofilho@20
   338
	//res = mmyth_tvplayer_livetv_setup (mmyth_ui->tvplayer);
renatofilho@20
   339
	//
renatofilho@20
   340
	if (mmyth_ui && mmyth_ui->tvplayer && res) {
renatofilho@20
   341
		mmyth_tvplayer_set_widget (mmyth_ui->tvplayer, mmyth_ui->videow);
renatofilho@20
   342
		mmyth_tvplayer_start_playing (mmyth_ui->tvplayer);
renatofilho@20
   343
	} else {
renatofilho@20
   344
		// TODO: Show Alert with error description!
renatofilho@20
   345
		g_warning ("[%s] MMythUI can't initialize tv_player", __FUNCTION__);
renatofilho@20
   346
		g_object_unref (mmyth_ui->tvplayer);
renatofilho@20
   347
		mmyth_ui->tvplayer = NULL;
renatofilho@20
   348
		// FIXME: Show the exact error that happened
renatofilho@20
   349
		GtkWidget *dialog = gtk_message_dialog_new (
renatofilho@20
   350
				GTK_WINDOW(mmyth_ui->main_window),
renatofilho@20
   351
				GTK_DIALOG_DESTROY_WITH_PARENT,
renatofilho@20
   352
                GTK_MESSAGE_ERROR,
renatofilho@20
   353
                GTK_BUTTONS_CLOSE,
renatofilho@20
   354
                "Error while starting TV Player, please check if the backend"
renatofilho@20
   355
                " is running properly and a tv card is available!");
renatofilho@20
   356
		gtk_dialog_run (GTK_DIALOG (dialog));
renatofilho@20
   357
		gtk_widget_destroy (dialog);		
renatofilho@20
   358
		return;
renatofilho@20
   359
	}
renatofilho@20
   360
	mmyth_ui_set_widget (mmyth_ui, mmyth_ui->video_uicommon);
renatofilho@20
   361
	
renatofilho@20
   362
}
renatofilho@20
   363
renatofilho@20
   364
static void 
renatofilho@20
   365
cb_epg_button (GtkButton * button, gpointer user_data)
renatofilho@20
   366
{
renatofilho@20
   367
    MMythUi *mmyth_ui = (MMythUi *) user_data;
renatofilho@20
   368
    
renatofilho@20
   369
    if (!(mmyth_ui->epg_grid_uicommon))
renatofilho@20
   370
    	mmyth_ui->epg_grid_uicommon = create_epg_grid_view(mmyth_ui);
renatofilho@20
   371
    	
renatofilho@20
   372
    mmyth_ui_set_widget (mmyth_ui, mmyth_ui->epg_grid_uicommon);
renatofilho@20
   373
}
renatofilho@20
   374
renatofilho@20
   375
static MMythUiCommon *
renatofilho@20
   376
create_main_view (MMythUi * mmyth_ui)
renatofilho@20
   377
{
renatofilho@20
   378
    MMythUiCommon *ui_common;
renatofilho@20
   379
    GtkWidget *main_widget;
renatofilho@20
   380
    GtkWidget *image;
renatofilho@20
   381
renatofilho@20
   382
	g_debug ("Creating Main UI Common");
renatofilho@20
   383
	
renatofilho@20
   384
    // FIXME: file path
renatofilho@20
   385
#ifdef MMYTH_DEV
renatofilho@20
   386
    image = gtk_image_new_from_file ("../pixmaps/mmyth_logo.png");
renatofilho@20
   387
#else
renatofilho@20
   388
    image = gtk_image_new_from_file ( PIX_DIR "mmyth_logo.png");
renatofilho@20
   389
#endif
renatofilho@20
   390
    
renatofilho@20
   391
    main_widget = gtk_event_box_new();
renatofilho@20
   392
    
renatofilho@20
   393
    gtk_container_add (GTK_CONTAINER (main_widget),
renatofilho@20
   394
                       image);
renatofilho@20
   395
renatofilho@20
   396
renatofilho@20
   397
    gtk_widget_show_all (main_widget);
renatofilho@20
   398
    g_object_ref (main_widget);
renatofilho@20
   399
renatofilho@20
   400
    ui_common = mmyth_uicommon_new (main_widget,
renatofilho@20
   401
                                    "Watch TV", "EPG", "Recording");
renatofilho@20
   402
renatofilho@20
   403
    /* Button signals */
renatofilho@20
   404
    // FIXME
renatofilho@20
   405
    g_signal_connect (G_OBJECT (ui_common->button1), "clicked",
renatofilho@20
   406
                      G_CALLBACK (cb_watch_tv_button), mmyth_ui);
renatofilho@20
   407
    g_signal_connect (G_OBJECT (ui_common->button2), "clicked",
renatofilho@20
   408
                      G_CALLBACK (cb_epg_button), mmyth_ui);
renatofilho@20
   409
    g_signal_connect (G_OBJECT (ui_common->button3), "clicked",
renatofilho@20
   410
                      G_CALLBACK (cb_record_button), mmyth_ui);
renatofilho@20
   411
renatofilho@20
   412
    return ui_common;
renatofilho@20
   413
renatofilho@20
   414
}
renatofilho@20
   415
renatofilho@20
   416
/******************************************************************************
renatofilho@20
   417
 *                         epg GRID VIEW METHODS                              *
renatofilho@20
   418
 *****************************************************************************/
renatofilho@20
   419
renatofilho@20
   420
static MMythUiCommon *
renatofilho@20
   421
create_epg_grid_view (MMythUi * mmyth_ui)
renatofilho@20
   422
{
renatofilho@20
   423
    MMythUiCommon *ui_common;        
renatofilho@20
   424
renatofilho@20
   425
	g_debug ("Creating EPG Grid UI Common");
renatofilho@20
   426
	
renatofilho@20
   427
    GtkWidget *epg_grid_view = GTK_WIDGET (epg_grid_view_new (mmyth_ui));
renatofilho@20
   428
    
renatofilho@20
   429
    ui_common = mmyth_uicommon_new (epg_grid_view,
renatofilho@20
   430
                                    "Play", "Record",
renatofilho@20
   431
                                    "Close");    
renatofilho@20
   432
    
renatofilho@20
   433
    /* Button signals */
renatofilho@20
   434
    g_signal_connect (G_OBJECT (ui_common->button1), "clicked",
renatofilho@20
   435
                      G_CALLBACK (cb_not_impl_button), mmyth_ui);
renatofilho@20
   436
    g_signal_connect (G_OBJECT (ui_common->button2), "clicked",
renatofilho@20
   437
                      G_CALLBACK (cb_record_button), mmyth_ui);
renatofilho@20
   438
    g_signal_connect (G_OBJECT (ui_common->button3), "clicked",
renatofilho@20
   439
                      G_CALLBACK (cb_close_button), mmyth_ui);
renatofilho@20
   440
    
renatofilho@20
   441
    return ui_common;
renatofilho@20
   442
}
renatofilho@20
   443
/******************************************************************************
renatofilho@20
   444
 *                         SCHEDULE VIEW METHODS                                *
renatofilho@20
   445
 ******************************************************************************/
renatofilho@20
   446
renatofilho@20
   447
static void
renatofilho@20
   448
cb_save_new_schedule (GtkButton *button, gpointer user_data)
renatofilho@20
   449
{
renatofilho@20
   450
    MMythUi *mmyth_ui = (MMythUi *) user_data;
renatofilho@20
   451
renatofilho@20
   452
	if (!(mmyth_ui->schedule_uicommon))
renatofilho@20
   453
		mmyth_ui->schedule_uicommon = create_schedule_view(mmyth_ui);
renatofilho@20
   454
		
renatofilho@20
   455
    mmyth_schedulerui_save (mmyth_ui->mmyth_schedulerui);
renatofilho@20
   456
    
renatofilho@20
   457
    mmyth_recordui_reload_schedule (mmyth_ui->mmyth_recordui);
renatofilho@20
   458
    
renatofilho@20
   459
    mmyth_ui_set_widget (mmyth_ui, mmyth_ui->record_uicommon);
renatofilho@20
   460
    
renatofilho@20
   461
}
renatofilho@20
   462
renatofilho@20
   463
static void
renatofilho@20
   464
cb_edit_scheduled (GtkTreeView * tree_view, GtkTreePath *path, 
renatofilho@20
   465
		           GtkTreeViewColumn *column, gpointer user_data)
renatofilho@20
   466
{
renatofilho@20
   467
    MMythUi *mmyth_ui = (MMythUi *) user_data;
renatofilho@20
   468
    GtkTreeSelection *selection;
renatofilho@20
   469
	GtkTreeModel *list_store;
renatofilho@20
   470
	GtkTreeIter iter;
renatofilho@20
   471
	int index;
renatofilho@20
   472
    //gint new_row = 0, record_id = 0;
renatofilho@20
   473
	ScheduleInfo *schedule_info;
renatofilho@20
   474
	GList *schedule_list;
renatofilho@20
   475
	//GtkTreeIter iter;
renatofilho@20
   476
	gint res;
renatofilho@20
   477
renatofilho@20
   478
	//gtk_tree_store_clear(recordui->sch_tree_store);	
renatofilho@20
   479
renatofilho@20
   480
	res = gmyth_scheduler_get_schedule_list(mmyth_ui->mmyth_recordui->scheduler, &(schedule_list));
renatofilho@20
   481
	if (res < 0) {
renatofilho@20
   482
		g_warning ("[%s] Retrieved NULL list of scheduled data from database", __FUNCTION__);
renatofilho@20
   483
		//return FALSE;
renatofilho@20
   484
	}
renatofilho@20
   485
	printf("\nX %d", res); fflush(stdout);
renatofilho@20
   486
    
renatofilho@20
   487
   	selection = 
renatofilho@20
   488
        gtk_tree_view_get_selection(GTK_TREE_VIEW(mmyth_ui->mmyth_recordui->sch_treeview));
renatofilho@20
   489
    
renatofilho@20
   490
    gtk_tree_selection_get_selected(selection, &list_store, &iter);
renatofilho@20
   491
	gtk_tree_model_get(list_store, &iter, 4, &index, -1);
renatofilho@20
   492
    
renatofilho@20
   493
    mmyth_ui_set_widget (mmyth_ui, mmyth_ui->schedule_uicommon);
renatofilho@20
   494
    
renatofilho@20
   495
	if (!(mmyth_ui->schedule_uicommon))
renatofilho@20
   496
		mmyth_ui->schedule_uicommon = create_schedule_view(mmyth_ui);
renatofilho@20
   497
		
rosfran@244
   498
	schedule_list = g_list_nth(schedule_list, g_ascii_strtoull( gtk_tree_path_to_string(path), NULL, 10 ));
renatofilho@20
   499
	schedule_info = (ScheduleInfo*) schedule_list->data;
renatofilho@20
   500
rosfran@244
   501
    printf("\nstarttime: %ld", schedule_info->start_time->tv_sec); fflush(stdout);
renatofilho@20
   502
}
renatofilho@20
   503
renatofilho@20
   504
static MMythUiCommon *
renatofilho@20
   505
create_schedule_view (MMythUi * mmyth_ui)
renatofilho@20
   506
{
renatofilho@20
   507
    MMythUiCommon *ui_common;        
renatofilho@20
   508
    GtkWidget *schedule_widget;
renatofilho@20
   509
    
renatofilho@20
   510
    g_debug ("Creating Schedule UI Common");
renatofilho@20
   511
rosfran@244
   512
	mmyth_ui->mmyth_schedulerui = mmyth_schedulerui_new ( mmyth_ui->backend_info );
renatofilho@20
   513
	if (mmyth_ui->mmyth_schedulerui == NULL) {
renatofilho@20
   514
		g_warning ("[%s] Error while creating scheduler ui", __FUNCTION__);
renatofilho@20
   515
		return NULL;
renatofilho@20
   516
	}
renatofilho@20
   517
	
renatofilho@20
   518
	schedule_widget = mmyth_ui->mmyth_schedulerui->main_widget;
renatofilho@20
   519
renatofilho@20
   520
    gtk_widget_show_all (schedule_widget);
renatofilho@20
   521
    g_object_ref (schedule_widget);
renatofilho@20
   522
    
renatofilho@20
   523
    ui_common = mmyth_uicommon_new (schedule_widget,
renatofilho@20
   524
                                    "Save", "Clear",
renatofilho@20
   525
                                    "Cancel");    
renatofilho@20
   526
renatofilho@20
   527
    /* Button signals */
renatofilho@20
   528
    g_signal_connect (G_OBJECT (ui_common->button1), "clicked",
renatofilho@20
   529
                      G_CALLBACK (cb_save_new_schedule), mmyth_ui);
renatofilho@20
   530
    g_signal_connect (G_OBJECT (ui_common->button2), "clicked",
renatofilho@20
   531
                      G_CALLBACK (cb_not_impl_button), mmyth_ui);
renatofilho@20
   532
    g_signal_connect (G_OBJECT (ui_common->button3), "clicked",
renatofilho@20
   533
                      G_CALLBACK (cb_record_button), mmyth_ui);
renatofilho@20
   534
    
renatofilho@20
   535
    return ui_common;
renatofilho@20
   536
}
renatofilho@20
   537
/******************************************************************************
renatofilho@20
   538
 *                         RECORD VIEW METHODS                                *
renatofilho@20
   539
 ******************************************************************************/
renatofilho@20
   540
static void
renatofilho@20
   541
cb_record_button (GtkButton * button, gpointer user_data)
renatofilho@20
   542
{
renatofilho@20
   543
    MMythUi *mmyth_ui = (MMythUi *) user_data;
renatofilho@20
   544
renatofilho@20
   545
	if (!(mmyth_ui->record_uicommon)) {
renatofilho@20
   546
		mmyth_ui->record_uicommon = create_record_view (mmyth_ui);
renatofilho@20
   547
		mmyth_ui->schedule_uicommon = create_schedule_view (mmyth_ui);
renatofilho@20
   548
	}
renatofilho@20
   549
	
renatofilho@20
   550
	mmyth_recordui_reload_all (mmyth_ui->mmyth_recordui);
renatofilho@20
   551
	
renatofilho@20
   552
    mmyth_ui_set_widget (mmyth_ui, mmyth_ui->record_uicommon);
renatofilho@20
   553
renatofilho@20
   554
} 
renatofilho@20
   555
renatofilho@20
   556
static void
renatofilho@20
   557
cb_record_close_button (GtkButton * button, gpointer user_data)
renatofilho@20
   558
{
renatofilho@20
   559
    MMythUi *mmyth_ui = (MMythUi *) user_data;
renatofilho@20
   560
renatofilho@20
   561
	mmyth_ui_set_widget(mmyth_ui, mmyth_ui->main_uicommon);
renatofilho@20
   562
renatofilho@20
   563
	mmyth_recordui_free(mmyth_ui->mmyth_recordui);
renatofilho@20
   564
	
renatofilho@20
   565
	if (mmyth_ui->record_uicommon) {
renatofilho@20
   566
		gtk_widget_destroy (mmyth_ui->record_uicommon->main_widget);
renatofilho@20
   567
		mmyth_uicommon_free(mmyth_ui->record_uicommon);
renatofilho@20
   568
		mmyth_ui->record_uicommon = NULL;
renatofilho@20
   569
	}
renatofilho@20
   570
renatofilho@20
   571
	if (mmyth_ui->schedule_uicommon) {
renatofilho@20
   572
	//	mmyth_uicommon_free(mmyth_ui->schedule_uicommon);
renatofilho@20
   573
	}	
renatofilho@20
   574
} 
renatofilho@20
   575
renatofilho@20
   576
renatofilho@20
   577
renatofilho@20
   578
renatofilho@20
   579
static void
renatofilho@20
   580
play_selected_recorded (gpointer user_data)
renatofilho@20
   581
{
renatofilho@20
   582
    MMythUi *mmyth_ui = (MMythUi *) user_data;
renatofilho@20
   583
    gboolean res = FALSE;
renatofilho@20
   584
renatofilho@20
   585
    gchar *path = mmyth_recordui_get_selected_recorded (mmyth_ui->mmyth_recordui);
renatofilho@20
   586
    
renatofilho@20
   587
    if (path == NULL) {
renatofilho@20
   588
    	// This should never happens. Play button is just activated when
renatofilho@20
   589
    	// a recording is selected.
renatofilho@20
   590
    	g_warning ("[%s] Play button pressed while none recorded is selected", __FUNCTION__);
renatofilho@20
   591
    	return;
renatofilho@20
   592
    }
renatofilho@20
   593
renatofilho@20
   594
	if (!(mmyth_ui->video_uicommon))
renatofilho@20
   595
		mmyth_ui->video_uicommon = create_video_view (mmyth_ui);
renatofilho@20
   596
	
renatofilho@20
   597
	// Creates the tv player that will retrieve the mythtv content, decode and show it
renatofilho@20
   598
	mmyth_ui->tvplayer = mmyth_tvplayer_new ();
renatofilho@20
   599
	g_debug ("[%s] New TV Player created: %d\n", __FUNCTION__, (int) (mmyth_ui->tvplayer));
rosfran@208
   600
	res = mmyth_tvplayer_initialize (mmyth_ui->tvplayer, mmyth_ui->backend_info);
renatofilho@20
   601
	if (!res) {
renatofilho@20
   602
		g_warning ("[%s] Could not initialize tvplayer", __FUNCTION__);
renatofilho@20
   603
renatofilho@20
   604
		g_object_unref (mmyth_ui->tvplayer);
renatofilho@20
   605
		mmyth_ui->tvplayer = NULL;
renatofilho@20
   606
renatofilho@20
   607
		GtkWidget *dialog = gtk_message_dialog_new (
renatofilho@20
   608
				GTK_WINDOW(mmyth_ui->main_window),
renatofilho@20
   609
				GTK_DIALOG_DESTROY_WITH_PARENT,
renatofilho@20
   610
                GTK_MESSAGE_ERROR,
renatofilho@20
   611
                GTK_BUTTONS_CLOSE,
renatofilho@20
   612
			 	"MMyth found errors while starting TV Player, please check "
renatofilho@20
   613
			 	"the GStreamer installation");
renatofilho@20
   614
renatofilho@20
   615
		gtk_dialog_run (GTK_DIALOG (dialog));
renatofilho@20
   616
		gtk_widget_destroy (dialog);
renatofilho@20
   617
		
renatofilho@20
   618
		return;
renatofilho@20
   619
	}		
renatofilho@20
   620
renatofilho@20
   621
	res = mmyth_tvplayer_record_setup (mmyth_ui->tvplayer, path);
renatofilho@20
   622
	
renatofilho@20
   623
	if (mmyth_ui && mmyth_ui->tvplayer && res) {
renatofilho@20
   624
		mmyth_tvplayer_set_widget (mmyth_ui->tvplayer, mmyth_ui->videow);
renatofilho@20
   625
		mmyth_tvplayer_start_playing (mmyth_ui->tvplayer);
renatofilho@20
   626
	} else {
renatofilho@20
   627
		// TODO: Show Alert with error description!
renatofilho@20
   628
		g_warning ("[%s] MMythUI can't initialize tv_player", __FUNCTION__);
renatofilho@20
   629
		g_object_unref (mmyth_ui->tvplayer);
renatofilho@20
   630
		mmyth_ui->tvplayer = NULL;
renatofilho@20
   631
		// FIXME: Show the exact error that happened
renatofilho@20
   632
		GtkWidget *dialog = gtk_message_dialog_new (
renatofilho@20
   633
				GTK_WINDOW(mmyth_ui->main_window),
renatofilho@20
   634
				GTK_DIALOG_DESTROY_WITH_PARENT,
renatofilho@20
   635
                GTK_MESSAGE_ERROR,
renatofilho@20
   636
                GTK_BUTTONS_CLOSE,
renatofilho@20
   637
                "Error while starting TV Player, please check if the backend"
renatofilho@20
   638
                " is running properly and a tv card is available!");
renatofilho@20
   639
		gtk_dialog_run (GTK_DIALOG (dialog));
renatofilho@20
   640
		gtk_widget_destroy (dialog);		
renatofilho@20
   641
		return;
renatofilho@20
   642
	}
renatofilho@20
   643
	
renatofilho@20
   644
	mmyth_ui_set_widget (mmyth_ui, mmyth_ui->video_uicommon);    
renatofilho@20
   645
}
renatofilho@20
   646
renatofilho@20
   647
static void
renatofilho@20
   648
cb_play_clicked_recorded (GtkTreeView * tree_view, GtkTreePath *path, 
renatofilho@20
   649
		GtkTreeViewColumn *column, gpointer user_data)
renatofilho@20
   650
{
renatofilho@20
   651
	play_selected_recorded (user_data);
renatofilho@20
   652
}
renatofilho@20
   653
renatofilho@20
   654
static void
renatofilho@20
   655
cb_play_selected (GtkButton * button, gpointer user_data)
renatofilho@20
   656
{
renatofilho@20
   657
	play_selected_recorded (user_data);
renatofilho@20
   658
}
renatofilho@20
   659
renatofilho@20
   660
static void
renatofilho@20
   661
cb_schedule_button (GtkButton * button, gpointer user_data)
renatofilho@20
   662
{
renatofilho@20
   663
    MMythUi *mmyth_ui = (MMythUi *) user_data;
renatofilho@20
   664
renatofilho@20
   665
    mmyth_ui_set_widget (mmyth_ui, mmyth_ui->schedule_uicommon);
renatofilho@20
   666
}
renatofilho@20
   667
renatofilho@20
   668
void
renatofilho@20
   669
cb_switch_page (GtkNotebook *notebook, GtkNotebookPage *page,
renatofilho@20
   670
		guint page_num, gpointer user_data)
renatofilho@20
   671
{
renatofilho@20
   672
    MMythUi *mmyth_ui = (MMythUi *) user_data;
renatofilho@20
   673
    MMythUiCommon *ui_common; 
renatofilho@20
   674
    
renatofilho@20
   675
	assert (mmyth_ui);
renatofilho@20
   676
	assert (mmyth_ui->record_uicommon);
renatofilho@20
   677
	
renatofilho@20
   678
    ui_common = mmyth_ui->record_uicommon;
renatofilho@20
   679
    
renatofilho@20
   680
    if (page_num == 0) { // Switched to Schedule list
renatofilho@20
   681
    	gtk_button_set_label (GTK_BUTTON (ui_common->button1), "New");
renatofilho@20
   682
		g_signal_handlers_disconnect_by_func (
renatofilho@20
   683
			G_OBJECT (ui_common->button1), G_CALLBACK (cb_play_selected), mmyth_ui);
renatofilho@20
   684
	    g_signal_connect (G_OBJECT (ui_common->button1), "clicked",
renatofilho@20
   685
            G_CALLBACK (cb_schedule_button), mmyth_ui);
renatofilho@20
   686
    } else if (page_num == 1) {
renatofilho@20
   687
    	gtk_button_set_label (GTK_BUTTON (ui_common->button1), "Play");
renatofilho@20
   688
		g_signal_handlers_disconnect_by_func (
renatofilho@20
   689
			G_OBJECT (ui_common->button1), G_CALLBACK (cb_schedule_button), mmyth_ui);
renatofilho@20
   690
	    g_signal_connect (G_OBJECT (ui_common->button1), "clicked",
renatofilho@20
   691
            G_CALLBACK (cb_play_selected), mmyth_ui);
renatofilho@20
   692
    }
renatofilho@20
   693
}
renatofilho@20
   694
                                            
renatofilho@20
   695
                                            
renatofilho@20
   696
static MMythUiCommon *
renatofilho@20
   697
create_record_view (MMythUi * mmyth_ui)
renatofilho@20
   698
{
renatofilho@20
   699
    MMythUiCommon *ui_common;        
renatofilho@20
   700
    
renatofilho@20
   701
   	g_debug ("Creating Record UI Common");
renatofilho@20
   702
   	
rosfran@244
   703
	mmyth_ui->mmyth_recordui = mmyth_recordui_new ( mmyth_ui->backend_info );
renatofilho@20
   704
renatofilho@20
   705
	// FIXME: Change MMythRecordUI to a GtkWidget child and avoid this call!
renatofilho@20
   706
    gtk_widget_show_all (mmyth_ui->mmyth_recordui->scrolled_window);
renatofilho@20
   707
    
renatofilho@20
   708
    ui_common = mmyth_uicommon_new (mmyth_ui->mmyth_recordui->scrolled_window, "New", "Delete", "<<Back");    
renatofilho@20
   709
    g_object_ref (mmyth_ui->mmyth_recordui->scrolled_window);
renatofilho@20
   710
        
renatofilho@20
   711
    /* Button signals */
renatofilho@20
   712
    g_signal_connect (G_OBJECT (ui_common->button1), "clicked",
renatofilho@20
   713
                      G_CALLBACK (cb_schedule_button), mmyth_ui);
renatofilho@20
   714
    g_signal_connect (G_OBJECT (ui_common->button2), "clicked",
renatofilho@20
   715
                      G_CALLBACK (mmyth_recordui_delete_selected), mmyth_ui->mmyth_recordui);
renatofilho@20
   716
    g_signal_connect (G_OBJECT (ui_common->button3), "clicked",
renatofilho@20
   717
                      G_CALLBACK (cb_record_close_button), mmyth_ui);
renatofilho@20
   718
    g_signal_connect (G_OBJECT (mmyth_ui->mmyth_recordui->notebook),
renatofilho@20
   719
		      "switch-page", G_CALLBACK (cb_switch_page), mmyth_ui);
renatofilho@20
   720
    g_signal_connect (G_OBJECT (mmyth_ui->mmyth_recordui->rec_treeview),
renatofilho@20
   721
		      "row-activated", G_CALLBACK (cb_play_clicked_recorded), mmyth_ui);
renatofilho@20
   722
    g_signal_connect (G_OBJECT (mmyth_ui->mmyth_recordui->sch_treeview),
renatofilho@20
   723
		      "row-activated", G_CALLBACK (cb_edit_scheduled), mmyth_ui);
renatofilho@20
   724
    return ui_common;
renatofilho@20
   725
}
renatofilho@20
   726
renatofilho@20
   727
renatofilho@20
   728
/******************************************************************************
renatofilho@20
   729
 *                         GST VIDEO WIDGET METHODS                           *
renatofilho@20
   730
 *****************************************************************************/
renatofilho@20
   731
renatofilho@20
   732
static void
renatofilho@20
   733
cb_video_close_button (GtkButton * button, gpointer user_data)
renatofilho@20
   734
{
renatofilho@20
   735
    MMythUi *mmyth_ui = (MMythUi *) user_data;
renatofilho@20
   736
	
renatofilho@20
   737
	g_debug ("MMythUI video close button pressed");
renatofilho@20
   738
	
renatofilho@20
   739
	if (mmyth_ui && mmyth_ui->tvplayer) {
renatofilho@20
   740
	    mmyth_tvplayer_stop_playing (mmyth_ui->tvplayer);
renatofilho@20
   741
renatofilho@20
   742
		g_object_unref (mmyth_ui->tvplayer);
renatofilho@20
   743
		mmyth_ui->tvplayer = NULL;	    
renatofilho@20
   744
	} else {
renatofilho@20
   745
		g_warning ("cb_video_close_button called with NULL pointer\n");
renatofilho@20
   746
	}
renatofilho@20
   747
	
renatofilho@20
   748
    mmyth_ui_set_widget (mmyth_ui, mmyth_ui->main_uicommon);
renatofilho@20
   749
}
renatofilho@20
   750
renatofilho@20
   751
renatofilho@20
   752
static MMythUiCommon *
renatofilho@20
   753
create_video_view (MMythUi * mmyth_ui)
renatofilho@20
   754
{
renatofilho@20
   755
renatofilho@20
   756
    MMythUiCommon *ui_common;
renatofilho@20
   757
renatofilho@20
   758
	g_debug ("Creating Video UI Common");
renatofilho@20
   759
	
renatofilho@20
   760
	/* Creates widget to be user by MMythTVPlayer to draw the video */
renatofilho@20
   761
    mmyth_ui->videow = gtk_drawing_area_new ();
renatofilho@20
   762
    // FIXME: Get the widget size from settings
renatofilho@20
   763
    gtk_widget_set_size_request (mmyth_ui->videow, 300, 240);
renatofilho@20
   764
renatofilho@20
   765
    //mmiptv_ui->logo = gdk_pixbuf_new_from_file ("logo.png", NULL);
renatofilho@20
   766
renatofilho@20
   767
	// Creates an alignment to place the video widget inside
renatofilho@20
   768
    mmyth_ui->video_alignment = gtk_alignment_new (0.5, 0.5, 1, 1);
renatofilho@20
   769
    gtk_widget_hide (mmyth_ui->video_alignment);
renatofilho@20
   770
renatofilho@20
   771
    gtk_container_add (GTK_CONTAINER (mmyth_ui->video_alignment),
renatofilho@20
   772
                       mmyth_ui->videow);
renatofilho@20
   773
renatofilho@20
   774
    /* Add the gst video widget to hbox. It should never be removed. */    
renatofilho@20
   775
    /* FIXME: mmyth_ui->video_alignment == NULL when mmyth_player_init fails */
renatofilho@20
   776
    if((mmyth_ui->main_hbox != NULL) && (mmyth_ui->video_alignment != NULL)) {
renatofilho@20
   777
        gtk_box_pack_start (GTK_BOX (mmyth_ui->main_hbox),
renatofilho@20
   778
                            mmyth_ui->video_alignment, TRUE, TRUE, 0);    
renatofilho@20
   779
	} else {
renatofilho@20
   780
		g_warning ("[%s] Error while adding video_alignment to main widget", __FUNCTION__);	
renatofilho@20
   781
    }
renatofilho@20
   782
renatofilho@20
   783
    g_object_ref (mmyth_ui->videow);
renatofilho@20
   784
    g_object_ref (mmyth_ui->video_alignment);
renatofilho@20
   785
renatofilho@20
   786
    ui_common = mmyth_uicommon_new (mmyth_ui->video_alignment,
renatofilho@20
   787
                                    "  Full\nScreen", "Other\nServices",
renatofilho@20
   788
                                    "Close");
renatofilho@20
   789
                                    
renatofilho@20
   790
    
renatofilho@20
   791
    g_signal_connect (G_OBJECT (ui_common->button1), "clicked",
renatofilho@20
   792
                      G_CALLBACK (cb_not_impl_button), mmyth_ui);
renatofilho@20
   793
    g_signal_connect (G_OBJECT (ui_common->button2), "clicked",
renatofilho@20
   794
                      G_CALLBACK (cb_not_impl_button), mmyth_ui);    
renatofilho@20
   795
    g_signal_connect (G_OBJECT (ui_common->button3), "clicked",
renatofilho@20
   796
                      G_CALLBACK (cb_video_close_button), mmyth_ui);
renatofilho@20
   797
renatofilho@20
   798
	if (ui_common)
renatofilho@20
   799
		g_debug ("Video UI_Common sucessfull created");
renatofilho@20
   800
		
renatofilho@20
   801
    return ui_common;
renatofilho@20
   802
}
renatofilho@20
   803
renatofilho@20
   804
renatofilho@20
   805
renatofilho@20
   806
GtkWidget*
renatofilho@20
   807
mmyth_ui_get_video_widget (MMythUi *mmyth_ui) {
renatofilho@20
   808
	
renatofilho@20
   809
	if (mmyth_ui && mmyth_ui->videow) {
renatofilho@20
   810
	
renatofilho@20
   811
		return mmyth_ui->videow;
renatofilho@20
   812
	}
renatofilho@20
   813
	
renatofilho@20
   814
	return NULL;	
renatofilho@20
   815
}