Make message dialogs transient for the progress window. Addresses bug

2006-07-19  Sven Neumann  <sven@gimp.org>

	Make message dialogs transient for the progress window.
Addresses
	bug #347214.

	* app/core/gimp-gui.[ch]: added a progress parameter to
	gimp_message().  Let gimp_message() deal with optionally
	delegating the message to gimp_progress_message().

	* app/errors.c: changed accordingly.

	* app/core/gimpprogress.[ch] (gimp_progress_message): return a
	boolean indicating whether the message was handled.

	* app/gui/Makefile.am
	* app/gui/gui-message.[ch]
	* app/gui/gui-vtable.c: moved message handling to a new file.
Only
	use the global error dialog for messages without a progress.
	Otherwise attach an error dialog to the progress and try to make
	it transient to the progress window.

	* tools/pdbgen/pdb/message.pdb:
	* app/plug-in/gimpplugin-progress.[ch]: don't delegate messages
to
	the progress interface, this is handled by gimp_message() now.

	* app/pdb/message_cmds.c: regenerated.

	* app/plug-in/gimpplugin.c
	* app/actions/documents-commands.c: formatting.
This commit is contained in:
Sven Neumann 2006-07-19 06:50:34 +00:00 committed by Sven Neumann
parent fb88fd7326
commit 6d922b21dc
18 changed files with 331 additions and 129 deletions

View File

@ -1,3 +1,33 @@
2006-07-19 Sven Neumann <sven@gimp.org>
Make message dialogs transient for the progress window. Addresses
bug #347214.
* app/core/gimp-gui.[ch]: added a progress parameter to
gimp_message(). Let gimp_message() deal with optionally
delegating the message to gimp_progress_message().
* app/errors.c: changed accordingly.
* app/core/gimpprogress.[ch] (gimp_progress_message): return a
boolean indicating whether the message was handled.
* app/gui/Makefile.am
* app/gui/gui-message.[ch]
* app/gui/gui-vtable.c: moved message handling to a new file. Only
use the global error dialog for messages without a progress.
Otherwise attach an error dialog to the progress and try to make
it transient to the progress window.
* tools/pdbgen/pdb/message.pdb:
* app/plug-in/gimpplugin-progress.[ch]: don't delegate messages to
the progress interface, this is handled by gimp_message() now.
* app/pdb/message_cmds.c: regenerated.
* app/plug-in/gimpplugin.c
* app/actions/documents-commands.c: formatting.
2006-07-18 Kevin Cozens <kcozens@cvs.gnome.org>
* INSTALL: Document --enable-profile, --disable-python, and

View File

@ -310,15 +310,14 @@ documents_open_image (GimpContext *context,
uri = gimp_object_get_name (GIMP_OBJECT (imagefile));
image = file_open_with_display (context->gimp, context, NULL,
uri, &status, &error);
uri, &status, &error);
if (! image && status != GIMP_PDB_CANCEL)
{
gchar *filename;
filename = file_utils_uri_display_name (uri);
g_message (_("Opening '%s' failed:\n\n%s"),
filename, error->message);
g_message (_("Opening '%s' failed:\n\n%s"), filename, error->message);
g_clear_error (&error);
g_free (filename);

View File

@ -139,24 +139,30 @@ gimp_unset_busy (Gimp *gimp)
}
void
gimp_message (Gimp *gimp,
const gchar *domain,
const gchar *message)
gimp_message (Gimp *gimp,
GimpProgress *progress,
const gchar *domain,
const gchar *message)
{
gchar *message2 = gimp_any_to_utf8 (message, -1,
"Cannot convert message to utf8.");
g_return_if_fail (GIMP_IS_GIMP (gimp));
g_return_if_fail (progress == NULL || GIMP_IS_PROGRESS (progress));
g_return_if_fail (message != NULL);
if (! domain)
domain = GIMP_ACRONYM;
if (! gimp->console_messages && gimp->gui.message)
gimp->gui.message (gimp, domain, message2);
if (progress && gimp_progress_message (progress, gimp, domain, message))
{
/* message has already been handled by GimpProgress */
}
else if (gimp->gui.message && ! gimp->console_messages)
{
gimp->gui.message (gimp, progress, domain, message);
}
else
g_printerr ("%s: %s\n\n", domain, message2);
g_free (message2);
{
g_printerr ("%s: %s\n\n", domain, message);
}
}
void

View File

@ -31,6 +31,7 @@ struct _GimpGui
void (* unset_busy) (Gimp *gimp);
void (* message) (Gimp *gimp,
GimpProgress *progress,
const gchar *domain,
const gchar *message);
void (* help) (Gimp *gimp,
@ -104,6 +105,7 @@ void gimp_set_busy_until_idle (Gimp *gimp);
void gimp_unset_busy (Gimp *gimp);
void gimp_message (Gimp *gimp,
GimpProgress *progress,
const gchar *domain,
const gchar *message);
void gimp_help (Gimp *gimp,

View File

@ -218,7 +218,7 @@ gimp_progress_get_window (GimpProgress *progress)
return 0;
}
void
gboolean
gimp_progress_message (GimpProgress *progress,
Gimp *gimp,
const gchar *domain,
@ -231,9 +231,13 @@ gimp_progress_message (GimpProgress *progress,
progress_iface = GIMP_PROGRESS_GET_INTERFACE (progress);
if (progress_iface->message)
progress_iface->message (progress, gimp, domain, message);
else
gimp_message (gimp, domain, message);
{
progress_iface->message (progress, gimp, domain, message);
return TRUE;
}
return FALSE;
}
void

View File

@ -78,7 +78,7 @@ void gimp_progress_pulse (GimpProgress *progress);
guint32 gimp_progress_get_window (GimpProgress *progress);
void gimp_progress_message (GimpProgress *progress,
gboolean gimp_progress_message (GimpProgress *progress,
Gimp *gimp,
const gchar *domain,
const gchar *message);

View File

@ -91,7 +91,7 @@ gimp_message_log_func (const gchar *log_domain,
if (gimp && GIMP_IS_GIMP (*gimp))
{
gimp_message (*gimp, NULL, message);
gimp_message (*gimp, NULL, NULL, message);
return;
}

View File

@ -250,8 +250,10 @@ file_open_thumbnail (Gimp *gimp,
*mime_type = file_proc->mime_type;
#ifdef GIMP_UNSTABLE
g_printerr ("opened thumbnail at %d x %d\n",
image->width, image->height);
#endif
}
}

View File

@ -19,6 +19,8 @@ libappgui_a_SOURCES = \
color-history.h \
gui.c \
gui.h \
gui-message.c \
gui-message.h \
gui-vtable.c \
gui-vtable.h \
gui-types.h \

221
app/gui/gui-message.c Normal file
View File

@ -0,0 +1,221 @@
/* The GIMP -- an image manipulation program
* Copyright (C) 1995 Spencer Kimball and Peter Mattis
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "config.h"
#include <string.h>
#include <gtk/gtk.h>
#include "libgimpwidgets/gimpwidgets.h"
#include "gui-types.h"
#include "config/gimpguiconfig.h"
#include "core/gimp.h"
#include "core/gimpprogress.h"
#include "plug-in/gimpplugin.h"
#include "widgets/gimpdialogfactory.h"
#include "widgets/gimpdockable.h"
#include "widgets/gimperrorconsole.h"
#include "widgets/gimperrordialog.h"
#include "dialogs/dialogs.h"
#include "gimp-intl.h"
static gboolean gui_message_error_console (const gchar *domain,
const gchar *message);
static gboolean gui_message_error_dialog (GimpProgress *progress,
const gchar *domain,
const gchar *message);
static void gui_message_console (const gchar *domain,
const gchar *message);
static void gimp_window_set_transient_for (GtkWindow *window,
guint32 parent_ID);
void
gui_message (Gimp *gimp,
GimpProgress *progress,
const gchar *domain,
const gchar *message)
{
switch (gimp->message_handler)
{
case GIMP_ERROR_CONSOLE:
if (gui_message_error_console (domain, message))
return;
gimp->message_handler = GIMP_MESSAGE_BOX;
/* fallthru */
case GIMP_MESSAGE_BOX:
if (gui_message_error_dialog (progress, domain, message))
return;
gimp->message_handler = GIMP_CONSOLE;
/* fallthru */
case GIMP_CONSOLE:
gui_message_console (domain, message);
break;
}
}
static gboolean
gui_message_error_console (const gchar *domain,
const gchar *message)
{
GtkWidget *dockable;
dockable = gimp_dialog_factory_dialog_raise (global_dock_factory,
gdk_screen_get_default (),
"gimp-error-console", -1);
if (dockable)
{
gimp_error_console_add (GIMP_ERROR_CONSOLE (GTK_BIN (dockable)->child),
GIMP_STOCK_WARNING, domain, message);
return TRUE;
}
return FALSE;
}
static void
progress_error_dialog_unset (GimpProgress *progress)
{
g_object_set_data (G_OBJECT (progress), "gimp-error-dialog", NULL);
}
static GtkWidget *
progress_error_dialog (GimpProgress *progress)
{
GtkWidget *dialog;
g_return_val_if_fail (GIMP_IS_PROGRESS (progress), NULL);
dialog = g_object_get_data (G_OBJECT (progress), "gimp-error-dialog");
if (! dialog)
{
dialog = gimp_error_dialog_new (_("GIMP Message"));
g_object_set_data (G_OBJECT (progress), "gimp-error-dialog", dialog);
g_signal_connect_object (dialog, "destroy",
G_CALLBACK (progress_error_dialog_unset),
progress, G_CONNECT_SWAPPED);
if (GTK_IS_WIDGET (progress))
{
GtkWidget *toplevel = gtk_widget_get_toplevel (GTK_WIDGET (progress));
if (GTK_IS_WINDOW (toplevel))
gtk_window_set_transient_for (GTK_WINDOW (dialog),
GTK_WINDOW (toplevel));
}
else
{
guint32 window = gimp_progress_get_window (progress);
if (window)
gimp_window_set_transient_for (GTK_WINDOW (dialog), window);
}
}
return dialog;
}
static GtkWidget *
global_error_dialog (void)
{
return gimp_dialog_factory_dialog_new (global_dialog_factory,
gdk_screen_get_default (),
"gimp-error-dialog", -1,
FALSE);
}
static gboolean
gui_message_error_dialog (GimpProgress *progress,
const gchar *domain,
const gchar *message)
{
GtkWidget *dialog;
dialog = progress ? progress_error_dialog (progress) : global_error_dialog ();
if (dialog)
{
gimp_error_dialog_add (GIMP_ERROR_DIALOG (dialog),
GIMP_STOCK_WARNING, domain, message);
gtk_window_present (GTK_WINDOW (dialog));
return TRUE;
}
return FALSE;
}
static void
gui_message_console (const gchar *domain,
const gchar *message)
{
g_printerr ("%s: %s\n\n", domain, message);
}
/* utility functions, similar to what we have in libgimp/gimpui.c */
static void
gimp_window_transient_realized (GtkWidget *window,
GdkWindow *parent)
{
if (GTK_WIDGET_REALIZED (window))
gdk_window_set_transient_for (window->window, parent);
}
static void
gimp_window_set_transient_for (GtkWindow *window,
guint32 parent_ID)
{
GdkWindow *parent;
parent = gdk_window_foreign_new_for_display (gdk_display_get_default (),
parent_ID);
if (! parent)
return;
if (GTK_WIDGET_REALIZED (window))
gdk_window_set_transient_for (GTK_WIDGET (window)->window, parent);
g_signal_connect_object (window, "realize",
G_CALLBACK (gimp_window_transient_realized),
parent, 0);
g_object_unref (parent);
}

29
app/gui/gui-message.h Normal file
View File

@ -0,0 +1,29 @@
/* The GIMP -- an image manipulation program
* Copyright (C) 1995 Spencer Kimball and Peter Mattis
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#ifndef __GUI_MESSAGE_H__
#define __GUI_MESSAGE_H__
void gui_message (Gimp *gimp,
GimpProgress *progress,
const gchar *domain,
const gchar *message);
#endif /* __GUI_VTABLE_H__ */

View File

@ -45,8 +45,6 @@
#include "widgets/gimpbrushselect.h"
#include "widgets/gimpdialogfactory.h"
#include "widgets/gimpdocked.h"
#include "widgets/gimperrorconsole.h"
#include "widgets/gimperrordialog.h"
#include "widgets/gimpfontselect.h"
#include "widgets/gimpgradientselect.h"
#include "widgets/gimphelp.h"
@ -66,8 +64,7 @@
#include "menus/menus.h"
#include "dialogs/dialogs.h"
#include "gui-message.h"
#include "themes.h"
@ -77,9 +74,6 @@ static void gui_threads_enter (Gimp *gimp);
static void gui_threads_leave (Gimp *gimp);
static void gui_set_busy (Gimp *gimp);
static void gui_unset_busy (Gimp *gimp);
static void gui_message (Gimp *gimp,
const gchar *domain,
const gchar *message);
static void gui_help (Gimp *gimp,
const gchar *help_domain,
const gchar *help_id);
@ -183,66 +177,6 @@ gui_unset_busy (Gimp *gimp)
}
static void
gui_message (Gimp *gimp,
const gchar *domain,
const gchar *message)
{
switch (gimp->message_handler)
{
case GIMP_ERROR_CONSOLE:
{
GtkWidget *dockable;
dockable = gimp_dialog_factory_dialog_raise (global_dock_factory,
gdk_screen_get_default (),
"gimp-error-console", -1);
if (dockable)
{
GimpErrorConsole *console;
console = GIMP_ERROR_CONSOLE (GTK_BIN (dockable)->child);
gimp_error_console_add (console,
GIMP_STOCK_WARNING, domain, message);
return;
}
gimp->message_handler = GIMP_MESSAGE_BOX;
}
/* fallthru */
case GIMP_MESSAGE_BOX:
{
GtkWidget *dialog;
dialog = gimp_dialog_factory_dialog_new (global_dialog_factory,
gdk_screen_get_default (),
"gimp-error-dialog", -1,
FALSE);
if (dialog)
{
gimp_error_dialog_add (GIMP_ERROR_DIALOG (dialog),
GIMP_STOCK_WARNING, domain, message);
gtk_window_present (GTK_WINDOW (dialog));
return;
}
gimp->message_handler = GIMP_CONSOLE;
}
/* fallthru */
case GIMP_CONSOLE:
g_printerr ("%s: %s\n\n", domain, message);
break;
}
}
void
gui_help (Gimp *gimp,
const gchar *help_domain,
const gchar *help_id)

View File

@ -31,7 +31,6 @@
#include "core/gimp.h"
#include "gimp-intl.h"
#include "plug-in/gimpplugin-progress.h"
#include "plug-in/gimpplugin.h"
#include "plug-in/gimppluginmanager.h"
@ -50,11 +49,13 @@ message_invoker (GimpProcedure *procedure,
if (success)
{
gchar *domain = NULL;
if (gimp->plug_in_manager->current_plug_in)
gimp_plug_in_progress_message (gimp->plug_in_manager->current_plug_in,
message);
else
gimp_message (gimp, NULL, message);
domain = gimp_plug_in_get_undo_desc (gimp->plug_in_manager->current_plug_in);
gimp_message (gimp, progress, domain, message);
g_free (domain);
}
return gimp_procedure_get_return_values (procedure, success);

View File

@ -273,33 +273,6 @@ gimp_plug_in_progress_cancel (GimpPlugIn *plug_in,
return FALSE;
}
void
gimp_plug_in_progress_message (GimpPlugIn *plug_in,
const gchar *message)
{
GimpPlugInProcFrame *proc_frame;
gchar *domain;
g_return_if_fail (GIMP_IS_PLUG_IN (plug_in));
g_return_if_fail (message != NULL);
proc_frame = gimp_plug_in_get_proc_frame (plug_in);
domain = gimp_plug_in_get_undo_desc (plug_in);
if (proc_frame->progress)
{
gimp_progress_message (proc_frame->progress,
plug_in->manager->gimp, domain, message);
}
else
{
gimp_message (plug_in->manager->gimp, domain, message);
}
g_free (domain);
}
/* private functions */

View File

@ -40,8 +40,5 @@ gboolean gimp_plug_in_progress_uninstall (GimpPlugIn *plug_in,
gboolean gimp_plug_in_progress_cancel (GimpPlugIn *plug_in,
const gchar *progress_callback);
void gimp_plug_in_progress_message (GimpPlugIn *plug_in,
const gchar *message);
#endif /* __GIMP_PLUG_IN_PROGRESS_H__ */

View File

@ -921,8 +921,8 @@ gimp_plug_in_remove_temp_proc (GimpPlugIn *plug_in,
g_return_if_fail (GIMP_IS_PLUG_IN (plug_in));
g_return_if_fail (GIMP_IS_TEMPORARY_PROCEDURE (proc));
plug_in->temp_procedures = g_slist_remove (plug_in->temp_procedures,
proc);
plug_in->temp_procedures = g_slist_remove (plug_in->temp_procedures, proc);
gimp_plug_in_manager_remove_temp_proc (plug_in->manager, proc);
g_object_unref (proc);
}

View File

@ -196,6 +196,7 @@ app/file/file-save.c
app/file/file-utils.c
app/gui/gui.c
app/gui/gui-message.c
app/gui/session.c
app/gui/splash.c
app/gui/themes.c

View File

@ -35,11 +35,13 @@ HELP
%invoke = (
code => <<'CODE'
{
gchar *domain = NULL;
if (gimp->plug_in_manager->current_plug_in)
gimp_plug_in_progress_message (gimp->plug_in_manager->current_plug_in,
message);
else
gimp_message (gimp, NULL, message);
domain = gimp_plug_in_get_undo_desc (gimp->plug_in_manager->current_plug_in);
gimp_message (gimp, progress, domain, message);
g_free (domain);
}
CODE
);
@ -99,7 +101,6 @@ CODE
@headers = qw(<string.h>
"core/gimp.h"
"plug-in/gimpplugin.h"
"plug-in/gimpplugin-progress.h"
"plug-in/gimppluginmanager.h"
"gimp-intl.h");