1
/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
4
* Copyright (C) Philippe Rouquier 2005-2009 <bonfire-app@wanadoo.fr>
6
* Libbrasero-burn is free software; you can redistribute it and/or modify
7
* it under the terms of the GNU General Public License as published by
8
* the Free Software Foundation; either version 2 of the License, or
9
* (at your option) any later version.
11
* The Libbrasero-burn authors hereby grant permission for non-GPL compatible
12
* GStreamer plugins to be used and distributed together with GStreamer
13
* and Libbrasero-burn. This permission is above and beyond the permissions granted
14
* by the GPL license by which Libbrasero-burn is covered. If you modify this code
15
* you may extend this exception to your version of the code, but you are not
16
* obligated to do so. If you do not wish to do so, delete this exception
17
* statement from your version.
19
* Libbrasero-burn is distributed in the hope that it will be useful,
20
* but WITHOUT ANY WARRANTY; without even the implied warranty of
21
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22
* GNU Library General Public License for more details.
24
* You should have received a copy of the GNU General Public License
25
* along with this program; if not, write to:
26
* The Free Software Foundation, Inc.,
27
* 51 Franklin Street, Fifth Floor
28
* Boston, MA 02110-1301, USA.
36
#include <glib/gi18n-lib.h>
37
#include <glib-object.h>
41
#include "brasero-misc.h"
42
#include "brasero-track-data.h"
43
#include "brasero-session.h"
44
#include "brasero-data-options.h"
46
typedef struct _BraseroDataOptionsPrivate BraseroDataOptionsPrivate;
47
struct _BraseroDataOptionsPrivate
49
BraseroBurnSession *session;
51
GtkWidget *joliet_toggle;
53
guint joliet_warning:1;
57
/* FIXME: we need to react to a valid signal so that if joliet is on and the
58
* session is invalid we can try to see if deactivating it can make things
61
#define BRASERO_DATA_OPTIONS_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), BRASERO_TYPE_DATA_OPTIONS, BraseroDataOptionsPrivate))
68
G_DEFINE_TYPE (BraseroDataOptions, brasero_data_options, GTK_TYPE_ALIGNMENT);
71
brasero_data_options_set_tracks_image_fs (BraseroBurnSession *session,
72
BraseroImageFS fs_type_add,
73
BraseroImageFS fs_type_rm)
78
tracks = brasero_burn_session_get_tracks (session);
79
for (iter = tracks; iter; iter = iter->next) {
83
if (!BRASERO_IS_TRACK_DATA (track))
86
if (fs_type_add != BRASERO_IMAGE_FS_NONE)
87
brasero_track_data_add_fs (BRASERO_TRACK_DATA (track), fs_type_add);
89
if (fs_type_rm != BRASERO_IMAGE_FS_NONE)
90
brasero_track_data_rm_fs (BRASERO_TRACK_DATA (track), fs_type_rm);
95
brasero_data_options_set_joliet (BraseroDataOptions *dialog)
97
BraseroDataOptionsPrivate *priv;
98
BraseroTrackType *source = NULL;
100
priv = BRASERO_DATA_OPTIONS_PRIVATE (dialog);
102
if (!priv->joliet_toggle)
105
/* NOTE: we don't check for the sensitive property since when
106
* something is compulsory the button is active but insensitive */
107
source = brasero_track_type_new ();
108
if (!gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (priv->joliet_toggle)))
109
brasero_data_options_set_tracks_image_fs (priv->session,
110
BRASERO_IMAGE_FS_NONE,
111
BRASERO_IMAGE_FS_JOLIET);
113
brasero_data_options_set_tracks_image_fs (priv->session,
114
BRASERO_IMAGE_FS_JOLIET,
115
BRASERO_IMAGE_FS_NONE);
117
brasero_track_type_free (source);
121
brasero_data_options_joliet_toggled_cb (GtkToggleButton *toggle,
122
BraseroDataOptions *options)
124
BraseroDataOptionsPrivate *priv;
125
GtkResponseType answer;
129
priv = BRASERO_DATA_OPTIONS_PRIVATE (options);
131
/* If the toggle button was active it means that either the user got the
132
* warning dialog or that it was on because no file required any change
133
* in their names so no need for the warning; especially when we turn it
135
if (!gtk_toggle_button_get_active (toggle))
136
priv->joliet_warning = TRUE;
138
if (priv->joliet_warning) {
139
brasero_data_options_set_joliet (options);
143
message = gtk_message_dialog_new (GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (options))),
144
GTK_DIALOG_DESTROY_WITH_PARENT|
148
_("Should files be renamed to be fully Windows-compatible?"));
150
secondary = g_strdup_printf ("%s\n%s",
151
_("Some files don't have a suitable name for a fully Windows-compatible CD."),
152
_("Those names should be changed and truncated to 64 characters."));
153
gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (message), "%s", secondary);
156
gtk_dialog_add_button (GTK_DIALOG (message),
157
_("_Disable Full Windows Compatibility"),
158
GTK_RESPONSE_CANCEL);
159
gtk_dialog_add_button (GTK_DIALOG (message),
160
_("_Rename for Full Windows Compatibility"),
163
answer = gtk_dialog_run (GTK_DIALOG (message));
164
gtk_widget_destroy (message);
166
if (answer != GTK_RESPONSE_YES)
167
gtk_toggle_button_set_active (toggle, FALSE);
169
brasero_data_options_set_joliet (options);
171
priv->joliet_warning = TRUE;
177
brasero_data_options_update_joliet (BraseroDataOptions *dialog)
179
BraseroImageFS fs_type;
180
BraseroBurnResult result;
181
BraseroTrackType *source = NULL;
182
BraseroDataOptionsPrivate *priv;
184
priv = BRASERO_DATA_OPTIONS_PRIVATE (dialog);
185
if (!priv->joliet_toggle)
188
/* what we want to check Joliet support */
189
source = brasero_track_type_new ();
190
brasero_burn_session_get_input_type (priv->session, source);
191
fs_type = brasero_track_type_get_data_fs (source);
193
/* see if it's supported */
194
brasero_track_type_set_data_fs (source,
196
BRASERO_IMAGE_FS_JOLIET);
198
result = brasero_burn_session_input_supported (priv->session,
202
if (result != BRASERO_BURN_OK) {
204
priv->joliet_saved = (fs_type & BRASERO_IMAGE_FS_JOLIET);
205
brasero_data_options_set_tracks_image_fs (priv->session,
206
BRASERO_IMAGE_FS_NONE,
207
BRASERO_IMAGE_FS_JOLIET);
209
gtk_widget_set_sensitive (priv->joliet_toggle, FALSE);
210
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->joliet_toggle), FALSE);
212
else if (!GTK_WIDGET_IS_SENSITIVE (priv->joliet_toggle)) {
213
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->joliet_toggle), priv->joliet_saved);
215
if (priv->joliet_saved || (fs_type & BRASERO_IMAGE_FS_JOLIET))
216
brasero_data_options_set_tracks_image_fs (priv->session,
217
BRASERO_IMAGE_FS_JOLIET,
218
BRASERO_IMAGE_FS_NONE);
220
gtk_widget_set_sensitive (priv->joliet_toggle, TRUE);
227
brasero_data_options_update_joliet_start (BraseroDataOptions *dialog)
229
BraseroImageFS fs_type;
230
BraseroBurnResult result;
231
BraseroTrackType *source = NULL;
232
BraseroDataOptionsPrivate *priv;
234
priv = BRASERO_DATA_OPTIONS_PRIVATE (dialog);
235
if (!priv->joliet_toggle)
238
/* what we want to check Joliet support */
239
source = brasero_track_type_new ();
240
brasero_burn_session_get_input_type (priv->session, source);
241
fs_type = brasero_track_type_get_data_fs (source);
243
brasero_track_type_set_data_fs (source,
245
BRASERO_IMAGE_FS_JOLIET);
246
result = brasero_burn_session_input_supported (priv->session,
250
g_signal_handlers_block_by_func (priv->joliet_toggle,
251
brasero_data_options_joliet_toggled_cb,
254
if (result != BRASERO_BURN_OK) {
256
brasero_data_options_set_tracks_image_fs (priv->session,
257
BRASERO_IMAGE_FS_NONE,
258
BRASERO_IMAGE_FS_JOLIET);
260
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->joliet_toggle), FALSE);
261
gtk_widget_set_sensitive (priv->joliet_toggle, FALSE);
264
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->joliet_toggle),
265
(fs_type & BRASERO_IMAGE_FS_JOLIET));
266
gtk_widget_set_sensitive (priv->joliet_toggle, TRUE);
269
g_signal_handlers_unblock_by_func (priv->joliet_toggle,
270
brasero_data_options_joliet_toggled_cb,
275
brasero_data_options_set_property (GObject *object,
280
BraseroDataOptionsPrivate *priv;
282
g_return_if_fail (BRASERO_IS_DATA_OPTIONS (object));
284
priv = BRASERO_DATA_OPTIONS_PRIVATE (object);
288
case PROP_SESSION: /* Readable and only writable at creation time */
289
priv->session = BRASERO_BURN_SESSION (g_value_get_object (value));
290
g_object_ref (priv->session);
291
brasero_data_options_update_joliet_start (BRASERO_DATA_OPTIONS (object));
294
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
300
brasero_data_options_get_property (GObject *object,
305
BraseroDataOptionsPrivate *priv;
307
g_return_if_fail (BRASERO_IS_DATA_OPTIONS (object));
309
priv = BRASERO_DATA_OPTIONS_PRIVATE (object);
314
g_value_set_object (value, priv->session);
315
g_object_ref (priv->session);
318
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
324
brasero_data_options_init (BraseroDataOptions *object)
326
BraseroDataOptionsPrivate *priv;
330
priv = BRASERO_DATA_OPTIONS_PRIVATE (object);
332
/* general options */
333
priv->joliet_toggle = gtk_check_button_new_with_mnemonic (_("Increase compatibility with _Windows systems"));
334
gtk_widget_set_tooltip_text (priv->joliet_toggle,
335
_("Improve compatibility with Windows systems by allowing to display long filenames (maximum 64 characters)"));
337
g_signal_connect (priv->joliet_toggle,
339
G_CALLBACK (brasero_data_options_joliet_toggled_cb),
342
string = g_strdup_printf ("<b>%s</b>", _("Disc options"));
343
options = brasero_utils_pack_properties (string,
348
gtk_widget_show_all (options);
349
gtk_container_add (GTK_CONTAINER (object), options);
353
brasero_data_options_finalize (GObject *object)
355
BraseroDataOptionsPrivate *priv;
357
priv = BRASERO_DATA_OPTIONS_PRIVATE (object);
359
g_object_unref (priv->session);
360
priv->session = NULL;
363
G_OBJECT_CLASS (brasero_data_options_parent_class)->finalize (object);
367
brasero_data_options_class_init (BraseroDataOptionsClass *klass)
369
GObjectClass* object_class = G_OBJECT_CLASS (klass);
371
g_type_class_add_private (klass, sizeof (BraseroDataOptionsPrivate));
373
object_class->finalize = brasero_data_options_finalize;
374
object_class->set_property = brasero_data_options_set_property;
375
object_class->get_property = brasero_data_options_get_property;
377
g_object_class_install_property (object_class,
379
g_param_spec_object ("session",
381
"The session to work with",
382
BRASERO_TYPE_BURN_SESSION,
383
G_PARAM_READWRITE|G_PARAM_CONSTRUCT_ONLY));
387
brasero_data_options_new (BraseroBurnSession *session)
389
return g_object_new (BRASERO_TYPE_DATA_OPTIONS, "session", session, NULL);