2 * Initial main.c file generated by Glade. Edit as required.
3 * Glade will not overwrite this file.
12 #include "gstmediaplay.h"
13 #include "callbacks.h"
15 static void gst_media_play_class_init (GstMediaPlayClass *klass);
16 static void gst_media_play_init (GstMediaPlay *play);
18 static void gst_media_play_set_arg (GtkObject *object,GtkArg *arg,guint id);
19 static void gst_media_play_get_arg (GtkObject *object,GtkArg *arg,guint id);
21 static void gst_media_play_frame_displayed (GstPlay *play, GstMediaPlay *mplay);
22 static void gst_media_play_state_changed (GstPlay *play, GstPlayState state, GstMediaPlay *mplay);
23 static void gst_media_play_slider_changed (GtkAdjustment *adj, GstMediaPlay *mplay);
25 static void update_buttons (GstMediaPlay *mplay, GstPlayState state);
26 static void update_slider (GstMediaPlay *mplay, GtkAdjustment *adjustment, gfloat value);
28 /* signals and args */
38 target_drag_data_received (GtkWidget *widget,
39 GdkDragContext *context,
42 GtkSelectionData *data,
47 if (strstr (data->data, "file:")) {
48 g_print ("Got: %s\n",&data->data[5]);
50 gst_media_play_start_uri (play, g_strchomp(&data->data[5]));
55 static GtkTargetEntry target_table[] = {
56 { "text/plain", 0, 0 }
59 static GtkObject *parent_class = NULL;
60 //static guint gst_media_play_signals[LAST_SIGNAL] = { 0 };
63 gst_media_play_get_type(void)
65 static GtkType play_type = 0;
68 static const GtkTypeInfo play_info = {
71 sizeof(GstMediaPlayClass),
72 (GtkClassInitFunc)gst_media_play_class_init,
73 (GtkObjectInitFunc)gst_media_play_init,
76 (GtkClassInitFunc)NULL,
78 play_type = gtk_type_unique(gtk_object_get_type(),&play_info);
84 gst_media_play_class_init (GstMediaPlayClass *klass)
86 GtkObjectClass *object_class;
88 parent_class = gtk_type_class (gtk_object_get_type ());
90 object_class = (GtkObjectClass*)klass;
92 object_class->set_arg = gst_media_play_set_arg;
93 object_class->get_arg = gst_media_play_get_arg;
101 /* we need more control here so... */
103 gst_media_play_connect_func (const gchar *handler_name,
105 const gchar *signal_name,
106 const gchar *signal_data,
107 GtkObject *connect_object,
112 connect_struct *data = (connect_struct *)user_data;
114 if (!g_module_symbol (data->symbols, handler_name, (gpointer *)&func))
115 g_warning("gsteditorproperty: could not find signal handler '%s'.", handler_name);
118 gtk_signal_connect_after (object, signal_name, func, (gpointer) data->play);
120 gtk_signal_connect (object, signal_name, func, (gpointer) data->play);
126 gst_media_play_init(GstMediaPlay *mplay)
133 /* load the interface */
134 if (stat(DATADIR"gstmediaplay.glade", &statbuf) == 0) {
135 mplay->xml = glade_xml_new (DATADIR"gstmediaplay.glade", "gstplay");
138 mplay->xml = glade_xml_new ("gstmediaplay.glade", "gstplay");
140 g_assert (mplay->xml != NULL);
142 mplay->slider = glade_xml_get_widget(mplay->xml, "slider");
143 g_assert (mplay->slider != NULL);
148 arg.name = "adjustment";
149 gtk_object_getv (GTK_OBJECT (mplay->slider), 1, &arg);
150 range = GTK_RANGE (GTK_VALUE_POINTER (arg));
151 mplay->adjustment = gtk_range_get_adjustment (range);
153 gtk_signal_connect (GTK_OBJECT (mplay->adjustment), "value_changed",
154 GTK_SIGNAL_FUNC (gst_media_play_slider_changed), mplay);
157 mplay->play_button = glade_xml_get_widget (mplay->xml, "toggle_play");
158 g_assert (mplay->play_button != NULL);
159 mplay->pause_button = glade_xml_get_widget (mplay->xml, "toggle_pause");
160 g_assert (mplay->pause_button != NULL);
161 mplay->stop_button = glade_xml_get_widget (mplay->xml, "toggle_stop");
162 g_assert (mplay->stop_button != NULL);
164 mplay->window = glade_xml_get_widget (mplay->xml, "gstplay");
165 g_assert (mplay->window != NULL);
167 gtk_drag_dest_set (mplay->window,
168 GTK_DEST_DEFAULT_ALL,
171 gtk_signal_connect (GTK_OBJECT (mplay->window), "drag_data_received",
172 GTK_SIGNAL_FUNC (target_drag_data_received),
175 mplay->play = gst_play_new();
177 gtk_signal_connect (GTK_OBJECT (mplay->play), "frame_displayed",
178 GTK_SIGNAL_FUNC (gst_media_play_frame_displayed),
181 gtk_signal_connect (GTK_OBJECT (mplay->play), "audio_played",
182 GTK_SIGNAL_FUNC (gst_media_play_frame_displayed),
185 gtk_signal_connect (GTK_OBJECT (mplay->play), "playing_state_changed",
186 GTK_SIGNAL_FUNC (gst_media_play_state_changed),
189 gnome_dock_set_client_area (GNOME_DOCK (glade_xml_get_widget(mplay->xml, "dock1")),
190 GTK_WIDGET (mplay->play));
192 gtk_widget_show (GTK_WIDGET (mplay->play));
194 mplay->status = (GstStatusArea *)glade_xml_get_widget (mplay->xml, "status_area");
195 gst_status_area_set_state (mplay->status, GST_STATUS_AREA_STATE_INIT);
196 gst_status_area_set_playtime (mplay->status, "00:00 / 00:00");
198 symbols = g_module_open (NULL, 0);
201 data.symbols = symbols;
203 glade_xml_signal_autoconnect_full (mplay->xml, gst_media_play_connect_func, &data);
205 mplay->last_time = 0;
209 gst_media_play_new ()
211 return GST_MEDIA_PLAY (gtk_type_new (GST_TYPE_MEDIA_PLAY));
215 gst_media_play_update_status_area (GstMediaPlay *play,
221 sprintf(time, "%02lu:%02lu / %02lu:%02lu",
222 current_time/60, current_time%60,
223 total_time/60, total_time%60);
225 gst_status_area_set_playtime (play->status, time);
229 gst_media_play_start_uri (GstMediaPlay *play,
234 g_return_if_fail (play != NULL);
235 g_return_if_fail (GST_IS_MEDIA_PLAY (play));
238 ret = gst_play_set_uri (play->play, uri);
240 if (!gst_play_media_can_seek (play->play)) {
241 gtk_widget_set_sensitive (play->slider, FALSE);
244 gtk_window_set_title (GTK_WINDOW (play->window),
245 g_strconcat ( "Gstplay - ", uri, NULL));
247 gst_play_play (play->play);
252 GtkWidget *selection;
257 on_load_file_selected (GtkWidget *button,
260 GtkWidget *selector = data->selection;
261 GstMediaPlay *play = data->play;
263 gchar *file_name = gtk_file_selection_get_filename (GTK_FILE_SELECTION(selector));
265 gst_media_play_start_uri (play, file_name);
272 on_open2_activate (GtkWidget *widget,
275 GtkWidget *file_selector;
276 file_select *file_data = g_new0 (file_select, 1);
278 file_selector = gtk_file_selection_new("Please select a file to load.");
280 file_data->selection = file_selector;
281 file_data->play = play;
283 gtk_signal_connect (GTK_OBJECT (GTK_FILE_SELECTION(file_selector)->ok_button),
284 "clicked", GTK_SIGNAL_FUNC (on_load_file_selected),
287 /* Ensure that the dialog box is destroyed when the user clicks a button. */
288 gtk_signal_connect_object (GTK_OBJECT (GTK_FILE_SELECTION(file_selector)->ok_button),
289 "clicked", GTK_SIGNAL_FUNC (gtk_widget_destroy),
290 (gpointer) file_selector);
291 gtk_signal_connect_object (GTK_OBJECT (GTK_FILE_SELECTION(file_selector)->cancel_button),
292 "clicked", GTK_SIGNAL_FUNC (gtk_widget_destroy),
293 (gpointer) file_selector);
295 /* Display that dialog */
296 gtk_widget_show (file_selector);
301 gst_media_play_set_arg (GtkObject *object,
306 play = GST_MEDIA_PLAY (object);
310 g_warning("GstMediaPlay: unknown arg!");
316 gst_media_play_get_arg (GtkObject *object,
322 play = GST_MEDIA_PLAY (object);
326 arg->type = GTK_TYPE_INVALID;
332 gst_media_play_state_changed (GstPlay *play,
336 GstStatusAreaState area_state;
338 g_return_if_fail (GST_IS_PLAY (play));
339 g_return_if_fail (GST_IS_MEDIA_PLAY (mplay));
342 gdk_threads_enter ();
343 update_buttons (mplay, state);
346 case GST_PLAY_STOPPED:
347 area_state = GST_STATUS_AREA_STATE_STOPPED;
349 case GST_PLAY_PLAYING:
350 area_state = GST_STATUS_AREA_STATE_PLAYING;
352 case GST_PLAY_PAUSED:
353 area_state = GST_STATUS_AREA_STATE_PAUSED;
356 area_state = GST_STATUS_AREA_STATE_INIT;
358 gst_status_area_set_state (mplay->status, area_state);
359 gdk_threads_leave ();
363 on_gst_media_play_destroy (GtkWidget *widget,
370 on_exit_menu_activate (GtkWidget *widget,
373 gdk_threads_leave ();
374 gst_play_stop (mplay->play);
375 gdk_threads_enter ();
380 on_gst_media_play_delete_event (GtkWidget *widget,
384 gdk_threads_leave ();
385 gst_play_stop (mplay->play);
386 gdk_threads_enter ();
391 on_extended1_activate (GtkCheckMenuItem *item,
394 gdk_threads_leave ();
395 gst_status_area_show_extended (mplay->status, item->active);
396 gdk_threads_enter ();
400 gst_media_play_frame_displayed (GstPlay *play,
405 gulong size, current_offset;
407 g_return_if_fail (GST_IS_PLAY (play));
408 g_return_if_fail (GST_IS_MEDIA_PLAY (mplay));
410 current_time = gst_play_get_media_current_time (play);
411 total_time = gst_play_get_media_total_time (play);
412 size = gst_play_get_media_size (play);
413 current_offset = gst_play_get_media_offset (play);
415 if (current_time != mplay->last_time) {
416 gdk_threads_enter ();
417 gst_media_play_update_status_area (mplay, current_time, total_time);
418 update_slider (mplay, mplay->adjustment, current_offset*100.0/size);
419 mplay->last_time = current_time;
420 gdk_threads_leave ();
425 gst_media_play_slider_changed (GtkAdjustment *adj,
430 g_return_if_fail (GST_IS_MEDIA_PLAY (mplay));
432 size = gst_play_get_media_size (mplay->play);
434 gst_play_media_seek(mplay->play, (int)(adj->value*size/100.0));
438 on_toggle_play_toggled (GtkToggleButton *togglebutton,
441 gdk_threads_leave ();
442 gst_play_play (play->play);
443 gdk_threads_enter ();
444 update_buttons (play, GST_PLAY_STATE(play->play));
448 on_toggle_pause_toggled (GtkToggleButton *togglebutton,
451 gdk_threads_leave ();
452 gst_play_pause (play->play);
453 gdk_threads_enter ();
454 update_buttons (play, GST_PLAY_STATE(play->play));
458 on_toggle_stop_toggled (GtkToggleButton *togglebutton,
461 gdk_threads_leave ();
462 gst_play_stop (play->play);
463 gdk_threads_enter ();
464 update_buttons (play, GST_PLAY_STATE(play->play));
468 update_buttons (GstMediaPlay *mplay,
471 gtk_signal_handler_block_by_func (GTK_OBJECT (mplay->play_button),
472 GTK_SIGNAL_FUNC (on_toggle_play_toggled),
474 gtk_signal_handler_block_by_func (GTK_OBJECT (mplay->pause_button),
475 GTK_SIGNAL_FUNC (on_toggle_pause_toggled),
477 gtk_signal_handler_block_by_func (GTK_OBJECT (mplay->stop_button),
478 GTK_SIGNAL_FUNC (on_toggle_stop_toggled),
481 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (mplay->play_button), FALSE);
482 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (mplay->pause_button), FALSE);
483 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (mplay->stop_button), FALSE);
485 if (state == GST_PLAY_PLAYING) {
486 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (mplay->play_button), TRUE);
488 else if (state == GST_PLAY_PAUSED) {
489 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (mplay->pause_button), TRUE);
491 else if (state == GST_PLAY_STOPPED) {
492 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (mplay->stop_button), TRUE);
495 gtk_signal_handler_unblock_by_func (GTK_OBJECT (mplay->play_button),
496 GTK_SIGNAL_FUNC (on_toggle_play_toggled),
498 gtk_signal_handler_unblock_by_func (GTK_OBJECT (mplay->pause_button),
499 GTK_SIGNAL_FUNC (on_toggle_pause_toggled),
501 gtk_signal_handler_unblock_by_func (GTK_OBJECT (mplay->stop_button),
502 GTK_SIGNAL_FUNC (on_toggle_stop_toggled),
507 update_slider (GstMediaPlay *mplay,
508 GtkAdjustment *adjustment,
511 gtk_signal_handler_block_by_func (GTK_OBJECT (adjustment),
512 GTK_SIGNAL_FUNC (gst_media_play_slider_changed),
514 gtk_adjustment_set_value (adjustment, value);
515 gtk_signal_handler_unblock_by_func (GTK_OBJECT (adjustment),
516 GTK_SIGNAL_FUNC (gst_media_play_slider_changed),