renatofilho@20
|
1 |
#include <string.h>
|
renatofilho@20
|
2 |
#include <stdlib.h>
|
renatofilho@20
|
3 |
#include <gtk/gtk.h>
|
renatofilho@20
|
4 |
#include <gdk/gdkkeysyms.h>
|
renatofilho@20
|
5 |
#include <time.h>
|
renatofilho@20
|
6 |
|
renatofilho@20
|
7 |
#include "mmyth_epg_grid_view.h"
|
renatofilho@20
|
8 |
#include "mmyth_epg_grid_widget.h"
|
renatofilho@20
|
9 |
|
renatofilho@754
|
10 |
/*
|
renatofilho@754
|
11 |
* Service genre
|
renatofilho@754
|
12 |
*/
|
renatofilho@20
|
13 |
#define GENRE_MIN 0
|
renatofilho@20
|
14 |
#define GENRE_MAX 10
|
renatofilho@20
|
15 |
#define GENRE_UNDEFINED 0
|
renatofilho@20
|
16 |
#define GENRE_MOVIE 1
|
renatofilho@20
|
17 |
#define GENRE_NEWS 2
|
renatofilho@20
|
18 |
#define GENRE_SHOW 3
|
renatofilho@20
|
19 |
#define GENRE_SPORTS 4
|
renatofilho@20
|
20 |
#define GENRE_CHILDREN 5
|
renatofilho@20
|
21 |
#define GENRE_MUSIC 6
|
renatofilho@20
|
22 |
#define GENRE_CULTURE 7
|
renatofilho@20
|
23 |
#define GENRE_SOCIAL 8
|
renatofilho@20
|
24 |
#define GENRE_EDUCATION 9
|
renatofilho@20
|
25 |
#define GENRE_LEISURE 10
|
renatofilho@20
|
26 |
|
renatofilho@20
|
27 |
#define NRO_HOURS 3
|
renatofilho@20
|
28 |
|
renatofilho@754
|
29 |
/*
|
renatofilho@754
|
30 |
* Function prototypes
|
renatofilho@754
|
31 |
*/
|
renatofilho@754
|
32 |
static void update_service_details(MMythEpgGridWidget * object,
|
renatofilho@754
|
33 |
gpointer arg1, gpointer user_data);
|
renatofilho@754
|
34 |
static gboolean key_press_epg_grid_view(GtkWidget * widget,
|
renatofilho@754
|
35 |
GdkEventKey * event,
|
renatofilho@20
|
36 |
gpointer user_data);
|
renatofilho@20
|
37 |
|
renatofilho@20
|
38 |
static GtkWidget *mmyth_epg_grid_widget = NULL;
|
renatofilho@20
|
39 |
|
renatofilho@754
|
40 |
/*
|
renatofilho@754
|
41 |
* is a GtkEventBox
|
renatofilho@754
|
42 |
*/
|
renatofilho@20
|
43 |
static GtkWidget *program_details_area = NULL;
|
renatofilho@20
|
44 |
static GtkWidget *details_main_hbox = NULL;
|
renatofilho@20
|
45 |
static GtkWidget *details_vbox = NULL;
|
renatofilho@20
|
46 |
static GtkWidget *details_logo_vbox = NULL;
|
renatofilho@20
|
47 |
|
renatofilho@754
|
48 |
/*
|
renatofilho@754
|
49 |
* update signal callback from MMythEpgGridWidget
|
renatofilho@754
|
50 |
*/
|
renatofilho@20
|
51 |
static void
|
renatofilho@754
|
52 |
update_service_details(MMythEpgGridWidget * object, gpointer arg1,
|
renatofilho@754
|
53 |
gpointer user_data)
|
renatofilho@20
|
54 |
{
|
renatofilho@754
|
55 |
g_return_if_fail(arg1 != NULL);
|
renatofilho@20
|
56 |
|
renatofilho@754
|
57 |
EpgGridItem *epg_grid_item = (EpgGridItem *) arg1;
|
renatofilho@20
|
58 |
|
renatofilho@754
|
59 |
gchar sel_prog_desc[100] = "<big><b>";
|
renatofilho@754
|
60 |
gchar time_buffer[50];
|
renatofilho@20
|
61 |
|
renatofilho@754
|
62 |
/*
|
renatofilho@754
|
63 |
* FIXME: get first content from content_list
|
renatofilho@754
|
64 |
*/
|
renatofilho@754
|
65 |
GMythProgramInfo *proginfo =
|
renatofilho@754
|
66 |
(GMythProgramInfo *) epg_grid_item->proginfo;
|
renatofilho@754
|
67 |
|
renatofilho@754
|
68 |
if (proginfo) {
|
renatofilho@754
|
69 |
GString *prog_name = proginfo->title;
|
renatofilho@754
|
70 |
GString *service_name = proginfo->chanid;
|
renatofilho@754
|
71 |
|
renatofilho@754
|
72 |
if (details_vbox != NULL)
|
renatofilho@754
|
73 |
gtk_container_remove(GTK_CONTAINER(details_main_hbox),
|
renatofilho@754
|
74 |
details_vbox);
|
renatofilho@754
|
75 |
|
renatofilho@754
|
76 |
/*
|
renatofilho@754
|
77 |
* update service description
|
renatofilho@754
|
78 |
*/
|
renatofilho@20
|
79 |
strcat(sel_prog_desc, service_name->str);
|
renatofilho@20
|
80 |
strcat(sel_prog_desc, "</b></big>");
|
renatofilho@20
|
81 |
|
renatofilho@754
|
82 |
GtkWidget *fst_line_lbl = gtk_label_new(NULL);
|
renatofilho@754
|
83 |
gtk_misc_set_alignment(GTK_MISC(fst_line_lbl), 0.0, 0.0);
|
renatofilho@754
|
84 |
gtk_label_set_markup(GTK_LABEL(fst_line_lbl), sel_prog_desc);
|
renatofilho@754
|
85 |
|
renatofilho@754
|
86 |
/*
|
renatofilho@754
|
87 |
* freeing char[]
|
renatofilho@754
|
88 |
*/
|
renatofilho@20
|
89 |
sel_prog_desc[0] = 0;
|
renatofilho@20
|
90 |
strcat(sel_prog_desc, "\t");
|
renatofilho@754
|
91 |
strcat(sel_prog_desc, prog_name->str);
|
renatofilho@754
|
92 |
|
renatofilho@754
|
93 |
struct tm loctime_start,
|
renatofilho@754
|
94 |
loctime_end;
|
renatofilho@754
|
95 |
|
renatofilho@20
|
96 |
// Convert it to local time representation.
|
renatofilho@754
|
97 |
/*
|
renatofilho@754
|
98 |
* FIXME: conversion from time to localtime is different in
|
renatofilho@754
|
99 |
* different machines
|
renatofilho@754
|
100 |
*/
|
renatofilho@754
|
101 |
long int schedule_start_time = proginfo->startts->tv_sec;
|
renatofilho@754
|
102 |
long int schedule_end_time = proginfo->endts->tv_sec;
|
renatofilho@754
|
103 |
|
renatofilho@20
|
104 |
if (localtime_r(&schedule_start_time, &loctime_start) == NULL) {
|
renatofilho@754
|
105 |
g_warning("localtime_r error in mmyth_epg_grid_view!\n");
|
renatofilho@20
|
106 |
}
|
renatofilho@754
|
107 |
#if 0
|
renatofilho@754
|
108 |
fprintf(stderr, asctime(loctime_start));
|
renatofilho@754
|
109 |
#endif
|
renatofilho@754
|
110 |
|
renatofilho@754
|
111 |
strftime(time_buffer, 100, " %H:%M - ", &loctime_start);
|
renatofilho@754
|
112 |
strcat(sel_prog_desc, time_buffer);
|
renatofilho@754
|
113 |
|
renatofilho@20
|
114 |
if (localtime_r(&schedule_end_time, &loctime_end) == NULL) {
|
renatofilho@754
|
115 |
g_warning("localtime_r error in mmyth_epg_grid_view!\n");
|
renatofilho@20
|
116 |
}
|
renatofilho@754
|
117 |
#if 0
|
renatofilho@754
|
118 |
fprintf(stderr, asctime(loctime_end));
|
renatofilho@754
|
119 |
#endif
|
renatofilho@20
|
120 |
|
renatofilho@754
|
121 |
strftime(time_buffer, 100, "%H:%M\n", &loctime_end);
|
renatofilho@754
|
122 |
strcat(sel_prog_desc, time_buffer);
|
renatofilho@754
|
123 |
|
renatofilho@754
|
124 |
GtkWidget *snd_line_lbl = gtk_label_new(NULL);
|
renatofilho@754
|
125 |
gtk_misc_set_alignment(GTK_MISC(snd_line_lbl), 0.0, 0.0);
|
renatofilho@754
|
126 |
gtk_label_set_markup(GTK_LABEL(snd_line_lbl), sel_prog_desc);
|
renatofilho@754
|
127 |
|
renatofilho@20
|
128 |
// add the current selected program description to the label
|
renatofilho@20
|
129 |
details_vbox = gtk_vbox_new(FALSE, 0);
|
renatofilho@754
|
130 |
GtkWidget *fst_line_hbox = gtk_hbox_new(FALSE, 0);
|
renatofilho@754
|
131 |
|
renatofilho@754
|
132 |
gtk_box_pack_start(GTK_BOX(fst_line_hbox),
|
renatofilho@754
|
133 |
fst_line_lbl, FALSE, FALSE, 6);
|
renatofilho@754
|
134 |
gtk_box_pack_start(GTK_BOX(details_vbox),
|
renatofilho@754
|
135 |
fst_line_hbox, FALSE, FALSE, 0);
|
renatofilho@754
|
136 |
gtk_box_pack_start(GTK_BOX(details_vbox),
|
renatofilho@754
|
137 |
snd_line_lbl, FALSE, FALSE, 0);
|
renatofilho@754
|
138 |
gtk_box_pack_start(GTK_BOX(details_main_hbox),
|
renatofilho@754
|
139 |
details_vbox, FALSE, FALSE, 0);
|
renatofilho@754
|
140 |
|
renatofilho@20
|
141 |
gtk_widget_show_all(details_main_hbox);
|
renatofilho@754
|
142 |
}
|
renatofilho@20
|
143 |
}
|
renatofilho@20
|
144 |
|
renatofilho@754
|
145 |
/*
|
renatofilho@754
|
146 |
* Callback for hardware keys
|
renatofilho@754
|
147 |
*/
|
renatofilho@754
|
148 |
static gboolean
|
renatofilho@754
|
149 |
key_press_epg_grid_view(GtkWidget * widget,
|
renatofilho@20
|
150 |
GdkEventKey * event, gpointer user_data)
|
renatofilho@20
|
151 |
{
|
renatofilho@754
|
152 |
MMythEpgGridWidget *mmyth_epg_grid_widget =
|
renatofilho@754
|
153 |
(MMythEpgGridWidget *) user_data;
|
renatofilho@20
|
154 |
|
renatofilho@754
|
155 |
return mmyth_epg_grid_widget_key_press(mmyth_epg_grid_widget, widget,
|
renatofilho@754
|
156 |
event);
|
renatofilho@20
|
157 |
}
|
renatofilho@20
|
158 |
|
renatofilho@754
|
159 |
GtkWidget *
|
renatofilho@754
|
160 |
epg_grid_view_new(MMythUi * mmyth_ui)
|
renatofilho@20
|
161 |
{
|
renatofilho@754
|
162 |
GtkWidget *scrolled_window;
|
renatofilho@754
|
163 |
scrolled_window = gtk_scrolled_window_new(NULL, NULL);
|
renatofilho@754
|
164 |
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window),
|
renatofilho@754
|
165 |
GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
|
renatofilho@20
|
166 |
|
renatofilho@754
|
167 |
gtk_widget_modify_bg(scrolled_window, GTK_STATE_NORMAL,
|
renatofilho@754
|
168 |
&main_bg_color);
|
renatofilho@20
|
169 |
|
renatofilho@754
|
170 |
GtkWidget *main_vbox = gtk_vbox_new(FALSE, 0);
|
renatofilho@754
|
171 |
// gtk_container_set_border_width(main_vbox, 4);
|
renatofilho@20
|
172 |
|
renatofilho@754
|
173 |
GtkWidget *details_event_box = gtk_event_box_new();
|
renatofilho@754
|
174 |
gtk_widget_modify_bg(details_event_box, GTK_STATE_NORMAL,
|
renatofilho@754
|
175 |
&main_bg_color);
|
renatofilho@754
|
176 |
|
renatofilho@754
|
177 |
program_details_area = gtk_vbox_new(FALSE, 0);
|
renatofilho@754
|
178 |
gtk_container_add(GTK_CONTAINER(details_event_box),
|
renatofilho@754
|
179 |
program_details_area);
|
renatofilho@754
|
180 |
gtk_container_set_border_width(GTK_CONTAINER(program_details_area), 4);
|
renatofilho@754
|
181 |
|
renatofilho@754
|
182 |
details_main_hbox = gtk_hbox_new(FALSE, 10);
|
renatofilho@754
|
183 |
|
renatofilho@754
|
184 |
gtk_box_pack_start(GTK_BOX(program_details_area),
|
renatofilho@754
|
185 |
details_main_hbox, FALSE, FALSE, 0);
|
renatofilho@754
|
186 |
|
renatofilho@754
|
187 |
details_logo_vbox = gtk_vbox_new(FALSE, 0);
|
renatofilho@754
|
188 |
|
renatofilho@754
|
189 |
GtkWidget *details_desc_vbox = gtk_vbox_new(FALSE, 0);
|
renatofilho@754
|
190 |
|
renatofilho@754
|
191 |
gtk_box_pack_start(GTK_BOX(details_main_hbox),
|
renatofilho@754
|
192 |
details_desc_vbox, FALSE, FALSE, 0);
|
renatofilho@754
|
193 |
gtk_box_pack_start(GTK_BOX(details_main_hbox),
|
renatofilho@754
|
194 |
details_logo_vbox, FALSE, FALSE, 0);
|
renatofilho@754
|
195 |
|
renatofilho@754
|
196 |
gtk_widget_set_size_request(program_details_area, -1, 120);
|
renatofilho@754
|
197 |
|
renatofilho@20
|
198 |
mmyth_epg_grid_widget = mmyth_epg_grid_widget_new();
|
renatofilho@754
|
199 |
g_signal_connect(mmyth_epg_grid_widget, "selection_updated",
|
renatofilho@754
|
200 |
G_CALLBACK(update_service_details), NULL);
|
renatofilho@20
|
201 |
|
renatofilho@754
|
202 |
/*
|
renatofilho@754
|
203 |
* select by default the first service
|
renatofilho@754
|
204 |
*/
|
renatofilho@754
|
205 |
/*
|
renatofilho@754
|
206 |
* depends on mount services
|
renatofilho@754
|
207 |
*/
|
renatofilho@20
|
208 |
if (MMYTH_EPG_GRID_WIDGET(mmyth_epg_grid_widget)->epg_view_model) {
|
renatofilho@754
|
209 |
GList *fst_service = (GList *)
|
renatofilho@754
|
210 |
MMYTH_EPG_GRID_WIDGET(mmyth_epg_grid_widget)->epg_view_model->
|
renatofilho@754
|
211 |
data;
|
renatofilho@754
|
212 |
mmyth_epg_grid_widget_update_service(MMYTH_EPG_GRID_WIDGET
|
renatofilho@754
|
213 |
(mmyth_epg_grid_widget),
|
renatofilho@754
|
214 |
fst_service);
|
renatofilho@20
|
215 |
}
|
renatofilho@20
|
216 |
|
renatofilho@754
|
217 |
gtk_box_pack_start(GTK_BOX(main_vbox),
|
renatofilho@754
|
218 |
details_event_box, FALSE, FALSE, 0);
|
renatofilho@754
|
219 |
gtk_box_pack_start(GTK_BOX(main_vbox),
|
renatofilho@754
|
220 |
gtk_hseparator_new(), FALSE, FALSE, 0);
|
renatofilho@754
|
221 |
gtk_box_pack_start(GTK_BOX(main_vbox),
|
renatofilho@754
|
222 |
mmyth_epg_grid_widget, FALSE, FALSE, 0);
|
renatofilho@20
|
223 |
|
renatofilho@754
|
224 |
gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW
|
renatofilho@754
|
225 |
(scrolled_window), main_vbox);
|
renatofilho@754
|
226 |
|
renatofilho@754
|
227 |
/*
|
renatofilho@754
|
228 |
* Add hardware button listener to application
|
renatofilho@754
|
229 |
*/
|
renatofilho@754
|
230 |
g_signal_connect(mmyth_ui->main_window, "key_press_event",
|
renatofilho@754
|
231 |
G_CALLBACK(key_press_epg_grid_view),
|
renatofilho@754
|
232 |
mmyth_epg_grid_widget);
|
renatofilho@754
|
233 |
|
renatofilho@754
|
234 |
gtk_widget_show_all(scrolled_window);
|
renatofilho@754
|
235 |
|
renatofilho@20
|
236 |
return scrolled_window;
|
renatofilho@20
|
237 |
}
|
renatofilho@20
|
238 |
|
renatofilho@20
|
239 |
/*
|
renatofilho@754
|
240 |
* DVBHScheduleEvent * mmyth_epg_grid_view_get_selected_schedule() {
|
renatofilho@754
|
241 |
* return mmyth_epg_grid_get_selected_schedule
|
renatofilho@754
|
242 |
* (MMYTH_EPG_GRID_WIDGET(mmyth_epg_grid_widget)); }
|
renatofilho@754
|
243 |
*/
|