summaryrefslogtreecommitdiff
path: root/src/totem-mozilla-viewer.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/totem-mozilla-viewer.c')
-rw-r--r--src/totem-mozilla-viewer.c1077
1 files changed, 0 insertions, 1077 deletions
diff --git a/src/totem-mozilla-viewer.c b/src/totem-mozilla-viewer.c
deleted file mode 100644
index 20b5977a5..000000000
--- a/src/totem-mozilla-viewer.c
+++ /dev/null
@@ -1,1077 +0,0 @@
-/* Totem Mozilla Embedded Viewer
- *
- * Copyright (C) <2004-2006> Bastien Nocera <hadess@hadess.net>
- * Copyright (C) <2002> David A. Schleef <ds@schleef.org>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-#include "config.h"
-
-#include <gtk/gtk.h>
-#include <glib/gi18n.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include <gdk/gdkx.h>
-#include <glade/glade.h>
-#include <gconf/gconf-client.h>
-#include <totem-pl-parser.h>
-
-#include <dbus/dbus-glib.h>
-#include <sys/types.h>
-#include <unistd.h>
-
-#include <libgnomevfs/gnome-vfs.h>
-#include <libgnomevfs/gnome-vfs-mime-handlers.h>
-
-#include "bacon-video-widget.h"
-#include "totem-interface.h"
-#include "totem-mozilla-options.h"
-#include "totem-statusbar.h"
-#include "bacon-volume.h"
-#include "video-utils.h"
-
-GtkWidget *totem_statusbar_create (void);
-GtkWidget *totem_volume_create (void);
-
-#define IS_FD_STREAM (strcmp(emb->filename, "fd://0") == 0)
-
-#define VOLUME_DOWN_OFFSET -8
-#define VOLUME_UP_OFFSET 8
-
-/* For newer D-Bus version */
-#ifndef DBUS_NAME_FLAG_PROHIBIT_REPLACEMENT
-#define DBUS_NAME_FLAG_PROHIBIT_REPLACEMENT 0
-#endif
-
-typedef enum {
- STATE_PLAYING,
- STATE_PAUSED,
- STATE_STOPPED
-} TotemStates;
-
-#define TOTEM_TYPE_EMBEDDED (totem_embedded_get_type ())
-typedef struct {
- GObjectClass parent_class;
-
- void (*stop_sending_data) (GObject *emb);
-} TotemEmbeddedClass;
-
-typedef struct _TotemEmbedded {
- GObject parent;
-
- GtkWidget *window;
- GladeXML *menuxml, *xml;
- GtkWidget *about;
- TotemStatusbar *statusbar;
- int width, height;
- const char *orig_filename;
- const char *mimetype;
- char *filename, *href, *target;
- BaconVideoWidget *bvw;
- TotemStates state;
- GdkCursor *cursor;
-
- /* Playlist */
- GList *playlist, *current;
- GMainLoop *loop;
- int num_items;
-
- /* Open menu item */
- GnomeVFSMimeApplication *app;
- GtkWidget *menu_item;
-
- /* Seek bits */
- GtkAdjustment *seekadj;
- GtkWidget *seek;
-
- guint is_playlist : 1;
- guint embedded_done : 1;
- guint controller_hidden : 1;
- guint hidden : 1;
- guint repeat : 1;
- guint seeking : 1;
- guint noautostart : 1;
-} TotemEmbedded;
-
-GType totem_embedded_get_type (void);
-
-G_DEFINE_TYPE (TotemEmbedded, totem_embedded, G_TYPE_OBJECT);
-static void totem_embedded_init (TotemEmbedded *emb) { }
-
-gboolean totem_embedded_play (TotemEmbedded *emb, GError **err);
-gboolean totem_embedded_pause (TotemEmbedded *emb, GError **err);
-gboolean totem_embedded_stop (TotemEmbedded *emb, GError **err);
-gboolean totem_embedded_set_local_file (TotemEmbedded *emb, const char *url, GError **err);
-
-static void totem_embedded_set_menu (TotemEmbedded *emb, gboolean enable);
-static void on_open1_activate (GtkButton *button, TotemEmbedded *emb);
-
-#include "totem-mozilla-interface.h"
-
-enum {
- STOP_SENDING_DATA,
- LAST_SIGNAL
-};
-static int totem_emb_table_signals[LAST_SIGNAL] = { 0 };
-
-static void totem_embedded_class_init (TotemEmbeddedClass *klass)
-{
- GObjectClass *object_class;
-
- object_class = (GObjectClass *) klass;
-
- totem_emb_table_signals[STOP_SENDING_DATA] =
- g_signal_new ("stop-sending-data",
- G_TYPE_FROM_CLASS (object_class),
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (TotemEmbeddedClass, stop_sending_data),
- NULL, NULL,
- g_cclosure_marshal_VOID__VOID,
- G_TYPE_NONE, 0);
-}
-
-static void
-totem_embedded_exit (TotemEmbedded *emb)
-{
- //FIXME what happens when embedded, and we can't go on?
- exit (1);
-}
-
-static void
-totem_embedded_error_and_exit (char *title, char *reason, TotemEmbedded *emb)
-{
- totem_interface_error_blocking (title, reason,
- GTK_WINDOW (emb->window));
- totem_embedded_exit (emb);
-}
-
-static void
-totem_embedded_emit_stop_sending_data (TotemEmbedded *emb)
-{
- g_return_if_fail (emb->filename != NULL);
- if (IS_FD_STREAM) {
- g_signal_emit (G_OBJECT (emb),
- totem_emb_table_signals[STOP_SENDING_DATA],
- 0, NULL);
- }
-}
-
-static void
-totem_embedded_set_state (TotemEmbedded *emb, TotemStates state)
-{
- char *id = NULL;
- GtkWidget *image;
- GdkCursor *cursor;
-
- if (state == emb->state)
- return;
-
- cursor = NULL;
- image = glade_xml_get_widget (emb->xml, "emb_pp_button_image");
-
- switch (state) {
- case STATE_STOPPED:
- if (emb->href != NULL)
- cursor = emb->cursor;
- id = g_strdup_printf ("gtk-media-play-%s",
- gtk_widget_get_direction (image) ? "ltr" : "rtl");
- totem_statusbar_set_text (emb->statusbar, _("Stopped"));
- totem_statusbar_set_time_and_length (emb->statusbar, 0, 0);
- break;
- case STATE_PAUSED:
- id = g_strdup_printf ("gtk-media-play-%s",
- gtk_widget_get_direction (image) ? "ltr" : "rtl");
- totem_statusbar_set_text (emb->statusbar, _("Paused"));
- break;
- case STATE_PLAYING:
- id = g_strdup ("gtk-media-pause");
- totem_statusbar_set_text (emb->statusbar, _("Playing"));
- break;
- default:
- break;
- }
-
- gtk_image_set_from_icon_name (GTK_IMAGE (image), id, GTK_ICON_SIZE_MENU);
- g_free (id);
- if (emb->hidden == FALSE && cursor != NULL)
- gdk_window_set_cursor (GTK_WIDGET (emb->bvw)->window, cursor);
-
- emb->state = state;
-}
-
-static void
-totem_embedded_set_pp_state (TotemEmbedded *emb, gboolean state)
-{
- GtkWidget *item;
-
- item = glade_xml_get_widget (emb->xml, "pp_button");
- gtk_widget_set_sensitive (item, state);
-}
-
-static gboolean
-totem_embedded_open (TotemEmbedded *emb)
-{
- GError *err = NULL;
- gboolean retval;
-
- g_message ("totem_embedded_open '%s'", emb->filename);
-
- retval = bacon_video_widget_open (emb->bvw, emb->filename, &err);
- if (retval == FALSE)
- {
- char *msg, *disp;
-
- totem_embedded_emit_stop_sending_data (emb);
-
- totem_embedded_set_state (emb, STATE_STOPPED);
-
- //FIXME if emb->filename is fd://0 or stdin:///
- //we should use a better name than that
- disp = g_strdup (emb->filename);
- //disp = gnome_vfs_unescape_string_for_display (totem->mrl);
- msg = g_strdup_printf(_("Totem could not play '%s'."), disp);
- g_free (disp);
-
- g_message ("error: %s", err->message);
- totem_interface_error_blocking (msg, err->message,
- GTK_WINDOW (emb->window));
- g_free (msg);
- g_error_free (err);
-
- totem_embedded_set_pp_state (emb, FALSE);
- } else {
- totem_embedded_set_state (emb, STATE_PAUSED);
- totem_embedded_set_pp_state (emb, TRUE);
- }
-
- if (IS_FD_STREAM && emb->num_items > 1) {
- totem_embedded_set_menu (emb, FALSE);
- } else {
- totem_embedded_set_menu (emb, TRUE);
- }
-
- return retval;
-}
-
-gboolean
-totem_embedded_play (TotemEmbedded *emb, GError **err)
-{
- if (bacon_video_widget_play (emb->bvw, NULL))
- totem_embedded_set_state (emb, STATE_PLAYING);
- return TRUE;
-}
-
-gboolean
-totem_embedded_pause (TotemEmbedded *emb, GError **err)
-{
- bacon_video_widget_pause (emb->bvw);
- totem_embedded_set_state (emb, STATE_PAUSED);
- return TRUE;
-}
-
-gboolean
-totem_embedded_stop (TotemEmbedded *emb, GError **err)
-{
- bacon_video_widget_stop (emb->bvw);
- totem_embedded_set_state (emb, STATE_STOPPED);
- return TRUE;
-}
-
-gboolean
-totem_embedded_set_local_file (TotemEmbedded *emb,
- const char *path, GError **err)
-{
- g_message ("Setting the current path to %s", path);
-
- g_free (emb->filename);
- emb->filename = g_filename_to_uri (path, NULL, NULL);
-
- return TRUE;
-}
-
-static void
-totem_embedded_set_menu (TotemEmbedded *emb, gboolean enable)
-{
- GtkWidget *menu, *item, *image;
- GtkWidget *copy;
- char *label;
-
- copy = glade_xml_get_widget (emb->menuxml, "copy_location1");
- gtk_widget_set_sensitive (copy, enable);
-
- if (emb->menu_item != NULL) {
- gtk_widget_destroy (emb->menu_item);
- emb->menu_item = NULL;
- }
- if (emb->app != NULL) {
- gnome_vfs_mime_application_free (emb->app);
- emb->app = NULL;
- }
-
- if (enable == FALSE)
- return;
-
- if (IS_FD_STREAM) {
- emb->app = gnome_vfs_mime_get_default_application_for_uri
- (emb->orig_filename, emb->mimetype);
- } else {
- emb->app = gnome_vfs_mime_get_default_application_for_uri
- (emb->filename, emb->mimetype);
- }
-
- if (emb->app == NULL)
- return;
-
- /* translators: this is:
- * Open With ApplicationName
- * as in nautilus' right-click menu */
- label = g_strdup_printf ("_Open with \"%s\"", emb->app->name);
- item = gtk_image_menu_item_new_with_mnemonic (label);
- g_free (label);
- image = gtk_image_new_from_stock (GTK_STOCK_OPEN, GTK_ICON_SIZE_MENU);
- gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (item), image);
- g_signal_connect (G_OBJECT (item), "activate",
- G_CALLBACK (on_open1_activate), emb);
- gtk_widget_show (item);
- emb->menu_item = item;
-
- menu = glade_xml_get_widget (emb->menuxml, "menu");
- gtk_menu_shell_prepend (GTK_MENU_SHELL (menu), item);
-}
-
-static void
-on_open1_activate (GtkButton *button, TotemEmbedded *emb)
-{
- GList *l = NULL;
-
- g_return_if_fail (emb->app != NULL);
-
- if (IS_FD_STREAM) {
- l = g_list_prepend (l, (gpointer) emb->orig_filename);
- } else if (emb->href != NULL) {
- l = g_list_prepend (l, emb->href);
- } else {
- l = g_list_prepend (l, emb->filename);
- }
-
- if (gnome_vfs_mime_application_launch (emb->app, l) == GNOME_VFS_OK) {
- totem_embedded_stop (emb, NULL);
- }
-
- g_list_free (l);
-}
-
-static void
-on_about1_activate (GtkButton *button, TotemEmbedded *emb)
-{
- char *backend_version, *description;
-
- const char *authors[] =
- {
- "Bastien Nocera <hadess@hadess.net>",
- "Ronald Bultje <rbultje@ronald.bitfreak.net>",
- NULL
- };
-
- if (emb->about != NULL)
- {
- gtk_window_present (GTK_WINDOW (emb->about));
- return;
- }
-
- backend_version = bacon_video_widget_get_backend_name (emb->bvw);
- description = g_strdup_printf (_("Browser Plugin using %s"),
- backend_version);
-
- emb->about = g_object_new (GTK_TYPE_ABOUT_DIALOG,
- "name", _("Totem Browser Plugin"),
- "version", VERSION,
- "copyright", _("Copyright \xc2\xa9 2002-2006 Bastien Nocera"),
- "comments", description,
- "authors", authors,
- "translator-credits", _("translator-credits"),
- "logo-icon-name", "totem",
- NULL);
-
- g_free (backend_version);
- g_free (description);
-
- totem_interface_set_transient_for (GTK_WINDOW (emb->about),
- GTK_WINDOW (emb->window));
-
- g_object_add_weak_pointer (G_OBJECT (emb->about),
- (gpointer *)&emb->about);
- g_signal_connect (G_OBJECT (emb->about), "response",
- G_CALLBACK (gtk_widget_destroy), NULL);
-
- gtk_widget_show (emb->about);
-}
-
-static void
-on_copy_location1_activate (GtkButton *button, TotemEmbedded *emb)
-{
- GtkClipboard *clip;
- const char *filename;
-
- if (IS_FD_STREAM) {
- filename = emb->orig_filename;
- } else if (emb->href != NULL) {
- filename = emb->href;
- } else {
- filename = emb->filename;
- }
-
- /* Set both the middle-click and the super-paste buffers */
- clip = gtk_clipboard_get_for_display
- (gdk_display_get_default(), GDK_SELECTION_CLIPBOARD);
- gtk_clipboard_set_text (clip, filename, -1);
- clip = gtk_clipboard_get_for_display
- (gdk_display_get_default(), GDK_SELECTION_PRIMARY);
- gtk_clipboard_set_text (clip, filename, -1);
-}
-
-static void
-on_play_pause (GtkWidget *widget, TotemEmbedded *emb)
-{
- if (emb->state == STATE_PLAYING) {
- totem_embedded_pause (emb, NULL);
- } else {
- totem_embedded_play (emb, NULL);
- }
-}
-
-static void
-on_got_redirect (GtkWidget *bvw, const char *mrl, TotemEmbedded *emb)
-{
- gchar *new_filename;
-
- g_message ("url: %s", emb->orig_filename);
- g_message ("redirect: %s", mrl);
-
- if (emb->orig_filename)
- new_filename = totem_resolve_relative_link (emb->orig_filename, mrl);
- else
- new_filename = totem_resolve_relative_link (emb->filename, mrl);
-
- g_free (emb->filename);
- emb->filename = new_filename;
-
- bacon_video_widget_close (emb->bvw);
- totem_embedded_set_state (emb, STATE_STOPPED);
-
- if (totem_embedded_open (emb) != FALSE)
- totem_embedded_play (emb, NULL);
-}
-
-static gboolean
-on_video_button_press_event (BaconVideoWidget *bvw, GdkEventButton *event,
- TotemEmbedded *emb)
-{
- if (event->type == GDK_BUTTON_PRESS &&
- event->button == 1 &&
- emb->href != NULL)
- {
- if (emb->target != NULL &&
- !g_ascii_strcasecmp (emb->target, "QuicktimePlayer")) {
- gchar *cmd;
- GError *err = NULL;
-
- if (g_file_test ("./totem",
- G_FILE_TEST_EXISTS) != FALSE) {
- cmd = g_strdup_printf ("./totem %s",
- emb->href);
- } else {
- cmd = g_strdup_printf (BINDIR"/totem %s",
- emb->href);
- }
- if (!g_spawn_command_line_async (cmd, &err)) {
- totem_interface_error_blocking (
- _("Failed to start stand-alone movie player"),
- err ? err->message : _("Unknown reason"),
- GTK_WINDOW (emb->window));
- }
- g_free (cmd);
- } else {
- g_free (emb->filename);
- emb->filename = emb->href;
- emb->href = NULL;
- bacon_video_widget_close (emb->bvw);
- totem_embedded_set_state (emb, STATE_STOPPED);
-
- if (emb->controller_hidden != FALSE) {
- GtkWidget *controls;
- controls = glade_xml_get_widget (emb->xml, "controls");
- gtk_widget_show (controls);
- }
-
-
- if (totem_embedded_open (emb) != FALSE)
- totem_embedded_play (emb, NULL);
-
- return TRUE;
- }
- } else if (event->button == 3 && event->type == GDK_BUTTON_PRESS) {
- GtkMenu *menu;
-
- menu = GTK_MENU (glade_xml_get_widget (emb->menuxml, "menu"));
- gtk_menu_popup (menu, NULL, NULL, NULL, NULL,
- event->button, event->time);
-
- return TRUE;
- }
-
- return FALSE;
-}
-
-static void
-on_eos_event (GtkWidget *bvw, TotemEmbedded *emb)
-{
- totem_embedded_set_state (emb, STATE_STOPPED);
- gtk_adjustment_set_value (emb->seekadj, 0);
-
- /* No playlist if we have fd://0, right? */
- if (IS_FD_STREAM) {
- totem_embedded_set_pp_state (emb, FALSE);
- } else if (emb->num_items == 1) {
- if (g_str_has_prefix (emb->filename, "file://") != FALSE) {
- if (bacon_video_widget_is_seekable (emb->bvw) != FALSE) {
- bacon_video_widget_pause (emb->bvw);
- bacon_video_widget_seek (emb->bvw, 0.0, NULL);
- } else {
- bacon_video_widget_close (emb->bvw);
- totem_embedded_open (emb);
- }
- } else {
- bacon_video_widget_close (emb->bvw);
- totem_embedded_open (emb);
- }
- if (emb->repeat != FALSE && emb->noautostart == FALSE)
- totem_embedded_play (emb, NULL);
- } else {
- /* Multiple items on the playlist */
- gboolean eop = FALSE, res;
-
- if (emb->current->next == NULL) {
- emb->current = emb->playlist;
- eop = TRUE;
- } else {
- emb->current = emb->current->next;
- }
-
- g_free (emb->filename);
- emb->filename = g_strdup (emb->current->data);
- bacon_video_widget_close (emb->bvw);
- res = totem_embedded_open (emb);
- if (res != FALSE &&
- ((eop != FALSE && emb->repeat != FALSE)
- || (eop == FALSE))) {
- totem_embedded_play (emb, NULL);
- }
- }
-}
-
-static void
-on_error_event (BaconVideoWidget *bvw, char *message,
- gboolean playback_stopped, gboolean fatal, TotemEmbedded *emb)
-{
- if (playback_stopped)
- totem_embedded_set_state (emb, STATE_STOPPED);
-
- if (fatal == FALSE) {
- totem_interface_error (_("An error occurred"), message,
- GTK_WINDOW (emb->window));
- } else {
- totem_embedded_error_and_exit (_("An error occurred"),
- message, emb);
- }
-}
-
-static void
-cb_vol (GtkWidget *val, TotemEmbedded *emb)
-{
- bacon_video_widget_set_volume (emb->bvw,
- bacon_volume_button_get_value (BACON_VOLUME_BUTTON (val)));
-}
-
-static gboolean
-on_volume_scroll_event (GtkWidget *win, GdkEventScroll *event, TotemEmbedded *emb)
-{
- GtkWidget *vbut;
- int vol, offset;
-
- switch (event->direction) {
- case GDK_SCROLL_UP:
- offset = VOLUME_UP_OFFSET;
- break;
- case GDK_SCROLL_DOWN:
- offset = VOLUME_DOWN_OFFSET;
- break;
- default:
- return FALSE;
- }
-
- vbut = glade_xml_get_widget (emb->xml, "volume_button");
- vol = bacon_volume_button_get_value (BACON_VOLUME_BUTTON (vbut));
- bacon_volume_button_set_value (BACON_VOLUME_BUTTON (vbut),
- vol + offset);
-
- return FALSE;
-}
-
-static void
-on_tick (GtkWidget *bvw,
- gint64 current_time,
- gint64 stream_length,
- float current_position,
- gboolean seekable,
- TotemEmbedded *emb)
-{
- if (emb->state != STATE_STOPPED) {
- gtk_widget_set_sensitive (emb->seek, seekable);
- if (emb->seeking == FALSE)
- gtk_adjustment_set_value (emb->seekadj,
- current_position * 65535);
- if (stream_length == 0) {
- totem_statusbar_set_time_and_length (emb->statusbar,
- (int) (current_time / 1000), -1);
- } else {
- totem_statusbar_set_time_and_length (emb->statusbar,
- (int) (current_time / 1000),
- (int) (stream_length / 1000));
- }
- }
-}
-
-static gboolean
-on_seek_start (GtkWidget *widget, GdkEventButton *event, TotemEmbedded *emb)
-{
- emb->seeking = TRUE;
-
- return FALSE;
-}
-
-static gboolean
-cb_on_seek (GtkWidget *widget, GdkEventButton *event, TotemEmbedded *emb)
-{
- bacon_video_widget_seek (emb->bvw,
- gtk_range_get_value (GTK_RANGE (widget)) / 65535, NULL);
- emb->seeking = FALSE;
-
- return FALSE;
-}
-
-static void
-totem_embedded_add_children (TotemEmbedded *emb)
-{
- GtkWidget *child, *container, *pp_button, *vbut;
- BvwUseType type = BVW_USE_TYPE_VIDEO;
- GError *err = NULL;
- GConfClient *gc;
- int volume;
-
- emb->xml = totem_interface_load_with_root ("mozilla-viewer.glade",
- "vbox1", _("Plugin"), TRUE,
- GTK_WINDOW (emb->window));
- emb->menuxml = totem_interface_load_with_root ("mozilla-viewer.glade",
- "menu", _("Menu"), TRUE,
- GTK_WINDOW (emb->window));
-
- if (emb->xml == NULL || emb->menuxml == NULL)
- totem_embedded_exit (emb);
-
- child = glade_xml_get_widget (emb->xml, "vbox1");
- gtk_container_add (GTK_CONTAINER (emb->window), child);
-
- if (emb->hidden)
- type = BVW_USE_TYPE_AUDIO;
-
- emb->bvw = BACON_VIDEO_WIDGET (bacon_video_widget_new
- (-1, -1, type, &err));
-
- if (emb->bvw == NULL)
- {
- totem_embedded_error_and_exit (_("The Totem plugin could not startup."), err != NULL ? err->message : _("No reason."), emb);
- if (err != NULL)
- g_error_free (err);
- }
-
- g_signal_connect (G_OBJECT(emb->bvw), "got-redirect",
- G_CALLBACK (on_got_redirect), emb);
- g_signal_connect (G_OBJECT (emb->bvw), "eos",
- G_CALLBACK (on_eos_event), emb);
- g_signal_connect (G_OBJECT (emb->bvw), "error",
- G_CALLBACK (on_error_event), emb);
- g_signal_connect (G_OBJECT(emb->bvw), "button-press-event",
- G_CALLBACK (on_video_button_press_event), emb);
- g_signal_connect (G_OBJECT(emb->bvw), "tick",
- G_CALLBACK (on_tick), emb);
-
- container = glade_xml_get_widget (emb->xml, "hbox4");
- gtk_container_add (GTK_CONTAINER (container), GTK_WIDGET (emb->bvw));
- if (type == BVW_USE_TYPE_VIDEO) {
- gtk_widget_realize (GTK_WIDGET (emb->bvw));
- gtk_widget_show (GTK_WIDGET (emb->bvw));
- }
-
- emb->seek = glade_xml_get_widget (emb->xml, "time_hscale");
- emb->seekadj = gtk_range_get_adjustment (GTK_RANGE (emb->seek));
- g_signal_connect (emb->seek, "button-press-event",
- G_CALLBACK (on_seek_start), emb);
- g_signal_connect (emb->seek, "button-release-event",
- G_CALLBACK (cb_on_seek), emb);
-
- pp_button = glade_xml_get_widget (emb->xml, "pp_button");
- g_signal_connect (G_OBJECT (pp_button), "clicked",
- G_CALLBACK (on_play_pause), emb);
-
- gc = gconf_client_get_default ();
- volume = gconf_client_get_int (gc, GCONF_PREFIX"/volume", NULL);
- g_object_unref (G_OBJECT (gc));
-
- bacon_video_widget_set_volume (emb->bvw, volume);
- vbut = glade_xml_get_widget (emb->xml, "volume_button");
- bacon_volume_button_set_value (BACON_VOLUME_BUTTON (vbut), volume);
- g_signal_connect (G_OBJECT (vbut), "value-changed",
- G_CALLBACK (cb_vol), emb);
- gtk_widget_add_events (vbut, GDK_SCROLL_MASK);
- g_signal_connect (G_OBJECT (vbut), "scroll_event",
- G_CALLBACK (on_volume_scroll_event), emb);
-
- emb->statusbar = TOTEM_STATUSBAR (glade_xml_get_widget
- (emb->xml, "emb_statusbar"));
-
- gtk_widget_realize (emb->window);
- gtk_widget_set_size_request (emb->window, emb->width, emb->height);
-
- if (emb->controller_hidden != FALSE) {
- child = glade_xml_get_widget (emb->xml, "controls");
- gtk_widget_hide (child);
- }
-
- /* popup */
- child = glade_xml_get_widget (emb->menuxml, "about1");
- g_signal_connect (G_OBJECT (child), "activate",
- G_CALLBACK (on_about1_activate), emb);
- child = glade_xml_get_widget (emb->menuxml, "copy_location1");
- g_signal_connect (G_OBJECT (child), "activate",
- G_CALLBACK (on_copy_location1_activate), emb);
- child = glade_xml_get_widget (emb->menuxml, "preferences1");
- gtk_widget_hide (child);
-}
-
-static void
-totem_embedded_create_cursor (TotemEmbedded *emb)
-{
- GtkWidget *label;
- GdkPixbuf *icon;
-
- label = gtk_label_new ("");
- icon = gtk_widget_render_icon (label, GTK_STOCK_MEDIA_PLAY,
- GTK_ICON_SIZE_BUTTON, NULL);
- gtk_widget_destroy (label);
- emb->cursor = gdk_cursor_new_from_pixbuf (gdk_display_get_default (),
- icon,
- gdk_pixbuf_get_width (icon) / 2,
- gdk_pixbuf_get_height (icon) / 2);
- gdk_pixbuf_unref (icon);
-}
-
-static void
-entry_added (TotemPlParser *parser, const char *uri, const char *title,
- const char *genre, gpointer data)
-{
- TotemEmbedded *emb = (TotemEmbedded *) data;
-
- g_print ("added URI '%s' with title '%s' genre '%s'\n", uri,
- title ? title : "empty", genre);
-
- //FIXME need new struct to hold that
- emb->playlist = g_list_prepend (emb->playlist, g_strdup (uri));
- emb->num_items++;
-}
-
-static gboolean
-totem_embedded_push_parser (gpointer data)
-{
- TotemPlParser *parser = totem_pl_parser_new ();
- TotemEmbedded *emb = (TotemEmbedded *) data;
- TotemPlParserResult res;
-
- parser = totem_pl_parser_new ();
- g_object_set (G_OBJECT (parser), "force", TRUE, NULL);
- g_object_set (G_OBJECT (parser), "disable-unsafe", TRUE, NULL);
- g_signal_connect (G_OBJECT (parser), "entry", G_CALLBACK (entry_added), emb);
- res = totem_pl_parser_parse (parser, emb->filename, FALSE);
- g_object_unref (parser);
-
- if (res != TOTEM_PL_PARSER_RESULT_SUCCESS) {
- //FIXME show a proper error message
- switch (res) {
- case TOTEM_PL_PARSER_RESULT_UNHANDLED:
- g_print ("url '%s' unhandled\n", emb->filename);
- break;
- case TOTEM_PL_PARSER_RESULT_ERROR:
- g_print ("error handling url '%s'\n", emb->filename);
- break;
- case TOTEM_PL_PARSER_RESULT_IGNORED:
- g_print ("ignored url '%s'\n", emb->filename);
- break;
- default:
- g_assert_not_reached ();
- ;;
- }
- }
-
- /* Check if we have anything in the playlist now */
- if (emb->playlist == NULL) {
- g_message ("NO PLAYLIST");
- totem_embedded_error_and_exit ("Can't parse that",
- "no files",
- emb);
- //FIXME error out
- return FALSE;
- }
-
- emb->playlist = g_list_reverse (emb->playlist);
- g_free (emb->filename);
- emb->filename = g_strdup (emb->playlist->data);
- emb->current = emb->playlist;
-
- g_main_loop_quit (emb->loop);
-
- return FALSE;
-}
-
-static void embedded (GtkPlug *plug, TotemEmbedded *emb)
-{
- emb->embedded_done = TRUE;
-}
-
-static int arg_width = -1;
-static int arg_height = -1;
-static char *arg_url = NULL;
-static char *arg_href = NULL;
-static char *arg_target = NULL;
-static char *arg_mime_type = NULL;
-static char **arg_remaining = NULL;
-static Window xid = 0;
-static gboolean arg_no_controls = FALSE;
-static gboolean arg_statusbar = FALSE;
-static gboolean arg_hidden = FALSE;
-static gboolean arg_is_playlist = FALSE;
-static gboolean arg_repeat = FALSE;
-static gboolean arg_no_autostart = FALSE;
-
-GtkWidget *
-totem_volume_create (void)
-{
- GtkWidget *widget;
-
- widget = bacon_volume_button_new (GTK_ICON_SIZE_MENU,
- 0, 100, -1);
- gtk_widget_show (widget);
-
- return widget;
-}
-
-GtkWidget *
-totem_statusbar_create (void)
-{
- GtkWidget *widget;
-
- widget = totem_statusbar_new ();
- totem_statusbar_set_has_resize_grip (TOTEM_STATUSBAR (widget), FALSE);
- if (arg_statusbar != FALSE)
- gtk_widget_show (widget);
-
- return widget;
-}
-
-static gboolean
-parse_xid (const gchar *option_name,
- const gchar *value,
- gpointer data,
- GError **error)
-{
- xid = (Window) g_ascii_strtoull (value, NULL, 10);
-
- return TRUE;
-}
-
-static GOptionEntry option_entries [] =
-{
- { TOTEM_OPTION_WIDTH, 0, 0, G_OPTION_ARG_INT, &arg_width, NULL, NULL },
- { TOTEM_OPTION_HEIGHT, 0, 0, G_OPTION_ARG_INT, &arg_height, NULL, NULL },
- { TOTEM_OPTION_URL, 0, 0, G_OPTION_ARG_STRING, &arg_url, NULL, NULL },
- { TOTEM_OPTION_HREF, 0, 0, G_OPTION_ARG_STRING, &arg_href, NULL, NULL },
- { TOTEM_OPTION_XID, 0, 0, G_OPTION_ARG_CALLBACK, parse_xid, NULL, NULL },
- { TOTEM_OPTION_TARGET, 0, 0, G_OPTION_ARG_STRING, &arg_target, NULL, NULL },
- { TOTEM_OPTION_MIMETYPE, 0, 0, G_OPTION_ARG_STRING, &arg_mime_type, NULL, NULL },
- { TOTEM_OPTION_CONTROLS_HIDDEN, 0, 0, G_OPTION_ARG_NONE, &arg_no_controls, NULL, NULL },
- { TOTEM_OPTION_STATUSBAR, 0, 0, G_OPTION_ARG_NONE, &arg_statusbar, NULL, NULL },
- { TOTEM_OPTION_HIDDEN, 0, 0, G_OPTION_ARG_NONE, &arg_hidden, NULL, NULL },
- { TOTEM_OPTION_PLAYLIST, 0, 0, G_OPTION_ARG_NONE, &arg_is_playlist, NULL, NULL },
- { TOTEM_OPTION_REPEAT, 0, 0, G_OPTION_ARG_NONE, &arg_repeat, NULL, NULL },
- { TOTEM_OPTION_NOAUTOSTART, 0, 0, G_OPTION_ARG_NONE, &arg_no_autostart, NULL, NULL },
- { G_OPTION_REMAINING, 0, 0, G_OPTION_ARG_FILENAME_ARRAY /* STRING? */, &arg_remaining, NULL },
- { NULL }
-};
-
-
-int main (int argc, char **argv)
-{
- TotemEmbedded *emb;
- DBusGProxy *proxy;
- DBusGConnection *conn;
- guint res;
- gchar *svcname;
- GError *e = NULL;
-
- bindtextdomain (GETTEXT_PACKAGE, GNOMELOCALEDIR);
- bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
- textdomain (GETTEXT_PACKAGE);
-
-#ifdef GNOME_ENABLE_DEBUG
- {
- int i;
- g_print ("Viewer args: ");
- for (i = 0; i < argc; i++)
- g_print ("%s ", argv[i]);
- g_print ("\n");
- }
-#endif
-
- if (XInitThreads () == 0)
- {
- gtk_init (&argc, &argv);
- totem_embedded_error_and_exit (_("Could not initialise the thread-safe libraries."), _("Verify your system installation. The Totem plugin will now exit."), NULL);
- }
-
- g_thread_init (NULL);
-
- if (!gtk_init_with_args (&argc, &argv, NULL, option_entries, GETTEXT_PACKAGE, &e))
- {
- g_print ("%s\n", e->message);
- g_error_free (e);
- exit (1);
- }
-
- /* FIXME: are there enough checks? */
- if (arg_remaining == NULL) {
- return 1;
- }
-
- bacon_video_widget_init_backend (NULL, NULL);
- gnome_vfs_init ();
-
- dbus_g_object_type_install_info (TOTEM_TYPE_EMBEDDED,
- &dbus_glib_totem_embedded_object_info);
- svcname = g_strdup_printf ("org.totem_%d.MozillaPluginService",
- getpid());
- if (!(conn = dbus_g_bus_get (DBUS_BUS_SESSION, &e)) ||
- !(proxy = dbus_g_proxy_new_for_name (conn, "org.freedesktop.DBus",
- "/org/freedesktop/DBus",
- "org.freedesktop.DBus")) ||
- !dbus_g_proxy_call (proxy, "RequestName", &e,
- G_TYPE_STRING, svcname,
- G_TYPE_UINT, DBUS_NAME_FLAG_PROHIBIT_REPLACEMENT,
- G_TYPE_INVALID,
- G_TYPE_UINT, &res,
- G_TYPE_INVALID)) {
- g_print ("Failed to get DBUS connection for %s: %s\n",
- svcname, e->message);
- return 1;
- }
- g_free (svcname);
-
- emb = g_object_new (TOTEM_TYPE_EMBEDDED, NULL);
-
- emb->state = STATE_STOPPED;
- emb->width = arg_width;
- emb->height = arg_height;
- emb->controller_hidden = arg_no_controls;
- emb->orig_filename = arg_url;
- emb->href = arg_href;
- emb->filename = arg_remaining ? arg_remaining[0] : NULL;
- emb->target = arg_target;
- if (arg_mime_type != NULL) {
- emb->mimetype = arg_mime_type;
- } else {
- emb->mimetype = g_strdup (gnome_vfs_get_mime_type_for_name (emb->filename));
- }
- emb->hidden = arg_hidden;
- emb->is_playlist = arg_is_playlist;
- emb->repeat = arg_repeat;
- emb->noautostart = arg_no_autostart;
-
- dbus_g_connection_register_g_object (conn, "/TotemEmbedded",
- G_OBJECT (emb));
-
- /* XEMBED or stand-alone */
- if (xid != 0) {
- GtkWidget *window;
-
- /* The miraculous XEMBED protocol */
- window = gtk_plug_new ((GdkNativeWindow) xid);
- gtk_signal_connect (GTK_OBJECT(window), "embedded",
- G_CALLBACK (embedded), NULL);
- gtk_widget_realize (window);
-
- emb->window = window;
- } else {
- /* Stand-alone version */
- emb->window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
- }
-
- /* Hidden or not as well? */
- totem_embedded_add_children (emb);
- totem_embedded_create_cursor (emb);
- if (emb->hidden == FALSE)
- gtk_widget_show (emb->window);
-
- /* wait until we're embedded if we're to be, or shown */
- if (xid != 0) {
- while (emb->embedded_done == FALSE && gtk_events_pending ())
- gtk_main_iteration ();
- } else {
- while (gtk_events_pending ())
- gtk_main_iteration ();
- }
-
- /* Do we have a playlist we need to setup ourselves? */
- if (emb->is_playlist != FALSE) {
- g_idle_add (totem_embedded_push_parser, emb);
- emb->loop = g_main_loop_new (NULL, FALSE);
- g_main_loop_run (emb->loop);
- g_main_loop_unref (emb->loop);
- } else {
- emb->playlist = g_list_prepend (emb->playlist,
- g_strdup (emb->filename));
- emb->num_items++;
- }
-
- if (totem_embedded_open (emb) != FALSE
- && emb->noautostart == FALSE) {
- totem_embedded_play (emb, NULL);
- }
-
- gtk_main ();
-
- return 0;
-}
-