brasero r1654 - in trunk: . src



Author: philippr
Date: Thu Dec 25 16:29:29 2008
New Revision: 1654
URL: http://svn.gnome.org/viewvc/brasero?rev=1654&view=rev

Log:
2008-12-25  Philippe Rouquier  <ykw localhost localdomain>

	Allow brasero to be set transient to another window from the command
	line. This change is necessary to properly work with totem plugin.
	(must be backported)

	* src/brasero-app.c (brasero_app_dialog), (brasero_app_alert),
	(brasero_app_run), (brasero_app_set_parent), (brasero_app_blank),
	(brasero_app_check), (brasero_app_current_toplevel_destroyed),
	(brasero_app_set_toplevel):
	* src/brasero-app.h:
	* src/brasero-burn-dialog.c (brasero_burn_dialog_init):
	* src/brasero-project-manager.c (brasero_project_manager_burn),
	(brasero_project_manager_burn_iso_dialog),
	(brasero_project_manager_copy_disc):
	* src/brasero-project.c (brasero_project_burn):
	* src/main.c (brasero_app_parse_options), (main):


Modified:
   trunk/ChangeLog
   trunk/src/brasero-app.c
   trunk/src/brasero-app.h
   trunk/src/brasero-burn-dialog.c
   trunk/src/brasero-project-manager.c
   trunk/src/brasero-project.c
   trunk/src/main.c

Modified: trunk/src/brasero-app.c
==============================================================================
--- trunk/src/brasero-app.c	(original)
+++ trunk/src/brasero-app.c	Thu Dec 25 16:29:29 2008
@@ -45,6 +45,8 @@
 typedef struct _BraseroAppPrivate BraseroAppPrivate;
 struct _BraseroAppPrivate
 {
+	GdkWindow *parent;
+
 	GtkWidget *toplevel;
 
 	GtkWidget *projects;
@@ -188,6 +190,12 @@
 					 button_type,
 					 primary_message);
 
+	if (!toplevel && priv->parent) {
+		gtk_widget_realize (GTK_WIDGET (dialog));
+		gtk_window_set_modal (GTK_WINDOW (dialog), TRUE);
+		gdk_window_set_transient_for (GTK_WIDGET (dialog)->window, priv->parent);
+	}
+
 	if (is_on_top) {
 		gtk_window_set_skip_pager_hint (GTK_WINDOW (dialog), FALSE);
 		gtk_window_set_skip_taskbar_hint (GTK_WINDOW (dialog), FALSE);
@@ -209,24 +217,37 @@
 		   GtkMessageType type)
 {
 	GtkWidget *parent = NULL;
+	gboolean is_on_top= TRUE;
 	BraseroAppPrivate *priv;
 	GtkWidget *alert;
 
 	priv = BRASERO_APP_PRIVATE (app);
 
 	/* Whatever happens, they need a parent or must be in the taskbar */
-	if (priv->is_running)
+	if (priv->is_running) {
 		parent = GTK_WIDGET (app);
-	else if (priv->toplevel)
+		is_on_top = FALSE;
+	}
+	else if (priv->toplevel) {
 		parent = priv->toplevel;
+		is_on_top = FALSE;
+	}
 
 	alert = brasero_utils_create_message_dialog (parent,
 						     primary_message,
 						     secondary_message,
 						     type);
-	gtk_window_set_title (GTK_WINDOW (alert), _("Disc Burner"));
 
-	if (!parent) {
+	if (!parent && priv->parent) {
+		is_on_top = FALSE;
+
+		gtk_widget_realize (GTK_WIDGET (alert));
+		gtk_window_set_modal (GTK_WINDOW (alert), TRUE);
+		gdk_window_set_transient_for (GTK_WIDGET (alert)->window, priv->parent);
+	}
+
+	if (is_on_top) {
+		gtk_window_set_title (GTK_WINDOW (alert), _("Disc Burner"));
 		gtk_window_set_skip_pager_hint (GTK_WINDOW (alert), FALSE);
 		gtk_window_set_skip_taskbar_hint (GTK_WINDOW (alert), FALSE);
 	}
@@ -339,10 +360,27 @@
 
 	priv->is_running = TRUE;
 	gtk_widget_realize (GTK_WIDGET (app));
+
+	if (priv->parent) {
+		gtk_window_set_modal (GTK_WINDOW (app), TRUE);
+		gdk_window_set_transient_for (GTK_WIDGET (app)->window, priv->parent);
+	}
+
 	brasero_session_load (app);
 }
 
 void
+brasero_app_set_parent (BraseroApp *app,
+			guint parent_xid)
+{
+	BraseroAppPrivate *priv;
+
+	priv = BRASERO_APP_PRIVATE (app);
+
+	priv->parent = gdk_window_foreign_new (parent_xid);
+}
+
+void
 brasero_app_blank (BraseroApp *app,
 		   const gchar *device)
 {
@@ -370,7 +408,13 @@
 	}
 
 	if (!priv->is_running) {
-		gtk_widget_show (dialog);
+		gtk_widget_realize (dialog);
+
+		if (priv->parent) {
+			gtk_window_set_modal (GTK_WINDOW (dialog), TRUE);
+			gdk_window_set_transient_for (GTK_WIDGET (dialog)->window, priv->parent);
+		}
+
 		gtk_dialog_run (GTK_DIALOG (dialog));
 
 		/* brasero-tool-dialog auto destroys itself */
@@ -436,6 +480,13 @@
 	}
 
 	if (!priv->is_running) {
+		gtk_widget_realize (dialog);
+
+		if (priv->parent) {
+			gtk_window_set_modal (GTK_WINDOW (dialog), TRUE);
+			gdk_window_set_transient_for (GTK_WIDGET (dialog)->window, priv->parent);
+		}
+
 		gtk_widget_show (dialog);
 		gtk_dialog_run (GTK_DIALOG (dialog));
 
@@ -458,6 +509,57 @@
 }
 
 static void
+brasero_app_current_toplevel_destroyed (GtkWidget *widget,
+					BraseroApp *app)
+{
+	BraseroAppPrivate *priv;
+
+	priv = BRASERO_APP_PRIVATE (app);
+	if (priv->is_running)
+		gtk_widget_show (GTK_WIDGET (app));
+}
+
+void
+brasero_app_set_toplevel (BraseroApp *app, GtkWindow *window)
+{
+	BraseroAppPrivate *priv;
+
+	priv = BRASERO_APP_PRIVATE (app);
+
+	if (!priv->is_running) {
+		if (priv->parent) {
+			gtk_widget_realize (GTK_WIDGET (window));
+			gtk_window_set_modal (GTK_WINDOW (window), TRUE);
+			gdk_window_set_transient_for (GTK_WIDGET (window)->window, priv->parent);
+		}
+		else {
+			gtk_window_set_skip_taskbar_hint (GTK_WINDOW (window), FALSE);
+			gtk_window_set_skip_pager_hint (GTK_WINDOW (window), FALSE);
+			gtk_window_set_type_hint (GTK_WINDOW (window), GDK_WINDOW_TYPE_HINT_NORMAL);
+			gtk_window_set_position (GTK_WINDOW (window),GTK_WIN_POS_CENTER);
+		}
+	}
+	else {
+		gtk_window_set_transient_for (GTK_WINDOW (window), GTK_WINDOW (app));
+		gtk_window_set_modal (GTK_WINDOW (window), TRUE);
+
+		/* hide main dialog if it is shown */
+		gtk_widget_hide (GTK_WIDGET (app));
+
+		gtk_window_set_skip_taskbar_hint (GTK_WINDOW (window), FALSE);
+		gtk_window_set_skip_pager_hint (GTK_WINDOW (window), FALSE);
+		gtk_window_set_type_hint (GTK_WINDOW (window), GDK_WINDOW_TYPE_HINT_NORMAL);
+		gtk_window_set_position (GTK_WINDOW (window),GTK_WIN_POS_CENTER);
+	}
+
+	gtk_widget_show (GTK_WIDGET (window));
+	g_signal_connect (window,
+			  "destroy",
+			  G_CALLBACK (brasero_app_current_toplevel_destroyed),
+			  app);
+}
+
+static void
 on_prefs_cb (GtkAction *action, BraseroApp *app)
 {
 	GtkWidget *dialog;

Modified: trunk/src/brasero-app.h
==============================================================================
--- trunk/src/brasero-app.h	(original)
+++ trunk/src/brasero-app.h	Thu Dec 25 16:29:29 2008
@@ -55,6 +55,13 @@
 brasero_app_get_default (void);
 
 void
+brasero_app_set_parent (BraseroApp *app,
+			guint xid);
+
+void
+brasero_app_set_toplevel (BraseroApp *app, GtkWindow *window);
+
+void
 brasero_app_run (BraseroApp *app);
 
 gboolean

Modified: trunk/src/brasero-burn-dialog.c
==============================================================================
--- trunk/src/brasero-burn-dialog.c	(original)
+++ trunk/src/brasero-burn-dialog.c	Thu Dec 25 16:29:29 2008
@@ -1233,10 +1233,6 @@
 	gtk_window_set_default_size (GTK_WINDOW (obj), 500, 0);
 
 	gtk_dialog_set_has_separator (GTK_DIALOG (obj), FALSE);
-	gtk_window_set_skip_taskbar_hint (GTK_WINDOW (obj), FALSE);
-	gtk_window_set_skip_pager_hint (GTK_WINDOW (obj), FALSE);
-	gtk_window_set_type_hint (GTK_WINDOW (obj), GDK_WINDOW_TYPE_HINT_NORMAL);
-	gtk_window_set_position (GTK_WINDOW (obj),GTK_WIN_POS_CENTER);
 
 	obj->priv->tray = brasero_tray_icon_new ();
 	g_signal_connect (obj->priv->tray,

Modified: trunk/src/brasero-project-manager.c
==============================================================================
--- trunk/src/brasero-project-manager.c	(original)
+++ trunk/src/brasero-project-manager.c	Thu Dec 25 16:29:29 2008
@@ -517,30 +517,23 @@
 brasero_project_manager_burn (BraseroProjectManager *manager,
 			      BraseroBurnSession *session)
 {
-	GtkWidget *toplevel;
 	GtkWidget *dialog;
 
 	/* now setup the burn dialog */
 	dialog = brasero_burn_dialog_new ();
-
-	toplevel = gtk_widget_get_toplevel (GTK_WIDGET (manager));
-	gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (toplevel));
-	gtk_window_set_modal (GTK_WINDOW (dialog), TRUE);
-
-	gtk_widget_hide (toplevel);
+	brasero_app_set_toplevel (brasero_app_get_default (), GTK_WINDOW (dialog));
 	gtk_widget_show (dialog);
 
-	brasero_burn_dialog_run (BRASERO_BURN_DIALOG (dialog),
-				 session);
-
-	gtk_widget_destroy (dialog);
+	brasero_burn_dialog_run (BRASERO_BURN_DIALOG (dialog), session);
 
 	brasero_project_manager_switch (manager,
 					BRASERO_PROJECT_TYPE_INVALID,
 					NULL,
 					NULL,
 					TRUE);
-	gtk_widget_show (toplevel);
+
+	/* The destruction of the dialog will bring the main window forward */
+	gtk_widget_destroy (dialog);
 }
 
 static void
@@ -549,19 +542,13 @@
 {
 	BraseroBurnSession *session;
 	GtkResponseType result;
-	GtkWidget *toplevel;
 	GtkWidget *dialog;
 
 	/* setup, show, and run options dialog */
-	toplevel = gtk_widget_get_toplevel (GTK_WIDGET (manager));
-
 	dialog = brasero_image_option_dialog_new ();
 	brasero_image_option_dialog_set_image_uri (BRASERO_IMAGE_OPTION_DIALOG (dialog), uri);
 
-	gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (toplevel));
-	gtk_window_set_modal (GTK_WINDOW (dialog), TRUE);
-	gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_CENTER_ON_PARENT);
-	gtk_widget_show (dialog);
+	brasero_app_set_toplevel (brasero_app_get_default (), GTK_WINDOW (dialog));
 
 	result = gtk_dialog_run (GTK_DIALOG (dialog));
 	if (result != GTK_RESPONSE_OK) {
@@ -579,6 +566,7 @@
 	}
 
 	session = brasero_burn_options_get_session (BRASERO_BURN_OPTIONS (dialog));
+	/* The destruction of the dialog will bring the main window forward */
 	gtk_widget_destroy (dialog);
 
 	brasero_project_manager_burn (manager, session);
@@ -600,16 +588,10 @@
 {
 	BraseroBurnSession *session;
 	GtkResponseType result;
-	GtkWidget *toplevel;
 	GtkWidget *dialog;
 
-	toplevel = gtk_widget_get_toplevel (GTK_WIDGET (manager));
-
 	dialog = brasero_disc_copy_dialog_new ();
-	gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (toplevel));
-	gtk_window_set_modal (GTK_WINDOW (dialog), TRUE);
-	gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_CENTER_ON_PARENT);
-	gtk_widget_show (dialog);
+	brasero_app_set_toplevel (brasero_app_get_default (), GTK_WINDOW (dialog));
 
 	/* if a device is specified then get the corresponding medium */
 	if (device) {
@@ -640,6 +622,8 @@
 	}
 
 	session = brasero_burn_options_get_session (BRASERO_BURN_OPTIONS (dialog));
+
+	/* The destruction of the dialog will bring the main window forward */
 	gtk_widget_destroy (dialog);
 
 	/* Set a cover if any. */

Modified: trunk/src/brasero-project.c
==============================================================================
--- trunk/src/brasero-project.c	(original)
+++ trunk/src/brasero-project.c	Thu Dec 25 16:29:29 2008
@@ -896,7 +896,6 @@
 {
 	BraseroBurnSession *session;
 	BraseroDiscResult result;
-	GtkWidget *toplevel;
 	GtkWidget *dialog;
 	gboolean success;
 
@@ -929,11 +928,7 @@
 	brasero_disc_option_dialog_set_disc (BRASERO_DISC_OPTION_DIALOG (dialog),
 					     project->priv->current);
 
-	toplevel = gtk_widget_get_toplevel (GTK_WIDGET (project));
-	gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (toplevel));
-	gtk_window_set_modal (GTK_WINDOW (dialog), TRUE);
-	gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_CENTER_ON_PARENT);
-	gtk_widget_show (dialog);
+	brasero_app_set_toplevel (brasero_app_get_default (), GTK_WINDOW (dialog));
 
 	result = gtk_dialog_run (GTK_DIALOG (dialog));
 	if (result != GTK_RESPONSE_OK)
@@ -958,14 +953,8 @@
 
 	/* now setup the burn dialog */
 	dialog = brasero_burn_dialog_new ();
-	gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (toplevel));
-	gtk_window_set_modal (GTK_WINDOW (dialog), TRUE);
-
-	gtk_widget_hide (toplevel);
-	gtk_widget_show (dialog);
-
-	success = brasero_burn_dialog_run (BRASERO_BURN_DIALOG (dialog),
-					   session);
+	brasero_app_set_toplevel (brasero_app_get_default (), GTK_WINDOW (dialog));
+	success = brasero_burn_dialog_run (BRASERO_BURN_DIALOG (dialog), session);
 	g_object_unref (session);
 
     	project->priv->burnt = success;
@@ -973,8 +962,9 @@
 end:
 
 	project->priv->is_burning = 0;
+
+	/* The destruction of the dialog will bring the main window forward */
 	gtk_widget_destroy (dialog);
-	gtk_widget_show (toplevel);
 }
 
 /********************************     ******************************************/

Modified: trunk/src/main.c
==============================================================================
--- trunk/src/main.c	(original)
+++ trunk/src/main.c	Thu Dec 25 16:29:29 2008
@@ -69,16 +69,17 @@
 gint disc_blank;
 gint disc_check;
 gint open_ncb;
+gint parent_window;
 gint debug;
 
 static const GOptionEntry options [] = {
-	{ "project", 'p', G_OPTION_FLAG_FILENAME, G_OPTION_ARG_STRING, &project_uri,
+	{ "project", 'p', 0, G_OPTION_ARG_STRING, &project_uri,
 	  N_("Open the specified project"),
 	  N_("PROJECT") },
 
 #ifdef BUILD_PLAYLIST
 
-	 { "playlist", 'l', G_OPTION_FLAG_FILENAME, G_OPTION_ARG_STRING, &playlist_uri,
+	 { "playlist", 'l', 0, G_OPTION_ARG_STRING, &playlist_uri,
 	  N_("Open the specified playlist as an audio project"),
 	  N_("PLAYLIST") },
 
@@ -96,7 +97,7 @@
 	  N_("Copy a disc"),
 	  N_("PATH TO DEVICE") },
 
-	{ "cover", 'j', G_OPTION_FLAG_FILENAME, G_OPTION_ARG_STRING, &cover_project,
+	{ "cover", 'j', 0, G_OPTION_ARG_STRING, &cover_project,
 	  N_("Cover to use"),
 	  N_("PATH TO COVER") },
 
@@ -104,7 +105,7 @@
 	  N_("Open a video project adding the URIs given on the command line"),
 	  NULL },
 
-	{ "image", 'i', G_OPTION_FLAG_FILENAME, G_OPTION_ARG_STRING, &iso_uri,
+	{ "image", 'i', 0, G_OPTION_ARG_STRING, &iso_uri,
 	 N_("Uri of an image file to be burnt (autodetected)"),
           N_("PATH TO PLAYLIST") },
 
@@ -124,10 +125,14 @@
 	  N_("Burn the contents of burn:// URI"),
 	  NULL },
 
-	{ "burn-and-remove-project", 'r', G_OPTION_FLAG_FILENAME, G_OPTION_ARG_STRING, &burn_project_uri,
+	{ "burn-and-remove-project", 'r', 0, G_OPTION_ARG_STRING, &burn_project_uri,
 	  N_("Burn the specified project and REMOVE it.\nThis option is mainly useful for integration use with other applications."),
 	  N_("PATH") },
 
+	{ "transient-for", 'x', 0, G_OPTION_ARG_INT, &parent_window,
+	  N_("Set brasero transient for the window with Xlib xid"),
+	  N_("xid") },
+
 	{ "debug", 'g', 0, G_OPTION_ARG_NONE, &debug,
 	  N_("Display debug statements on stdout"),
 	  NULL },
@@ -176,6 +181,9 @@
 
 	manager = brasero_app_get_project_manager (app);
 
+	if (parent_window)
+		brasero_app_set_parent (app, parent_window);
+
     	if (empty_project) {
 		brasero_project_manager_empty (BRASERO_PROJECT_MANAGER (manager));
 	    	brasero_app_run (app);
@@ -481,7 +489,7 @@
 	brasero_enable_multi_DND ();
 	brasero_utils_init ();
 
-	current_app = brasero_app_new ();
+	current_app = brasero_app_new (TRUE);
 	if (current_app == NULL)
 		return 1;
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]