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