1
/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
4
* Copyright (C) Philippe Rouquier 2005-2008 <bonfire-app@wanadoo.fr>
6
* brasero is free software: you can redistribute it and/or modify it
7
* under the terms of the GNU General Public License as published by the
8
* Free Software Foundation, either version 3 of the License, or
9
* (at your option) any later version.
11
* brasero is distributed in the hope that it will be useful, but
12
* WITHOUT ANY WARRANTY; without even the implied warranty of
13
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
14
* See the GNU General Public License for more details.
16
* You should have received a copy of the GNU General Public License along
17
* with this program. If not, see <http://www.gnu.org/licenses/>.
25
#include <glib/gi18n-lib.h>
27
#include "brasero-video-project.h"
28
#include "brasero-file-monitor.h"
29
#include "brasero-io.h"
30
#include "brasero-marshal.h"
32
typedef struct _BraseroVideoProjectPrivate BraseroVideoProjectPrivate;
33
struct _BraseroVideoProjectPrivate
36
GHashTable *references;
39
BraseroIOJobBase *load_uri;
40
BraseroIOJobBase *load_dir;
42
BraseroVideoFile *first;
47
#define BRASERO_VIDEO_PROJECT_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), BRASERO_TYPE_VIDEO_PROJECT, BraseroVideoProjectPrivate))
51
#include "brasero-file-monitor.h"
53
G_DEFINE_TYPE (BraseroVideoProject, brasero_video_project, BRASERO_TYPE_FILE_MONITOR);
57
G_DEFINE_TYPE (BraseroVideoProject, brasero_video_project, G_TYPE_OBJECT);
62
PROJECT_LOADED_SIGNAL,
71
static guint brasero_video_project_signals [LAST_SIGNAL] = {0};
74
* Used to send signals with a default answer
78
brasero_video_project_file_signal (BraseroVideoProject *self,
82
GValue instance_and_params [2];
86
/* object which signalled */
87
instance_and_params->g_type = 0;
88
g_value_init (instance_and_params, G_TYPE_FROM_INSTANCE (self));
89
g_value_set_instance (instance_and_params, self);
91
/* arguments of signal (name) */
92
params = instance_and_params + 1;
94
g_value_init (params, G_TYPE_STRING);
95
g_value_set_string (params, name);
97
/* default to FALSE */
98
return_value.g_type = 0;
99
g_value_init (&return_value, G_TYPE_BOOLEAN);
100
g_value_set_boolean (&return_value, FALSE);
102
g_signal_emitv (instance_and_params,
103
brasero_video_project_signals [signal],
107
g_value_unset (instance_and_params);
108
g_value_unset (params);
110
return g_value_get_boolean (&return_value);
114
* Manages the references to a node
118
brasero_video_project_reference_new (BraseroVideoProject *self,
119
BraseroVideoFile *node)
121
BraseroVideoProjectPrivate *priv;
124
priv = BRASERO_VIDEO_PROJECT_PRIVATE (self);
126
if (!priv->references)
127
priv->references = g_hash_table_new (g_direct_hash, g_direct_equal);
129
retval = priv->ref_count;
130
while (g_hash_table_lookup (priv->references, GINT_TO_POINTER (retval))) {
133
if (retval == G_MAXINT)
136
/* this means there is no more room for reference */
137
if (retval == priv->ref_count)
141
g_hash_table_insert (priv->references,
142
GINT_TO_POINTER (retval),
144
priv->ref_count = retval + 1;
145
if (priv->ref_count == G_MAXINT)
152
brasero_video_project_reference_free (BraseroVideoProject *self,
155
BraseroVideoProjectPrivate *priv;
157
priv = BRASERO_VIDEO_PROJECT_PRIVATE (self);
158
g_hash_table_remove (priv->references, GINT_TO_POINTER (reference));
162
brasero_video_project_reference_get (BraseroVideoProject *self,
165
BraseroVideoProjectPrivate *priv;
167
/* if it was invalidated then the node returned is NULL */
168
priv = BRASERO_VIDEO_PROJECT_PRIVATE (self);
169
return g_hash_table_lookup (priv->references, GINT_TO_POINTER (reference));
173
brasero_video_project_reference_remove_children_cb (gpointer key,
175
gpointer callback_data)
177
BraseroVideoFile *node = data;
178
BraseroVideoFile *removable = callback_data;
180
if (node == removable)
187
brasero_video_project_reference_invalidate (BraseroVideoProject *self,
188
BraseroVideoFile *node)
190
BraseroVideoProjectPrivate *priv;
192
/* used internally to invalidate reference whose node was removed */
193
priv = BRASERO_VIDEO_PROJECT_PRIVATE (self);
194
g_hash_table_foreach_remove (priv->references,
195
(GHRFunc) brasero_video_project_reference_remove_children_cb,
204
brasero_video_project_rename (BraseroVideoProject *self,
205
BraseroVideoFile *file,
209
BraseroVideoProjectClass *klass;
211
tmp = file->info->title;
212
file->info->title = g_strdup (name);
215
file->title_set = TRUE;
217
klass = BRASERO_VIDEO_PROJECT_GET_CLASS (self);
218
if (klass->node_changed)
219
klass->node_changed (self, file);
223
brasero_video_project_move (BraseroVideoProject *self,
224
BraseroVideoFile *file,
225
BraseroVideoFile *next_file)
227
BraseroVideoFile *prev, *next;
228
BraseroVideoProjectClass *klass;
229
BraseroVideoProjectPrivate *priv;
231
priv = BRASERO_VIDEO_PROJECT_PRIVATE (self);
235
if (file == next_file)
251
klass = BRASERO_VIDEO_PROJECT_GET_CLASS (self);
252
if (klass->node_removed)
253
klass->node_removed (self, file);
257
file->next = next_file;
258
file->prev = next_file->prev;
259
next_file->prev = file;
262
file->prev->next = file;
266
else if (priv->first) {
267
BraseroVideoFile *last;
269
/* Put it at the end */
271
while (last->next) last = last->next;
284
if (klass->node_added)
285
klass->node_added (self, file);
293
brasero_video_file_free (BraseroVideoFile *file)
299
g_object_unref (file->snapshot);
302
brasero_song_info_free (file->info);
308
brasero_video_project_foreach_monitor_cancel_cb (gpointer data,
311
BraseroVideoFile *node = data;
312
BraseroVideoFile *file = user_data;
321
brasero_video_project_remove_file (BraseroVideoProject *self,
322
BraseroVideoFile *file)
324
BraseroVideoFile *prev, *next;
325
BraseroVideoProjectClass *klass;
326
BraseroVideoProjectPrivate *priv;
328
priv = BRASERO_VIDEO_PROJECT_PRIVATE (self);
345
klass = BRASERO_VIDEO_PROJECT_GET_CLASS (self);
346
if (klass->node_removed)
347
klass->node_removed (self, file);
349
brasero_video_project_reference_invalidate (self, file);
353
/* Stop monitoring */
354
if (file->is_monitored)
355
brasero_file_monitor_foreach_cancel (BRASERO_FILE_MONITOR (self),
356
brasero_video_project_foreach_monitor_cancel_cb,
362
brasero_video_file_free (file);
365
brasero_video_project_signals [SIZE_CHANGED_SIGNAL],
370
brasero_video_project_reset (BraseroVideoProject *self)
372
BraseroVideoProjectPrivate *priv;
373
BraseroVideoProjectClass *klass;
374
BraseroVideoFile *iter, *next;
377
priv = BRASERO_VIDEO_PROJECT_PRIVATE (self);
379
/* cancel all VFS operations */
381
brasero_io_cancel_by_base (priv->io, priv->load_uri);
382
brasero_io_cancel_by_base (priv->io, priv->load_dir);
384
g_free (priv->load_uri);
385
priv->load_uri = NULL;
387
g_free (priv->load_dir);
388
priv->load_dir = NULL;
391
/* destroy all references */
392
if (priv->references) {
393
g_hash_table_destroy (priv->references);
394
priv->references = g_hash_table_new (g_direct_hash, g_direct_equal);
399
brasero_file_monitor_reset (BRASERO_FILE_MONITOR (self));
404
for (iter = priv->first; iter; iter = next) {
406
brasero_video_project_remove_file (self, iter);
412
klass = BRASERO_VIDEO_PROJECT_GET_CLASS (self);
414
klass->reset (self, num_nodes);
421
static BraseroVideoFile *
422
brasero_video_project_add_video_file (BraseroVideoProject *self,
424
BraseroVideoFile *sibling,
428
BraseroVideoProjectPrivate *priv;
429
BraseroVideoFile *file;
431
priv = BRASERO_VIDEO_PROJECT_PRIVATE (self);
433
/* create new file and insert it */
434
file = g_new0 (BraseroVideoFile, 1);
435
file->uri = g_strdup (uri);
444
file->next = sibling;
445
file->prev = sibling->prev;
448
sibling->prev->next = file;
452
sibling->prev = file;
454
else if (priv->first) {
455
BraseroVideoFile *last;
457
/* Put it at the end */
459
while (last->next) last = last->next;
475
brasero_video_project_set_file_information (BraseroVideoProject *self,
476
BraseroVideoFile *file,
481
BraseroVideoProjectPrivate *priv;
483
priv = BRASERO_VIDEO_PROJECT_PRIVATE (self);
485
/* For reloading files no need to go further, we just want to check that
486
* they are still readable and still holds video. */
487
if (file->is_reloading) {
488
file->is_reloading = FALSE;
492
file->is_loading = FALSE;
494
if (g_file_info_get_is_symlink (info)) {
497
sym_uri = g_strconcat ("file://", g_file_info_get_symlink_target (info), NULL);
503
/* Set the snapshot */
504
snapshot = GDK_PIXBUF (g_file_info_get_attribute_object (info, BRASERO_IO_THUMBNAIL));
508
scaled = gdk_pixbuf_scale_simple (snapshot,
509
48 * gdk_pixbuf_get_width (snapshot) / gdk_pixbuf_get_height (snapshot),
511
GDK_INTERP_BILINEAR);
512
file->snapshot = scaled;
516
if (!file->len_set) {
517
len = g_file_info_get_attribute_uint64 (info, BRASERO_IO_LEN);
520
else if (file->end <= 0)
524
/* Get the song info */
526
file->info = g_new0 (BraseroSongInfo, 1);
528
if (!file->title_set) {
529
if (file->info->title)
530
g_free (file->info->title);
532
file->info->title = g_strdup (g_file_info_get_attribute_string (info, BRASERO_IO_TITLE));
535
if (!file->artist_set) {
536
if (file->info->artist)
537
g_free (file->info->artist);
539
file->info->artist = g_strdup (g_file_info_get_attribute_string (info, BRASERO_IO_ARTIST));
542
if (!file->composer_set) {
543
if (file->info->composer)
544
g_free (file->info->composer);
546
file->info->composer = g_strdup (g_file_info_get_attribute_string (info, BRASERO_IO_COMPOSER));
550
file->info->isrc = g_file_info_get_attribute_int32 (info, BRASERO_IO_ISRC);
554
/* Start monitoring */
555
file->is_monitored = TRUE;
556
brasero_file_monitor_single_file (BRASERO_FILE_MONITOR (self),
564
brasero_video_project_vfs_operation_finished (GObject *object,
568
BraseroVideoProjectPrivate *priv;
570
priv = BRASERO_VIDEO_PROJECT_PRIVATE (object);
573
g_signal_emit (object,
574
brasero_video_project_signals [ACTIVITY_SIGNAL],
580
brasero_video_project_add_directory_contents_result (GObject *obj,
586
BraseroVideoFile *file;
587
BraseroVideoFile *sibling;
588
BraseroVideoProjectClass *klass;
589
guint ref = GPOINTER_TO_INT (user_data);
591
/* Check the return status for this file */
595
if (g_file_info_get_file_type (info) != G_FILE_TYPE_REGULAR
596
|| !g_file_info_get_attribute_boolean (info, BRASERO_IO_HAS_VIDEO))
599
sibling = brasero_video_project_reference_get (BRASERO_VIDEO_PROJECT (obj), ref);
601
/* Add a video file and set all information */
602
file = brasero_video_project_add_video_file (BRASERO_VIDEO_PROJECT (obj),
608
brasero_video_project_set_file_information (BRASERO_VIDEO_PROJECT (obj),
612
/* Tell model we added a node */
613
klass = BRASERO_VIDEO_PROJECT_GET_CLASS (obj);
614
if (klass->node_added)
615
klass->node_added (BRASERO_VIDEO_PROJECT (obj), file);
618
g_signal_emit (BRASERO_VIDEO_PROJECT (obj),
619
brasero_video_project_signals [SIZE_CHANGED_SIGNAL],
624
brasero_video_project_add_directory_contents (BraseroVideoProject *self,
626
BraseroVideoFile *sibling)
628
BraseroVideoProjectPrivate *priv;
631
priv = BRASERO_VIDEO_PROJECT_PRIVATE (self);
634
priv->io = brasero_io_get_default ();
637
priv->load_dir = brasero_io_register (G_OBJECT (self),
638
brasero_video_project_add_directory_contents_result,
639
brasero_video_project_vfs_operation_finished,
644
brasero_video_project_signals [ACTIVITY_SIGNAL],
648
ref = brasero_video_project_reference_new (self, sibling);
650
brasero_io_load_directory (priv->io,
653
BRASERO_IO_INFO_MIME|
654
BRASERO_IO_INFO_PERM|
655
BRASERO_IO_INFO_METADATA|
656
BRASERO_IO_INFO_METADATA_MISSING_CODEC|
657
BRASERO_IO_INFO_RECURSIVE|
658
BRASERO_IO_INFO_METADATA_THUMBNAIL,
659
GINT_TO_POINTER (ref));
663
brasero_video_project_result_cb (GObject *obj,
669
BraseroVideoFile *file;
670
BraseroVideoProject *self;
671
BraseroVideoProjectClass *klass;
672
BraseroVideoProjectPrivate *priv;
673
guint ref = GPOINTER_TO_INT (user_data);
675
self = BRASERO_VIDEO_PROJECT (obj);
676
priv = BRASERO_VIDEO_PROJECT_PRIVATE (obj);
678
/* Get the reference for the node */
679
file = brasero_video_project_reference_get (self, ref);
683
/* Check the return status for this file */
686
brasero_video_project_signals [UNREADABLE_SIGNAL],
691
brasero_video_project_remove_file (self, file);
695
if (g_file_info_get_file_type (info) == G_FILE_TYPE_DIRECTORY) {
699
result = brasero_video_project_file_signal (self,
700
DIRECTORY_URI_SIGNAL,
703
/* NOTE: we need to pass a sibling here even if that the file
704
* that's going to be deleted just after. */
706
brasero_video_project_add_directory_contents (self,
708
file->next?file->next:file);
710
/* remove the file */
711
brasero_video_project_remove_file (self, file);
715
if (g_file_info_get_file_type (info) != G_FILE_TYPE_REGULAR
716
|| !g_file_info_get_attribute_boolean (info, BRASERO_IO_HAS_VIDEO)) {
718
brasero_video_project_signals [NOT_VIDEO_SIGNAL],
722
brasero_video_project_remove_file (self, file);
726
brasero_video_project_set_file_information (BRASERO_VIDEO_PROJECT (obj),
730
/* Tell upper object that the node status and information changed */
731
klass = BRASERO_VIDEO_PROJECT_GET_CLASS (self);
732
if (klass->node_changed)
733
klass->node_changed (self, file);
737
brasero_video_project_signals [SIZE_CHANGED_SIGNAL],
742
brasero_video_project_add_uri (BraseroVideoProject *self,
744
BraseroSongInfo *info,
745
BraseroVideoFile *sibling,
749
BraseroVideoProjectPrivate *priv;
750
BraseroVideoProjectClass *klass;
751
BraseroVideoFile *file;
754
g_return_val_if_fail (uri != NULL, NULL);
756
priv = BRASERO_VIDEO_PROJECT_PRIVATE (self);
758
/* create new file and insert it */
759
file = g_new0 (BraseroVideoFile, 1);
760
file->uri = g_strdup (uri);
763
file->info = brasero_song_info_copy (info);
766
file->isrc_set = TRUE;
768
file->title_set = TRUE;
770
file->artist_set = TRUE;
772
file->composer_set = TRUE;
775
file->info = g_new0 (BraseroSongInfo, 1);
782
file->len_set = TRUE;
786
file->next = sibling;
787
file->prev = sibling->prev;
790
sibling->prev->next = file;
794
sibling->prev = file;
796
else if (priv->first) {
797
BraseroVideoFile *last;
799
/* Put it at the end */
801
while (last->next) last = last->next;
813
/* Tell model we added a node */
814
klass = BRASERO_VIDEO_PROJECT_GET_CLASS (self);
815
if (klass->node_added)
816
klass->node_added (self, file);
818
/* get info async for the file */
820
priv->io = brasero_io_get_default ();
823
priv->load_uri = brasero_io_register (G_OBJECT (self),
824
brasero_video_project_result_cb,
825
brasero_video_project_vfs_operation_finished,
828
file->is_loading = 1;
831
ref = brasero_video_project_reference_new (self, file);
832
brasero_io_get_file_info (priv->io,
835
BRASERO_IO_INFO_PERM|
836
BRASERO_IO_INFO_MIME|
837
BRASERO_IO_INFO_URGENT|
838
BRASERO_IO_INFO_METADATA|
839
BRASERO_IO_INFO_METADATA_MISSING_CODEC|
840
BRASERO_IO_INFO_METADATA_THUMBNAIL,
841
GINT_TO_POINTER (ref));
844
brasero_video_project_signals [ACTIVITY_SIGNAL],
846
(priv->loading > 0));
852
brasero_video_project_resize_file (BraseroVideoProject *self,
853
BraseroVideoFile *file,
857
BraseroVideoProjectPrivate *priv;
858
BraseroVideoProjectClass *klass;
860
priv = BRASERO_VIDEO_PROJECT_PRIVATE (self);
865
klass = BRASERO_VIDEO_PROJECT_GET_CLASS (self);
866
if (klass->node_changed)
867
klass->node_changed (self, file);
871
brasero_video_project_signals [SIZE_CHANGED_SIGNAL],
876
brasero_video_project_get_size (BraseroVideoProject *self)
878
BraseroVideoProjectPrivate *priv;
879
BraseroVideoFile *iter;
882
priv = BRASERO_VIDEO_PROJECT_PRIVATE (self);
884
/* FIXME: duration to sectors is not correct here, that's not audio... */
885
for (iter = priv->first; iter; iter = iter->next)
886
size += BRASERO_DURATION_TO_SECTORS (iter->end - iter->start);
892
brasero_video_project_get_file_num (BraseroVideoProject *self)
894
BraseroVideoProjectPrivate *priv;
895
BraseroVideoFile *item;
898
priv = BRASERO_VIDEO_PROJECT_PRIVATE (self);
899
for (item = priv->first; item; item = item->next)
906
brasero_video_project_get_nth_item (BraseroVideoProject *self,
909
BraseroVideoFile *item;
910
BraseroVideoProjectPrivate *priv;
912
priv = BRASERO_VIDEO_PROJECT_PRIVATE (self);
916
priv = BRASERO_VIDEO_PROJECT_PRIVATE (self);
917
for (item = priv->first; item; item = item->next) {
928
brasero_video_project_get_item_index (BraseroVideoProject *self,
929
BraseroVideoFile *file)
932
BraseroVideoFile *item;
933
BraseroVideoProjectPrivate *priv;
935
priv = BRASERO_VIDEO_PROJECT_PRIVATE (self);
937
for (item = priv->first; item; item = item->next) {
948
brasero_video_project_get_status (BraseroVideoProject *self,
950
gchar **current_task)
952
BraseroVideoProjectPrivate *priv;
954
priv = BRASERO_VIDEO_PROJECT_PRIVATE (self);
958
*remaining = priv->loading;
961
*current_task = g_strdup (_("Analysing video files"));
963
return BRASERO_DISC_NOT_READY;
967
return BRASERO_DISC_ERROR_EMPTY_SELECTION;
969
return BRASERO_DISC_OK;
973
brasero_video_project_get_contents (BraseroVideoProject *self,
976
GSList *tracks = NULL;
977
BraseroVideoFile *file;
978
BraseroVideoProjectPrivate *priv;
980
priv = BRASERO_VIDEO_PROJECT_PRIVATE (self);
984
for (file = priv->first; file; file = file->next) {
985
BraseroSongInfo *info = NULL;
989
info = brasero_song_info_copy (file->info);
992
if (!file->title_set) {
993
g_free (info->title);
996
if (!file->artist_set) {
997
g_free (info->artist);
1000
if (!file->composer_set) {
1001
g_free (info->composer);
1002
info->composer = NULL;
1004
if (!file->isrc_set)
1011
track = brasero_track_new (BRASERO_TRACK_TYPE_AUDIO);
1012
brasero_track_set_audio_source (track,
1014
BRASERO_AUDIO_FORMAT_UNDEFINED|
1015
BRASERO_VIDEO_FORMAT_UNDEFINED);
1017
if (!values_set || file->len_set)
1018
brasero_track_set_audio_boundaries (track,
1023
brasero_track_set_audio_boundaries (track,
1028
brasero_track_set_audio_info (track, info);
1029
tracks = g_slist_prepend (tracks, track);
1032
tracks = g_slist_reverse (tracks);
1037
brasero_video_project_init (BraseroVideoProject *object)
1039
BraseroVideoProjectPrivate *priv;
1041
priv = BRASERO_VIDEO_PROJECT_PRIVATE (object);
1042
priv->ref_count = 1;
1046
brasero_video_project_finalize (GObject *object)
1048
BraseroVideoProjectPrivate *priv;
1049
BraseroVideoFile *iter, *next;
1051
priv = BRASERO_VIDEO_PROJECT_PRIVATE (object);
1053
for (iter = priv->first; iter; iter = next) {
1056
brasero_song_info_free (iter->info);
1060
if (priv->references) {
1061
g_hash_table_destroy (priv->references);
1062
priv->references = NULL;
1065
G_OBJECT_CLASS (brasero_video_project_parent_class)->finalize (object);
1068
* Callbacks for inotify backend
1071
#ifdef BUILD_INOTIFY
1074
brasero_video_project_file_renamed (BraseroFileMonitor *monitor,
1075
BraseroFileMonitorType type,
1076
gpointer callback_data,
1077
const gchar *old_name,
1078
const gchar *new_name)
1080
brasero_video_project_rename (BRASERO_VIDEO_PROJECT (monitor),
1086
brasero_video_project_file_removed (BraseroFileMonitor *monitor,
1087
BraseroFileMonitorType type,
1088
gpointer callback_data,
1091
brasero_video_project_remove_file (BRASERO_VIDEO_PROJECT (monitor),
1096
brasero_video_project_file_modified (BraseroFileMonitor *monitor,
1097
gpointer callback_data,
1100
BraseroVideoProjectPrivate *priv;
1101
BraseroVideoFile *file;
1104
priv = BRASERO_VIDEO_PROJECT_PRIVATE (monitor);
1106
/* priv->load_uri has already been initialized otherwise the tree would
1107
* be empty. But who knows... */
1108
if (!priv->io || !priv->load_uri)
1111
file = callback_data;
1112
file->is_reloading = TRUE;
1114
ref = brasero_video_project_reference_new (BRASERO_VIDEO_PROJECT (monitor), file);
1115
brasero_io_get_file_info (priv->io,
1118
BRASERO_IO_INFO_PERM|
1119
BRASERO_IO_INFO_MIME|
1120
BRASERO_IO_INFO_URGENT|
1121
BRASERO_IO_INFO_METADATA|
1122
BRASERO_IO_INFO_METADATA_MISSING_CODEC|
1123
BRASERO_IO_INFO_METADATA_THUMBNAIL,
1124
GINT_TO_POINTER (ref));
1128
brasero_video_project_file_moved (BraseroFileMonitor *monitor,
1129
BraseroFileMonitorType type,
1130
gpointer callback_src,
1131
const gchar *name_src,
1132
gpointer callback_dest,
1133
const gchar *name_dest)
1135
/* This is a file removed since we won't monitor all folders to get its
1137
/* FIXME: what about files moved to one of the URI in the list ? */
1138
brasero_video_project_remove_file (BRASERO_VIDEO_PROJECT (monitor),
1145
brasero_video_project_class_init (BraseroVideoProjectClass *klass)
1147
GObjectClass* object_class = G_OBJECT_CLASS (klass);
1149
g_type_class_add_private (klass, sizeof (BraseroVideoProjectPrivate));
1151
object_class->finalize = brasero_video_project_finalize;
1153
brasero_video_project_signals [SIZE_CHANGED_SIGNAL] =
1154
g_signal_new ("size_changed",
1155
G_TYPE_FROM_CLASS (klass),
1156
G_SIGNAL_RUN_LAST|G_SIGNAL_NO_RECURSE,
1159
g_cclosure_marshal_VOID__VOID,
1164
brasero_video_project_signals [PROJECT_LOADED_SIGNAL] =
1165
g_signal_new ("project-loaded",
1166
G_TYPE_FROM_CLASS (klass),
1167
G_SIGNAL_RUN_LAST|G_SIGNAL_NO_RECURSE,
1170
g_cclosure_marshal_VOID__INT,
1175
brasero_video_project_signals [UNREADABLE_SIGNAL] =
1176
g_signal_new ("unreadable_uri",
1177
G_TYPE_FROM_CLASS (klass),
1181
brasero_marshal_VOID__POINTER_STRING,
1187
brasero_video_project_signals [NOT_VIDEO_SIGNAL] =
1188
g_signal_new ("not_video_uri",
1189
G_TYPE_FROM_CLASS (klass),
1193
g_cclosure_marshal_VOID__STRING,
1198
brasero_video_project_signals [DIRECTORY_URI_SIGNAL] =
1199
g_signal_new ("directory_uri",
1200
G_TYPE_FROM_CLASS (klass),
1201
G_SIGNAL_RUN_LAST|G_SIGNAL_NO_RECURSE,
1204
brasero_marshal_BOOLEAN__STRING,
1209
brasero_video_project_signals [ACTIVITY_SIGNAL] =
1210
g_signal_new ("vfs_activity",
1211
G_TYPE_FROM_CLASS (klass),
1212
G_SIGNAL_RUN_FIRST|G_SIGNAL_NO_RECURSE,
1215
g_cclosure_marshal_VOID__BOOLEAN,
1220
#ifdef BUILD_INOTIFY
1222
BraseroFileMonitorClass *monitor_class = BRASERO_FILE_MONITOR_CLASS (klass);
1224
/* NOTE: file_added is not needed here since there aren't any directory */
1225
monitor_class->file_moved = brasero_video_project_file_moved;
1226
monitor_class->file_removed = brasero_video_project_file_removed;
1227
monitor_class->file_renamed = brasero_video_project_file_renamed;
1228
monitor_class->file_modified = brasero_video_project_file_modified;