~siretart/gxine/bug.542506

« back to all changes in this revision

Viewing changes to src/mediamarks.c

  • Committer: Bazaar Package Importer
  • Author(s): Reinhard Tartler
  • Date: 2008-03-21 11:24:59 UTC
  • mfrom: (1.1.8 upstream)
  • Revision ID: james.westby@ubuntu.com-20080321112459-igb0jy01nytpdrzt
Tags: 0.5.901-1ubuntu1
* merge debian changes for hardy PPA. Remaining changes:
  - debian/control: added Xb-Npp-xxx tags accordingly to "firefox distro
    add-on suport" spec,
    (https://blueprints.launchpad.net/ubuntu/+spec/firefox-distro-addon-support)
* Feature Freeze exception granted in LP: #204563
* New upstream release fixes playing DVDs. LP: #128864
* mime.default: add "x-content/video-dvd;x-content/video-vcd;x-content/video-svcd;"
  to get it listed as a player for dvd and video cds in nautilus. Thanks to
  Sebastien Bacher for the hint.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
/*
2
 
 * Copyright (C) 2002-2004 the xine-project
 
2
 * Copyright (C) 2002-2007 the xine-project
3
3
 *
4
4
 * This program is free software; you can redistribute it and/or
5
5
 * modify it under the terms of the GNU General Public License as
16
16
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301
17
17
 * USA
18
18
 *
19
 
 * $Id: mediamarks.c,v 1.69 2006/04/08 21:34:50 dsalt Exp $
20
 
 *
21
19
 * mediamarks - load
22
20
 *            - save
23
21
 *            - edit
39
37
#include "engine.h"
40
38
#include "mediamarks.h"
41
39
#include "menu.h"
 
40
#include "list_menus.h"
42
41
#include "playlist.h"
43
42
#include "play_item.h"
44
43
 
45
44
static GtkTreeStore *mm_store;
46
45
static GtkTreeModel *mm_model;
 
46
static GtkTreeView  *tree;
47
47
static GtkTreeSelection *sel;
48
48
static GtkWidget    *manage_dlg, *cat_dlg, *cat_entry, *mm_tree;
49
49
static GtkTreeIter   cat_iter;
51
51
 
52
52
static GtkUIManager *mm_ui;
53
53
static GtkActionGroup *media_group = NULL;
 
54
static GtkAction      *play_item;
 
55
static GtkMenu        *menu[2];
54
56
static guint           media_merge;
55
57
 
56
58
#define COLUMN_TITLE            0
78
80
  return p;
79
81
}
80
82
 
 
83
static void play_cb (GtkWidget* widget, gpointer data)
 
84
{
 
85
  GtkTreeIter iter;
 
86
 
 
87
  if (gtk_tree_selection_get_selected (sel, NULL, &iter))
 
88
  {
 
89
    play_item_t *item = peek_play_item (&iter);
 
90
    if (item)
 
91
      playlist_play (playlist_add (play_item_copy (item), -1));
 
92
  }
 
93
}
 
94
 
81
95
static void menu_cb (GtkAction* action, gpointer data)
82
96
{
83
97
  if (data)
104
118
      else
105
119
      {
106
120
        GtkTreeIter children;
107
 
        if (gtk_tree_model_iter_children (GTK_TREE_MODEL(mm_store),
108
 
                                          &children, iter))
 
121
        if (gtk_tree_model_iter_children (mm_model, &children, iter))
109
122
          count = gen_actions_sub (ui, actions, &children, count);
110
123
      }
111
124
    }
112
 
  } while (gtk_tree_model_iter_next (GTK_TREE_MODEL(mm_store), iter));
 
125
  } while (gtk_tree_model_iter_next (mm_model, iter));
113
126
 
114
127
  return count;
115
128
}
141
154
        GtkTreeIter children;
142
155
        gtk_ui_manager_add_ui (ui, merge, path, name, name,
143
156
                               GTK_UI_MANAGER_MENU, FALSE);
144
 
        if (gtk_tree_model_iter_children (GTK_TREE_MODEL(mm_store),
145
 
                                          &children, iter))
 
157
        if (gtk_tree_model_iter_children (mm_model, &children, iter))
146
158
        {
147
159
          char *newpath = g_strdup_printf ("%s/%s", path, name);
148
160
          count = gen_items (ui, newpath, &children, merge, count);
150
162
        }
151
163
      }
152
164
    }
153
 
  } while (gtk_tree_model_iter_next (GTK_TREE_MODEL(mm_store), iter));
 
165
  } while (gtk_tree_model_iter_next (mm_model, iter));
154
166
 
155
167
  return count;
156
168
}
314
326
        }
315
327
 
316
328
        sscanf (str, "%d", &time);
317
 
        play_item = play_item_new (id, mrl, time);
 
329
        play_item = play_item_new (id, mrl, time, 0);
318
330
 
319
331
        gtk_tree_store_append (mm_store, &iter, depth ? &parent : NULL);
320
332
        gtk_tree_store_set (mm_store, &iter,
396
408
  }
397
409
}
398
410
 
 
411
static gboolean row_clicked_lcb (GtkWidget *widget, GdkEventButton *ev,
 
412
                                 gpointer data)
 
413
{
 
414
  return list_menu_click_cb (tree, ev, (GtkMenu **) data);
 
415
}
 
416
 
 
417
static gboolean key_press_lcb (GtkWidget *widget, GdkEventButton *ev,
 
418
                                 gpointer data)
 
419
{
 
420
  return list_menu_key_press_cb (tree, ev, (GtkMenu **) data);
 
421
}
 
422
 
399
423
static void delete_cb (GtkWidget* widget, gpointer data)
400
424
{
401
425
  GtkTreeIter iter;
527
551
  char        *dot;
528
552
  const char  *title = xine_get_meta_info (stream, XINE_META_INFO_TITLE);
529
553
 
530
 
  play_item = playlist_get_current_item () ? : play_item_new ("", "", 0);
 
554
  play_item = playlist_get_current_item () ? : play_item_new ("", "", 0, 0);
531
555
 
532
556
  /* default title? try to get title from meta-info */
533
557
  dot = strrchr (play_item->mrl, '.');
623
647
        print_depth (f, depth);
624
648
        fprintf (f, "<SUB NAME=\"%s\">\n", id);
625
649
 
626
 
        if (gtk_tree_model_iter_children (GTK_TREE_MODEL(mm_store), &children, iter))
 
650
        if (gtk_tree_model_iter_children (mm_model, &children, iter))
627
651
          save_items (f, depth+2, &children);
628
652
 
629
653
        print_depth (f, depth);
631
655
      }
632
656
    }
633
657
 
634
 
  } while (gtk_tree_model_iter_next (GTK_TREE_MODEL(mm_store), iter));
 
658
  } while (gtk_tree_model_iter_next (mm_model, iter));
635
659
}
636
660
 
637
661
void mm_save (void)
696
720
  }
697
721
}
698
722
 
 
723
static gboolean map_cb (GtkWidget* widget, gpointer data)
 
724
{
 
725
  gdk_window_set_events (widget->window,
 
726
                         gdk_window_get_events (widget->window) | GDK_BUTTON_PRESS_MASK);
 
727
  return FALSE;
 
728
}
 
729
 
699
730
static const GtkActionEntry buttons_data[] = {
 
731
  { "play",     GTK_STOCK_MEDIA_PLAY,   NULL,                   NULL,           NULL,                           play_cb },
700
732
  { "new",      GTK_STOCK_NEW,          NULL,                   NULL,           N_("Add an MRL"),               mm_add_show },
701
 
  { "newcat",   GTK_STOCK_DIRECTORY,    N_("New category"),     "<Control>F",   N_("Add a category folder"),    new_category_cb },
 
733
  { "newcat",   GTK_STOCK_DIRECTORY,    N_("_Category"),        "<Control>F",   N_("Add a category folder"),    new_category_cb },
702
734
  { "edit",     GTK_STOCK_EDIT,         NULL,                   "<Control>E",   N_("Edit the selected item"),   edit_cb },
703
735
  { "delete",   GTK_STOCK_DELETE,       NULL,                   "Delete",       N_("Delete the selected item"), delete_cb },
704
736
  { "copy",     GTK_STOCK_COPY,         NULL,                   NULL,           NULL,                           copy_cb },
716
748
      "<toolitem action='copy' />\n"
717
749
      "<toolitem action='cut' />\n"
718
750
      "<toolitem action='paste' />\n"
 
751
      "<separator />\n"
 
752
      "<toolitem action='play' />\n"
719
753
    "</toolbar>\n"
 
754
    "<popup name='item_menu'>\n"
 
755
      "<menuitem action='play' />\n"
 
756
      "<separator />\n"
 
757
      "<menuitem action='edit' />\n"
 
758
      "<menuitem action='delete' />\n"
 
759
      "<menuitem action='copy' />\n"
 
760
      "<menuitem action='cut' />\n"
 
761
      "<menuitem action='paste' />\n"
 
762
    "</popup>\n"
 
763
    "<popup name='list_menu'>\n"
 
764
      "<menuitem action='new' />\n"
 
765
      "<menuitem action='newcat' />\n"
 
766
      "<menuitem action='paste' />\n"
 
767
    "</popup>\n"
720
768
  "</ui>";
721
769
 
722
770
static void sel_changed_cb (GtkTreeSelection *sel, gpointer data)
723
771
{
724
772
  static const char *const items[] = { "edit", "delete", NULL };
725
 
  static const char *const cb_items[] = { "copy", "cut", NULL };
 
773
  static const char *const cb_items[] = { "play", "copy", "cut", NULL };
726
774
  GtkTreeIter iter;
727
775
  gboolean have_selected = gtk_tree_selection_get_selected (sel, NULL, &iter);
728
776
 
735
783
 
736
784
void mediamarks_init (void)
737
785
{
738
 
  GtkWidget            *tree, *scrolled_window, *hbox, *label;
 
786
  GtkWidget            *scrolled_window, *hbox, *label;
739
787
  GtkBox               *vbox;
740
788
  gchar                *fname;
741
789
  GtkCellRenderer      *cell;
742
790
  GtkTreeViewColumn    *column;
743
 
  GError               *error;
 
791
  GError               *error = NULL;
 
792
 
 
793
  /*
 
794
   * create (for now invisible) mm_manage dialog
 
795
   */
 
796
 
 
797
  manage_dlg = gtk_dialog_new_with_buttons (_("Manage media marks..."), NULL, 0,
 
798
                                GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT,
 
799
                                GTK_STOCK_CLOSE, GTK_RESPONSE_DELETE_EVENT,
 
800
                                NULL);
 
801
  gtk_window_set_default_size (GTK_WINDOW (manage_dlg), 400, 250);
 
802
  hide_on_delete (manage_dlg, &is_visible);
 
803
  vbox = GTK_BOX (GTK_DIALOG (manage_dlg)->vbox);
 
804
 
 
805
  /* buttons & menus */
 
806
 
 
807
  mm_ui = ui_create_manager ("mm", manage_dlg);
 
808
  GtkActionGroup *group = ui_get_action_group (mm_ui);
 
809
  gtk_action_group_add_actions (group, buttons_data,
 
810
                                G_N_ELEMENTS (buttons_data), tree);
 
811
  gtk_ui_manager_add_ui_from_string (mm_ui, buttons_structure, -1, &error);
 
812
  if (error)
 
813
  {
 
814
    g_printerr (_("playlist XML: %s\n"), error->message);
 
815
    g_clear_error (&error);
 
816
  }
 
817
  menu[0] = GTK_MENU (gtk_ui_manager_get_widget (mm_ui, "/ui/list_menu"));
 
818
  menu[1] = GTK_MENU (gtk_ui_manager_get_widget (mm_ui, "/ui/item_menu"));
 
819
  play_item = gtk_action_group_get_action (group, "play");
 
820
  gtk_action_group_connect_accelerators (group);
744
821
 
745
822
  /*
746
823
   * init tree store
756
833
        "signal::rows-reordered", G_CALLBACK (tree_changed_cb), NULL,
757
834
        NULL);
758
835
 
759
 
  /*
760
 
   * create (for now invisible) mm_manage dialog
761
 
   */
762
 
 
763
 
  manage_dlg = gtk_dialog_new_with_buttons (_("Manage media marks..."), NULL, 0,
764
 
                                GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT,
765
 
                                GTK_STOCK_CLOSE, GTK_RESPONSE_DELETE_EVENT,
766
 
                                NULL);
767
 
  gtk_window_set_default_size (GTK_WINDOW (manage_dlg), 400, 250);
768
 
  g_signal_connect (G_OBJECT(manage_dlg), "response",
769
 
                    G_CALLBACK(mm_response_cb), NULL);
770
 
  hide_on_delete (manage_dlg, &is_visible);
771
 
 
772
 
  vbox = GTK_BOX (GTK_DIALOG (manage_dlg)->vbox);
 
836
  /* connect up the signals now that the menus etc. are initialised */
 
837
 
 
838
  g_object_connect (G_OBJECT(manage_dlg),
 
839
        "signal::map-event", G_CALLBACK (map_cb), NULL,
 
840
        "signal::button-press-event", G_CALLBACK(list_menu_popup_cb), menu[0],
 
841
        "signal::key-press-event", G_CALLBACK(key_press_lcb), menu,
 
842
        "signal::response", G_CALLBACK(mm_response_cb), NULL,
 
843
        NULL);
773
844
 
774
845
  /* add a nice toolbar and tree view widget here */
775
846
 
776
 
  mm_tree = tree = gtk_tree_view_new_with_model (GTK_TREE_MODEL(mm_store));
777
 
  gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (tree), TRUE);
 
847
  mm_tree = gtk_tree_view_new_with_model (mm_model);
 
848
  tree = GTK_TREE_VIEW (mm_tree);
 
849
  gtk_tree_view_set_rules_hint (tree, TRUE);
778
850
 
779
 
  sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (tree));
 
851
  sel = gtk_tree_view_get_selection (tree);
780
852
  g_signal_connect (G_OBJECT (sel), "changed",
781
853
                    G_CALLBACK (sel_changed_cb), NULL);
782
854
 
783
 
  /* buttons */
784
 
 
785
 
  mm_ui = ui_create_manager ("mm", manage_dlg);
786
 
  gtk_action_group_add_actions (ui_get_action_group (mm_ui), buttons_data,
787
 
                                G_N_ELEMENTS (buttons_data), tree);
788
 
  gtk_ui_manager_add_ui_from_string (mm_ui, buttons_structure, -1, &error);
789
 
  gtk_box_pack_start (vbox, gtk_ui_manager_get_widget (mm_ui, "/toolbar"),
 
855
  gtk_box_pack_start (vbox, gtk_ui_manager_get_widget (mm_ui, "/ui/toolbar"),
790
856
                      FALSE, FALSE, 0);
791
 
  gtk_action_group_connect_accelerators (ui_get_action_group (mm_ui));
792
857
 
793
858
  sel_changed_cb (sel, NULL);
794
859
 
799
864
                "ellipsize", 2, "width_chars", 16, NULL); /* foo...bar */
800
865
  column = gtk_tree_view_column_new_with_attributes (_("Media mark"), cell,
801
866
                                                     "text", COLUMN_TITLE, NULL);
802
 
  gtk_tree_view_column_set_resizable (GTK_TREE_VIEW_COLUMN(column), TRUE);
803
 
  gtk_tree_view_append_column (GTK_TREE_VIEW (tree),
804
 
                               GTK_TREE_VIEW_COLUMN (column));
 
867
  gtk_tree_view_column_set_resizable (column, TRUE);
 
868
  gtk_tree_view_append_column (tree, column);
805
869
 
806
870
  cell = gtk_cell_renderer_text_new ();
807
871
  g_object_set (G_OBJECT(cell),
808
872
                "ellipsize", 1, "width_chars", 16, NULL); /* ...bar */
809
873
  column = gtk_tree_view_column_new_with_attributes (_("MRL"), cell,
810
874
                                                     "text", COLUMN_MRL, NULL);
811
 
  gtk_tree_view_column_set_sizing (GTK_TREE_VIEW_COLUMN(column),
812
 
                                   GTK_TREE_VIEW_COLUMN_AUTOSIZE);
813
 
  gtk_tree_view_append_column (GTK_TREE_VIEW (tree),
814
 
                               GTK_TREE_VIEW_COLUMN (column));
 
875
  gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
 
876
  gtk_tree_view_append_column (tree, column);
815
877
 
816
 
  gtk_tree_view_set_reorderable (GTK_TREE_VIEW (tree), TRUE);
 
878
  gtk_tree_view_set_reorderable (tree, TRUE);
817
879
 
818
880
  scrolled_window = gtk_scrolled_window_new (NULL, NULL);
819
881
  gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
820
882
                                  GTK_POLICY_AUTOMATIC,
821
883
                                  GTK_POLICY_AUTOMATIC);
822
 
  gtk_container_add (GTK_CONTAINER (scrolled_window), tree);
 
884
  gtk_container_add (GTK_CONTAINER (scrolled_window), mm_tree);
823
885
 
824
 
  g_signal_connect (G_OBJECT (tree), "row-activated",
825
 
                    G_CALLBACK (edit_cb), NULL);
 
886
  g_object_connect (G_OBJECT (tree),
 
887
        "signal::row-activated", G_CALLBACK (edit_cb), NULL,
 
888
        "signal::button-press-event", G_CALLBACK (row_clicked_lcb), menu,
 
889
        NULL);
826
890
 
827
891
  gtk_box_pack_start (vbox, scrolled_window, TRUE, TRUE, 2);
828
892