It works (until you try to load/save from a stream - found another bonobo

It works (until you try to load/save from a stream - found another bonobo bug).
This commit is contained in:
Elliot Lee 1999-07-16 22:36:27 +00:00
parent 81bfe9d592
commit c55b2ccfdc
10 changed files with 318 additions and 128 deletions

View File

@ -78,10 +78,10 @@ static guint gdisplay_hash (GDisplay *);
static GHashTable *display_ht = NULL;
GDisplay*
gdisplay_new (GimpImage *gimage,
unsigned int scale)
gdisplay_new_with_info (GimpImage *gimage,
unsigned int scale,
gboolean embeddable)
{
GDisplay *gdisp;
char title [MAX_TITLE_BUF];
@ -116,7 +116,7 @@ gdisplay_new (GimpImage *gimage,
gdisp->proximity = FALSE;
gdisp->have_cursor = FALSE;
gdisp->using_override_cursor = FALSE;
gdisp->is_embeddable = embeddable?1:0;
gdisp->progressid = FALSE;
gdisp->idle_render.idleid = -1;
@ -161,6 +161,13 @@ gdisplay_new (GimpImage *gimage,
return gdisp;
}
GDisplay*
gdisplay_new (GimpImage *gimage,
unsigned int scale)
{
return gdisplay_new_with_info (gimage, scale, FALSE);
}
static int print (char *, int, int, const char *, ...) G_GNUC_PRINTF (4, 5);
@ -1103,8 +1110,9 @@ gdisplay_resize_cursor_label (GDisplay *gdisp)
(gdouble) gdisp->gimage->height * unit_factor /
gdisp->gimage->yresolution);
}
cursor_label_width =
gdk_string_width (gtk_widget_get_style (gdisp->cursor_label)->font, buffer);
gdk_string_width (gtk_widget_get_style(gdisp->cursor_label)->font, buffer);
/* find out how many pixels the label's parent frame is bigger than
* the label itself */

View File

@ -150,6 +150,8 @@ struct _GDisplay
short have_cursor; /* is cursor currently drawn ? */
IdleRenderStruct idle_render; /* state of this gdisplay's render thread */
guint8 is_embeddable : 1; /* Is this display not in a toplevel window? */
};
@ -157,6 +159,7 @@ struct _GDisplay
/* member function declarations */
GDisplay * gdisplay_new (GimpImage *, unsigned int);
GDisplay * gdisplay_new_with_info (GimpImage *, unsigned int, gboolean embeddable);
void gdisplay_reconnect (GDisplay *, GimpImage *);
void gdisplay_remove_and_delete (GDisplay *);
int gdisplay_mask_value (GDisplay *, int, int);

View File

@ -78,10 +78,10 @@ static guint gdisplay_hash (GDisplay *);
static GHashTable *display_ht = NULL;
GDisplay*
gdisplay_new (GimpImage *gimage,
unsigned int scale)
gdisplay_new_with_info (GimpImage *gimage,
unsigned int scale,
gboolean embeddable)
{
GDisplay *gdisp;
char title [MAX_TITLE_BUF];
@ -116,7 +116,7 @@ gdisplay_new (GimpImage *gimage,
gdisp->proximity = FALSE;
gdisp->have_cursor = FALSE;
gdisp->using_override_cursor = FALSE;
gdisp->is_embeddable = embeddable?1:0;
gdisp->progressid = FALSE;
gdisp->idle_render.idleid = -1;
@ -161,6 +161,13 @@ gdisplay_new (GimpImage *gimage,
return gdisp;
}
GDisplay*
gdisplay_new (GimpImage *gimage,
unsigned int scale)
{
return gdisplay_new_with_info (gimage, scale, FALSE);
}
static int print (char *, int, int, const char *, ...) G_GNUC_PRINTF (4, 5);
@ -1103,8 +1110,9 @@ gdisplay_resize_cursor_label (GDisplay *gdisp)
(gdouble) gdisp->gimage->height * unit_factor /
gdisp->gimage->yresolution);
}
cursor_label_width =
gdk_string_width (gtk_widget_get_style (gdisp->cursor_label)->font, buffer);
gdk_string_width (gtk_widget_get_style(gdisp->cursor_label)->font, buffer);
/* find out how many pixels the label's parent frame is bigger than
* the label itself */

View File

@ -150,6 +150,8 @@ struct _GDisplay
short have_cursor; /* is cursor currently drawn ? */
IdleRenderStruct idle_render; /* state of this gdisplay's render thread */
guint8 is_embeddable : 1; /* Is this display not in a toplevel window? */
};
@ -157,6 +159,7 @@ struct _GDisplay
/* member function declarations */
GDisplay * gdisplay_new (GimpImage *, unsigned int);
GDisplay * gdisplay_new_with_info (GimpImage *, unsigned int, gboolean embeddable);
void gdisplay_reconnect (GDisplay *, GimpImage *);
void gdisplay_remove_and_delete (GDisplay *);
int gdisplay_mask_value (GDisplay *, int, int);

View File

@ -642,6 +642,49 @@ toolbox_raise_callback (GtkWidget *widget,
gdk_window_raise(toolbox_shell->window);
}
static void
do_gdisplay_resize_cursor_label (GtkWidget *widget, GDisplay *display)
{
gdisplay_resize_cursor_label (display);
}
static void
do_qmaskon_pixmap_creation (GtkWidget *widget, GDisplay *gdisp)
{
GdkPixmap *pxmp;
GdkBitmap *mask;
GtkStyle *style;
GtkWidget *pixmap;
style = gtk_widget_get_style(gdisp->shell);
pxmp = gdk_pixmap_create_from_xpm_d(gdisp->shell->window, &mask,
&style->bg[GTK_STATE_NORMAL],
qmasksel_xpm);
pixmap = gtk_pixmap_new (pxmp, mask);
gtk_container_add (GTK_CONTAINER (gdisp->qmaskon), pixmap);
gtk_widget_show(pixmap);
}
static void
do_qmaskoff_pixmap_creation (GtkWidget *widget, GDisplay *gdisp)
{
GdkPixmap *pxmp;
GdkBitmap *mask;
GtkStyle *style;
GtkWidget *pixmap;
style = gtk_widget_get_style(gdisp->shell);
pxmp = gdk_pixmap_create_from_xpm_d(gdisp->shell->window, &mask,
&style->bg[GTK_STATE_NORMAL],
qmasknosel_xpm);
pixmap = gtk_pixmap_new (pxmp, mask);
gtk_container_add (GTK_CONTAINER (gdisp->qmaskoff), pixmap);
gtk_widget_show(pixmap);
}
void
create_display_shell (GDisplay* gdisp,
int width,
@ -658,7 +701,6 @@ create_display_shell (GDisplay* gdisp,
GtkWidget *table_lower;
GtkWidget *frame;
GtkWidget *arrow;
GtkWidget *pixmap;
GSList *group = NULL;
@ -699,16 +741,26 @@ create_display_shell (GDisplay* gdisp,
gdisp->vsbdata = GTK_ADJUSTMENT (gtk_adjustment_new (0, 0, height, 1, 1, height));
/* The toplevel shell */
gdisp->shell = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_widget_ref (gdisp->shell);
gtk_window_set_title (GTK_WINDOW (gdisp->shell), title);
gtk_window_set_wmclass (GTK_WINDOW (gdisp->shell), "image_window", "Gimp");
gtk_window_set_policy (GTK_WINDOW (gdisp->shell), TRUE, TRUE, TRUE);
if(gdisp->is_embeddable) {
gdisp->shell = gtk_vbox_new(FALSE, 0);
} else {
gdisp->shell = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_window_set_title (GTK_WINDOW (gdisp->shell), title);
gtk_window_set_wmclass (GTK_WINDOW (gdisp->shell), "image_window", "Gimp");
gtk_window_set_policy (GTK_WINDOW (gdisp->shell), TRUE, TRUE, TRUE);
gtk_signal_connect (GTK_OBJECT (gdisp->shell), "delete_event",
GTK_SIGNAL_FUNC (gdisplay_delete),
gdisp);
}
gtk_widget_set_events (gdisp->shell,
GDK_POINTER_MOTION_MASK
| GDK_POINTER_MOTION_HINT_MASK
| GDK_BUTTON_PRESS_MASK
| GDK_KEY_PRESS_MASK
| GDK_KEY_RELEASE_MASK);
gtk_object_set_user_data (GTK_OBJECT (gdisp->shell), (gpointer) gdisp);
gtk_widget_set_events (gdisp->shell, GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK);
gtk_signal_connect (GTK_OBJECT (gdisp->shell), "delete_event",
GTK_SIGNAL_FUNC (gdisplay_delete),
gdisp);
gtk_widget_ref (gdisp->shell);
gtk_signal_connect (GTK_OBJECT (gdisp->shell), "destroy",
(GtkSignalFunc) gdisplay_destroy,
@ -804,32 +856,12 @@ create_display_shell (GDisplay* gdisp,
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(gdisp->qmaskoff), TRUE);
gtk_widget_set_usize(GTK_WIDGET(gdisp->qmaskon), 15, 15);
gtk_widget_set_usize(GTK_WIDGET(gdisp->qmaskoff), 15, 15);
/* Draw pixmaps - note: you must realize the parent prior to doing the
rest! */
{
GdkPixmap *pxmp;
GdkBitmap *mask;
GtkStyle *style;
style = gtk_widget_get_style(gdisp->shell);
gtk_widget_realize(gdisp->shell);
pxmp = gdk_pixmap_create_from_xpm_d(gdisp->shell->window, &mask,
&style->bg[GTK_STATE_NORMAL],
qmasksel_xpm);
gtk_signal_connect (GTK_OBJECT(gdisp->qmaskon), "realize",
GTK_SIGNAL_FUNC(do_qmaskon_pixmap_creation), gdisp);
gtk_signal_connect (GTK_OBJECT(gdisp->qmaskoff), "realize",
GTK_SIGNAL_FUNC(do_qmaskoff_pixmap_creation), gdisp);
pixmap = gtk_pixmap_new (pxmp, mask);
gtk_container_add (GTK_CONTAINER (gdisp->qmaskon), pixmap);
gtk_widget_show(pixmap);
pxmp = gdk_pixmap_create_from_xpm_d(gdisp->shell->window, &mask,
&style->bg[GTK_STATE_NORMAL],
qmasknosel_xpm);
pixmap = gtk_pixmap_new (pxmp, mask);
gtk_container_add (GTK_CONTAINER (gdisp->qmaskoff), pixmap);
gtk_widget_show(pixmap);
}
gdisp->canvas = gtk_drawing_area_new ();
gtk_drawing_area_size (GTK_DRAWING_AREA (gdisp->canvas), n_width, n_height);
gtk_widget_set_events (gdisp->canvas, CANVAS_EVENT_MASK);
@ -892,8 +924,8 @@ create_display_shell (GDisplay* gdisp,
/* we need to realize the cursor_label widget here, so the size gets
computed correctly */
gtk_widget_realize (gdisp->cursor_label);
gdisplay_resize_cursor_label (gdisp);
gtk_signal_connect (GTK_OBJECT(gdisp->cursor_label), "realize",
GTK_SIGNAL_FUNC(do_gdisplay_resize_cursor_label), gdisp);
gdisp->statusbar = gtk_statusbar_new ();
gtk_widget_set_usize (gdisp->statusbar, 1, -1);
@ -918,7 +950,10 @@ create_display_shell (GDisplay* gdisp,
gdisp->popup = image_popup_menu;
/* the accelerator table for images */
gtk_window_add_accel_group (GTK_WINDOW (gdisp->shell), image_accel_group);
if( !gdisp->is_embeddable)
gtk_window_add_accel_group (GTK_WINDOW (gdisp->shell), image_accel_group);
else
/* XXX FIXME: Dunno how to handle accel groups here */;
gtk_widget_show (arrow);
gtk_widget_show (gdisp->qmaskon);
@ -952,11 +987,15 @@ create_display_shell (GDisplay* gdisp,
gtk_widget_show (vbox);
gtk_widget_show (gdisp->shell);
#if 0
#ifdef __GNUC__
#warning DODGY?
#endif /*__GNUC__ */
gtk_widget_realize (gdisp->canvas);
gdk_window_set_back_pixmap(gdisp->canvas->window, NULL, 0);
#endif
/* set the focus to the canvas area */
gtk_widget_grab_focus (gdisp->canvas);

View File

@ -642,6 +642,49 @@ toolbox_raise_callback (GtkWidget *widget,
gdk_window_raise(toolbox_shell->window);
}
static void
do_gdisplay_resize_cursor_label (GtkWidget *widget, GDisplay *display)
{
gdisplay_resize_cursor_label (display);
}
static void
do_qmaskon_pixmap_creation (GtkWidget *widget, GDisplay *gdisp)
{
GdkPixmap *pxmp;
GdkBitmap *mask;
GtkStyle *style;
GtkWidget *pixmap;
style = gtk_widget_get_style(gdisp->shell);
pxmp = gdk_pixmap_create_from_xpm_d(gdisp->shell->window, &mask,
&style->bg[GTK_STATE_NORMAL],
qmasksel_xpm);
pixmap = gtk_pixmap_new (pxmp, mask);
gtk_container_add (GTK_CONTAINER (gdisp->qmaskon), pixmap);
gtk_widget_show(pixmap);
}
static void
do_qmaskoff_pixmap_creation (GtkWidget *widget, GDisplay *gdisp)
{
GdkPixmap *pxmp;
GdkBitmap *mask;
GtkStyle *style;
GtkWidget *pixmap;
style = gtk_widget_get_style(gdisp->shell);
pxmp = gdk_pixmap_create_from_xpm_d(gdisp->shell->window, &mask,
&style->bg[GTK_STATE_NORMAL],
qmasknosel_xpm);
pixmap = gtk_pixmap_new (pxmp, mask);
gtk_container_add (GTK_CONTAINER (gdisp->qmaskoff), pixmap);
gtk_widget_show(pixmap);
}
void
create_display_shell (GDisplay* gdisp,
int width,
@ -658,7 +701,6 @@ create_display_shell (GDisplay* gdisp,
GtkWidget *table_lower;
GtkWidget *frame;
GtkWidget *arrow;
GtkWidget *pixmap;
GSList *group = NULL;
@ -699,16 +741,26 @@ create_display_shell (GDisplay* gdisp,
gdisp->vsbdata = GTK_ADJUSTMENT (gtk_adjustment_new (0, 0, height, 1, 1, height));
/* The toplevel shell */
gdisp->shell = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_widget_ref (gdisp->shell);
gtk_window_set_title (GTK_WINDOW (gdisp->shell), title);
gtk_window_set_wmclass (GTK_WINDOW (gdisp->shell), "image_window", "Gimp");
gtk_window_set_policy (GTK_WINDOW (gdisp->shell), TRUE, TRUE, TRUE);
if(gdisp->is_embeddable) {
gdisp->shell = gtk_vbox_new(FALSE, 0);
} else {
gdisp->shell = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_window_set_title (GTK_WINDOW (gdisp->shell), title);
gtk_window_set_wmclass (GTK_WINDOW (gdisp->shell), "image_window", "Gimp");
gtk_window_set_policy (GTK_WINDOW (gdisp->shell), TRUE, TRUE, TRUE);
gtk_signal_connect (GTK_OBJECT (gdisp->shell), "delete_event",
GTK_SIGNAL_FUNC (gdisplay_delete),
gdisp);
}
gtk_widget_set_events (gdisp->shell,
GDK_POINTER_MOTION_MASK
| GDK_POINTER_MOTION_HINT_MASK
| GDK_BUTTON_PRESS_MASK
| GDK_KEY_PRESS_MASK
| GDK_KEY_RELEASE_MASK);
gtk_object_set_user_data (GTK_OBJECT (gdisp->shell), (gpointer) gdisp);
gtk_widget_set_events (gdisp->shell, GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK);
gtk_signal_connect (GTK_OBJECT (gdisp->shell), "delete_event",
GTK_SIGNAL_FUNC (gdisplay_delete),
gdisp);
gtk_widget_ref (gdisp->shell);
gtk_signal_connect (GTK_OBJECT (gdisp->shell), "destroy",
(GtkSignalFunc) gdisplay_destroy,
@ -804,32 +856,12 @@ create_display_shell (GDisplay* gdisp,
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(gdisp->qmaskoff), TRUE);
gtk_widget_set_usize(GTK_WIDGET(gdisp->qmaskon), 15, 15);
gtk_widget_set_usize(GTK_WIDGET(gdisp->qmaskoff), 15, 15);
/* Draw pixmaps - note: you must realize the parent prior to doing the
rest! */
{
GdkPixmap *pxmp;
GdkBitmap *mask;
GtkStyle *style;
style = gtk_widget_get_style(gdisp->shell);
gtk_widget_realize(gdisp->shell);
pxmp = gdk_pixmap_create_from_xpm_d(gdisp->shell->window, &mask,
&style->bg[GTK_STATE_NORMAL],
qmasksel_xpm);
gtk_signal_connect (GTK_OBJECT(gdisp->qmaskon), "realize",
GTK_SIGNAL_FUNC(do_qmaskon_pixmap_creation), gdisp);
gtk_signal_connect (GTK_OBJECT(gdisp->qmaskoff), "realize",
GTK_SIGNAL_FUNC(do_qmaskoff_pixmap_creation), gdisp);
pixmap = gtk_pixmap_new (pxmp, mask);
gtk_container_add (GTK_CONTAINER (gdisp->qmaskon), pixmap);
gtk_widget_show(pixmap);
pxmp = gdk_pixmap_create_from_xpm_d(gdisp->shell->window, &mask,
&style->bg[GTK_STATE_NORMAL],
qmasknosel_xpm);
pixmap = gtk_pixmap_new (pxmp, mask);
gtk_container_add (GTK_CONTAINER (gdisp->qmaskoff), pixmap);
gtk_widget_show(pixmap);
}
gdisp->canvas = gtk_drawing_area_new ();
gtk_drawing_area_size (GTK_DRAWING_AREA (gdisp->canvas), n_width, n_height);
gtk_widget_set_events (gdisp->canvas, CANVAS_EVENT_MASK);
@ -892,8 +924,8 @@ create_display_shell (GDisplay* gdisp,
/* we need to realize the cursor_label widget here, so the size gets
computed correctly */
gtk_widget_realize (gdisp->cursor_label);
gdisplay_resize_cursor_label (gdisp);
gtk_signal_connect (GTK_OBJECT(gdisp->cursor_label), "realize",
GTK_SIGNAL_FUNC(do_gdisplay_resize_cursor_label), gdisp);
gdisp->statusbar = gtk_statusbar_new ();
gtk_widget_set_usize (gdisp->statusbar, 1, -1);
@ -918,7 +950,10 @@ create_display_shell (GDisplay* gdisp,
gdisp->popup = image_popup_menu;
/* the accelerator table for images */
gtk_window_add_accel_group (GTK_WINDOW (gdisp->shell), image_accel_group);
if( !gdisp->is_embeddable)
gtk_window_add_accel_group (GTK_WINDOW (gdisp->shell), image_accel_group);
else
/* XXX FIXME: Dunno how to handle accel groups here */;
gtk_widget_show (arrow);
gtk_widget_show (gdisp->qmaskon);
@ -952,11 +987,15 @@ create_display_shell (GDisplay* gdisp,
gtk_widget_show (vbox);
gtk_widget_show (gdisp->shell);
#if 0
#ifdef __GNUC__
#warning DODGY?
#endif /*__GNUC__ */
gtk_widget_realize (gdisp->canvas);
gdk_window_set_back_pixmap(gdisp->canvas->window, NULL, 0);
#endif
/* set the focus to the canvas area */
gtk_widget_grab_focus (gdisp->canvas);

View File

@ -78,10 +78,10 @@ static guint gdisplay_hash (GDisplay *);
static GHashTable *display_ht = NULL;
GDisplay*
gdisplay_new (GimpImage *gimage,
unsigned int scale)
gdisplay_new_with_info (GimpImage *gimage,
unsigned int scale,
gboolean embeddable)
{
GDisplay *gdisp;
char title [MAX_TITLE_BUF];
@ -116,7 +116,7 @@ gdisplay_new (GimpImage *gimage,
gdisp->proximity = FALSE;
gdisp->have_cursor = FALSE;
gdisp->using_override_cursor = FALSE;
gdisp->is_embeddable = embeddable?1:0;
gdisp->progressid = FALSE;
gdisp->idle_render.idleid = -1;
@ -161,6 +161,13 @@ gdisplay_new (GimpImage *gimage,
return gdisp;
}
GDisplay*
gdisplay_new (GimpImage *gimage,
unsigned int scale)
{
return gdisplay_new_with_info (gimage, scale, FALSE);
}
static int print (char *, int, int, const char *, ...) G_GNUC_PRINTF (4, 5);
@ -1103,8 +1110,9 @@ gdisplay_resize_cursor_label (GDisplay *gdisp)
(gdouble) gdisp->gimage->height * unit_factor /
gdisp->gimage->yresolution);
}
cursor_label_width =
gdk_string_width (gtk_widget_get_style (gdisp->cursor_label)->font, buffer);
gdk_string_width (gtk_widget_get_style(gdisp->cursor_label)->font, buffer);
/* find out how many pixels the label's parent frame is bigger than
* the label itself */

View File

@ -150,6 +150,8 @@ struct _GDisplay
short have_cursor; /* is cursor currently drawn ? */
IdleRenderStruct idle_render; /* state of this gdisplay's render thread */
guint8 is_embeddable : 1; /* Is this display not in a toplevel window? */
};
@ -157,6 +159,7 @@ struct _GDisplay
/* member function declarations */
GDisplay * gdisplay_new (GimpImage *, unsigned int);
GDisplay * gdisplay_new_with_info (GimpImage *, unsigned int, gboolean embeddable);
void gdisplay_reconnect (GDisplay *, GimpImage *);
void gdisplay_remove_and_delete (GDisplay *);
int gdisplay_mask_value (GDisplay *, int, int);

View File

@ -27,6 +27,26 @@
#include "gdisplay.h"
#include "fileops.h"
/* Random header files in case they might be needed */
#include "appenv.h"
#include "actionarea.h"
#include "file_new_dialog.h"
#include "gimage.h"
#include "gimpcontext.h"
#include "gimprc.h"
#include "global_edit.h"
#include "interface.h"
#include "lc_dialog.h"
#include "plug_in.h"
#include "tile_manager_pvt.h"
#include "gdisplay.h"
#include "libgimp/gimpchainbutton.h"
#include "libgimp/gimplimits.h"
#include "libgimp/gimpsizeentry.h"
#include "libgimp/gimpintl.h"
#include <stdlib.h>
#include <time.h>
@ -76,6 +96,7 @@ gimp_object_factory (GnomeEmbeddableFactory *this, void *data)
GnomeEmbeddable *bonobo_object;
GnomePersistStream *stream;
bonobo_object_data_t *bonobo_object_data;
GimpImage *gimage;
bonobo_object_data = g_new0 (bonobo_object_data_t, 1);
@ -93,6 +114,25 @@ gimp_object_factory (GnomeEmbeddableFactory *this, void *data)
gnome_object_add_interface (GNOME_OBJECT (bonobo_object),
GNOME_OBJECT (stream));
/* Make a basic blank image */
bonobo_object_data->gimp_image = gimage = gimp_image_new(320, 200, RGB);
gimp_image_set_resolution (gimage, 72.0, 72.0);
gimp_image_set_unit (gimage, UNIT_INCH);
gimage_disable_undo(bonobo_object_data->gimp_image);
{
Layer *layer;
layer = layer_new (gimage, gimage->width, gimage->height,
RGBA_GIMAGE, _("Background"), OPAQUE_OPACITY, NORMAL);
if (layer) {
gimage_add_layer(gimage, layer, 0);
drawable_fill(GIMP_DRAWABLE(layer), WHITE_FILL);
}
}
gimage_enable_undo(bonobo_object_data->gimp_image);
gimage_clean_all(bonobo_object_data->gimp_image);
return (GnomeObject *) bonobo_object;
out:
@ -114,14 +154,14 @@ gimp_view_factory (GnomeEmbeddable *bonobo_object,
view_data = g_new0 (bonobo_view_t, 1);
view_data->parent = bonobo_object_data;
view_data->gdisplay = gdisplay_new (bonobo_object_data->gimp_image, 0x0101);
view_data->gdisplay = gdisplay_new_with_info (bonobo_object_data->gimp_image, 0x0101, TRUE);
view = gnome_view_new(view_data->gdisplay->shell);
gtk_signal_connect (GTK_OBJECT (view), "destroy",
GTK_SIGNAL_FUNC(gimp_view_destroy), view_data);
bonobo_object_data->views = g_list_prepend (bonobo_object_data->views,
view_data);
view_data);
return view;
}

View File

@ -642,6 +642,49 @@ toolbox_raise_callback (GtkWidget *widget,
gdk_window_raise(toolbox_shell->window);
}
static void
do_gdisplay_resize_cursor_label (GtkWidget *widget, GDisplay *display)
{
gdisplay_resize_cursor_label (display);
}
static void
do_qmaskon_pixmap_creation (GtkWidget *widget, GDisplay *gdisp)
{
GdkPixmap *pxmp;
GdkBitmap *mask;
GtkStyle *style;
GtkWidget *pixmap;
style = gtk_widget_get_style(gdisp->shell);
pxmp = gdk_pixmap_create_from_xpm_d(gdisp->shell->window, &mask,
&style->bg[GTK_STATE_NORMAL],
qmasksel_xpm);
pixmap = gtk_pixmap_new (pxmp, mask);
gtk_container_add (GTK_CONTAINER (gdisp->qmaskon), pixmap);
gtk_widget_show(pixmap);
}
static void
do_qmaskoff_pixmap_creation (GtkWidget *widget, GDisplay *gdisp)
{
GdkPixmap *pxmp;
GdkBitmap *mask;
GtkStyle *style;
GtkWidget *pixmap;
style = gtk_widget_get_style(gdisp->shell);
pxmp = gdk_pixmap_create_from_xpm_d(gdisp->shell->window, &mask,
&style->bg[GTK_STATE_NORMAL],
qmasknosel_xpm);
pixmap = gtk_pixmap_new (pxmp, mask);
gtk_container_add (GTK_CONTAINER (gdisp->qmaskoff), pixmap);
gtk_widget_show(pixmap);
}
void
create_display_shell (GDisplay* gdisp,
int width,
@ -658,7 +701,6 @@ create_display_shell (GDisplay* gdisp,
GtkWidget *table_lower;
GtkWidget *frame;
GtkWidget *arrow;
GtkWidget *pixmap;
GSList *group = NULL;
@ -699,16 +741,26 @@ create_display_shell (GDisplay* gdisp,
gdisp->vsbdata = GTK_ADJUSTMENT (gtk_adjustment_new (0, 0, height, 1, 1, height));
/* The toplevel shell */
gdisp->shell = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_widget_ref (gdisp->shell);
gtk_window_set_title (GTK_WINDOW (gdisp->shell), title);
gtk_window_set_wmclass (GTK_WINDOW (gdisp->shell), "image_window", "Gimp");
gtk_window_set_policy (GTK_WINDOW (gdisp->shell), TRUE, TRUE, TRUE);
if(gdisp->is_embeddable) {
gdisp->shell = gtk_vbox_new(FALSE, 0);
} else {
gdisp->shell = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_window_set_title (GTK_WINDOW (gdisp->shell), title);
gtk_window_set_wmclass (GTK_WINDOW (gdisp->shell), "image_window", "Gimp");
gtk_window_set_policy (GTK_WINDOW (gdisp->shell), TRUE, TRUE, TRUE);
gtk_signal_connect (GTK_OBJECT (gdisp->shell), "delete_event",
GTK_SIGNAL_FUNC (gdisplay_delete),
gdisp);
}
gtk_widget_set_events (gdisp->shell,
GDK_POINTER_MOTION_MASK
| GDK_POINTER_MOTION_HINT_MASK
| GDK_BUTTON_PRESS_MASK
| GDK_KEY_PRESS_MASK
| GDK_KEY_RELEASE_MASK);
gtk_object_set_user_data (GTK_OBJECT (gdisp->shell), (gpointer) gdisp);
gtk_widget_set_events (gdisp->shell, GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK);
gtk_signal_connect (GTK_OBJECT (gdisp->shell), "delete_event",
GTK_SIGNAL_FUNC (gdisplay_delete),
gdisp);
gtk_widget_ref (gdisp->shell);
gtk_signal_connect (GTK_OBJECT (gdisp->shell), "destroy",
(GtkSignalFunc) gdisplay_destroy,
@ -804,32 +856,12 @@ create_display_shell (GDisplay* gdisp,
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(gdisp->qmaskoff), TRUE);
gtk_widget_set_usize(GTK_WIDGET(gdisp->qmaskon), 15, 15);
gtk_widget_set_usize(GTK_WIDGET(gdisp->qmaskoff), 15, 15);
/* Draw pixmaps - note: you must realize the parent prior to doing the
rest! */
{
GdkPixmap *pxmp;
GdkBitmap *mask;
GtkStyle *style;
style = gtk_widget_get_style(gdisp->shell);
gtk_widget_realize(gdisp->shell);
pxmp = gdk_pixmap_create_from_xpm_d(gdisp->shell->window, &mask,
&style->bg[GTK_STATE_NORMAL],
qmasksel_xpm);
gtk_signal_connect (GTK_OBJECT(gdisp->qmaskon), "realize",
GTK_SIGNAL_FUNC(do_qmaskon_pixmap_creation), gdisp);
gtk_signal_connect (GTK_OBJECT(gdisp->qmaskoff), "realize",
GTK_SIGNAL_FUNC(do_qmaskoff_pixmap_creation), gdisp);
pixmap = gtk_pixmap_new (pxmp, mask);
gtk_container_add (GTK_CONTAINER (gdisp->qmaskon), pixmap);
gtk_widget_show(pixmap);
pxmp = gdk_pixmap_create_from_xpm_d(gdisp->shell->window, &mask,
&style->bg[GTK_STATE_NORMAL],
qmasknosel_xpm);
pixmap = gtk_pixmap_new (pxmp, mask);
gtk_container_add (GTK_CONTAINER (gdisp->qmaskoff), pixmap);
gtk_widget_show(pixmap);
}
gdisp->canvas = gtk_drawing_area_new ();
gtk_drawing_area_size (GTK_DRAWING_AREA (gdisp->canvas), n_width, n_height);
gtk_widget_set_events (gdisp->canvas, CANVAS_EVENT_MASK);
@ -892,8 +924,8 @@ create_display_shell (GDisplay* gdisp,
/* we need to realize the cursor_label widget here, so the size gets
computed correctly */
gtk_widget_realize (gdisp->cursor_label);
gdisplay_resize_cursor_label (gdisp);
gtk_signal_connect (GTK_OBJECT(gdisp->cursor_label), "realize",
GTK_SIGNAL_FUNC(do_gdisplay_resize_cursor_label), gdisp);
gdisp->statusbar = gtk_statusbar_new ();
gtk_widget_set_usize (gdisp->statusbar, 1, -1);
@ -918,7 +950,10 @@ create_display_shell (GDisplay* gdisp,
gdisp->popup = image_popup_menu;
/* the accelerator table for images */
gtk_window_add_accel_group (GTK_WINDOW (gdisp->shell), image_accel_group);
if( !gdisp->is_embeddable)
gtk_window_add_accel_group (GTK_WINDOW (gdisp->shell), image_accel_group);
else
/* XXX FIXME: Dunno how to handle accel groups here */;
gtk_widget_show (arrow);
gtk_widget_show (gdisp->qmaskon);
@ -952,11 +987,15 @@ create_display_shell (GDisplay* gdisp,
gtk_widget_show (vbox);
gtk_widget_show (gdisp->shell);
#if 0
#ifdef __GNUC__
#warning DODGY?
#endif /*__GNUC__ */
gtk_widget_realize (gdisp->canvas);
gdk_window_set_back_pixmap(gdisp->canvas->window, NULL, 0);
#endif
/* set the focus to the canvas area */
gtk_widget_grab_focus (gdisp->canvas);