22
22
#include <config.h>
26
#include <glib/gi18n.h>
27
#include <glib/gstdio.h>
23
#include "ephy-embed-shell.h"
30
25
#include "ephy-adblock-manager.h"
31
26
#include "ephy-debug.h"
32
27
#include "ephy-download.h"
33
#include "ephy-embed-shell.h"
28
#include "ephy-embed-private.h"
34
29
#include "ephy-embed-single.h"
35
30
#include "ephy-embed-type-builtins.h"
36
31
#include "ephy-encodings.h"
37
32
#include "ephy-file-helpers.h"
38
33
#include "ephy-history-service.h"
39
#include "ephy-print-utils.h"
41
#define PAGE_SETUP_FILENAME "page-setup-gtk.ini"
42
#define PRINT_SETTINGS_FILENAME "print-settings.ini"
44
#define LEGACY_PAGE_SETUP_FILENAME "page-setup.ini"
34
#include "ephy-snapshot-service.h"
36
#include <glib/gi18n.h>
40
#define PAGE_SETUP_FILENAME "page-setup-gtk.ini"
41
#define PRINT_SETTINGS_FILENAME "print-settings.ini"
46
43
#define EPHY_EMBED_SHELL_GET_PRIVATE(object)(G_TYPE_INSTANCE_GET_PRIVATE ((object), EPHY_TYPE_EMBED_SHELL, EphyEmbedShellPrivate))
48
#define ENABLE_MIGRATION
50
45
struct _EphyEmbedShellPrivate
52
EphyHistoryService *global_history_service;
54
EphyEmbedSingle *embed_single;
55
EphyEncodings *encodings;
56
EphyAdBlockManager *adblock_manager;
57
GtkPageSetup *page_setup;
58
GtkPrintSettings *print_settings;
59
EphyEmbedShellMode mode;
60
guint single_initialised : 1;
47
EphyHistoryService *global_history_service;
49
EphyEmbedSingle *embed_single;
50
EphyEncodings *encodings;
51
EphyAdBlockManager *adblock_manager;
52
GtkPageSetup *page_setup;
53
GtkPrintSettings *print_settings;
54
EphyEmbedShellMode mode;
55
EphyFrecentStore *frecent_store;
56
guint single_initialised : 1;
71
67
static guint signals[LAST_SIGNAL];
80
76
static GParamSpec *object_properties[N_PROPERTIES] = { NULL, };
82
static void ephy_embed_shell_class_init (EphyEmbedShellClass *klass);
83
static void ephy_embed_shell_init (EphyEmbedShell *shell);
85
78
EphyEmbedShell *embed_shell = NULL;
87
80
G_DEFINE_TYPE (EphyEmbedShell, ephy_embed_shell, GTK_TYPE_APPLICATION)
90
83
ephy_embed_shell_dispose (GObject *object)
92
EphyEmbedShell *shell = EPHY_EMBED_SHELL (object);
93
EphyEmbedShellPrivate *priv = shell->priv;
95
if (priv->encodings != NULL)
97
LOG ("Unref encodings");
98
g_object_unref (priv->encodings);
99
priv->encodings = NULL;
102
if (priv->page_setup != NULL)
104
g_object_unref (priv->page_setup);
105
priv->page_setup = NULL;
108
if (priv->print_settings != NULL)
110
g_object_unref (priv->print_settings);
111
priv->print_settings = NULL;
114
G_OBJECT_CLASS (ephy_embed_shell_parent_class)->dispose (object);
85
EphyEmbedShellPrivate *priv = EPHY_EMBED_SHELL (object)->priv;
87
g_clear_object (&priv->encodings);
88
g_clear_object (&priv->page_setup);
89
g_clear_object (&priv->print_settings);
90
g_clear_object (&priv->frecent_store);
91
g_clear_object (&priv->global_history_service);
92
g_clear_object (&priv->embed_single);
93
g_clear_object (&priv->adblock_manager);
95
G_OBJECT_CLASS (ephy_embed_shell_parent_class)->dispose (object);
118
99
ephy_embed_shell_finalize (GObject *object)
120
EphyEmbedShell *shell = EPHY_EMBED_SHELL (object);
122
if (shell->priv->downloads != NULL)
124
LOG ("Destroying downloads list");
125
g_list_foreach (shell->priv->downloads, (GFunc) g_object_unref, NULL);
126
g_list_free (shell->priv->downloads);
127
shell->priv->downloads = NULL;
130
if (shell->priv->global_history_service)
132
LOG ("Unref history service");
133
g_object_unref (shell->priv->global_history_service);
136
if (shell->priv->embed_single)
138
LOG ("Unref embed single");
139
g_object_unref (G_OBJECT (shell->priv->embed_single));
142
if (shell->priv->adblock_manager != NULL)
144
LOG ("Unref adblock manager");
145
g_object_unref (shell->priv->adblock_manager);
146
shell->priv->adblock_manager = NULL;
149
G_OBJECT_CLASS (ephy_embed_shell_parent_class)->finalize (object);
101
EphyEmbedShellPrivate *priv = EPHY_EMBED_SHELL (object)->priv;
103
if (priv->downloads != NULL) {
104
LOG ("Destroying downloads list");
105
g_list_foreach (priv->downloads, (GFunc)g_object_unref, NULL);
106
g_list_free (priv->downloads);
107
priv->downloads = NULL;
110
G_OBJECT_CLASS (ephy_embed_shell_parent_class)->finalize (object);
159
120
ephy_embed_shell_get_global_history_service (EphyEmbedShell *shell)
161
g_return_val_if_fail (EPHY_IS_EMBED_SHELL (shell), NULL);
163
if (shell->priv->global_history_service == NULL)
167
filename = g_build_filename (ephy_dot_dir (), "ephy-history.db", NULL);
168
shell->priv->global_history_service = ephy_history_service_new (filename);
170
g_return_val_if_fail (shell->priv->global_history_service, NULL);
173
return G_OBJECT (shell->priv->global_history_service);
122
g_return_val_if_fail (EPHY_IS_EMBED_SHELL (shell), NULL);
124
if (shell->priv->global_history_service == NULL) {
127
filename = g_build_filename (ephy_dot_dir (), "ephy-history.db", NULL);
128
shell->priv->global_history_service = ephy_history_service_new (filename);
130
g_return_val_if_fail (shell->priv->global_history_service, NULL);
133
return G_OBJECT (shell->priv->global_history_service);
137
ephy_embed_shell_get_overview_icon (const char *icon_name)
139
GError *error = NULL;
141
const char *filename;
143
filename = ephy_file (icon_name);
144
pixbuf = gdk_pixbuf_new_from_file (filename, &error);
147
g_warning ("Couldn't load icon: %s", error->message);
148
g_error_free (error);
155
* ephy_embed_shell_get_frecent_store:
156
* @shell: a #EphyEmbedShell
158
* Gets the #EphyFrecentStore in the shell. This can be used
159
* by EphyOverview implementors.
161
* Returns: (transfer none): a #EphyFrecentStore
164
ephy_embed_shell_get_frecent_store (EphyEmbedShell *shell)
166
GdkPixbuf *default_icon;
169
g_return_val_if_fail (EPHY_IS_EMBED_SHELL (shell), NULL);
171
if (shell->priv->frecent_store == NULL) {
172
shell->priv->frecent_store = ephy_frecent_store_new ();
173
default_icon = ephy_embed_shell_get_overview_icon ("missing-thumbnail.png");
174
frame = ephy_embed_shell_get_overview_icon ("thumbnail-frame.png");
175
g_object_set (shell->priv->frecent_store,
177
ephy_embed_shell_get_global_history_service (shell),
178
"history-length", 10,
179
"default-icon", default_icon,
182
g_object_unref (default_icon);
183
g_object_unref (frame);
186
return shell->priv->frecent_store;
177
190
impl_get_embed_single (EphyEmbedShell *shell)
179
EphyEmbedShellPrivate *priv;
181
g_return_val_if_fail (EPHY_IS_EMBED_SHELL (shell), NULL);
185
if (priv->embed_single != NULL &&
186
!priv->single_initialised)
188
g_warning ("ephy_embed_shell_get_embed_single called while the single is being initialised!\n");
189
return G_OBJECT (priv->embed_single);
192
if (priv->embed_single == NULL)
194
priv->embed_single = EPHY_EMBED_SINGLE
195
(g_object_new (EPHY_TYPE_EMBED_SINGLE, NULL));
196
g_assert (priv->embed_single != NULL);
198
if (!ephy_embed_single_initialize (priv->embed_single))
202
dialog = gtk_message_dialog_new
207
_("Epiphany can't be used now. "
208
"Initialization failed."));
209
gtk_dialog_run (GTK_DIALOG (dialog));
214
priv->single_initialised = TRUE;
217
return G_OBJECT (shell->priv->embed_single);
192
EphyEmbedShellPrivate *priv;
194
g_return_val_if_fail (EPHY_IS_EMBED_SHELL (shell), NULL);
198
if (priv->embed_single != NULL &&
199
!priv->single_initialised) {
200
g_warning ("ephy_embed_shell_get_embed_single called while the single is being initialised!\n");
201
return G_OBJECT (priv->embed_single);
204
if (priv->embed_single == NULL) {
205
priv->embed_single = EPHY_EMBED_SINGLE (g_object_new (EPHY_TYPE_EMBED_SINGLE, NULL));
206
g_assert (priv->embed_single != NULL);
208
if (!ephy_embed_single_initialize (priv->embed_single)) {
211
dialog = gtk_message_dialog_new (NULL,
215
_("Epiphany can't be used now. "
216
"Initialization failed."));
217
gtk_dialog_run (GTK_DIALOG (dialog));
222
priv->single_initialised = TRUE;
225
return G_OBJECT (shell->priv->embed_single);
241
249
ephy_embed_shell_get_encodings (EphyEmbedShell *shell)
243
g_return_val_if_fail (EPHY_IS_EMBED_SHELL (shell), NULL);
245
if (shell->priv->encodings == NULL)
247
shell->priv->encodings = ephy_encodings_new ();
250
return G_OBJECT (shell->priv->encodings);
251
g_return_val_if_fail (EPHY_IS_EMBED_SHELL (shell), NULL);
253
if (shell->priv->encodings == NULL)
254
shell->priv->encodings = ephy_encodings_new ();
256
return G_OBJECT (shell->priv->encodings);
254
260
ephy_embed_shell_prepare_close (EphyEmbedShell *shell)
256
g_signal_emit (shell, signals[PREPARE_CLOSE], 0);
262
g_signal_emit (shell, signals[PREPARE_CLOSE], 0);
260
266
ephy_embed_shell_set_property (GObject *object,
265
271
EphyEmbedShell *embed_shell = EPHY_EMBED_SHELL (object);
270
embed_shell->priv->mode = g_value_get_enum (value);
275
embed_shell->priv->mode = g_value_get_enum (value);
273
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
278
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
278
283
ephy_embed_shell_get_property (GObject *object,
283
288
EphyEmbedShell *embed_shell = EPHY_EMBED_SHELL (object);
288
g_value_set_enum (value, embed_shell->priv->mode);
292
g_value_set_enum (value, embed_shell->priv->mode);
291
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
295
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
296
300
ephy_embed_shell_init (EphyEmbedShell *shell)
298
shell->priv = EPHY_EMBED_SHELL_GET_PRIVATE (shell);
300
/* globally accessible singleton */
301
g_assert (embed_shell == NULL);
304
shell->priv->downloads = NULL;
302
shell->priv = EPHY_EMBED_SHELL_GET_PRIVATE (shell);
304
/* globally accessible singleton */
305
g_assert (embed_shell == NULL);
308
shell->priv->downloads = NULL;
308
312
ephy_embed_shell_class_init (EphyEmbedShellClass *klass)
310
GObjectClass *object_class = G_OBJECT_CLASS (klass);
312
object_class->dispose = ephy_embed_shell_dispose;
313
object_class->finalize = ephy_embed_shell_finalize;
314
object_class->set_property = ephy_embed_shell_set_property;
315
object_class->get_property = ephy_embed_shell_get_property;
317
klass->get_embed_single = impl_get_embed_single;
319
object_properties[PROP_MODE] =
320
g_param_spec_enum ("mode",
322
"The global mode for this instance of Epiphany .",
323
EPHY_TYPE_EMBED_SHELL_MODE,
324
EPHY_EMBED_SHELL_MODE_BROWSER,
325
G_PARAM_READWRITE | G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK |
326
G_PARAM_STATIC_BLURB | G_PARAM_CONSTRUCT_ONLY);
328
g_object_class_install_properties (object_class,
314
GObjectClass *object_class = G_OBJECT_CLASS (klass);
316
object_class->dispose = ephy_embed_shell_dispose;
317
object_class->finalize = ephy_embed_shell_finalize;
318
object_class->set_property = ephy_embed_shell_set_property;
319
object_class->get_property = ephy_embed_shell_get_property;
321
klass->get_embed_single = impl_get_embed_single;
323
object_properties[PROP_MODE] =
324
g_param_spec_enum ("mode",
326
"The global mode f or this instance of Epiphany .",
327
EPHY_TYPE_EMBED_SHELL_MODE,
328
EPHY_EMBED_SHELL_MODE_BROWSER,
329
G_PARAM_READWRITE | G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK |
330
G_PARAM_STATIC_BLURB | G_PARAM_CONSTRUCT_ONLY);
332
g_object_class_install_properties (object_class,
333
337
* EphyEmbed::download-added:
334
338
* @shell: the #EphyEmbedShell
337
341
* Emitted when a #EphyDownload has been added to the global watch list of
338
342
* @shell, via ephy_embed_shell_add_download.
340
signals[DOWNLOAD_ADDED] =
341
g_signal_new ("download-added",
342
EPHY_TYPE_EMBED_SHELL,
344
G_STRUCT_OFFSET (EphyEmbedShellClass, download_added),
346
g_cclosure_marshal_VOID__OBJECT,
347
G_TYPE_NONE, 1, EPHY_TYPE_DOWNLOAD);
344
signals[DOWNLOAD_ADDED] =
345
g_signal_new ("download-added",
346
EPHY_TYPE_EMBED_SHELL,
348
G_STRUCT_OFFSET (EphyEmbedShellClass, download_added),
350
g_cclosure_marshal_VOID__OBJECT,
351
G_TYPE_NONE, 1, EPHY_TYPE_DOWNLOAD);
350
354
* EphyEmbed::download-removed:
351
355
* @shell: the #EphyEmbedShell
354
358
* Emitted when a #EphyDownload has been removed from the global watch list of
355
359
* @shell, via ephy_embed_shell_remove_download.
357
signals[DOWNLOAD_REMOVED] =
358
g_signal_new ("download-removed",
359
EPHY_TYPE_EMBED_SHELL,
361
G_STRUCT_OFFSET (EphyEmbedShellClass, download_removed),
363
g_cclosure_marshal_VOID__OBJECT,
364
G_TYPE_NONE, 1, EPHY_TYPE_DOWNLOAD);
361
signals[DOWNLOAD_REMOVED] =
362
g_signal_new ("download-removed",
363
EPHY_TYPE_EMBED_SHELL,
365
G_STRUCT_OFFSET (EphyEmbedShellClass, download_removed),
367
g_cclosure_marshal_VOID__OBJECT,
368
G_TYPE_NONE, 1, EPHY_TYPE_DOWNLOAD);
367
371
* EphyEmbed::prepare-close:
371
375
* quit on command from the session manager. You can use it when you need
372
376
* to do something special (shut down a service, for example).
374
signals[PREPARE_CLOSE] =
375
g_signal_new ("prepare-close",
376
EPHY_TYPE_EMBED_SHELL,
377
G_SIGNAL_RUN_FIRST | G_SIGNAL_RUN_LAST,
378
G_STRUCT_OFFSET (EphyEmbedShellClass, prepare_close),
380
g_cclosure_marshal_VOID__VOID,
378
signals[PREPARE_CLOSE] =
379
g_signal_new ("prepare-close",
380
EPHY_TYPE_EMBED_SHELL,
381
G_SIGNAL_RUN_FIRST | G_SIGNAL_RUN_LAST,
382
G_STRUCT_OFFSET (EphyEmbedShellClass, prepare_close),
384
g_cclosure_marshal_VOID__VOID,
383
g_type_class_add_private (object_class, sizeof (EphyEmbedShellPrivate));
387
g_type_class_add_private (object_class, sizeof (EphyEmbedShellPrivate));
408
412
ephy_embed_shell_get_adblock_manager (EphyEmbedShell *shell)
410
g_return_val_if_fail (EPHY_IS_EMBED_SHELL (shell), NULL);
412
if (shell->priv->adblock_manager == NULL)
414
shell->priv->adblock_manager = g_object_new (EPHY_TYPE_ADBLOCK_MANAGER, NULL);
417
return G_OBJECT (shell->priv->adblock_manager);
414
g_return_val_if_fail (EPHY_IS_EMBED_SHELL (shell), NULL);
416
if (shell->priv->adblock_manager == NULL)
417
shell->priv->adblock_manager = g_object_new (EPHY_TYPE_ADBLOCK_MANAGER, NULL);
419
return G_OBJECT (shell->priv->adblock_manager);
421
ephy_embed_shell_set_page_setup (EphyEmbedShell *shell,
422
GtkPageSetup *page_setup)
423
ephy_embed_shell_set_page_setup (EphyEmbedShell *shell,
424
GtkPageSetup *page_setup)
424
EphyEmbedShellPrivate *priv;
427
g_return_if_fail (EPHY_IS_EMBED_SHELL (shell));
430
if (page_setup != NULL)
432
g_object_ref (page_setup);
436
page_setup = gtk_page_setup_new ();
439
if (priv->page_setup != NULL)
441
g_object_unref (priv->page_setup);
444
priv->page_setup = page_setup;
446
path = g_build_filename (ephy_dot_dir (), PAGE_SETUP_FILENAME, NULL);
447
gtk_page_setup_to_file (page_setup, path, NULL);
426
EphyEmbedShellPrivate *priv;
429
g_return_if_fail (EPHY_IS_EMBED_SHELL (shell));
432
if (page_setup != NULL)
433
g_object_ref (page_setup);
435
page_setup = gtk_page_setup_new ();
437
if (priv->page_setup != NULL)
438
g_object_unref (priv->page_setup);
440
priv->page_setup = page_setup;
442
path = g_build_filename (ephy_dot_dir (), PAGE_SETUP_FILENAME, NULL);
443
gtk_page_setup_to_file (page_setup, path, NULL);
454
450
* Return value: (transfer none):
457
ephy_embed_shell_get_page_setup (EphyEmbedShell *shell)
453
ephy_embed_shell_get_page_setup (EphyEmbedShell *shell)
459
EphyEmbedShellPrivate *priv;
461
g_return_val_if_fail (EPHY_IS_EMBED_SHELL (shell), NULL);
464
if (priv->page_setup == NULL)
466
GError *error = NULL;
469
path = g_build_filename (ephy_dot_dir (), PAGE_SETUP_FILENAME, NULL);
470
priv->page_setup = gtk_page_setup_new_from_file (path, &error);
473
#ifdef ENABLE_MIGRATION
474
/* If the file doesn't exist, try to fall back to the old format */
476
error->domain == G_FILE_ERROR &&
477
error->code == G_FILE_ERROR_NOENT)
479
path = g_build_filename (ephy_dot_dir (), LEGACY_PAGE_SETUP_FILENAME, NULL);
480
priv->page_setup = ephy_print_utils_page_setup_new_from_file (path, NULL);
481
if (priv->page_setup != NULL)
483
/* Delete the old file, so we don't migrate again */
487
} else if (error != NULL)
488
g_warning ("error: %s\n", error->message);
489
#endif /* ENABLE_MIGRATION */
493
g_error_free (error);
496
/* If that still didn't work, create a new, empty one */
497
if (priv->page_setup == NULL)
499
priv->page_setup = gtk_page_setup_new ();
503
return priv->page_setup;
455
EphyEmbedShellPrivate *priv;
457
g_return_val_if_fail (EPHY_IS_EMBED_SHELL (shell), NULL);
460
if (priv->page_setup == NULL) {
461
GError *error = NULL;
464
path = g_build_filename (ephy_dot_dir (), PAGE_SETUP_FILENAME, NULL);
465
priv->page_setup = gtk_page_setup_new_from_file (path, &error);
469
g_error_free (error);
471
/* If that still didn't work, create a new, empty one */
472
if (priv->page_setup == NULL)
473
priv->page_setup = gtk_page_setup_new ();
476
return priv->page_setup;
515
488
ephy_embed_shell_set_print_settings (EphyEmbedShell *shell,
516
GtkPrintSettings *settings)
489
GtkPrintSettings *settings)
518
EphyEmbedShellPrivate *priv;
521
g_return_if_fail (EPHY_IS_EMBED_SHELL (shell));
524
if (settings != NULL)
526
g_object_ref (settings);
529
if (priv->print_settings != NULL)
531
g_object_unref (priv->print_settings);
534
priv->print_settings = settings ? settings : gtk_print_settings_new ();
536
path = g_build_filename (ephy_dot_dir (), PRINT_SETTINGS_FILENAME, NULL);
537
gtk_print_settings_to_file (settings, path, NULL);
491
EphyEmbedShellPrivate *priv;
494
g_return_if_fail (EPHY_IS_EMBED_SHELL (shell));
497
if (settings != NULL)
498
g_object_ref (settings);
500
if (priv->print_settings != NULL)
501
g_object_unref (priv->print_settings);
503
priv->print_settings = settings ? settings : gtk_print_settings_new ();
505
path = g_build_filename (ephy_dot_dir (), PRINT_SETTINGS_FILENAME, NULL);
506
gtk_print_settings_to_file (settings, path, NULL);
549
518
GtkPrintSettings *
550
519
ephy_embed_shell_get_print_settings (EphyEmbedShell *shell)
552
EphyEmbedShellPrivate *priv;
554
g_return_val_if_fail (EPHY_IS_EMBED_SHELL (shell), NULL);
557
if (priv->print_settings == NULL)
559
GError *error = NULL;
562
path = g_build_filename (ephy_dot_dir (), PRINT_SETTINGS_FILENAME, NULL);
563
priv->print_settings = gtk_print_settings_new_from_file (path, &error);
566
/* Note: the gtk print settings file format is the same as our
567
* legacy one, so no need to migrate here.
570
if (priv->print_settings == NULL)
572
priv->print_settings = gtk_print_settings_new ();
576
return priv->print_settings;
521
EphyEmbedShellPrivate *priv;
523
g_return_val_if_fail (EPHY_IS_EMBED_SHELL (shell), NULL);
526
if (priv->print_settings == NULL) {
527
GError *error = NULL;
530
path = g_build_filename (ephy_dot_dir (), PRINT_SETTINGS_FILENAME, NULL);
531
priv->print_settings = gtk_print_settings_new_from_file (path, &error);
534
/* Note: the gtk print settings file format is the same as our
535
* legacy one, so no need to migrate here.
538
if (priv->print_settings == NULL)
539
priv->print_settings = gtk_print_settings_new ();
542
return priv->print_settings;
588
554
ephy_embed_shell_get_downloads (EphyEmbedShell *shell)
590
EphyEmbedShellPrivate *priv;
592
g_return_val_if_fail (EPHY_IS_EMBED_SHELL (shell), NULL);
595
return priv->downloads;
556
EphyEmbedShellPrivate *priv;
558
g_return_val_if_fail (EPHY_IS_EMBED_SHELL (shell), NULL);
561
return priv->downloads;
599
565
ephy_embed_shell_add_download (EphyEmbedShell *shell, EphyDownload *download)
601
EphyEmbedShellPrivate *priv;
603
g_return_if_fail (EPHY_IS_EMBED_SHELL (shell));
606
priv->downloads = g_list_prepend (priv->downloads, download);
608
g_signal_emit_by_name (shell, "download-added", download, NULL);
567
EphyEmbedShellPrivate *priv;
569
g_return_if_fail (EPHY_IS_EMBED_SHELL (shell));
572
priv->downloads = g_list_prepend (priv->downloads, download);
574
g_signal_emit_by_name (shell, "download-added", download, NULL);
612
578
ephy_embed_shell_remove_download (EphyEmbedShell *shell, EphyDownload *download)
614
EphyEmbedShellPrivate *priv;
616
g_return_if_fail (EPHY_IS_EMBED_SHELL (shell));
619
priv->downloads = g_list_remove (priv->downloads, download);
621
g_signal_emit_by_name (shell, "download-removed", download, NULL);
580
EphyEmbedShellPrivate *priv;
582
g_return_if_fail (EPHY_IS_EMBED_SHELL (shell));
585
priv->downloads = g_list_remove (priv->downloads, download);
587
g_signal_emit_by_name (shell, "download-removed", download, NULL);