From 9b9f3d1066abf87c1d4b69c9fd0a2ae808eed9d6 Mon Sep 17 00:00:00 2001 From: Michael Natterer Date: Sat, 24 Jul 1999 15:37:03 +0000 Subject: [PATCH] set the "preserve" flag to FALSE. This way the tool doesn't have to detect 1999-07-24 Michael Natterer * app/color_picker.[ch]: set the "preserve" flag to FALSE. This way the tool doesn't have to detect drawable changes by itself. Misc stuff like below. * app/gradient.c: heavily changed the beast: - Reviewed the whole ui code and indented it. - Standard ui for all sub-dialogs. - Handle the wm delete event of the sub-dialogs. - "+" and "-" pixmaps instead of "zoom in" and "zoom out". - Made the gradient preview resizable again. - i18n fixes. - Removed some code duplication in the sub-dialogs' cancel/delete callbacks. - Grouped functions together and commented the groups and their prototypes. - Didn't change any core functionality (just the ui). - Please don't kill me, but I couldn't resist to indent most functions ;-) * app/info_dialog.c: no need to call gettext() on a string which was passed to a function (it's the job of the caller). * app/ink.c: grab the pointer in the blob preview. * app/palette.c: standardized the ui of the dialog and all it's sub-dialogs, function header indentation, namespace cleanup. --- ChangeLog | 29 + app/color_picker.c | 275 +- app/color_picker.h | 16 +- app/dialogs/info-dialog.c | 10 +- app/gradient.c | 5019 +++++++++++++++--------------- app/gradient_editor.c | 5019 +++++++++++++++--------------- app/gui/gradient-editor.c | 5019 +++++++++++++++--------------- app/gui/info-dialog.c | 10 +- app/gui/palette-editor.c | 2305 +++++++------- app/info_dialog.c | 10 +- app/ink.c | 12 +- app/paint/gimpink.c | 12 +- app/palette.c | 2305 +++++++------- app/tools/color_picker.c | 275 +- app/tools/color_picker.h | 16 +- app/tools/gimpinktool.c | 12 +- app/tools/ink.c | 12 +- app/widgets/gimpgradienteditor.c | 5019 +++++++++++++++--------------- app/widgets/gimppaletteeditor.c | 2305 +++++++------- 19 files changed, 13991 insertions(+), 13689 deletions(-) diff --git a/ChangeLog b/ChangeLog index 3599b409e5..528a5d8e43 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,32 @@ +1999-07-24 Michael Natterer + + * app/color_picker.[ch]: set the "preserve" flag to FALSE. This + way the tool doesn't have to detect drawable changes by itself. + Misc stuff like below. + + * app/gradient.c: heavily changed the beast: + + - Reviewed the whole ui code and indented it. + - Standard ui for all sub-dialogs. + - Handle the wm delete event of the sub-dialogs. + - "+" and "-" pixmaps instead of "zoom in" and "zoom out". + - Made the gradient preview resizable again. + - i18n fixes. + - Removed some code duplication in the sub-dialogs' cancel/delete + callbacks. + - Grouped functions together and commented the groups and their + prototypes. + - Didn't change any core functionality (just the ui). + - Please don't kill me, but I couldn't resist to indent most + functions ;-) + + * app/info_dialog.c: no need to call gettext() on a string which + was passed to a function (it's the job of the caller). + + * app/ink.c: grab the pointer in the blob preview. + + * app/palette.c: standardized the ui of the dialog and all it's + sub-dialogs, function header indentation, namespace cleanup. Fri Jul 23 00:01:05 BST 1999 Andy Thomas diff --git a/app/color_picker.c b/app/color_picker.c index cfab77fd6d..c6c4d127a7 100644 --- a/app/color_picker.c +++ b/app/color_picker.c @@ -15,8 +15,6 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#include -#include #include "appenv.h" #include "actionarea.h" #include "color_picker.h" @@ -42,46 +40,45 @@ struct _ColorPickerOptions { ToolOptions tool_options; - int sample_merged; - int sample_merged_d; + gint sample_merged; + gint sample_merged_d; GtkWidget *sample_merged_w; - int sample_average; - int sample_average_d; + gint sample_average; + gint sample_average_d; GtkWidget *sample_average_w; - double average_radius; - double average_radius_d; + gdouble average_radius; + gdouble average_radius_d; GtkObject *average_radius_w; }; -typedef struct _ColourPickerTool ColourPickerTool; -struct _ColourPickerTool +typedef struct _ColorPickerTool ColorPickerTool; +struct _ColorPickerTool { - DrawCore * core; /* Core select object */ + DrawCore *core; /* Core select object */ - int centerx; /* starting x coord */ - int centery; /* starting y coord */ + gint centerx; /* starting x coord */ + gint centery; /* starting y coord */ }; /* the color picker tool options */ static ColorPickerOptions * color_picker_options = NULL; /* the color value */ -int col_value[5] = { 0, 0, 0, 0, 0 }; +gint col_value[5] = { 0, 0, 0, 0, 0 }; /* the color picker dialog */ -static GimpDrawable * active_drawable; -static int update_type; -static int sample_type; +static gint update_type; +static gint sample_type; static InfoDialog * color_picker_info = NULL; -static char red_buf [MAX_INFO_BUF]; -static char green_buf [MAX_INFO_BUF]; -static char blue_buf [MAX_INFO_BUF]; -static char alpha_buf [MAX_INFO_BUF]; -static char index_buf [MAX_INFO_BUF]; -static char gray_buf [MAX_INFO_BUF]; -static char hex_buf [MAX_INFO_BUF]; +static gchar red_buf [MAX_INFO_BUF]; +static gchar green_buf [MAX_INFO_BUF]; +static gchar blue_buf [MAX_INFO_BUF]; +static gchar alpha_buf [MAX_INFO_BUF]; +static gchar index_buf [MAX_INFO_BUF]; +static gchar gray_buf [MAX_INFO_BUF]; +static gchar hex_buf [MAX_INFO_BUF]; /* local function prototypes */ @@ -93,7 +90,7 @@ static void color_picker_cursor_update (Tool *, GdkEventMotion *, gpointer); static void color_picker_control (Tool *, ToolAction, gpointer); static void color_picker_info_window_close_callback (GtkWidget *, gpointer); -static void color_picker_info_update (Tool *, int); +static void color_picker_info_update (Tool *, gboolean); /* functions */ @@ -123,7 +120,7 @@ color_picker_options_new (void) GtkWidget *scale; /* the new color picker tool options structure */ - options = (ColorPickerOptions *) g_malloc (sizeof (ColorPickerOptions)); + options = g_new (ColorPickerOptions, 1); tool_options_init ((ToolOptions *) options, _("Color Picker Options"), color_picker_options_reset); @@ -201,8 +198,8 @@ color_picker_button_press (Tool *tool, gpointer gdisp_ptr) { GDisplay * gdisp; - ColourPickerTool *cp_tool; - int x, y; + ColorPickerTool *cp_tool; + gint x, y; static ActionAreaItem action_items[] = { @@ -210,23 +207,20 @@ color_picker_button_press (Tool *tool, }; gdisp = (GDisplay *) gdisp_ptr; - cp_tool = (ColourPickerTool *) tool->private; + cp_tool = (ColorPickerTool *) tool->private; - /* If this is the first invocation of the tool, or a different gdisplay, - * create (or recreate) the info dialog... - */ - if (tool->state == INACTIVE || gdisp_ptr != tool->gdisp_ptr || - active_drawable != gimage_active_drawable (gdisp->gimage)) - { - /* if the dialog exists, free it */ - if (color_picker_info) - info_dialog_free (color_picker_info); + /* Make the tool active and set it's gdisplay & drawable */ + tool->gdisp_ptr = gdisp; + tool->drawable = gimage_active_drawable (gdisp->gimage); + tool->state = ACTIVE; + /* create the info dialog if it doesn't exist */ + if (! color_picker_info) + { color_picker_info = info_dialog_new (_("Color Picker")); - active_drawable = gimage_active_drawable (gdisp->gimage); /* if the gdisplay is for a color image, the dialog must have RGB */ - switch (drawable_type (active_drawable)) + switch (drawable_type (tool->drawable)) { case RGB_GIMAGE: case RGBA_GIMAGE: info_dialog_add_label (color_picker_info, _("Red:"), red_buf); @@ -271,38 +265,36 @@ color_picker_button_press (Tool *tool, GDK_BUTTON_RELEASE_MASK), NULL, NULL, bevent->time); - /* Make the tool active and set the gdisplay which owns it */ - tool->gdisp_ptr = gdisp_ptr; - tool->state = ACTIVE; - /* First, transform the coordinates to gimp image space */ - gdisplay_untransform_coords (gdisp, bevent->x, bevent->y, &x, &y, FALSE, FALSE); + gdisplay_untransform_coords (gdisp, bevent->x, bevent->y, &x, &y, + FALSE, FALSE); /* if the shift key is down, create a new color. * otherwise, modify the current color. */ if (bevent->state & GDK_SHIFT_MASK) { - color_picker_info_update (tool, pick_color (gdisp->gimage, active_drawable, x, y, - color_picker_options->sample_merged, - color_picker_options->sample_average, - color_picker_options->average_radius, - COLOR_NEW)); + color_picker_info_update (tool, + pick_color (gdisp->gimage, tool->drawable, x, y, + color_picker_options->sample_merged, + color_picker_options->sample_average, + color_picker_options->average_radius, + COLOR_NEW)); update_type = COLOR_UPDATE_NEW; } else { - color_picker_info_update (tool, pick_color (gdisp->gimage, active_drawable, x, y, - color_picker_options->sample_merged, - color_picker_options->sample_average, - color_picker_options->average_radius, - COLOR_UPDATE)); + color_picker_info_update (tool, + pick_color (gdisp->gimage, tool->drawable, x, y, + color_picker_options->sample_merged, + color_picker_options->sample_average, + color_picker_options->average_radius, + COLOR_UPDATE)); update_type = COLOR_UPDATE; } - /* Start drawing the colourpicker tool */ + /* Start drawing the colorpicker tool */ draw_core_start (cp_tool->core, gdisp->canvas->window, tool); - } static void @@ -311,22 +303,24 @@ color_picker_button_release (Tool *tool, gpointer gdisp_ptr) { GDisplay *gdisp; - ColourPickerTool *cp_tool; - int x, y; + ColorPickerTool *cp_tool; + gint x, y; gdk_pointer_ungrab (bevent->time); gdk_flush (); gdisp = (GDisplay *) gdisp_ptr; - cp_tool = (ColourPickerTool *) tool->private; + cp_tool = (ColorPickerTool *) tool->private; /* First, transform the coordinates to gimp image space */ - gdisplay_untransform_coords (gdisp, bevent->x, bevent->y, &x, &y, FALSE, FALSE); + gdisplay_untransform_coords (gdisp, bevent->x, bevent->y, &x, &y, + FALSE, FALSE); - color_picker_info_update (tool, pick_color (gdisp->gimage, active_drawable, x, y, - color_picker_options->sample_merged, - color_picker_options->sample_average, - color_picker_options->average_radius, - update_type)); + color_picker_info_update (tool, + pick_color (gdisp->gimage, tool->drawable, x, y, + color_picker_options->sample_merged, + color_picker_options->sample_average, + color_picker_options->average_radius, + update_type)); draw_core_stop (cp_tool->core, tool); tool->state = INACTIVE; @@ -338,25 +332,30 @@ color_picker_motion (Tool *tool, gpointer gdisp_ptr) { GDisplay *gdisp; - ColourPickerTool *cp_tool; + ColorPickerTool *cp_tool; int x, y; gdisp = (GDisplay *) gdisp_ptr; - cp_tool = (ColourPickerTool *) tool->private; + cp_tool = (ColorPickerTool *) tool->private; /* undraw the current tool */ draw_core_pause (cp_tool->core, tool); /* First, transform the coordinates to gimp image space */ - gdisplay_untransform_coords (gdisp, mevent->x, mevent->y, &x, &y, FALSE, FALSE); + gdisplay_untransform_coords (gdisp, mevent->x, mevent->y, &x, &y, + FALSE, FALSE); - gdisplay_untransform_coords (gdisp, mevent->x, mevent->y, &cp_tool->centerx, &cp_tool->centery, FALSE, TRUE); + gdisplay_untransform_coords (gdisp, mevent->x, mevent->y, + &cp_tool->centerx, &cp_tool->centery, + FALSE, TRUE); + + color_picker_info_update (tool, + pick_color (gdisp->gimage, tool->drawable, x, y, + color_picker_options->sample_merged, + color_picker_options->sample_average, + color_picker_options->average_radius, + update_type)); - color_picker_info_update (tool, pick_color (gdisp->gimage, active_drawable, x, y, - color_picker_options->sample_merged, - color_picker_options->sample_average, - color_picker_options->average_radius, - update_type)); /* redraw the current tool */ draw_core_resume (cp_tool->core, tool); } @@ -371,7 +370,9 @@ color_picker_cursor_update (Tool *tool, gdisp = (GDisplay *) gdisp_ptr; - gdisplay_untransform_coords (gdisp, mevent->x, mevent->y, &x, &y, FALSE, FALSE); + gdisplay_untransform_coords (gdisp, mevent->x, mevent->y, &x, &y, + FALSE, FALSE); + if (gimage_pick_correlate_layer (gdisp->gimage, x, y)) gdisplay_install_tool_cursor (gdisp, GIMP_COLOR_PICKER_CURSOR); else @@ -383,9 +384,9 @@ color_picker_control (Tool *tool, ToolAction action, gpointer gdisp_ptr) { - ColourPickerTool * cp_tool; + ColorPickerTool * cp_tool; - cp_tool = (ColourPickerTool *) tool->private; + cp_tool = (ColorPickerTool *) tool->private; switch (action) { @@ -408,20 +409,20 @@ color_picker_control (Tool *tool, typedef guchar * (*GetColorFunc) (GtkObject *, int, int); -int -pick_color (GimpImage *gimage, +gboolean +pick_color (GimpImage *gimage, GimpDrawable *drawable, - int x, - int y, - gboolean sample_merged, - gboolean sample_average, - double average_radius, - int final) + gint x, + gint y, + gboolean sample_merged, + gboolean sample_average, + gdouble average_radius, + gint final) { guchar *color; - int offx, offy; - int has_alpha; - int is_indexed; + gint offx, offy; + gint has_alpha; + gint is_indexed; GetColorFunc get_color_func; GtkObject *get_color_obj; @@ -456,11 +457,11 @@ pick_color (GimpImage *gimage, if (sample_average) { - int i, j; - int count = 0; - int color_avg[4] = { 0, 0, 0, 0 }; + gint i, j; + gint count = 0; + gint color_avg[4] = { 0, 0, 0, 0 }; guchar *tmp_color; - int radius = (int) average_radius; + gint radius = (gint) average_radius; for (i = x - radius; i <= x + radius; i++) for (j = y - radius; j <= y + radius; j++) @@ -496,70 +497,70 @@ pick_color (GimpImage *gimage, palette_set_active_color (col_value [RED_PIX], col_value [GREEN_PIX], col_value [BLUE_PIX], final); - g_free(color); + g_free (color); return TRUE; } static void -colourpicker_draw (Tool *tool) +colorpicker_draw (Tool *tool) { GDisplay * gdisp; - ColourPickerTool * cp_tool; - int tx, ty; - int radiusx,radiusy; - int cx,cy; + ColorPickerTool * cp_tool; + gint tx, ty; + gint radiusx, radiusy; + gint cx, cy; if(!color_picker_options->sample_average) return; gdisp = (GDisplay *) tool->gdisp_ptr; - cp_tool = (ColourPickerTool *) tool->private; + cp_tool = (ColorPickerTool *) tool->private; gdisplay_transform_coords (gdisp, cp_tool->centerx, cp_tool->centery, - &tx, &ty, 1); + &tx, &ty, TRUE); - radiusx = SCALEX(gdisp,color_picker_options->average_radius); - radiusy = SCALEY(gdisp,color_picker_options->average_radius); - cx = SCALEX(gdisp,1); - cy = SCALEY(gdisp,1); + radiusx = SCALEX (gdisp, color_picker_options->average_radius); + radiusy = SCALEY (gdisp, color_picker_options->average_radius); + cx = SCALEX (gdisp, 1); + cy = SCALEY (gdisp, 1); /* Draw the circle around the collecting area */ - gdk_draw_rectangle(cp_tool->core->win, cp_tool->core->gc, 0, - tx - radiusx, - ty - radiusy, - 2*radiusx+cx, 2*radiusy+cy); + gdk_draw_rectangle (cp_tool->core->win, cp_tool->core->gc, 0, + tx - radiusx, + ty - radiusy, + 2 * radiusx + cx, 2 * radiusy + cy); if(radiusx > 1 && radiusy > 1) { - gdk_draw_rectangle(cp_tool->core->win, cp_tool->core->gc, 0, - tx - radiusx+2, - ty - radiusy+2, - 2*radiusx+cx-4, 2*radiusy+cy-4); + gdk_draw_rectangle (cp_tool->core->win, cp_tool->core->gc, 0, + tx - radiusx + 2, + ty - radiusy + 2, + 2 * radiusx + cx - 4, 2 * radiusy + cy - 4); } } static void -color_picker_info_update (Tool *tool, - int valid) +color_picker_info_update (Tool *tool, + gboolean valid) { if (!valid) { - g_snprintf (red_buf, MAX_INFO_BUF, _("N/A")); + g_snprintf (red_buf, MAX_INFO_BUF, _("N/A")); g_snprintf (green_buf, MAX_INFO_BUF, _("N/A")); - g_snprintf (blue_buf, MAX_INFO_BUF, _("N/A")); + g_snprintf (blue_buf, MAX_INFO_BUF, _("N/A")); g_snprintf (alpha_buf, MAX_INFO_BUF, _("N/A")); g_snprintf (index_buf, MAX_INFO_BUF, _("N/A")); - g_snprintf (gray_buf, MAX_INFO_BUF, _("N/A")); - g_snprintf (hex_buf, MAX_INFO_BUF, _("N/A")); + g_snprintf (gray_buf, MAX_INFO_BUF, _("N/A")); + g_snprintf (hex_buf, MAX_INFO_BUF, _("N/A")); } else { switch (sample_type) { case RGB_GIMAGE: case RGBA_GIMAGE: - g_snprintf (red_buf, MAX_INFO_BUF, "%d", col_value [RED_PIX]); + g_snprintf (red_buf, MAX_INFO_BUF, "%d", col_value [RED_PIX]); g_snprintf (green_buf, MAX_INFO_BUF, "%d", col_value [GREEN_PIX]); - g_snprintf (blue_buf, MAX_INFO_BUF, "%d", col_value [BLUE_PIX]); + g_snprintf (blue_buf, MAX_INFO_BUF, "%d", col_value [BLUE_PIX]); if (sample_type == RGBA_GIMAGE) g_snprintf (alpha_buf, MAX_INFO_BUF, "%d", col_value [ALPHA_PIX]); else @@ -576,10 +577,10 @@ color_picker_info_update (Tool *tool, g_snprintf (alpha_buf, MAX_INFO_BUF, "%d", col_value [ALPHA_PIX]); else g_snprintf (alpha_buf, MAX_INFO_BUF, _("N/A")); - g_snprintf (red_buf, MAX_INFO_BUF, "%d", col_value [RED_PIX]); + g_snprintf (red_buf, MAX_INFO_BUF, "%d", col_value [RED_PIX]); g_snprintf (green_buf, MAX_INFO_BUF, "%d", col_value [GREEN_PIX]); - g_snprintf (blue_buf, MAX_INFO_BUF, "%d", col_value [BLUE_PIX]); - g_snprintf (hex_buf, MAX_INFO_BUF, "#%.2x%.2x%.2x", + g_snprintf (blue_buf, MAX_INFO_BUF, "%d", col_value [BLUE_PIX]); + g_snprintf (hex_buf, MAX_INFO_BUF, "#%.2x%.2x%.2x", col_value [RED_PIX], col_value [GREEN_PIX], col_value [BLUE_PIX]); @@ -603,11 +604,18 @@ color_picker_info_update (Tool *tool, info_dialog_popup (color_picker_info); } +static void +color_picker_info_window_close_callback (GtkWidget *widget, + gpointer client_data) +{ + info_dialog_popdown ((InfoDialog *) client_data); +} + Tool * tools_new_color_picker () { Tool * tool; - ColourPickerTool * private; + ColorPickerTool * private; /* The tool options */ if (! color_picker_options) @@ -617,9 +625,11 @@ tools_new_color_picker () } tool = tools_new_tool (COLOR_PICKER); - private = (ColourPickerTool *) g_malloc(sizeof(ColourPickerTool)); + private = g_new (ColorPickerTool, 1); + + private->core = draw_core_new (colorpicker_draw); - private->core = draw_core_new (colourpicker_draw); + tool->preserve = FALSE; /* Don't preserve on drawable change */ tool->private = (void *) private; @@ -635,9 +645,9 @@ tools_new_color_picker () void tools_free_color_picker (Tool *tool) { - ColourPickerTool * cp_tool; + ColorPickerTool * cp_tool; - cp_tool = (ColourPickerTool *) tool->private; + cp_tool = (ColorPickerTool *) tool->private; if (tool->state == ACTIVE) draw_core_stop (cp_tool->core, tool); @@ -652,10 +662,3 @@ tools_free_color_picker (Tool *tool) g_free (cp_tool); } - -static void -color_picker_info_window_close_callback (GtkWidget *widget, - gpointer client_data) -{ - info_dialog_popdown ((InfoDialog *) client_data); -} diff --git a/app/color_picker.h b/app/color_picker.h index fe417be31c..c15cf9941e 100644 --- a/app/color_picker.h +++ b/app/color_picker.h @@ -22,12 +22,18 @@ #include "gimpdrawableF.h" #include "tools.h" -int pick_color (GimpImage *, GimpDrawable *, int , int, - gboolean, gboolean, double, int); +gboolean pick_color (GimpImage *gimage, + GimpDrawable *drawable, + gint x, + gint y, + gboolean sample_merged, + gboolean sample_average, + double average_radius, + gint final); -Tool * tools_new_color_picker (void); -void tools_free_color_picker (Tool *); +Tool * tools_new_color_picker (void); +void tools_free_color_picker (Tool *tool); -extern int col_value[5]; +extern gint col_value[5]; #endif /* __COLOR_PICKER_H__ */ diff --git a/app/dialogs/info-dialog.c b/app/dialogs/info-dialog.c index f66c5a4910..696269404a 100644 --- a/app/dialogs/info-dialog.c +++ b/app/dialogs/info-dialog.c @@ -43,14 +43,14 @@ info_field_new (InfoDialog *idialog, { GtkWidget *label; InfoField *field; - int row; + gint row; - field = (InfoField *) g_malloc (sizeof (InfoField)); + field = g_new (InfoField, 1); row = idialog->nfields + 1; gtk_table_resize (GTK_TABLE (idialog->info_table), 2, row); - label = gtk_label_new (gettext (title)); + label = gtk_label_new (title); gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5); gtk_table_attach (GTK_TABLE (idialog->info_table), label, 0, 1, row - 1, row, @@ -149,13 +149,13 @@ info_dialog_new (char *title) GtkWidget *vbox; GtkWidget *info_table; - idialog = (InfoDialog *) g_malloc (sizeof (InfoDialog)); + idialog = g_new (InfoDialog, 1); idialog->field_list = NULL; idialog->nfields = 0; shell = gtk_dialog_new (); gtk_window_set_wmclass (GTK_WINDOW (shell), "info_dialog", "Gimp"); - gtk_window_set_title (GTK_WINDOW (shell), gettext(title)); + gtk_window_set_title (GTK_WINDOW (shell), title); session_set_window_geometry (shell, &info_dialog_session_info, FALSE ); gtk_signal_connect (GTK_OBJECT (shell), "delete_event", diff --git a/app/gradient.c b/app/gradient.c index 01cb35da0a..e8752b2553 100644 --- a/app/gradient.c +++ b/app/gradient.c @@ -19,7 +19,6 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - /* alt: Added previews and some other buttons to gradient dialog. * * hof: Hofer Wolfgang, 1998.01.27 avoid resize bug by keeping @@ -38,7 +37,6 @@ * Many thanks to Eiichi and Marcelo for their suggestions! */ - /* Release date: 1997/05/07 * * - Added accelerator keys for the popup functions. This allows for @@ -52,7 +50,6 @@ * - Added grad_dump_gradient(); it is useful for debugging. */ - /* Release date: 1997/04/30 * * - All `dangerous' dialogs now de-sensitize the main editor window. @@ -67,7 +64,6 @@ * for debugging). */ - /* Release date: 1997/04/22 * * - Added GtkRadioMenuItems to the blending and coloring pop-up @@ -81,7 +77,6 @@ * know why nobody killed me for not having done it before. */ - /* Release date: 1997/04/21 * * - Re-wrote the old pop-up menu code, which was *horrible*. The @@ -104,7 +99,6 @@ * them. */ - /* Special thanks to: * * Luis Albarran (luis4@mindspring.com) - Nice UI suggestions @@ -119,7 +113,6 @@ * Everyone on #gimp - many suggestions */ - /* TODO: * * - Fix memory leaks: grad_free_gradient_editor() and any others @@ -174,6 +167,9 @@ #include "libgimp/gimpintl.h" +#include "pixmaps/zoom_in.xpm" +#include "pixmaps/zoom_out.xpm" + /***** Magic numbers *****/ #ifndef M_PI @@ -193,9 +189,9 @@ static GtkWidget *ed_create_button (gchar *label, static void ed_fetch_foreground (double *fg_r, double *fg_g, double *fg_b, double *fg_a); -static void ed_update_editor (int flags); +static void ed_update_editor (int flags); -static void ed_set_hint (char *str); +static void ed_set_hint (gchar *str); static void ed_list_item_update (GtkWidget *widget, @@ -206,14 +202,13 @@ static void ed_list_item_update (GtkWidget *widget, static void ed_initialize_saved_colors (void); -static gint ed_delete_callback (GtkWidget *, GdkEvent *, gpointer); -static void ed_close_callback (GtkWidget *, gpointer); +/* Main dialog button callbacks & functions */ -static void ed_new_gradient_callback (GtkWidget *, gpointer); -static void ed_do_new_gradient_callback (GtkWidget *, gpointer , gpointer); +static void ed_new_gradient_callback (GtkWidget *, gpointer); +static void ed_do_new_gradient_callback (GtkWidget *, gpointer , gpointer); -static void ed_copy_gradient_callback (GtkWidget *, gpointer); -static void ed_do_copy_gradient_callback (GtkWidget *, gpointer , gpointer); +static void ed_copy_gradient_callback (GtkWidget *, gpointer); +static void ed_do_copy_gradient_callback (GtkWidget *, gpointer , gpointer); static void ed_delete_gradient_callback (GtkWidget *, gpointer); static void ed_do_delete_gradient_callback (GtkWidget *, gpointer); @@ -224,12 +219,18 @@ static gint ed_delete_delete_gradient_callback (GtkWidget *, GdkEvent *, static void ed_rename_gradient_callback (GtkWidget *, gpointer); static void ed_do_rename_gradient_callback (GtkWidget *, gpointer, gpointer); -static void ed_save_pov_callback (GtkWidget *, gpointer); -static void ed_do_save_pov_callback (GtkWidget *, gpointer); -static void ed_cancel_save_pov_callback (GtkWidget *, gpointer); +static void ed_save_pov_callback (GtkWidget *, gpointer); +static void ed_do_save_pov_callback (GtkWidget *, gpointer); +static void ed_cancel_save_pov_callback (GtkWidget *, gpointer); +static gint ed_delete_save_pov_callback (GtkWidget *, GdkEvent *, gpointer); -static void ed_save_grads_callback (GtkWidget *, gpointer); -static void ed_refresh_grads_callback (GtkWidget *, gpointer); +static void ed_save_grads_callback (GtkWidget *, gpointer); +static void ed_refresh_grads_callback (GtkWidget *, gpointer); + +static gint ed_delete_callback (GtkWidget *, GdkEvent *, gpointer); +static void ed_close_callback (GtkWidget *, gpointer); + +/* Zoom, scrollbar & instant update callbacks */ static void ed_scrollbar_update (GtkAdjustment *, gpointer); static void ed_zoom_all_callback (GtkWidget *, gpointer); @@ -239,354 +240,421 @@ static void ed_instant_update_update (GtkWidget *, gpointer); /* Gradient preview functions */ -static gint prev_events(GtkWidget *widget, GdkEvent *event); -static void prev_set_hint(gint x); +static gint prev_events (GtkWidget *, GdkEvent *, gpointer); +static void prev_set_hint (gint x); static void prev_set_foreground (gint x); static void prev_set_background (gint x); -static void prev_update(int recalculate); -static void prev_fill_image(int width, int height, double left, double right); +static void prev_update (gboolean recalculate); +static void prev_fill_image (int width, int height, + double left, double right); /* Gradient control functions */ -static gint control_events(GtkWidget *widget, GdkEvent *event); -static void control_do_hint(gint x, gint y); -static void control_button_press(gint x, gint y, guint button, guint state); -static int control_point_in_handle(gint x, gint y, grad_segment_t *seg, control_drag_mode_t handle); -static void control_select_single_segment(grad_segment_t *seg); -static void control_extend_selection(grad_segment_t *seg, double pos); -static void control_motion(gint x); - -static void control_compress_left(grad_segment_t *range_l, grad_segment_t *range_r, - grad_segment_t *drag_seg, double pos); -static void control_compress_range(grad_segment_t *range_l, grad_segment_t *range_r, - double new_l, double new_r); - -static double control_move(grad_segment_t *range_l, grad_segment_t *range_r, double delta); - -static void control_update(int recalculate); -static void control_draw(GdkPixmap *pixmap, int width, int height, double left, double right); -static void control_draw_normal_handle(GdkPixmap *pixmap, double pos, int height); -static void control_draw_middle_handle(GdkPixmap *pixmap, double pos, int height); -static void control_draw_handle(GdkPixmap *pixmap, GdkGC *border_gc, GdkGC *fill_gc, int xpos, int height); -static int control_calc_p_pos(double pos); -static double control_calc_g_pos(int pos); +static gint control_events (GtkWidget *, GdkEvent *, gpointer); +static void control_do_hint (gint x, gint y); +static void control_button_press (gint x, gint y, + guint button, guint state); +static int control_point_in_handle (gint x, gint y, grad_segment_t *seg, + control_drag_mode_t handle); +static void control_select_single_segment (grad_segment_t *seg); +static void control_extend_selection (grad_segment_t *seg, double pos); +static void control_motion (gint x); + +static void control_compress_left (grad_segment_t *range_l, + grad_segment_t *range_r, + grad_segment_t *drag_seg, + double pos); +static void control_compress_range (grad_segment_t *range_l, + grad_segment_t *range_r, + double new_l, double new_r); + +static double control_move (grad_segment_t *range_l, + grad_segment_t *range_r, + double delta); + +/* Control update/redraw functions */ + +static void control_update (gboolean recalculate); +static void control_draw (GdkPixmap *pixmap, + int width, int height, + double left, double right); +static void control_draw_normal_handle (GdkPixmap *pixmap, + double pos, int height); +static void control_draw_middle_handle (GdkPixmap *pixmap, + double pos, int height); +static void control_draw_handle (GdkPixmap *pixmap, + GdkGC *border_gc, GdkGC *fill_gc, + int xpos, int height); + +static int control_calc_p_pos (double pos); +static double control_calc_g_pos (int pos); /* Control popup functions */ -static void cpopup_create_main_menu(void); -static void cpopup_do_popup(void); -static GtkWidget *cpopup_create_color_item(GtkWidget **color_box, GtkWidget **label); -static void cpopup_adjust_menus(void); -static void cpopup_adjust_blending_menu(void); -static void cpopup_adjust_coloring_menu(void); -static void cpopup_check_selection_params(int *equal_blending, int *equal_coloring); -static GtkWidget *cpopup_create_menu_item_with_label(char *str, GtkWidget **label); -static void cpopup_render_color_box(GtkPreview *preview, double r, double g, double b, double a); - -static GtkWidget *cpopup_create_load_menu(GtkWidget **color_boxes, GtkWidget **labels, - char *label1, char *label2, GtkSignalFunc callback, - gchar accel_key_0, guint8 accel_mods_0, - gchar accel_key_1, guint8 accel_mods_1, - gchar accel_key_2, guint8 accel_mods_2); -static GtkWidget *cpopup_create_save_menu(GtkWidget **color_boxes, GtkWidget **labels, GtkSignalFunc callback); -static void cpopup_update_saved_color(int n, double r, double g, double b, double a); -static void cpopup_load_left_callback(GtkWidget *widget, gpointer data); -static void cpopup_save_left_callback(GtkWidget *widget, gpointer data); -static void cpopup_load_right_callback(GtkWidget *widget, gpointer data); -static void cpopup_save_right_callback(GtkWidget *widget, gpointer data); - -static GtkWidget *cpopup_create_blending_menu(void); -static void cpopup_blending_callback(GtkWidget *widget, gpointer data); -static GtkWidget *cpopup_create_coloring_menu(void); -static void cpopup_coloring_callback(GtkWidget *widget, gpointer data); - -static GtkWidget *cpopup_create_sel_ops_menu(void); - -static void cpopup_blend_colors(GtkWidget *widget, gpointer data); -static void cpopup_blend_opacity(GtkWidget *widget, gpointer data); - -static void cpopup_set_color_selection_color(GtkColorSelection *cs, - double r, double g, double b, double a); -static void cpopup_get_color_selection_color(GtkColorSelection *cs, - double *r, double *g, double *b, double *a); - -static void cpopup_create_color_dialog(char *title, double r, double g, double b, double a, - GtkSignalFunc color_changed_callback, - GtkSignalFunc ok_callback, - GtkSignalFunc cancel_callback, - GtkSignalFunc delete_callback); - -static grad_segment_t *cpopup_save_selection(void); -static void cpopup_free_selection(grad_segment_t *seg); -static void cpopup_replace_selection(grad_segment_t *replace_seg); - -static void cpopup_set_left_color_callback(GtkWidget *widget, gpointer data); -static void cpopup_left_color_changed(GtkWidget *widget, gpointer client_data); -static void cpopup_left_color_dialog_ok(GtkWidget *widget, gpointer client_data); -static void cpopup_left_color_dialog_cancel(GtkWidget *widget, gpointer client_data); -static int cpopup_left_color_dialog_delete(GtkWidget *widget, GdkEvent *event, gpointer data); -static void cpopup_set_right_color_callback(GtkWidget *widget, gpointer data); -static void cpopup_right_color_changed(GtkWidget *widget, gpointer client_data); -static void cpopup_right_color_dialog_ok(GtkWidget *widget, gpointer client_data); -static void cpopup_right_color_dialog_cancel(GtkWidget *widget, gpointer client_data); -static int cpopup_right_color_dialog_delete(GtkWidget *widget, GdkEvent *event, gpointer data); - -static void cpopup_split_midpoint_callback(GtkWidget *widget, gpointer data); -static void cpopup_split_uniform_callback(GtkWidget *widget, gpointer data); -static void cpopup_delete_callback(GtkWidget *widget, gpointer data); -static void cpopup_recenter_callback(GtkWidget *widget, gpointer data); -static void cpopup_redistribute_callback(GtkWidget *widget, gpointer data); -static void cpopup_flip_callback(GtkWidget *widget, gpointer data); -static void cpopup_replicate_callback(GtkWidget *widget, gpointer data); - -static void cpopup_split_uniform_scale_update(GtkAdjustment *adjustment, gpointer data); -static void cpopup_split_uniform_split_callback(GtkWidget *widget, gpointer client_data); -static void cpopup_split_uniform_cancel_callback(GtkWidget *widget, gpointer client_data); - -static void cpopup_replicate_scale_update(GtkAdjustment *adjustment, gpointer data); -static void cpopup_do_replicate_callback(GtkWidget *widget, gpointer client_data); -static void cpopup_replicate_cancel_callback(GtkWidget *widget, gpointer client_data); - -static void cpopup_blend_endpoints(double r0, double g0, double b0, double a0, - double r1, double g1, double b1, double a1, - int blend_colors, int blend_opacity); -static void cpopup_split_midpoint(grad_segment_t *lseg, grad_segment_t **newl, grad_segment_t **newr); -static void cpopup_split_uniform(grad_segment_t *lseg, int parts, - grad_segment_t **newl, grad_segment_t **newr); +static void cpopup_create_main_menu (void); +static void cpopup_do_popup (void); + +static GtkWidget *cpopup_create_color_item (GtkWidget **color_box, + GtkWidget **label); +static GtkWidget *cpopup_create_menu_item_with_label (gchar *str, + GtkWidget **label); + +static void cpopup_adjust_menus (void); +static void cpopup_adjust_blending_menu (void); +static void cpopup_adjust_coloring_menu (void); +static void cpopup_check_selection_params (gint *equal_blending, + gint *equal_coloring); + +static void cpopup_render_color_box (GtkPreview *preview, + double r, double g, double b, double a); + +static GtkWidget *cpopup_create_load_menu (GtkWidget **color_boxes, + GtkWidget **labels, + gchar *label1, gchar *label2, + GtkSignalFunc callback, + gchar accel_key_0, + guint8 accel_mods_0, + gchar accel_key_1, + guint8 accel_mods_1, + gchar accel_key_2, + guint8 accel_mods_2); +static GtkWidget *cpopup_create_save_menu (GtkWidget **color_boxes, + GtkWidget **labels, + GtkSignalFunc callback); + +static void cpopup_update_saved_color (int n, + double r, double g, double b, double a); + +static void cpopup_load_left_callback (GtkWidget *, gpointer); +static void cpopup_save_left_callback (GtkWidget *, gpointer); +static void cpopup_load_right_callback (GtkWidget *, gpointer); +static void cpopup_save_right_callback (GtkWidget *, gpointer); + +static void cpopup_set_color_selection_color (GtkColorSelection *cs, + double r, double g, + double b, double a); +static void cpopup_get_color_selection_color (GtkColorSelection *cs, + double *r, double *g, + double *b, double *a); + +static grad_segment_t *cpopup_save_selection (void); +static void cpopup_free_selection (grad_segment_t *seg); +static void cpopup_replace_selection (grad_segment_t *replace_seg); + +/* ----- */ + +static void cpopup_create_color_dialog (gchar *title, + double r, double g, double b, double a, + GtkSignalFunc color_changed_callback, + GtkSignalFunc ok_callback, + GtkSignalFunc cancel_callback, + GtkSignalFunc delete_callback); + +static void cpopup_set_left_color_callback (GtkWidget *, gpointer); +static void cpopup_left_color_changed (GtkWidget *, gpointer); +static void cpopup_left_color_dialog_ok (GtkWidget *, gpointer); +static void cpopup_left_color_dialog_cancel (GtkWidget *, gpointer); +static int cpopup_left_color_dialog_delete (GtkWidget *, GdkEvent *, + gpointer); + +static void cpopup_set_right_color_callback (GtkWidget *, gpointer); +static void cpopup_right_color_changed (GtkWidget *, gpointer); +static void cpopup_right_color_dialog_ok (GtkWidget *, gpointer); +static void cpopup_right_color_dialog_cancel (GtkWidget *, gpointer); +static int cpopup_right_color_dialog_delete (GtkWidget *, GdkEvent *, + gpointer); + +/* ----- */ + +static GtkWidget *cpopup_create_blending_menu (void); +static void cpopup_blending_callback (GtkWidget *, gpointer); +static GtkWidget *cpopup_create_coloring_menu (void); +static void cpopup_coloring_callback (GtkWidget *, gpointer); + +/* ----- */ + +static void cpopup_split_midpoint_callback (GtkWidget *, gpointer); +static void cpopup_split_midpoint (grad_segment_t *lseg, grad_segment_t **newl, + grad_segment_t **newr); + +static void cpopup_split_uniform_callback (GtkWidget *, gpointer); +static void cpopup_split_uniform_scale_update (GtkAdjustment *, gpointer); +static void cpopup_split_uniform_split_callback (GtkWidget *, gpointer); +static void cpopup_split_uniform_cancel_callback (GtkWidget *, gpointer); +static gint cpopup_split_uniform_delete_callback (GtkWidget *, GdkEvent *, + gpointer); +static void cpopup_split_uniform (grad_segment_t *lseg, int parts, + grad_segment_t **newl, grad_segment_t **newr); + +static void cpopup_delete_callback (GtkWidget *, gpointer); +static void cpopup_recenter_callback (GtkWidget *, gpointer); +static void cpopup_redistribute_callback (GtkWidget *, gpointer); + +/* Control popup -> Selection operations functions */ + +static GtkWidget * cpopup_create_sel_ops_menu (void); + +static void cpopup_flip_callback (GtkWidget *, gpointer); + +static void cpopup_replicate_callback (GtkWidget *, gpointer); +static void cpopup_replicate_scale_update (GtkAdjustment *, gpointer); +static void cpopup_do_replicate_callback (GtkWidget *, gpointer); +static void cpopup_replicate_cancel_callback (GtkWidget *, gpointer); +static gint cpopup_replicate_delete_callback (GtkWidget *, GdkEvent *, + gpointer); + +static void cpopup_blend_colors (GtkWidget *, gpointer); +static void cpopup_blend_opacity (GtkWidget *, gpointer); + +/* Blend function */ + +static void cpopup_blend_endpoints (double r0, double g0, double b0, double a0, + double r1, double g1, double b1, double a1, + int blend_colors, int blend_opacity); /* Gradient functions */ -static gradient_t *grad_new_gradient(void); -static void grad_free_gradient(gradient_t *grad); -static void grad_free_gradients(void); -static void grad_load_gradient(char *filename); -static void grad_save_gradient(gradient_t *grad, char *filename); -static void grad_save_all(int need_free); +static gradient_t *grad_new_gradient (void); +static void grad_free_gradient (gradient_t *grad); +static void grad_free_gradients (void); +static void grad_load_gradient (char *filename); +static void grad_save_gradient (gradient_t *grad, + char *filename); +static void grad_save_all (int need_free); -static gradient_t *grad_create_default_gradient(void); +static gradient_t *grad_create_default_gradient (void); -static int grad_insert_in_gradients_list(gradient_t *grad); +static int grad_insert_in_gradients_list (gradient_t *grad); -static void grad_dump_gradient(gradient_t *grad, FILE *file); +static void grad_dump_gradient (gradient_t *grad, FILE *file); /* Segment functions */ -static grad_segment_t *seg_new_segment(void); -static void seg_free_segment(grad_segment_t *seg); -static void seg_free_segments(grad_segment_t *seg); +static grad_segment_t *seg_new_segment (void); +static void seg_free_segment (grad_segment_t *seg); +static void seg_free_segments (grad_segment_t *seg); -static grad_segment_t *seg_get_segment_at(gradient_t *grad, double pos); -static grad_segment_t *seg_get_last_segment(grad_segment_t *seg); -static void seg_get_closest_handle(gradient_t *grad, double pos, - grad_segment_t **seg, control_drag_mode_t *handle); +static grad_segment_t *seg_get_segment_at (gradient_t *grad, double pos); +static grad_segment_t *seg_get_last_segment (grad_segment_t *seg); +static void seg_get_closest_handle (gradient_t *grad, double pos, + grad_segment_t **seg, + control_drag_mode_t *handle); /* Calculation functions */ -static double calc_linear_factor(double middle, double pos); -static double calc_curved_factor(double middle, double pos); -static double calc_sine_factor(double middle, double pos); -static double calc_sphere_increasing_factor(double middle, double pos); -static double calc_sphere_decreasing_factor(double middle, double pos); +static double calc_linear_factor (double middle, double pos); +static double calc_curved_factor (double middle, double pos); +static double calc_sine_factor (double middle, double pos); +static double calc_sphere_increasing_factor (double middle, double pos); +static double calc_sphere_decreasing_factor (double middle, double pos); -static void calc_rgb_to_hsv(double *r, double *g, double *b); -static void calc_hsv_to_rgb(double *h, double *s, double *v); +static void calc_rgb_to_hsv (double *r, double *g, double *b); +static void calc_hsv_to_rgb (double *h, double *s, double *v); /* Files and paths functions */ -static char *build_user_filename(char *name, char *path_str); - +static gchar *build_user_filename (char *name, char *path_str); /***** Local variables *****/ -GdkColor black; -int num_gradients = 0; -gradient_t *curr_gradient = NULL; /* The active gradient */ -GSList *gradients_list = NULL; /* The list of gradients */ -gradient_t *grad_default_gradient = NULL; -gradient_editor_t *g_editor = NULL; /* The gradient editor */ - -static const char *blending_types[] = { - N_("Linear"), - N_("Curved"), - N_("Sinusoidal"), - N_("Spherical (increasing)"), - N_("Spherical (decreasing)") -}; /* blending_types */ +GdkColor black; +gint num_gradients = 0; +gradient_t * curr_gradient = NULL; /* The active gradient */ +GSList * gradients_list = NULL; /* The list of gradients */ +gradient_t * grad_default_gradient = NULL; +gradient_editor_t * g_editor = NULL; /* The gradient editor */ -static const char *coloring_types[] = { - N_("Plain RGB"), - N_("HSV (counter-clockwise hue)"), - N_("HSV (clockwise hue)") -}; /* coloring_types */ +static const gchar *blending_types[] = +{ + N_("Linear"), + N_("Curved"), + N_("Sinusoidal"), + N_("Spherical (increasing)"), + N_("Spherical (decreasing)") +}; +static const gchar *coloring_types[] = +{ + N_("Plain RGB"), + N_("HSV (counter-clockwise hue)"), + N_("HSV (clockwise hue)") +}; /***** Public functions *****/ /*****/ void -gradients_init(int no_data) +gradients_init (int no_data) { - if(!no_data) - datafiles_read_directories(gradient_path, grad_load_gradient, 0); + if (!no_data) + datafiles_read_directories (gradient_path, grad_load_gradient, 0); if (grad_default_gradient != NULL) curr_gradient = grad_default_gradient; else if (gradients_list != NULL) curr_gradient = (gradient_t *) gradients_list->data; - else { - curr_gradient = grad_create_default_gradient(); - curr_gradient->name = g_strdup(_("Default")); - curr_gradient->filename = build_user_filename(curr_gradient->name, gradient_path); - curr_gradient->dirty = FALSE; - - grad_insert_in_gradients_list(curr_gradient); - } /* else */ -} /* gradients_init */ + else + { + curr_gradient = grad_create_default_gradient (); + curr_gradient->name = g_strdup (_("Default")); + curr_gradient->filename = + build_user_filename (curr_gradient->name, gradient_path); + curr_gradient->dirty = FALSE; + grad_insert_in_gradients_list (curr_gradient); + } +} /*****/ void -gradients_free(void) +gradients_free (void) { - grad_free_gradients(); -} /* gradients_free */ - + grad_free_gradients (); +} /*****/ void -grad_get_color_at(double pos, double *r, double *g, double *b, double *a) +grad_get_color_at (double pos, + double *r, double *g, double *b, double *a) { - double factor; - grad_segment_t *seg; - double seg_len, middle; - double h0, s0, v0; - double h1, s1, v1; - - /* if there is no gradient return a totally transparent black */ - if (curr_gradient == NULL) - { - r = 0; g = 0; b = 0; a = 0; - return; - } - - if (pos < 0.0) - pos = 0.0; - else if (pos > 1.0) - pos = 1.0; - - seg = seg_get_segment_at(curr_gradient, pos); - - seg_len = seg->right - seg->left; - - if (seg_len < EPSILON) { - middle = 0.5; - pos = 0.5; - } else { - middle = (seg->middle - seg->left) / seg_len; - pos = (pos - seg->left) / seg_len; - } /* else */ + double factor = 0.0; + grad_segment_t *seg; + double seg_len, middle; + double h0, s0, v0; + double h1, s1, v1; - switch (seg->type) { - case GRAD_LINEAR: - factor = calc_linear_factor(middle, pos); - break; + /* if there is no gradient return a totally transparent black */ + if (curr_gradient == NULL) + { + r = 0; g = 0; b = 0; a = 0; + return; + } - case GRAD_CURVED: - factor = calc_curved_factor(middle, pos); - break; + if (pos < 0.0) + pos = 0.0; + else if (pos > 1.0) + pos = 1.0; - case GRAD_SINE: - factor = calc_sine_factor(middle, pos); - break; + seg = seg_get_segment_at (curr_gradient, pos); - case GRAD_SPHERE_INCREASING: - factor = calc_sphere_increasing_factor(middle, pos); - break; + seg_len = seg->right - seg->left; - case GRAD_SPHERE_DECREASING: - factor = calc_sphere_decreasing_factor(middle, pos); - break; + if (seg_len < EPSILON) + { + middle = 0.5; + pos = 0.5; + } + else + { + middle = (seg->middle - seg->left) / seg_len; + pos = (pos - seg->left) / seg_len; + } - default: - grad_dump_gradient (curr_gradient, stderr); - gimp_fatal_error (_("grad_get_color_at(): Unknown gradient type %d"), - (int) seg->type); - factor = 0.0; /* Shut up -Wall */ - break; - } /* switch */ + switch (seg->type) + { + case GRAD_LINEAR: + factor = calc_linear_factor (middle, pos); + break; + + case GRAD_CURVED: + factor = calc_curved_factor (middle, pos); + break; + + case GRAD_SINE: + factor = calc_sine_factor (middle, pos); + break; + + case GRAD_SPHERE_INCREASING: + factor = calc_sphere_increasing_factor (middle, pos); + break; + + case GRAD_SPHERE_DECREASING: + factor = calc_sphere_decreasing_factor (middle, pos); + break; + + default: + grad_dump_gradient (curr_gradient, stderr); + gimp_fatal_error (_("grad_get_color_at(): Unknown gradient type %d"), + (int) seg->type); + break; + } - /* Calculate color components */ + /* Calculate color components */ - *a = seg->a0 + (seg->a1 - seg->a0) * factor; + *a = seg->a0 + (seg->a1 - seg->a0) * factor; - if (seg->color == GRAD_RGB) { - *r = seg->r0 + (seg->r1 - seg->r0) * factor; - *g = seg->g0 + (seg->g1 - seg->g0) * factor; - *b = seg->b0 + (seg->b1 - seg->b0) * factor; - } else { - h0 = seg->r0; - s0 = seg->g0; - v0 = seg->b0; - - h1 = seg->r1; - s1 = seg->g1; - v1 = seg->b1; - - calc_rgb_to_hsv(&h0, &s0, &v0); - calc_rgb_to_hsv(&h1, &s1, &v1); - - s0 = s0 + (s1 - s0) * factor; - v0 = v0 + (v1 - v0) * factor; - - switch (seg->color) { - case GRAD_HSV_CCW: - if (h0 < h1) - h0 = h0 + (h1 - h0) * factor; - else { - h0 = h0 + (1.0 - (h0 - h1)) * factor; - if (h0 > 1.0) - h0 -= 1.0; - } /* else */ + if (seg->color == GRAD_RGB) + { + *r = seg->r0 + (seg->r1 - seg->r0) * factor; + *g = seg->g0 + (seg->g1 - seg->g0) * factor; + *b = seg->b0 + (seg->b1 - seg->b0) * factor; + } + else + { + h0 = seg->r0; + s0 = seg->g0; + v0 = seg->b0; - break; + h1 = seg->r1; + s1 = seg->g1; + v1 = seg->b1; - case GRAD_HSV_CW: - if (h1 < h0) - h0 = h0 - (h0 - h1) * factor; - else { - h0 = h0 - (1.0 - (h1 - h0)) * factor; - if (h0 < 0.0) - h0 += 1.0; - } /* else */ + calc_rgb_to_hsv(&h0, &s0, &v0); + calc_rgb_to_hsv(&h1, &s1, &v1); - break; + s0 = s0 + (s1 - s0) * factor; + v0 = v0 + (v1 - v0) * factor; - default: - grad_dump_gradient (curr_gradient, stderr); - gimp_fatal_error (_("grad_get_color_at(): Unknown coloring mode %d"), - (int) seg->color); - break; - } /* switch */ + switch (seg->color) + { + case GRAD_HSV_CCW: + if (h0 < h1) + h0 = h0 + (h1 - h0) * factor; + else + { + h0 = h0 + (1.0 - (h0 - h1)) * factor; + if (h0 > 1.0) + h0 -= 1.0; + } + break; + + case GRAD_HSV_CW: + if (h1 < h0) + h0 = h0 - (h0 - h1) * factor; + else + { + h0 = h0 - (1.0 - (h1 - h0)) * factor; + if (h0 < 0.0) + h0 += 1.0; + } + break; + + default: + grad_dump_gradient (curr_gradient, stderr); + gimp_fatal_error (_("grad_get_color_at(): Unknown coloring mode %d"), + (int) seg->color); + break; + } - *r = h0; - *g = s0; - *b = v0; + *r = h0; + *g = s0; + *b = v0; - calc_hsv_to_rgb(r, g, b); - } /* else */ -} /* grad_get_color_at */ + calc_hsv_to_rgb (r, g, b); + } +} +/***** The main gradient editor dialog *****/ /*****/ - void grad_create_gradient_editor_init (gint need_show) { @@ -597,6 +665,10 @@ grad_create_gradient_editor_init (gint need_show) GtkWidget *frame; GtkWidget *scrolled_win; GdkColormap *colormap; + GtkWidget* pixmapwid; + GdkPixmap* pixmap; + GdkBitmap* mask; + GtkStyle* style; gint i; gint select_pos; @@ -631,10 +703,11 @@ grad_create_gradient_editor_init (gint need_show) /* Shell and main vbox */ g_editor->shell = gtk_dialog_new (); - gtk_window_set_wmclass (GTK_WINDOW (g_editor->shell), "gradient_editor", "Gimp"); + gtk_window_set_wmclass (GTK_WINDOW (g_editor->shell), + "gradient_editor", "Gimp"); gtk_window_set_title (GTK_WINDOW (g_editor->shell), _("Gradient Editor")); - /* handle window manager close signals */ + /* Handle the wm delete event */ gtk_signal_connect (GTK_OBJECT (g_editor->shell), "delete_event", GTK_SIGNAL_FUNC (ed_delete_callback), NULL); @@ -690,56 +763,85 @@ grad_create_gradient_editor_init (gint need_show) /* Buttons for gradient functions */ button = ed_create_button (_("New Gradient"), 0.5, 0.5, (GtkSignalFunc) ed_new_gradient_callback, NULL); + GTK_WIDGET_UNSET_FLAGS (button, GTK_RECEIVES_DEFAULT); gtk_box_pack_start (GTK_BOX (gvbox), button, FALSE, FALSE, 0); gtk_widget_show (button); button = ed_create_button (_("Copy Gradient"), 0.5, 0.5, (GtkSignalFunc) ed_copy_gradient_callback, NULL); + GTK_WIDGET_UNSET_FLAGS (button, GTK_RECEIVES_DEFAULT); gtk_box_pack_start (GTK_BOX (gvbox), button, FALSE, FALSE, 0); gtk_widget_show (button); button = ed_create_button (_("Delete Gradient"), 0.5, 0.5, (GtkSignalFunc) ed_delete_gradient_callback, NULL); + GTK_WIDGET_UNSET_FLAGS (button, GTK_RECEIVES_DEFAULT); gtk_box_pack_start (GTK_BOX (gvbox), button, FALSE, FALSE, 0); gtk_widget_show (button); button = ed_create_button (_("Rename Gradient"), 0.5, 0.5, (GtkSignalFunc) ed_rename_gradient_callback, NULL); + GTK_WIDGET_UNSET_FLAGS (button, GTK_RECEIVES_DEFAULT); gtk_box_pack_start (GTK_BOX (gvbox), button, FALSE, FALSE, 0); gtk_widget_show (button); button = ed_create_button (_("Save as POV-Ray"), 0.5, 0.5, (GtkSignalFunc) ed_save_pov_callback, NULL); + GTK_WIDGET_UNSET_FLAGS (button, GTK_RECEIVES_DEFAULT); gtk_box_pack_start (GTK_BOX (gvbox), button, FALSE, FALSE, 0); gtk_widget_show (button); gtk_widget_show (gvbox); gtk_widget_show (frame); - /* Horizontal box for zoom controls, scrollbar, and instant update toggle */ - + /* Horizontal box for zoom controls, scrollbar and instant update toggle */ hbox = gtk_hbox_new (FALSE, 4); gtk_container_set_border_width (GTK_CONTAINER (hbox), 0); gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0); gtk_widget_show (hbox); - /* Zoom buttons */ + /* Zoom all button */ button = ed_create_button (_("Zoom all"), 0.5, 0.5, (GtkSignalFunc) ed_zoom_all_callback, g_editor); + GTK_WIDGET_UNSET_FLAGS (button, GTK_RECEIVES_DEFAULT); gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0); gtk_widget_show (button); - button = ed_create_button (_("Zoom -"), 0.5, 0.5, - (GtkSignalFunc) ed_zoom_out_callback, g_editor); + /* + and - buttons */ + gtk_widget_realize (g_editor->shell); + style = gtk_widget_get_style (g_editor->shell); + + button = gtk_button_new (); + GTK_WIDGET_UNSET_FLAGS (button, GTK_RECEIVES_DEFAULT); + gtk_signal_connect (GTK_OBJECT (button), "clicked", + GTK_SIGNAL_FUNC (ed_zoom_in_callback), + (gpointer) g_editor); gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0); - gtk_widget_show(button); - button = ed_create_button (_("Zoom +"), 0.5, 0.5, - (GtkSignalFunc) ed_zoom_in_callback, g_editor); + pixmap = gdk_pixmap_create_from_xpm_d (g_editor->shell->window, &mask, + &style->bg[GTK_STATE_NORMAL], + zoom_in_xpm); + pixmapwid = gtk_pixmap_new (pixmap, mask); + gtk_container_add (GTK_CONTAINER (button), pixmapwid); + gtk_widget_show (pixmapwid); + gtk_widget_show (button); + + button = gtk_button_new (); + GTK_WIDGET_UNSET_FLAGS (button, GTK_RECEIVES_DEFAULT); + gtk_signal_connect (GTK_OBJECT (button), "clicked", + GTK_SIGNAL_FUNC (ed_zoom_out_callback), + (gpointer) g_editor); gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0); + + pixmap = gdk_pixmap_create_from_xpm_d (g_editor->shell->window, &mask, + &style->bg[GTK_STATE_NORMAL], + zoom_out_xpm); + pixmapwid = gtk_pixmap_new (pixmap, mask); + gtk_container_add (GTK_CONTAINER (button), pixmapwid); + gtk_widget_show (pixmapwid); gtk_widget_show (button); - /* Scrollbar */ + /* Scrollbar */ g_editor->zoom_factor = 1; g_editor->scroll_data = gtk_adjustment_new (0.0, 0.0, 1.0, @@ -772,18 +874,10 @@ grad_create_gradient_editor_init (gint need_show) gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE); gtk_widget_show (button); - /* hbox for that holds the frame for gradient preview and gradient control; - * this is only here, because resizing the preview doesn't work - * (and is disabled) to keep the preview and controls together - */ - hbox = gtk_hbox_new (FALSE, 0); - gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0); - gtk_widget_show (hbox); - /* Frame for gradient preview and gradient control */ frame = gtk_frame_new (NULL); gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN); - gtk_box_pack_start (GTK_BOX (hbox), frame, FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0); gtk_widget_show (frame); gvbox = gtk_vbox_new (FALSE, 0); @@ -798,13 +892,18 @@ grad_create_gradient_editor_init (gint need_show) g_editor->preview_button_down = 0; g_editor->preview = gtk_preview_new (GTK_PREVIEW_COLOR); - gtk_preview_set_dither (GTK_PREVIEW (g_editor->preview), - GDK_RGB_DITHER_MAX); + gtk_preview_set_dither (GTK_PREVIEW (g_editor->preview), GDK_RGB_DITHER_MAX); gtk_preview_size (GTK_PREVIEW (g_editor->preview), GRAD_PREVIEW_WIDTH, GRAD_PREVIEW_HEIGHT); + + /* Enable auto-resizing of the preview but ensure a minimal size */ + gtk_widget_set_usize (g_editor->preview, + GRAD_PREVIEW_WIDTH, GRAD_PREVIEW_HEIGHT); + gtk_preview_set_expand (GTK_PREVIEW (g_editor->preview), TRUE); + gtk_widget_set_events (g_editor->preview, GRAD_PREVIEW_EVENT_MASK); gtk_signal_connect (GTK_OBJECT(g_editor->preview), "event", - (GtkSignalFunc) prev_events, + (GdkEventFunc) prev_events, g_editor); gtk_box_pack_start (GTK_BOX (gvbox), g_editor->preview, TRUE, TRUE, 0); gtk_widget_show (g_editor->preview); @@ -861,9 +960,9 @@ grad_create_gradient_editor_init (gint need_show) GRAD_PREVIEW_WIDTH, GRAD_CONTROL_HEIGHT); gtk_widget_set_events (g_editor->control, GRAD_CONTROL_EVENT_MASK); gtk_signal_connect (GTK_OBJECT (g_editor->control), "event", - (GtkSignalFunc) control_events, + (GdkEventFunc) control_events, g_editor); - gtk_box_pack_start (GTK_BOX (gvbox), g_editor->control, FALSE, TRUE, 0); + gtk_box_pack_start (GTK_BOX (gvbox), g_editor->control, TRUE, TRUE, 0); gtk_widget_show (g_editor->control); /* Hint bar and close button */ @@ -888,7 +987,6 @@ grad_create_gradient_editor_init (gint need_show) cpopup_create_main_menu(); /* Show everything */ - gtk_widget_realize (g_editor->shell); g_editor->gc = gdk_gc_new (g_editor->shell->window); select_pos = ed_set_list_of_gradients (g_editor->gc, g_editor->clist, @@ -907,105 +1005,112 @@ grad_create_gradient_editor_init (gint need_show) /*****/ static void -ed_fetch_foreground(double *fg_r, double *fg_g, double *fg_b, double *fg_a) +ed_fetch_foreground (double *fg_r, double *fg_g, double *fg_b, double *fg_a) { - unsigned char r, g, b; + guchar r, g, b; - palette_get_foreground (&r, &g, &b); + palette_get_foreground (&r, &g, &b); - *fg_r = (double) r / 255.0; - *fg_g = (double) g / 255.0; - *fg_b = (double) b / 255.0; - *fg_a = 1.0; /* opacity 100 % */ -} /* ed_fetch_foreground */ - + *fg_r = (double) r / 255.0; + *fg_g = (double) g / 255.0; + *fg_b = (double) b / 255.0; + *fg_a = 1.0; /* opacity 100 % */ +} /*****/ static void -ed_update_editor(int flags) +ed_update_editor (int flags) { - if (flags & GRAD_UPDATE_PREVIEW) - prev_update(1); - - if (flags & GRAD_UPDATE_CONTROL) - control_update(0); + if (flags & GRAD_UPDATE_PREVIEW) + prev_update (TRUE); - if (flags & GRAD_RESET_CONTROL) - control_update(1); -} /* ed_update_editor */ + if (flags & GRAD_UPDATE_CONTROL) + control_update(FALSE); + if (flags & GRAD_RESET_CONTROL) + control_update (TRUE); +} /*****/ static GtkWidget * -ed_create_button(gchar *label, double xalign, double yalign, GtkSignalFunc signal_func, gpointer user_data) +ed_create_button (gchar *label, + double xalign, + double yalign, + GtkSignalFunc signal_func, + gpointer user_data) { - GtkWidget *button; - GtkWidget *text; - - button = gtk_button_new(); - text = gtk_label_new(gettext(label)); + GtkWidget *button; + GtkWidget *text; - gtk_misc_set_alignment(GTK_MISC(text), xalign, yalign); - gtk_container_add(GTK_CONTAINER(button), text); - gtk_widget_show(text); + button = gtk_button_new (); + text = gtk_label_new (label); - if (signal_func != NULL) - gtk_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC (signal_func), user_data); + gtk_misc_set_alignment (GTK_MISC (text), xalign, yalign); + gtk_misc_set_padding (GTK_MISC (text), 4, 0); + gtk_container_add (GTK_CONTAINER (button), text); + gtk_widget_show (text); - return button; -} /* ed_create_button */ + if (signal_func != NULL) + gtk_signal_connect (GTK_OBJECT (button), "clicked", + (GtkSignalFunc) signal_func, + user_data); + return button; +} /*****/ static void -ed_set_hint(char *str) +ed_set_hint (gchar *str) { - gtk_label_set(GTK_LABEL(g_editor->hint_label), gettext(str)); - gdk_flush(); -} /* ed_set_hint */ - + gtk_label_set_text (GTK_LABEL (g_editor->hint_label), str); + gdk_flush(); +} /*****/ gint -ed_set_list_of_gradients(GdkGC *gc, GtkWidget *clist,gradient_t *sel_gradient) +ed_set_list_of_gradients (GdkGC *gc, + GtkWidget *clist, + gradient_t *sel_gradient) { - GSList *list; - gradient_t *grad; - int n; - int select_pos = -1; - - list = gradients_list; - n = 0; + GSList *list; + gradient_t *grad; + gint n; + gint select_pos = -1; - if(sel_gradient == NULL) - sel_gradient = curr_gradient; + list = gradients_list; + n = 0; - gtk_clist_freeze(GTK_CLIST(clist)); + if (sel_gradient == NULL) + sel_gradient = curr_gradient; - while (list) { - grad = list->data; + gtk_clist_freeze (GTK_CLIST (clist)); - if (grad == sel_gradient) { - ed_insert_in_gradients_listbox(gc,clist,grad, n, 1); - select_pos = n; - } - else { - ed_insert_in_gradients_listbox(gc,clist,grad, n, 0); - } + while (list) + { + grad = list->data; - list = g_slist_next(list); - n++; - } /* while */ + if (grad == sel_gradient) + { + ed_insert_in_gradients_listbox (gc, clist, grad, n, 1); + select_pos = n; + } + else + { + ed_insert_in_gradients_listbox (gc, clist, grad, n, 0); + } - gtk_clist_thaw(GTK_CLIST(clist)); + list = g_slist_next (list); + n++; + } - return select_pos; -} /* ed_set_list_of_gradients */ + gtk_clist_thaw (GTK_CLIST (clist)); + return select_pos; +} /*****/ @@ -1214,33 +1319,15 @@ ed_initialize_saved_colors(void) g_editor->saved_colors[9].a = 1.0; } /* ed_initialize_saved_colors */ -/*****/ - -static gint -ed_delete_callback (GtkWidget *widget, - GdkEvent *event, - gpointer client_data) -{ - ed_close_callback (widget, client_data); - - return TRUE; -} - -/*****/ +/***** Main gradient editor dialog callbacks *****/ -static void -ed_close_callback (GtkWidget *widget, - gpointer client_data) -{ - if (GTK_WIDGET_VISIBLE (g_editor->shell)) - gtk_widget_hide (g_editor->shell); -} +/***** the "new gradient" dialog functions *****/ /*****/ static void ed_new_gradient_callback (GtkWidget *widget, - gpointer client_data) + gpointer data) { gtk_widget_show (query_string_box(_("New gradient"), _("Enter a name for the new gradient"), @@ -1251,7 +1338,7 @@ ed_new_gradient_callback (GtkWidget *widget, static void ed_do_new_gradient_callback (GtkWidget *widget, - gpointer client_data, + gpointer data, gpointer call_data) { gradient_t *grad; @@ -1288,11 +1375,13 @@ ed_do_new_gradient_callback (GtkWidget *widget, grad_sel_new_all (pos, grad); } +/***** The "copy gradient" dialog functions *****/ + /*****/ static void ed_copy_gradient_callback (GtkWidget *widget, - gpointer client_data) + gpointer data) { gchar *name; @@ -1312,7 +1401,7 @@ ed_copy_gradient_callback (GtkWidget *widget, static void ed_do_copy_gradient_callback (GtkWidget *widget, - gpointer client_data, + gpointer data, gpointer call_data) { gradient_t *grad; @@ -1373,11 +1462,13 @@ ed_do_copy_gradient_callback (GtkWidget *widget, grad_sel_copy_all (pos, grad); } +/***** The "rename gradient" dialog functions *****/ + /*****/ static void ed_rename_gradient_callback (GtkWidget *widget, - gpointer client_data) + gpointer data) { if (curr_gradient == NULL) return; @@ -1392,10 +1483,10 @@ ed_rename_gradient_callback (GtkWidget *widget, static void ed_do_rename_gradient_callback (GtkWidget *widget, - gpointer client_data, + gpointer data, gpointer call_data) { - gradient_t *grad = (gradient_t *) client_data; + gradient_t *grad = (gradient_t *) data; gradient_t *grad_list = NULL; gchar *gradient_name; GSList *tmp; @@ -1447,11 +1538,13 @@ ed_do_rename_gradient_callback (GtkWidget *widget, grad_sel_rename_all (n, grad); } +/***** The "delete gradient" dialog functions *****/ + /*****/ static void ed_delete_gradient_callback (GtkWidget *widget, - gpointer client_data) + gpointer data) { GtkWidget *dialog; GtkWidget *vbox; @@ -1468,11 +1561,11 @@ ed_delete_gradient_callback (GtkWidget *widget, return; dialog = gtk_dialog_new (); + gtk_window_set_wmclass (GTK_WINDOW (dialog), "delete_gradient", "Gimp"); gtk_window_set_title (GTK_WINDOW (dialog), _("Delete gradient")); gtk_window_position (GTK_WINDOW (dialog), GTK_WIN_POS_MOUSE); - gtk_container_set_border_width (GTK_CONTAINER (dialog), 0); - /* Handle the wm close signal */ + /* Handle the wm delete event */ gtk_signal_connect (GTK_OBJECT (dialog), "delete_event", GTK_SIGNAL_FUNC (ed_delete_delete_gradient_callback), dialog); @@ -1504,14 +1597,14 @@ ed_delete_gradient_callback (GtkWidget *widget, static void ed_do_delete_gradient_callback (GtkWidget *widget, - gpointer client_data) + gpointer data) { GSList *tmp; gint n; gint real_pos; gradient_t *gradient; - gtk_widget_destroy (GTK_WIDGET (client_data)); + gtk_widget_destroy (GTK_WIDGET (data)); gtk_widget_set_sensitive (g_editor->shell, TRUE); /* See which gradient we will have to select once the current one is deleted */ @@ -1561,29 +1654,31 @@ ed_do_delete_gradient_callback (GtkWidget *widget, grad_sel_delete_all (real_pos); } +static void +ed_cancel_delete_gradient_callback (GtkWidget *widget, + gpointer data) +{ + gtk_widget_destroy (GTK_WIDGET (data)); + gtk_widget_set_sensitive (g_editor->shell, TRUE); +} + static gint ed_delete_delete_gradient_callback (GtkWidget *widget, GdkEvent *event, - gpointer client_data) + gpointer data) { - ed_cancel_delete_gradient_callback (widget, client_data); + ed_cancel_delete_gradient_callback (widget, data); return TRUE; } -static void -ed_cancel_delete_gradient_callback (GtkWidget *widget, - gpointer client_data) -{ - gtk_widget_destroy (GTK_WIDGET (client_data)); - gtk_widget_set_sensitive (g_editor->shell, TRUE); -} +/***** The "save as pov" dialog functions *****/ /*****/ static void ed_save_pov_callback (GtkWidget *widget, - gpointer client_data) + gpointer data) { GtkWidget *window; @@ -1601,19 +1696,23 @@ ed_save_pov_callback (GtkWidget *widget, "clicked", (GtkSignalFunc) ed_cancel_save_pov_callback, window); + gtk_signal_connect (GTK_OBJECT (window), "delete_event", + (GdkEventFunc) ed_delete_save_pov_callback, + window); + gtk_widget_show (window); gtk_widget_set_sensitive (g_editor->shell, FALSE); } static void ed_do_save_pov_callback (GtkWidget *widget, - gpointer client_data) + gpointer data) { gchar *filename; FILE *file; grad_segment_t *seg; - filename = gtk_file_selection_get_filename (GTK_FILE_SELECTION (client_data)); + filename = gtk_file_selection_get_filename (GTK_FILE_SELECTION (data)); file = fopen (filename, "wb"); @@ -1652,32 +1751,42 @@ ed_do_save_pov_callback (GtkWidget *widget, fclose (file); } - gtk_widget_destroy (GTK_WIDGET (client_data)); + gtk_widget_destroy (GTK_WIDGET (data)); gtk_widget_set_sensitive (g_editor->shell, TRUE); } static void ed_cancel_save_pov_callback (GtkWidget *widget, - gpointer client_data) + gpointer data) { - gtk_widget_destroy (GTK_WIDGET (client_data)); + gtk_widget_destroy (GTK_WIDGET (data)); gtk_widget_set_sensitive (g_editor->shell, TRUE); } +static gint +ed_delete_save_pov_callback (GtkWidget *widget, + GdkEvent *event, + gpointer data) +{ + ed_cancel_save_pov_callback (widget, data); + + return TRUE; +} + +/***** The main dialog action area button callbacks *****/ + /*****/ static void ed_save_grads_callback (GtkWidget *widget, - gpointer client_data) + gpointer data) { grad_save_all (0); } -/*****/ - static void ed_refresh_grads_callback (GtkWidget *widget, - gpointer client_data) + gpointer data) { gint select_pos; gtk_clist_freeze (GTK_CLIST (g_editor->clist)); @@ -1702,247 +1811,266 @@ ed_refresh_grads_callback (GtkWidget *widget, grad_sel_refill_all (); } -/*****/ - static void -ed_scrollbar_update(GtkAdjustment *adjustment, gpointer data) +ed_close_callback (GtkWidget *widget, + gpointer data) { - char str[256]; - - g_snprintf(str, sizeof(str), _("Zoom factor: %d:1 Displaying [%0.6f, %0.6f]"), - g_editor->zoom_factor, adjustment->value, adjustment->value + adjustment->page_size); + if (GTK_WIDGET_VISIBLE (g_editor->shell)) + gtk_widget_hide (g_editor->shell); +} - ed_set_hint(str); +static gint +ed_delete_callback (GtkWidget *widget, + GdkEvent *event, + gpointer data) +{ + ed_close_callback (widget, data); - ed_update_editor(GRAD_UPDATE_PREVIEW | GRAD_UPDATE_CONTROL); -} /* ed_scrollbar_update */ + return TRUE; +} +/***** Zoom, scrollbar & instant update callbacks *****/ /*****/ static void -ed_zoom_all_callback(GtkWidget *widget, gpointer client_data) +ed_scrollbar_update (GtkAdjustment *adjustment, + gpointer data) { - GtkAdjustment *adjustment; + gchar str[256]; - adjustment = GTK_ADJUSTMENT(g_editor->scroll_data); + g_snprintf (str, sizeof (str), + _("Zoom factor: %d:1 Displaying [%0.6f, %0.6f]"), + g_editor->zoom_factor, adjustment->value, + adjustment->value + adjustment->page_size); - g_editor->zoom_factor = 1; + ed_set_hint (str); - adjustment->value = 0.0; - adjustment->page_size = 1.0; - adjustment->step_increment = 1.0 * GRAD_SCROLLBAR_STEP_SIZE; - adjustment->page_increment = 1.0 * GRAD_SCROLLBAR_PAGE_SIZE; + ed_update_editor (GRAD_UPDATE_PREVIEW | GRAD_UPDATE_CONTROL); +} - gtk_signal_emit_by_name(g_editor->scroll_data, "changed"); -} /* ed_zoom_all_callback */ +static void +ed_zoom_all_callback(GtkWidget *widget, + gpointer data) +{ + GtkAdjustment *adjustment; + adjustment = GTK_ADJUSTMENT (g_editor->scroll_data); -/*****/ + g_editor->zoom_factor = 1; -static void -ed_zoom_out_callback(GtkWidget *widget, gpointer client_data) -{ - GtkAdjustment *adjustment; - double old_value, value; - double old_page_size, page_size; + adjustment->value = 0.0; + adjustment->page_size = 1.0; + adjustment->step_increment = 1.0 * GRAD_SCROLLBAR_STEP_SIZE; + adjustment->page_increment = 1.0 * GRAD_SCROLLBAR_PAGE_SIZE; - if (g_editor->zoom_factor <= 1) - return; + gtk_signal_emit_by_name (g_editor->scroll_data, "changed"); +} - adjustment = GTK_ADJUSTMENT(g_editor->scroll_data); +static void +ed_zoom_out_callback (GtkWidget *widget, + gpointer data) +{ + GtkAdjustment *adjustment; + double old_value, value; + double old_page_size, page_size; - old_value = adjustment->value; - old_page_size = adjustment->page_size; + if (g_editor->zoom_factor <= 1) + return; - g_editor->zoom_factor--; + adjustment = GTK_ADJUSTMENT (g_editor->scroll_data); - page_size = 1.0 / g_editor->zoom_factor; - value = old_value - (page_size - old_page_size) / 2.0; + old_value = adjustment->value; + old_page_size = adjustment->page_size; - if (value < 0.0) - value = 0.0; - else if ((value + page_size) > 1.0) - value = 1.0 - page_size; + g_editor->zoom_factor--; - adjustment->value = value; - adjustment->page_size = page_size; - adjustment->step_increment = page_size * GRAD_SCROLLBAR_STEP_SIZE; - adjustment->page_increment = page_size * GRAD_SCROLLBAR_PAGE_SIZE; + page_size = 1.0 / g_editor->zoom_factor; + value = old_value - (page_size - old_page_size) / 2.0; - gtk_signal_emit_by_name(g_editor->scroll_data, "changed"); -} /* ed_zoom_out_callback */ + if (value < 0.0) + value = 0.0; + else if ((value + page_size) > 1.0) + value = 1.0 - page_size; + adjustment->value = value; + adjustment->page_size = page_size; + adjustment->step_increment = page_size * GRAD_SCROLLBAR_STEP_SIZE; + adjustment->page_increment = page_size * GRAD_SCROLLBAR_PAGE_SIZE; -/*****/ + gtk_signal_emit_by_name (g_editor->scroll_data, "changed"); +} static void -ed_zoom_in_callback(GtkWidget *widget, gpointer client_data) +ed_zoom_in_callback (GtkWidget *widget, + gpointer data) { - GtkAdjustment *adjustment; - double old_value; - double old_page_size, page_size; - - adjustment = GTK_ADJUSTMENT(g_editor->scroll_data); + GtkAdjustment *adjustment; + double old_value; + double old_page_size, page_size; - old_value = adjustment->value; - old_page_size = adjustment->page_size; + adjustment = GTK_ADJUSTMENT (g_editor->scroll_data); - g_editor->zoom_factor++; + old_value = adjustment->value; + old_page_size = adjustment->page_size; - page_size = 1.0 / g_editor->zoom_factor; + g_editor->zoom_factor++; - adjustment->value = old_value + (old_page_size - page_size) / 2.0; - adjustment->page_size = page_size; - adjustment->step_increment = page_size * GRAD_SCROLLBAR_STEP_SIZE; - adjustment->page_increment = page_size * GRAD_SCROLLBAR_PAGE_SIZE; + page_size = 1.0 / g_editor->zoom_factor; - gtk_signal_emit_by_name(g_editor->scroll_data, "changed"); -} /* ed_zoom_in_callback */ + adjustment->value = old_value + (old_page_size - page_size) / 2.0; + adjustment->page_size = page_size; + adjustment->step_increment = page_size * GRAD_SCROLLBAR_STEP_SIZE; + adjustment->page_increment = page_size * GRAD_SCROLLBAR_PAGE_SIZE; - -/*****/ + gtk_signal_emit_by_name (g_editor->scroll_data, "changed"); +} static void -ed_instant_update_update(GtkWidget *widget, gpointer data) +ed_instant_update_update (GtkWidget *widget, + gpointer data) { - if (GTK_TOGGLE_BUTTON(widget)->active) { - g_editor->instant_update = 1; - gtk_range_set_update_policy(GTK_RANGE(g_editor->scrollbar), GTK_UPDATE_CONTINUOUS); - } else { - g_editor->instant_update = 0; - gtk_range_set_update_policy(GTK_RANGE(g_editor->scrollbar), GTK_UPDATE_DELAYED); - } /* else */ -} /* ed_instant_update_update */ - + if (GTK_TOGGLE_BUTTON (widget)->active) + { + g_editor->instant_update = 1; + gtk_range_set_update_policy (GTK_RANGE (g_editor->scrollbar), + GTK_UPDATE_CONTINUOUS); + } + else + { + g_editor->instant_update = 0; + gtk_range_set_update_policy (GTK_RANGE (g_editor->scrollbar), + GTK_UPDATE_DELAYED); + } +} /***** Gradient preview functions *****/ /*****/ static gint -prev_events(GtkWidget *widget, GdkEvent *event) +prev_events (GtkWidget *widget, + GdkEvent *event, + gpointer data) { - gint x, y; - GdkEventButton *bevent; - GdkEventMotion *mevent; + gint x, y; + GdkEventButton *bevent; + GdkEventMotion *mevent; - /* ignore events when no gradient is present */ - if (curr_gradient == NULL) - return FALSE; - - switch (event->type) { - case GDK_EXPOSE: - prev_update(0); - break; - - case GDK_LEAVE_NOTIFY: - ed_set_hint(""); - break; - - case GDK_MOTION_NOTIFY: - gtk_widget_get_pointer(g_editor->preview, &x, &y); - - mevent = (GdkEventMotion *) event; - - if (x != g_editor->preview_last_x) - { - g_editor->preview_last_x = x; + /* ignore events when no gradient is present */ + if (curr_gradient == NULL) + return FALSE; - if (g_editor->preview_button_down) - { - if (mevent->state & GDK_CONTROL_MASK) - prev_set_background (x); - else - prev_set_foreground (x); - } - else - prev_set_hint (x); - } /* if */ + switch (event->type) + { + case GDK_EXPOSE: + prev_update (FALSE); + break; - break; + case GDK_LEAVE_NOTIFY: + ed_set_hint(""); + break; - case GDK_BUTTON_PRESS: - gtk_widget_get_pointer(g_editor->preview, &x, &y); + case GDK_MOTION_NOTIFY: + gtk_widget_get_pointer (g_editor->preview, &x, &y); - bevent = (GdkEventButton *) event; + mevent = (GdkEventMotion *) event; - switch (bevent->button) - { - case 1: - g_editor->preview_last_x = x; - g_editor->preview_button_down = 1; - if (bevent->state & GDK_CONTROL_MASK) - prev_set_background (x); - else - prev_set_foreground (x); - break; + if (x != g_editor->preview_last_x) + { + g_editor->preview_last_x = x; + + if (g_editor->preview_button_down) + { + if (mevent->state & GDK_CONTROL_MASK) + prev_set_background (x); + else + prev_set_foreground (x); + } + else + prev_set_hint (x); + } + break; - case 3: - cpopup_do_popup(); - break; + case GDK_BUTTON_PRESS: + gtk_widget_get_pointer (g_editor->preview, &x, &y); - default: - break; - } + bevent = (GdkEventButton *) event; - break; + switch (bevent->button) + { + case 1: + g_editor->preview_last_x = x; + g_editor->preview_button_down = 1; + if (bevent->state & GDK_CONTROL_MASK) + prev_set_background (x); + else + prev_set_foreground (x); + break; + + case 3: + cpopup_do_popup (); + break; + + default: + break; + } - case GDK_BUTTON_RELEASE: - if (g_editor->preview_button_down) - { - gtk_widget_get_pointer (g_editor->preview, &x, &y); + break; - bevent = (GdkEventButton *) event; + case GDK_BUTTON_RELEASE: + if (g_editor->preview_button_down) + { + gtk_widget_get_pointer (g_editor->preview, &x, &y); - g_editor->preview_last_x = x; - g_editor->preview_button_down = 0; - if (bevent->state & GDK_CONTROL_MASK) - prev_set_background (x); - else - prev_set_foreground (x); - break; - } + bevent = (GdkEventButton *) event; - break; + g_editor->preview_last_x = x; + g_editor->preview_button_down = 0; + if (bevent->state & GDK_CONTROL_MASK) + prev_set_background (x); + else + prev_set_foreground (x); + break; + } - default: - break; - } /* switch */ + break; - return FALSE; -} /* prev_events */ + default: + break; + } + return FALSE; +} /*****/ static void -prev_set_hint(gint x) +prev_set_hint (gint x) { - double xpos; - double r, g, b, a; - double h, s, v; - char str[256]; - - xpos = control_calc_g_pos(x); + double xpos; + double r, g, b, a; + double h, s, v; + gchar str[256]; - grad_get_color_at(xpos, &r, &g, &b, &a); + xpos = control_calc_g_pos (x); - h = r; - s = g; - v = b; + grad_get_color_at (xpos, &r, &g, &b, &a); - calc_rgb_to_hsv(&h, &s, &v); + h = r; + s = g; + v = b; - g_snprintf(str, sizeof(str), _("Position: %0.6f " - "RGB (%0.3f, %0.3f, %0.3f) " - "HSV (%0.3f, %0.3f, %0.3f) " - "Opacity: %0.3f"), - xpos, r, g, b, h * 360.0, s, v, a); + calc_rgb_to_hsv (&h, &s, &v); - ed_set_hint(str); -} /* prev_set_hint */ + g_snprintf (str, sizeof (str), _("Position: %0.6f " + "RGB (%0.3f, %0.3f, %0.3f) " + "HSV (%0.3f, %0.3f, %0.3f) " + "Opacity: %0.3f"), + xpos, r, g, b, h * 360.0, s, v, a); + ed_set_hint (str); +} /*****/ @@ -1995,97 +2123,91 @@ prev_set_background (gint x) /*****/ static void -prev_update(int recalculate) +prev_update (gboolean recalculate) { - long rowsiz; - GtkAdjustment *adjustment; - guint16 width, height; - guint16 pwidth, pheight; - GSList *tmp; - int n; - gradient_t *g; - static gradient_t *last_grad = NULL; - static int last_row = -1; - - /* We only update if we can draw to the widget and a gradient is present */ - - if (curr_gradient == NULL) - return; - if (!GTK_WIDGET_DRAWABLE(g_editor->preview)) - return; - - /* See whether we have to re-create the preview widget */ + long rowsiz; + GtkAdjustment *adjustment; + guint16 width, height; + GSList *tmp; + int n; + gradient_t *g; - width = g_editor->preview->allocation.width; - height = g_editor->preview->allocation.height; + static gradient_t *last_grad = NULL; + static int last_row = -1; - /* hof: do not change preview size on Window resize. - * The original code allows expansion of the preview - * on window resize events. But once expanded, there is no way to shrink - * the window back to the original size. - * A full Bugfix should change the preview size according to the users - * window resize actions. - */ + static guint16 last_width = 0; + static guint16 last_height = 0; - width = GRAD_PREVIEW_WIDTH; - height = GRAD_PREVIEW_HEIGHT; - - pwidth = GTK_PREVIEW(g_editor->preview)->buffer_width; - pheight = GTK_PREVIEW(g_editor->preview)->buffer_height; + /* We only update if we can draw to the widget and a gradient is present */ + if (curr_gradient == NULL) + return; + if (!GTK_WIDGET_DRAWABLE (g_editor->preview)) + return; - if (!g_editor->preview_rows[0] || !g_editor->preview_rows[1] || - (width != pwidth) || (height != pheight)) { - if (g_editor->preview_rows[0]) - g_free(g_editor->preview_rows[0]); + /* See whether we have to re-create the preview widget + * (note that the preview automatically follows the size of it's container) + */ + width = g_editor->preview->allocation.width; + height = g_editor->preview->allocation.height; - if (g_editor->preview_rows[1]) - g_free(g_editor->preview_rows[1]); + if (!g_editor->preview_rows[0] || + !g_editor->preview_rows[1] || + (width != last_width) || + (height != last_height)) + { + if (g_editor->preview_rows[0]) + g_free (g_editor->preview_rows[0]); - gtk_preview_size(GTK_PREVIEW(g_editor->preview), width, height); + if (g_editor->preview_rows[1]) + g_free (g_editor->preview_rows[1]); - rowsiz = width * 3 * sizeof(guchar); + rowsiz = width * 3 * sizeof (guchar); - g_editor->preview_rows[0] = g_malloc(rowsiz); - g_editor->preview_rows[1] = g_malloc(rowsiz); + g_editor->preview_rows[0] = g_malloc (rowsiz); + g_editor->preview_rows[1] = g_malloc (rowsiz); - recalculate = 1; /* Force recalculation */ - } /* if */ + recalculate = TRUE; /* Force recalculation */ + } - /* Have to redraw? */ + last_width = width; + last_height = height; - if (recalculate) { - adjustment = GTK_ADJUSTMENT(g_editor->scroll_data); + /* Have to redraw? */ + if (recalculate) + { + adjustment = GTK_ADJUSTMENT (g_editor->scroll_data); - prev_fill_image(width, height, - adjustment->value, - adjustment->value + adjustment->page_size); + prev_fill_image (width, height, + adjustment->value, + adjustment->value + adjustment->page_size); - gtk_widget_draw(g_editor->preview, NULL); - } /* if */ + gtk_widget_draw (g_editor->preview, NULL); + } - if(last_grad != curr_gradient || last_row < 0) { - n = 0; - tmp = gradients_list; + if (last_grad != curr_gradient || last_row < 0) + { + n = 0; + tmp = gradients_list; - while (tmp) { - g = tmp->data; + while (tmp) + { + g = tmp->data; - if (g == curr_gradient) { - break; /* We found the one we want */ - } /* if */ + if (g == curr_gradient) + break; /* We found the one we want */ - n++; /* Next gradient */ - tmp = g_slist_next(tmp); - } /* while */ - last_grad = curr_gradient; - last_row = n; - } /* if */ + n++; /* Next gradient */ + tmp = g_slist_next (tmp); + } + last_grad = curr_gradient; + last_row = n; + } - draw_small_preview(g_editor->gc,g_editor->clist,curr_gradient,last_row); - /* Update any others that are on screen */ - sel_update_dialogs(last_row,curr_gradient); -} /* prev_update */ + draw_small_preview (g_editor->gc, g_editor->clist, curr_gradient,last_row); + /* Update any others that are on screen */ + sel_update_dialogs (last_row, curr_gradient); +} /*****/ @@ -2152,100 +2274,106 @@ prev_fill_image(int width, int height, double left, double right) /*****/ static gint -control_events(GtkWidget *widget, GdkEvent *event) +control_events (GtkWidget *widget, + GdkEvent *event, + gpointer data) { - gint x, y; - guint32 time; - GdkEventButton *bevent; - grad_segment_t *seg; - - switch (event->type) { - case GDK_EXPOSE: - control_update(0); - break; - - case GDK_LEAVE_NOTIFY: - ed_set_hint(""); - break; - - case GDK_BUTTON_PRESS: - if (g_editor->control_drag_mode == GRAD_DRAG_NONE) { - gtk_widget_get_pointer(g_editor->control, &x, &y); - - bevent = (GdkEventButton *) event; + GdkEventButton *bevent; + grad_segment_t *seg; + gint x, y; + guint32 time; - g_editor->control_last_x = x; - g_editor->control_click_time = bevent->time; + switch (event->type) + { + case GDK_EXPOSE: + control_update (FALSE); + break; - control_button_press(x, y, bevent->button, bevent->state); + case GDK_LEAVE_NOTIFY: + ed_set_hint (""); + break; - if (g_editor->control_drag_mode != GRAD_DRAG_NONE) - gtk_grab_add(widget); - } /* if */ + case GDK_BUTTON_PRESS: + if (g_editor->control_drag_mode == GRAD_DRAG_NONE) + { + gtk_widget_get_pointer (g_editor->control, &x, &y); - break; + bevent = (GdkEventButton *) event; - case GDK_BUTTON_RELEASE: - ed_set_hint(""); + g_editor->control_last_x = x; + g_editor->control_click_time = bevent->time; - if (g_editor->control_drag_mode != GRAD_DRAG_NONE) { - gtk_grab_remove(widget); + control_button_press (x, y, bevent->button, bevent->state); - gtk_widget_get_pointer(g_editor->control, &x, &y); + if (g_editor->control_drag_mode != GRAD_DRAG_NONE) + gtk_grab_add (widget); + } + break; - time = ((GdkEventButton *) event)->time; + case GDK_BUTTON_RELEASE: + ed_set_hint (""); - if ((time - g_editor->control_click_time) >= GRAD_MOVE_TIME) - ed_update_editor(GRAD_UPDATE_PREVIEW); /* Possible move */ - else - if ((g_editor->control_drag_mode == GRAD_DRAG_MIDDLE) || - (g_editor->control_drag_mode == GRAD_DRAG_ALL)) { - seg = g_editor->control_drag_segment; + if (g_editor->control_drag_mode != GRAD_DRAG_NONE) + { + gtk_grab_remove (widget); - if ((g_editor->control_drag_mode == GRAD_DRAG_ALL) && - g_editor->control_compress) - control_extend_selection(seg, control_calc_g_pos(x)); - else - control_select_single_segment(seg); + gtk_widget_get_pointer (g_editor->control, &x, &y); - ed_update_editor(GRAD_UPDATE_CONTROL); - } /* if */ + time = ((GdkEventButton *) event)->time; - g_editor->control_drag_mode = GRAD_DRAG_NONE; - g_editor->control_compress = 0; + if ((time - g_editor->control_click_time) >= GRAD_MOVE_TIME) + ed_update_editor (GRAD_UPDATE_PREVIEW); /* Possible move */ + else + if ((g_editor->control_drag_mode == GRAD_DRAG_MIDDLE) || + (g_editor->control_drag_mode == GRAD_DRAG_ALL)) + { + seg = g_editor->control_drag_segment; - control_do_hint(x, y); - } /* if */ + if ((g_editor->control_drag_mode == GRAD_DRAG_ALL) && + g_editor->control_compress) + control_extend_selection (seg, control_calc_g_pos (x)); + else + control_select_single_segment (seg); - break; + ed_update_editor (GRAD_UPDATE_CONTROL); + } - case GDK_MOTION_NOTIFY: - gtk_widget_get_pointer(g_editor->control, &x, &y); + g_editor->control_drag_mode = GRAD_DRAG_NONE; + g_editor->control_compress = 0; - if (x != g_editor->control_last_x) { - g_editor->control_last_x = x; + control_do_hint (x, y); + } + break; - if (g_editor->control_drag_mode != GRAD_DRAG_NONE) { - time = ((GdkEventButton *) event)->time; + case GDK_MOTION_NOTIFY: + gtk_widget_get_pointer (g_editor->control, &x, &y); - if ((time - g_editor->control_click_time) >= GRAD_MOVE_TIME) - control_motion(x); - } else { - ed_update_editor(GRAD_UPDATE_CONTROL); + if (x != g_editor->control_last_x) + { + g_editor->control_last_x = x; - control_do_hint(x, y); - } /* else */ - } /* if */ + if (g_editor->control_drag_mode != GRAD_DRAG_NONE) + { + time = ((GdkEventButton *) event)->time; - break; + if ((time - g_editor->control_click_time) >= GRAD_MOVE_TIME) + control_motion(x); + } + else + { + ed_update_editor (GRAD_UPDATE_CONTROL); - default: - break; - } /* switch */ + control_do_hint (x, y); + } + } + break; - return FALSE; -} /* control_events */ + default: + break; + } + return FALSE; +} /*****/ @@ -2753,59 +2881,59 @@ control_move(grad_segment_t *range_l, grad_segment_t *range_r, double delta) /*****/ static void -control_update(int recalculate) +control_update (gboolean recalculate) { - gint cwidth, cheight; - gint pwidth, pheight; - GtkAdjustment *adjustment; - - /* We only update if we can redraw and a gradient is present */ - - if (curr_gradient == NULL) - return; - if (!GTK_WIDGET_DRAWABLE(g_editor->control)) - return; - - /* See whether we have to re-create the control pixmap */ - - gdk_window_get_size(g_editor->control->window, &cwidth, &cheight); + GtkAdjustment *adjustment; + gint cwidth, cheight; + gint pwidth, pheight; - /* as long as we have that ugly workaround in prev_update() don't - change the size of the controls either when the window is resized */ - - cwidth = GRAD_PREVIEW_WIDTH; - cheight = GRAD_PREVIEW_HEIGHT; - - if (g_editor->control_pixmap) - gdk_window_get_size(g_editor->control_pixmap, &pwidth, &pheight); + /* We only update if we can redraw and a gradient is present */ + if (curr_gradient == NULL) + return; + if (!GTK_WIDGET_DRAWABLE (g_editor->control)) + return; - if (!g_editor->control_pixmap || (cwidth != pwidth) || (cheight != pheight)) { - if (g_editor->control_pixmap) - gdk_pixmap_unref(g_editor->control_pixmap); + /* See whether we have to re-create the control pixmap + * depending on the preview's width + */ + cwidth = g_editor->preview->allocation.width; + cheight = GRAD_CONTROL_HEIGHT; - g_editor->control_pixmap = gdk_pixmap_new(g_editor->control->window, cwidth, cheight, -1); + if (g_editor->control_pixmap) + gdk_window_get_size (g_editor->control_pixmap, &pwidth, &pheight); - recalculate = 1; - } /* if */ + if (!g_editor->control_pixmap || + (cwidth != pwidth) || + (cheight != pheight)) + { + if (g_editor->control_pixmap) + gdk_pixmap_unref (g_editor->control_pixmap); - /* Have to reset the selection? */ + g_editor->control_pixmap = + gdk_pixmap_new (g_editor->control->window, cwidth, cheight, -1); - if (recalculate) - control_select_single_segment(curr_gradient->segments); + recalculate = TRUE; + } - /* Redraw pixmap */ + /* Avaoid segfault on first invocation */ + if (cwidth < GRAD_PREVIEW_WIDTH) + return; - adjustment = GTK_ADJUSTMENT(g_editor->scroll_data); + /* Have to reset the selection? */ + if (recalculate) + control_select_single_segment (curr_gradient->segments); - control_draw(g_editor->control_pixmap, - cwidth, cheight, - adjustment->value, - adjustment->value + adjustment->page_size); + /* Redraw pixmap */ + adjustment = GTK_ADJUSTMENT (g_editor->scroll_data); - gdk_draw_pixmap(g_editor->control->window, g_editor->control->style->black_gc, - g_editor->control_pixmap, 0, 0, 0, 0, cwidth, cheight); -} /* control_update */ + control_draw (g_editor->control_pixmap, + cwidth, cheight, + adjustment->value, + adjustment->value + adjustment->page_size); + gdk_draw_pixmap (g_editor->control->window, g_editor->control->style->black_gc, + g_editor->control_pixmap, 0, 0, 0, 0, cwidth, cheight); +} /*****/ @@ -2963,560 +3091,536 @@ control_calc_g_pos(int pos) /*****/ static void -cpopup_create_main_menu(void) -{ - GtkWidget *menu; - GtkWidget *menuitem; - GtkWidget *label; - GtkAccelGroup *accel_group; - - menu = gtk_menu_new(); - accel_group = gtk_accel_group_new(); - - g_editor->accel_group = accel_group; - - gtk_menu_set_accel_group (GTK_MENU(menu), accel_group); - gtk_window_add_accel_group (GTK_WINDOW (g_editor->shell), accel_group); - - /* Left endpoint */ - - menuitem = cpopup_create_color_item(&g_editor->left_color_preview, &label); - gtk_label_set(GTK_LABEL(label), _("Left endpoint's color")); - gtk_signal_connect(GTK_OBJECT(menuitem), "activate", - (GtkSignalFunc) cpopup_set_left_color_callback, - NULL); - gtk_menu_append(GTK_MENU(menu), menuitem); - gtk_widget_show(menuitem); - gtk_widget_add_accelerator(menuitem, - "activate", - accel_group, - 'L', 0, - GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED); - - menuitem = gtk_menu_item_new_with_label(_("Load from")); - g_editor->control_left_load_popup = cpopup_create_load_menu(g_editor->left_load_color_boxes, - g_editor->left_load_labels, - _("Left neighbor's right endpoint"), - _("Right endpoint"), - (GtkSignalFunc) - cpopup_load_left_callback, - 'L', GDK_CONTROL_MASK, - 'L', GDK_MOD1_MASK, - 'F', GDK_CONTROL_MASK); - gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), g_editor->control_left_load_popup); - gtk_menu_append(GTK_MENU(menu), menuitem); - gtk_widget_show(menuitem); - - menuitem = gtk_menu_item_new_with_label(_("Save to")); - g_editor->control_left_save_popup = cpopup_create_save_menu(g_editor->left_save_color_boxes, - g_editor->left_save_labels, - (GtkSignalFunc) - cpopup_save_left_callback); - gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), g_editor->control_left_save_popup); - gtk_menu_append(GTK_MENU(menu), menuitem); - gtk_widget_show(menuitem); - - /* Right endpoint */ - - menuitem = gtk_menu_item_new(); - gtk_menu_append(GTK_MENU(menu), menuitem); - gtk_widget_show(menuitem); - - menuitem = cpopup_create_color_item(&g_editor->right_color_preview, &label); - gtk_label_set(GTK_LABEL(label), _("Right endpoint's color")); - gtk_signal_connect(GTK_OBJECT(menuitem), "activate", - (GtkSignalFunc) cpopup_set_right_color_callback, - NULL); - gtk_menu_append(GTK_MENU(menu), menuitem); - gtk_widget_show(menuitem); - gtk_widget_add_accelerator(menuitem, - "activate", - accel_group, - 'R', 0, - GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED); - - menuitem = gtk_menu_item_new_with_label(_("Load from")); - g_editor->control_right_load_popup = cpopup_create_load_menu(g_editor->right_load_color_boxes, - g_editor->right_load_labels, - _("Right neighbor's left endpoint"), - _("Left endpoint"), - (GtkSignalFunc) - cpopup_load_right_callback, - 'R', GDK_CONTROL_MASK, - 'R', GDK_MOD1_MASK, - 'F', GDK_MOD1_MASK); - gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), g_editor->control_right_load_popup); - gtk_menu_append(GTK_MENU(menu), menuitem); - gtk_widget_show(menuitem); - - menuitem = gtk_menu_item_new_with_label(_("Save to")); - g_editor->control_right_save_popup = cpopup_create_save_menu(g_editor->right_save_color_boxes, - g_editor->right_save_labels, - (GtkSignalFunc) - cpopup_save_right_callback); - gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), g_editor->control_right_save_popup); - gtk_menu_append(GTK_MENU(menu), menuitem); - gtk_widget_show(menuitem); - - /* Blending function */ - - menuitem = gtk_menu_item_new(); - gtk_menu_append(GTK_MENU(menu), menuitem); - gtk_widget_show(menuitem); - - menuitem = cpopup_create_menu_item_with_label("", &g_editor->control_blending_label); - g_editor->control_blending_popup = cpopup_create_blending_menu(); - gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), g_editor->control_blending_popup); - gtk_menu_append(GTK_MENU(menu), menuitem); - gtk_widget_show(menuitem); - - /* Coloring type */ - - menuitem = cpopup_create_menu_item_with_label("", &g_editor->control_coloring_label); - g_editor->control_coloring_popup = cpopup_create_coloring_menu(); - gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), g_editor->control_coloring_popup); - gtk_menu_append(GTK_MENU(menu), menuitem); - gtk_widget_show(menuitem); - - /* Operations */ - - menuitem = gtk_menu_item_new(); - gtk_menu_append(GTK_MENU(menu), menuitem); - gtk_widget_show(menuitem); - - /* Split at midpoint */ - - menuitem = cpopup_create_menu_item_with_label("", &g_editor->control_splitm_label); - gtk_signal_connect(GTK_OBJECT(menuitem), "activate", - (GtkSignalFunc) cpopup_split_midpoint_callback, - NULL); - gtk_menu_append(GTK_MENU(menu), menuitem); - gtk_widget_show(menuitem); - gtk_widget_add_accelerator(menuitem, - "activate", - accel_group, - 'S', 0, - GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED); - - /* Split uniformly */ - - menuitem = cpopup_create_menu_item_with_label("", &g_editor->control_splitu_label); - gtk_signal_connect(GTK_OBJECT(menuitem), "activate", - (GtkSignalFunc) cpopup_split_uniform_callback, - NULL); - gtk_menu_append(GTK_MENU(menu), menuitem); - gtk_widget_show(menuitem); - gtk_widget_add_accelerator(menuitem, - "activate", - accel_group, - 'U', 0, - GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED); - - /* Delete */ - - menuitem = cpopup_create_menu_item_with_label("", &g_editor->control_delete_label); - gtk_signal_connect(GTK_OBJECT(menuitem), "activate", - (GtkSignalFunc) cpopup_delete_callback, - NULL); - gtk_menu_append(GTK_MENU(menu), menuitem); - gtk_widget_show(menuitem); - g_editor->control_delete_menu_item = menuitem; - gtk_widget_add_accelerator(menuitem, - "activate", - accel_group, - 'D', 0, - GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED); - - /* Recenter */ - - menuitem = cpopup_create_menu_item_with_label("", &g_editor->control_recenter_label); - gtk_signal_connect(GTK_OBJECT(menuitem), "activate", - (GtkSignalFunc) cpopup_recenter_callback, - NULL); - gtk_menu_append(GTK_MENU(menu), menuitem); - gtk_widget_show(menuitem); - gtk_widget_add_accelerator(menuitem, - "activate", - accel_group, - 'C', 0, - GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED); - - /* Redistribute */ - - menuitem = cpopup_create_menu_item_with_label("", &g_editor->control_redistribute_label); - gtk_signal_connect(GTK_OBJECT(menuitem), "activate", - (GtkSignalFunc) cpopup_redistribute_callback, - NULL); - gtk_menu_append(GTK_MENU(menu), menuitem); - gtk_widget_show(menuitem); - gtk_widget_add_accelerator(menuitem, - "activate", - accel_group, - 'C', GDK_CONTROL_MASK, - GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED); - - /* Selection ops */ - - menuitem = gtk_menu_item_new(); - gtk_menu_append(GTK_MENU(menu), menuitem); - gtk_widget_show(menuitem); - - menuitem = gtk_menu_item_new_with_label(_("Selection operations")); - g_editor->control_sel_ops_popup = cpopup_create_sel_ops_menu(); - gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), g_editor->control_sel_ops_popup); - gtk_menu_append(GTK_MENU(menu), menuitem); - gtk_widget_show(menuitem); - - /* Done */ - - g_editor->control_main_popup = menu; -} /* cpopup_create_main_menu */ +cpopup_create_main_menu (void) +{ + GtkWidget *menu; + GtkWidget *menuitem; + GtkWidget *label; + GtkAccelGroup *accel_group; + menu = gtk_menu_new (); + accel_group = gtk_accel_group_new (); -/*****/ + g_editor->accel_group = accel_group; + + gtk_menu_set_accel_group (GTK_MENU (menu), accel_group); + gtk_window_add_accel_group (GTK_WINDOW (g_editor->shell), accel_group); + + /* Left endpoint */ + menuitem = cpopup_create_color_item (&g_editor->left_color_preview, &label); + gtk_label_set_text (GTK_LABEL (label), _("Left endpoint's color")); + gtk_signal_connect (GTK_OBJECT (menuitem), "activate", + (GtkSignalFunc) cpopup_set_left_color_callback, + NULL); + gtk_menu_append (GTK_MENU (menu), menuitem); + gtk_widget_show (menuitem); + gtk_widget_add_accelerator (menuitem, "activate", + accel_group, + 'L', 0, + GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED); + + menuitem = gtk_menu_item_new_with_label (_("Load from")); + g_editor->control_left_load_popup = + cpopup_create_load_menu (g_editor->left_load_color_boxes, + g_editor->left_load_labels, + _("Left neighbor's right endpoint"), + _("Right endpoint"), + (GtkSignalFunc) cpopup_load_left_callback, + 'L', GDK_CONTROL_MASK, + 'L', GDK_MOD1_MASK, + 'F', GDK_CONTROL_MASK); + gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), + g_editor->control_left_load_popup); + gtk_menu_append (GTK_MENU (menu), menuitem); + gtk_widget_show (menuitem); + + menuitem = gtk_menu_item_new_with_label (_("Save to")); + g_editor->control_left_save_popup = + cpopup_create_save_menu (g_editor->left_save_color_boxes, + g_editor->left_save_labels, + (GtkSignalFunc) cpopup_save_left_callback); + gtk_menu_item_set_submenu (GTK_MENU_ITEM(menuitem), + g_editor->control_left_save_popup); + gtk_menu_append (GTK_MENU (menu), menuitem); + gtk_widget_show (menuitem); + + /* Right endpoint */ + menuitem = gtk_menu_item_new (); + gtk_menu_append (GTK_MENU (menu), menuitem); + gtk_widget_show (menuitem); + + menuitem = cpopup_create_color_item (&g_editor->right_color_preview, &label); + gtk_label_set_text (GTK_LABEL (label), _("Right endpoint's color")); + gtk_signal_connect (GTK_OBJECT (menuitem), "activate", + (GtkSignalFunc) cpopup_set_right_color_callback, + NULL); + gtk_menu_append (GTK_MENU (menu), menuitem); + gtk_widget_show (menuitem); + gtk_widget_add_accelerator (menuitem, "activate", + accel_group, + 'R', 0, + GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED); + + menuitem = gtk_menu_item_new_with_label (_("Load from")); + g_editor->control_right_load_popup = + cpopup_create_load_menu (g_editor->right_load_color_boxes, + g_editor->right_load_labels, + _("Right neighbor's left endpoint"), + _("Left endpoint"), + (GtkSignalFunc) cpopup_load_right_callback, + 'R', GDK_CONTROL_MASK, + 'R', GDK_MOD1_MASK, + 'F', GDK_MOD1_MASK); + gtk_menu_item_set_submenu (GTK_MENU_ITEM(menuitem), + g_editor->control_right_load_popup); + gtk_menu_append (GTK_MENU (menu), menuitem); + gtk_widget_show (menuitem); + + menuitem = gtk_menu_item_new_with_label (_("Save to")); + g_editor->control_right_save_popup = + cpopup_create_save_menu (g_editor->right_save_color_boxes, + g_editor->right_save_labels, + (GtkSignalFunc) cpopup_save_right_callback); + gtk_menu_item_set_submenu (GTK_MENU_ITEM(menuitem), + g_editor->control_right_save_popup); + gtk_menu_append (GTK_MENU (menu), menuitem); + gtk_widget_show (menuitem); + + /* Blending function */ + menuitem = gtk_menu_item_new (); + gtk_menu_append (GTK_MENU (menu), menuitem); + gtk_widget_show (menuitem); + + menuitem = cpopup_create_menu_item_with_label ("", &g_editor->control_blending_label); + g_editor->control_blending_popup = cpopup_create_blending_menu (); + gtk_menu_item_set_submenu (GTK_MENU_ITEM(menuitem), + g_editor->control_blending_popup); + gtk_menu_append (GTK_MENU(menu), menuitem); + gtk_widget_show (menuitem); + + /* Coloring type */ + menuitem = cpopup_create_menu_item_with_label ("", &g_editor->control_coloring_label); + g_editor->control_coloring_popup = cpopup_create_coloring_menu (); + gtk_menu_item_set_submenu (GTK_MENU_ITEM(menuitem), + g_editor->control_coloring_popup); + gtk_menu_append (GTK_MENU (menu), menuitem); + gtk_widget_show (menuitem); + + /* Operations */ + menuitem = gtk_menu_item_new (); + gtk_menu_append (GTK_MENU (menu), menuitem); + gtk_widget_show (menuitem); + + /* Split at midpoint */ + menuitem = cpopup_create_menu_item_with_label ("", &g_editor->control_splitm_label); + gtk_signal_connect (GTK_OBJECT (menuitem), "activate", + (GtkSignalFunc) cpopup_split_midpoint_callback, + NULL); + gtk_menu_append (GTK_MENU (menu), menuitem); + gtk_widget_show (menuitem); + gtk_widget_add_accelerator(menuitem, "activate", + accel_group, + 'S', 0, + GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED); + + /* Split uniformly */ + menuitem = cpopup_create_menu_item_with_label ("", &g_editor->control_splitu_label); + gtk_signal_connect (GTK_OBJECT(menuitem), "activate", + (GtkSignalFunc) cpopup_split_uniform_callback, + NULL); + gtk_menu_append (GTK_MENU (menu), menuitem); + gtk_widget_show (menuitem); + gtk_widget_add_accelerator (menuitem, "activate", + accel_group, + 'U', 0, + GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED); + + /* Delete */ + menuitem = cpopup_create_menu_item_with_label ("", &g_editor->control_delete_label); + gtk_signal_connect (GTK_OBJECT (menuitem), "activate", + (GtkSignalFunc) cpopup_delete_callback, + NULL); + gtk_menu_append (GTK_MENU (menu), menuitem); + gtk_widget_show (menuitem); + g_editor->control_delete_menu_item = menuitem; + gtk_widget_add_accelerator (menuitem, "activate", + accel_group, + 'D', 0, + GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED); + + /* Recenter */ + menuitem = cpopup_create_menu_item_with_label ("", &g_editor->control_recenter_label); + gtk_signal_connect (GTK_OBJECT (menuitem), "activate", + (GtkSignalFunc) cpopup_recenter_callback, + NULL); + gtk_menu_append (GTK_MENU (menu), menuitem); + gtk_widget_show (menuitem); + gtk_widget_add_accelerator (menuitem, "activate", + accel_group, + 'C', 0, + GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED); + + /* Redistribute */ + menuitem = cpopup_create_menu_item_with_label ("", &g_editor->control_redistribute_label); + gtk_signal_connect (GTK_OBJECT (menuitem), "activate", + (GtkSignalFunc) cpopup_redistribute_callback, + NULL); + gtk_menu_append (GTK_MENU (menu), menuitem); + gtk_widget_show (menuitem); + gtk_widget_add_accelerator (menuitem, "activate", + accel_group, + 'C', GDK_CONTROL_MASK, + GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED); + + /* Selection ops */ + menuitem = gtk_menu_item_new (); + gtk_menu_append (GTK_MENU (menu), menuitem); + gtk_widget_show (menuitem); + + menuitem = gtk_menu_item_new_with_label (_("Selection operations")); + g_editor->control_sel_ops_popup = cpopup_create_sel_ops_menu (); + gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), + g_editor->control_sel_ops_popup); + gtk_menu_append (GTK_MENU (menu), menuitem); + gtk_widget_show (menuitem); + + /* Done */ + g_editor->control_main_popup = menu; +} static void -cpopup_do_popup(void) +cpopup_do_popup (void) { - cpopup_adjust_menus(); - gtk_menu_popup(GTK_MENU(g_editor->control_main_popup), NULL, NULL, NULL, NULL, 3, 0); -} /* cpopup_do_popup */ + cpopup_adjust_menus(); + gtk_menu_popup (GTK_MENU (g_editor->control_main_popup), + NULL, NULL, NULL, NULL, 3, 0); +} +/***** Create a single menu item *****/ /*****/ static GtkWidget * -cpopup_create_color_item(GtkWidget **color_box, GtkWidget **label) +cpopup_create_color_item (GtkWidget **color_box, + GtkWidget **label) { - GtkWidget *menuitem; - GtkWidget *hbox; - GtkWidget *vbox; - GtkWidget *wcolor_box; - GtkWidget *wlabel; - - menuitem = gtk_menu_item_new(); - - hbox = gtk_hbox_new(FALSE, 0); - gtk_container_add(GTK_CONTAINER(menuitem), hbox); - gtk_widget_show(hbox); + GtkWidget *menuitem; + GtkWidget *hbox; + GtkWidget *vbox; + GtkWidget *wcolor_box; + GtkWidget *wlabel; - vbox = gtk_vbox_new(FALSE, 0); - gtk_box_pack_start(GTK_BOX(hbox), vbox, FALSE, FALSE, 0); - gtk_widget_show(vbox); + menuitem = gtk_menu_item_new(); - wcolor_box = gtk_preview_new(GTK_PREVIEW_COLOR); - gtk_preview_set_dither (GTK_PREVIEW (wcolor_box), GDK_RGB_DITHER_MAX); - gtk_preview_size(GTK_PREVIEW(wcolor_box), GRAD_COLOR_BOX_WIDTH, GRAD_COLOR_BOX_HEIGHT); - gtk_box_pack_start(GTK_BOX(vbox), wcolor_box, FALSE, FALSE, 2); - gtk_widget_show(wcolor_box); + hbox = gtk_hbox_new (FALSE, 0); + gtk_container_add (GTK_CONTAINER (menuitem), hbox); + gtk_widget_show (hbox); - if (color_box) - *color_box = wcolor_box; + vbox = gtk_vbox_new (FALSE, 0); + gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0); + gtk_widget_show (vbox); - wlabel = gtk_label_new(""); - gtk_misc_set_alignment(GTK_MISC(wlabel), 0.0, 0.5); - gtk_box_pack_start(GTK_BOX(hbox), wlabel, TRUE, TRUE, 4); - gtk_widget_show(wlabel); + wcolor_box = gtk_preview_new (GTK_PREVIEW_COLOR); + gtk_preview_set_dither (GTK_PREVIEW (wcolor_box), GDK_RGB_DITHER_MAX); + gtk_preview_size (GTK_PREVIEW (wcolor_box), + GRAD_COLOR_BOX_WIDTH, GRAD_COLOR_BOX_HEIGHT); + gtk_box_pack_start (GTK_BOX (vbox), wcolor_box, FALSE, FALSE, 2); + gtk_widget_show (wcolor_box); - if (label) - *label = wlabel; + if (color_box) + *color_box = wcolor_box; - return menuitem; -} /* cpopup_create_color_item */ + wlabel = gtk_label_new (""); + gtk_misc_set_alignment (GTK_MISC (wlabel), 0.0, 0.5); + gtk_box_pack_start (GTK_BOX (hbox), wlabel, FALSE, FALSE, 4); + gtk_widget_show (wlabel); + if (label) + *label = wlabel; -/*****/ + return menuitem; +} -static void -cpopup_adjust_menus(void) +static GtkWidget * +cpopup_create_menu_item_with_label (gchar *str, + GtkWidget **label) { - grad_segment_t *seg; - int i; - double fg_r, fg_g, fg_b; - double fg_a; + GtkWidget *menuitem; + GtkWidget *accel_label; - /* Render main menu color boxes */ + menuitem = gtk_menu_item_new (); - cpopup_render_color_box(GTK_PREVIEW(g_editor->left_color_preview), - g_editor->control_sel_l->r0, - g_editor->control_sel_l->g0, - g_editor->control_sel_l->b0, - g_editor->control_sel_l->a0); + accel_label = gtk_accel_label_new (str); + gtk_misc_set_alignment (GTK_MISC (accel_label), 0.0, 0.5); + gtk_container_add (GTK_CONTAINER (menuitem), accel_label); + gtk_accel_label_set_accel_widget (GTK_ACCEL_LABEL (accel_label), menuitem); + gtk_widget_show (accel_label); - cpopup_render_color_box(GTK_PREVIEW(g_editor->right_color_preview), - g_editor->control_sel_r->r1, - g_editor->control_sel_r->g1, - g_editor->control_sel_r->b1, - g_editor->control_sel_r->a1); + if (label) + *label = accel_label; - /* Render load color from endpoint color boxes */ - - if (g_editor->control_sel_l->prev != NULL) - seg = g_editor->control_sel_l->prev; - else - seg = seg_get_last_segment(g_editor->control_sel_l); - - cpopup_render_color_box(GTK_PREVIEW(g_editor->left_load_color_boxes[0]), - seg->r1, - seg->g1, - seg->b1, - seg->a1); - - cpopup_render_color_box(GTK_PREVIEW(g_editor->left_load_color_boxes[1]), - g_editor->control_sel_r->r1, - g_editor->control_sel_r->g1, - g_editor->control_sel_r->b1, - g_editor->control_sel_r->a1); - - if (g_editor->control_sel_r->next != NULL) - seg = g_editor->control_sel_r->next; - else - seg = curr_gradient->segments; - - cpopup_render_color_box(GTK_PREVIEW(g_editor->right_load_color_boxes[0]), - seg->r0, - seg->g0, - seg->b0, - seg->a0); - - cpopup_render_color_box(GTK_PREVIEW(g_editor->right_load_color_boxes[1]), - g_editor->control_sel_l->r0, - g_editor->control_sel_l->g0, - g_editor->control_sel_l->b0, - g_editor->control_sel_l->a0); - - /* Render Foreground color boxes */ - - ed_fetch_foreground(&fg_r, &fg_g, &fg_b, &fg_a); - - cpopup_render_color_box(GTK_PREVIEW(g_editor->left_load_color_boxes[2]), - fg_r, - fg_g, - fg_b, - fg_a); - - cpopup_render_color_box(GTK_PREVIEW(g_editor->right_load_color_boxes[2]), - fg_r, - fg_g, - fg_b, - fg_a); - - /* Render saved color boxes */ - - for (i = 0; i < GRAD_NUM_COLORS; i++) - cpopup_update_saved_color(i, - g_editor->saved_colors[i].r, - g_editor->saved_colors[i].g, - g_editor->saved_colors[i].b, - g_editor->saved_colors[i].a); - - /* Adjust labels */ - - if (g_editor->control_sel_l == g_editor->control_sel_r) { - gtk_label_set(GTK_LABEL(g_editor->control_blending_label), - _("Blending function for segment")); - gtk_label_set(GTK_LABEL(g_editor->control_coloring_label), - _("Coloring type for segment")); - gtk_label_set(GTK_LABEL(g_editor->control_splitm_label), - _("Split segment at midpoint")); - gtk_label_set(GTK_LABEL(g_editor->control_splitu_label), - _("Split segment uniformly")); - gtk_label_set(GTK_LABEL(g_editor->control_delete_label), - _("Delete segment")); - gtk_label_set(GTK_LABEL(g_editor->control_recenter_label), - _("Re-center segment's midpoint")); - gtk_label_set(GTK_LABEL(g_editor->control_redistribute_label), - _("Re-distribute handles in segment")); - gtk_label_set(GTK_LABEL(g_editor->control_flip_label), - _("Flip segment")); - gtk_label_set(GTK_LABEL(g_editor->control_replicate_label), - _("Replicate segment")); - } else { - gtk_label_set(GTK_LABEL(g_editor->control_blending_label), - _("Blending function for selection")); - gtk_label_set(GTK_LABEL(g_editor->control_coloring_label), - _("Coloring type for selection")); - gtk_label_set(GTK_LABEL(g_editor->control_splitm_label), - _("Split segments at midpoints")); - gtk_label_set(GTK_LABEL(g_editor->control_splitu_label), - _("Split segments uniformly")); - gtk_label_set(GTK_LABEL(g_editor->control_delete_label), - _("Delete selection")); - gtk_label_set(GTK_LABEL(g_editor->control_recenter_label), - _("Re-center midpoints in selection")); - gtk_label_set(GTK_LABEL(g_editor->control_redistribute_label), - _("Re-distribute handles in selection")); - gtk_label_set(GTK_LABEL(g_editor->control_flip_label), - _("Flip selection")); - gtk_label_set(GTK_LABEL(g_editor->control_replicate_label), - _("Replicate selection")); - } /* else */ - - /* Adjust blending and coloring menus */ - - cpopup_adjust_blending_menu(); - cpopup_adjust_coloring_menu(); - - /* Can invoke delete? */ - - if ((g_editor->control_sel_l->prev == NULL) && (g_editor->control_sel_r->next == NULL)) - gtk_widget_set_sensitive(g_editor->control_delete_menu_item, FALSE); - else - gtk_widget_set_sensitive(g_editor->control_delete_menu_item, TRUE); - - /* Can invoke blend colors / opacity? */ - - if (g_editor->control_sel_l == g_editor->control_sel_r) { - gtk_widget_set_sensitive(g_editor->control_blend_colors_menu_item, FALSE); - gtk_widget_set_sensitive(g_editor->control_blend_opacity_menu_item, FALSE); - } else { - gtk_widget_set_sensitive(g_editor->control_blend_colors_menu_item, TRUE); - gtk_widget_set_sensitive(g_editor->control_blend_opacity_menu_item, TRUE); - } /* else */ -} /* cpopup_adjust_menus */ + return menuitem; +} +/***** Update all menus *****/ /*****/ static void -cpopup_adjust_blending_menu(void) +cpopup_adjust_menus (void) { - int equal; - long i, num_items; - int type; - - cpopup_check_selection_params(&equal, NULL); - - /* Block activate signals */ - - num_items = sizeof(g_editor->control_blending_items) / sizeof(g_editor->control_blending_items[0]); - - type = (int) g_editor->control_sel_l->type; - - for (i = 0; i < num_items; i++) - gtk_signal_handler_block_by_data(GTK_OBJECT(g_editor->control_blending_items[i]), - (gpointer) i); + grad_segment_t *seg; + int i; + double fg_r, fg_g, fg_b; + double fg_a; + + /* Render main menu color boxes */ + cpopup_render_color_box (GTK_PREVIEW (g_editor->left_color_preview), + g_editor->control_sel_l->r0, + g_editor->control_sel_l->g0, + g_editor->control_sel_l->b0, + g_editor->control_sel_l->a0); + + cpopup_render_color_box (GTK_PREVIEW (g_editor->right_color_preview), + g_editor->control_sel_r->r1, + g_editor->control_sel_r->g1, + g_editor->control_sel_r->b1, + g_editor->control_sel_r->a1); + + /* Render load color from endpoint color boxes */ + + if (g_editor->control_sel_l->prev != NULL) + seg = g_editor->control_sel_l->prev; + else + seg = seg_get_last_segment (g_editor->control_sel_l); + + cpopup_render_color_box (GTK_PREVIEW (g_editor->left_load_color_boxes[0]), + seg->r1, + seg->g1, + seg->b1, + seg->a1); + + cpopup_render_color_box (GTK_PREVIEW (g_editor->left_load_color_boxes[1]), + g_editor->control_sel_r->r1, + g_editor->control_sel_r->g1, + g_editor->control_sel_r->b1, + g_editor->control_sel_r->a1); + + if (g_editor->control_sel_r->next != NULL) + seg = g_editor->control_sel_r->next; + else + seg = curr_gradient->segments; + + cpopup_render_color_box (GTK_PREVIEW (g_editor->right_load_color_boxes[0]), + seg->r0, + seg->g0, + seg->b0, + seg->a0); + + cpopup_render_color_box (GTK_PREVIEW (g_editor->right_load_color_boxes[1]), + g_editor->control_sel_l->r0, + g_editor->control_sel_l->g0, + g_editor->control_sel_l->b0, + g_editor->control_sel_l->a0); + + /* Render Foreground color boxes */ + + ed_fetch_foreground (&fg_r, &fg_g, &fg_b, &fg_a); + + cpopup_render_color_box (GTK_PREVIEW (g_editor->left_load_color_boxes[2]), + fg_r, + fg_g, + fg_b, + fg_a); + + cpopup_render_color_box (GTK_PREVIEW (g_editor->right_load_color_boxes[2]), + fg_r, + fg_g, + fg_b, + fg_a); + + /* Render saved color boxes */ - /* Set state */ + for (i = 0; i < GRAD_NUM_COLORS; i++) + cpopup_update_saved_color(i, + g_editor->saved_colors[i].r, + g_editor->saved_colors[i].g, + g_editor->saved_colors[i].b, + g_editor->saved_colors[i].a); - if (equal) { - gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(g_editor->control_blending_items[type]), - TRUE); - gtk_widget_hide(g_editor->control_blending_items[num_items - 1]); - } else { - gtk_widget_show(g_editor->control_blending_items[num_items - 1]); - gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(g_editor->control_blending_items - [num_items - 1]), - TRUE); - } /* else */ + /* Adjust labels */ - /* Unblock signals */ + if (g_editor->control_sel_l == g_editor->control_sel_r) + { + gtk_label_set_text (GTK_LABEL (g_editor->control_blending_label), + _("Blending function for segment")); + gtk_label_set_text (GTK_LABEL (g_editor->control_coloring_label), + _("Coloring type for segment")); + gtk_label_set_text (GTK_LABEL (g_editor->control_splitm_label), + _("Split segment at midpoint")); + gtk_label_set_text (GTK_LABEL (g_editor->control_splitu_label), + _("Split segment uniformly")); + gtk_label_set_text (GTK_LABEL (g_editor->control_delete_label), + _("Delete segment")); + gtk_label_set_text (GTK_LABEL (g_editor->control_recenter_label), + _("Re-center segment's midpoint")); + gtk_label_set_text (GTK_LABEL (g_editor->control_redistribute_label), + _("Re-distribute handles in segment")); + gtk_label_set_text (GTK_LABEL (g_editor->control_flip_label), + _("Flip segment")); + gtk_label_set_text (GTK_LABEL (g_editor->control_replicate_label), + _("Replicate segment")); + } + else + { + gtk_label_set_text (GTK_LABEL (g_editor->control_blending_label), + _("Blending function for selection")); + gtk_label_set_text (GTK_LABEL (g_editor->control_coloring_label), + _("Coloring type for selection")); + gtk_label_set_text (GTK_LABEL (g_editor->control_splitm_label), + _("Split segments at midpoints")); + gtk_label_set_text (GTK_LABEL (g_editor->control_splitu_label), + _("Split segments uniformly")); + gtk_label_set_text (GTK_LABEL (g_editor->control_delete_label), + _("Delete selection")); + gtk_label_set_text (GTK_LABEL (g_editor->control_recenter_label), + _("Re-center midpoints in selection")); + gtk_label_set_text (GTK_LABEL (g_editor->control_redistribute_label), + _("Re-distribute handles in selection")); + gtk_label_set_text (GTK_LABEL (g_editor->control_flip_label), + _("Flip selection")); + gtk_label_set_text (GTK_LABEL (g_editor->control_replicate_label), + _("Replicate selection")); + } - for (i = 0; i < num_items; i++) - gtk_signal_handler_unblock_by_data(GTK_OBJECT(g_editor->control_blending_items[i]), - (gpointer) i); -} /* cpopup_adjust_blending_menu */ + /* Adjust blending and coloring menus */ + cpopup_adjust_blending_menu (); + cpopup_adjust_coloring_menu (); + /* Can invoke delete? */ + if ((g_editor->control_sel_l->prev == NULL) && + (g_editor->control_sel_r->next == NULL)) + gtk_widget_set_sensitive (g_editor->control_delete_menu_item, FALSE); + else + gtk_widget_set_sensitive (g_editor->control_delete_menu_item, TRUE); -/*****/ + /* Can invoke blend colors / opacity? */ + if (g_editor->control_sel_l == g_editor->control_sel_r) + { + gtk_widget_set_sensitive (g_editor->control_blend_colors_menu_item, FALSE); + gtk_widget_set_sensitive (g_editor->control_blend_opacity_menu_item, FALSE); + } + else + { + gtk_widget_set_sensitive (g_editor->control_blend_colors_menu_item, TRUE); + gtk_widget_set_sensitive (g_editor->control_blend_opacity_menu_item, TRUE); + } +} static void -cpopup_adjust_coloring_menu(void) +cpopup_adjust_blending_menu (void) { - int equal; - long i, num_items; - int coloring; + gint equal; + glong i, num_items; + gint type; - cpopup_check_selection_params(NULL, &equal); + cpopup_check_selection_params (&equal, NULL); - /* Block activate signals */ + /* Block activate signals */ + num_items = (sizeof (g_editor->control_blending_items) / + sizeof (g_editor->control_blending_items[0])); - num_items = sizeof(g_editor->control_coloring_items) / sizeof(g_editor->control_coloring_items[0]); + type = (int) g_editor->control_sel_l->type; - coloring = (int) g_editor->control_sel_l->color; - - for (i = 0; i < num_items; i++) - gtk_signal_handler_block_by_data(GTK_OBJECT(g_editor->control_coloring_items[i]), - (gpointer) i); - - /* Set state */ - - if (equal) { - gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(g_editor->control_coloring_items - [coloring]), - TRUE); - gtk_widget_hide(g_editor->control_coloring_items[num_items - 1]); - } else { - gtk_widget_show(g_editor->control_coloring_items[num_items - 1]); - gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(g_editor->control_coloring_items - [num_items - 1]), - TRUE); - } /* else */ - - /* Unblock signals */ - - for (i = 0; i < num_items; i++) - gtk_signal_handler_unblock_by_data(GTK_OBJECT(g_editor->control_coloring_items[i]), - (gpointer) i); -} /* cpopup_adjust_coloring_menu */ + for (i = 0; i < num_items; i++) + gtk_signal_handler_block_by_data + (GTK_OBJECT (g_editor->control_blending_items[i]), (gpointer) i); + /* Set state */ + if (equal) + { + gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (g_editor->control_blending_items[type]), TRUE); + gtk_widget_hide (g_editor->control_blending_items[num_items - 1]); + } + else + { + gtk_widget_show (g_editor->control_blending_items[num_items - 1]); + gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (g_editor->control_blending_items[num_items - 1]), TRUE); + } -/*****/ + /* Unblock signals */ + for (i = 0; i < num_items; i++) + gtk_signal_handler_unblock_by_data (GTK_OBJECT (g_editor->control_blending_items[i]), (gpointer) i); +} static void -cpopup_check_selection_params(int *equal_blending, int *equal_coloring) +cpopup_adjust_coloring_menu (void) { - grad_type_t type; - grad_color_t color; - int etype, ecolor; - grad_segment_t *seg, *aseg; - - type = g_editor->control_sel_l->type; - color = g_editor->control_sel_l->color; + gint equal; + glong i, num_items; + gint coloring; - etype = 1; - ecolor = 1; + cpopup_check_selection_params (NULL, &equal); - seg = g_editor->control_sel_l; + /* Block activate signals */ + num_items = (sizeof (g_editor->control_coloring_items) / + sizeof (g_editor->control_coloring_items[0])); - do { - etype = etype && (seg->type == type); - ecolor = ecolor && (seg->color == color); + coloring = (int) g_editor->control_sel_l->color; - aseg = seg; - seg = seg->next; - } while (aseg != g_editor->control_sel_r); + for (i = 0; i < num_items; i++) + gtk_signal_handler_block_by_data (GTK_OBJECT (g_editor->control_coloring_items[i]), (gpointer) i); - if (equal_blending) - *equal_blending = etype; + /* Set state */ + if (equal) + { + gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (g_editor->control_coloring_items[coloring]), TRUE); + gtk_widget_hide (g_editor->control_coloring_items[num_items - 1]); + } + else + { + gtk_widget_show (g_editor->control_coloring_items[num_items - 1]); + gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (g_editor->control_coloring_items[num_items - 1]), TRUE); + } - if (equal_coloring) - *equal_coloring = ecolor; -} /* cpopup_check_selection_params */ + /* Unblock signals */ + for (i = 0; i < num_items; i++) + gtk_signal_handler_unblock_by_data (GTK_OBJECT (g_editor->control_coloring_items[i]), (gpointer) i); +} +static void +cpopup_check_selection_params (gint *equal_blending, + gint *equal_coloring) +{ + grad_type_t type; + grad_color_t color; + int etype, ecolor; + grad_segment_t *seg, *aseg; -/*****/ + type = g_editor->control_sel_l->type; + color = g_editor->control_sel_l->color; -static GtkWidget * -cpopup_create_menu_item_with_label(char *str, GtkWidget **label) -{ - GtkWidget *menuitem; - GtkWidget *accel_label; + etype = 1; + ecolor = 1; - menuitem = gtk_menu_item_new(); + seg = g_editor->control_sel_l; - accel_label = gtk_accel_label_new(str); - gtk_misc_set_alignment(GTK_MISC(accel_label), 0.0, 0.5); - gtk_container_add(GTK_CONTAINER(menuitem), accel_label); - gtk_accel_label_set_accel_widget (GTK_ACCEL_LABEL (accel_label), menuitem); - gtk_widget_show(accel_label); + do + { + etype = etype && (seg->type == type); + ecolor = ecolor && (seg->color == color); - if (label) - *label = accel_label; + aseg = seg; + seg = seg->next; + } + while (aseg != g_editor->control_sel_r); - return menuitem; -} /* cpopup_create_menu_item_with_label */ + if (equal_blending) + *equal_blending = etype; + if (equal_coloring) + *equal_coloring = ecolor; +} /*****/ @@ -3590,104 +3694,105 @@ cpopup_render_color_box(GtkPreview *preview, double r, double g, double b, doubl gtk_preview_draw_row(preview, rows[2], 0, y, GRAD_COLOR_BOX_WIDTH); } /* cpopup_render_color_box */ +/***** Creale load & save menus *****/ /*****/ static GtkWidget * -cpopup_create_load_menu(GtkWidget **color_boxes, GtkWidget **labels, - char *label1, char *label2, GtkSignalFunc callback, - gchar accel_key_0, guint8 accel_mods_0, - gchar accel_key_1, guint8 accel_mods_1, - gchar accel_key_2, guint8 accel_mods_2) -{ - GtkWidget *menu; - GtkWidget *menuitem; - GtkAccelGroup *accel_group; - int i; +cpopup_create_load_menu (GtkWidget **color_boxes, + GtkWidget **labels, + gchar *label1, + gchar *label2, + GtkSignalFunc callback, + gchar accel_key_0, guint8 accel_mods_0, + gchar accel_key_1, guint8 accel_mods_1, + gchar accel_key_2, guint8 accel_mods_2) +{ + GtkWidget *menu; + GtkWidget *menuitem; + GtkAccelGroup *accel_group; + gint i; + + menu = gtk_menu_new (); + accel_group = g_editor->accel_group; - menu = gtk_menu_new(); - accel_group = g_editor->accel_group; + gtk_menu_set_accel_group (GTK_MENU (menu), accel_group); - gtk_menu_set_accel_group (GTK_MENU (menu), accel_group); + /* Create items */ + for (i = 0; i < (GRAD_NUM_COLORS + 3); i++) + { + if (i == 3) + { + /* Insert separator between "to fetch" and "saved" colors */ + menuitem = gtk_menu_item_new (); + gtk_menu_append (GTK_MENU (menu), menuitem); + gtk_widget_show (menuitem); + } - /* Create items */ + menuitem = cpopup_create_color_item (&color_boxes[i], &labels[i]); + gtk_signal_connect (GTK_OBJECT (menuitem), "activate", + callback, (gpointer) ((long) i)); + gtk_menu_append (GTK_MENU (menu), menuitem); + gtk_widget_show (menuitem); - for (i = 0; i < (GRAD_NUM_COLORS + 3); i++) { - if (i == 3) { - /* Insert separator between "to fetch" and "saved" colors */ - - menuitem = gtk_menu_item_new(); - gtk_menu_append(GTK_MENU(menu), menuitem); - gtk_widget_show(menuitem); - } /* if */ - - menuitem = cpopup_create_color_item(&color_boxes[i], &labels[i]); - gtk_signal_connect(GTK_OBJECT(menuitem), "activate", - callback, (gpointer) ((long) i)); /* FIXME: I don't like this cast */ - gtk_menu_append(GTK_MENU(menu), menuitem); - gtk_widget_show(menuitem); - - switch (i) { - case 0: - gtk_widget_add_accelerator(menuitem, - "activate", - accel_group, - accel_key_0, accel_mods_0, - GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED); - break; + switch (i) + { + case 0: + gtk_widget_add_accelerator (menuitem, "activate", + accel_group, + accel_key_0, accel_mods_0, + GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED); + break; - case 1: - gtk_widget_add_accelerator(menuitem, - "activate", - accel_group, - accel_key_1, accel_mods_1, - GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED); - break; + case 1: + gtk_widget_add_accelerator (menuitem, "activate", + accel_group, + accel_key_1, accel_mods_1, + GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED); + break; - case 2: - gtk_widget_add_accelerator(menuitem, - "activate", - accel_group, - accel_key_2, accel_mods_2, - GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED); - break; + case 2: + gtk_widget_add_accelerator (menuitem, "activate", + accel_group, + accel_key_2, accel_mods_2, + GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED); + break; - default: - break; - } /* switch */ - } /* for */ - - /* Set labels */ - - gtk_label_set(GTK_LABEL(labels[0]), label1); - gtk_label_set(GTK_LABEL(labels[1]), label2); - gtk_label_set(GTK_LABEL(labels[2]), _("FG color")); - - return menu; -} /* cpopup_create_load_menu */ + default: + break; + } + } + /* Set labels */ + gtk_label_set_text (GTK_LABEL (labels[0]), label1); + gtk_label_set_text (GTK_LABEL (labels[1]), label2); + gtk_label_set_text (GTK_LABEL (labels[2]), _("FG color")); -/*****/ + return menu; +} static GtkWidget * -cpopup_create_save_menu(GtkWidget **color_boxes, GtkWidget **labels, GtkSignalFunc callback) +cpopup_create_save_menu (GtkWidget **color_boxes, + GtkWidget **labels, + GtkSignalFunc callback) { - GtkWidget *menu; - GtkWidget *menuitem; - int i; + GtkWidget *menu; + GtkWidget *menuitem; + gint i; - menu = gtk_menu_new(); + menu = gtk_menu_new (); - for (i = 0; i < GRAD_NUM_COLORS; i++) { - menuitem = cpopup_create_color_item(&color_boxes[i], &labels[i]); - gtk_signal_connect(GTK_OBJECT(menuitem), "activate", - callback, (gpointer) ((long) i)); /* FIXME: I don't like this cast */ - gtk_menu_append(GTK_MENU(menu), menuitem); - gtk_widget_show(menuitem); - } /* for */ + for (i = 0; i < GRAD_NUM_COLORS; i++) + { + menuitem = cpopup_create_color_item (&color_boxes[i], &labels[i]); + gtk_signal_connect (GTK_OBJECT (menuitem), "activate", + callback, (gpointer) ((long) i)); + gtk_menu_append (GTK_MENU (menu), menuitem); + gtk_widget_show (menuitem); + } - return menu; -} /* cpopup_create_save_menu */ + return menu; +} /*****/ @@ -3708,10 +3813,10 @@ cpopup_update_saved_color(int n, double r, double g, double b, double a) g_snprintf(str, sizeof(str), _("RGBA (%0.3f, %0.3f, %0.3f, %0.3f)"), r, g, b, a); - gtk_label_set(GTK_LABEL(g_editor->left_load_labels[n + 3]), str); - gtk_label_set(GTK_LABEL(g_editor->left_save_labels[n]), str); - gtk_label_set(GTK_LABEL(g_editor->right_load_labels[n + 3]), str); - gtk_label_set(GTK_LABEL(g_editor->right_save_labels[n]), str); + gtk_label_set_text (GTK_LABEL (g_editor->left_load_labels[n + 3]), str); + gtk_label_set_text (GTK_LABEL (g_editor->left_save_labels[n]), str); + gtk_label_set_text (GTK_LABEL (g_editor->right_load_labels[n + 3]), str); + gtk_label_set_text (GTK_LABEL (g_editor->right_save_labels[n]), str); g_editor->saved_colors[n].r = r; g_editor->saved_colors[n].g = g; @@ -3880,1462 +3985,1435 @@ cpopup_save_right_callback(GtkWidget *widget, gpointer data) /*****/ -static GtkWidget * -cpopup_create_blending_menu(void) +static void +cpopup_set_color_selection_color(GtkColorSelection *cs, + double r, double g, double b, double a) { - GtkWidget *menu; - GtkWidget *menuitem; - GSList *group; - int i; - int num_items; - - menu = gtk_menu_new(); - group = NULL; - - num_items = sizeof(g_editor->control_blending_items) / sizeof(g_editor->control_blending_items[0]); - - for (i = 0; i < num_items; i++) { - if (i == (num_items - 1)) - menuitem = gtk_radio_menu_item_new_with_label(group, _("(Varies)")); - else - menuitem = gtk_radio_menu_item_new_with_label(group, gettext(blending_types[i])); - - group = gtk_radio_menu_item_group(GTK_RADIO_MENU_ITEM(menuitem)); - - gtk_signal_connect(GTK_OBJECT(menuitem), "activate", - (GtkSignalFunc) cpopup_blending_callback, - (gpointer) ((long) i)); /* FIXME: I don't like this cast */ - - gtk_menu_append(GTK_MENU(menu), menuitem); - gtk_widget_show(menuitem); - - g_editor->control_blending_items[i] = menuitem; - } /* for */ - - /* "Varies" is always disabled */ + gdouble color[4]; - gtk_widget_set_sensitive(g_editor->control_blending_items[num_items - 1], FALSE); + color[0] = r; + color[1] = g; + color[2] = b; + color[3] = a; - return menu; -} /* cpopup_create_blending_menu */ + gtk_color_selection_set_color(cs, color); +} /* cpopup_set_color_selection_color */ /*****/ static void -cpopup_blending_callback(GtkWidget *widget, gpointer data) +cpopup_get_color_selection_color(GtkColorSelection *cs, + double *r, double *g, double *b, double *a) { - grad_type_t type; - grad_segment_t *seg, *aseg; - - if (!GTK_CHECK_MENU_ITEM(widget)->active) - return; /* Do nothing if the menu item is being deactivated */ - - type = (grad_type_t) data; - seg = g_editor->control_sel_l; - - do { - seg->type = type; + gdouble color[4]; - aseg = seg; - seg = seg->next; - } while (aseg != g_editor->control_sel_r); + gtk_color_selection_get_color(cs, color); - curr_gradient->dirty = 1; - ed_update_editor(GRAD_UPDATE_PREVIEW); -} /* cpopup_blending_callback */ + *r = color[0]; + *g = color[1]; + *b = color[2]; + *a = color[3]; +} /* cpopup_get_color_selection_color */ /*****/ -static GtkWidget * -cpopup_create_coloring_menu(void) +static grad_segment_t * +cpopup_save_selection(void) { - GtkWidget *menu; - GtkWidget *menuitem; - GSList *group; - int i; - int num_items; + grad_segment_t *seg, *prev, *tmp; + grad_segment_t *oseg, *oaseg; + + prev = NULL; + oseg = g_editor->control_sel_l; + tmp = NULL; - menu = gtk_menu_new(); - group = NULL; + do { + seg = seg_new_segment(); - num_items = sizeof(g_editor->control_coloring_items) / sizeof(g_editor->control_coloring_items[0]); + *seg = *oseg; /* Copy everything */ - for (i = 0; i < num_items; i++) { - if (i == (num_items - 1)) - menuitem = gtk_radio_menu_item_new_with_label(group, _("(Varies)")); + if (prev == NULL) + tmp = seg; /* Remember first segment */ else - menuitem = gtk_radio_menu_item_new_with_label(group, gettext(coloring_types[i])); - - group = gtk_radio_menu_item_group(GTK_RADIO_MENU_ITEM(menuitem)); + prev->next = seg; - gtk_signal_connect(GTK_OBJECT(menuitem), "activate", - (GtkSignalFunc) cpopup_coloring_callback, - (gpointer) ((long) i)); /* FIXME: I don't like this cast */ + seg->prev = prev; + seg->next = NULL; - gtk_menu_append(GTK_MENU(menu), menuitem); - gtk_widget_show(menuitem); + prev = seg; + oaseg = oseg; + oseg = oseg->next; + } while (oaseg != g_editor->control_sel_r); - g_editor->control_coloring_items[i] = menuitem; - } /* for */ + return tmp; +} /* cpopup_save_selection */ - /* "Varies" is always disabled */ - gtk_widget_set_sensitive(g_editor->control_coloring_items[num_items - 1], FALSE); +/*****/ - return menu; -} /* cpopup_create_coloring_menu */ +static void +cpopup_free_selection(grad_segment_t *seg) +{ + seg_free_segments(seg); +} /* cpopup_free_selection */ /*****/ static void -cpopup_coloring_callback(GtkWidget *widget, gpointer data) +cpopup_replace_selection(grad_segment_t *replace_seg) { - grad_color_t color; - grad_segment_t *seg, *aseg; + grad_segment_t *lseg, *rseg; + grad_segment_t *replace_last; - if (!GTK_CHECK_MENU_ITEM(widget)->active) - return; /* Do nothing if the menu item is being deactivated */ + /* Remember left and right segments */ - color = (grad_color_t) data; - seg = g_editor->control_sel_l; + lseg = g_editor->control_sel_l->prev; + rseg = g_editor->control_sel_r->next; - do { - seg->color = color; + replace_last = seg_get_last_segment(replace_seg); - aseg = seg; - seg = seg->next; - } while (aseg != g_editor->control_sel_r); + /* Free old selection */ - curr_gradient->dirty = 1; - ed_update_editor(GRAD_UPDATE_PREVIEW); -} /* cpopup_coloring_callback */ + g_editor->control_sel_r->next = NULL; + seg_free_segments(g_editor->control_sel_l); -/*****/ + /* Link in new segments */ -static GtkWidget * -cpopup_create_sel_ops_menu(void) -{ - GtkWidget *menu; - GtkWidget *menuitem; - GtkAccelGroup *accel_group; - - menu = gtk_menu_new(); - accel_group = g_editor->accel_group; - - gtk_menu_set_accel_group (GTK_MENU (menu), accel_group); - - /* Flip */ - - menuitem = cpopup_create_menu_item_with_label("", &g_editor->control_flip_label); - gtk_signal_connect(GTK_OBJECT(menuitem), "activate", - (GtkSignalFunc) cpopup_flip_callback, - NULL); - gtk_menu_append(GTK_MENU(menu), menuitem); - gtk_widget_show(menuitem); - gtk_widget_add_accelerator(menuitem, - "activate", - accel_group, - 'F', 0, - GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED); - - /* Replicate */ - - menuitem = cpopup_create_menu_item_with_label("", &g_editor->control_replicate_label); - gtk_signal_connect(GTK_OBJECT(menuitem), "activate", - (GtkSignalFunc) cpopup_replicate_callback, - NULL); - gtk_menu_append(GTK_MENU(menu), menuitem); - gtk_widget_show(menuitem); - gtk_widget_add_accelerator(menuitem, - "activate", - accel_group, - 'M', 0, - GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED); - - /* Blend colors / opacity */ - - menuitem = gtk_menu_item_new(); - gtk_menu_append(GTK_MENU(menu), menuitem); - gtk_widget_show(menuitem); - - menuitem = gtk_menu_item_new_with_label(_("Blend endpoints' colors")); - gtk_signal_connect(GTK_OBJECT(menuitem), "activate", - (GtkSignalFunc) cpopup_blend_colors, - NULL); - gtk_menu_append(GTK_MENU(menu), menuitem); - gtk_widget_show(menuitem); - g_editor->control_blend_colors_menu_item = menuitem; - gtk_widget_add_accelerator(menuitem, - "activate", - accel_group, - 'B', 0, - GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED); - - menuitem = gtk_menu_item_new_with_label(_("Blend endpoints' opacity")); - gtk_signal_connect(GTK_OBJECT(menuitem), "activate", - (GtkSignalFunc) cpopup_blend_opacity, - NULL); - gtk_menu_append(GTK_MENU(menu), menuitem); - gtk_widget_show(menuitem); - gtk_widget_add_accelerator(menuitem, - "activate", - accel_group, - 'B', GDK_CONTROL_MASK, - GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED); - g_editor->control_blend_opacity_menu_item = menuitem; - - return menu; -} /* cpopup_create_sel_ops_menu */ + if (lseg) + lseg->next = replace_seg; + else + curr_gradient->segments = replace_seg; + replace_seg->prev = lseg; -/*****/ + if (rseg) + rseg->prev = replace_last; -static void -cpopup_blend_colors(GtkWidget *widget, gpointer data) -{ - cpopup_blend_endpoints(g_editor->control_sel_l->r0, - g_editor->control_sel_l->g0, - g_editor->control_sel_l->b0, - g_editor->control_sel_l->a0, - g_editor->control_sel_r->r1, - g_editor->control_sel_r->g1, - g_editor->control_sel_r->b1, - g_editor->control_sel_r->a1, - TRUE, FALSE); + replace_last->next = rseg; - curr_gradient->dirty = 1; - ed_update_editor(GRAD_UPDATE_PREVIEW); -} /* cpopup_blend_colors */ + g_editor->control_sel_l = replace_seg; + g_editor->control_sel_r = replace_last; + + curr_gradient->last_visited = NULL; /* Force re-search */ +} /* cpopup_replace_selection */ +/***** Color dialogs for left and right endpoint *****/ /*****/ static void -cpopup_blend_opacity(GtkWidget *widget, gpointer data) -{ - cpopup_blend_endpoints(g_editor->control_sel_l->r0, - g_editor->control_sel_l->g0, - g_editor->control_sel_l->b0, - g_editor->control_sel_l->a0, - g_editor->control_sel_r->r1, - g_editor->control_sel_r->g1, - g_editor->control_sel_r->b1, - g_editor->control_sel_r->a1, - FALSE, TRUE); +cpopup_create_color_dialog (gchar *title, + double r, double g, double b, double a, + GtkSignalFunc color_changed_callback, + GtkSignalFunc ok_callback, + GtkSignalFunc cancel_callback, + GtkSignalFunc delete_callback) +{ + GtkWidget *window; + GtkColorSelection *cs; + GtkColorSelectionDialog *csd; + + window = gtk_color_selection_dialog_new (title); + + csd = GTK_COLOR_SELECTION_DIALOG (window); + cs = GTK_COLOR_SELECTION (csd->colorsel); + + gtk_color_selection_set_opacity (cs, TRUE); + gtk_color_selection_set_update_policy (cs, + g_editor->instant_update ? + GTK_UPDATE_CONTINUOUS : + GTK_UPDATE_DELAYED); + + /* FIXME: this is a hack; we set the color twice so that the + * color selector remembers it as its "old" color, too + */ + cpopup_set_color_selection_color (cs, r, g, b, a); + cpopup_set_color_selection_color (cs, r, g, b, a); - curr_gradient->dirty = 1; - ed_update_editor(GRAD_UPDATE_PREVIEW); -} /* cpopup_blend_opacity */ + gtk_signal_connect (GTK_OBJECT (csd), "delete_event", + delete_callback, window); + gtk_signal_connect (GTK_OBJECT (cs), "color_changed", + color_changed_callback, window); -/*****/ + gtk_signal_connect (GTK_OBJECT (csd->ok_button), "clicked", + ok_callback, window); -static void -cpopup_set_color_selection_color(GtkColorSelection *cs, - double r, double g, double b, double a) -{ - gdouble color[4]; - - color[0] = r; - color[1] = g; - color[2] = b; - color[3] = a; - - gtk_color_selection_set_color(cs, color); -} /* cpopup_set_color_selection_color */ + gtk_signal_connect (GTK_OBJECT (csd->cancel_button), "clicked", + cancel_callback, window); + gtk_window_position (GTK_WINDOW (window), GTK_WIN_POS_MOUSE); + gtk_widget_show (window); +} /*****/ static void -cpopup_get_color_selection_color(GtkColorSelection *cs, - double *r, double *g, double *b, double *a) -{ - gdouble color[4]; - - gtk_color_selection_get_color(cs, color); +cpopup_set_left_color_callback (GtkWidget *widget, + gpointer data) +{ + g_editor->left_saved_dirty = curr_gradient->dirty; + g_editor->left_saved_segments = cpopup_save_selection (); + + cpopup_create_color_dialog (_("Left endpoint's color"), + g_editor->control_sel_l->r0, + g_editor->control_sel_l->g0, + g_editor->control_sel_l->b0, + g_editor->control_sel_l->a0, + (GtkSignalFunc) cpopup_left_color_changed, + (GtkSignalFunc) cpopup_left_color_dialog_ok, + (GtkSignalFunc) cpopup_left_color_dialog_cancel, + (GtkSignalFunc) cpopup_left_color_dialog_delete); - *r = color[0]; - *g = color[1]; - *b = color[2]; - *a = color[3]; -} /* cpopup_get_color_selection_color */ - - -/*****/ + gtk_widget_set_sensitive (g_editor->shell, FALSE); +} static void -cpopup_create_color_dialog(char *title, double r, double g, double b, double a, - GtkSignalFunc color_changed_callback, - GtkSignalFunc ok_callback, - GtkSignalFunc cancel_callback, - GtkSignalFunc delete_callback) +cpopup_left_color_changed (GtkWidget *widget, + gpointer data) { - GtkWidget *window; - GtkColorSelection *cs; - GtkColorSelectionDialog *csd; - - window = gtk_color_selection_dialog_new(title); - - csd = GTK_COLOR_SELECTION_DIALOG(window); - cs = GTK_COLOR_SELECTION(csd->colorsel); - - gtk_color_selection_set_opacity(cs, TRUE); - gtk_color_selection_set_update_policy(cs, - g_editor->instant_update ? - GTK_UPDATE_CONTINUOUS : - GTK_UPDATE_DELAYED); - - - /* FIXME: this is a hack; we set the color twice so that the - * color selector remembers it as its "old" color, too - */ + GtkColorSelection *cs; + double r, g, b, a; - cpopup_set_color_selection_color(cs, r, g, b, a); - cpopup_set_color_selection_color(cs, r, g, b, a); + cs = GTK_COLOR_SELECTION (GTK_COLOR_SELECTION_DIALOG (data)->colorsel); - gtk_signal_connect(GTK_OBJECT(csd), "delete_event", - delete_callback, NULL); + cpopup_get_color_selection_color (cs, &r, &g, &b, &a); - gtk_signal_connect(GTK_OBJECT(cs), "color_changed", - color_changed_callback, window); + cpopup_blend_endpoints (r, g, b, a, + g_editor->control_sel_r->r1, + g_editor->control_sel_r->g1, + g_editor->control_sel_r->b1, + g_editor->control_sel_r->a1, + TRUE, TRUE); - gtk_signal_connect(GTK_OBJECT(csd->ok_button), "clicked", - ok_callback, window); - - gtk_signal_connect(GTK_OBJECT(csd->cancel_button), "clicked", - cancel_callback, window); - - gtk_window_position(GTK_WINDOW(window), GTK_WIN_POS_MOUSE); - gtk_widget_show(window); -} /* cpopup_create_color_dialog */ - - -/*****/ + ed_update_editor (GRAD_UPDATE_PREVIEW); +} -static grad_segment_t * -cpopup_save_selection(void) +static void +cpopup_left_color_dialog_ok (GtkWidget *widget, + gpointer data) { - grad_segment_t *seg, *prev, *tmp; - grad_segment_t *oseg, *oaseg; + cpopup_left_color_changed (widget, data); - prev = NULL; - oseg = g_editor->control_sel_l; - tmp = NULL; - - do { - seg = seg_new_segment(); + curr_gradient->dirty = 1; + cpopup_free_selection(g_editor->left_saved_segments); - *seg = *oseg; /* Copy everything */ - - if (prev == NULL) - tmp = seg; /* Remember first segment */ - else - prev->next = seg; + gtk_widget_destroy (GTK_WIDGET (data)); + gtk_widget_set_sensitive (g_editor->shell, TRUE); +} - seg->prev = prev; - seg->next = NULL; +static void +cpopup_left_color_dialog_cancel (GtkWidget *widget, + gpointer data) +{ + curr_gradient->dirty = g_editor->left_saved_dirty; + cpopup_replace_selection (g_editor->left_saved_segments); + ed_update_editor (GRAD_UPDATE_PREVIEW); - prev = seg; - oaseg = oseg; - oseg = oseg->next; - } while (oaseg != g_editor->control_sel_r); + gtk_widget_destroy (GTK_WIDGET (data)); + gtk_widget_set_sensitive (g_editor->shell, TRUE); +} - return tmp; -} /* cpopup_save_selection */ +static int +cpopup_left_color_dialog_delete (GtkWidget *widget, + GdkEvent *event, + gpointer data) +{ + cpopup_left_color_dialog_cancel (widget, data); + return TRUE; +} /*****/ static void -cpopup_free_selection(grad_segment_t *seg) -{ - seg_free_segments(seg); -} /* cpopup_free_selection */ - +cpopup_set_right_color_callback (GtkWidget *widget, + gpointer data) +{ + g_editor->right_saved_dirty = curr_gradient->dirty; + g_editor->right_saved_segments = cpopup_save_selection (); + + cpopup_create_color_dialog (_("Right endpoint's color"), + g_editor->control_sel_r->r1, + g_editor->control_sel_r->g1, + g_editor->control_sel_r->b1, + g_editor->control_sel_r->a1, + (GtkSignalFunc) cpopup_right_color_changed, + (GtkSignalFunc) cpopup_right_color_dialog_ok, + (GtkSignalFunc) cpopup_right_color_dialog_cancel, + (GtkSignalFunc) cpopup_right_color_dialog_delete); -/*****/ + gtk_widget_set_sensitive (g_editor->shell, FALSE); +} static void -cpopup_replace_selection(grad_segment_t *replace_seg) +cpopup_right_color_changed (GtkWidget *widget, + gpointer data) { - grad_segment_t *lseg, *rseg; - grad_segment_t *replace_last; - - /* Remember left and right segments */ + GtkColorSelection *cs; + double r, g, b, a; - lseg = g_editor->control_sel_l->prev; - rseg = g_editor->control_sel_r->next; + cs = GTK_COLOR_SELECTION (GTK_COLOR_SELECTION_DIALOG (data)->colorsel); - replace_last = seg_get_last_segment(replace_seg); + cpopup_get_color_selection_color (cs, &r, &g, &b, &a); - /* Free old selection */ + cpopup_blend_endpoints (g_editor->control_sel_l->r0, + g_editor->control_sel_l->g0, + g_editor->control_sel_l->b0, + g_editor->control_sel_l->a0, + r, g, b, a, + TRUE, TRUE); - g_editor->control_sel_r->next = NULL; - - seg_free_segments(g_editor->control_sel_l); + ed_update_editor (GRAD_UPDATE_PREVIEW); +} - /* Link in new segments */ +static void +cpopup_right_color_dialog_ok (GtkWidget *widget, + gpointer data) +{ + cpopup_right_color_changed (widget, data); - if (lseg) - lseg->next = replace_seg; - else - curr_gradient->segments = replace_seg; + curr_gradient->dirty = 1; + cpopup_free_selection (g_editor->right_saved_segments); - replace_seg->prev = lseg; + gtk_widget_destroy (GTK_WIDGET (data)); + gtk_widget_set_sensitive (g_editor->shell, TRUE); +} - if (rseg) - rseg->prev = replace_last; +static void +cpopup_right_color_dialog_cancel (GtkWidget *widget, + gpointer data) +{ + curr_gradient->dirty = g_editor->right_saved_dirty; + cpopup_replace_selection (g_editor->right_saved_segments); + ed_update_editor (GRAD_UPDATE_PREVIEW); - replace_last->next = rseg; + gtk_widget_destroy (GTK_WIDGET (data)); + gtk_widget_set_sensitive (g_editor->shell, TRUE); +} - g_editor->control_sel_l = replace_seg; - g_editor->control_sel_r = replace_last; +static int +cpopup_right_color_dialog_delete (GtkWidget *widget, + GdkEvent *event, + gpointer data) +{ + cpopup_right_color_dialog_cancel (widget, data); - curr_gradient->last_visited = NULL; /* Force re-search */ -} /* cpopup_replace_selection */ + return TRUE; +} +/***** Blending menu *****/ /*****/ -static void -cpopup_set_left_color_callback(GtkWidget *widget, gpointer data) +static GtkWidget * +cpopup_create_blending_menu (void) { - g_editor->left_saved_dirty = curr_gradient->dirty; - g_editor->left_saved_segments = cpopup_save_selection(); - - cpopup_create_color_dialog(_("Left endpoint's color"), - g_editor->control_sel_l->r0, - g_editor->control_sel_l->g0, - g_editor->control_sel_l->b0, - g_editor->control_sel_l->a0, - (GtkSignalFunc) cpopup_left_color_changed, - (GtkSignalFunc) cpopup_left_color_dialog_ok, - (GtkSignalFunc) cpopup_left_color_dialog_cancel, - (GtkSignalFunc) cpopup_left_color_dialog_delete); - - gtk_widget_set_sensitive(g_editor->shell, FALSE); -} /* cpopup_set_left_color_callback */ + GtkWidget *menu; + GtkWidget *menuitem; + GSList *group; + gint i; + gint num_items; + menu = gtk_menu_new (); + group = NULL; -/*****/ + num_items = (sizeof (g_editor->control_blending_items) / + sizeof (g_editor->control_blending_items[0])); -static void -cpopup_left_color_changed(GtkWidget *widget, gpointer client_data) -{ - GtkColorSelection *cs; - double r, g, b, a; + for (i = 0; i < num_items; i++) + { + if (i == (num_items - 1)) + menuitem = gtk_radio_menu_item_new_with_label(group, _("(Varies)")); + else + menuitem = + gtk_radio_menu_item_new_with_label (group, + gettext (blending_types[i])); - cs = GTK_COLOR_SELECTION(GTK_COLOR_SELECTION_DIALOG(client_data)->colorsel); + group = gtk_radio_menu_item_group (GTK_RADIO_MENU_ITEM (menuitem)); - cpopup_get_color_selection_color(cs, &r, &g, &b, &a); + gtk_signal_connect (GTK_OBJECT (menuitem), "activate", + (GtkSignalFunc) cpopup_blending_callback, + (gpointer) ((long) i)); - cpopup_blend_endpoints(r, g, b, a, - g_editor->control_sel_r->r1, - g_editor->control_sel_r->g1, - g_editor->control_sel_r->b1, - g_editor->control_sel_r->a1, - TRUE, TRUE); + gtk_menu_append (GTK_MENU (menu), menuitem); + gtk_widget_show (menuitem); - ed_update_editor(GRAD_UPDATE_PREVIEW); -} /* cpopup_left_color_changed */ + g_editor->control_blending_items[i] = menuitem; + } + /* "Varies" is always disabled */ + gtk_widget_set_sensitive (g_editor->control_blending_items[num_items - 1], FALSE); -/*****/ + return menu; +} static void -cpopup_left_color_dialog_ok(GtkWidget *widget, gpointer client_data) +cpopup_blending_callback (GtkWidget *widget, + gpointer data) { - GtkColorSelection *cs; - double r, g, b, a; + grad_type_t type; + grad_segment_t *seg, *aseg; - cs = GTK_COLOR_SELECTION(GTK_COLOR_SELECTION_DIALOG(client_data)->colorsel); + if (!GTK_CHECK_MENU_ITEM (widget)->active) + return; /* Do nothing if the menu item is being deactivated */ - cpopup_get_color_selection_color(cs, &r, &g, &b, &a); + type = (grad_type_t) data; + seg = g_editor->control_sel_l; - cpopup_blend_endpoints(r, g, b, a, - g_editor->control_sel_r->r1, - g_editor->control_sel_r->g1, - g_editor->control_sel_r->b1, - g_editor->control_sel_r->a1, - TRUE, TRUE); + do + { + seg->type = type; - curr_gradient->dirty = 1; - cpopup_free_selection(g_editor->left_saved_segments); - ed_update_editor(GRAD_UPDATE_PREVIEW); + aseg = seg; + seg = seg->next; + } + while (aseg != g_editor->control_sel_r); - gtk_widget_destroy(GTK_WIDGET(client_data)); - gtk_widget_set_sensitive(g_editor->shell, TRUE); -} /* cpopup_left_color_dialog_ok */ + curr_gradient->dirty = 1; + ed_update_editor (GRAD_UPDATE_PREVIEW); +} +/***** Coloring menu *****/ /*****/ -static void -cpopup_left_color_dialog_cancel(GtkWidget *widget, gpointer client_data) +static GtkWidget * +cpopup_create_coloring_menu (void) { - curr_gradient->dirty = g_editor->left_saved_dirty; - cpopup_replace_selection(g_editor->left_saved_segments); - ed_update_editor(GRAD_UPDATE_PREVIEW); - - gtk_widget_destroy(GTK_WIDGET(client_data)); - gtk_widget_set_sensitive(g_editor->shell, TRUE); -} /* cpopup_left_color_dialog_cancel */ + GtkWidget *menu; + GtkWidget *menuitem; + GSList *group; + gint i; + gint num_items; + menu = gtk_menu_new (); + group = NULL; -/*****/ + num_items = (sizeof (g_editor->control_coloring_items) / + sizeof (g_editor->control_coloring_items[0])); -static int -cpopup_left_color_dialog_delete(GtkWidget *widget, GdkEvent *event, - gpointer data) -{ - curr_gradient->dirty = g_editor->left_saved_dirty; - cpopup_replace_selection(g_editor->left_saved_segments); - ed_update_editor(GRAD_UPDATE_PREVIEW); - - gtk_widget_set_sensitive(g_editor->shell, TRUE); - return FALSE; -} /* cpopup_left_color_dialog_delete */ + for (i = 0; i < num_items; i++) + { + if (i == (num_items - 1)) + menuitem = gtk_radio_menu_item_new_with_label(group, _("(Varies)")); + else + menuitem = gtk_radio_menu_item_new_with_label (group, gettext (coloring_types[i])); -/*****/ + group = gtk_radio_menu_item_group (GTK_RADIO_MENU_ITEM (menuitem)); -static void -cpopup_set_right_color_callback(GtkWidget *widget, gpointer data) -{ - g_editor->right_saved_dirty = curr_gradient->dirty; - g_editor->right_saved_segments = cpopup_save_selection(); + gtk_signal_connect (GTK_OBJECT (menuitem), "activate", + (GtkSignalFunc) cpopup_coloring_callback, + (gpointer) ((long) i)); - cpopup_create_color_dialog(_("Right endpoint's color"), - g_editor->control_sel_r->r1, - g_editor->control_sel_r->g1, - g_editor->control_sel_r->b1, - g_editor->control_sel_r->a1, - (GtkSignalFunc) cpopup_right_color_changed, - (GtkSignalFunc) cpopup_right_color_dialog_ok, - (GtkSignalFunc) cpopup_right_color_dialog_cancel, - (GtkSignalFunc) cpopup_right_color_dialog_delete); + gtk_menu_append (GTK_MENU (menu), menuitem); + gtk_widget_show (menuitem); - gtk_widget_set_sensitive(g_editor->shell, FALSE); -} /* cpopup_set_right_color_callback */ + g_editor->control_coloring_items[i] = menuitem; + } + /* "Varies" is always disabled */ + gtk_widget_set_sensitive (g_editor->control_coloring_items[num_items - 1], FALSE); -/*****/ + return menu; +} static void -cpopup_right_color_changed(GtkWidget *widget, gpointer client_data) +cpopup_coloring_callback (GtkWidget *widget, + gpointer data) { - GtkColorSelection *cs; - double r, g, b, a; + grad_color_t color; + grad_segment_t *seg, *aseg; - cs = GTK_COLOR_SELECTION(GTK_COLOR_SELECTION_DIALOG(client_data)->colorsel); + if (! GTK_CHECK_MENU_ITEM (widget)->active) + return; /* Do nothing if the menu item is being deactivated */ - cpopup_get_color_selection_color(cs, &r, &g, &b, &a); + color = (grad_color_t) data; + seg = g_editor->control_sel_l; - cpopup_blend_endpoints(g_editor->control_sel_l->r0, - g_editor->control_sel_l->g0, - g_editor->control_sel_l->b0, - g_editor->control_sel_l->a0, - r, g, b, a, - TRUE, TRUE); + do + { + seg->color = color; - ed_update_editor(GRAD_UPDATE_PREVIEW); -} /* cpopup_right_color_changed */ + aseg = seg; + seg = seg->next; + } + while (aseg != g_editor->control_sel_r); + curr_gradient->dirty = 1; + ed_update_editor (GRAD_UPDATE_PREVIEW); +} /*****/ static void -cpopup_right_color_dialog_ok(GtkWidget *widget, gpointer client_data) +cpopup_split_midpoint_callback (GtkWidget *widget, + gpointer data) { - GtkColorSelection *cs; - double r, g, b, a; + grad_segment_t *seg, *lseg, *rseg; - cs = GTK_COLOR_SELECTION(GTK_COLOR_SELECTION_DIALOG(client_data)->colorsel); + seg = g_editor->control_sel_l; - cpopup_get_color_selection_color(cs, &r, &g, &b, &a); + do + { + cpopup_split_midpoint (seg, &lseg, &rseg); + seg = rseg->next; + } + while (lseg != g_editor->control_sel_r); - cpopup_blend_endpoints(g_editor->control_sel_l->r0, - g_editor->control_sel_l->g0, - g_editor->control_sel_l->b0, - g_editor->control_sel_l->a0, - r, g, b, a, - TRUE, TRUE); + g_editor->control_sel_r = rseg; - curr_gradient->dirty = 1; - cpopup_free_selection(g_editor->right_saved_segments); - ed_update_editor(GRAD_UPDATE_PREVIEW); + curr_gradient->last_visited = NULL; /* Force re-search */ + curr_gradient->dirty = 1; + ed_update_editor (GRAD_UPDATE_PREVIEW | GRAD_UPDATE_CONTROL); +} - gtk_widget_destroy(GTK_WIDGET(client_data)); - gtk_widget_set_sensitive(g_editor->shell, TRUE); -} /* cpopup_right_color_dialog_ok */ +static void +cpopup_split_midpoint (grad_segment_t *lseg, + grad_segment_t **newl, + grad_segment_t **newr) +{ + double r, g, b, a; + grad_segment_t *newseg; + /* Get color at original segment's midpoint */ + grad_get_color_at(lseg->middle, &r, &g, &b, &a); -/*****/ + /* Create a new segment and insert it in the list */ -static void -cpopup_right_color_dialog_cancel(GtkWidget *widget, gpointer client_data) -{ - curr_gradient->dirty = g_editor->right_saved_dirty; - cpopup_replace_selection(g_editor->right_saved_segments); - ed_update_editor(GRAD_UPDATE_PREVIEW); + newseg = seg_new_segment(); - gtk_widget_destroy(GTK_WIDGET(client_data)); - gtk_widget_set_sensitive(g_editor->shell, TRUE); -} /* cpopup_right_color_dialog_cancel */ + newseg->prev = lseg; + newseg->next = lseg->next; + lseg->next = newseg; -/*****/ + if (newseg->next) + newseg->next->prev = newseg; -static int -cpopup_right_color_dialog_delete(GtkWidget *widget, GdkEvent *event, - gpointer data) -{ - curr_gradient->dirty = g_editor->right_saved_dirty; - cpopup_replace_selection(g_editor->right_saved_segments); - ed_update_editor(GRAD_UPDATE_PREVIEW); + /* Set coordinates of new segment */ - gtk_widget_set_sensitive(g_editor->shell, TRUE); - return FALSE; -} /* cpopup_right_color_dialog_delete */ + newseg->left = lseg->middle; + newseg->right = lseg->right; + newseg->middle = (newseg->left + newseg->right) / 2.0; + /* Set coordinates of original segment */ -/*****/ + lseg->right = newseg->left; + lseg->middle = (lseg->left + lseg->right) / 2.0; -static void -cpopup_split_midpoint_callback(GtkWidget *widget, gpointer data) -{ - grad_segment_t *seg, *lseg, *rseg; + /* Set colors of both segments */ - seg = g_editor->control_sel_l; + newseg->r1 = lseg->r1; + newseg->g1 = lseg->g1; + newseg->b1 = lseg->b1; + newseg->a1 = lseg->a1; - do { - cpopup_split_midpoint(seg, &lseg, &rseg); - seg = rseg->next; - } while (lseg != g_editor->control_sel_r); + lseg->r1 = newseg->r0 = r; + lseg->g1 = newseg->g0 = g; + lseg->b1 = newseg->b0 = b; + lseg->a1 = newseg->a0 = a; - g_editor->control_sel_r = rseg; + /* Set parameters of new segment */ - curr_gradient->last_visited = NULL; /* Force re-search */ - curr_gradient->dirty = 1; - ed_update_editor(GRAD_UPDATE_PREVIEW | GRAD_UPDATE_CONTROL); -} /* cpopup_split_midpoint_callback */ + newseg->type = lseg->type; + newseg->color = lseg->color; + + /* Done */ + *newl = lseg; + *newr = newseg; +} /*****/ static void -cpopup_split_uniform_callback(GtkWidget *widget, - gpointer data) +cpopup_split_uniform_callback (GtkWidget *widget, + gpointer data) { GtkWidget *dialog; GtkWidget *vbox; GtkWidget *label; GtkWidget *scale; - GtkWidget *button; GtkObject *scale_data; - /* Create dialog window */ + static ActionAreaItem action_items[] = + { + { N_("Split"), cpopup_split_uniform_split_callback, NULL, NULL }, + { N_("Cancel"), cpopup_split_uniform_cancel_callback, NULL, NULL } + }; + /* Create dialog window */ dialog = gtk_dialog_new (); + gtk_window_set_wmclass (GTK_WINDOW (g_editor->shell), + "gradient_segment_split_uniformly", "Gimp"); gtk_window_set_title (GTK_WINDOW (dialog), (g_editor->control_sel_l == g_editor->control_sel_r) ? _("Split segment uniformly") : _("Split segments uniformly")); gtk_window_position (GTK_WINDOW (dialog), GTK_WIN_POS_MOUSE); - gtk_container_set_border_width (GTK_CONTAINER (dialog), 0); + /* Handle the wm delete event */ + gtk_signal_connect (GTK_OBJECT (dialog), "delete_event", + GTK_SIGNAL_FUNC (cpopup_split_uniform_delete_callback), + dialog); + + /* The main vbox */ vbox = gtk_vbox_new (FALSE, 0); - gtk_container_set_border_width (GTK_CONTAINER (vbox), 8); - gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), vbox, - FALSE, FALSE, 0); + gtk_container_set_border_width (GTK_CONTAINER (vbox), 6); + gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), vbox); gtk_widget_show (vbox); - /* Instructions */ - + /* Instructions */ label = gtk_label_new (_("Please select the number of uniform parts")); - gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.0); gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0); gtk_widget_show (label); - label = gtk_label_new ((g_editor->control_sel_l == g_editor->control_sel_r) ? - _("in which you want to split the selected segment") : - _("in which you want to split the segments in the selection")); - gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.0); + label = + gtk_label_new ((g_editor->control_sel_l == g_editor->control_sel_r) ? + _("in which you want to split the selected segment") : + _("in which you want to split the segments in the selection")); gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0); gtk_widget_show (label); - /* Scale */ - + /* Scale */ g_editor->split_parts = 2; scale_data = gtk_adjustment_new (2.0, 2.0, 21.0, 1.0, 1.0, 1.0); scale = gtk_hscale_new (GTK_ADJUSTMENT (scale_data)); gtk_scale_set_digits (GTK_SCALE (scale), 0); gtk_scale_set_value_pos (GTK_SCALE (scale), GTK_POS_TOP); - gtk_box_pack_start (GTK_BOX (vbox), scale, FALSE, TRUE, 8); + gtk_box_pack_start (GTK_BOX (vbox), scale, FALSE, FALSE, 4); gtk_widget_show (scale); gtk_signal_connect (scale_data, "value_changed", (GtkSignalFunc) cpopup_split_uniform_scale_update, NULL); - /* Buttons */ - - button = ed_create_button (_("Split"), 0.5, 0.5, - (GtkSignalFunc) cpopup_split_uniform_split_callback, - (gpointer) dialog); - GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT); - gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->action_area), - button, TRUE, TRUE, 0); - gtk_widget_grab_default (button); - gtk_widget_show (button); - - button = ed_create_button (_("Cancel"), 0.5, 0.5, - (GtkSignalFunc) cpopup_split_uniform_cancel_callback, - (gpointer) dialog); - GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT); - gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->action_area), - button, TRUE, TRUE, 0); - gtk_widget_show (button); - - /* Show! */ + /* The action area */ + action_items[0].user_data = dialog; + action_items[1].user_data = dialog; + build_action_area (GTK_DIALOG (dialog), action_items, 2, 0); + /* Show! */ gtk_widget_show (dialog); gtk_widget_set_sensitive (g_editor->shell, FALSE); -} /* cpopup_split_uniform_callback */ - - -/*****/ +} static void -cpopup_delete_callback(GtkWidget *widget, gpointer data) +cpopup_split_uniform_scale_update (GtkAdjustment *adjustment, + gpointer data) { - grad_segment_t *lseg, *rseg, *seg, *aseg, *next; - double join; - - /* Remember segments to the left and to the right of the selection */ - - lseg = g_editor->control_sel_l->prev; - rseg = g_editor->control_sel_r->next; - - /* Cannot delete all the segments in the gradient */ - - if ((lseg == NULL) && (rseg == NULL)) - return; - - /* Calculate join point */ - - join = (g_editor->control_sel_l->left + g_editor->control_sel_r->right) / 2.0; - - if (lseg == NULL) - join = 0.0; - else if (rseg == NULL) - join = 1.0; - - /* Move segments */ - - if (lseg != NULL) - control_compress_range(lseg, lseg, lseg->left, join); - - if (rseg != NULL) - control_compress_range(rseg, rseg, join, rseg->right); - - /* Link */ - - if (lseg) - lseg->next = rseg; - - if (rseg) - rseg->prev = lseg; - - /* Delete old segments */ - - seg = g_editor->control_sel_l; - - do { - next = seg->next; - aseg = seg; + g_editor->split_parts = (gint) (adjustment->value + 0.5); +} - seg_free_segment(seg); +static void +cpopup_split_uniform_split_callback (GtkWidget *widget, + gpointer data) +{ + grad_segment_t *seg, *aseg, *lseg, *rseg, *lsel; - seg = next; - } while (aseg != g_editor->control_sel_r); + gtk_widget_destroy (GTK_WIDGET (data)); + gtk_widget_set_sensitive (g_editor->shell, TRUE); - /* Change selection */ + seg = g_editor->control_sel_l; + lsel = NULL; - if (rseg) { - g_editor->control_sel_l = rseg; - g_editor->control_sel_r = rseg; - } else { - g_editor->control_sel_l = lseg; - g_editor->control_sel_r = lseg; - } /* else */ + do + { + aseg = seg; - if (lseg == NULL) - curr_gradient->segments = rseg; + cpopup_split_uniform (seg, g_editor->split_parts, &lseg, &rseg); - /* Done */ + if (seg == g_editor->control_sel_l) + lsel = lseg; - curr_gradient->last_visited = NULL; /* Force re-search */ - curr_gradient->dirty = 1; - - ed_update_editor(GRAD_UPDATE_PREVIEW | GRAD_UPDATE_CONTROL); -} /* cpopup_delete_callback */ + seg = rseg->next; + } + while (aseg != g_editor->control_sel_r); + g_editor->control_sel_l = lsel; + g_editor->control_sel_r = rseg; -/*****/ + curr_gradient->last_visited = NULL; /* Force re-search */ + curr_gradient->dirty = 1; + ed_update_editor (GRAD_UPDATE_PREVIEW | GRAD_UPDATE_CONTROL); +} static void -cpopup_recenter_callback(GtkWidget *wiodget, gpointer data) +cpopup_split_uniform_cancel_callback (GtkWidget *widget, + gpointer data) { - grad_segment_t *seg, *aseg; - - seg = g_editor->control_sel_l; - - do { - seg->middle = (seg->left + seg->right) / 2.0; - - aseg = seg; - seg = seg->next; - } while (aseg != g_editor->control_sel_r); - - curr_gradient->dirty = 1; - ed_update_editor(GRAD_UPDATE_PREVIEW | GRAD_UPDATE_CONTROL); -} /* cpopup_recenter_callback */ - - -/*****/ + gtk_widget_destroy (GTK_WIDGET (data)); + gtk_widget_set_sensitive (g_editor->shell, TRUE); +} -static void -cpopup_redistribute_callback(GtkWidget *widget, gpointer data) +static gint +cpopup_split_uniform_delete_callback (GtkWidget *widget, + GdkEvent *event, + gpointer data) { - grad_segment_t *seg, *aseg; - double left, right, seg_len; - int num_segs; - int i; + cpopup_split_uniform_cancel_callback (widget, data); - /* Count number of segments in selection */ - - num_segs = 0; - seg = g_editor->control_sel_l; - - do { - num_segs++; - aseg = seg; - seg = seg->next; - } while (aseg != g_editor->control_sel_r); - - /* Calculate new segment length */ - - left = g_editor->control_sel_l->left; - right = g_editor->control_sel_r->right; - seg_len = (right - left) / num_segs; - - /* Redistribute */ - - seg = g_editor->control_sel_l; - - for (i = 0; i < num_segs; i++) { - seg->left = left + i * seg_len; - seg->right = left + (i + 1) * seg_len; - seg->middle = (seg->left + seg->right) / 2.0; - - seg = seg->next; - } /* for */ - - /* Fix endpoints to squish accumulative error */ - - g_editor->control_sel_l->left = left; - g_editor->control_sel_r->right = right; - - /* Done */ - - curr_gradient->dirty = 1; - ed_update_editor(GRAD_UPDATE_PREVIEW | GRAD_UPDATE_CONTROL); -} /* cpopup_redistribute_callback */ - - -/*****/ + return TRUE; +} static void -cpopup_flip_callback(GtkWidget *widget, gpointer data) +cpopup_split_uniform (grad_segment_t *lseg, + int parts, + grad_segment_t **newl, + grad_segment_t **newr) { - grad_segment_t *oseg, *oaseg; - grad_segment_t *seg, *prev, *tmp; - grad_segment_t *lseg, *rseg; - double left, right; - - left = g_editor->control_sel_l->left; - right = g_editor->control_sel_r->right; - - /* Build flipped segments */ - - prev = NULL; - oseg = g_editor->control_sel_r; - tmp = NULL; - - do { - seg = seg_new_segment(); - - if (prev == NULL) { - seg->left = left; - tmp = seg; /* Remember first segment */ - } else - seg->left = left + right - oseg->right; - - seg->middle = left + right - oseg->middle; - seg->right = left + right - oseg->left; - - seg->r0 = oseg->r1; - seg->g0 = oseg->g1; - seg->b0 = oseg->b1; - seg->a0 = oseg->a1; - - seg->r1 = oseg->r0; - seg->g1 = oseg->g0; - seg->b1 = oseg->b0; - seg->a1 = oseg->a0; - - switch (oseg->type) { - case GRAD_SPHERE_INCREASING: - seg->type = GRAD_SPHERE_DECREASING; - break; - - case GRAD_SPHERE_DECREASING: - seg->type = GRAD_SPHERE_INCREASING; - break; - - default: - seg->type = oseg->type; - } /* switch */ + grad_segment_t *seg, *prev, *tmp; + gdouble seg_len; + gint i; - switch (oseg->color) { - case GRAD_HSV_CCW: - seg->color = GRAD_HSV_CW; - break; + seg_len = (lseg->right - lseg->left) / parts; /* Length of divisions */ - case GRAD_HSV_CW: - seg->color = GRAD_HSV_CCW; - break; + seg = NULL; + prev = NULL; + tmp = NULL; - default: - seg->color = oseg->color; - } /* switch */ + for (i = 0; i < parts; i++) + { + seg = seg_new_segment(); - seg->prev = prev; - seg->next = NULL; + if (i == 0) + tmp = seg; /* Remember first segment */ - if (prev) - prev->next = seg; + seg->left = lseg->left + i * seg_len; + seg->right = lseg->left + (i + 1) * seg_len; + seg->middle = (seg->left + seg->right) / 2.0; - prev = seg; + grad_get_color_at (seg->left, &seg->r0, &seg->g0, &seg->b0, &seg->a0); + grad_get_color_at (seg->right, &seg->r1, &seg->g1, &seg->b1, &seg->a1); - oaseg = oseg; - oseg = oseg->prev; /* Move backwards! */ - } while (oaseg != g_editor->control_sel_l); - - seg->right = right; /* Squish accumulative error */ + seg->type = lseg->type; + seg->color = lseg->color; - /* Free old segments */ + seg->prev = prev; + seg->next = NULL; - lseg = g_editor->control_sel_l->prev; - rseg = g_editor->control_sel_r->next; + if (prev) + prev->next = seg; - oseg = g_editor->control_sel_l; + prev = seg; + } - do { - oaseg = oseg->next; - seg_free_segment(oseg); - oseg = oaseg; - } while (oaseg != rseg); + /* Fix edges */ - /* Link in new segments */ + tmp->r0 = lseg->r0; + tmp->g0 = lseg->g0; + tmp->b0 = lseg->b0; + tmp->a0 = lseg->a0; - if (lseg) - lseg->next = tmp; - else - curr_gradient->segments = tmp; + seg->r1 = lseg->r1; + seg->g1 = lseg->g1; + seg->b1 = lseg->b1; + seg->a1 = lseg->a1; - tmp->prev = lseg; + tmp->left = lseg->left; + seg->right = lseg->right; /* To squish accumulative error */ - seg->next = rseg; + /* Link in list */ - if (rseg) - rseg->prev = seg; + tmp->prev = lseg->prev; + seg->next = lseg->next; - /* Reset selection */ + if (lseg->prev) + lseg->prev->next = tmp; + else + curr_gradient->segments = tmp; /* We are on leftmost segment */ - g_editor->control_sel_l = tmp; - g_editor->control_sel_r = seg; + if (lseg->next) + lseg->next->prev = seg; - /* Done */ + curr_gradient->last_visited = NULL; /* Force re-search */ - curr_gradient->last_visited = NULL; /* Force re-search */ - curr_gradient->dirty = 1; + /* Done */ + + *newl = tmp; + *newr = seg; - ed_update_editor(GRAD_UPDATE_PREVIEW | GRAD_UPDATE_CONTROL); -} /* cpopup_flip_callback */ + /* Delete old segment */ + seg_free_segment (lseg); +} /*****/ static void -cpopup_replicate_callback(GtkWidget *widget, gpointer data) +cpopup_delete_callback (GtkWidget *widget, + gpointer data) { - GtkWidget *dialog; - GtkWidget *vbox; - GtkWidget *label; - GtkWidget *scale; - GtkWidget *button; - GtkObject *scale_data; + grad_segment_t *lseg, *rseg, *seg, *aseg, *next; + double join; - /* Create dialog window */ + /* Remember segments to the left and to the right of the selection */ - dialog = gtk_dialog_new (); - gtk_window_set_title (GTK_WINDOW (dialog), - (g_editor->control_sel_l == g_editor->control_sel_r) ? - _("Replicate segment") : - _("Replicate selection")); - gtk_window_position (GTK_WINDOW (dialog), GTK_WIN_POS_MOUSE); - gtk_container_set_border_width (GTK_CONTAINER (dialog), 0); + lseg = g_editor->control_sel_l->prev; + rseg = g_editor->control_sel_r->next; - vbox = gtk_vbox_new (FALSE, 0); - gtk_container_set_border_width (GTK_CONTAINER (vbox), 8); - gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), vbox, - FALSE, FALSE, 0); - gtk_widget_show (vbox); + /* Cannot delete all the segments in the gradient */ - /* Instructions */ + if ((lseg == NULL) && (rseg == NULL)) + return; - label = gtk_label_new (_("Please select the number of times")); - gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.0); - gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0); - gtk_widget_show (label); + /* Calculate join point */ - label = gtk_label_new ((g_editor->control_sel_l == g_editor->control_sel_r) ? - _("you want to replicate the selected segment") : - _("you want to replicate the selection")); - gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.0); - gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0); - gtk_widget_show (label); + join = (g_editor->control_sel_l->left + g_editor->control_sel_r->right) / 2.0; - /* Scale */ + if (lseg == NULL) + join = 0.0; + else if (rseg == NULL) + join = 1.0; - g_editor->replicate_times = 2; - scale_data = gtk_adjustment_new (2.0, 2.0, 21.0, 1.0, 1.0, 1.0); + /* Move segments */ - scale = gtk_hscale_new (GTK_ADJUSTMENT (scale_data)); - gtk_scale_set_digits (GTK_SCALE (scale), 0); - gtk_scale_set_value_pos (GTK_SCALE (scale), GTK_POS_TOP); - gtk_box_pack_start (GTK_BOX (vbox), scale, FALSE, TRUE, 8); - gtk_widget_show (scale); + if (lseg != NULL) + control_compress_range (lseg, lseg, lseg->left, join); - gtk_signal_connect (scale_data, "value_changed", - (GtkSignalFunc) cpopup_replicate_scale_update, - NULL); + if (rseg != NULL) + control_compress_range (rseg, rseg, join, rseg->right); - /* Buttons */ + /* Link */ - button = ed_create_button (_("Replicate"), 0.5, 0.5, - (GtkSignalFunc) cpopup_do_replicate_callback, - (gpointer) dialog); - GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT); - gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->action_area), - button, TRUE, TRUE, 0); - gtk_widget_grab_default (button); - gtk_widget_show (button); + if (lseg) + lseg->next = rseg; - button = ed_create_button (_("Cancel"), 0.5, 0.5, - (GtkSignalFunc) cpopup_replicate_cancel_callback, - (gpointer) dialog); - GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT); - gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->action_area), - button, TRUE, TRUE, 0); - gtk_widget_show (button); + if (rseg) + rseg->prev = lseg; - /* Show! */ + /* Delete old segments */ - gtk_widget_show (dialog); - gtk_widget_set_sensitive (g_editor->shell, FALSE); -} /* cpopup_replicate_callback */ + seg = g_editor->control_sel_l; + + do + { + next = seg->next; + aseg = seg; + + seg_free_segment (seg); + + seg = next; + } + while (aseg != g_editor->control_sel_r); + /* Change selection */ + + if (rseg) + { + g_editor->control_sel_l = rseg; + g_editor->control_sel_r = rseg; + } + else + { + g_editor->control_sel_l = lseg; + g_editor->control_sel_r = lseg; + } + + if (lseg == NULL) + curr_gradient->segments = rseg; + + /* Done */ + + curr_gradient->last_visited = NULL; /* Force re-search */ + curr_gradient->dirty = 1; + + ed_update_editor (GRAD_UPDATE_PREVIEW | GRAD_UPDATE_CONTROL); +} /*****/ static void -cpopup_split_uniform_scale_update(GtkAdjustment *adjustment, gpointer data) +cpopup_recenter_callback (GtkWidget *wiodget, + gpointer data) { - g_editor->split_parts = (int) (adjustment->value + 0.5); /* We have to round */ -} /* cpopup_split_uniform_scale_update */ + grad_segment_t *seg, *aseg; + + seg = g_editor->control_sel_l; + + do + { + seg->middle = (seg->left + seg->right) / 2.0; + + aseg = seg; + seg = seg->next; + } + while (aseg != g_editor->control_sel_r); + curr_gradient->dirty = 1; + ed_update_editor (GRAD_UPDATE_PREVIEW | GRAD_UPDATE_CONTROL); +} /*****/ static void -cpopup_split_uniform_split_callback(GtkWidget *widget, gpointer client_data) +cpopup_redistribute_callback (GtkWidget *widget, + gpointer data) { - grad_segment_t *seg, *aseg, *lseg, *rseg, *lsel; + grad_segment_t *seg, *aseg; + double left, right, seg_len; + int num_segs; + int i; - gtk_widget_destroy(GTK_WIDGET(client_data)); - gtk_widget_set_sensitive(g_editor->shell, TRUE); + /* Count number of segments in selection */ - seg = g_editor->control_sel_l; - lsel = NULL; + num_segs = 0; + seg = g_editor->control_sel_l; - do { - aseg = seg; + do + { + num_segs++; + aseg = seg; + seg = seg->next; + } + while (aseg != g_editor->control_sel_r); - cpopup_split_uniform(seg, g_editor->split_parts, &lseg, &rseg); + /* Calculate new segment length */ - if (seg == g_editor->control_sel_l) - lsel = lseg; + left = g_editor->control_sel_l->left; + right = g_editor->control_sel_r->right; + seg_len = (right - left) / num_segs; - seg = rseg->next; - } while (aseg != g_editor->control_sel_r); + /* Redistribute */ - g_editor->control_sel_l = lsel; - g_editor->control_sel_r = rseg; + seg = g_editor->control_sel_l; - curr_gradient->last_visited = NULL; /* Force re-search */ - curr_gradient->dirty = 1; - ed_update_editor(GRAD_UPDATE_PREVIEW | GRAD_UPDATE_CONTROL); -} /* cpopup_split_uniform_split_callback */ + for (i = 0; i < num_segs; i++) + { + seg->left = left + i * seg_len; + seg->right = left + (i + 1) * seg_len; + seg->middle = (seg->left + seg->right) / 2.0; + seg = seg->next; + } -/*****/ + /* Fix endpoints to squish accumulative error */ -static void -cpopup_split_uniform_cancel_callback(GtkWidget *widget, gpointer client_data) -{ - gtk_widget_destroy(GTK_WIDGET(client_data)); - gtk_widget_set_sensitive(g_editor->shell, TRUE); -} /* cpopup_split_uniform_cancel_callback */ + g_editor->control_sel_l->left = left; + g_editor->control_sel_r->right = right; + + /* Done */ + + curr_gradient->dirty = 1; + ed_update_editor (GRAD_UPDATE_PREVIEW | GRAD_UPDATE_CONTROL); +} +/***** Control popup -> selection options functions *****/ /*****/ -static void -cpopup_replicate_scale_update(GtkAdjustment *adjustment, gpointer data) +static GtkWidget * +cpopup_create_sel_ops_menu (void) { - g_editor->replicate_times = (int) (adjustment->value + 0.5); /* We have to round */ -} /* cpopup_replicate_scale_update */ + GtkWidget *menu; + GtkWidget *menuitem; + GtkAccelGroup *accel_group; + + menu = gtk_menu_new (); + accel_group = g_editor->accel_group; + + gtk_menu_set_accel_group (GTK_MENU (menu), accel_group); + /* Flip */ + menuitem = + cpopup_create_menu_item_with_label ("", &g_editor->control_flip_label); + gtk_signal_connect (GTK_OBJECT (menuitem), "activate", + (GtkSignalFunc) cpopup_flip_callback, + NULL); + gtk_menu_append (GTK_MENU (menu), menuitem); + gtk_widget_show (menuitem); + gtk_widget_add_accelerator (menuitem, "activate", + accel_group, + 'F', 0, + GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED); + + /* Replicate */ + menuitem = + cpopup_create_menu_item_with_label ("", &g_editor->control_replicate_label); + gtk_signal_connect (GTK_OBJECT (menuitem), "activate", + (GtkSignalFunc) cpopup_replicate_callback, + NULL); + gtk_menu_append (GTK_MENU (menu), menuitem); + gtk_widget_show (menuitem); + gtk_widget_add_accelerator (menuitem, "activate", + accel_group, + 'M', 0, + GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED); + + /* Blend colors / opacity */ + menuitem = gtk_menu_item_new (); + gtk_menu_append (GTK_MENU (menu), menuitem); + gtk_widget_show (menuitem); + + menuitem = gtk_menu_item_new_with_label (_("Blend endpoints' colors")); + gtk_signal_connect (GTK_OBJECT (menuitem), "activate", + (GtkSignalFunc) cpopup_blend_colors, + NULL); + gtk_menu_append (GTK_MENU (menu), menuitem); + gtk_widget_show (menuitem); + g_editor->control_blend_colors_menu_item = menuitem; + gtk_widget_add_accelerator (menuitem, "activate", + accel_group, + 'B', 0, + GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED); + + menuitem = gtk_menu_item_new_with_label (_("Blend endpoints' opacity")); + gtk_signal_connect (GTK_OBJECT (menuitem), "activate", + (GtkSignalFunc) cpopup_blend_opacity, + NULL); + gtk_menu_append (GTK_MENU (menu), menuitem); + gtk_widget_show (menuitem); + gtk_widget_add_accelerator (menuitem, "activate", + accel_group, + 'B', GDK_CONTROL_MASK, + GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED); + g_editor->control_blend_opacity_menu_item = menuitem; + + return menu; +} /*****/ static void -cpopup_do_replicate_callback(GtkWidget *widget, gpointer client_data) +cpopup_flip_callback (GtkWidget *widget, + gpointer data) { - double sel_left, sel_right, sel_len; - double new_left; - double factor; - grad_segment_t *prev, *seg, *tmp; - grad_segment_t *oseg, *oaseg; - grad_segment_t *lseg, *rseg; - int i; + grad_segment_t *oseg, *oaseg; + grad_segment_t *seg, *prev, *tmp; + grad_segment_t *lseg, *rseg; + double left, right; - gtk_widget_destroy(GTK_WIDGET(client_data)); - gtk_widget_set_sensitive(g_editor->shell, TRUE); + left = g_editor->control_sel_l->left; + right = g_editor->control_sel_r->right; - /* Remember original parameters */ + /* Build flipped segments */ - sel_left = g_editor->control_sel_l->left; - sel_right = g_editor->control_sel_r->right; - sel_len = sel_right - sel_left; - - factor = 1.0 / g_editor->replicate_times; - - /* Build replicated segments */ + prev = NULL; + oseg = g_editor->control_sel_r; + tmp = NULL; - prev = NULL; - seg = NULL; - tmp = NULL; + do + { + seg = seg_new_segment (); - for (i = 0; i < g_editor->replicate_times; i++) { - /* Build one cycle */ + if (prev == NULL) + { + seg->left = left; + tmp = seg; /* Remember first segment */ + } + else + seg->left = left + right - oseg->right; - new_left = sel_left + i * factor * sel_len; + seg->middle = left + right - oseg->middle; + seg->right = left + right - oseg->left; - oseg = g_editor->control_sel_l; + seg->r0 = oseg->r1; + seg->g0 = oseg->g1; + seg->b0 = oseg->b1; + seg->a0 = oseg->a1; - do { - seg = seg_new_segment(); + seg->r1 = oseg->r0; + seg->g1 = oseg->g0; + seg->b1 = oseg->b0; + seg->a1 = oseg->a0; - if (prev == NULL) { - seg->left = sel_left; - tmp = seg; /* Remember first segment */ - } else - seg->left = new_left + factor * (oseg->left - sel_left); + switch (oseg->type) + { + case GRAD_SPHERE_INCREASING: + seg->type = GRAD_SPHERE_DECREASING; + break; - seg->middle = new_left + factor * (oseg->middle - sel_left); - seg->right = new_left + factor * (oseg->right - sel_left); + case GRAD_SPHERE_DECREASING: + seg->type = GRAD_SPHERE_INCREASING; + break; - seg->r0 = oseg->r0; - seg->g0 = oseg->g0; - seg->b0 = oseg->b0; - seg->a0 = oseg->a0; + default: + seg->type = oseg->type; + } - seg->r1 = oseg->r1; - seg->g1 = oseg->g1; - seg->b1 = oseg->b1; - seg->a1 = oseg->a1; + switch (oseg->color) + { + case GRAD_HSV_CCW: + seg->color = GRAD_HSV_CW; + break; - seg->type = oseg->type; - seg->color = oseg->color; + case GRAD_HSV_CW: + seg->color = GRAD_HSV_CCW; + break; - seg->prev = prev; - seg->next = NULL; + default: + seg->color = oseg->color; + } - if (prev) - prev->next = seg; + seg->prev = prev; + seg->next = NULL; - prev = seg; + if (prev) + prev->next = seg; - oaseg = oseg; - oseg = oseg->next; - } while (oaseg != g_editor->control_sel_r); - } /* for */ + prev = seg; - seg->right = sel_right; /* Squish accumulative error */ + oaseg = oseg; + oseg = oseg->prev; /* Move backwards! */ + } + while (oaseg != g_editor->control_sel_l); - /* Free old segments */ + seg->right = right; /* Squish accumulative error */ - lseg = g_editor->control_sel_l->prev; - rseg = g_editor->control_sel_r->next; + /* Free old segments */ - oseg = g_editor->control_sel_l; + lseg = g_editor->control_sel_l->prev; + rseg = g_editor->control_sel_r->next; - do { - oaseg = oseg->next; - seg_free_segment(oseg); - oseg = oaseg; - } while (oaseg != rseg); + oseg = g_editor->control_sel_l; - /* Link in new segments */ + do + { + oaseg = oseg->next; + seg_free_segment (oseg); + oseg = oaseg; + } + while (oaseg != rseg); - if (lseg) - lseg->next = tmp; - else - curr_gradient->segments = tmp; + /* Link in new segments */ - tmp->prev = lseg; + if (lseg) + lseg->next = tmp; + else + curr_gradient->segments = tmp; - seg->next = rseg; + tmp->prev = lseg; - if (rseg) - rseg->prev = seg; + seg->next = rseg; - /* Reset selection */ + if (rseg) + rseg->prev = seg; - g_editor->control_sel_l = tmp; - g_editor->control_sel_r = seg; + /* Reset selection */ - /* Done */ + g_editor->control_sel_l = tmp; + g_editor->control_sel_r = seg; - curr_gradient->last_visited = NULL; /* Force re-search */ - curr_gradient->dirty = 1; + /* Done */ - ed_update_editor(GRAD_UPDATE_PREVIEW | GRAD_UPDATE_CONTROL); -} /* cpopup_do_replicate_callback */ + curr_gradient->last_visited = NULL; /* Force re-search */ + curr_gradient->dirty = 1; + ed_update_editor (GRAD_UPDATE_PREVIEW | GRAD_UPDATE_CONTROL); +} /*****/ static void -cpopup_replicate_cancel_callback(GtkWidget *widget, gpointer client_data) +cpopup_replicate_callback (GtkWidget *widget, + gpointer data) { - gtk_widget_destroy(GTK_WIDGET(client_data)); - gtk_widget_set_sensitive(g_editor->shell, TRUE); -} /* cpopup_replicate_cancel_callback */ + GtkWidget *dialog; + GtkWidget *vbox; + GtkWidget *label; + GtkWidget *scale; + GtkObject *scale_data; + static ActionAreaItem action_items[] = + { + { N_("Replicate"), cpopup_do_replicate_callback, NULL, NULL }, + { N_("Cancel"), cpopup_replicate_cancel_callback, NULL, NULL } + }; -/*****/ + /* Create dialog window */ + dialog = gtk_dialog_new (); + gtk_window_set_wmclass (GTK_WINDOW (dialog), + "gradient_segment_replicate", "Gimp"); + gtk_window_set_title (GTK_WINDOW (dialog), + (g_editor->control_sel_l == g_editor->control_sel_r) ? + _("Replicate segment") : + _("Replicate selection")); + gtk_window_position (GTK_WINDOW (dialog), GTK_WIN_POS_MOUSE); -static void -cpopup_blend_endpoints(double r0, double g0, double b0, double a0, - double r1, double g1, double b1, double a1, - int blend_colors, int blend_opacity) -{ - double dr, dg, db, da; - double left, len; - grad_segment_t *seg, *aseg; + /* Handle the wm delete event */ + gtk_signal_connect (GTK_OBJECT (dialog), "delete_event", + GTK_SIGNAL_FUNC (cpopup_replicate_delete_callback), + dialog); - dr = r1 - r0; - dg = g1 - g0; - db = b1 - b0; - da = a1 - a0; + vbox = gtk_vbox_new (FALSE, 0); + gtk_container_set_border_width (GTK_CONTAINER (vbox), 6); + gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), vbox); + gtk_widget_show (vbox); - left = g_editor->control_sel_l->left; - len = g_editor->control_sel_r->right - left; + /* Instructions */ + label = gtk_label_new (_("Please select the number of times")); + gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0); + gtk_widget_show (label); - seg = g_editor->control_sel_l; + label = gtk_label_new ((g_editor->control_sel_l == g_editor->control_sel_r) ? + _("you want to replicate the selected segment") : + _("you want to replicate the selection")); + gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0); + gtk_widget_show (label); - do { - if (blend_colors) { - seg->r0 = r0 + (seg->left - left) / len * dr; - seg->g0 = g0 + (seg->left - left) / len * dg; - seg->b0 = b0 + (seg->left - left) / len * db; + /* Scale */ + g_editor->replicate_times = 2; + scale_data = gtk_adjustment_new (2.0, 2.0, 21.0, 1.0, 1.0, 1.0); - seg->r1 = r0 + (seg->right - left) / len * dr; - seg->g1 = g0 + (seg->right - left) / len * dg; - seg->b1 = b0 + (seg->right - left) / len * db; - } /* if */ + scale = gtk_hscale_new (GTK_ADJUSTMENT (scale_data)); + gtk_scale_set_digits (GTK_SCALE (scale), 0); + gtk_scale_set_value_pos (GTK_SCALE (scale), GTK_POS_TOP); + gtk_box_pack_start (GTK_BOX (vbox), scale, FALSE, TRUE, 4); + gtk_widget_show (scale); - if (blend_opacity) { - seg->a0 = a0 + (seg->left - left) / len * da; - seg->a1 = a0 + (seg->right - left) / len * da; - } /* if */ + gtk_signal_connect (scale_data, "value_changed", + (GtkSignalFunc) cpopup_replicate_scale_update, + NULL); - aseg = seg; - seg = seg->next; - } while (aseg != g_editor->control_sel_r); -} /* cpopup_blend_endpoints */ + /* The action area */ + action_items[0].user_data = dialog; + action_items[1].user_data = dialog; + build_action_area (GTK_DIALOG (dialog), action_items, 2, 1); + /* Show! */ + gtk_widget_show (dialog); + gtk_widget_set_sensitive (g_editor->shell, FALSE); +} -/*****/ +static void +cpopup_replicate_scale_update (GtkAdjustment *adjustment, + gpointer data) +{ + g_editor->replicate_times = (int) (adjustment->value + 0.5); +} static void -cpopup_split_midpoint(grad_segment_t *lseg, grad_segment_t **newl, grad_segment_t **newr) +cpopup_do_replicate_callback (GtkWidget *widget, + gpointer data) { - double r, g, b, a; - grad_segment_t *newseg; + gdouble sel_left, sel_right, sel_len; + gdouble new_left; + gdouble factor; + grad_segment_t *prev, *seg, *tmp; + grad_segment_t *oseg, *oaseg; + grad_segment_t *lseg, *rseg; + gint i; - /* Get color at original segment's midpoint */ + gtk_widget_destroy (GTK_WIDGET (data)); + gtk_widget_set_sensitive (g_editor->shell, TRUE); - grad_get_color_at(lseg->middle, &r, &g, &b, &a); + /* Remember original parameters */ + sel_left = g_editor->control_sel_l->left; + sel_right = g_editor->control_sel_r->right; + sel_len = sel_right - sel_left; - /* Create a new segment and insert it in the list */ + factor = 1.0 / g_editor->replicate_times; - newseg = seg_new_segment(); + /* Build replicated segments */ - newseg->prev = lseg; - newseg->next = lseg->next; + prev = NULL; + seg = NULL; + tmp = NULL; - lseg->next = newseg; + for (i = 0; i < g_editor->replicate_times; i++) + { + /* Build one cycle */ - if (newseg->next) - newseg->next->prev = newseg; + new_left = sel_left + i * factor * sel_len; - /* Set coordinates of new segment */ + oseg = g_editor->control_sel_l; - newseg->left = lseg->middle; - newseg->right = lseg->right; - newseg->middle = (newseg->left + newseg->right) / 2.0; + do + { + seg = seg_new_segment(); - /* Set coordinates of original segment */ + if (prev == NULL) + { + seg->left = sel_left; + tmp = seg; /* Remember first segment */ + } + else + seg->left = new_left + factor * (oseg->left - sel_left); - lseg->right = newseg->left; - lseg->middle = (lseg->left + lseg->right) / 2.0; + seg->middle = new_left + factor * (oseg->middle - sel_left); + seg->right = new_left + factor * (oseg->right - sel_left); - /* Set colors of both segments */ + seg->r0 = oseg->r0; + seg->g0 = oseg->g0; + seg->b0 = oseg->b0; + seg->a0 = oseg->a0; - newseg->r1 = lseg->r1; - newseg->g1 = lseg->g1; - newseg->b1 = lseg->b1; - newseg->a1 = lseg->a1; + seg->r1 = oseg->r1; + seg->g1 = oseg->g1; + seg->b1 = oseg->b1; + seg->a1 = oseg->a1; - lseg->r1 = newseg->r0 = r; - lseg->g1 = newseg->g0 = g; - lseg->b1 = newseg->b0 = b; - lseg->a1 = newseg->a0 = a; + seg->type = oseg->type; + seg->color = oseg->color; - /* Set parameters of new segment */ + seg->prev = prev; + seg->next = NULL; - newseg->type = lseg->type; - newseg->color = lseg->color; + if (prev) + prev->next = seg; - /* Done */ + prev = seg; - *newl = lseg; - *newr = newseg; -} /* cpopup_split_midpoint */ + oaseg = oseg; + oseg = oseg->next; + } + while (oaseg != g_editor->control_sel_r); + } + seg->right = sel_right; /* Squish accumulative error */ -/*****/ + /* Free old segments */ -static void -cpopup_split_uniform(grad_segment_t *lseg, int parts, - grad_segment_t **newl, grad_segment_t **newr) -{ - grad_segment_t *seg, *prev, *tmp; - double seg_len; - int i; + lseg = g_editor->control_sel_l->prev; + rseg = g_editor->control_sel_r->next; - seg_len = (lseg->right - lseg->left) / parts; /* Length of divisions */ + oseg = g_editor->control_sel_l; - seg = NULL; - prev = NULL; - tmp = NULL; + do + { + oaseg = oseg->next; + seg_free_segment(oseg); + oseg = oaseg; + } + while (oaseg != rseg); - for (i = 0; i < parts; i++) { - seg = seg_new_segment(); + /* Link in new segments */ - if (i == 0) - tmp = seg; /* Remember first segment */ + if (lseg) + lseg->next = tmp; + else + curr_gradient->segments = tmp; - seg->left = lseg->left + i * seg_len; - seg->right = lseg->left + (i + 1) * seg_len; - seg->middle = (seg->left + seg->right) / 2.0; + tmp->prev = lseg; - grad_get_color_at(seg->left, &seg->r0, &seg->g0, &seg->b0, &seg->a0); - grad_get_color_at(seg->right, &seg->r1, &seg->g1, &seg->b1, &seg->a1); + seg->next = rseg; - seg->type = lseg->type; - seg->color = lseg->color; + if (rseg) + rseg->prev = seg; - seg->prev = prev; - seg->next = NULL; + /* Reset selection */ - if (prev) - prev->next = seg; + g_editor->control_sel_l = tmp; + g_editor->control_sel_r = seg; - prev = seg; - } /* for */ + /* Done */ + + curr_gradient->last_visited = NULL; /* Force re-search */ + curr_gradient->dirty = 1; - /* Fix edges */ + ed_update_editor (GRAD_UPDATE_PREVIEW | GRAD_UPDATE_CONTROL); +} + +static void +cpopup_replicate_cancel_callback (GtkWidget *widget, + gpointer data) +{ + gtk_widget_destroy (GTK_WIDGET (data)); + gtk_widget_set_sensitive (g_editor->shell, TRUE); +} - tmp->r0 = lseg->r0; - tmp->g0 = lseg->g0; - tmp->b0 = lseg->b0; - tmp->a0 = lseg->a0; +static gint +cpopup_replicate_delete_callback (GtkWidget *widget, + GdkEvent *event, + gpointer data) +{ + cpopup_replicate_cancel_callback (widget, data); - seg->r1 = lseg->r1; - seg->g1 = lseg->g1; - seg->b1 = lseg->b1; - seg->a1 = lseg->a1; + return TRUE; +} - tmp->left = lseg->left; - seg->right = lseg->right; /* To squish accumulative error */ +/*****/ - /* Link in list */ +static void +cpopup_blend_colors (GtkWidget *widget, + gpointer data) +{ + cpopup_blend_endpoints (g_editor->control_sel_l->r0, + g_editor->control_sel_l->g0, + g_editor->control_sel_l->b0, + g_editor->control_sel_l->a0, + g_editor->control_sel_r->r1, + g_editor->control_sel_r->g1, + g_editor->control_sel_r->b1, + g_editor->control_sel_r->a1, + TRUE, FALSE); + + curr_gradient->dirty = 1; + ed_update_editor (GRAD_UPDATE_PREVIEW); +} - tmp->prev = lseg->prev; - seg->next = lseg->next; +static void +cpopup_blend_opacity (GtkWidget *widget, + gpointer data) +{ + cpopup_blend_endpoints (g_editor->control_sel_l->r0, + g_editor->control_sel_l->g0, + g_editor->control_sel_l->b0, + g_editor->control_sel_l->a0, + g_editor->control_sel_r->r1, + g_editor->control_sel_r->g1, + g_editor->control_sel_r->b1, + g_editor->control_sel_r->a1, + FALSE, TRUE); + + curr_gradient->dirty = 1; + ed_update_editor (GRAD_UPDATE_PREVIEW); +} - if (lseg->prev) - lseg->prev->next = tmp; - else - curr_gradient->segments = tmp; /* We are on leftmost segment */ +/***** Main blend function *****/ - if (lseg->next) - lseg->next->prev = seg; +/*****/ - curr_gradient->last_visited = NULL; /* Force re-search */ +static void +cpopup_blend_endpoints (double r0, double g0, double b0, double a0, + double r1, double g1, double b1, double a1, + int blend_colors, + int blend_opacity) +{ + double dr, dg, db, da; + double left, len; + grad_segment_t *seg, *aseg; - /* Done */ + dr = r1 - r0; + dg = g1 - g0; + db = b1 - b0; + da = a1 - a0; - *newl = tmp; - *newr = seg; + left = g_editor->control_sel_l->left; + len = g_editor->control_sel_r->right - left; - /* Delete old segment */ + seg = g_editor->control_sel_l; - seg_free_segment(lseg); -} /* cpopup_split_uniform */ + do + { + if (blend_colors) + { + seg->r0 = r0 + (seg->left - left) / len * dr; + seg->g0 = g0 + (seg->left - left) / len * dg; + seg->b0 = b0 + (seg->left - left) / len * db; + + seg->r1 = r0 + (seg->right - left) / len * dr; + seg->g1 = g0 + (seg->right - left) / len * dg; + seg->b1 = b0 + (seg->right - left) / len * db; + } + if (blend_opacity) + { + seg->a0 = a0 + (seg->left - left) / len * da; + seg->a1 = a0 + (seg->right - left) / len * da; + } + + aseg = seg; + seg = seg->next; + } + while (aseg != g_editor->control_sel_r); +} /***** Gradient functions *****/ @@ -5978,87 +6056,92 @@ calc_hsv_to_rgb(double *h, double *s, double *v) /*****/ -static char * -build_user_filename(char *name, char *path_str) +static gchar * +build_user_filename (gchar *name, + gchar *path_str) { - char *home; - char *local_path; - char *first_token; - char *token; - char *path; - char *filename; - - g_assert(name != NULL); + gchar *home; + gchar *local_path; + gchar *first_token; + gchar *token; + gchar *path; + gchar *filename; - if (!path_str) - return NULL; /* Perhaps this is not a good idea */ + g_assert (name != NULL); - /* Get the first path specified in the list */ + if (!path_str) + return NULL; /* Perhaps this is not a good idea */ - home = g_get_home_dir (); - local_path = g_strdup(path_str); - first_token = local_path; - token = xstrsep(&first_token, G_SEARCHPATH_SEPARATOR_S); - filename = NULL; + /* Get the first path specified in the list */ - if (token) { - if (*token == '~') { - if (!home) - return NULL; - path = g_strdup_printf("%s%s", home, token + 1); - } else { - path = g_strdup(token); - } /* else */ + home = g_get_home_dir (); + local_path = g_strdup (path_str); + first_token = local_path; + token = xstrsep (&first_token, G_SEARCHPATH_SEPARATOR_S); + filename = NULL; - filename = g_strdup_printf("%s" G_DIR_SEPARATOR_S "%s", - path, name); + if (token) + { + if (*token == '~') + { + if (!home) + return NULL; + path = g_strdup_printf ("%s%s", home, token + 1); + } + else + { + path = g_strdup (token); + } - g_free(path); - } /* if */ + filename = g_strdup_printf ("%s" G_DIR_SEPARATOR_S "%s", + path, name); - g_free(local_path); + g_free (path); + } - return filename; -} /* build_user_filename */ + g_free (local_path); + return filename; +} gint -grad_set_grad_to_name(gchar *name) +grad_set_grad_to_name (gchar *name) { GSList *list; gradient_t *grad; - int n = 0; + gint n = 0; list = gradients_list; - while (list) { - grad = list->data; + while (list) + { + grad = list->data; - if (strcmp(grad->name, name) == 0) { - /* We found it! */ - - /* Select that gradient in the listbox */ - /* Only if gradient editor has been created */ - - if(g_editor) + if (strcmp (grad->name, name) == 0) { - gtk_clist_select_row(GTK_CLIST(g_editor->clist),n,-1); - gtk_clist_moveto(GTK_CLIST(g_editor->clist),n,0,0.5,0.0); - } - else - { - /* force internal structs to use selected gradient */ - GSList* tmp = g_slist_nth(gradients_list,n); - if(tmp) - curr_gradient = (gradient_t *)(tmp->data); + /* We found it! */ + + /* Select that gradient in the listbox */ + /* Only if gradient editor has been created */ + if (g_editor) + { + gtk_clist_select_row (GTK_CLIST (g_editor->clist), n, -1); + gtk_clist_moveto (GTK_CLIST (g_editor->clist), n, 0, 0.5, 0.0); + } + else + { + /* force internal structs to use selected gradient */ + GSList* tmp = g_slist_nth (gradients_list,n); + if(tmp) + curr_gradient = (gradient_t *) (tmp->data); + } + return TRUE; } - return TRUE; - } /* if */ - n++; - list = g_slist_next(list); - } /* while */ - + n++; + list = g_slist_next (list); + } + return FALSE; } diff --git a/app/gradient_editor.c b/app/gradient_editor.c index 01cb35da0a..e8752b2553 100644 --- a/app/gradient_editor.c +++ b/app/gradient_editor.c @@ -19,7 +19,6 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - /* alt: Added previews and some other buttons to gradient dialog. * * hof: Hofer Wolfgang, 1998.01.27 avoid resize bug by keeping @@ -38,7 +37,6 @@ * Many thanks to Eiichi and Marcelo for their suggestions! */ - /* Release date: 1997/05/07 * * - Added accelerator keys for the popup functions. This allows for @@ -52,7 +50,6 @@ * - Added grad_dump_gradient(); it is useful for debugging. */ - /* Release date: 1997/04/30 * * - All `dangerous' dialogs now de-sensitize the main editor window. @@ -67,7 +64,6 @@ * for debugging). */ - /* Release date: 1997/04/22 * * - Added GtkRadioMenuItems to the blending and coloring pop-up @@ -81,7 +77,6 @@ * know why nobody killed me for not having done it before. */ - /* Release date: 1997/04/21 * * - Re-wrote the old pop-up menu code, which was *horrible*. The @@ -104,7 +99,6 @@ * them. */ - /* Special thanks to: * * Luis Albarran (luis4@mindspring.com) - Nice UI suggestions @@ -119,7 +113,6 @@ * Everyone on #gimp - many suggestions */ - /* TODO: * * - Fix memory leaks: grad_free_gradient_editor() and any others @@ -174,6 +167,9 @@ #include "libgimp/gimpintl.h" +#include "pixmaps/zoom_in.xpm" +#include "pixmaps/zoom_out.xpm" + /***** Magic numbers *****/ #ifndef M_PI @@ -193,9 +189,9 @@ static GtkWidget *ed_create_button (gchar *label, static void ed_fetch_foreground (double *fg_r, double *fg_g, double *fg_b, double *fg_a); -static void ed_update_editor (int flags); +static void ed_update_editor (int flags); -static void ed_set_hint (char *str); +static void ed_set_hint (gchar *str); static void ed_list_item_update (GtkWidget *widget, @@ -206,14 +202,13 @@ static void ed_list_item_update (GtkWidget *widget, static void ed_initialize_saved_colors (void); -static gint ed_delete_callback (GtkWidget *, GdkEvent *, gpointer); -static void ed_close_callback (GtkWidget *, gpointer); +/* Main dialog button callbacks & functions */ -static void ed_new_gradient_callback (GtkWidget *, gpointer); -static void ed_do_new_gradient_callback (GtkWidget *, gpointer , gpointer); +static void ed_new_gradient_callback (GtkWidget *, gpointer); +static void ed_do_new_gradient_callback (GtkWidget *, gpointer , gpointer); -static void ed_copy_gradient_callback (GtkWidget *, gpointer); -static void ed_do_copy_gradient_callback (GtkWidget *, gpointer , gpointer); +static void ed_copy_gradient_callback (GtkWidget *, gpointer); +static void ed_do_copy_gradient_callback (GtkWidget *, gpointer , gpointer); static void ed_delete_gradient_callback (GtkWidget *, gpointer); static void ed_do_delete_gradient_callback (GtkWidget *, gpointer); @@ -224,12 +219,18 @@ static gint ed_delete_delete_gradient_callback (GtkWidget *, GdkEvent *, static void ed_rename_gradient_callback (GtkWidget *, gpointer); static void ed_do_rename_gradient_callback (GtkWidget *, gpointer, gpointer); -static void ed_save_pov_callback (GtkWidget *, gpointer); -static void ed_do_save_pov_callback (GtkWidget *, gpointer); -static void ed_cancel_save_pov_callback (GtkWidget *, gpointer); +static void ed_save_pov_callback (GtkWidget *, gpointer); +static void ed_do_save_pov_callback (GtkWidget *, gpointer); +static void ed_cancel_save_pov_callback (GtkWidget *, gpointer); +static gint ed_delete_save_pov_callback (GtkWidget *, GdkEvent *, gpointer); -static void ed_save_grads_callback (GtkWidget *, gpointer); -static void ed_refresh_grads_callback (GtkWidget *, gpointer); +static void ed_save_grads_callback (GtkWidget *, gpointer); +static void ed_refresh_grads_callback (GtkWidget *, gpointer); + +static gint ed_delete_callback (GtkWidget *, GdkEvent *, gpointer); +static void ed_close_callback (GtkWidget *, gpointer); + +/* Zoom, scrollbar & instant update callbacks */ static void ed_scrollbar_update (GtkAdjustment *, gpointer); static void ed_zoom_all_callback (GtkWidget *, gpointer); @@ -239,354 +240,421 @@ static void ed_instant_update_update (GtkWidget *, gpointer); /* Gradient preview functions */ -static gint prev_events(GtkWidget *widget, GdkEvent *event); -static void prev_set_hint(gint x); +static gint prev_events (GtkWidget *, GdkEvent *, gpointer); +static void prev_set_hint (gint x); static void prev_set_foreground (gint x); static void prev_set_background (gint x); -static void prev_update(int recalculate); -static void prev_fill_image(int width, int height, double left, double right); +static void prev_update (gboolean recalculate); +static void prev_fill_image (int width, int height, + double left, double right); /* Gradient control functions */ -static gint control_events(GtkWidget *widget, GdkEvent *event); -static void control_do_hint(gint x, gint y); -static void control_button_press(gint x, gint y, guint button, guint state); -static int control_point_in_handle(gint x, gint y, grad_segment_t *seg, control_drag_mode_t handle); -static void control_select_single_segment(grad_segment_t *seg); -static void control_extend_selection(grad_segment_t *seg, double pos); -static void control_motion(gint x); - -static void control_compress_left(grad_segment_t *range_l, grad_segment_t *range_r, - grad_segment_t *drag_seg, double pos); -static void control_compress_range(grad_segment_t *range_l, grad_segment_t *range_r, - double new_l, double new_r); - -static double control_move(grad_segment_t *range_l, grad_segment_t *range_r, double delta); - -static void control_update(int recalculate); -static void control_draw(GdkPixmap *pixmap, int width, int height, double left, double right); -static void control_draw_normal_handle(GdkPixmap *pixmap, double pos, int height); -static void control_draw_middle_handle(GdkPixmap *pixmap, double pos, int height); -static void control_draw_handle(GdkPixmap *pixmap, GdkGC *border_gc, GdkGC *fill_gc, int xpos, int height); -static int control_calc_p_pos(double pos); -static double control_calc_g_pos(int pos); +static gint control_events (GtkWidget *, GdkEvent *, gpointer); +static void control_do_hint (gint x, gint y); +static void control_button_press (gint x, gint y, + guint button, guint state); +static int control_point_in_handle (gint x, gint y, grad_segment_t *seg, + control_drag_mode_t handle); +static void control_select_single_segment (grad_segment_t *seg); +static void control_extend_selection (grad_segment_t *seg, double pos); +static void control_motion (gint x); + +static void control_compress_left (grad_segment_t *range_l, + grad_segment_t *range_r, + grad_segment_t *drag_seg, + double pos); +static void control_compress_range (grad_segment_t *range_l, + grad_segment_t *range_r, + double new_l, double new_r); + +static double control_move (grad_segment_t *range_l, + grad_segment_t *range_r, + double delta); + +/* Control update/redraw functions */ + +static void control_update (gboolean recalculate); +static void control_draw (GdkPixmap *pixmap, + int width, int height, + double left, double right); +static void control_draw_normal_handle (GdkPixmap *pixmap, + double pos, int height); +static void control_draw_middle_handle (GdkPixmap *pixmap, + double pos, int height); +static void control_draw_handle (GdkPixmap *pixmap, + GdkGC *border_gc, GdkGC *fill_gc, + int xpos, int height); + +static int control_calc_p_pos (double pos); +static double control_calc_g_pos (int pos); /* Control popup functions */ -static void cpopup_create_main_menu(void); -static void cpopup_do_popup(void); -static GtkWidget *cpopup_create_color_item(GtkWidget **color_box, GtkWidget **label); -static void cpopup_adjust_menus(void); -static void cpopup_adjust_blending_menu(void); -static void cpopup_adjust_coloring_menu(void); -static void cpopup_check_selection_params(int *equal_blending, int *equal_coloring); -static GtkWidget *cpopup_create_menu_item_with_label(char *str, GtkWidget **label); -static void cpopup_render_color_box(GtkPreview *preview, double r, double g, double b, double a); - -static GtkWidget *cpopup_create_load_menu(GtkWidget **color_boxes, GtkWidget **labels, - char *label1, char *label2, GtkSignalFunc callback, - gchar accel_key_0, guint8 accel_mods_0, - gchar accel_key_1, guint8 accel_mods_1, - gchar accel_key_2, guint8 accel_mods_2); -static GtkWidget *cpopup_create_save_menu(GtkWidget **color_boxes, GtkWidget **labels, GtkSignalFunc callback); -static void cpopup_update_saved_color(int n, double r, double g, double b, double a); -static void cpopup_load_left_callback(GtkWidget *widget, gpointer data); -static void cpopup_save_left_callback(GtkWidget *widget, gpointer data); -static void cpopup_load_right_callback(GtkWidget *widget, gpointer data); -static void cpopup_save_right_callback(GtkWidget *widget, gpointer data); - -static GtkWidget *cpopup_create_blending_menu(void); -static void cpopup_blending_callback(GtkWidget *widget, gpointer data); -static GtkWidget *cpopup_create_coloring_menu(void); -static void cpopup_coloring_callback(GtkWidget *widget, gpointer data); - -static GtkWidget *cpopup_create_sel_ops_menu(void); - -static void cpopup_blend_colors(GtkWidget *widget, gpointer data); -static void cpopup_blend_opacity(GtkWidget *widget, gpointer data); - -static void cpopup_set_color_selection_color(GtkColorSelection *cs, - double r, double g, double b, double a); -static void cpopup_get_color_selection_color(GtkColorSelection *cs, - double *r, double *g, double *b, double *a); - -static void cpopup_create_color_dialog(char *title, double r, double g, double b, double a, - GtkSignalFunc color_changed_callback, - GtkSignalFunc ok_callback, - GtkSignalFunc cancel_callback, - GtkSignalFunc delete_callback); - -static grad_segment_t *cpopup_save_selection(void); -static void cpopup_free_selection(grad_segment_t *seg); -static void cpopup_replace_selection(grad_segment_t *replace_seg); - -static void cpopup_set_left_color_callback(GtkWidget *widget, gpointer data); -static void cpopup_left_color_changed(GtkWidget *widget, gpointer client_data); -static void cpopup_left_color_dialog_ok(GtkWidget *widget, gpointer client_data); -static void cpopup_left_color_dialog_cancel(GtkWidget *widget, gpointer client_data); -static int cpopup_left_color_dialog_delete(GtkWidget *widget, GdkEvent *event, gpointer data); -static void cpopup_set_right_color_callback(GtkWidget *widget, gpointer data); -static void cpopup_right_color_changed(GtkWidget *widget, gpointer client_data); -static void cpopup_right_color_dialog_ok(GtkWidget *widget, gpointer client_data); -static void cpopup_right_color_dialog_cancel(GtkWidget *widget, gpointer client_data); -static int cpopup_right_color_dialog_delete(GtkWidget *widget, GdkEvent *event, gpointer data); - -static void cpopup_split_midpoint_callback(GtkWidget *widget, gpointer data); -static void cpopup_split_uniform_callback(GtkWidget *widget, gpointer data); -static void cpopup_delete_callback(GtkWidget *widget, gpointer data); -static void cpopup_recenter_callback(GtkWidget *widget, gpointer data); -static void cpopup_redistribute_callback(GtkWidget *widget, gpointer data); -static void cpopup_flip_callback(GtkWidget *widget, gpointer data); -static void cpopup_replicate_callback(GtkWidget *widget, gpointer data); - -static void cpopup_split_uniform_scale_update(GtkAdjustment *adjustment, gpointer data); -static void cpopup_split_uniform_split_callback(GtkWidget *widget, gpointer client_data); -static void cpopup_split_uniform_cancel_callback(GtkWidget *widget, gpointer client_data); - -static void cpopup_replicate_scale_update(GtkAdjustment *adjustment, gpointer data); -static void cpopup_do_replicate_callback(GtkWidget *widget, gpointer client_data); -static void cpopup_replicate_cancel_callback(GtkWidget *widget, gpointer client_data); - -static void cpopup_blend_endpoints(double r0, double g0, double b0, double a0, - double r1, double g1, double b1, double a1, - int blend_colors, int blend_opacity); -static void cpopup_split_midpoint(grad_segment_t *lseg, grad_segment_t **newl, grad_segment_t **newr); -static void cpopup_split_uniform(grad_segment_t *lseg, int parts, - grad_segment_t **newl, grad_segment_t **newr); +static void cpopup_create_main_menu (void); +static void cpopup_do_popup (void); + +static GtkWidget *cpopup_create_color_item (GtkWidget **color_box, + GtkWidget **label); +static GtkWidget *cpopup_create_menu_item_with_label (gchar *str, + GtkWidget **label); + +static void cpopup_adjust_menus (void); +static void cpopup_adjust_blending_menu (void); +static void cpopup_adjust_coloring_menu (void); +static void cpopup_check_selection_params (gint *equal_blending, + gint *equal_coloring); + +static void cpopup_render_color_box (GtkPreview *preview, + double r, double g, double b, double a); + +static GtkWidget *cpopup_create_load_menu (GtkWidget **color_boxes, + GtkWidget **labels, + gchar *label1, gchar *label2, + GtkSignalFunc callback, + gchar accel_key_0, + guint8 accel_mods_0, + gchar accel_key_1, + guint8 accel_mods_1, + gchar accel_key_2, + guint8 accel_mods_2); +static GtkWidget *cpopup_create_save_menu (GtkWidget **color_boxes, + GtkWidget **labels, + GtkSignalFunc callback); + +static void cpopup_update_saved_color (int n, + double r, double g, double b, double a); + +static void cpopup_load_left_callback (GtkWidget *, gpointer); +static void cpopup_save_left_callback (GtkWidget *, gpointer); +static void cpopup_load_right_callback (GtkWidget *, gpointer); +static void cpopup_save_right_callback (GtkWidget *, gpointer); + +static void cpopup_set_color_selection_color (GtkColorSelection *cs, + double r, double g, + double b, double a); +static void cpopup_get_color_selection_color (GtkColorSelection *cs, + double *r, double *g, + double *b, double *a); + +static grad_segment_t *cpopup_save_selection (void); +static void cpopup_free_selection (grad_segment_t *seg); +static void cpopup_replace_selection (grad_segment_t *replace_seg); + +/* ----- */ + +static void cpopup_create_color_dialog (gchar *title, + double r, double g, double b, double a, + GtkSignalFunc color_changed_callback, + GtkSignalFunc ok_callback, + GtkSignalFunc cancel_callback, + GtkSignalFunc delete_callback); + +static void cpopup_set_left_color_callback (GtkWidget *, gpointer); +static void cpopup_left_color_changed (GtkWidget *, gpointer); +static void cpopup_left_color_dialog_ok (GtkWidget *, gpointer); +static void cpopup_left_color_dialog_cancel (GtkWidget *, gpointer); +static int cpopup_left_color_dialog_delete (GtkWidget *, GdkEvent *, + gpointer); + +static void cpopup_set_right_color_callback (GtkWidget *, gpointer); +static void cpopup_right_color_changed (GtkWidget *, gpointer); +static void cpopup_right_color_dialog_ok (GtkWidget *, gpointer); +static void cpopup_right_color_dialog_cancel (GtkWidget *, gpointer); +static int cpopup_right_color_dialog_delete (GtkWidget *, GdkEvent *, + gpointer); + +/* ----- */ + +static GtkWidget *cpopup_create_blending_menu (void); +static void cpopup_blending_callback (GtkWidget *, gpointer); +static GtkWidget *cpopup_create_coloring_menu (void); +static void cpopup_coloring_callback (GtkWidget *, gpointer); + +/* ----- */ + +static void cpopup_split_midpoint_callback (GtkWidget *, gpointer); +static void cpopup_split_midpoint (grad_segment_t *lseg, grad_segment_t **newl, + grad_segment_t **newr); + +static void cpopup_split_uniform_callback (GtkWidget *, gpointer); +static void cpopup_split_uniform_scale_update (GtkAdjustment *, gpointer); +static void cpopup_split_uniform_split_callback (GtkWidget *, gpointer); +static void cpopup_split_uniform_cancel_callback (GtkWidget *, gpointer); +static gint cpopup_split_uniform_delete_callback (GtkWidget *, GdkEvent *, + gpointer); +static void cpopup_split_uniform (grad_segment_t *lseg, int parts, + grad_segment_t **newl, grad_segment_t **newr); + +static void cpopup_delete_callback (GtkWidget *, gpointer); +static void cpopup_recenter_callback (GtkWidget *, gpointer); +static void cpopup_redistribute_callback (GtkWidget *, gpointer); + +/* Control popup -> Selection operations functions */ + +static GtkWidget * cpopup_create_sel_ops_menu (void); + +static void cpopup_flip_callback (GtkWidget *, gpointer); + +static void cpopup_replicate_callback (GtkWidget *, gpointer); +static void cpopup_replicate_scale_update (GtkAdjustment *, gpointer); +static void cpopup_do_replicate_callback (GtkWidget *, gpointer); +static void cpopup_replicate_cancel_callback (GtkWidget *, gpointer); +static gint cpopup_replicate_delete_callback (GtkWidget *, GdkEvent *, + gpointer); + +static void cpopup_blend_colors (GtkWidget *, gpointer); +static void cpopup_blend_opacity (GtkWidget *, gpointer); + +/* Blend function */ + +static void cpopup_blend_endpoints (double r0, double g0, double b0, double a0, + double r1, double g1, double b1, double a1, + int blend_colors, int blend_opacity); /* Gradient functions */ -static gradient_t *grad_new_gradient(void); -static void grad_free_gradient(gradient_t *grad); -static void grad_free_gradients(void); -static void grad_load_gradient(char *filename); -static void grad_save_gradient(gradient_t *grad, char *filename); -static void grad_save_all(int need_free); +static gradient_t *grad_new_gradient (void); +static void grad_free_gradient (gradient_t *grad); +static void grad_free_gradients (void); +static void grad_load_gradient (char *filename); +static void grad_save_gradient (gradient_t *grad, + char *filename); +static void grad_save_all (int need_free); -static gradient_t *grad_create_default_gradient(void); +static gradient_t *grad_create_default_gradient (void); -static int grad_insert_in_gradients_list(gradient_t *grad); +static int grad_insert_in_gradients_list (gradient_t *grad); -static void grad_dump_gradient(gradient_t *grad, FILE *file); +static void grad_dump_gradient (gradient_t *grad, FILE *file); /* Segment functions */ -static grad_segment_t *seg_new_segment(void); -static void seg_free_segment(grad_segment_t *seg); -static void seg_free_segments(grad_segment_t *seg); +static grad_segment_t *seg_new_segment (void); +static void seg_free_segment (grad_segment_t *seg); +static void seg_free_segments (grad_segment_t *seg); -static grad_segment_t *seg_get_segment_at(gradient_t *grad, double pos); -static grad_segment_t *seg_get_last_segment(grad_segment_t *seg); -static void seg_get_closest_handle(gradient_t *grad, double pos, - grad_segment_t **seg, control_drag_mode_t *handle); +static grad_segment_t *seg_get_segment_at (gradient_t *grad, double pos); +static grad_segment_t *seg_get_last_segment (grad_segment_t *seg); +static void seg_get_closest_handle (gradient_t *grad, double pos, + grad_segment_t **seg, + control_drag_mode_t *handle); /* Calculation functions */ -static double calc_linear_factor(double middle, double pos); -static double calc_curved_factor(double middle, double pos); -static double calc_sine_factor(double middle, double pos); -static double calc_sphere_increasing_factor(double middle, double pos); -static double calc_sphere_decreasing_factor(double middle, double pos); +static double calc_linear_factor (double middle, double pos); +static double calc_curved_factor (double middle, double pos); +static double calc_sine_factor (double middle, double pos); +static double calc_sphere_increasing_factor (double middle, double pos); +static double calc_sphere_decreasing_factor (double middle, double pos); -static void calc_rgb_to_hsv(double *r, double *g, double *b); -static void calc_hsv_to_rgb(double *h, double *s, double *v); +static void calc_rgb_to_hsv (double *r, double *g, double *b); +static void calc_hsv_to_rgb (double *h, double *s, double *v); /* Files and paths functions */ -static char *build_user_filename(char *name, char *path_str); - +static gchar *build_user_filename (char *name, char *path_str); /***** Local variables *****/ -GdkColor black; -int num_gradients = 0; -gradient_t *curr_gradient = NULL; /* The active gradient */ -GSList *gradients_list = NULL; /* The list of gradients */ -gradient_t *grad_default_gradient = NULL; -gradient_editor_t *g_editor = NULL; /* The gradient editor */ - -static const char *blending_types[] = { - N_("Linear"), - N_("Curved"), - N_("Sinusoidal"), - N_("Spherical (increasing)"), - N_("Spherical (decreasing)") -}; /* blending_types */ +GdkColor black; +gint num_gradients = 0; +gradient_t * curr_gradient = NULL; /* The active gradient */ +GSList * gradients_list = NULL; /* The list of gradients */ +gradient_t * grad_default_gradient = NULL; +gradient_editor_t * g_editor = NULL; /* The gradient editor */ -static const char *coloring_types[] = { - N_("Plain RGB"), - N_("HSV (counter-clockwise hue)"), - N_("HSV (clockwise hue)") -}; /* coloring_types */ +static const gchar *blending_types[] = +{ + N_("Linear"), + N_("Curved"), + N_("Sinusoidal"), + N_("Spherical (increasing)"), + N_("Spherical (decreasing)") +}; +static const gchar *coloring_types[] = +{ + N_("Plain RGB"), + N_("HSV (counter-clockwise hue)"), + N_("HSV (clockwise hue)") +}; /***** Public functions *****/ /*****/ void -gradients_init(int no_data) +gradients_init (int no_data) { - if(!no_data) - datafiles_read_directories(gradient_path, grad_load_gradient, 0); + if (!no_data) + datafiles_read_directories (gradient_path, grad_load_gradient, 0); if (grad_default_gradient != NULL) curr_gradient = grad_default_gradient; else if (gradients_list != NULL) curr_gradient = (gradient_t *) gradients_list->data; - else { - curr_gradient = grad_create_default_gradient(); - curr_gradient->name = g_strdup(_("Default")); - curr_gradient->filename = build_user_filename(curr_gradient->name, gradient_path); - curr_gradient->dirty = FALSE; - - grad_insert_in_gradients_list(curr_gradient); - } /* else */ -} /* gradients_init */ + else + { + curr_gradient = grad_create_default_gradient (); + curr_gradient->name = g_strdup (_("Default")); + curr_gradient->filename = + build_user_filename (curr_gradient->name, gradient_path); + curr_gradient->dirty = FALSE; + grad_insert_in_gradients_list (curr_gradient); + } +} /*****/ void -gradients_free(void) +gradients_free (void) { - grad_free_gradients(); -} /* gradients_free */ - + grad_free_gradients (); +} /*****/ void -grad_get_color_at(double pos, double *r, double *g, double *b, double *a) +grad_get_color_at (double pos, + double *r, double *g, double *b, double *a) { - double factor; - grad_segment_t *seg; - double seg_len, middle; - double h0, s0, v0; - double h1, s1, v1; - - /* if there is no gradient return a totally transparent black */ - if (curr_gradient == NULL) - { - r = 0; g = 0; b = 0; a = 0; - return; - } - - if (pos < 0.0) - pos = 0.0; - else if (pos > 1.0) - pos = 1.0; - - seg = seg_get_segment_at(curr_gradient, pos); - - seg_len = seg->right - seg->left; - - if (seg_len < EPSILON) { - middle = 0.5; - pos = 0.5; - } else { - middle = (seg->middle - seg->left) / seg_len; - pos = (pos - seg->left) / seg_len; - } /* else */ + double factor = 0.0; + grad_segment_t *seg; + double seg_len, middle; + double h0, s0, v0; + double h1, s1, v1; - switch (seg->type) { - case GRAD_LINEAR: - factor = calc_linear_factor(middle, pos); - break; + /* if there is no gradient return a totally transparent black */ + if (curr_gradient == NULL) + { + r = 0; g = 0; b = 0; a = 0; + return; + } - case GRAD_CURVED: - factor = calc_curved_factor(middle, pos); - break; + if (pos < 0.0) + pos = 0.0; + else if (pos > 1.0) + pos = 1.0; - case GRAD_SINE: - factor = calc_sine_factor(middle, pos); - break; + seg = seg_get_segment_at (curr_gradient, pos); - case GRAD_SPHERE_INCREASING: - factor = calc_sphere_increasing_factor(middle, pos); - break; + seg_len = seg->right - seg->left; - case GRAD_SPHERE_DECREASING: - factor = calc_sphere_decreasing_factor(middle, pos); - break; + if (seg_len < EPSILON) + { + middle = 0.5; + pos = 0.5; + } + else + { + middle = (seg->middle - seg->left) / seg_len; + pos = (pos - seg->left) / seg_len; + } - default: - grad_dump_gradient (curr_gradient, stderr); - gimp_fatal_error (_("grad_get_color_at(): Unknown gradient type %d"), - (int) seg->type); - factor = 0.0; /* Shut up -Wall */ - break; - } /* switch */ + switch (seg->type) + { + case GRAD_LINEAR: + factor = calc_linear_factor (middle, pos); + break; + + case GRAD_CURVED: + factor = calc_curved_factor (middle, pos); + break; + + case GRAD_SINE: + factor = calc_sine_factor (middle, pos); + break; + + case GRAD_SPHERE_INCREASING: + factor = calc_sphere_increasing_factor (middle, pos); + break; + + case GRAD_SPHERE_DECREASING: + factor = calc_sphere_decreasing_factor (middle, pos); + break; + + default: + grad_dump_gradient (curr_gradient, stderr); + gimp_fatal_error (_("grad_get_color_at(): Unknown gradient type %d"), + (int) seg->type); + break; + } - /* Calculate color components */ + /* Calculate color components */ - *a = seg->a0 + (seg->a1 - seg->a0) * factor; + *a = seg->a0 + (seg->a1 - seg->a0) * factor; - if (seg->color == GRAD_RGB) { - *r = seg->r0 + (seg->r1 - seg->r0) * factor; - *g = seg->g0 + (seg->g1 - seg->g0) * factor; - *b = seg->b0 + (seg->b1 - seg->b0) * factor; - } else { - h0 = seg->r0; - s0 = seg->g0; - v0 = seg->b0; - - h1 = seg->r1; - s1 = seg->g1; - v1 = seg->b1; - - calc_rgb_to_hsv(&h0, &s0, &v0); - calc_rgb_to_hsv(&h1, &s1, &v1); - - s0 = s0 + (s1 - s0) * factor; - v0 = v0 + (v1 - v0) * factor; - - switch (seg->color) { - case GRAD_HSV_CCW: - if (h0 < h1) - h0 = h0 + (h1 - h0) * factor; - else { - h0 = h0 + (1.0 - (h0 - h1)) * factor; - if (h0 > 1.0) - h0 -= 1.0; - } /* else */ + if (seg->color == GRAD_RGB) + { + *r = seg->r0 + (seg->r1 - seg->r0) * factor; + *g = seg->g0 + (seg->g1 - seg->g0) * factor; + *b = seg->b0 + (seg->b1 - seg->b0) * factor; + } + else + { + h0 = seg->r0; + s0 = seg->g0; + v0 = seg->b0; - break; + h1 = seg->r1; + s1 = seg->g1; + v1 = seg->b1; - case GRAD_HSV_CW: - if (h1 < h0) - h0 = h0 - (h0 - h1) * factor; - else { - h0 = h0 - (1.0 - (h1 - h0)) * factor; - if (h0 < 0.0) - h0 += 1.0; - } /* else */ + calc_rgb_to_hsv(&h0, &s0, &v0); + calc_rgb_to_hsv(&h1, &s1, &v1); - break; + s0 = s0 + (s1 - s0) * factor; + v0 = v0 + (v1 - v0) * factor; - default: - grad_dump_gradient (curr_gradient, stderr); - gimp_fatal_error (_("grad_get_color_at(): Unknown coloring mode %d"), - (int) seg->color); - break; - } /* switch */ + switch (seg->color) + { + case GRAD_HSV_CCW: + if (h0 < h1) + h0 = h0 + (h1 - h0) * factor; + else + { + h0 = h0 + (1.0 - (h0 - h1)) * factor; + if (h0 > 1.0) + h0 -= 1.0; + } + break; + + case GRAD_HSV_CW: + if (h1 < h0) + h0 = h0 - (h0 - h1) * factor; + else + { + h0 = h0 - (1.0 - (h1 - h0)) * factor; + if (h0 < 0.0) + h0 += 1.0; + } + break; + + default: + grad_dump_gradient (curr_gradient, stderr); + gimp_fatal_error (_("grad_get_color_at(): Unknown coloring mode %d"), + (int) seg->color); + break; + } - *r = h0; - *g = s0; - *b = v0; + *r = h0; + *g = s0; + *b = v0; - calc_hsv_to_rgb(r, g, b); - } /* else */ -} /* grad_get_color_at */ + calc_hsv_to_rgb (r, g, b); + } +} +/***** The main gradient editor dialog *****/ /*****/ - void grad_create_gradient_editor_init (gint need_show) { @@ -597,6 +665,10 @@ grad_create_gradient_editor_init (gint need_show) GtkWidget *frame; GtkWidget *scrolled_win; GdkColormap *colormap; + GtkWidget* pixmapwid; + GdkPixmap* pixmap; + GdkBitmap* mask; + GtkStyle* style; gint i; gint select_pos; @@ -631,10 +703,11 @@ grad_create_gradient_editor_init (gint need_show) /* Shell and main vbox */ g_editor->shell = gtk_dialog_new (); - gtk_window_set_wmclass (GTK_WINDOW (g_editor->shell), "gradient_editor", "Gimp"); + gtk_window_set_wmclass (GTK_WINDOW (g_editor->shell), + "gradient_editor", "Gimp"); gtk_window_set_title (GTK_WINDOW (g_editor->shell), _("Gradient Editor")); - /* handle window manager close signals */ + /* Handle the wm delete event */ gtk_signal_connect (GTK_OBJECT (g_editor->shell), "delete_event", GTK_SIGNAL_FUNC (ed_delete_callback), NULL); @@ -690,56 +763,85 @@ grad_create_gradient_editor_init (gint need_show) /* Buttons for gradient functions */ button = ed_create_button (_("New Gradient"), 0.5, 0.5, (GtkSignalFunc) ed_new_gradient_callback, NULL); + GTK_WIDGET_UNSET_FLAGS (button, GTK_RECEIVES_DEFAULT); gtk_box_pack_start (GTK_BOX (gvbox), button, FALSE, FALSE, 0); gtk_widget_show (button); button = ed_create_button (_("Copy Gradient"), 0.5, 0.5, (GtkSignalFunc) ed_copy_gradient_callback, NULL); + GTK_WIDGET_UNSET_FLAGS (button, GTK_RECEIVES_DEFAULT); gtk_box_pack_start (GTK_BOX (gvbox), button, FALSE, FALSE, 0); gtk_widget_show (button); button = ed_create_button (_("Delete Gradient"), 0.5, 0.5, (GtkSignalFunc) ed_delete_gradient_callback, NULL); + GTK_WIDGET_UNSET_FLAGS (button, GTK_RECEIVES_DEFAULT); gtk_box_pack_start (GTK_BOX (gvbox), button, FALSE, FALSE, 0); gtk_widget_show (button); button = ed_create_button (_("Rename Gradient"), 0.5, 0.5, (GtkSignalFunc) ed_rename_gradient_callback, NULL); + GTK_WIDGET_UNSET_FLAGS (button, GTK_RECEIVES_DEFAULT); gtk_box_pack_start (GTK_BOX (gvbox), button, FALSE, FALSE, 0); gtk_widget_show (button); button = ed_create_button (_("Save as POV-Ray"), 0.5, 0.5, (GtkSignalFunc) ed_save_pov_callback, NULL); + GTK_WIDGET_UNSET_FLAGS (button, GTK_RECEIVES_DEFAULT); gtk_box_pack_start (GTK_BOX (gvbox), button, FALSE, FALSE, 0); gtk_widget_show (button); gtk_widget_show (gvbox); gtk_widget_show (frame); - /* Horizontal box for zoom controls, scrollbar, and instant update toggle */ - + /* Horizontal box for zoom controls, scrollbar and instant update toggle */ hbox = gtk_hbox_new (FALSE, 4); gtk_container_set_border_width (GTK_CONTAINER (hbox), 0); gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0); gtk_widget_show (hbox); - /* Zoom buttons */ + /* Zoom all button */ button = ed_create_button (_("Zoom all"), 0.5, 0.5, (GtkSignalFunc) ed_zoom_all_callback, g_editor); + GTK_WIDGET_UNSET_FLAGS (button, GTK_RECEIVES_DEFAULT); gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0); gtk_widget_show (button); - button = ed_create_button (_("Zoom -"), 0.5, 0.5, - (GtkSignalFunc) ed_zoom_out_callback, g_editor); + /* + and - buttons */ + gtk_widget_realize (g_editor->shell); + style = gtk_widget_get_style (g_editor->shell); + + button = gtk_button_new (); + GTK_WIDGET_UNSET_FLAGS (button, GTK_RECEIVES_DEFAULT); + gtk_signal_connect (GTK_OBJECT (button), "clicked", + GTK_SIGNAL_FUNC (ed_zoom_in_callback), + (gpointer) g_editor); gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0); - gtk_widget_show(button); - button = ed_create_button (_("Zoom +"), 0.5, 0.5, - (GtkSignalFunc) ed_zoom_in_callback, g_editor); + pixmap = gdk_pixmap_create_from_xpm_d (g_editor->shell->window, &mask, + &style->bg[GTK_STATE_NORMAL], + zoom_in_xpm); + pixmapwid = gtk_pixmap_new (pixmap, mask); + gtk_container_add (GTK_CONTAINER (button), pixmapwid); + gtk_widget_show (pixmapwid); + gtk_widget_show (button); + + button = gtk_button_new (); + GTK_WIDGET_UNSET_FLAGS (button, GTK_RECEIVES_DEFAULT); + gtk_signal_connect (GTK_OBJECT (button), "clicked", + GTK_SIGNAL_FUNC (ed_zoom_out_callback), + (gpointer) g_editor); gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0); + + pixmap = gdk_pixmap_create_from_xpm_d (g_editor->shell->window, &mask, + &style->bg[GTK_STATE_NORMAL], + zoom_out_xpm); + pixmapwid = gtk_pixmap_new (pixmap, mask); + gtk_container_add (GTK_CONTAINER (button), pixmapwid); + gtk_widget_show (pixmapwid); gtk_widget_show (button); - /* Scrollbar */ + /* Scrollbar */ g_editor->zoom_factor = 1; g_editor->scroll_data = gtk_adjustment_new (0.0, 0.0, 1.0, @@ -772,18 +874,10 @@ grad_create_gradient_editor_init (gint need_show) gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE); gtk_widget_show (button); - /* hbox for that holds the frame for gradient preview and gradient control; - * this is only here, because resizing the preview doesn't work - * (and is disabled) to keep the preview and controls together - */ - hbox = gtk_hbox_new (FALSE, 0); - gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0); - gtk_widget_show (hbox); - /* Frame for gradient preview and gradient control */ frame = gtk_frame_new (NULL); gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN); - gtk_box_pack_start (GTK_BOX (hbox), frame, FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0); gtk_widget_show (frame); gvbox = gtk_vbox_new (FALSE, 0); @@ -798,13 +892,18 @@ grad_create_gradient_editor_init (gint need_show) g_editor->preview_button_down = 0; g_editor->preview = gtk_preview_new (GTK_PREVIEW_COLOR); - gtk_preview_set_dither (GTK_PREVIEW (g_editor->preview), - GDK_RGB_DITHER_MAX); + gtk_preview_set_dither (GTK_PREVIEW (g_editor->preview), GDK_RGB_DITHER_MAX); gtk_preview_size (GTK_PREVIEW (g_editor->preview), GRAD_PREVIEW_WIDTH, GRAD_PREVIEW_HEIGHT); + + /* Enable auto-resizing of the preview but ensure a minimal size */ + gtk_widget_set_usize (g_editor->preview, + GRAD_PREVIEW_WIDTH, GRAD_PREVIEW_HEIGHT); + gtk_preview_set_expand (GTK_PREVIEW (g_editor->preview), TRUE); + gtk_widget_set_events (g_editor->preview, GRAD_PREVIEW_EVENT_MASK); gtk_signal_connect (GTK_OBJECT(g_editor->preview), "event", - (GtkSignalFunc) prev_events, + (GdkEventFunc) prev_events, g_editor); gtk_box_pack_start (GTK_BOX (gvbox), g_editor->preview, TRUE, TRUE, 0); gtk_widget_show (g_editor->preview); @@ -861,9 +960,9 @@ grad_create_gradient_editor_init (gint need_show) GRAD_PREVIEW_WIDTH, GRAD_CONTROL_HEIGHT); gtk_widget_set_events (g_editor->control, GRAD_CONTROL_EVENT_MASK); gtk_signal_connect (GTK_OBJECT (g_editor->control), "event", - (GtkSignalFunc) control_events, + (GdkEventFunc) control_events, g_editor); - gtk_box_pack_start (GTK_BOX (gvbox), g_editor->control, FALSE, TRUE, 0); + gtk_box_pack_start (GTK_BOX (gvbox), g_editor->control, TRUE, TRUE, 0); gtk_widget_show (g_editor->control); /* Hint bar and close button */ @@ -888,7 +987,6 @@ grad_create_gradient_editor_init (gint need_show) cpopup_create_main_menu(); /* Show everything */ - gtk_widget_realize (g_editor->shell); g_editor->gc = gdk_gc_new (g_editor->shell->window); select_pos = ed_set_list_of_gradients (g_editor->gc, g_editor->clist, @@ -907,105 +1005,112 @@ grad_create_gradient_editor_init (gint need_show) /*****/ static void -ed_fetch_foreground(double *fg_r, double *fg_g, double *fg_b, double *fg_a) +ed_fetch_foreground (double *fg_r, double *fg_g, double *fg_b, double *fg_a) { - unsigned char r, g, b; + guchar r, g, b; - palette_get_foreground (&r, &g, &b); + palette_get_foreground (&r, &g, &b); - *fg_r = (double) r / 255.0; - *fg_g = (double) g / 255.0; - *fg_b = (double) b / 255.0; - *fg_a = 1.0; /* opacity 100 % */ -} /* ed_fetch_foreground */ - + *fg_r = (double) r / 255.0; + *fg_g = (double) g / 255.0; + *fg_b = (double) b / 255.0; + *fg_a = 1.0; /* opacity 100 % */ +} /*****/ static void -ed_update_editor(int flags) +ed_update_editor (int flags) { - if (flags & GRAD_UPDATE_PREVIEW) - prev_update(1); - - if (flags & GRAD_UPDATE_CONTROL) - control_update(0); + if (flags & GRAD_UPDATE_PREVIEW) + prev_update (TRUE); - if (flags & GRAD_RESET_CONTROL) - control_update(1); -} /* ed_update_editor */ + if (flags & GRAD_UPDATE_CONTROL) + control_update(FALSE); + if (flags & GRAD_RESET_CONTROL) + control_update (TRUE); +} /*****/ static GtkWidget * -ed_create_button(gchar *label, double xalign, double yalign, GtkSignalFunc signal_func, gpointer user_data) +ed_create_button (gchar *label, + double xalign, + double yalign, + GtkSignalFunc signal_func, + gpointer user_data) { - GtkWidget *button; - GtkWidget *text; - - button = gtk_button_new(); - text = gtk_label_new(gettext(label)); + GtkWidget *button; + GtkWidget *text; - gtk_misc_set_alignment(GTK_MISC(text), xalign, yalign); - gtk_container_add(GTK_CONTAINER(button), text); - gtk_widget_show(text); + button = gtk_button_new (); + text = gtk_label_new (label); - if (signal_func != NULL) - gtk_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC (signal_func), user_data); + gtk_misc_set_alignment (GTK_MISC (text), xalign, yalign); + gtk_misc_set_padding (GTK_MISC (text), 4, 0); + gtk_container_add (GTK_CONTAINER (button), text); + gtk_widget_show (text); - return button; -} /* ed_create_button */ + if (signal_func != NULL) + gtk_signal_connect (GTK_OBJECT (button), "clicked", + (GtkSignalFunc) signal_func, + user_data); + return button; +} /*****/ static void -ed_set_hint(char *str) +ed_set_hint (gchar *str) { - gtk_label_set(GTK_LABEL(g_editor->hint_label), gettext(str)); - gdk_flush(); -} /* ed_set_hint */ - + gtk_label_set_text (GTK_LABEL (g_editor->hint_label), str); + gdk_flush(); +} /*****/ gint -ed_set_list_of_gradients(GdkGC *gc, GtkWidget *clist,gradient_t *sel_gradient) +ed_set_list_of_gradients (GdkGC *gc, + GtkWidget *clist, + gradient_t *sel_gradient) { - GSList *list; - gradient_t *grad; - int n; - int select_pos = -1; - - list = gradients_list; - n = 0; + GSList *list; + gradient_t *grad; + gint n; + gint select_pos = -1; - if(sel_gradient == NULL) - sel_gradient = curr_gradient; + list = gradients_list; + n = 0; - gtk_clist_freeze(GTK_CLIST(clist)); + if (sel_gradient == NULL) + sel_gradient = curr_gradient; - while (list) { - grad = list->data; + gtk_clist_freeze (GTK_CLIST (clist)); - if (grad == sel_gradient) { - ed_insert_in_gradients_listbox(gc,clist,grad, n, 1); - select_pos = n; - } - else { - ed_insert_in_gradients_listbox(gc,clist,grad, n, 0); - } + while (list) + { + grad = list->data; - list = g_slist_next(list); - n++; - } /* while */ + if (grad == sel_gradient) + { + ed_insert_in_gradients_listbox (gc, clist, grad, n, 1); + select_pos = n; + } + else + { + ed_insert_in_gradients_listbox (gc, clist, grad, n, 0); + } - gtk_clist_thaw(GTK_CLIST(clist)); + list = g_slist_next (list); + n++; + } - return select_pos; -} /* ed_set_list_of_gradients */ + gtk_clist_thaw (GTK_CLIST (clist)); + return select_pos; +} /*****/ @@ -1214,33 +1319,15 @@ ed_initialize_saved_colors(void) g_editor->saved_colors[9].a = 1.0; } /* ed_initialize_saved_colors */ -/*****/ - -static gint -ed_delete_callback (GtkWidget *widget, - GdkEvent *event, - gpointer client_data) -{ - ed_close_callback (widget, client_data); - - return TRUE; -} - -/*****/ +/***** Main gradient editor dialog callbacks *****/ -static void -ed_close_callback (GtkWidget *widget, - gpointer client_data) -{ - if (GTK_WIDGET_VISIBLE (g_editor->shell)) - gtk_widget_hide (g_editor->shell); -} +/***** the "new gradient" dialog functions *****/ /*****/ static void ed_new_gradient_callback (GtkWidget *widget, - gpointer client_data) + gpointer data) { gtk_widget_show (query_string_box(_("New gradient"), _("Enter a name for the new gradient"), @@ -1251,7 +1338,7 @@ ed_new_gradient_callback (GtkWidget *widget, static void ed_do_new_gradient_callback (GtkWidget *widget, - gpointer client_data, + gpointer data, gpointer call_data) { gradient_t *grad; @@ -1288,11 +1375,13 @@ ed_do_new_gradient_callback (GtkWidget *widget, grad_sel_new_all (pos, grad); } +/***** The "copy gradient" dialog functions *****/ + /*****/ static void ed_copy_gradient_callback (GtkWidget *widget, - gpointer client_data) + gpointer data) { gchar *name; @@ -1312,7 +1401,7 @@ ed_copy_gradient_callback (GtkWidget *widget, static void ed_do_copy_gradient_callback (GtkWidget *widget, - gpointer client_data, + gpointer data, gpointer call_data) { gradient_t *grad; @@ -1373,11 +1462,13 @@ ed_do_copy_gradient_callback (GtkWidget *widget, grad_sel_copy_all (pos, grad); } +/***** The "rename gradient" dialog functions *****/ + /*****/ static void ed_rename_gradient_callback (GtkWidget *widget, - gpointer client_data) + gpointer data) { if (curr_gradient == NULL) return; @@ -1392,10 +1483,10 @@ ed_rename_gradient_callback (GtkWidget *widget, static void ed_do_rename_gradient_callback (GtkWidget *widget, - gpointer client_data, + gpointer data, gpointer call_data) { - gradient_t *grad = (gradient_t *) client_data; + gradient_t *grad = (gradient_t *) data; gradient_t *grad_list = NULL; gchar *gradient_name; GSList *tmp; @@ -1447,11 +1538,13 @@ ed_do_rename_gradient_callback (GtkWidget *widget, grad_sel_rename_all (n, grad); } +/***** The "delete gradient" dialog functions *****/ + /*****/ static void ed_delete_gradient_callback (GtkWidget *widget, - gpointer client_data) + gpointer data) { GtkWidget *dialog; GtkWidget *vbox; @@ -1468,11 +1561,11 @@ ed_delete_gradient_callback (GtkWidget *widget, return; dialog = gtk_dialog_new (); + gtk_window_set_wmclass (GTK_WINDOW (dialog), "delete_gradient", "Gimp"); gtk_window_set_title (GTK_WINDOW (dialog), _("Delete gradient")); gtk_window_position (GTK_WINDOW (dialog), GTK_WIN_POS_MOUSE); - gtk_container_set_border_width (GTK_CONTAINER (dialog), 0); - /* Handle the wm close signal */ + /* Handle the wm delete event */ gtk_signal_connect (GTK_OBJECT (dialog), "delete_event", GTK_SIGNAL_FUNC (ed_delete_delete_gradient_callback), dialog); @@ -1504,14 +1597,14 @@ ed_delete_gradient_callback (GtkWidget *widget, static void ed_do_delete_gradient_callback (GtkWidget *widget, - gpointer client_data) + gpointer data) { GSList *tmp; gint n; gint real_pos; gradient_t *gradient; - gtk_widget_destroy (GTK_WIDGET (client_data)); + gtk_widget_destroy (GTK_WIDGET (data)); gtk_widget_set_sensitive (g_editor->shell, TRUE); /* See which gradient we will have to select once the current one is deleted */ @@ -1561,29 +1654,31 @@ ed_do_delete_gradient_callback (GtkWidget *widget, grad_sel_delete_all (real_pos); } +static void +ed_cancel_delete_gradient_callback (GtkWidget *widget, + gpointer data) +{ + gtk_widget_destroy (GTK_WIDGET (data)); + gtk_widget_set_sensitive (g_editor->shell, TRUE); +} + static gint ed_delete_delete_gradient_callback (GtkWidget *widget, GdkEvent *event, - gpointer client_data) + gpointer data) { - ed_cancel_delete_gradient_callback (widget, client_data); + ed_cancel_delete_gradient_callback (widget, data); return TRUE; } -static void -ed_cancel_delete_gradient_callback (GtkWidget *widget, - gpointer client_data) -{ - gtk_widget_destroy (GTK_WIDGET (client_data)); - gtk_widget_set_sensitive (g_editor->shell, TRUE); -} +/***** The "save as pov" dialog functions *****/ /*****/ static void ed_save_pov_callback (GtkWidget *widget, - gpointer client_data) + gpointer data) { GtkWidget *window; @@ -1601,19 +1696,23 @@ ed_save_pov_callback (GtkWidget *widget, "clicked", (GtkSignalFunc) ed_cancel_save_pov_callback, window); + gtk_signal_connect (GTK_OBJECT (window), "delete_event", + (GdkEventFunc) ed_delete_save_pov_callback, + window); + gtk_widget_show (window); gtk_widget_set_sensitive (g_editor->shell, FALSE); } static void ed_do_save_pov_callback (GtkWidget *widget, - gpointer client_data) + gpointer data) { gchar *filename; FILE *file; grad_segment_t *seg; - filename = gtk_file_selection_get_filename (GTK_FILE_SELECTION (client_data)); + filename = gtk_file_selection_get_filename (GTK_FILE_SELECTION (data)); file = fopen (filename, "wb"); @@ -1652,32 +1751,42 @@ ed_do_save_pov_callback (GtkWidget *widget, fclose (file); } - gtk_widget_destroy (GTK_WIDGET (client_data)); + gtk_widget_destroy (GTK_WIDGET (data)); gtk_widget_set_sensitive (g_editor->shell, TRUE); } static void ed_cancel_save_pov_callback (GtkWidget *widget, - gpointer client_data) + gpointer data) { - gtk_widget_destroy (GTK_WIDGET (client_data)); + gtk_widget_destroy (GTK_WIDGET (data)); gtk_widget_set_sensitive (g_editor->shell, TRUE); } +static gint +ed_delete_save_pov_callback (GtkWidget *widget, + GdkEvent *event, + gpointer data) +{ + ed_cancel_save_pov_callback (widget, data); + + return TRUE; +} + +/***** The main dialog action area button callbacks *****/ + /*****/ static void ed_save_grads_callback (GtkWidget *widget, - gpointer client_data) + gpointer data) { grad_save_all (0); } -/*****/ - static void ed_refresh_grads_callback (GtkWidget *widget, - gpointer client_data) + gpointer data) { gint select_pos; gtk_clist_freeze (GTK_CLIST (g_editor->clist)); @@ -1702,247 +1811,266 @@ ed_refresh_grads_callback (GtkWidget *widget, grad_sel_refill_all (); } -/*****/ - static void -ed_scrollbar_update(GtkAdjustment *adjustment, gpointer data) +ed_close_callback (GtkWidget *widget, + gpointer data) { - char str[256]; - - g_snprintf(str, sizeof(str), _("Zoom factor: %d:1 Displaying [%0.6f, %0.6f]"), - g_editor->zoom_factor, adjustment->value, adjustment->value + adjustment->page_size); + if (GTK_WIDGET_VISIBLE (g_editor->shell)) + gtk_widget_hide (g_editor->shell); +} - ed_set_hint(str); +static gint +ed_delete_callback (GtkWidget *widget, + GdkEvent *event, + gpointer data) +{ + ed_close_callback (widget, data); - ed_update_editor(GRAD_UPDATE_PREVIEW | GRAD_UPDATE_CONTROL); -} /* ed_scrollbar_update */ + return TRUE; +} +/***** Zoom, scrollbar & instant update callbacks *****/ /*****/ static void -ed_zoom_all_callback(GtkWidget *widget, gpointer client_data) +ed_scrollbar_update (GtkAdjustment *adjustment, + gpointer data) { - GtkAdjustment *adjustment; + gchar str[256]; - adjustment = GTK_ADJUSTMENT(g_editor->scroll_data); + g_snprintf (str, sizeof (str), + _("Zoom factor: %d:1 Displaying [%0.6f, %0.6f]"), + g_editor->zoom_factor, adjustment->value, + adjustment->value + adjustment->page_size); - g_editor->zoom_factor = 1; + ed_set_hint (str); - adjustment->value = 0.0; - adjustment->page_size = 1.0; - adjustment->step_increment = 1.0 * GRAD_SCROLLBAR_STEP_SIZE; - adjustment->page_increment = 1.0 * GRAD_SCROLLBAR_PAGE_SIZE; + ed_update_editor (GRAD_UPDATE_PREVIEW | GRAD_UPDATE_CONTROL); +} - gtk_signal_emit_by_name(g_editor->scroll_data, "changed"); -} /* ed_zoom_all_callback */ +static void +ed_zoom_all_callback(GtkWidget *widget, + gpointer data) +{ + GtkAdjustment *adjustment; + adjustment = GTK_ADJUSTMENT (g_editor->scroll_data); -/*****/ + g_editor->zoom_factor = 1; -static void -ed_zoom_out_callback(GtkWidget *widget, gpointer client_data) -{ - GtkAdjustment *adjustment; - double old_value, value; - double old_page_size, page_size; + adjustment->value = 0.0; + adjustment->page_size = 1.0; + adjustment->step_increment = 1.0 * GRAD_SCROLLBAR_STEP_SIZE; + adjustment->page_increment = 1.0 * GRAD_SCROLLBAR_PAGE_SIZE; - if (g_editor->zoom_factor <= 1) - return; + gtk_signal_emit_by_name (g_editor->scroll_data, "changed"); +} - adjustment = GTK_ADJUSTMENT(g_editor->scroll_data); +static void +ed_zoom_out_callback (GtkWidget *widget, + gpointer data) +{ + GtkAdjustment *adjustment; + double old_value, value; + double old_page_size, page_size; - old_value = adjustment->value; - old_page_size = adjustment->page_size; + if (g_editor->zoom_factor <= 1) + return; - g_editor->zoom_factor--; + adjustment = GTK_ADJUSTMENT (g_editor->scroll_data); - page_size = 1.0 / g_editor->zoom_factor; - value = old_value - (page_size - old_page_size) / 2.0; + old_value = adjustment->value; + old_page_size = adjustment->page_size; - if (value < 0.0) - value = 0.0; - else if ((value + page_size) > 1.0) - value = 1.0 - page_size; + g_editor->zoom_factor--; - adjustment->value = value; - adjustment->page_size = page_size; - adjustment->step_increment = page_size * GRAD_SCROLLBAR_STEP_SIZE; - adjustment->page_increment = page_size * GRAD_SCROLLBAR_PAGE_SIZE; + page_size = 1.0 / g_editor->zoom_factor; + value = old_value - (page_size - old_page_size) / 2.0; - gtk_signal_emit_by_name(g_editor->scroll_data, "changed"); -} /* ed_zoom_out_callback */ + if (value < 0.0) + value = 0.0; + else if ((value + page_size) > 1.0) + value = 1.0 - page_size; + adjustment->value = value; + adjustment->page_size = page_size; + adjustment->step_increment = page_size * GRAD_SCROLLBAR_STEP_SIZE; + adjustment->page_increment = page_size * GRAD_SCROLLBAR_PAGE_SIZE; -/*****/ + gtk_signal_emit_by_name (g_editor->scroll_data, "changed"); +} static void -ed_zoom_in_callback(GtkWidget *widget, gpointer client_data) +ed_zoom_in_callback (GtkWidget *widget, + gpointer data) { - GtkAdjustment *adjustment; - double old_value; - double old_page_size, page_size; - - adjustment = GTK_ADJUSTMENT(g_editor->scroll_data); + GtkAdjustment *adjustment; + double old_value; + double old_page_size, page_size; - old_value = adjustment->value; - old_page_size = adjustment->page_size; + adjustment = GTK_ADJUSTMENT (g_editor->scroll_data); - g_editor->zoom_factor++; + old_value = adjustment->value; + old_page_size = adjustment->page_size; - page_size = 1.0 / g_editor->zoom_factor; + g_editor->zoom_factor++; - adjustment->value = old_value + (old_page_size - page_size) / 2.0; - adjustment->page_size = page_size; - adjustment->step_increment = page_size * GRAD_SCROLLBAR_STEP_SIZE; - adjustment->page_increment = page_size * GRAD_SCROLLBAR_PAGE_SIZE; + page_size = 1.0 / g_editor->zoom_factor; - gtk_signal_emit_by_name(g_editor->scroll_data, "changed"); -} /* ed_zoom_in_callback */ + adjustment->value = old_value + (old_page_size - page_size) / 2.0; + adjustment->page_size = page_size; + adjustment->step_increment = page_size * GRAD_SCROLLBAR_STEP_SIZE; + adjustment->page_increment = page_size * GRAD_SCROLLBAR_PAGE_SIZE; - -/*****/ + gtk_signal_emit_by_name (g_editor->scroll_data, "changed"); +} static void -ed_instant_update_update(GtkWidget *widget, gpointer data) +ed_instant_update_update (GtkWidget *widget, + gpointer data) { - if (GTK_TOGGLE_BUTTON(widget)->active) { - g_editor->instant_update = 1; - gtk_range_set_update_policy(GTK_RANGE(g_editor->scrollbar), GTK_UPDATE_CONTINUOUS); - } else { - g_editor->instant_update = 0; - gtk_range_set_update_policy(GTK_RANGE(g_editor->scrollbar), GTK_UPDATE_DELAYED); - } /* else */ -} /* ed_instant_update_update */ - + if (GTK_TOGGLE_BUTTON (widget)->active) + { + g_editor->instant_update = 1; + gtk_range_set_update_policy (GTK_RANGE (g_editor->scrollbar), + GTK_UPDATE_CONTINUOUS); + } + else + { + g_editor->instant_update = 0; + gtk_range_set_update_policy (GTK_RANGE (g_editor->scrollbar), + GTK_UPDATE_DELAYED); + } +} /***** Gradient preview functions *****/ /*****/ static gint -prev_events(GtkWidget *widget, GdkEvent *event) +prev_events (GtkWidget *widget, + GdkEvent *event, + gpointer data) { - gint x, y; - GdkEventButton *bevent; - GdkEventMotion *mevent; + gint x, y; + GdkEventButton *bevent; + GdkEventMotion *mevent; - /* ignore events when no gradient is present */ - if (curr_gradient == NULL) - return FALSE; - - switch (event->type) { - case GDK_EXPOSE: - prev_update(0); - break; - - case GDK_LEAVE_NOTIFY: - ed_set_hint(""); - break; - - case GDK_MOTION_NOTIFY: - gtk_widget_get_pointer(g_editor->preview, &x, &y); - - mevent = (GdkEventMotion *) event; - - if (x != g_editor->preview_last_x) - { - g_editor->preview_last_x = x; + /* ignore events when no gradient is present */ + if (curr_gradient == NULL) + return FALSE; - if (g_editor->preview_button_down) - { - if (mevent->state & GDK_CONTROL_MASK) - prev_set_background (x); - else - prev_set_foreground (x); - } - else - prev_set_hint (x); - } /* if */ + switch (event->type) + { + case GDK_EXPOSE: + prev_update (FALSE); + break; - break; + case GDK_LEAVE_NOTIFY: + ed_set_hint(""); + break; - case GDK_BUTTON_PRESS: - gtk_widget_get_pointer(g_editor->preview, &x, &y); + case GDK_MOTION_NOTIFY: + gtk_widget_get_pointer (g_editor->preview, &x, &y); - bevent = (GdkEventButton *) event; + mevent = (GdkEventMotion *) event; - switch (bevent->button) - { - case 1: - g_editor->preview_last_x = x; - g_editor->preview_button_down = 1; - if (bevent->state & GDK_CONTROL_MASK) - prev_set_background (x); - else - prev_set_foreground (x); - break; + if (x != g_editor->preview_last_x) + { + g_editor->preview_last_x = x; + + if (g_editor->preview_button_down) + { + if (mevent->state & GDK_CONTROL_MASK) + prev_set_background (x); + else + prev_set_foreground (x); + } + else + prev_set_hint (x); + } + break; - case 3: - cpopup_do_popup(); - break; + case GDK_BUTTON_PRESS: + gtk_widget_get_pointer (g_editor->preview, &x, &y); - default: - break; - } + bevent = (GdkEventButton *) event; - break; + switch (bevent->button) + { + case 1: + g_editor->preview_last_x = x; + g_editor->preview_button_down = 1; + if (bevent->state & GDK_CONTROL_MASK) + prev_set_background (x); + else + prev_set_foreground (x); + break; + + case 3: + cpopup_do_popup (); + break; + + default: + break; + } - case GDK_BUTTON_RELEASE: - if (g_editor->preview_button_down) - { - gtk_widget_get_pointer (g_editor->preview, &x, &y); + break; - bevent = (GdkEventButton *) event; + case GDK_BUTTON_RELEASE: + if (g_editor->preview_button_down) + { + gtk_widget_get_pointer (g_editor->preview, &x, &y); - g_editor->preview_last_x = x; - g_editor->preview_button_down = 0; - if (bevent->state & GDK_CONTROL_MASK) - prev_set_background (x); - else - prev_set_foreground (x); - break; - } + bevent = (GdkEventButton *) event; - break; + g_editor->preview_last_x = x; + g_editor->preview_button_down = 0; + if (bevent->state & GDK_CONTROL_MASK) + prev_set_background (x); + else + prev_set_foreground (x); + break; + } - default: - break; - } /* switch */ + break; - return FALSE; -} /* prev_events */ + default: + break; + } + return FALSE; +} /*****/ static void -prev_set_hint(gint x) +prev_set_hint (gint x) { - double xpos; - double r, g, b, a; - double h, s, v; - char str[256]; - - xpos = control_calc_g_pos(x); + double xpos; + double r, g, b, a; + double h, s, v; + gchar str[256]; - grad_get_color_at(xpos, &r, &g, &b, &a); + xpos = control_calc_g_pos (x); - h = r; - s = g; - v = b; + grad_get_color_at (xpos, &r, &g, &b, &a); - calc_rgb_to_hsv(&h, &s, &v); + h = r; + s = g; + v = b; - g_snprintf(str, sizeof(str), _("Position: %0.6f " - "RGB (%0.3f, %0.3f, %0.3f) " - "HSV (%0.3f, %0.3f, %0.3f) " - "Opacity: %0.3f"), - xpos, r, g, b, h * 360.0, s, v, a); + calc_rgb_to_hsv (&h, &s, &v); - ed_set_hint(str); -} /* prev_set_hint */ + g_snprintf (str, sizeof (str), _("Position: %0.6f " + "RGB (%0.3f, %0.3f, %0.3f) " + "HSV (%0.3f, %0.3f, %0.3f) " + "Opacity: %0.3f"), + xpos, r, g, b, h * 360.0, s, v, a); + ed_set_hint (str); +} /*****/ @@ -1995,97 +2123,91 @@ prev_set_background (gint x) /*****/ static void -prev_update(int recalculate) +prev_update (gboolean recalculate) { - long rowsiz; - GtkAdjustment *adjustment; - guint16 width, height; - guint16 pwidth, pheight; - GSList *tmp; - int n; - gradient_t *g; - static gradient_t *last_grad = NULL; - static int last_row = -1; - - /* We only update if we can draw to the widget and a gradient is present */ - - if (curr_gradient == NULL) - return; - if (!GTK_WIDGET_DRAWABLE(g_editor->preview)) - return; - - /* See whether we have to re-create the preview widget */ + long rowsiz; + GtkAdjustment *adjustment; + guint16 width, height; + GSList *tmp; + int n; + gradient_t *g; - width = g_editor->preview->allocation.width; - height = g_editor->preview->allocation.height; + static gradient_t *last_grad = NULL; + static int last_row = -1; - /* hof: do not change preview size on Window resize. - * The original code allows expansion of the preview - * on window resize events. But once expanded, there is no way to shrink - * the window back to the original size. - * A full Bugfix should change the preview size according to the users - * window resize actions. - */ + static guint16 last_width = 0; + static guint16 last_height = 0; - width = GRAD_PREVIEW_WIDTH; - height = GRAD_PREVIEW_HEIGHT; - - pwidth = GTK_PREVIEW(g_editor->preview)->buffer_width; - pheight = GTK_PREVIEW(g_editor->preview)->buffer_height; + /* We only update if we can draw to the widget and a gradient is present */ + if (curr_gradient == NULL) + return; + if (!GTK_WIDGET_DRAWABLE (g_editor->preview)) + return; - if (!g_editor->preview_rows[0] || !g_editor->preview_rows[1] || - (width != pwidth) || (height != pheight)) { - if (g_editor->preview_rows[0]) - g_free(g_editor->preview_rows[0]); + /* See whether we have to re-create the preview widget + * (note that the preview automatically follows the size of it's container) + */ + width = g_editor->preview->allocation.width; + height = g_editor->preview->allocation.height; - if (g_editor->preview_rows[1]) - g_free(g_editor->preview_rows[1]); + if (!g_editor->preview_rows[0] || + !g_editor->preview_rows[1] || + (width != last_width) || + (height != last_height)) + { + if (g_editor->preview_rows[0]) + g_free (g_editor->preview_rows[0]); - gtk_preview_size(GTK_PREVIEW(g_editor->preview), width, height); + if (g_editor->preview_rows[1]) + g_free (g_editor->preview_rows[1]); - rowsiz = width * 3 * sizeof(guchar); + rowsiz = width * 3 * sizeof (guchar); - g_editor->preview_rows[0] = g_malloc(rowsiz); - g_editor->preview_rows[1] = g_malloc(rowsiz); + g_editor->preview_rows[0] = g_malloc (rowsiz); + g_editor->preview_rows[1] = g_malloc (rowsiz); - recalculate = 1; /* Force recalculation */ - } /* if */ + recalculate = TRUE; /* Force recalculation */ + } - /* Have to redraw? */ + last_width = width; + last_height = height; - if (recalculate) { - adjustment = GTK_ADJUSTMENT(g_editor->scroll_data); + /* Have to redraw? */ + if (recalculate) + { + adjustment = GTK_ADJUSTMENT (g_editor->scroll_data); - prev_fill_image(width, height, - adjustment->value, - adjustment->value + adjustment->page_size); + prev_fill_image (width, height, + adjustment->value, + adjustment->value + adjustment->page_size); - gtk_widget_draw(g_editor->preview, NULL); - } /* if */ + gtk_widget_draw (g_editor->preview, NULL); + } - if(last_grad != curr_gradient || last_row < 0) { - n = 0; - tmp = gradients_list; + if (last_grad != curr_gradient || last_row < 0) + { + n = 0; + tmp = gradients_list; - while (tmp) { - g = tmp->data; + while (tmp) + { + g = tmp->data; - if (g == curr_gradient) { - break; /* We found the one we want */ - } /* if */ + if (g == curr_gradient) + break; /* We found the one we want */ - n++; /* Next gradient */ - tmp = g_slist_next(tmp); - } /* while */ - last_grad = curr_gradient; - last_row = n; - } /* if */ + n++; /* Next gradient */ + tmp = g_slist_next (tmp); + } + last_grad = curr_gradient; + last_row = n; + } - draw_small_preview(g_editor->gc,g_editor->clist,curr_gradient,last_row); - /* Update any others that are on screen */ - sel_update_dialogs(last_row,curr_gradient); -} /* prev_update */ + draw_small_preview (g_editor->gc, g_editor->clist, curr_gradient,last_row); + /* Update any others that are on screen */ + sel_update_dialogs (last_row, curr_gradient); +} /*****/ @@ -2152,100 +2274,106 @@ prev_fill_image(int width, int height, double left, double right) /*****/ static gint -control_events(GtkWidget *widget, GdkEvent *event) +control_events (GtkWidget *widget, + GdkEvent *event, + gpointer data) { - gint x, y; - guint32 time; - GdkEventButton *bevent; - grad_segment_t *seg; - - switch (event->type) { - case GDK_EXPOSE: - control_update(0); - break; - - case GDK_LEAVE_NOTIFY: - ed_set_hint(""); - break; - - case GDK_BUTTON_PRESS: - if (g_editor->control_drag_mode == GRAD_DRAG_NONE) { - gtk_widget_get_pointer(g_editor->control, &x, &y); - - bevent = (GdkEventButton *) event; + GdkEventButton *bevent; + grad_segment_t *seg; + gint x, y; + guint32 time; - g_editor->control_last_x = x; - g_editor->control_click_time = bevent->time; + switch (event->type) + { + case GDK_EXPOSE: + control_update (FALSE); + break; - control_button_press(x, y, bevent->button, bevent->state); + case GDK_LEAVE_NOTIFY: + ed_set_hint (""); + break; - if (g_editor->control_drag_mode != GRAD_DRAG_NONE) - gtk_grab_add(widget); - } /* if */ + case GDK_BUTTON_PRESS: + if (g_editor->control_drag_mode == GRAD_DRAG_NONE) + { + gtk_widget_get_pointer (g_editor->control, &x, &y); - break; + bevent = (GdkEventButton *) event; - case GDK_BUTTON_RELEASE: - ed_set_hint(""); + g_editor->control_last_x = x; + g_editor->control_click_time = bevent->time; - if (g_editor->control_drag_mode != GRAD_DRAG_NONE) { - gtk_grab_remove(widget); + control_button_press (x, y, bevent->button, bevent->state); - gtk_widget_get_pointer(g_editor->control, &x, &y); + if (g_editor->control_drag_mode != GRAD_DRAG_NONE) + gtk_grab_add (widget); + } + break; - time = ((GdkEventButton *) event)->time; + case GDK_BUTTON_RELEASE: + ed_set_hint (""); - if ((time - g_editor->control_click_time) >= GRAD_MOVE_TIME) - ed_update_editor(GRAD_UPDATE_PREVIEW); /* Possible move */ - else - if ((g_editor->control_drag_mode == GRAD_DRAG_MIDDLE) || - (g_editor->control_drag_mode == GRAD_DRAG_ALL)) { - seg = g_editor->control_drag_segment; + if (g_editor->control_drag_mode != GRAD_DRAG_NONE) + { + gtk_grab_remove (widget); - if ((g_editor->control_drag_mode == GRAD_DRAG_ALL) && - g_editor->control_compress) - control_extend_selection(seg, control_calc_g_pos(x)); - else - control_select_single_segment(seg); + gtk_widget_get_pointer (g_editor->control, &x, &y); - ed_update_editor(GRAD_UPDATE_CONTROL); - } /* if */ + time = ((GdkEventButton *) event)->time; - g_editor->control_drag_mode = GRAD_DRAG_NONE; - g_editor->control_compress = 0; + if ((time - g_editor->control_click_time) >= GRAD_MOVE_TIME) + ed_update_editor (GRAD_UPDATE_PREVIEW); /* Possible move */ + else + if ((g_editor->control_drag_mode == GRAD_DRAG_MIDDLE) || + (g_editor->control_drag_mode == GRAD_DRAG_ALL)) + { + seg = g_editor->control_drag_segment; - control_do_hint(x, y); - } /* if */ + if ((g_editor->control_drag_mode == GRAD_DRAG_ALL) && + g_editor->control_compress) + control_extend_selection (seg, control_calc_g_pos (x)); + else + control_select_single_segment (seg); - break; + ed_update_editor (GRAD_UPDATE_CONTROL); + } - case GDK_MOTION_NOTIFY: - gtk_widget_get_pointer(g_editor->control, &x, &y); + g_editor->control_drag_mode = GRAD_DRAG_NONE; + g_editor->control_compress = 0; - if (x != g_editor->control_last_x) { - g_editor->control_last_x = x; + control_do_hint (x, y); + } + break; - if (g_editor->control_drag_mode != GRAD_DRAG_NONE) { - time = ((GdkEventButton *) event)->time; + case GDK_MOTION_NOTIFY: + gtk_widget_get_pointer (g_editor->control, &x, &y); - if ((time - g_editor->control_click_time) >= GRAD_MOVE_TIME) - control_motion(x); - } else { - ed_update_editor(GRAD_UPDATE_CONTROL); + if (x != g_editor->control_last_x) + { + g_editor->control_last_x = x; - control_do_hint(x, y); - } /* else */ - } /* if */ + if (g_editor->control_drag_mode != GRAD_DRAG_NONE) + { + time = ((GdkEventButton *) event)->time; - break; + if ((time - g_editor->control_click_time) >= GRAD_MOVE_TIME) + control_motion(x); + } + else + { + ed_update_editor (GRAD_UPDATE_CONTROL); - default: - break; - } /* switch */ + control_do_hint (x, y); + } + } + break; - return FALSE; -} /* control_events */ + default: + break; + } + return FALSE; +} /*****/ @@ -2753,59 +2881,59 @@ control_move(grad_segment_t *range_l, grad_segment_t *range_r, double delta) /*****/ static void -control_update(int recalculate) +control_update (gboolean recalculate) { - gint cwidth, cheight; - gint pwidth, pheight; - GtkAdjustment *adjustment; - - /* We only update if we can redraw and a gradient is present */ - - if (curr_gradient == NULL) - return; - if (!GTK_WIDGET_DRAWABLE(g_editor->control)) - return; - - /* See whether we have to re-create the control pixmap */ - - gdk_window_get_size(g_editor->control->window, &cwidth, &cheight); + GtkAdjustment *adjustment; + gint cwidth, cheight; + gint pwidth, pheight; - /* as long as we have that ugly workaround in prev_update() don't - change the size of the controls either when the window is resized */ - - cwidth = GRAD_PREVIEW_WIDTH; - cheight = GRAD_PREVIEW_HEIGHT; - - if (g_editor->control_pixmap) - gdk_window_get_size(g_editor->control_pixmap, &pwidth, &pheight); + /* We only update if we can redraw and a gradient is present */ + if (curr_gradient == NULL) + return; + if (!GTK_WIDGET_DRAWABLE (g_editor->control)) + return; - if (!g_editor->control_pixmap || (cwidth != pwidth) || (cheight != pheight)) { - if (g_editor->control_pixmap) - gdk_pixmap_unref(g_editor->control_pixmap); + /* See whether we have to re-create the control pixmap + * depending on the preview's width + */ + cwidth = g_editor->preview->allocation.width; + cheight = GRAD_CONTROL_HEIGHT; - g_editor->control_pixmap = gdk_pixmap_new(g_editor->control->window, cwidth, cheight, -1); + if (g_editor->control_pixmap) + gdk_window_get_size (g_editor->control_pixmap, &pwidth, &pheight); - recalculate = 1; - } /* if */ + if (!g_editor->control_pixmap || + (cwidth != pwidth) || + (cheight != pheight)) + { + if (g_editor->control_pixmap) + gdk_pixmap_unref (g_editor->control_pixmap); - /* Have to reset the selection? */ + g_editor->control_pixmap = + gdk_pixmap_new (g_editor->control->window, cwidth, cheight, -1); - if (recalculate) - control_select_single_segment(curr_gradient->segments); + recalculate = TRUE; + } - /* Redraw pixmap */ + /* Avaoid segfault on first invocation */ + if (cwidth < GRAD_PREVIEW_WIDTH) + return; - adjustment = GTK_ADJUSTMENT(g_editor->scroll_data); + /* Have to reset the selection? */ + if (recalculate) + control_select_single_segment (curr_gradient->segments); - control_draw(g_editor->control_pixmap, - cwidth, cheight, - adjustment->value, - adjustment->value + adjustment->page_size); + /* Redraw pixmap */ + adjustment = GTK_ADJUSTMENT (g_editor->scroll_data); - gdk_draw_pixmap(g_editor->control->window, g_editor->control->style->black_gc, - g_editor->control_pixmap, 0, 0, 0, 0, cwidth, cheight); -} /* control_update */ + control_draw (g_editor->control_pixmap, + cwidth, cheight, + adjustment->value, + adjustment->value + adjustment->page_size); + gdk_draw_pixmap (g_editor->control->window, g_editor->control->style->black_gc, + g_editor->control_pixmap, 0, 0, 0, 0, cwidth, cheight); +} /*****/ @@ -2963,560 +3091,536 @@ control_calc_g_pos(int pos) /*****/ static void -cpopup_create_main_menu(void) -{ - GtkWidget *menu; - GtkWidget *menuitem; - GtkWidget *label; - GtkAccelGroup *accel_group; - - menu = gtk_menu_new(); - accel_group = gtk_accel_group_new(); - - g_editor->accel_group = accel_group; - - gtk_menu_set_accel_group (GTK_MENU(menu), accel_group); - gtk_window_add_accel_group (GTK_WINDOW (g_editor->shell), accel_group); - - /* Left endpoint */ - - menuitem = cpopup_create_color_item(&g_editor->left_color_preview, &label); - gtk_label_set(GTK_LABEL(label), _("Left endpoint's color")); - gtk_signal_connect(GTK_OBJECT(menuitem), "activate", - (GtkSignalFunc) cpopup_set_left_color_callback, - NULL); - gtk_menu_append(GTK_MENU(menu), menuitem); - gtk_widget_show(menuitem); - gtk_widget_add_accelerator(menuitem, - "activate", - accel_group, - 'L', 0, - GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED); - - menuitem = gtk_menu_item_new_with_label(_("Load from")); - g_editor->control_left_load_popup = cpopup_create_load_menu(g_editor->left_load_color_boxes, - g_editor->left_load_labels, - _("Left neighbor's right endpoint"), - _("Right endpoint"), - (GtkSignalFunc) - cpopup_load_left_callback, - 'L', GDK_CONTROL_MASK, - 'L', GDK_MOD1_MASK, - 'F', GDK_CONTROL_MASK); - gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), g_editor->control_left_load_popup); - gtk_menu_append(GTK_MENU(menu), menuitem); - gtk_widget_show(menuitem); - - menuitem = gtk_menu_item_new_with_label(_("Save to")); - g_editor->control_left_save_popup = cpopup_create_save_menu(g_editor->left_save_color_boxes, - g_editor->left_save_labels, - (GtkSignalFunc) - cpopup_save_left_callback); - gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), g_editor->control_left_save_popup); - gtk_menu_append(GTK_MENU(menu), menuitem); - gtk_widget_show(menuitem); - - /* Right endpoint */ - - menuitem = gtk_menu_item_new(); - gtk_menu_append(GTK_MENU(menu), menuitem); - gtk_widget_show(menuitem); - - menuitem = cpopup_create_color_item(&g_editor->right_color_preview, &label); - gtk_label_set(GTK_LABEL(label), _("Right endpoint's color")); - gtk_signal_connect(GTK_OBJECT(menuitem), "activate", - (GtkSignalFunc) cpopup_set_right_color_callback, - NULL); - gtk_menu_append(GTK_MENU(menu), menuitem); - gtk_widget_show(menuitem); - gtk_widget_add_accelerator(menuitem, - "activate", - accel_group, - 'R', 0, - GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED); - - menuitem = gtk_menu_item_new_with_label(_("Load from")); - g_editor->control_right_load_popup = cpopup_create_load_menu(g_editor->right_load_color_boxes, - g_editor->right_load_labels, - _("Right neighbor's left endpoint"), - _("Left endpoint"), - (GtkSignalFunc) - cpopup_load_right_callback, - 'R', GDK_CONTROL_MASK, - 'R', GDK_MOD1_MASK, - 'F', GDK_MOD1_MASK); - gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), g_editor->control_right_load_popup); - gtk_menu_append(GTK_MENU(menu), menuitem); - gtk_widget_show(menuitem); - - menuitem = gtk_menu_item_new_with_label(_("Save to")); - g_editor->control_right_save_popup = cpopup_create_save_menu(g_editor->right_save_color_boxes, - g_editor->right_save_labels, - (GtkSignalFunc) - cpopup_save_right_callback); - gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), g_editor->control_right_save_popup); - gtk_menu_append(GTK_MENU(menu), menuitem); - gtk_widget_show(menuitem); - - /* Blending function */ - - menuitem = gtk_menu_item_new(); - gtk_menu_append(GTK_MENU(menu), menuitem); - gtk_widget_show(menuitem); - - menuitem = cpopup_create_menu_item_with_label("", &g_editor->control_blending_label); - g_editor->control_blending_popup = cpopup_create_blending_menu(); - gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), g_editor->control_blending_popup); - gtk_menu_append(GTK_MENU(menu), menuitem); - gtk_widget_show(menuitem); - - /* Coloring type */ - - menuitem = cpopup_create_menu_item_with_label("", &g_editor->control_coloring_label); - g_editor->control_coloring_popup = cpopup_create_coloring_menu(); - gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), g_editor->control_coloring_popup); - gtk_menu_append(GTK_MENU(menu), menuitem); - gtk_widget_show(menuitem); - - /* Operations */ - - menuitem = gtk_menu_item_new(); - gtk_menu_append(GTK_MENU(menu), menuitem); - gtk_widget_show(menuitem); - - /* Split at midpoint */ - - menuitem = cpopup_create_menu_item_with_label("", &g_editor->control_splitm_label); - gtk_signal_connect(GTK_OBJECT(menuitem), "activate", - (GtkSignalFunc) cpopup_split_midpoint_callback, - NULL); - gtk_menu_append(GTK_MENU(menu), menuitem); - gtk_widget_show(menuitem); - gtk_widget_add_accelerator(menuitem, - "activate", - accel_group, - 'S', 0, - GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED); - - /* Split uniformly */ - - menuitem = cpopup_create_menu_item_with_label("", &g_editor->control_splitu_label); - gtk_signal_connect(GTK_OBJECT(menuitem), "activate", - (GtkSignalFunc) cpopup_split_uniform_callback, - NULL); - gtk_menu_append(GTK_MENU(menu), menuitem); - gtk_widget_show(menuitem); - gtk_widget_add_accelerator(menuitem, - "activate", - accel_group, - 'U', 0, - GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED); - - /* Delete */ - - menuitem = cpopup_create_menu_item_with_label("", &g_editor->control_delete_label); - gtk_signal_connect(GTK_OBJECT(menuitem), "activate", - (GtkSignalFunc) cpopup_delete_callback, - NULL); - gtk_menu_append(GTK_MENU(menu), menuitem); - gtk_widget_show(menuitem); - g_editor->control_delete_menu_item = menuitem; - gtk_widget_add_accelerator(menuitem, - "activate", - accel_group, - 'D', 0, - GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED); - - /* Recenter */ - - menuitem = cpopup_create_menu_item_with_label("", &g_editor->control_recenter_label); - gtk_signal_connect(GTK_OBJECT(menuitem), "activate", - (GtkSignalFunc) cpopup_recenter_callback, - NULL); - gtk_menu_append(GTK_MENU(menu), menuitem); - gtk_widget_show(menuitem); - gtk_widget_add_accelerator(menuitem, - "activate", - accel_group, - 'C', 0, - GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED); - - /* Redistribute */ - - menuitem = cpopup_create_menu_item_with_label("", &g_editor->control_redistribute_label); - gtk_signal_connect(GTK_OBJECT(menuitem), "activate", - (GtkSignalFunc) cpopup_redistribute_callback, - NULL); - gtk_menu_append(GTK_MENU(menu), menuitem); - gtk_widget_show(menuitem); - gtk_widget_add_accelerator(menuitem, - "activate", - accel_group, - 'C', GDK_CONTROL_MASK, - GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED); - - /* Selection ops */ - - menuitem = gtk_menu_item_new(); - gtk_menu_append(GTK_MENU(menu), menuitem); - gtk_widget_show(menuitem); - - menuitem = gtk_menu_item_new_with_label(_("Selection operations")); - g_editor->control_sel_ops_popup = cpopup_create_sel_ops_menu(); - gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), g_editor->control_sel_ops_popup); - gtk_menu_append(GTK_MENU(menu), menuitem); - gtk_widget_show(menuitem); - - /* Done */ - - g_editor->control_main_popup = menu; -} /* cpopup_create_main_menu */ +cpopup_create_main_menu (void) +{ + GtkWidget *menu; + GtkWidget *menuitem; + GtkWidget *label; + GtkAccelGroup *accel_group; + menu = gtk_menu_new (); + accel_group = gtk_accel_group_new (); -/*****/ + g_editor->accel_group = accel_group; + + gtk_menu_set_accel_group (GTK_MENU (menu), accel_group); + gtk_window_add_accel_group (GTK_WINDOW (g_editor->shell), accel_group); + + /* Left endpoint */ + menuitem = cpopup_create_color_item (&g_editor->left_color_preview, &label); + gtk_label_set_text (GTK_LABEL (label), _("Left endpoint's color")); + gtk_signal_connect (GTK_OBJECT (menuitem), "activate", + (GtkSignalFunc) cpopup_set_left_color_callback, + NULL); + gtk_menu_append (GTK_MENU (menu), menuitem); + gtk_widget_show (menuitem); + gtk_widget_add_accelerator (menuitem, "activate", + accel_group, + 'L', 0, + GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED); + + menuitem = gtk_menu_item_new_with_label (_("Load from")); + g_editor->control_left_load_popup = + cpopup_create_load_menu (g_editor->left_load_color_boxes, + g_editor->left_load_labels, + _("Left neighbor's right endpoint"), + _("Right endpoint"), + (GtkSignalFunc) cpopup_load_left_callback, + 'L', GDK_CONTROL_MASK, + 'L', GDK_MOD1_MASK, + 'F', GDK_CONTROL_MASK); + gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), + g_editor->control_left_load_popup); + gtk_menu_append (GTK_MENU (menu), menuitem); + gtk_widget_show (menuitem); + + menuitem = gtk_menu_item_new_with_label (_("Save to")); + g_editor->control_left_save_popup = + cpopup_create_save_menu (g_editor->left_save_color_boxes, + g_editor->left_save_labels, + (GtkSignalFunc) cpopup_save_left_callback); + gtk_menu_item_set_submenu (GTK_MENU_ITEM(menuitem), + g_editor->control_left_save_popup); + gtk_menu_append (GTK_MENU (menu), menuitem); + gtk_widget_show (menuitem); + + /* Right endpoint */ + menuitem = gtk_menu_item_new (); + gtk_menu_append (GTK_MENU (menu), menuitem); + gtk_widget_show (menuitem); + + menuitem = cpopup_create_color_item (&g_editor->right_color_preview, &label); + gtk_label_set_text (GTK_LABEL (label), _("Right endpoint's color")); + gtk_signal_connect (GTK_OBJECT (menuitem), "activate", + (GtkSignalFunc) cpopup_set_right_color_callback, + NULL); + gtk_menu_append (GTK_MENU (menu), menuitem); + gtk_widget_show (menuitem); + gtk_widget_add_accelerator (menuitem, "activate", + accel_group, + 'R', 0, + GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED); + + menuitem = gtk_menu_item_new_with_label (_("Load from")); + g_editor->control_right_load_popup = + cpopup_create_load_menu (g_editor->right_load_color_boxes, + g_editor->right_load_labels, + _("Right neighbor's left endpoint"), + _("Left endpoint"), + (GtkSignalFunc) cpopup_load_right_callback, + 'R', GDK_CONTROL_MASK, + 'R', GDK_MOD1_MASK, + 'F', GDK_MOD1_MASK); + gtk_menu_item_set_submenu (GTK_MENU_ITEM(menuitem), + g_editor->control_right_load_popup); + gtk_menu_append (GTK_MENU (menu), menuitem); + gtk_widget_show (menuitem); + + menuitem = gtk_menu_item_new_with_label (_("Save to")); + g_editor->control_right_save_popup = + cpopup_create_save_menu (g_editor->right_save_color_boxes, + g_editor->right_save_labels, + (GtkSignalFunc) cpopup_save_right_callback); + gtk_menu_item_set_submenu (GTK_MENU_ITEM(menuitem), + g_editor->control_right_save_popup); + gtk_menu_append (GTK_MENU (menu), menuitem); + gtk_widget_show (menuitem); + + /* Blending function */ + menuitem = gtk_menu_item_new (); + gtk_menu_append (GTK_MENU (menu), menuitem); + gtk_widget_show (menuitem); + + menuitem = cpopup_create_menu_item_with_label ("", &g_editor->control_blending_label); + g_editor->control_blending_popup = cpopup_create_blending_menu (); + gtk_menu_item_set_submenu (GTK_MENU_ITEM(menuitem), + g_editor->control_blending_popup); + gtk_menu_append (GTK_MENU(menu), menuitem); + gtk_widget_show (menuitem); + + /* Coloring type */ + menuitem = cpopup_create_menu_item_with_label ("", &g_editor->control_coloring_label); + g_editor->control_coloring_popup = cpopup_create_coloring_menu (); + gtk_menu_item_set_submenu (GTK_MENU_ITEM(menuitem), + g_editor->control_coloring_popup); + gtk_menu_append (GTK_MENU (menu), menuitem); + gtk_widget_show (menuitem); + + /* Operations */ + menuitem = gtk_menu_item_new (); + gtk_menu_append (GTK_MENU (menu), menuitem); + gtk_widget_show (menuitem); + + /* Split at midpoint */ + menuitem = cpopup_create_menu_item_with_label ("", &g_editor->control_splitm_label); + gtk_signal_connect (GTK_OBJECT (menuitem), "activate", + (GtkSignalFunc) cpopup_split_midpoint_callback, + NULL); + gtk_menu_append (GTK_MENU (menu), menuitem); + gtk_widget_show (menuitem); + gtk_widget_add_accelerator(menuitem, "activate", + accel_group, + 'S', 0, + GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED); + + /* Split uniformly */ + menuitem = cpopup_create_menu_item_with_label ("", &g_editor->control_splitu_label); + gtk_signal_connect (GTK_OBJECT(menuitem), "activate", + (GtkSignalFunc) cpopup_split_uniform_callback, + NULL); + gtk_menu_append (GTK_MENU (menu), menuitem); + gtk_widget_show (menuitem); + gtk_widget_add_accelerator (menuitem, "activate", + accel_group, + 'U', 0, + GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED); + + /* Delete */ + menuitem = cpopup_create_menu_item_with_label ("", &g_editor->control_delete_label); + gtk_signal_connect (GTK_OBJECT (menuitem), "activate", + (GtkSignalFunc) cpopup_delete_callback, + NULL); + gtk_menu_append (GTK_MENU (menu), menuitem); + gtk_widget_show (menuitem); + g_editor->control_delete_menu_item = menuitem; + gtk_widget_add_accelerator (menuitem, "activate", + accel_group, + 'D', 0, + GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED); + + /* Recenter */ + menuitem = cpopup_create_menu_item_with_label ("", &g_editor->control_recenter_label); + gtk_signal_connect (GTK_OBJECT (menuitem), "activate", + (GtkSignalFunc) cpopup_recenter_callback, + NULL); + gtk_menu_append (GTK_MENU (menu), menuitem); + gtk_widget_show (menuitem); + gtk_widget_add_accelerator (menuitem, "activate", + accel_group, + 'C', 0, + GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED); + + /* Redistribute */ + menuitem = cpopup_create_menu_item_with_label ("", &g_editor->control_redistribute_label); + gtk_signal_connect (GTK_OBJECT (menuitem), "activate", + (GtkSignalFunc) cpopup_redistribute_callback, + NULL); + gtk_menu_append (GTK_MENU (menu), menuitem); + gtk_widget_show (menuitem); + gtk_widget_add_accelerator (menuitem, "activate", + accel_group, + 'C', GDK_CONTROL_MASK, + GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED); + + /* Selection ops */ + menuitem = gtk_menu_item_new (); + gtk_menu_append (GTK_MENU (menu), menuitem); + gtk_widget_show (menuitem); + + menuitem = gtk_menu_item_new_with_label (_("Selection operations")); + g_editor->control_sel_ops_popup = cpopup_create_sel_ops_menu (); + gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), + g_editor->control_sel_ops_popup); + gtk_menu_append (GTK_MENU (menu), menuitem); + gtk_widget_show (menuitem); + + /* Done */ + g_editor->control_main_popup = menu; +} static void -cpopup_do_popup(void) +cpopup_do_popup (void) { - cpopup_adjust_menus(); - gtk_menu_popup(GTK_MENU(g_editor->control_main_popup), NULL, NULL, NULL, NULL, 3, 0); -} /* cpopup_do_popup */ + cpopup_adjust_menus(); + gtk_menu_popup (GTK_MENU (g_editor->control_main_popup), + NULL, NULL, NULL, NULL, 3, 0); +} +/***** Create a single menu item *****/ /*****/ static GtkWidget * -cpopup_create_color_item(GtkWidget **color_box, GtkWidget **label) +cpopup_create_color_item (GtkWidget **color_box, + GtkWidget **label) { - GtkWidget *menuitem; - GtkWidget *hbox; - GtkWidget *vbox; - GtkWidget *wcolor_box; - GtkWidget *wlabel; - - menuitem = gtk_menu_item_new(); - - hbox = gtk_hbox_new(FALSE, 0); - gtk_container_add(GTK_CONTAINER(menuitem), hbox); - gtk_widget_show(hbox); + GtkWidget *menuitem; + GtkWidget *hbox; + GtkWidget *vbox; + GtkWidget *wcolor_box; + GtkWidget *wlabel; - vbox = gtk_vbox_new(FALSE, 0); - gtk_box_pack_start(GTK_BOX(hbox), vbox, FALSE, FALSE, 0); - gtk_widget_show(vbox); + menuitem = gtk_menu_item_new(); - wcolor_box = gtk_preview_new(GTK_PREVIEW_COLOR); - gtk_preview_set_dither (GTK_PREVIEW (wcolor_box), GDK_RGB_DITHER_MAX); - gtk_preview_size(GTK_PREVIEW(wcolor_box), GRAD_COLOR_BOX_WIDTH, GRAD_COLOR_BOX_HEIGHT); - gtk_box_pack_start(GTK_BOX(vbox), wcolor_box, FALSE, FALSE, 2); - gtk_widget_show(wcolor_box); + hbox = gtk_hbox_new (FALSE, 0); + gtk_container_add (GTK_CONTAINER (menuitem), hbox); + gtk_widget_show (hbox); - if (color_box) - *color_box = wcolor_box; + vbox = gtk_vbox_new (FALSE, 0); + gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0); + gtk_widget_show (vbox); - wlabel = gtk_label_new(""); - gtk_misc_set_alignment(GTK_MISC(wlabel), 0.0, 0.5); - gtk_box_pack_start(GTK_BOX(hbox), wlabel, TRUE, TRUE, 4); - gtk_widget_show(wlabel); + wcolor_box = gtk_preview_new (GTK_PREVIEW_COLOR); + gtk_preview_set_dither (GTK_PREVIEW (wcolor_box), GDK_RGB_DITHER_MAX); + gtk_preview_size (GTK_PREVIEW (wcolor_box), + GRAD_COLOR_BOX_WIDTH, GRAD_COLOR_BOX_HEIGHT); + gtk_box_pack_start (GTK_BOX (vbox), wcolor_box, FALSE, FALSE, 2); + gtk_widget_show (wcolor_box); - if (label) - *label = wlabel; + if (color_box) + *color_box = wcolor_box; - return menuitem; -} /* cpopup_create_color_item */ + wlabel = gtk_label_new (""); + gtk_misc_set_alignment (GTK_MISC (wlabel), 0.0, 0.5); + gtk_box_pack_start (GTK_BOX (hbox), wlabel, FALSE, FALSE, 4); + gtk_widget_show (wlabel); + if (label) + *label = wlabel; -/*****/ + return menuitem; +} -static void -cpopup_adjust_menus(void) +static GtkWidget * +cpopup_create_menu_item_with_label (gchar *str, + GtkWidget **label) { - grad_segment_t *seg; - int i; - double fg_r, fg_g, fg_b; - double fg_a; + GtkWidget *menuitem; + GtkWidget *accel_label; - /* Render main menu color boxes */ + menuitem = gtk_menu_item_new (); - cpopup_render_color_box(GTK_PREVIEW(g_editor->left_color_preview), - g_editor->control_sel_l->r0, - g_editor->control_sel_l->g0, - g_editor->control_sel_l->b0, - g_editor->control_sel_l->a0); + accel_label = gtk_accel_label_new (str); + gtk_misc_set_alignment (GTK_MISC (accel_label), 0.0, 0.5); + gtk_container_add (GTK_CONTAINER (menuitem), accel_label); + gtk_accel_label_set_accel_widget (GTK_ACCEL_LABEL (accel_label), menuitem); + gtk_widget_show (accel_label); - cpopup_render_color_box(GTK_PREVIEW(g_editor->right_color_preview), - g_editor->control_sel_r->r1, - g_editor->control_sel_r->g1, - g_editor->control_sel_r->b1, - g_editor->control_sel_r->a1); + if (label) + *label = accel_label; - /* Render load color from endpoint color boxes */ - - if (g_editor->control_sel_l->prev != NULL) - seg = g_editor->control_sel_l->prev; - else - seg = seg_get_last_segment(g_editor->control_sel_l); - - cpopup_render_color_box(GTK_PREVIEW(g_editor->left_load_color_boxes[0]), - seg->r1, - seg->g1, - seg->b1, - seg->a1); - - cpopup_render_color_box(GTK_PREVIEW(g_editor->left_load_color_boxes[1]), - g_editor->control_sel_r->r1, - g_editor->control_sel_r->g1, - g_editor->control_sel_r->b1, - g_editor->control_sel_r->a1); - - if (g_editor->control_sel_r->next != NULL) - seg = g_editor->control_sel_r->next; - else - seg = curr_gradient->segments; - - cpopup_render_color_box(GTK_PREVIEW(g_editor->right_load_color_boxes[0]), - seg->r0, - seg->g0, - seg->b0, - seg->a0); - - cpopup_render_color_box(GTK_PREVIEW(g_editor->right_load_color_boxes[1]), - g_editor->control_sel_l->r0, - g_editor->control_sel_l->g0, - g_editor->control_sel_l->b0, - g_editor->control_sel_l->a0); - - /* Render Foreground color boxes */ - - ed_fetch_foreground(&fg_r, &fg_g, &fg_b, &fg_a); - - cpopup_render_color_box(GTK_PREVIEW(g_editor->left_load_color_boxes[2]), - fg_r, - fg_g, - fg_b, - fg_a); - - cpopup_render_color_box(GTK_PREVIEW(g_editor->right_load_color_boxes[2]), - fg_r, - fg_g, - fg_b, - fg_a); - - /* Render saved color boxes */ - - for (i = 0; i < GRAD_NUM_COLORS; i++) - cpopup_update_saved_color(i, - g_editor->saved_colors[i].r, - g_editor->saved_colors[i].g, - g_editor->saved_colors[i].b, - g_editor->saved_colors[i].a); - - /* Adjust labels */ - - if (g_editor->control_sel_l == g_editor->control_sel_r) { - gtk_label_set(GTK_LABEL(g_editor->control_blending_label), - _("Blending function for segment")); - gtk_label_set(GTK_LABEL(g_editor->control_coloring_label), - _("Coloring type for segment")); - gtk_label_set(GTK_LABEL(g_editor->control_splitm_label), - _("Split segment at midpoint")); - gtk_label_set(GTK_LABEL(g_editor->control_splitu_label), - _("Split segment uniformly")); - gtk_label_set(GTK_LABEL(g_editor->control_delete_label), - _("Delete segment")); - gtk_label_set(GTK_LABEL(g_editor->control_recenter_label), - _("Re-center segment's midpoint")); - gtk_label_set(GTK_LABEL(g_editor->control_redistribute_label), - _("Re-distribute handles in segment")); - gtk_label_set(GTK_LABEL(g_editor->control_flip_label), - _("Flip segment")); - gtk_label_set(GTK_LABEL(g_editor->control_replicate_label), - _("Replicate segment")); - } else { - gtk_label_set(GTK_LABEL(g_editor->control_blending_label), - _("Blending function for selection")); - gtk_label_set(GTK_LABEL(g_editor->control_coloring_label), - _("Coloring type for selection")); - gtk_label_set(GTK_LABEL(g_editor->control_splitm_label), - _("Split segments at midpoints")); - gtk_label_set(GTK_LABEL(g_editor->control_splitu_label), - _("Split segments uniformly")); - gtk_label_set(GTK_LABEL(g_editor->control_delete_label), - _("Delete selection")); - gtk_label_set(GTK_LABEL(g_editor->control_recenter_label), - _("Re-center midpoints in selection")); - gtk_label_set(GTK_LABEL(g_editor->control_redistribute_label), - _("Re-distribute handles in selection")); - gtk_label_set(GTK_LABEL(g_editor->control_flip_label), - _("Flip selection")); - gtk_label_set(GTK_LABEL(g_editor->control_replicate_label), - _("Replicate selection")); - } /* else */ - - /* Adjust blending and coloring menus */ - - cpopup_adjust_blending_menu(); - cpopup_adjust_coloring_menu(); - - /* Can invoke delete? */ - - if ((g_editor->control_sel_l->prev == NULL) && (g_editor->control_sel_r->next == NULL)) - gtk_widget_set_sensitive(g_editor->control_delete_menu_item, FALSE); - else - gtk_widget_set_sensitive(g_editor->control_delete_menu_item, TRUE); - - /* Can invoke blend colors / opacity? */ - - if (g_editor->control_sel_l == g_editor->control_sel_r) { - gtk_widget_set_sensitive(g_editor->control_blend_colors_menu_item, FALSE); - gtk_widget_set_sensitive(g_editor->control_blend_opacity_menu_item, FALSE); - } else { - gtk_widget_set_sensitive(g_editor->control_blend_colors_menu_item, TRUE); - gtk_widget_set_sensitive(g_editor->control_blend_opacity_menu_item, TRUE); - } /* else */ -} /* cpopup_adjust_menus */ + return menuitem; +} +/***** Update all menus *****/ /*****/ static void -cpopup_adjust_blending_menu(void) +cpopup_adjust_menus (void) { - int equal; - long i, num_items; - int type; - - cpopup_check_selection_params(&equal, NULL); - - /* Block activate signals */ - - num_items = sizeof(g_editor->control_blending_items) / sizeof(g_editor->control_blending_items[0]); - - type = (int) g_editor->control_sel_l->type; - - for (i = 0; i < num_items; i++) - gtk_signal_handler_block_by_data(GTK_OBJECT(g_editor->control_blending_items[i]), - (gpointer) i); + grad_segment_t *seg; + int i; + double fg_r, fg_g, fg_b; + double fg_a; + + /* Render main menu color boxes */ + cpopup_render_color_box (GTK_PREVIEW (g_editor->left_color_preview), + g_editor->control_sel_l->r0, + g_editor->control_sel_l->g0, + g_editor->control_sel_l->b0, + g_editor->control_sel_l->a0); + + cpopup_render_color_box (GTK_PREVIEW (g_editor->right_color_preview), + g_editor->control_sel_r->r1, + g_editor->control_sel_r->g1, + g_editor->control_sel_r->b1, + g_editor->control_sel_r->a1); + + /* Render load color from endpoint color boxes */ + + if (g_editor->control_sel_l->prev != NULL) + seg = g_editor->control_sel_l->prev; + else + seg = seg_get_last_segment (g_editor->control_sel_l); + + cpopup_render_color_box (GTK_PREVIEW (g_editor->left_load_color_boxes[0]), + seg->r1, + seg->g1, + seg->b1, + seg->a1); + + cpopup_render_color_box (GTK_PREVIEW (g_editor->left_load_color_boxes[1]), + g_editor->control_sel_r->r1, + g_editor->control_sel_r->g1, + g_editor->control_sel_r->b1, + g_editor->control_sel_r->a1); + + if (g_editor->control_sel_r->next != NULL) + seg = g_editor->control_sel_r->next; + else + seg = curr_gradient->segments; + + cpopup_render_color_box (GTK_PREVIEW (g_editor->right_load_color_boxes[0]), + seg->r0, + seg->g0, + seg->b0, + seg->a0); + + cpopup_render_color_box (GTK_PREVIEW (g_editor->right_load_color_boxes[1]), + g_editor->control_sel_l->r0, + g_editor->control_sel_l->g0, + g_editor->control_sel_l->b0, + g_editor->control_sel_l->a0); + + /* Render Foreground color boxes */ + + ed_fetch_foreground (&fg_r, &fg_g, &fg_b, &fg_a); + + cpopup_render_color_box (GTK_PREVIEW (g_editor->left_load_color_boxes[2]), + fg_r, + fg_g, + fg_b, + fg_a); + + cpopup_render_color_box (GTK_PREVIEW (g_editor->right_load_color_boxes[2]), + fg_r, + fg_g, + fg_b, + fg_a); + + /* Render saved color boxes */ - /* Set state */ + for (i = 0; i < GRAD_NUM_COLORS; i++) + cpopup_update_saved_color(i, + g_editor->saved_colors[i].r, + g_editor->saved_colors[i].g, + g_editor->saved_colors[i].b, + g_editor->saved_colors[i].a); - if (equal) { - gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(g_editor->control_blending_items[type]), - TRUE); - gtk_widget_hide(g_editor->control_blending_items[num_items - 1]); - } else { - gtk_widget_show(g_editor->control_blending_items[num_items - 1]); - gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(g_editor->control_blending_items - [num_items - 1]), - TRUE); - } /* else */ + /* Adjust labels */ - /* Unblock signals */ + if (g_editor->control_sel_l == g_editor->control_sel_r) + { + gtk_label_set_text (GTK_LABEL (g_editor->control_blending_label), + _("Blending function for segment")); + gtk_label_set_text (GTK_LABEL (g_editor->control_coloring_label), + _("Coloring type for segment")); + gtk_label_set_text (GTK_LABEL (g_editor->control_splitm_label), + _("Split segment at midpoint")); + gtk_label_set_text (GTK_LABEL (g_editor->control_splitu_label), + _("Split segment uniformly")); + gtk_label_set_text (GTK_LABEL (g_editor->control_delete_label), + _("Delete segment")); + gtk_label_set_text (GTK_LABEL (g_editor->control_recenter_label), + _("Re-center segment's midpoint")); + gtk_label_set_text (GTK_LABEL (g_editor->control_redistribute_label), + _("Re-distribute handles in segment")); + gtk_label_set_text (GTK_LABEL (g_editor->control_flip_label), + _("Flip segment")); + gtk_label_set_text (GTK_LABEL (g_editor->control_replicate_label), + _("Replicate segment")); + } + else + { + gtk_label_set_text (GTK_LABEL (g_editor->control_blending_label), + _("Blending function for selection")); + gtk_label_set_text (GTK_LABEL (g_editor->control_coloring_label), + _("Coloring type for selection")); + gtk_label_set_text (GTK_LABEL (g_editor->control_splitm_label), + _("Split segments at midpoints")); + gtk_label_set_text (GTK_LABEL (g_editor->control_splitu_label), + _("Split segments uniformly")); + gtk_label_set_text (GTK_LABEL (g_editor->control_delete_label), + _("Delete selection")); + gtk_label_set_text (GTK_LABEL (g_editor->control_recenter_label), + _("Re-center midpoints in selection")); + gtk_label_set_text (GTK_LABEL (g_editor->control_redistribute_label), + _("Re-distribute handles in selection")); + gtk_label_set_text (GTK_LABEL (g_editor->control_flip_label), + _("Flip selection")); + gtk_label_set_text (GTK_LABEL (g_editor->control_replicate_label), + _("Replicate selection")); + } - for (i = 0; i < num_items; i++) - gtk_signal_handler_unblock_by_data(GTK_OBJECT(g_editor->control_blending_items[i]), - (gpointer) i); -} /* cpopup_adjust_blending_menu */ + /* Adjust blending and coloring menus */ + cpopup_adjust_blending_menu (); + cpopup_adjust_coloring_menu (); + /* Can invoke delete? */ + if ((g_editor->control_sel_l->prev == NULL) && + (g_editor->control_sel_r->next == NULL)) + gtk_widget_set_sensitive (g_editor->control_delete_menu_item, FALSE); + else + gtk_widget_set_sensitive (g_editor->control_delete_menu_item, TRUE); -/*****/ + /* Can invoke blend colors / opacity? */ + if (g_editor->control_sel_l == g_editor->control_sel_r) + { + gtk_widget_set_sensitive (g_editor->control_blend_colors_menu_item, FALSE); + gtk_widget_set_sensitive (g_editor->control_blend_opacity_menu_item, FALSE); + } + else + { + gtk_widget_set_sensitive (g_editor->control_blend_colors_menu_item, TRUE); + gtk_widget_set_sensitive (g_editor->control_blend_opacity_menu_item, TRUE); + } +} static void -cpopup_adjust_coloring_menu(void) +cpopup_adjust_blending_menu (void) { - int equal; - long i, num_items; - int coloring; + gint equal; + glong i, num_items; + gint type; - cpopup_check_selection_params(NULL, &equal); + cpopup_check_selection_params (&equal, NULL); - /* Block activate signals */ + /* Block activate signals */ + num_items = (sizeof (g_editor->control_blending_items) / + sizeof (g_editor->control_blending_items[0])); - num_items = sizeof(g_editor->control_coloring_items) / sizeof(g_editor->control_coloring_items[0]); + type = (int) g_editor->control_sel_l->type; - coloring = (int) g_editor->control_sel_l->color; - - for (i = 0; i < num_items; i++) - gtk_signal_handler_block_by_data(GTK_OBJECT(g_editor->control_coloring_items[i]), - (gpointer) i); - - /* Set state */ - - if (equal) { - gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(g_editor->control_coloring_items - [coloring]), - TRUE); - gtk_widget_hide(g_editor->control_coloring_items[num_items - 1]); - } else { - gtk_widget_show(g_editor->control_coloring_items[num_items - 1]); - gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(g_editor->control_coloring_items - [num_items - 1]), - TRUE); - } /* else */ - - /* Unblock signals */ - - for (i = 0; i < num_items; i++) - gtk_signal_handler_unblock_by_data(GTK_OBJECT(g_editor->control_coloring_items[i]), - (gpointer) i); -} /* cpopup_adjust_coloring_menu */ + for (i = 0; i < num_items; i++) + gtk_signal_handler_block_by_data + (GTK_OBJECT (g_editor->control_blending_items[i]), (gpointer) i); + /* Set state */ + if (equal) + { + gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (g_editor->control_blending_items[type]), TRUE); + gtk_widget_hide (g_editor->control_blending_items[num_items - 1]); + } + else + { + gtk_widget_show (g_editor->control_blending_items[num_items - 1]); + gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (g_editor->control_blending_items[num_items - 1]), TRUE); + } -/*****/ + /* Unblock signals */ + for (i = 0; i < num_items; i++) + gtk_signal_handler_unblock_by_data (GTK_OBJECT (g_editor->control_blending_items[i]), (gpointer) i); +} static void -cpopup_check_selection_params(int *equal_blending, int *equal_coloring) +cpopup_adjust_coloring_menu (void) { - grad_type_t type; - grad_color_t color; - int etype, ecolor; - grad_segment_t *seg, *aseg; - - type = g_editor->control_sel_l->type; - color = g_editor->control_sel_l->color; + gint equal; + glong i, num_items; + gint coloring; - etype = 1; - ecolor = 1; + cpopup_check_selection_params (NULL, &equal); - seg = g_editor->control_sel_l; + /* Block activate signals */ + num_items = (sizeof (g_editor->control_coloring_items) / + sizeof (g_editor->control_coloring_items[0])); - do { - etype = etype && (seg->type == type); - ecolor = ecolor && (seg->color == color); + coloring = (int) g_editor->control_sel_l->color; - aseg = seg; - seg = seg->next; - } while (aseg != g_editor->control_sel_r); + for (i = 0; i < num_items; i++) + gtk_signal_handler_block_by_data (GTK_OBJECT (g_editor->control_coloring_items[i]), (gpointer) i); - if (equal_blending) - *equal_blending = etype; + /* Set state */ + if (equal) + { + gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (g_editor->control_coloring_items[coloring]), TRUE); + gtk_widget_hide (g_editor->control_coloring_items[num_items - 1]); + } + else + { + gtk_widget_show (g_editor->control_coloring_items[num_items - 1]); + gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (g_editor->control_coloring_items[num_items - 1]), TRUE); + } - if (equal_coloring) - *equal_coloring = ecolor; -} /* cpopup_check_selection_params */ + /* Unblock signals */ + for (i = 0; i < num_items; i++) + gtk_signal_handler_unblock_by_data (GTK_OBJECT (g_editor->control_coloring_items[i]), (gpointer) i); +} +static void +cpopup_check_selection_params (gint *equal_blending, + gint *equal_coloring) +{ + grad_type_t type; + grad_color_t color; + int etype, ecolor; + grad_segment_t *seg, *aseg; -/*****/ + type = g_editor->control_sel_l->type; + color = g_editor->control_sel_l->color; -static GtkWidget * -cpopup_create_menu_item_with_label(char *str, GtkWidget **label) -{ - GtkWidget *menuitem; - GtkWidget *accel_label; + etype = 1; + ecolor = 1; - menuitem = gtk_menu_item_new(); + seg = g_editor->control_sel_l; - accel_label = gtk_accel_label_new(str); - gtk_misc_set_alignment(GTK_MISC(accel_label), 0.0, 0.5); - gtk_container_add(GTK_CONTAINER(menuitem), accel_label); - gtk_accel_label_set_accel_widget (GTK_ACCEL_LABEL (accel_label), menuitem); - gtk_widget_show(accel_label); + do + { + etype = etype && (seg->type == type); + ecolor = ecolor && (seg->color == color); - if (label) - *label = accel_label; + aseg = seg; + seg = seg->next; + } + while (aseg != g_editor->control_sel_r); - return menuitem; -} /* cpopup_create_menu_item_with_label */ + if (equal_blending) + *equal_blending = etype; + if (equal_coloring) + *equal_coloring = ecolor; +} /*****/ @@ -3590,104 +3694,105 @@ cpopup_render_color_box(GtkPreview *preview, double r, double g, double b, doubl gtk_preview_draw_row(preview, rows[2], 0, y, GRAD_COLOR_BOX_WIDTH); } /* cpopup_render_color_box */ +/***** Creale load & save menus *****/ /*****/ static GtkWidget * -cpopup_create_load_menu(GtkWidget **color_boxes, GtkWidget **labels, - char *label1, char *label2, GtkSignalFunc callback, - gchar accel_key_0, guint8 accel_mods_0, - gchar accel_key_1, guint8 accel_mods_1, - gchar accel_key_2, guint8 accel_mods_2) -{ - GtkWidget *menu; - GtkWidget *menuitem; - GtkAccelGroup *accel_group; - int i; +cpopup_create_load_menu (GtkWidget **color_boxes, + GtkWidget **labels, + gchar *label1, + gchar *label2, + GtkSignalFunc callback, + gchar accel_key_0, guint8 accel_mods_0, + gchar accel_key_1, guint8 accel_mods_1, + gchar accel_key_2, guint8 accel_mods_2) +{ + GtkWidget *menu; + GtkWidget *menuitem; + GtkAccelGroup *accel_group; + gint i; + + menu = gtk_menu_new (); + accel_group = g_editor->accel_group; - menu = gtk_menu_new(); - accel_group = g_editor->accel_group; + gtk_menu_set_accel_group (GTK_MENU (menu), accel_group); - gtk_menu_set_accel_group (GTK_MENU (menu), accel_group); + /* Create items */ + for (i = 0; i < (GRAD_NUM_COLORS + 3); i++) + { + if (i == 3) + { + /* Insert separator between "to fetch" and "saved" colors */ + menuitem = gtk_menu_item_new (); + gtk_menu_append (GTK_MENU (menu), menuitem); + gtk_widget_show (menuitem); + } - /* Create items */ + menuitem = cpopup_create_color_item (&color_boxes[i], &labels[i]); + gtk_signal_connect (GTK_OBJECT (menuitem), "activate", + callback, (gpointer) ((long) i)); + gtk_menu_append (GTK_MENU (menu), menuitem); + gtk_widget_show (menuitem); - for (i = 0; i < (GRAD_NUM_COLORS + 3); i++) { - if (i == 3) { - /* Insert separator between "to fetch" and "saved" colors */ - - menuitem = gtk_menu_item_new(); - gtk_menu_append(GTK_MENU(menu), menuitem); - gtk_widget_show(menuitem); - } /* if */ - - menuitem = cpopup_create_color_item(&color_boxes[i], &labels[i]); - gtk_signal_connect(GTK_OBJECT(menuitem), "activate", - callback, (gpointer) ((long) i)); /* FIXME: I don't like this cast */ - gtk_menu_append(GTK_MENU(menu), menuitem); - gtk_widget_show(menuitem); - - switch (i) { - case 0: - gtk_widget_add_accelerator(menuitem, - "activate", - accel_group, - accel_key_0, accel_mods_0, - GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED); - break; + switch (i) + { + case 0: + gtk_widget_add_accelerator (menuitem, "activate", + accel_group, + accel_key_0, accel_mods_0, + GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED); + break; - case 1: - gtk_widget_add_accelerator(menuitem, - "activate", - accel_group, - accel_key_1, accel_mods_1, - GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED); - break; + case 1: + gtk_widget_add_accelerator (menuitem, "activate", + accel_group, + accel_key_1, accel_mods_1, + GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED); + break; - case 2: - gtk_widget_add_accelerator(menuitem, - "activate", - accel_group, - accel_key_2, accel_mods_2, - GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED); - break; + case 2: + gtk_widget_add_accelerator (menuitem, "activate", + accel_group, + accel_key_2, accel_mods_2, + GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED); + break; - default: - break; - } /* switch */ - } /* for */ - - /* Set labels */ - - gtk_label_set(GTK_LABEL(labels[0]), label1); - gtk_label_set(GTK_LABEL(labels[1]), label2); - gtk_label_set(GTK_LABEL(labels[2]), _("FG color")); - - return menu; -} /* cpopup_create_load_menu */ + default: + break; + } + } + /* Set labels */ + gtk_label_set_text (GTK_LABEL (labels[0]), label1); + gtk_label_set_text (GTK_LABEL (labels[1]), label2); + gtk_label_set_text (GTK_LABEL (labels[2]), _("FG color")); -/*****/ + return menu; +} static GtkWidget * -cpopup_create_save_menu(GtkWidget **color_boxes, GtkWidget **labels, GtkSignalFunc callback) +cpopup_create_save_menu (GtkWidget **color_boxes, + GtkWidget **labels, + GtkSignalFunc callback) { - GtkWidget *menu; - GtkWidget *menuitem; - int i; + GtkWidget *menu; + GtkWidget *menuitem; + gint i; - menu = gtk_menu_new(); + menu = gtk_menu_new (); - for (i = 0; i < GRAD_NUM_COLORS; i++) { - menuitem = cpopup_create_color_item(&color_boxes[i], &labels[i]); - gtk_signal_connect(GTK_OBJECT(menuitem), "activate", - callback, (gpointer) ((long) i)); /* FIXME: I don't like this cast */ - gtk_menu_append(GTK_MENU(menu), menuitem); - gtk_widget_show(menuitem); - } /* for */ + for (i = 0; i < GRAD_NUM_COLORS; i++) + { + menuitem = cpopup_create_color_item (&color_boxes[i], &labels[i]); + gtk_signal_connect (GTK_OBJECT (menuitem), "activate", + callback, (gpointer) ((long) i)); + gtk_menu_append (GTK_MENU (menu), menuitem); + gtk_widget_show (menuitem); + } - return menu; -} /* cpopup_create_save_menu */ + return menu; +} /*****/ @@ -3708,10 +3813,10 @@ cpopup_update_saved_color(int n, double r, double g, double b, double a) g_snprintf(str, sizeof(str), _("RGBA (%0.3f, %0.3f, %0.3f, %0.3f)"), r, g, b, a); - gtk_label_set(GTK_LABEL(g_editor->left_load_labels[n + 3]), str); - gtk_label_set(GTK_LABEL(g_editor->left_save_labels[n]), str); - gtk_label_set(GTK_LABEL(g_editor->right_load_labels[n + 3]), str); - gtk_label_set(GTK_LABEL(g_editor->right_save_labels[n]), str); + gtk_label_set_text (GTK_LABEL (g_editor->left_load_labels[n + 3]), str); + gtk_label_set_text (GTK_LABEL (g_editor->left_save_labels[n]), str); + gtk_label_set_text (GTK_LABEL (g_editor->right_load_labels[n + 3]), str); + gtk_label_set_text (GTK_LABEL (g_editor->right_save_labels[n]), str); g_editor->saved_colors[n].r = r; g_editor->saved_colors[n].g = g; @@ -3880,1462 +3985,1435 @@ cpopup_save_right_callback(GtkWidget *widget, gpointer data) /*****/ -static GtkWidget * -cpopup_create_blending_menu(void) +static void +cpopup_set_color_selection_color(GtkColorSelection *cs, + double r, double g, double b, double a) { - GtkWidget *menu; - GtkWidget *menuitem; - GSList *group; - int i; - int num_items; - - menu = gtk_menu_new(); - group = NULL; - - num_items = sizeof(g_editor->control_blending_items) / sizeof(g_editor->control_blending_items[0]); - - for (i = 0; i < num_items; i++) { - if (i == (num_items - 1)) - menuitem = gtk_radio_menu_item_new_with_label(group, _("(Varies)")); - else - menuitem = gtk_radio_menu_item_new_with_label(group, gettext(blending_types[i])); - - group = gtk_radio_menu_item_group(GTK_RADIO_MENU_ITEM(menuitem)); - - gtk_signal_connect(GTK_OBJECT(menuitem), "activate", - (GtkSignalFunc) cpopup_blending_callback, - (gpointer) ((long) i)); /* FIXME: I don't like this cast */ - - gtk_menu_append(GTK_MENU(menu), menuitem); - gtk_widget_show(menuitem); - - g_editor->control_blending_items[i] = menuitem; - } /* for */ - - /* "Varies" is always disabled */ + gdouble color[4]; - gtk_widget_set_sensitive(g_editor->control_blending_items[num_items - 1], FALSE); + color[0] = r; + color[1] = g; + color[2] = b; + color[3] = a; - return menu; -} /* cpopup_create_blending_menu */ + gtk_color_selection_set_color(cs, color); +} /* cpopup_set_color_selection_color */ /*****/ static void -cpopup_blending_callback(GtkWidget *widget, gpointer data) +cpopup_get_color_selection_color(GtkColorSelection *cs, + double *r, double *g, double *b, double *a) { - grad_type_t type; - grad_segment_t *seg, *aseg; - - if (!GTK_CHECK_MENU_ITEM(widget)->active) - return; /* Do nothing if the menu item is being deactivated */ - - type = (grad_type_t) data; - seg = g_editor->control_sel_l; - - do { - seg->type = type; + gdouble color[4]; - aseg = seg; - seg = seg->next; - } while (aseg != g_editor->control_sel_r); + gtk_color_selection_get_color(cs, color); - curr_gradient->dirty = 1; - ed_update_editor(GRAD_UPDATE_PREVIEW); -} /* cpopup_blending_callback */ + *r = color[0]; + *g = color[1]; + *b = color[2]; + *a = color[3]; +} /* cpopup_get_color_selection_color */ /*****/ -static GtkWidget * -cpopup_create_coloring_menu(void) +static grad_segment_t * +cpopup_save_selection(void) { - GtkWidget *menu; - GtkWidget *menuitem; - GSList *group; - int i; - int num_items; + grad_segment_t *seg, *prev, *tmp; + grad_segment_t *oseg, *oaseg; + + prev = NULL; + oseg = g_editor->control_sel_l; + tmp = NULL; - menu = gtk_menu_new(); - group = NULL; + do { + seg = seg_new_segment(); - num_items = sizeof(g_editor->control_coloring_items) / sizeof(g_editor->control_coloring_items[0]); + *seg = *oseg; /* Copy everything */ - for (i = 0; i < num_items; i++) { - if (i == (num_items - 1)) - menuitem = gtk_radio_menu_item_new_with_label(group, _("(Varies)")); + if (prev == NULL) + tmp = seg; /* Remember first segment */ else - menuitem = gtk_radio_menu_item_new_with_label(group, gettext(coloring_types[i])); - - group = gtk_radio_menu_item_group(GTK_RADIO_MENU_ITEM(menuitem)); + prev->next = seg; - gtk_signal_connect(GTK_OBJECT(menuitem), "activate", - (GtkSignalFunc) cpopup_coloring_callback, - (gpointer) ((long) i)); /* FIXME: I don't like this cast */ + seg->prev = prev; + seg->next = NULL; - gtk_menu_append(GTK_MENU(menu), menuitem); - gtk_widget_show(menuitem); + prev = seg; + oaseg = oseg; + oseg = oseg->next; + } while (oaseg != g_editor->control_sel_r); - g_editor->control_coloring_items[i] = menuitem; - } /* for */ + return tmp; +} /* cpopup_save_selection */ - /* "Varies" is always disabled */ - gtk_widget_set_sensitive(g_editor->control_coloring_items[num_items - 1], FALSE); +/*****/ - return menu; -} /* cpopup_create_coloring_menu */ +static void +cpopup_free_selection(grad_segment_t *seg) +{ + seg_free_segments(seg); +} /* cpopup_free_selection */ /*****/ static void -cpopup_coloring_callback(GtkWidget *widget, gpointer data) +cpopup_replace_selection(grad_segment_t *replace_seg) { - grad_color_t color; - grad_segment_t *seg, *aseg; + grad_segment_t *lseg, *rseg; + grad_segment_t *replace_last; - if (!GTK_CHECK_MENU_ITEM(widget)->active) - return; /* Do nothing if the menu item is being deactivated */ + /* Remember left and right segments */ - color = (grad_color_t) data; - seg = g_editor->control_sel_l; + lseg = g_editor->control_sel_l->prev; + rseg = g_editor->control_sel_r->next; - do { - seg->color = color; + replace_last = seg_get_last_segment(replace_seg); - aseg = seg; - seg = seg->next; - } while (aseg != g_editor->control_sel_r); + /* Free old selection */ - curr_gradient->dirty = 1; - ed_update_editor(GRAD_UPDATE_PREVIEW); -} /* cpopup_coloring_callback */ + g_editor->control_sel_r->next = NULL; + seg_free_segments(g_editor->control_sel_l); -/*****/ + /* Link in new segments */ -static GtkWidget * -cpopup_create_sel_ops_menu(void) -{ - GtkWidget *menu; - GtkWidget *menuitem; - GtkAccelGroup *accel_group; - - menu = gtk_menu_new(); - accel_group = g_editor->accel_group; - - gtk_menu_set_accel_group (GTK_MENU (menu), accel_group); - - /* Flip */ - - menuitem = cpopup_create_menu_item_with_label("", &g_editor->control_flip_label); - gtk_signal_connect(GTK_OBJECT(menuitem), "activate", - (GtkSignalFunc) cpopup_flip_callback, - NULL); - gtk_menu_append(GTK_MENU(menu), menuitem); - gtk_widget_show(menuitem); - gtk_widget_add_accelerator(menuitem, - "activate", - accel_group, - 'F', 0, - GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED); - - /* Replicate */ - - menuitem = cpopup_create_menu_item_with_label("", &g_editor->control_replicate_label); - gtk_signal_connect(GTK_OBJECT(menuitem), "activate", - (GtkSignalFunc) cpopup_replicate_callback, - NULL); - gtk_menu_append(GTK_MENU(menu), menuitem); - gtk_widget_show(menuitem); - gtk_widget_add_accelerator(menuitem, - "activate", - accel_group, - 'M', 0, - GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED); - - /* Blend colors / opacity */ - - menuitem = gtk_menu_item_new(); - gtk_menu_append(GTK_MENU(menu), menuitem); - gtk_widget_show(menuitem); - - menuitem = gtk_menu_item_new_with_label(_("Blend endpoints' colors")); - gtk_signal_connect(GTK_OBJECT(menuitem), "activate", - (GtkSignalFunc) cpopup_blend_colors, - NULL); - gtk_menu_append(GTK_MENU(menu), menuitem); - gtk_widget_show(menuitem); - g_editor->control_blend_colors_menu_item = menuitem; - gtk_widget_add_accelerator(menuitem, - "activate", - accel_group, - 'B', 0, - GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED); - - menuitem = gtk_menu_item_new_with_label(_("Blend endpoints' opacity")); - gtk_signal_connect(GTK_OBJECT(menuitem), "activate", - (GtkSignalFunc) cpopup_blend_opacity, - NULL); - gtk_menu_append(GTK_MENU(menu), menuitem); - gtk_widget_show(menuitem); - gtk_widget_add_accelerator(menuitem, - "activate", - accel_group, - 'B', GDK_CONTROL_MASK, - GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED); - g_editor->control_blend_opacity_menu_item = menuitem; - - return menu; -} /* cpopup_create_sel_ops_menu */ + if (lseg) + lseg->next = replace_seg; + else + curr_gradient->segments = replace_seg; + replace_seg->prev = lseg; -/*****/ + if (rseg) + rseg->prev = replace_last; -static void -cpopup_blend_colors(GtkWidget *widget, gpointer data) -{ - cpopup_blend_endpoints(g_editor->control_sel_l->r0, - g_editor->control_sel_l->g0, - g_editor->control_sel_l->b0, - g_editor->control_sel_l->a0, - g_editor->control_sel_r->r1, - g_editor->control_sel_r->g1, - g_editor->control_sel_r->b1, - g_editor->control_sel_r->a1, - TRUE, FALSE); + replace_last->next = rseg; - curr_gradient->dirty = 1; - ed_update_editor(GRAD_UPDATE_PREVIEW); -} /* cpopup_blend_colors */ + g_editor->control_sel_l = replace_seg; + g_editor->control_sel_r = replace_last; + + curr_gradient->last_visited = NULL; /* Force re-search */ +} /* cpopup_replace_selection */ +/***** Color dialogs for left and right endpoint *****/ /*****/ static void -cpopup_blend_opacity(GtkWidget *widget, gpointer data) -{ - cpopup_blend_endpoints(g_editor->control_sel_l->r0, - g_editor->control_sel_l->g0, - g_editor->control_sel_l->b0, - g_editor->control_sel_l->a0, - g_editor->control_sel_r->r1, - g_editor->control_sel_r->g1, - g_editor->control_sel_r->b1, - g_editor->control_sel_r->a1, - FALSE, TRUE); +cpopup_create_color_dialog (gchar *title, + double r, double g, double b, double a, + GtkSignalFunc color_changed_callback, + GtkSignalFunc ok_callback, + GtkSignalFunc cancel_callback, + GtkSignalFunc delete_callback) +{ + GtkWidget *window; + GtkColorSelection *cs; + GtkColorSelectionDialog *csd; + + window = gtk_color_selection_dialog_new (title); + + csd = GTK_COLOR_SELECTION_DIALOG (window); + cs = GTK_COLOR_SELECTION (csd->colorsel); + + gtk_color_selection_set_opacity (cs, TRUE); + gtk_color_selection_set_update_policy (cs, + g_editor->instant_update ? + GTK_UPDATE_CONTINUOUS : + GTK_UPDATE_DELAYED); + + /* FIXME: this is a hack; we set the color twice so that the + * color selector remembers it as its "old" color, too + */ + cpopup_set_color_selection_color (cs, r, g, b, a); + cpopup_set_color_selection_color (cs, r, g, b, a); - curr_gradient->dirty = 1; - ed_update_editor(GRAD_UPDATE_PREVIEW); -} /* cpopup_blend_opacity */ + gtk_signal_connect (GTK_OBJECT (csd), "delete_event", + delete_callback, window); + gtk_signal_connect (GTK_OBJECT (cs), "color_changed", + color_changed_callback, window); -/*****/ + gtk_signal_connect (GTK_OBJECT (csd->ok_button), "clicked", + ok_callback, window); -static void -cpopup_set_color_selection_color(GtkColorSelection *cs, - double r, double g, double b, double a) -{ - gdouble color[4]; - - color[0] = r; - color[1] = g; - color[2] = b; - color[3] = a; - - gtk_color_selection_set_color(cs, color); -} /* cpopup_set_color_selection_color */ + gtk_signal_connect (GTK_OBJECT (csd->cancel_button), "clicked", + cancel_callback, window); + gtk_window_position (GTK_WINDOW (window), GTK_WIN_POS_MOUSE); + gtk_widget_show (window); +} /*****/ static void -cpopup_get_color_selection_color(GtkColorSelection *cs, - double *r, double *g, double *b, double *a) -{ - gdouble color[4]; - - gtk_color_selection_get_color(cs, color); +cpopup_set_left_color_callback (GtkWidget *widget, + gpointer data) +{ + g_editor->left_saved_dirty = curr_gradient->dirty; + g_editor->left_saved_segments = cpopup_save_selection (); + + cpopup_create_color_dialog (_("Left endpoint's color"), + g_editor->control_sel_l->r0, + g_editor->control_sel_l->g0, + g_editor->control_sel_l->b0, + g_editor->control_sel_l->a0, + (GtkSignalFunc) cpopup_left_color_changed, + (GtkSignalFunc) cpopup_left_color_dialog_ok, + (GtkSignalFunc) cpopup_left_color_dialog_cancel, + (GtkSignalFunc) cpopup_left_color_dialog_delete); - *r = color[0]; - *g = color[1]; - *b = color[2]; - *a = color[3]; -} /* cpopup_get_color_selection_color */ - - -/*****/ + gtk_widget_set_sensitive (g_editor->shell, FALSE); +} static void -cpopup_create_color_dialog(char *title, double r, double g, double b, double a, - GtkSignalFunc color_changed_callback, - GtkSignalFunc ok_callback, - GtkSignalFunc cancel_callback, - GtkSignalFunc delete_callback) +cpopup_left_color_changed (GtkWidget *widget, + gpointer data) { - GtkWidget *window; - GtkColorSelection *cs; - GtkColorSelectionDialog *csd; - - window = gtk_color_selection_dialog_new(title); - - csd = GTK_COLOR_SELECTION_DIALOG(window); - cs = GTK_COLOR_SELECTION(csd->colorsel); - - gtk_color_selection_set_opacity(cs, TRUE); - gtk_color_selection_set_update_policy(cs, - g_editor->instant_update ? - GTK_UPDATE_CONTINUOUS : - GTK_UPDATE_DELAYED); - - - /* FIXME: this is a hack; we set the color twice so that the - * color selector remembers it as its "old" color, too - */ + GtkColorSelection *cs; + double r, g, b, a; - cpopup_set_color_selection_color(cs, r, g, b, a); - cpopup_set_color_selection_color(cs, r, g, b, a); + cs = GTK_COLOR_SELECTION (GTK_COLOR_SELECTION_DIALOG (data)->colorsel); - gtk_signal_connect(GTK_OBJECT(csd), "delete_event", - delete_callback, NULL); + cpopup_get_color_selection_color (cs, &r, &g, &b, &a); - gtk_signal_connect(GTK_OBJECT(cs), "color_changed", - color_changed_callback, window); + cpopup_blend_endpoints (r, g, b, a, + g_editor->control_sel_r->r1, + g_editor->control_sel_r->g1, + g_editor->control_sel_r->b1, + g_editor->control_sel_r->a1, + TRUE, TRUE); - gtk_signal_connect(GTK_OBJECT(csd->ok_button), "clicked", - ok_callback, window); - - gtk_signal_connect(GTK_OBJECT(csd->cancel_button), "clicked", - cancel_callback, window); - - gtk_window_position(GTK_WINDOW(window), GTK_WIN_POS_MOUSE); - gtk_widget_show(window); -} /* cpopup_create_color_dialog */ - - -/*****/ + ed_update_editor (GRAD_UPDATE_PREVIEW); +} -static grad_segment_t * -cpopup_save_selection(void) +static void +cpopup_left_color_dialog_ok (GtkWidget *widget, + gpointer data) { - grad_segment_t *seg, *prev, *tmp; - grad_segment_t *oseg, *oaseg; + cpopup_left_color_changed (widget, data); - prev = NULL; - oseg = g_editor->control_sel_l; - tmp = NULL; - - do { - seg = seg_new_segment(); + curr_gradient->dirty = 1; + cpopup_free_selection(g_editor->left_saved_segments); - *seg = *oseg; /* Copy everything */ - - if (prev == NULL) - tmp = seg; /* Remember first segment */ - else - prev->next = seg; + gtk_widget_destroy (GTK_WIDGET (data)); + gtk_widget_set_sensitive (g_editor->shell, TRUE); +} - seg->prev = prev; - seg->next = NULL; +static void +cpopup_left_color_dialog_cancel (GtkWidget *widget, + gpointer data) +{ + curr_gradient->dirty = g_editor->left_saved_dirty; + cpopup_replace_selection (g_editor->left_saved_segments); + ed_update_editor (GRAD_UPDATE_PREVIEW); - prev = seg; - oaseg = oseg; - oseg = oseg->next; - } while (oaseg != g_editor->control_sel_r); + gtk_widget_destroy (GTK_WIDGET (data)); + gtk_widget_set_sensitive (g_editor->shell, TRUE); +} - return tmp; -} /* cpopup_save_selection */ +static int +cpopup_left_color_dialog_delete (GtkWidget *widget, + GdkEvent *event, + gpointer data) +{ + cpopup_left_color_dialog_cancel (widget, data); + return TRUE; +} /*****/ static void -cpopup_free_selection(grad_segment_t *seg) -{ - seg_free_segments(seg); -} /* cpopup_free_selection */ - +cpopup_set_right_color_callback (GtkWidget *widget, + gpointer data) +{ + g_editor->right_saved_dirty = curr_gradient->dirty; + g_editor->right_saved_segments = cpopup_save_selection (); + + cpopup_create_color_dialog (_("Right endpoint's color"), + g_editor->control_sel_r->r1, + g_editor->control_sel_r->g1, + g_editor->control_sel_r->b1, + g_editor->control_sel_r->a1, + (GtkSignalFunc) cpopup_right_color_changed, + (GtkSignalFunc) cpopup_right_color_dialog_ok, + (GtkSignalFunc) cpopup_right_color_dialog_cancel, + (GtkSignalFunc) cpopup_right_color_dialog_delete); -/*****/ + gtk_widget_set_sensitive (g_editor->shell, FALSE); +} static void -cpopup_replace_selection(grad_segment_t *replace_seg) +cpopup_right_color_changed (GtkWidget *widget, + gpointer data) { - grad_segment_t *lseg, *rseg; - grad_segment_t *replace_last; - - /* Remember left and right segments */ + GtkColorSelection *cs; + double r, g, b, a; - lseg = g_editor->control_sel_l->prev; - rseg = g_editor->control_sel_r->next; + cs = GTK_COLOR_SELECTION (GTK_COLOR_SELECTION_DIALOG (data)->colorsel); - replace_last = seg_get_last_segment(replace_seg); + cpopup_get_color_selection_color (cs, &r, &g, &b, &a); - /* Free old selection */ + cpopup_blend_endpoints (g_editor->control_sel_l->r0, + g_editor->control_sel_l->g0, + g_editor->control_sel_l->b0, + g_editor->control_sel_l->a0, + r, g, b, a, + TRUE, TRUE); - g_editor->control_sel_r->next = NULL; - - seg_free_segments(g_editor->control_sel_l); + ed_update_editor (GRAD_UPDATE_PREVIEW); +} - /* Link in new segments */ +static void +cpopup_right_color_dialog_ok (GtkWidget *widget, + gpointer data) +{ + cpopup_right_color_changed (widget, data); - if (lseg) - lseg->next = replace_seg; - else - curr_gradient->segments = replace_seg; + curr_gradient->dirty = 1; + cpopup_free_selection (g_editor->right_saved_segments); - replace_seg->prev = lseg; + gtk_widget_destroy (GTK_WIDGET (data)); + gtk_widget_set_sensitive (g_editor->shell, TRUE); +} - if (rseg) - rseg->prev = replace_last; +static void +cpopup_right_color_dialog_cancel (GtkWidget *widget, + gpointer data) +{ + curr_gradient->dirty = g_editor->right_saved_dirty; + cpopup_replace_selection (g_editor->right_saved_segments); + ed_update_editor (GRAD_UPDATE_PREVIEW); - replace_last->next = rseg; + gtk_widget_destroy (GTK_WIDGET (data)); + gtk_widget_set_sensitive (g_editor->shell, TRUE); +} - g_editor->control_sel_l = replace_seg; - g_editor->control_sel_r = replace_last; +static int +cpopup_right_color_dialog_delete (GtkWidget *widget, + GdkEvent *event, + gpointer data) +{ + cpopup_right_color_dialog_cancel (widget, data); - curr_gradient->last_visited = NULL; /* Force re-search */ -} /* cpopup_replace_selection */ + return TRUE; +} +/***** Blending menu *****/ /*****/ -static void -cpopup_set_left_color_callback(GtkWidget *widget, gpointer data) +static GtkWidget * +cpopup_create_blending_menu (void) { - g_editor->left_saved_dirty = curr_gradient->dirty; - g_editor->left_saved_segments = cpopup_save_selection(); - - cpopup_create_color_dialog(_("Left endpoint's color"), - g_editor->control_sel_l->r0, - g_editor->control_sel_l->g0, - g_editor->control_sel_l->b0, - g_editor->control_sel_l->a0, - (GtkSignalFunc) cpopup_left_color_changed, - (GtkSignalFunc) cpopup_left_color_dialog_ok, - (GtkSignalFunc) cpopup_left_color_dialog_cancel, - (GtkSignalFunc) cpopup_left_color_dialog_delete); - - gtk_widget_set_sensitive(g_editor->shell, FALSE); -} /* cpopup_set_left_color_callback */ + GtkWidget *menu; + GtkWidget *menuitem; + GSList *group; + gint i; + gint num_items; + menu = gtk_menu_new (); + group = NULL; -/*****/ + num_items = (sizeof (g_editor->control_blending_items) / + sizeof (g_editor->control_blending_items[0])); -static void -cpopup_left_color_changed(GtkWidget *widget, gpointer client_data) -{ - GtkColorSelection *cs; - double r, g, b, a; + for (i = 0; i < num_items; i++) + { + if (i == (num_items - 1)) + menuitem = gtk_radio_menu_item_new_with_label(group, _("(Varies)")); + else + menuitem = + gtk_radio_menu_item_new_with_label (group, + gettext (blending_types[i])); - cs = GTK_COLOR_SELECTION(GTK_COLOR_SELECTION_DIALOG(client_data)->colorsel); + group = gtk_radio_menu_item_group (GTK_RADIO_MENU_ITEM (menuitem)); - cpopup_get_color_selection_color(cs, &r, &g, &b, &a); + gtk_signal_connect (GTK_OBJECT (menuitem), "activate", + (GtkSignalFunc) cpopup_blending_callback, + (gpointer) ((long) i)); - cpopup_blend_endpoints(r, g, b, a, - g_editor->control_sel_r->r1, - g_editor->control_sel_r->g1, - g_editor->control_sel_r->b1, - g_editor->control_sel_r->a1, - TRUE, TRUE); + gtk_menu_append (GTK_MENU (menu), menuitem); + gtk_widget_show (menuitem); - ed_update_editor(GRAD_UPDATE_PREVIEW); -} /* cpopup_left_color_changed */ + g_editor->control_blending_items[i] = menuitem; + } + /* "Varies" is always disabled */ + gtk_widget_set_sensitive (g_editor->control_blending_items[num_items - 1], FALSE); -/*****/ + return menu; +} static void -cpopup_left_color_dialog_ok(GtkWidget *widget, gpointer client_data) +cpopup_blending_callback (GtkWidget *widget, + gpointer data) { - GtkColorSelection *cs; - double r, g, b, a; + grad_type_t type; + grad_segment_t *seg, *aseg; - cs = GTK_COLOR_SELECTION(GTK_COLOR_SELECTION_DIALOG(client_data)->colorsel); + if (!GTK_CHECK_MENU_ITEM (widget)->active) + return; /* Do nothing if the menu item is being deactivated */ - cpopup_get_color_selection_color(cs, &r, &g, &b, &a); + type = (grad_type_t) data; + seg = g_editor->control_sel_l; - cpopup_blend_endpoints(r, g, b, a, - g_editor->control_sel_r->r1, - g_editor->control_sel_r->g1, - g_editor->control_sel_r->b1, - g_editor->control_sel_r->a1, - TRUE, TRUE); + do + { + seg->type = type; - curr_gradient->dirty = 1; - cpopup_free_selection(g_editor->left_saved_segments); - ed_update_editor(GRAD_UPDATE_PREVIEW); + aseg = seg; + seg = seg->next; + } + while (aseg != g_editor->control_sel_r); - gtk_widget_destroy(GTK_WIDGET(client_data)); - gtk_widget_set_sensitive(g_editor->shell, TRUE); -} /* cpopup_left_color_dialog_ok */ + curr_gradient->dirty = 1; + ed_update_editor (GRAD_UPDATE_PREVIEW); +} +/***** Coloring menu *****/ /*****/ -static void -cpopup_left_color_dialog_cancel(GtkWidget *widget, gpointer client_data) +static GtkWidget * +cpopup_create_coloring_menu (void) { - curr_gradient->dirty = g_editor->left_saved_dirty; - cpopup_replace_selection(g_editor->left_saved_segments); - ed_update_editor(GRAD_UPDATE_PREVIEW); - - gtk_widget_destroy(GTK_WIDGET(client_data)); - gtk_widget_set_sensitive(g_editor->shell, TRUE); -} /* cpopup_left_color_dialog_cancel */ + GtkWidget *menu; + GtkWidget *menuitem; + GSList *group; + gint i; + gint num_items; + menu = gtk_menu_new (); + group = NULL; -/*****/ + num_items = (sizeof (g_editor->control_coloring_items) / + sizeof (g_editor->control_coloring_items[0])); -static int -cpopup_left_color_dialog_delete(GtkWidget *widget, GdkEvent *event, - gpointer data) -{ - curr_gradient->dirty = g_editor->left_saved_dirty; - cpopup_replace_selection(g_editor->left_saved_segments); - ed_update_editor(GRAD_UPDATE_PREVIEW); - - gtk_widget_set_sensitive(g_editor->shell, TRUE); - return FALSE; -} /* cpopup_left_color_dialog_delete */ + for (i = 0; i < num_items; i++) + { + if (i == (num_items - 1)) + menuitem = gtk_radio_menu_item_new_with_label(group, _("(Varies)")); + else + menuitem = gtk_radio_menu_item_new_with_label (group, gettext (coloring_types[i])); -/*****/ + group = gtk_radio_menu_item_group (GTK_RADIO_MENU_ITEM (menuitem)); -static void -cpopup_set_right_color_callback(GtkWidget *widget, gpointer data) -{ - g_editor->right_saved_dirty = curr_gradient->dirty; - g_editor->right_saved_segments = cpopup_save_selection(); + gtk_signal_connect (GTK_OBJECT (menuitem), "activate", + (GtkSignalFunc) cpopup_coloring_callback, + (gpointer) ((long) i)); - cpopup_create_color_dialog(_("Right endpoint's color"), - g_editor->control_sel_r->r1, - g_editor->control_sel_r->g1, - g_editor->control_sel_r->b1, - g_editor->control_sel_r->a1, - (GtkSignalFunc) cpopup_right_color_changed, - (GtkSignalFunc) cpopup_right_color_dialog_ok, - (GtkSignalFunc) cpopup_right_color_dialog_cancel, - (GtkSignalFunc) cpopup_right_color_dialog_delete); + gtk_menu_append (GTK_MENU (menu), menuitem); + gtk_widget_show (menuitem); - gtk_widget_set_sensitive(g_editor->shell, FALSE); -} /* cpopup_set_right_color_callback */ + g_editor->control_coloring_items[i] = menuitem; + } + /* "Varies" is always disabled */ + gtk_widget_set_sensitive (g_editor->control_coloring_items[num_items - 1], FALSE); -/*****/ + return menu; +} static void -cpopup_right_color_changed(GtkWidget *widget, gpointer client_data) +cpopup_coloring_callback (GtkWidget *widget, + gpointer data) { - GtkColorSelection *cs; - double r, g, b, a; + grad_color_t color; + grad_segment_t *seg, *aseg; - cs = GTK_COLOR_SELECTION(GTK_COLOR_SELECTION_DIALOG(client_data)->colorsel); + if (! GTK_CHECK_MENU_ITEM (widget)->active) + return; /* Do nothing if the menu item is being deactivated */ - cpopup_get_color_selection_color(cs, &r, &g, &b, &a); + color = (grad_color_t) data; + seg = g_editor->control_sel_l; - cpopup_blend_endpoints(g_editor->control_sel_l->r0, - g_editor->control_sel_l->g0, - g_editor->control_sel_l->b0, - g_editor->control_sel_l->a0, - r, g, b, a, - TRUE, TRUE); + do + { + seg->color = color; - ed_update_editor(GRAD_UPDATE_PREVIEW); -} /* cpopup_right_color_changed */ + aseg = seg; + seg = seg->next; + } + while (aseg != g_editor->control_sel_r); + curr_gradient->dirty = 1; + ed_update_editor (GRAD_UPDATE_PREVIEW); +} /*****/ static void -cpopup_right_color_dialog_ok(GtkWidget *widget, gpointer client_data) +cpopup_split_midpoint_callback (GtkWidget *widget, + gpointer data) { - GtkColorSelection *cs; - double r, g, b, a; + grad_segment_t *seg, *lseg, *rseg; - cs = GTK_COLOR_SELECTION(GTK_COLOR_SELECTION_DIALOG(client_data)->colorsel); + seg = g_editor->control_sel_l; - cpopup_get_color_selection_color(cs, &r, &g, &b, &a); + do + { + cpopup_split_midpoint (seg, &lseg, &rseg); + seg = rseg->next; + } + while (lseg != g_editor->control_sel_r); - cpopup_blend_endpoints(g_editor->control_sel_l->r0, - g_editor->control_sel_l->g0, - g_editor->control_sel_l->b0, - g_editor->control_sel_l->a0, - r, g, b, a, - TRUE, TRUE); + g_editor->control_sel_r = rseg; - curr_gradient->dirty = 1; - cpopup_free_selection(g_editor->right_saved_segments); - ed_update_editor(GRAD_UPDATE_PREVIEW); + curr_gradient->last_visited = NULL; /* Force re-search */ + curr_gradient->dirty = 1; + ed_update_editor (GRAD_UPDATE_PREVIEW | GRAD_UPDATE_CONTROL); +} - gtk_widget_destroy(GTK_WIDGET(client_data)); - gtk_widget_set_sensitive(g_editor->shell, TRUE); -} /* cpopup_right_color_dialog_ok */ +static void +cpopup_split_midpoint (grad_segment_t *lseg, + grad_segment_t **newl, + grad_segment_t **newr) +{ + double r, g, b, a; + grad_segment_t *newseg; + /* Get color at original segment's midpoint */ + grad_get_color_at(lseg->middle, &r, &g, &b, &a); -/*****/ + /* Create a new segment and insert it in the list */ -static void -cpopup_right_color_dialog_cancel(GtkWidget *widget, gpointer client_data) -{ - curr_gradient->dirty = g_editor->right_saved_dirty; - cpopup_replace_selection(g_editor->right_saved_segments); - ed_update_editor(GRAD_UPDATE_PREVIEW); + newseg = seg_new_segment(); - gtk_widget_destroy(GTK_WIDGET(client_data)); - gtk_widget_set_sensitive(g_editor->shell, TRUE); -} /* cpopup_right_color_dialog_cancel */ + newseg->prev = lseg; + newseg->next = lseg->next; + lseg->next = newseg; -/*****/ + if (newseg->next) + newseg->next->prev = newseg; -static int -cpopup_right_color_dialog_delete(GtkWidget *widget, GdkEvent *event, - gpointer data) -{ - curr_gradient->dirty = g_editor->right_saved_dirty; - cpopup_replace_selection(g_editor->right_saved_segments); - ed_update_editor(GRAD_UPDATE_PREVIEW); + /* Set coordinates of new segment */ - gtk_widget_set_sensitive(g_editor->shell, TRUE); - return FALSE; -} /* cpopup_right_color_dialog_delete */ + newseg->left = lseg->middle; + newseg->right = lseg->right; + newseg->middle = (newseg->left + newseg->right) / 2.0; + /* Set coordinates of original segment */ -/*****/ + lseg->right = newseg->left; + lseg->middle = (lseg->left + lseg->right) / 2.0; -static void -cpopup_split_midpoint_callback(GtkWidget *widget, gpointer data) -{ - grad_segment_t *seg, *lseg, *rseg; + /* Set colors of both segments */ - seg = g_editor->control_sel_l; + newseg->r1 = lseg->r1; + newseg->g1 = lseg->g1; + newseg->b1 = lseg->b1; + newseg->a1 = lseg->a1; - do { - cpopup_split_midpoint(seg, &lseg, &rseg); - seg = rseg->next; - } while (lseg != g_editor->control_sel_r); + lseg->r1 = newseg->r0 = r; + lseg->g1 = newseg->g0 = g; + lseg->b1 = newseg->b0 = b; + lseg->a1 = newseg->a0 = a; - g_editor->control_sel_r = rseg; + /* Set parameters of new segment */ - curr_gradient->last_visited = NULL; /* Force re-search */ - curr_gradient->dirty = 1; - ed_update_editor(GRAD_UPDATE_PREVIEW | GRAD_UPDATE_CONTROL); -} /* cpopup_split_midpoint_callback */ + newseg->type = lseg->type; + newseg->color = lseg->color; + + /* Done */ + *newl = lseg; + *newr = newseg; +} /*****/ static void -cpopup_split_uniform_callback(GtkWidget *widget, - gpointer data) +cpopup_split_uniform_callback (GtkWidget *widget, + gpointer data) { GtkWidget *dialog; GtkWidget *vbox; GtkWidget *label; GtkWidget *scale; - GtkWidget *button; GtkObject *scale_data; - /* Create dialog window */ + static ActionAreaItem action_items[] = + { + { N_("Split"), cpopup_split_uniform_split_callback, NULL, NULL }, + { N_("Cancel"), cpopup_split_uniform_cancel_callback, NULL, NULL } + }; + /* Create dialog window */ dialog = gtk_dialog_new (); + gtk_window_set_wmclass (GTK_WINDOW (g_editor->shell), + "gradient_segment_split_uniformly", "Gimp"); gtk_window_set_title (GTK_WINDOW (dialog), (g_editor->control_sel_l == g_editor->control_sel_r) ? _("Split segment uniformly") : _("Split segments uniformly")); gtk_window_position (GTK_WINDOW (dialog), GTK_WIN_POS_MOUSE); - gtk_container_set_border_width (GTK_CONTAINER (dialog), 0); + /* Handle the wm delete event */ + gtk_signal_connect (GTK_OBJECT (dialog), "delete_event", + GTK_SIGNAL_FUNC (cpopup_split_uniform_delete_callback), + dialog); + + /* The main vbox */ vbox = gtk_vbox_new (FALSE, 0); - gtk_container_set_border_width (GTK_CONTAINER (vbox), 8); - gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), vbox, - FALSE, FALSE, 0); + gtk_container_set_border_width (GTK_CONTAINER (vbox), 6); + gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), vbox); gtk_widget_show (vbox); - /* Instructions */ - + /* Instructions */ label = gtk_label_new (_("Please select the number of uniform parts")); - gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.0); gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0); gtk_widget_show (label); - label = gtk_label_new ((g_editor->control_sel_l == g_editor->control_sel_r) ? - _("in which you want to split the selected segment") : - _("in which you want to split the segments in the selection")); - gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.0); + label = + gtk_label_new ((g_editor->control_sel_l == g_editor->control_sel_r) ? + _("in which you want to split the selected segment") : + _("in which you want to split the segments in the selection")); gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0); gtk_widget_show (label); - /* Scale */ - + /* Scale */ g_editor->split_parts = 2; scale_data = gtk_adjustment_new (2.0, 2.0, 21.0, 1.0, 1.0, 1.0); scale = gtk_hscale_new (GTK_ADJUSTMENT (scale_data)); gtk_scale_set_digits (GTK_SCALE (scale), 0); gtk_scale_set_value_pos (GTK_SCALE (scale), GTK_POS_TOP); - gtk_box_pack_start (GTK_BOX (vbox), scale, FALSE, TRUE, 8); + gtk_box_pack_start (GTK_BOX (vbox), scale, FALSE, FALSE, 4); gtk_widget_show (scale); gtk_signal_connect (scale_data, "value_changed", (GtkSignalFunc) cpopup_split_uniform_scale_update, NULL); - /* Buttons */ - - button = ed_create_button (_("Split"), 0.5, 0.5, - (GtkSignalFunc) cpopup_split_uniform_split_callback, - (gpointer) dialog); - GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT); - gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->action_area), - button, TRUE, TRUE, 0); - gtk_widget_grab_default (button); - gtk_widget_show (button); - - button = ed_create_button (_("Cancel"), 0.5, 0.5, - (GtkSignalFunc) cpopup_split_uniform_cancel_callback, - (gpointer) dialog); - GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT); - gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->action_area), - button, TRUE, TRUE, 0); - gtk_widget_show (button); - - /* Show! */ + /* The action area */ + action_items[0].user_data = dialog; + action_items[1].user_data = dialog; + build_action_area (GTK_DIALOG (dialog), action_items, 2, 0); + /* Show! */ gtk_widget_show (dialog); gtk_widget_set_sensitive (g_editor->shell, FALSE); -} /* cpopup_split_uniform_callback */ - - -/*****/ +} static void -cpopup_delete_callback(GtkWidget *widget, gpointer data) +cpopup_split_uniform_scale_update (GtkAdjustment *adjustment, + gpointer data) { - grad_segment_t *lseg, *rseg, *seg, *aseg, *next; - double join; - - /* Remember segments to the left and to the right of the selection */ - - lseg = g_editor->control_sel_l->prev; - rseg = g_editor->control_sel_r->next; - - /* Cannot delete all the segments in the gradient */ - - if ((lseg == NULL) && (rseg == NULL)) - return; - - /* Calculate join point */ - - join = (g_editor->control_sel_l->left + g_editor->control_sel_r->right) / 2.0; - - if (lseg == NULL) - join = 0.0; - else if (rseg == NULL) - join = 1.0; - - /* Move segments */ - - if (lseg != NULL) - control_compress_range(lseg, lseg, lseg->left, join); - - if (rseg != NULL) - control_compress_range(rseg, rseg, join, rseg->right); - - /* Link */ - - if (lseg) - lseg->next = rseg; - - if (rseg) - rseg->prev = lseg; - - /* Delete old segments */ - - seg = g_editor->control_sel_l; - - do { - next = seg->next; - aseg = seg; + g_editor->split_parts = (gint) (adjustment->value + 0.5); +} - seg_free_segment(seg); +static void +cpopup_split_uniform_split_callback (GtkWidget *widget, + gpointer data) +{ + grad_segment_t *seg, *aseg, *lseg, *rseg, *lsel; - seg = next; - } while (aseg != g_editor->control_sel_r); + gtk_widget_destroy (GTK_WIDGET (data)); + gtk_widget_set_sensitive (g_editor->shell, TRUE); - /* Change selection */ + seg = g_editor->control_sel_l; + lsel = NULL; - if (rseg) { - g_editor->control_sel_l = rseg; - g_editor->control_sel_r = rseg; - } else { - g_editor->control_sel_l = lseg; - g_editor->control_sel_r = lseg; - } /* else */ + do + { + aseg = seg; - if (lseg == NULL) - curr_gradient->segments = rseg; + cpopup_split_uniform (seg, g_editor->split_parts, &lseg, &rseg); - /* Done */ + if (seg == g_editor->control_sel_l) + lsel = lseg; - curr_gradient->last_visited = NULL; /* Force re-search */ - curr_gradient->dirty = 1; - - ed_update_editor(GRAD_UPDATE_PREVIEW | GRAD_UPDATE_CONTROL); -} /* cpopup_delete_callback */ + seg = rseg->next; + } + while (aseg != g_editor->control_sel_r); + g_editor->control_sel_l = lsel; + g_editor->control_sel_r = rseg; -/*****/ + curr_gradient->last_visited = NULL; /* Force re-search */ + curr_gradient->dirty = 1; + ed_update_editor (GRAD_UPDATE_PREVIEW | GRAD_UPDATE_CONTROL); +} static void -cpopup_recenter_callback(GtkWidget *wiodget, gpointer data) +cpopup_split_uniform_cancel_callback (GtkWidget *widget, + gpointer data) { - grad_segment_t *seg, *aseg; - - seg = g_editor->control_sel_l; - - do { - seg->middle = (seg->left + seg->right) / 2.0; - - aseg = seg; - seg = seg->next; - } while (aseg != g_editor->control_sel_r); - - curr_gradient->dirty = 1; - ed_update_editor(GRAD_UPDATE_PREVIEW | GRAD_UPDATE_CONTROL); -} /* cpopup_recenter_callback */ - - -/*****/ + gtk_widget_destroy (GTK_WIDGET (data)); + gtk_widget_set_sensitive (g_editor->shell, TRUE); +} -static void -cpopup_redistribute_callback(GtkWidget *widget, gpointer data) +static gint +cpopup_split_uniform_delete_callback (GtkWidget *widget, + GdkEvent *event, + gpointer data) { - grad_segment_t *seg, *aseg; - double left, right, seg_len; - int num_segs; - int i; + cpopup_split_uniform_cancel_callback (widget, data); - /* Count number of segments in selection */ - - num_segs = 0; - seg = g_editor->control_sel_l; - - do { - num_segs++; - aseg = seg; - seg = seg->next; - } while (aseg != g_editor->control_sel_r); - - /* Calculate new segment length */ - - left = g_editor->control_sel_l->left; - right = g_editor->control_sel_r->right; - seg_len = (right - left) / num_segs; - - /* Redistribute */ - - seg = g_editor->control_sel_l; - - for (i = 0; i < num_segs; i++) { - seg->left = left + i * seg_len; - seg->right = left + (i + 1) * seg_len; - seg->middle = (seg->left + seg->right) / 2.0; - - seg = seg->next; - } /* for */ - - /* Fix endpoints to squish accumulative error */ - - g_editor->control_sel_l->left = left; - g_editor->control_sel_r->right = right; - - /* Done */ - - curr_gradient->dirty = 1; - ed_update_editor(GRAD_UPDATE_PREVIEW | GRAD_UPDATE_CONTROL); -} /* cpopup_redistribute_callback */ - - -/*****/ + return TRUE; +} static void -cpopup_flip_callback(GtkWidget *widget, gpointer data) +cpopup_split_uniform (grad_segment_t *lseg, + int parts, + grad_segment_t **newl, + grad_segment_t **newr) { - grad_segment_t *oseg, *oaseg; - grad_segment_t *seg, *prev, *tmp; - grad_segment_t *lseg, *rseg; - double left, right; - - left = g_editor->control_sel_l->left; - right = g_editor->control_sel_r->right; - - /* Build flipped segments */ - - prev = NULL; - oseg = g_editor->control_sel_r; - tmp = NULL; - - do { - seg = seg_new_segment(); - - if (prev == NULL) { - seg->left = left; - tmp = seg; /* Remember first segment */ - } else - seg->left = left + right - oseg->right; - - seg->middle = left + right - oseg->middle; - seg->right = left + right - oseg->left; - - seg->r0 = oseg->r1; - seg->g0 = oseg->g1; - seg->b0 = oseg->b1; - seg->a0 = oseg->a1; - - seg->r1 = oseg->r0; - seg->g1 = oseg->g0; - seg->b1 = oseg->b0; - seg->a1 = oseg->a0; - - switch (oseg->type) { - case GRAD_SPHERE_INCREASING: - seg->type = GRAD_SPHERE_DECREASING; - break; - - case GRAD_SPHERE_DECREASING: - seg->type = GRAD_SPHERE_INCREASING; - break; - - default: - seg->type = oseg->type; - } /* switch */ + grad_segment_t *seg, *prev, *tmp; + gdouble seg_len; + gint i; - switch (oseg->color) { - case GRAD_HSV_CCW: - seg->color = GRAD_HSV_CW; - break; + seg_len = (lseg->right - lseg->left) / parts; /* Length of divisions */ - case GRAD_HSV_CW: - seg->color = GRAD_HSV_CCW; - break; + seg = NULL; + prev = NULL; + tmp = NULL; - default: - seg->color = oseg->color; - } /* switch */ + for (i = 0; i < parts; i++) + { + seg = seg_new_segment(); - seg->prev = prev; - seg->next = NULL; + if (i == 0) + tmp = seg; /* Remember first segment */ - if (prev) - prev->next = seg; + seg->left = lseg->left + i * seg_len; + seg->right = lseg->left + (i + 1) * seg_len; + seg->middle = (seg->left + seg->right) / 2.0; - prev = seg; + grad_get_color_at (seg->left, &seg->r0, &seg->g0, &seg->b0, &seg->a0); + grad_get_color_at (seg->right, &seg->r1, &seg->g1, &seg->b1, &seg->a1); - oaseg = oseg; - oseg = oseg->prev; /* Move backwards! */ - } while (oaseg != g_editor->control_sel_l); - - seg->right = right; /* Squish accumulative error */ + seg->type = lseg->type; + seg->color = lseg->color; - /* Free old segments */ + seg->prev = prev; + seg->next = NULL; - lseg = g_editor->control_sel_l->prev; - rseg = g_editor->control_sel_r->next; + if (prev) + prev->next = seg; - oseg = g_editor->control_sel_l; + prev = seg; + } - do { - oaseg = oseg->next; - seg_free_segment(oseg); - oseg = oaseg; - } while (oaseg != rseg); + /* Fix edges */ - /* Link in new segments */ + tmp->r0 = lseg->r0; + tmp->g0 = lseg->g0; + tmp->b0 = lseg->b0; + tmp->a0 = lseg->a0; - if (lseg) - lseg->next = tmp; - else - curr_gradient->segments = tmp; + seg->r1 = lseg->r1; + seg->g1 = lseg->g1; + seg->b1 = lseg->b1; + seg->a1 = lseg->a1; - tmp->prev = lseg; + tmp->left = lseg->left; + seg->right = lseg->right; /* To squish accumulative error */ - seg->next = rseg; + /* Link in list */ - if (rseg) - rseg->prev = seg; + tmp->prev = lseg->prev; + seg->next = lseg->next; - /* Reset selection */ + if (lseg->prev) + lseg->prev->next = tmp; + else + curr_gradient->segments = tmp; /* We are on leftmost segment */ - g_editor->control_sel_l = tmp; - g_editor->control_sel_r = seg; + if (lseg->next) + lseg->next->prev = seg; - /* Done */ + curr_gradient->last_visited = NULL; /* Force re-search */ - curr_gradient->last_visited = NULL; /* Force re-search */ - curr_gradient->dirty = 1; + /* Done */ + + *newl = tmp; + *newr = seg; - ed_update_editor(GRAD_UPDATE_PREVIEW | GRAD_UPDATE_CONTROL); -} /* cpopup_flip_callback */ + /* Delete old segment */ + seg_free_segment (lseg); +} /*****/ static void -cpopup_replicate_callback(GtkWidget *widget, gpointer data) +cpopup_delete_callback (GtkWidget *widget, + gpointer data) { - GtkWidget *dialog; - GtkWidget *vbox; - GtkWidget *label; - GtkWidget *scale; - GtkWidget *button; - GtkObject *scale_data; + grad_segment_t *lseg, *rseg, *seg, *aseg, *next; + double join; - /* Create dialog window */ + /* Remember segments to the left and to the right of the selection */ - dialog = gtk_dialog_new (); - gtk_window_set_title (GTK_WINDOW (dialog), - (g_editor->control_sel_l == g_editor->control_sel_r) ? - _("Replicate segment") : - _("Replicate selection")); - gtk_window_position (GTK_WINDOW (dialog), GTK_WIN_POS_MOUSE); - gtk_container_set_border_width (GTK_CONTAINER (dialog), 0); + lseg = g_editor->control_sel_l->prev; + rseg = g_editor->control_sel_r->next; - vbox = gtk_vbox_new (FALSE, 0); - gtk_container_set_border_width (GTK_CONTAINER (vbox), 8); - gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), vbox, - FALSE, FALSE, 0); - gtk_widget_show (vbox); + /* Cannot delete all the segments in the gradient */ - /* Instructions */ + if ((lseg == NULL) && (rseg == NULL)) + return; - label = gtk_label_new (_("Please select the number of times")); - gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.0); - gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0); - gtk_widget_show (label); + /* Calculate join point */ - label = gtk_label_new ((g_editor->control_sel_l == g_editor->control_sel_r) ? - _("you want to replicate the selected segment") : - _("you want to replicate the selection")); - gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.0); - gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0); - gtk_widget_show (label); + join = (g_editor->control_sel_l->left + g_editor->control_sel_r->right) / 2.0; - /* Scale */ + if (lseg == NULL) + join = 0.0; + else if (rseg == NULL) + join = 1.0; - g_editor->replicate_times = 2; - scale_data = gtk_adjustment_new (2.0, 2.0, 21.0, 1.0, 1.0, 1.0); + /* Move segments */ - scale = gtk_hscale_new (GTK_ADJUSTMENT (scale_data)); - gtk_scale_set_digits (GTK_SCALE (scale), 0); - gtk_scale_set_value_pos (GTK_SCALE (scale), GTK_POS_TOP); - gtk_box_pack_start (GTK_BOX (vbox), scale, FALSE, TRUE, 8); - gtk_widget_show (scale); + if (lseg != NULL) + control_compress_range (lseg, lseg, lseg->left, join); - gtk_signal_connect (scale_data, "value_changed", - (GtkSignalFunc) cpopup_replicate_scale_update, - NULL); + if (rseg != NULL) + control_compress_range (rseg, rseg, join, rseg->right); - /* Buttons */ + /* Link */ - button = ed_create_button (_("Replicate"), 0.5, 0.5, - (GtkSignalFunc) cpopup_do_replicate_callback, - (gpointer) dialog); - GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT); - gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->action_area), - button, TRUE, TRUE, 0); - gtk_widget_grab_default (button); - gtk_widget_show (button); + if (lseg) + lseg->next = rseg; - button = ed_create_button (_("Cancel"), 0.5, 0.5, - (GtkSignalFunc) cpopup_replicate_cancel_callback, - (gpointer) dialog); - GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT); - gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->action_area), - button, TRUE, TRUE, 0); - gtk_widget_show (button); + if (rseg) + rseg->prev = lseg; - /* Show! */ + /* Delete old segments */ - gtk_widget_show (dialog); - gtk_widget_set_sensitive (g_editor->shell, FALSE); -} /* cpopup_replicate_callback */ + seg = g_editor->control_sel_l; + + do + { + next = seg->next; + aseg = seg; + + seg_free_segment (seg); + + seg = next; + } + while (aseg != g_editor->control_sel_r); + /* Change selection */ + + if (rseg) + { + g_editor->control_sel_l = rseg; + g_editor->control_sel_r = rseg; + } + else + { + g_editor->control_sel_l = lseg; + g_editor->control_sel_r = lseg; + } + + if (lseg == NULL) + curr_gradient->segments = rseg; + + /* Done */ + + curr_gradient->last_visited = NULL; /* Force re-search */ + curr_gradient->dirty = 1; + + ed_update_editor (GRAD_UPDATE_PREVIEW | GRAD_UPDATE_CONTROL); +} /*****/ static void -cpopup_split_uniform_scale_update(GtkAdjustment *adjustment, gpointer data) +cpopup_recenter_callback (GtkWidget *wiodget, + gpointer data) { - g_editor->split_parts = (int) (adjustment->value + 0.5); /* We have to round */ -} /* cpopup_split_uniform_scale_update */ + grad_segment_t *seg, *aseg; + + seg = g_editor->control_sel_l; + + do + { + seg->middle = (seg->left + seg->right) / 2.0; + + aseg = seg; + seg = seg->next; + } + while (aseg != g_editor->control_sel_r); + curr_gradient->dirty = 1; + ed_update_editor (GRAD_UPDATE_PREVIEW | GRAD_UPDATE_CONTROL); +} /*****/ static void -cpopup_split_uniform_split_callback(GtkWidget *widget, gpointer client_data) +cpopup_redistribute_callback (GtkWidget *widget, + gpointer data) { - grad_segment_t *seg, *aseg, *lseg, *rseg, *lsel; + grad_segment_t *seg, *aseg; + double left, right, seg_len; + int num_segs; + int i; - gtk_widget_destroy(GTK_WIDGET(client_data)); - gtk_widget_set_sensitive(g_editor->shell, TRUE); + /* Count number of segments in selection */ - seg = g_editor->control_sel_l; - lsel = NULL; + num_segs = 0; + seg = g_editor->control_sel_l; - do { - aseg = seg; + do + { + num_segs++; + aseg = seg; + seg = seg->next; + } + while (aseg != g_editor->control_sel_r); - cpopup_split_uniform(seg, g_editor->split_parts, &lseg, &rseg); + /* Calculate new segment length */ - if (seg == g_editor->control_sel_l) - lsel = lseg; + left = g_editor->control_sel_l->left; + right = g_editor->control_sel_r->right; + seg_len = (right - left) / num_segs; - seg = rseg->next; - } while (aseg != g_editor->control_sel_r); + /* Redistribute */ - g_editor->control_sel_l = lsel; - g_editor->control_sel_r = rseg; + seg = g_editor->control_sel_l; - curr_gradient->last_visited = NULL; /* Force re-search */ - curr_gradient->dirty = 1; - ed_update_editor(GRAD_UPDATE_PREVIEW | GRAD_UPDATE_CONTROL); -} /* cpopup_split_uniform_split_callback */ + for (i = 0; i < num_segs; i++) + { + seg->left = left + i * seg_len; + seg->right = left + (i + 1) * seg_len; + seg->middle = (seg->left + seg->right) / 2.0; + seg = seg->next; + } -/*****/ + /* Fix endpoints to squish accumulative error */ -static void -cpopup_split_uniform_cancel_callback(GtkWidget *widget, gpointer client_data) -{ - gtk_widget_destroy(GTK_WIDGET(client_data)); - gtk_widget_set_sensitive(g_editor->shell, TRUE); -} /* cpopup_split_uniform_cancel_callback */ + g_editor->control_sel_l->left = left; + g_editor->control_sel_r->right = right; + + /* Done */ + + curr_gradient->dirty = 1; + ed_update_editor (GRAD_UPDATE_PREVIEW | GRAD_UPDATE_CONTROL); +} +/***** Control popup -> selection options functions *****/ /*****/ -static void -cpopup_replicate_scale_update(GtkAdjustment *adjustment, gpointer data) +static GtkWidget * +cpopup_create_sel_ops_menu (void) { - g_editor->replicate_times = (int) (adjustment->value + 0.5); /* We have to round */ -} /* cpopup_replicate_scale_update */ + GtkWidget *menu; + GtkWidget *menuitem; + GtkAccelGroup *accel_group; + + menu = gtk_menu_new (); + accel_group = g_editor->accel_group; + + gtk_menu_set_accel_group (GTK_MENU (menu), accel_group); + /* Flip */ + menuitem = + cpopup_create_menu_item_with_label ("", &g_editor->control_flip_label); + gtk_signal_connect (GTK_OBJECT (menuitem), "activate", + (GtkSignalFunc) cpopup_flip_callback, + NULL); + gtk_menu_append (GTK_MENU (menu), menuitem); + gtk_widget_show (menuitem); + gtk_widget_add_accelerator (menuitem, "activate", + accel_group, + 'F', 0, + GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED); + + /* Replicate */ + menuitem = + cpopup_create_menu_item_with_label ("", &g_editor->control_replicate_label); + gtk_signal_connect (GTK_OBJECT (menuitem), "activate", + (GtkSignalFunc) cpopup_replicate_callback, + NULL); + gtk_menu_append (GTK_MENU (menu), menuitem); + gtk_widget_show (menuitem); + gtk_widget_add_accelerator (menuitem, "activate", + accel_group, + 'M', 0, + GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED); + + /* Blend colors / opacity */ + menuitem = gtk_menu_item_new (); + gtk_menu_append (GTK_MENU (menu), menuitem); + gtk_widget_show (menuitem); + + menuitem = gtk_menu_item_new_with_label (_("Blend endpoints' colors")); + gtk_signal_connect (GTK_OBJECT (menuitem), "activate", + (GtkSignalFunc) cpopup_blend_colors, + NULL); + gtk_menu_append (GTK_MENU (menu), menuitem); + gtk_widget_show (menuitem); + g_editor->control_blend_colors_menu_item = menuitem; + gtk_widget_add_accelerator (menuitem, "activate", + accel_group, + 'B', 0, + GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED); + + menuitem = gtk_menu_item_new_with_label (_("Blend endpoints' opacity")); + gtk_signal_connect (GTK_OBJECT (menuitem), "activate", + (GtkSignalFunc) cpopup_blend_opacity, + NULL); + gtk_menu_append (GTK_MENU (menu), menuitem); + gtk_widget_show (menuitem); + gtk_widget_add_accelerator (menuitem, "activate", + accel_group, + 'B', GDK_CONTROL_MASK, + GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED); + g_editor->control_blend_opacity_menu_item = menuitem; + + return menu; +} /*****/ static void -cpopup_do_replicate_callback(GtkWidget *widget, gpointer client_data) +cpopup_flip_callback (GtkWidget *widget, + gpointer data) { - double sel_left, sel_right, sel_len; - double new_left; - double factor; - grad_segment_t *prev, *seg, *tmp; - grad_segment_t *oseg, *oaseg; - grad_segment_t *lseg, *rseg; - int i; + grad_segment_t *oseg, *oaseg; + grad_segment_t *seg, *prev, *tmp; + grad_segment_t *lseg, *rseg; + double left, right; - gtk_widget_destroy(GTK_WIDGET(client_data)); - gtk_widget_set_sensitive(g_editor->shell, TRUE); + left = g_editor->control_sel_l->left; + right = g_editor->control_sel_r->right; - /* Remember original parameters */ + /* Build flipped segments */ - sel_left = g_editor->control_sel_l->left; - sel_right = g_editor->control_sel_r->right; - sel_len = sel_right - sel_left; - - factor = 1.0 / g_editor->replicate_times; - - /* Build replicated segments */ + prev = NULL; + oseg = g_editor->control_sel_r; + tmp = NULL; - prev = NULL; - seg = NULL; - tmp = NULL; + do + { + seg = seg_new_segment (); - for (i = 0; i < g_editor->replicate_times; i++) { - /* Build one cycle */ + if (prev == NULL) + { + seg->left = left; + tmp = seg; /* Remember first segment */ + } + else + seg->left = left + right - oseg->right; - new_left = sel_left + i * factor * sel_len; + seg->middle = left + right - oseg->middle; + seg->right = left + right - oseg->left; - oseg = g_editor->control_sel_l; + seg->r0 = oseg->r1; + seg->g0 = oseg->g1; + seg->b0 = oseg->b1; + seg->a0 = oseg->a1; - do { - seg = seg_new_segment(); + seg->r1 = oseg->r0; + seg->g1 = oseg->g0; + seg->b1 = oseg->b0; + seg->a1 = oseg->a0; - if (prev == NULL) { - seg->left = sel_left; - tmp = seg; /* Remember first segment */ - } else - seg->left = new_left + factor * (oseg->left - sel_left); + switch (oseg->type) + { + case GRAD_SPHERE_INCREASING: + seg->type = GRAD_SPHERE_DECREASING; + break; - seg->middle = new_left + factor * (oseg->middle - sel_left); - seg->right = new_left + factor * (oseg->right - sel_left); + case GRAD_SPHERE_DECREASING: + seg->type = GRAD_SPHERE_INCREASING; + break; - seg->r0 = oseg->r0; - seg->g0 = oseg->g0; - seg->b0 = oseg->b0; - seg->a0 = oseg->a0; + default: + seg->type = oseg->type; + } - seg->r1 = oseg->r1; - seg->g1 = oseg->g1; - seg->b1 = oseg->b1; - seg->a1 = oseg->a1; + switch (oseg->color) + { + case GRAD_HSV_CCW: + seg->color = GRAD_HSV_CW; + break; - seg->type = oseg->type; - seg->color = oseg->color; + case GRAD_HSV_CW: + seg->color = GRAD_HSV_CCW; + break; - seg->prev = prev; - seg->next = NULL; + default: + seg->color = oseg->color; + } - if (prev) - prev->next = seg; + seg->prev = prev; + seg->next = NULL; - prev = seg; + if (prev) + prev->next = seg; - oaseg = oseg; - oseg = oseg->next; - } while (oaseg != g_editor->control_sel_r); - } /* for */ + prev = seg; - seg->right = sel_right; /* Squish accumulative error */ + oaseg = oseg; + oseg = oseg->prev; /* Move backwards! */ + } + while (oaseg != g_editor->control_sel_l); - /* Free old segments */ + seg->right = right; /* Squish accumulative error */ - lseg = g_editor->control_sel_l->prev; - rseg = g_editor->control_sel_r->next; + /* Free old segments */ - oseg = g_editor->control_sel_l; + lseg = g_editor->control_sel_l->prev; + rseg = g_editor->control_sel_r->next; - do { - oaseg = oseg->next; - seg_free_segment(oseg); - oseg = oaseg; - } while (oaseg != rseg); + oseg = g_editor->control_sel_l; - /* Link in new segments */ + do + { + oaseg = oseg->next; + seg_free_segment (oseg); + oseg = oaseg; + } + while (oaseg != rseg); - if (lseg) - lseg->next = tmp; - else - curr_gradient->segments = tmp; + /* Link in new segments */ - tmp->prev = lseg; + if (lseg) + lseg->next = tmp; + else + curr_gradient->segments = tmp; - seg->next = rseg; + tmp->prev = lseg; - if (rseg) - rseg->prev = seg; + seg->next = rseg; - /* Reset selection */ + if (rseg) + rseg->prev = seg; - g_editor->control_sel_l = tmp; - g_editor->control_sel_r = seg; + /* Reset selection */ - /* Done */ + g_editor->control_sel_l = tmp; + g_editor->control_sel_r = seg; - curr_gradient->last_visited = NULL; /* Force re-search */ - curr_gradient->dirty = 1; + /* Done */ - ed_update_editor(GRAD_UPDATE_PREVIEW | GRAD_UPDATE_CONTROL); -} /* cpopup_do_replicate_callback */ + curr_gradient->last_visited = NULL; /* Force re-search */ + curr_gradient->dirty = 1; + ed_update_editor (GRAD_UPDATE_PREVIEW | GRAD_UPDATE_CONTROL); +} /*****/ static void -cpopup_replicate_cancel_callback(GtkWidget *widget, gpointer client_data) +cpopup_replicate_callback (GtkWidget *widget, + gpointer data) { - gtk_widget_destroy(GTK_WIDGET(client_data)); - gtk_widget_set_sensitive(g_editor->shell, TRUE); -} /* cpopup_replicate_cancel_callback */ + GtkWidget *dialog; + GtkWidget *vbox; + GtkWidget *label; + GtkWidget *scale; + GtkObject *scale_data; + static ActionAreaItem action_items[] = + { + { N_("Replicate"), cpopup_do_replicate_callback, NULL, NULL }, + { N_("Cancel"), cpopup_replicate_cancel_callback, NULL, NULL } + }; -/*****/ + /* Create dialog window */ + dialog = gtk_dialog_new (); + gtk_window_set_wmclass (GTK_WINDOW (dialog), + "gradient_segment_replicate", "Gimp"); + gtk_window_set_title (GTK_WINDOW (dialog), + (g_editor->control_sel_l == g_editor->control_sel_r) ? + _("Replicate segment") : + _("Replicate selection")); + gtk_window_position (GTK_WINDOW (dialog), GTK_WIN_POS_MOUSE); -static void -cpopup_blend_endpoints(double r0, double g0, double b0, double a0, - double r1, double g1, double b1, double a1, - int blend_colors, int blend_opacity) -{ - double dr, dg, db, da; - double left, len; - grad_segment_t *seg, *aseg; + /* Handle the wm delete event */ + gtk_signal_connect (GTK_OBJECT (dialog), "delete_event", + GTK_SIGNAL_FUNC (cpopup_replicate_delete_callback), + dialog); - dr = r1 - r0; - dg = g1 - g0; - db = b1 - b0; - da = a1 - a0; + vbox = gtk_vbox_new (FALSE, 0); + gtk_container_set_border_width (GTK_CONTAINER (vbox), 6); + gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), vbox); + gtk_widget_show (vbox); - left = g_editor->control_sel_l->left; - len = g_editor->control_sel_r->right - left; + /* Instructions */ + label = gtk_label_new (_("Please select the number of times")); + gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0); + gtk_widget_show (label); - seg = g_editor->control_sel_l; + label = gtk_label_new ((g_editor->control_sel_l == g_editor->control_sel_r) ? + _("you want to replicate the selected segment") : + _("you want to replicate the selection")); + gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0); + gtk_widget_show (label); - do { - if (blend_colors) { - seg->r0 = r0 + (seg->left - left) / len * dr; - seg->g0 = g0 + (seg->left - left) / len * dg; - seg->b0 = b0 + (seg->left - left) / len * db; + /* Scale */ + g_editor->replicate_times = 2; + scale_data = gtk_adjustment_new (2.0, 2.0, 21.0, 1.0, 1.0, 1.0); - seg->r1 = r0 + (seg->right - left) / len * dr; - seg->g1 = g0 + (seg->right - left) / len * dg; - seg->b1 = b0 + (seg->right - left) / len * db; - } /* if */ + scale = gtk_hscale_new (GTK_ADJUSTMENT (scale_data)); + gtk_scale_set_digits (GTK_SCALE (scale), 0); + gtk_scale_set_value_pos (GTK_SCALE (scale), GTK_POS_TOP); + gtk_box_pack_start (GTK_BOX (vbox), scale, FALSE, TRUE, 4); + gtk_widget_show (scale); - if (blend_opacity) { - seg->a0 = a0 + (seg->left - left) / len * da; - seg->a1 = a0 + (seg->right - left) / len * da; - } /* if */ + gtk_signal_connect (scale_data, "value_changed", + (GtkSignalFunc) cpopup_replicate_scale_update, + NULL); - aseg = seg; - seg = seg->next; - } while (aseg != g_editor->control_sel_r); -} /* cpopup_blend_endpoints */ + /* The action area */ + action_items[0].user_data = dialog; + action_items[1].user_data = dialog; + build_action_area (GTK_DIALOG (dialog), action_items, 2, 1); + /* Show! */ + gtk_widget_show (dialog); + gtk_widget_set_sensitive (g_editor->shell, FALSE); +} -/*****/ +static void +cpopup_replicate_scale_update (GtkAdjustment *adjustment, + gpointer data) +{ + g_editor->replicate_times = (int) (adjustment->value + 0.5); +} static void -cpopup_split_midpoint(grad_segment_t *lseg, grad_segment_t **newl, grad_segment_t **newr) +cpopup_do_replicate_callback (GtkWidget *widget, + gpointer data) { - double r, g, b, a; - grad_segment_t *newseg; + gdouble sel_left, sel_right, sel_len; + gdouble new_left; + gdouble factor; + grad_segment_t *prev, *seg, *tmp; + grad_segment_t *oseg, *oaseg; + grad_segment_t *lseg, *rseg; + gint i; - /* Get color at original segment's midpoint */ + gtk_widget_destroy (GTK_WIDGET (data)); + gtk_widget_set_sensitive (g_editor->shell, TRUE); - grad_get_color_at(lseg->middle, &r, &g, &b, &a); + /* Remember original parameters */ + sel_left = g_editor->control_sel_l->left; + sel_right = g_editor->control_sel_r->right; + sel_len = sel_right - sel_left; - /* Create a new segment and insert it in the list */ + factor = 1.0 / g_editor->replicate_times; - newseg = seg_new_segment(); + /* Build replicated segments */ - newseg->prev = lseg; - newseg->next = lseg->next; + prev = NULL; + seg = NULL; + tmp = NULL; - lseg->next = newseg; + for (i = 0; i < g_editor->replicate_times; i++) + { + /* Build one cycle */ - if (newseg->next) - newseg->next->prev = newseg; + new_left = sel_left + i * factor * sel_len; - /* Set coordinates of new segment */ + oseg = g_editor->control_sel_l; - newseg->left = lseg->middle; - newseg->right = lseg->right; - newseg->middle = (newseg->left + newseg->right) / 2.0; + do + { + seg = seg_new_segment(); - /* Set coordinates of original segment */ + if (prev == NULL) + { + seg->left = sel_left; + tmp = seg; /* Remember first segment */ + } + else + seg->left = new_left + factor * (oseg->left - sel_left); - lseg->right = newseg->left; - lseg->middle = (lseg->left + lseg->right) / 2.0; + seg->middle = new_left + factor * (oseg->middle - sel_left); + seg->right = new_left + factor * (oseg->right - sel_left); - /* Set colors of both segments */ + seg->r0 = oseg->r0; + seg->g0 = oseg->g0; + seg->b0 = oseg->b0; + seg->a0 = oseg->a0; - newseg->r1 = lseg->r1; - newseg->g1 = lseg->g1; - newseg->b1 = lseg->b1; - newseg->a1 = lseg->a1; + seg->r1 = oseg->r1; + seg->g1 = oseg->g1; + seg->b1 = oseg->b1; + seg->a1 = oseg->a1; - lseg->r1 = newseg->r0 = r; - lseg->g1 = newseg->g0 = g; - lseg->b1 = newseg->b0 = b; - lseg->a1 = newseg->a0 = a; + seg->type = oseg->type; + seg->color = oseg->color; - /* Set parameters of new segment */ + seg->prev = prev; + seg->next = NULL; - newseg->type = lseg->type; - newseg->color = lseg->color; + if (prev) + prev->next = seg; - /* Done */ + prev = seg; - *newl = lseg; - *newr = newseg; -} /* cpopup_split_midpoint */ + oaseg = oseg; + oseg = oseg->next; + } + while (oaseg != g_editor->control_sel_r); + } + seg->right = sel_right; /* Squish accumulative error */ -/*****/ + /* Free old segments */ -static void -cpopup_split_uniform(grad_segment_t *lseg, int parts, - grad_segment_t **newl, grad_segment_t **newr) -{ - grad_segment_t *seg, *prev, *tmp; - double seg_len; - int i; + lseg = g_editor->control_sel_l->prev; + rseg = g_editor->control_sel_r->next; - seg_len = (lseg->right - lseg->left) / parts; /* Length of divisions */ + oseg = g_editor->control_sel_l; - seg = NULL; - prev = NULL; - tmp = NULL; + do + { + oaseg = oseg->next; + seg_free_segment(oseg); + oseg = oaseg; + } + while (oaseg != rseg); - for (i = 0; i < parts; i++) { - seg = seg_new_segment(); + /* Link in new segments */ - if (i == 0) - tmp = seg; /* Remember first segment */ + if (lseg) + lseg->next = tmp; + else + curr_gradient->segments = tmp; - seg->left = lseg->left + i * seg_len; - seg->right = lseg->left + (i + 1) * seg_len; - seg->middle = (seg->left + seg->right) / 2.0; + tmp->prev = lseg; - grad_get_color_at(seg->left, &seg->r0, &seg->g0, &seg->b0, &seg->a0); - grad_get_color_at(seg->right, &seg->r1, &seg->g1, &seg->b1, &seg->a1); + seg->next = rseg; - seg->type = lseg->type; - seg->color = lseg->color; + if (rseg) + rseg->prev = seg; - seg->prev = prev; - seg->next = NULL; + /* Reset selection */ - if (prev) - prev->next = seg; + g_editor->control_sel_l = tmp; + g_editor->control_sel_r = seg; - prev = seg; - } /* for */ + /* Done */ + + curr_gradient->last_visited = NULL; /* Force re-search */ + curr_gradient->dirty = 1; - /* Fix edges */ + ed_update_editor (GRAD_UPDATE_PREVIEW | GRAD_UPDATE_CONTROL); +} + +static void +cpopup_replicate_cancel_callback (GtkWidget *widget, + gpointer data) +{ + gtk_widget_destroy (GTK_WIDGET (data)); + gtk_widget_set_sensitive (g_editor->shell, TRUE); +} - tmp->r0 = lseg->r0; - tmp->g0 = lseg->g0; - tmp->b0 = lseg->b0; - tmp->a0 = lseg->a0; +static gint +cpopup_replicate_delete_callback (GtkWidget *widget, + GdkEvent *event, + gpointer data) +{ + cpopup_replicate_cancel_callback (widget, data); - seg->r1 = lseg->r1; - seg->g1 = lseg->g1; - seg->b1 = lseg->b1; - seg->a1 = lseg->a1; + return TRUE; +} - tmp->left = lseg->left; - seg->right = lseg->right; /* To squish accumulative error */ +/*****/ - /* Link in list */ +static void +cpopup_blend_colors (GtkWidget *widget, + gpointer data) +{ + cpopup_blend_endpoints (g_editor->control_sel_l->r0, + g_editor->control_sel_l->g0, + g_editor->control_sel_l->b0, + g_editor->control_sel_l->a0, + g_editor->control_sel_r->r1, + g_editor->control_sel_r->g1, + g_editor->control_sel_r->b1, + g_editor->control_sel_r->a1, + TRUE, FALSE); + + curr_gradient->dirty = 1; + ed_update_editor (GRAD_UPDATE_PREVIEW); +} - tmp->prev = lseg->prev; - seg->next = lseg->next; +static void +cpopup_blend_opacity (GtkWidget *widget, + gpointer data) +{ + cpopup_blend_endpoints (g_editor->control_sel_l->r0, + g_editor->control_sel_l->g0, + g_editor->control_sel_l->b0, + g_editor->control_sel_l->a0, + g_editor->control_sel_r->r1, + g_editor->control_sel_r->g1, + g_editor->control_sel_r->b1, + g_editor->control_sel_r->a1, + FALSE, TRUE); + + curr_gradient->dirty = 1; + ed_update_editor (GRAD_UPDATE_PREVIEW); +} - if (lseg->prev) - lseg->prev->next = tmp; - else - curr_gradient->segments = tmp; /* We are on leftmost segment */ +/***** Main blend function *****/ - if (lseg->next) - lseg->next->prev = seg; +/*****/ - curr_gradient->last_visited = NULL; /* Force re-search */ +static void +cpopup_blend_endpoints (double r0, double g0, double b0, double a0, + double r1, double g1, double b1, double a1, + int blend_colors, + int blend_opacity) +{ + double dr, dg, db, da; + double left, len; + grad_segment_t *seg, *aseg; - /* Done */ + dr = r1 - r0; + dg = g1 - g0; + db = b1 - b0; + da = a1 - a0; - *newl = tmp; - *newr = seg; + left = g_editor->control_sel_l->left; + len = g_editor->control_sel_r->right - left; - /* Delete old segment */ + seg = g_editor->control_sel_l; - seg_free_segment(lseg); -} /* cpopup_split_uniform */ + do + { + if (blend_colors) + { + seg->r0 = r0 + (seg->left - left) / len * dr; + seg->g0 = g0 + (seg->left - left) / len * dg; + seg->b0 = b0 + (seg->left - left) / len * db; + + seg->r1 = r0 + (seg->right - left) / len * dr; + seg->g1 = g0 + (seg->right - left) / len * dg; + seg->b1 = b0 + (seg->right - left) / len * db; + } + if (blend_opacity) + { + seg->a0 = a0 + (seg->left - left) / len * da; + seg->a1 = a0 + (seg->right - left) / len * da; + } + + aseg = seg; + seg = seg->next; + } + while (aseg != g_editor->control_sel_r); +} /***** Gradient functions *****/ @@ -5978,87 +6056,92 @@ calc_hsv_to_rgb(double *h, double *s, double *v) /*****/ -static char * -build_user_filename(char *name, char *path_str) +static gchar * +build_user_filename (gchar *name, + gchar *path_str) { - char *home; - char *local_path; - char *first_token; - char *token; - char *path; - char *filename; - - g_assert(name != NULL); + gchar *home; + gchar *local_path; + gchar *first_token; + gchar *token; + gchar *path; + gchar *filename; - if (!path_str) - return NULL; /* Perhaps this is not a good idea */ + g_assert (name != NULL); - /* Get the first path specified in the list */ + if (!path_str) + return NULL; /* Perhaps this is not a good idea */ - home = g_get_home_dir (); - local_path = g_strdup(path_str); - first_token = local_path; - token = xstrsep(&first_token, G_SEARCHPATH_SEPARATOR_S); - filename = NULL; + /* Get the first path specified in the list */ - if (token) { - if (*token == '~') { - if (!home) - return NULL; - path = g_strdup_printf("%s%s", home, token + 1); - } else { - path = g_strdup(token); - } /* else */ + home = g_get_home_dir (); + local_path = g_strdup (path_str); + first_token = local_path; + token = xstrsep (&first_token, G_SEARCHPATH_SEPARATOR_S); + filename = NULL; - filename = g_strdup_printf("%s" G_DIR_SEPARATOR_S "%s", - path, name); + if (token) + { + if (*token == '~') + { + if (!home) + return NULL; + path = g_strdup_printf ("%s%s", home, token + 1); + } + else + { + path = g_strdup (token); + } - g_free(path); - } /* if */ + filename = g_strdup_printf ("%s" G_DIR_SEPARATOR_S "%s", + path, name); - g_free(local_path); + g_free (path); + } - return filename; -} /* build_user_filename */ + g_free (local_path); + return filename; +} gint -grad_set_grad_to_name(gchar *name) +grad_set_grad_to_name (gchar *name) { GSList *list; gradient_t *grad; - int n = 0; + gint n = 0; list = gradients_list; - while (list) { - grad = list->data; + while (list) + { + grad = list->data; - if (strcmp(grad->name, name) == 0) { - /* We found it! */ - - /* Select that gradient in the listbox */ - /* Only if gradient editor has been created */ - - if(g_editor) + if (strcmp (grad->name, name) == 0) { - gtk_clist_select_row(GTK_CLIST(g_editor->clist),n,-1); - gtk_clist_moveto(GTK_CLIST(g_editor->clist),n,0,0.5,0.0); - } - else - { - /* force internal structs to use selected gradient */ - GSList* tmp = g_slist_nth(gradients_list,n); - if(tmp) - curr_gradient = (gradient_t *)(tmp->data); + /* We found it! */ + + /* Select that gradient in the listbox */ + /* Only if gradient editor has been created */ + if (g_editor) + { + gtk_clist_select_row (GTK_CLIST (g_editor->clist), n, -1); + gtk_clist_moveto (GTK_CLIST (g_editor->clist), n, 0, 0.5, 0.0); + } + else + { + /* force internal structs to use selected gradient */ + GSList* tmp = g_slist_nth (gradients_list,n); + if(tmp) + curr_gradient = (gradient_t *) (tmp->data); + } + return TRUE; } - return TRUE; - } /* if */ - n++; - list = g_slist_next(list); - } /* while */ - + n++; + list = g_slist_next (list); + } + return FALSE; } diff --git a/app/gui/gradient-editor.c b/app/gui/gradient-editor.c index 01cb35da0a..e8752b2553 100644 --- a/app/gui/gradient-editor.c +++ b/app/gui/gradient-editor.c @@ -19,7 +19,6 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - /* alt: Added previews and some other buttons to gradient dialog. * * hof: Hofer Wolfgang, 1998.01.27 avoid resize bug by keeping @@ -38,7 +37,6 @@ * Many thanks to Eiichi and Marcelo for their suggestions! */ - /* Release date: 1997/05/07 * * - Added accelerator keys for the popup functions. This allows for @@ -52,7 +50,6 @@ * - Added grad_dump_gradient(); it is useful for debugging. */ - /* Release date: 1997/04/30 * * - All `dangerous' dialogs now de-sensitize the main editor window. @@ -67,7 +64,6 @@ * for debugging). */ - /* Release date: 1997/04/22 * * - Added GtkRadioMenuItems to the blending and coloring pop-up @@ -81,7 +77,6 @@ * know why nobody killed me for not having done it before. */ - /* Release date: 1997/04/21 * * - Re-wrote the old pop-up menu code, which was *horrible*. The @@ -104,7 +99,6 @@ * them. */ - /* Special thanks to: * * Luis Albarran (luis4@mindspring.com) - Nice UI suggestions @@ -119,7 +113,6 @@ * Everyone on #gimp - many suggestions */ - /* TODO: * * - Fix memory leaks: grad_free_gradient_editor() and any others @@ -174,6 +167,9 @@ #include "libgimp/gimpintl.h" +#include "pixmaps/zoom_in.xpm" +#include "pixmaps/zoom_out.xpm" + /***** Magic numbers *****/ #ifndef M_PI @@ -193,9 +189,9 @@ static GtkWidget *ed_create_button (gchar *label, static void ed_fetch_foreground (double *fg_r, double *fg_g, double *fg_b, double *fg_a); -static void ed_update_editor (int flags); +static void ed_update_editor (int flags); -static void ed_set_hint (char *str); +static void ed_set_hint (gchar *str); static void ed_list_item_update (GtkWidget *widget, @@ -206,14 +202,13 @@ static void ed_list_item_update (GtkWidget *widget, static void ed_initialize_saved_colors (void); -static gint ed_delete_callback (GtkWidget *, GdkEvent *, gpointer); -static void ed_close_callback (GtkWidget *, gpointer); +/* Main dialog button callbacks & functions */ -static void ed_new_gradient_callback (GtkWidget *, gpointer); -static void ed_do_new_gradient_callback (GtkWidget *, gpointer , gpointer); +static void ed_new_gradient_callback (GtkWidget *, gpointer); +static void ed_do_new_gradient_callback (GtkWidget *, gpointer , gpointer); -static void ed_copy_gradient_callback (GtkWidget *, gpointer); -static void ed_do_copy_gradient_callback (GtkWidget *, gpointer , gpointer); +static void ed_copy_gradient_callback (GtkWidget *, gpointer); +static void ed_do_copy_gradient_callback (GtkWidget *, gpointer , gpointer); static void ed_delete_gradient_callback (GtkWidget *, gpointer); static void ed_do_delete_gradient_callback (GtkWidget *, gpointer); @@ -224,12 +219,18 @@ static gint ed_delete_delete_gradient_callback (GtkWidget *, GdkEvent *, static void ed_rename_gradient_callback (GtkWidget *, gpointer); static void ed_do_rename_gradient_callback (GtkWidget *, gpointer, gpointer); -static void ed_save_pov_callback (GtkWidget *, gpointer); -static void ed_do_save_pov_callback (GtkWidget *, gpointer); -static void ed_cancel_save_pov_callback (GtkWidget *, gpointer); +static void ed_save_pov_callback (GtkWidget *, gpointer); +static void ed_do_save_pov_callback (GtkWidget *, gpointer); +static void ed_cancel_save_pov_callback (GtkWidget *, gpointer); +static gint ed_delete_save_pov_callback (GtkWidget *, GdkEvent *, gpointer); -static void ed_save_grads_callback (GtkWidget *, gpointer); -static void ed_refresh_grads_callback (GtkWidget *, gpointer); +static void ed_save_grads_callback (GtkWidget *, gpointer); +static void ed_refresh_grads_callback (GtkWidget *, gpointer); + +static gint ed_delete_callback (GtkWidget *, GdkEvent *, gpointer); +static void ed_close_callback (GtkWidget *, gpointer); + +/* Zoom, scrollbar & instant update callbacks */ static void ed_scrollbar_update (GtkAdjustment *, gpointer); static void ed_zoom_all_callback (GtkWidget *, gpointer); @@ -239,354 +240,421 @@ static void ed_instant_update_update (GtkWidget *, gpointer); /* Gradient preview functions */ -static gint prev_events(GtkWidget *widget, GdkEvent *event); -static void prev_set_hint(gint x); +static gint prev_events (GtkWidget *, GdkEvent *, gpointer); +static void prev_set_hint (gint x); static void prev_set_foreground (gint x); static void prev_set_background (gint x); -static void prev_update(int recalculate); -static void prev_fill_image(int width, int height, double left, double right); +static void prev_update (gboolean recalculate); +static void prev_fill_image (int width, int height, + double left, double right); /* Gradient control functions */ -static gint control_events(GtkWidget *widget, GdkEvent *event); -static void control_do_hint(gint x, gint y); -static void control_button_press(gint x, gint y, guint button, guint state); -static int control_point_in_handle(gint x, gint y, grad_segment_t *seg, control_drag_mode_t handle); -static void control_select_single_segment(grad_segment_t *seg); -static void control_extend_selection(grad_segment_t *seg, double pos); -static void control_motion(gint x); - -static void control_compress_left(grad_segment_t *range_l, grad_segment_t *range_r, - grad_segment_t *drag_seg, double pos); -static void control_compress_range(grad_segment_t *range_l, grad_segment_t *range_r, - double new_l, double new_r); - -static double control_move(grad_segment_t *range_l, grad_segment_t *range_r, double delta); - -static void control_update(int recalculate); -static void control_draw(GdkPixmap *pixmap, int width, int height, double left, double right); -static void control_draw_normal_handle(GdkPixmap *pixmap, double pos, int height); -static void control_draw_middle_handle(GdkPixmap *pixmap, double pos, int height); -static void control_draw_handle(GdkPixmap *pixmap, GdkGC *border_gc, GdkGC *fill_gc, int xpos, int height); -static int control_calc_p_pos(double pos); -static double control_calc_g_pos(int pos); +static gint control_events (GtkWidget *, GdkEvent *, gpointer); +static void control_do_hint (gint x, gint y); +static void control_button_press (gint x, gint y, + guint button, guint state); +static int control_point_in_handle (gint x, gint y, grad_segment_t *seg, + control_drag_mode_t handle); +static void control_select_single_segment (grad_segment_t *seg); +static void control_extend_selection (grad_segment_t *seg, double pos); +static void control_motion (gint x); + +static void control_compress_left (grad_segment_t *range_l, + grad_segment_t *range_r, + grad_segment_t *drag_seg, + double pos); +static void control_compress_range (grad_segment_t *range_l, + grad_segment_t *range_r, + double new_l, double new_r); + +static double control_move (grad_segment_t *range_l, + grad_segment_t *range_r, + double delta); + +/* Control update/redraw functions */ + +static void control_update (gboolean recalculate); +static void control_draw (GdkPixmap *pixmap, + int width, int height, + double left, double right); +static void control_draw_normal_handle (GdkPixmap *pixmap, + double pos, int height); +static void control_draw_middle_handle (GdkPixmap *pixmap, + double pos, int height); +static void control_draw_handle (GdkPixmap *pixmap, + GdkGC *border_gc, GdkGC *fill_gc, + int xpos, int height); + +static int control_calc_p_pos (double pos); +static double control_calc_g_pos (int pos); /* Control popup functions */ -static void cpopup_create_main_menu(void); -static void cpopup_do_popup(void); -static GtkWidget *cpopup_create_color_item(GtkWidget **color_box, GtkWidget **label); -static void cpopup_adjust_menus(void); -static void cpopup_adjust_blending_menu(void); -static void cpopup_adjust_coloring_menu(void); -static void cpopup_check_selection_params(int *equal_blending, int *equal_coloring); -static GtkWidget *cpopup_create_menu_item_with_label(char *str, GtkWidget **label); -static void cpopup_render_color_box(GtkPreview *preview, double r, double g, double b, double a); - -static GtkWidget *cpopup_create_load_menu(GtkWidget **color_boxes, GtkWidget **labels, - char *label1, char *label2, GtkSignalFunc callback, - gchar accel_key_0, guint8 accel_mods_0, - gchar accel_key_1, guint8 accel_mods_1, - gchar accel_key_2, guint8 accel_mods_2); -static GtkWidget *cpopup_create_save_menu(GtkWidget **color_boxes, GtkWidget **labels, GtkSignalFunc callback); -static void cpopup_update_saved_color(int n, double r, double g, double b, double a); -static void cpopup_load_left_callback(GtkWidget *widget, gpointer data); -static void cpopup_save_left_callback(GtkWidget *widget, gpointer data); -static void cpopup_load_right_callback(GtkWidget *widget, gpointer data); -static void cpopup_save_right_callback(GtkWidget *widget, gpointer data); - -static GtkWidget *cpopup_create_blending_menu(void); -static void cpopup_blending_callback(GtkWidget *widget, gpointer data); -static GtkWidget *cpopup_create_coloring_menu(void); -static void cpopup_coloring_callback(GtkWidget *widget, gpointer data); - -static GtkWidget *cpopup_create_sel_ops_menu(void); - -static void cpopup_blend_colors(GtkWidget *widget, gpointer data); -static void cpopup_blend_opacity(GtkWidget *widget, gpointer data); - -static void cpopup_set_color_selection_color(GtkColorSelection *cs, - double r, double g, double b, double a); -static void cpopup_get_color_selection_color(GtkColorSelection *cs, - double *r, double *g, double *b, double *a); - -static void cpopup_create_color_dialog(char *title, double r, double g, double b, double a, - GtkSignalFunc color_changed_callback, - GtkSignalFunc ok_callback, - GtkSignalFunc cancel_callback, - GtkSignalFunc delete_callback); - -static grad_segment_t *cpopup_save_selection(void); -static void cpopup_free_selection(grad_segment_t *seg); -static void cpopup_replace_selection(grad_segment_t *replace_seg); - -static void cpopup_set_left_color_callback(GtkWidget *widget, gpointer data); -static void cpopup_left_color_changed(GtkWidget *widget, gpointer client_data); -static void cpopup_left_color_dialog_ok(GtkWidget *widget, gpointer client_data); -static void cpopup_left_color_dialog_cancel(GtkWidget *widget, gpointer client_data); -static int cpopup_left_color_dialog_delete(GtkWidget *widget, GdkEvent *event, gpointer data); -static void cpopup_set_right_color_callback(GtkWidget *widget, gpointer data); -static void cpopup_right_color_changed(GtkWidget *widget, gpointer client_data); -static void cpopup_right_color_dialog_ok(GtkWidget *widget, gpointer client_data); -static void cpopup_right_color_dialog_cancel(GtkWidget *widget, gpointer client_data); -static int cpopup_right_color_dialog_delete(GtkWidget *widget, GdkEvent *event, gpointer data); - -static void cpopup_split_midpoint_callback(GtkWidget *widget, gpointer data); -static void cpopup_split_uniform_callback(GtkWidget *widget, gpointer data); -static void cpopup_delete_callback(GtkWidget *widget, gpointer data); -static void cpopup_recenter_callback(GtkWidget *widget, gpointer data); -static void cpopup_redistribute_callback(GtkWidget *widget, gpointer data); -static void cpopup_flip_callback(GtkWidget *widget, gpointer data); -static void cpopup_replicate_callback(GtkWidget *widget, gpointer data); - -static void cpopup_split_uniform_scale_update(GtkAdjustment *adjustment, gpointer data); -static void cpopup_split_uniform_split_callback(GtkWidget *widget, gpointer client_data); -static void cpopup_split_uniform_cancel_callback(GtkWidget *widget, gpointer client_data); - -static void cpopup_replicate_scale_update(GtkAdjustment *adjustment, gpointer data); -static void cpopup_do_replicate_callback(GtkWidget *widget, gpointer client_data); -static void cpopup_replicate_cancel_callback(GtkWidget *widget, gpointer client_data); - -static void cpopup_blend_endpoints(double r0, double g0, double b0, double a0, - double r1, double g1, double b1, double a1, - int blend_colors, int blend_opacity); -static void cpopup_split_midpoint(grad_segment_t *lseg, grad_segment_t **newl, grad_segment_t **newr); -static void cpopup_split_uniform(grad_segment_t *lseg, int parts, - grad_segment_t **newl, grad_segment_t **newr); +static void cpopup_create_main_menu (void); +static void cpopup_do_popup (void); + +static GtkWidget *cpopup_create_color_item (GtkWidget **color_box, + GtkWidget **label); +static GtkWidget *cpopup_create_menu_item_with_label (gchar *str, + GtkWidget **label); + +static void cpopup_adjust_menus (void); +static void cpopup_adjust_blending_menu (void); +static void cpopup_adjust_coloring_menu (void); +static void cpopup_check_selection_params (gint *equal_blending, + gint *equal_coloring); + +static void cpopup_render_color_box (GtkPreview *preview, + double r, double g, double b, double a); + +static GtkWidget *cpopup_create_load_menu (GtkWidget **color_boxes, + GtkWidget **labels, + gchar *label1, gchar *label2, + GtkSignalFunc callback, + gchar accel_key_0, + guint8 accel_mods_0, + gchar accel_key_1, + guint8 accel_mods_1, + gchar accel_key_2, + guint8 accel_mods_2); +static GtkWidget *cpopup_create_save_menu (GtkWidget **color_boxes, + GtkWidget **labels, + GtkSignalFunc callback); + +static void cpopup_update_saved_color (int n, + double r, double g, double b, double a); + +static void cpopup_load_left_callback (GtkWidget *, gpointer); +static void cpopup_save_left_callback (GtkWidget *, gpointer); +static void cpopup_load_right_callback (GtkWidget *, gpointer); +static void cpopup_save_right_callback (GtkWidget *, gpointer); + +static void cpopup_set_color_selection_color (GtkColorSelection *cs, + double r, double g, + double b, double a); +static void cpopup_get_color_selection_color (GtkColorSelection *cs, + double *r, double *g, + double *b, double *a); + +static grad_segment_t *cpopup_save_selection (void); +static void cpopup_free_selection (grad_segment_t *seg); +static void cpopup_replace_selection (grad_segment_t *replace_seg); + +/* ----- */ + +static void cpopup_create_color_dialog (gchar *title, + double r, double g, double b, double a, + GtkSignalFunc color_changed_callback, + GtkSignalFunc ok_callback, + GtkSignalFunc cancel_callback, + GtkSignalFunc delete_callback); + +static void cpopup_set_left_color_callback (GtkWidget *, gpointer); +static void cpopup_left_color_changed (GtkWidget *, gpointer); +static void cpopup_left_color_dialog_ok (GtkWidget *, gpointer); +static void cpopup_left_color_dialog_cancel (GtkWidget *, gpointer); +static int cpopup_left_color_dialog_delete (GtkWidget *, GdkEvent *, + gpointer); + +static void cpopup_set_right_color_callback (GtkWidget *, gpointer); +static void cpopup_right_color_changed (GtkWidget *, gpointer); +static void cpopup_right_color_dialog_ok (GtkWidget *, gpointer); +static void cpopup_right_color_dialog_cancel (GtkWidget *, gpointer); +static int cpopup_right_color_dialog_delete (GtkWidget *, GdkEvent *, + gpointer); + +/* ----- */ + +static GtkWidget *cpopup_create_blending_menu (void); +static void cpopup_blending_callback (GtkWidget *, gpointer); +static GtkWidget *cpopup_create_coloring_menu (void); +static void cpopup_coloring_callback (GtkWidget *, gpointer); + +/* ----- */ + +static void cpopup_split_midpoint_callback (GtkWidget *, gpointer); +static void cpopup_split_midpoint (grad_segment_t *lseg, grad_segment_t **newl, + grad_segment_t **newr); + +static void cpopup_split_uniform_callback (GtkWidget *, gpointer); +static void cpopup_split_uniform_scale_update (GtkAdjustment *, gpointer); +static void cpopup_split_uniform_split_callback (GtkWidget *, gpointer); +static void cpopup_split_uniform_cancel_callback (GtkWidget *, gpointer); +static gint cpopup_split_uniform_delete_callback (GtkWidget *, GdkEvent *, + gpointer); +static void cpopup_split_uniform (grad_segment_t *lseg, int parts, + grad_segment_t **newl, grad_segment_t **newr); + +static void cpopup_delete_callback (GtkWidget *, gpointer); +static void cpopup_recenter_callback (GtkWidget *, gpointer); +static void cpopup_redistribute_callback (GtkWidget *, gpointer); + +/* Control popup -> Selection operations functions */ + +static GtkWidget * cpopup_create_sel_ops_menu (void); + +static void cpopup_flip_callback (GtkWidget *, gpointer); + +static void cpopup_replicate_callback (GtkWidget *, gpointer); +static void cpopup_replicate_scale_update (GtkAdjustment *, gpointer); +static void cpopup_do_replicate_callback (GtkWidget *, gpointer); +static void cpopup_replicate_cancel_callback (GtkWidget *, gpointer); +static gint cpopup_replicate_delete_callback (GtkWidget *, GdkEvent *, + gpointer); + +static void cpopup_blend_colors (GtkWidget *, gpointer); +static void cpopup_blend_opacity (GtkWidget *, gpointer); + +/* Blend function */ + +static void cpopup_blend_endpoints (double r0, double g0, double b0, double a0, + double r1, double g1, double b1, double a1, + int blend_colors, int blend_opacity); /* Gradient functions */ -static gradient_t *grad_new_gradient(void); -static void grad_free_gradient(gradient_t *grad); -static void grad_free_gradients(void); -static void grad_load_gradient(char *filename); -static void grad_save_gradient(gradient_t *grad, char *filename); -static void grad_save_all(int need_free); +static gradient_t *grad_new_gradient (void); +static void grad_free_gradient (gradient_t *grad); +static void grad_free_gradients (void); +static void grad_load_gradient (char *filename); +static void grad_save_gradient (gradient_t *grad, + char *filename); +static void grad_save_all (int need_free); -static gradient_t *grad_create_default_gradient(void); +static gradient_t *grad_create_default_gradient (void); -static int grad_insert_in_gradients_list(gradient_t *grad); +static int grad_insert_in_gradients_list (gradient_t *grad); -static void grad_dump_gradient(gradient_t *grad, FILE *file); +static void grad_dump_gradient (gradient_t *grad, FILE *file); /* Segment functions */ -static grad_segment_t *seg_new_segment(void); -static void seg_free_segment(grad_segment_t *seg); -static void seg_free_segments(grad_segment_t *seg); +static grad_segment_t *seg_new_segment (void); +static void seg_free_segment (grad_segment_t *seg); +static void seg_free_segments (grad_segment_t *seg); -static grad_segment_t *seg_get_segment_at(gradient_t *grad, double pos); -static grad_segment_t *seg_get_last_segment(grad_segment_t *seg); -static void seg_get_closest_handle(gradient_t *grad, double pos, - grad_segment_t **seg, control_drag_mode_t *handle); +static grad_segment_t *seg_get_segment_at (gradient_t *grad, double pos); +static grad_segment_t *seg_get_last_segment (grad_segment_t *seg); +static void seg_get_closest_handle (gradient_t *grad, double pos, + grad_segment_t **seg, + control_drag_mode_t *handle); /* Calculation functions */ -static double calc_linear_factor(double middle, double pos); -static double calc_curved_factor(double middle, double pos); -static double calc_sine_factor(double middle, double pos); -static double calc_sphere_increasing_factor(double middle, double pos); -static double calc_sphere_decreasing_factor(double middle, double pos); +static double calc_linear_factor (double middle, double pos); +static double calc_curved_factor (double middle, double pos); +static double calc_sine_factor (double middle, double pos); +static double calc_sphere_increasing_factor (double middle, double pos); +static double calc_sphere_decreasing_factor (double middle, double pos); -static void calc_rgb_to_hsv(double *r, double *g, double *b); -static void calc_hsv_to_rgb(double *h, double *s, double *v); +static void calc_rgb_to_hsv (double *r, double *g, double *b); +static void calc_hsv_to_rgb (double *h, double *s, double *v); /* Files and paths functions */ -static char *build_user_filename(char *name, char *path_str); - +static gchar *build_user_filename (char *name, char *path_str); /***** Local variables *****/ -GdkColor black; -int num_gradients = 0; -gradient_t *curr_gradient = NULL; /* The active gradient */ -GSList *gradients_list = NULL; /* The list of gradients */ -gradient_t *grad_default_gradient = NULL; -gradient_editor_t *g_editor = NULL; /* The gradient editor */ - -static const char *blending_types[] = { - N_("Linear"), - N_("Curved"), - N_("Sinusoidal"), - N_("Spherical (increasing)"), - N_("Spherical (decreasing)") -}; /* blending_types */ +GdkColor black; +gint num_gradients = 0; +gradient_t * curr_gradient = NULL; /* The active gradient */ +GSList * gradients_list = NULL; /* The list of gradients */ +gradient_t * grad_default_gradient = NULL; +gradient_editor_t * g_editor = NULL; /* The gradient editor */ -static const char *coloring_types[] = { - N_("Plain RGB"), - N_("HSV (counter-clockwise hue)"), - N_("HSV (clockwise hue)") -}; /* coloring_types */ +static const gchar *blending_types[] = +{ + N_("Linear"), + N_("Curved"), + N_("Sinusoidal"), + N_("Spherical (increasing)"), + N_("Spherical (decreasing)") +}; +static const gchar *coloring_types[] = +{ + N_("Plain RGB"), + N_("HSV (counter-clockwise hue)"), + N_("HSV (clockwise hue)") +}; /***** Public functions *****/ /*****/ void -gradients_init(int no_data) +gradients_init (int no_data) { - if(!no_data) - datafiles_read_directories(gradient_path, grad_load_gradient, 0); + if (!no_data) + datafiles_read_directories (gradient_path, grad_load_gradient, 0); if (grad_default_gradient != NULL) curr_gradient = grad_default_gradient; else if (gradients_list != NULL) curr_gradient = (gradient_t *) gradients_list->data; - else { - curr_gradient = grad_create_default_gradient(); - curr_gradient->name = g_strdup(_("Default")); - curr_gradient->filename = build_user_filename(curr_gradient->name, gradient_path); - curr_gradient->dirty = FALSE; - - grad_insert_in_gradients_list(curr_gradient); - } /* else */ -} /* gradients_init */ + else + { + curr_gradient = grad_create_default_gradient (); + curr_gradient->name = g_strdup (_("Default")); + curr_gradient->filename = + build_user_filename (curr_gradient->name, gradient_path); + curr_gradient->dirty = FALSE; + grad_insert_in_gradients_list (curr_gradient); + } +} /*****/ void -gradients_free(void) +gradients_free (void) { - grad_free_gradients(); -} /* gradients_free */ - + grad_free_gradients (); +} /*****/ void -grad_get_color_at(double pos, double *r, double *g, double *b, double *a) +grad_get_color_at (double pos, + double *r, double *g, double *b, double *a) { - double factor; - grad_segment_t *seg; - double seg_len, middle; - double h0, s0, v0; - double h1, s1, v1; - - /* if there is no gradient return a totally transparent black */ - if (curr_gradient == NULL) - { - r = 0; g = 0; b = 0; a = 0; - return; - } - - if (pos < 0.0) - pos = 0.0; - else if (pos > 1.0) - pos = 1.0; - - seg = seg_get_segment_at(curr_gradient, pos); - - seg_len = seg->right - seg->left; - - if (seg_len < EPSILON) { - middle = 0.5; - pos = 0.5; - } else { - middle = (seg->middle - seg->left) / seg_len; - pos = (pos - seg->left) / seg_len; - } /* else */ + double factor = 0.0; + grad_segment_t *seg; + double seg_len, middle; + double h0, s0, v0; + double h1, s1, v1; - switch (seg->type) { - case GRAD_LINEAR: - factor = calc_linear_factor(middle, pos); - break; + /* if there is no gradient return a totally transparent black */ + if (curr_gradient == NULL) + { + r = 0; g = 0; b = 0; a = 0; + return; + } - case GRAD_CURVED: - factor = calc_curved_factor(middle, pos); - break; + if (pos < 0.0) + pos = 0.0; + else if (pos > 1.0) + pos = 1.0; - case GRAD_SINE: - factor = calc_sine_factor(middle, pos); - break; + seg = seg_get_segment_at (curr_gradient, pos); - case GRAD_SPHERE_INCREASING: - factor = calc_sphere_increasing_factor(middle, pos); - break; + seg_len = seg->right - seg->left; - case GRAD_SPHERE_DECREASING: - factor = calc_sphere_decreasing_factor(middle, pos); - break; + if (seg_len < EPSILON) + { + middle = 0.5; + pos = 0.5; + } + else + { + middle = (seg->middle - seg->left) / seg_len; + pos = (pos - seg->left) / seg_len; + } - default: - grad_dump_gradient (curr_gradient, stderr); - gimp_fatal_error (_("grad_get_color_at(): Unknown gradient type %d"), - (int) seg->type); - factor = 0.0; /* Shut up -Wall */ - break; - } /* switch */ + switch (seg->type) + { + case GRAD_LINEAR: + factor = calc_linear_factor (middle, pos); + break; + + case GRAD_CURVED: + factor = calc_curved_factor (middle, pos); + break; + + case GRAD_SINE: + factor = calc_sine_factor (middle, pos); + break; + + case GRAD_SPHERE_INCREASING: + factor = calc_sphere_increasing_factor (middle, pos); + break; + + case GRAD_SPHERE_DECREASING: + factor = calc_sphere_decreasing_factor (middle, pos); + break; + + default: + grad_dump_gradient (curr_gradient, stderr); + gimp_fatal_error (_("grad_get_color_at(): Unknown gradient type %d"), + (int) seg->type); + break; + } - /* Calculate color components */ + /* Calculate color components */ - *a = seg->a0 + (seg->a1 - seg->a0) * factor; + *a = seg->a0 + (seg->a1 - seg->a0) * factor; - if (seg->color == GRAD_RGB) { - *r = seg->r0 + (seg->r1 - seg->r0) * factor; - *g = seg->g0 + (seg->g1 - seg->g0) * factor; - *b = seg->b0 + (seg->b1 - seg->b0) * factor; - } else { - h0 = seg->r0; - s0 = seg->g0; - v0 = seg->b0; - - h1 = seg->r1; - s1 = seg->g1; - v1 = seg->b1; - - calc_rgb_to_hsv(&h0, &s0, &v0); - calc_rgb_to_hsv(&h1, &s1, &v1); - - s0 = s0 + (s1 - s0) * factor; - v0 = v0 + (v1 - v0) * factor; - - switch (seg->color) { - case GRAD_HSV_CCW: - if (h0 < h1) - h0 = h0 + (h1 - h0) * factor; - else { - h0 = h0 + (1.0 - (h0 - h1)) * factor; - if (h0 > 1.0) - h0 -= 1.0; - } /* else */ + if (seg->color == GRAD_RGB) + { + *r = seg->r0 + (seg->r1 - seg->r0) * factor; + *g = seg->g0 + (seg->g1 - seg->g0) * factor; + *b = seg->b0 + (seg->b1 - seg->b0) * factor; + } + else + { + h0 = seg->r0; + s0 = seg->g0; + v0 = seg->b0; - break; + h1 = seg->r1; + s1 = seg->g1; + v1 = seg->b1; - case GRAD_HSV_CW: - if (h1 < h0) - h0 = h0 - (h0 - h1) * factor; - else { - h0 = h0 - (1.0 - (h1 - h0)) * factor; - if (h0 < 0.0) - h0 += 1.0; - } /* else */ + calc_rgb_to_hsv(&h0, &s0, &v0); + calc_rgb_to_hsv(&h1, &s1, &v1); - break; + s0 = s0 + (s1 - s0) * factor; + v0 = v0 + (v1 - v0) * factor; - default: - grad_dump_gradient (curr_gradient, stderr); - gimp_fatal_error (_("grad_get_color_at(): Unknown coloring mode %d"), - (int) seg->color); - break; - } /* switch */ + switch (seg->color) + { + case GRAD_HSV_CCW: + if (h0 < h1) + h0 = h0 + (h1 - h0) * factor; + else + { + h0 = h0 + (1.0 - (h0 - h1)) * factor; + if (h0 > 1.0) + h0 -= 1.0; + } + break; + + case GRAD_HSV_CW: + if (h1 < h0) + h0 = h0 - (h0 - h1) * factor; + else + { + h0 = h0 - (1.0 - (h1 - h0)) * factor; + if (h0 < 0.0) + h0 += 1.0; + } + break; + + default: + grad_dump_gradient (curr_gradient, stderr); + gimp_fatal_error (_("grad_get_color_at(): Unknown coloring mode %d"), + (int) seg->color); + break; + } - *r = h0; - *g = s0; - *b = v0; + *r = h0; + *g = s0; + *b = v0; - calc_hsv_to_rgb(r, g, b); - } /* else */ -} /* grad_get_color_at */ + calc_hsv_to_rgb (r, g, b); + } +} +/***** The main gradient editor dialog *****/ /*****/ - void grad_create_gradient_editor_init (gint need_show) { @@ -597,6 +665,10 @@ grad_create_gradient_editor_init (gint need_show) GtkWidget *frame; GtkWidget *scrolled_win; GdkColormap *colormap; + GtkWidget* pixmapwid; + GdkPixmap* pixmap; + GdkBitmap* mask; + GtkStyle* style; gint i; gint select_pos; @@ -631,10 +703,11 @@ grad_create_gradient_editor_init (gint need_show) /* Shell and main vbox */ g_editor->shell = gtk_dialog_new (); - gtk_window_set_wmclass (GTK_WINDOW (g_editor->shell), "gradient_editor", "Gimp"); + gtk_window_set_wmclass (GTK_WINDOW (g_editor->shell), + "gradient_editor", "Gimp"); gtk_window_set_title (GTK_WINDOW (g_editor->shell), _("Gradient Editor")); - /* handle window manager close signals */ + /* Handle the wm delete event */ gtk_signal_connect (GTK_OBJECT (g_editor->shell), "delete_event", GTK_SIGNAL_FUNC (ed_delete_callback), NULL); @@ -690,56 +763,85 @@ grad_create_gradient_editor_init (gint need_show) /* Buttons for gradient functions */ button = ed_create_button (_("New Gradient"), 0.5, 0.5, (GtkSignalFunc) ed_new_gradient_callback, NULL); + GTK_WIDGET_UNSET_FLAGS (button, GTK_RECEIVES_DEFAULT); gtk_box_pack_start (GTK_BOX (gvbox), button, FALSE, FALSE, 0); gtk_widget_show (button); button = ed_create_button (_("Copy Gradient"), 0.5, 0.5, (GtkSignalFunc) ed_copy_gradient_callback, NULL); + GTK_WIDGET_UNSET_FLAGS (button, GTK_RECEIVES_DEFAULT); gtk_box_pack_start (GTK_BOX (gvbox), button, FALSE, FALSE, 0); gtk_widget_show (button); button = ed_create_button (_("Delete Gradient"), 0.5, 0.5, (GtkSignalFunc) ed_delete_gradient_callback, NULL); + GTK_WIDGET_UNSET_FLAGS (button, GTK_RECEIVES_DEFAULT); gtk_box_pack_start (GTK_BOX (gvbox), button, FALSE, FALSE, 0); gtk_widget_show (button); button = ed_create_button (_("Rename Gradient"), 0.5, 0.5, (GtkSignalFunc) ed_rename_gradient_callback, NULL); + GTK_WIDGET_UNSET_FLAGS (button, GTK_RECEIVES_DEFAULT); gtk_box_pack_start (GTK_BOX (gvbox), button, FALSE, FALSE, 0); gtk_widget_show (button); button = ed_create_button (_("Save as POV-Ray"), 0.5, 0.5, (GtkSignalFunc) ed_save_pov_callback, NULL); + GTK_WIDGET_UNSET_FLAGS (button, GTK_RECEIVES_DEFAULT); gtk_box_pack_start (GTK_BOX (gvbox), button, FALSE, FALSE, 0); gtk_widget_show (button); gtk_widget_show (gvbox); gtk_widget_show (frame); - /* Horizontal box for zoom controls, scrollbar, and instant update toggle */ - + /* Horizontal box for zoom controls, scrollbar and instant update toggle */ hbox = gtk_hbox_new (FALSE, 4); gtk_container_set_border_width (GTK_CONTAINER (hbox), 0); gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0); gtk_widget_show (hbox); - /* Zoom buttons */ + /* Zoom all button */ button = ed_create_button (_("Zoom all"), 0.5, 0.5, (GtkSignalFunc) ed_zoom_all_callback, g_editor); + GTK_WIDGET_UNSET_FLAGS (button, GTK_RECEIVES_DEFAULT); gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0); gtk_widget_show (button); - button = ed_create_button (_("Zoom -"), 0.5, 0.5, - (GtkSignalFunc) ed_zoom_out_callback, g_editor); + /* + and - buttons */ + gtk_widget_realize (g_editor->shell); + style = gtk_widget_get_style (g_editor->shell); + + button = gtk_button_new (); + GTK_WIDGET_UNSET_FLAGS (button, GTK_RECEIVES_DEFAULT); + gtk_signal_connect (GTK_OBJECT (button), "clicked", + GTK_SIGNAL_FUNC (ed_zoom_in_callback), + (gpointer) g_editor); gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0); - gtk_widget_show(button); - button = ed_create_button (_("Zoom +"), 0.5, 0.5, - (GtkSignalFunc) ed_zoom_in_callback, g_editor); + pixmap = gdk_pixmap_create_from_xpm_d (g_editor->shell->window, &mask, + &style->bg[GTK_STATE_NORMAL], + zoom_in_xpm); + pixmapwid = gtk_pixmap_new (pixmap, mask); + gtk_container_add (GTK_CONTAINER (button), pixmapwid); + gtk_widget_show (pixmapwid); + gtk_widget_show (button); + + button = gtk_button_new (); + GTK_WIDGET_UNSET_FLAGS (button, GTK_RECEIVES_DEFAULT); + gtk_signal_connect (GTK_OBJECT (button), "clicked", + GTK_SIGNAL_FUNC (ed_zoom_out_callback), + (gpointer) g_editor); gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0); + + pixmap = gdk_pixmap_create_from_xpm_d (g_editor->shell->window, &mask, + &style->bg[GTK_STATE_NORMAL], + zoom_out_xpm); + pixmapwid = gtk_pixmap_new (pixmap, mask); + gtk_container_add (GTK_CONTAINER (button), pixmapwid); + gtk_widget_show (pixmapwid); gtk_widget_show (button); - /* Scrollbar */ + /* Scrollbar */ g_editor->zoom_factor = 1; g_editor->scroll_data = gtk_adjustment_new (0.0, 0.0, 1.0, @@ -772,18 +874,10 @@ grad_create_gradient_editor_init (gint need_show) gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE); gtk_widget_show (button); - /* hbox for that holds the frame for gradient preview and gradient control; - * this is only here, because resizing the preview doesn't work - * (and is disabled) to keep the preview and controls together - */ - hbox = gtk_hbox_new (FALSE, 0); - gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0); - gtk_widget_show (hbox); - /* Frame for gradient preview and gradient control */ frame = gtk_frame_new (NULL); gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN); - gtk_box_pack_start (GTK_BOX (hbox), frame, FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0); gtk_widget_show (frame); gvbox = gtk_vbox_new (FALSE, 0); @@ -798,13 +892,18 @@ grad_create_gradient_editor_init (gint need_show) g_editor->preview_button_down = 0; g_editor->preview = gtk_preview_new (GTK_PREVIEW_COLOR); - gtk_preview_set_dither (GTK_PREVIEW (g_editor->preview), - GDK_RGB_DITHER_MAX); + gtk_preview_set_dither (GTK_PREVIEW (g_editor->preview), GDK_RGB_DITHER_MAX); gtk_preview_size (GTK_PREVIEW (g_editor->preview), GRAD_PREVIEW_WIDTH, GRAD_PREVIEW_HEIGHT); + + /* Enable auto-resizing of the preview but ensure a minimal size */ + gtk_widget_set_usize (g_editor->preview, + GRAD_PREVIEW_WIDTH, GRAD_PREVIEW_HEIGHT); + gtk_preview_set_expand (GTK_PREVIEW (g_editor->preview), TRUE); + gtk_widget_set_events (g_editor->preview, GRAD_PREVIEW_EVENT_MASK); gtk_signal_connect (GTK_OBJECT(g_editor->preview), "event", - (GtkSignalFunc) prev_events, + (GdkEventFunc) prev_events, g_editor); gtk_box_pack_start (GTK_BOX (gvbox), g_editor->preview, TRUE, TRUE, 0); gtk_widget_show (g_editor->preview); @@ -861,9 +960,9 @@ grad_create_gradient_editor_init (gint need_show) GRAD_PREVIEW_WIDTH, GRAD_CONTROL_HEIGHT); gtk_widget_set_events (g_editor->control, GRAD_CONTROL_EVENT_MASK); gtk_signal_connect (GTK_OBJECT (g_editor->control), "event", - (GtkSignalFunc) control_events, + (GdkEventFunc) control_events, g_editor); - gtk_box_pack_start (GTK_BOX (gvbox), g_editor->control, FALSE, TRUE, 0); + gtk_box_pack_start (GTK_BOX (gvbox), g_editor->control, TRUE, TRUE, 0); gtk_widget_show (g_editor->control); /* Hint bar and close button */ @@ -888,7 +987,6 @@ grad_create_gradient_editor_init (gint need_show) cpopup_create_main_menu(); /* Show everything */ - gtk_widget_realize (g_editor->shell); g_editor->gc = gdk_gc_new (g_editor->shell->window); select_pos = ed_set_list_of_gradients (g_editor->gc, g_editor->clist, @@ -907,105 +1005,112 @@ grad_create_gradient_editor_init (gint need_show) /*****/ static void -ed_fetch_foreground(double *fg_r, double *fg_g, double *fg_b, double *fg_a) +ed_fetch_foreground (double *fg_r, double *fg_g, double *fg_b, double *fg_a) { - unsigned char r, g, b; + guchar r, g, b; - palette_get_foreground (&r, &g, &b); + palette_get_foreground (&r, &g, &b); - *fg_r = (double) r / 255.0; - *fg_g = (double) g / 255.0; - *fg_b = (double) b / 255.0; - *fg_a = 1.0; /* opacity 100 % */ -} /* ed_fetch_foreground */ - + *fg_r = (double) r / 255.0; + *fg_g = (double) g / 255.0; + *fg_b = (double) b / 255.0; + *fg_a = 1.0; /* opacity 100 % */ +} /*****/ static void -ed_update_editor(int flags) +ed_update_editor (int flags) { - if (flags & GRAD_UPDATE_PREVIEW) - prev_update(1); - - if (flags & GRAD_UPDATE_CONTROL) - control_update(0); + if (flags & GRAD_UPDATE_PREVIEW) + prev_update (TRUE); - if (flags & GRAD_RESET_CONTROL) - control_update(1); -} /* ed_update_editor */ + if (flags & GRAD_UPDATE_CONTROL) + control_update(FALSE); + if (flags & GRAD_RESET_CONTROL) + control_update (TRUE); +} /*****/ static GtkWidget * -ed_create_button(gchar *label, double xalign, double yalign, GtkSignalFunc signal_func, gpointer user_data) +ed_create_button (gchar *label, + double xalign, + double yalign, + GtkSignalFunc signal_func, + gpointer user_data) { - GtkWidget *button; - GtkWidget *text; - - button = gtk_button_new(); - text = gtk_label_new(gettext(label)); + GtkWidget *button; + GtkWidget *text; - gtk_misc_set_alignment(GTK_MISC(text), xalign, yalign); - gtk_container_add(GTK_CONTAINER(button), text); - gtk_widget_show(text); + button = gtk_button_new (); + text = gtk_label_new (label); - if (signal_func != NULL) - gtk_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC (signal_func), user_data); + gtk_misc_set_alignment (GTK_MISC (text), xalign, yalign); + gtk_misc_set_padding (GTK_MISC (text), 4, 0); + gtk_container_add (GTK_CONTAINER (button), text); + gtk_widget_show (text); - return button; -} /* ed_create_button */ + if (signal_func != NULL) + gtk_signal_connect (GTK_OBJECT (button), "clicked", + (GtkSignalFunc) signal_func, + user_data); + return button; +} /*****/ static void -ed_set_hint(char *str) +ed_set_hint (gchar *str) { - gtk_label_set(GTK_LABEL(g_editor->hint_label), gettext(str)); - gdk_flush(); -} /* ed_set_hint */ - + gtk_label_set_text (GTK_LABEL (g_editor->hint_label), str); + gdk_flush(); +} /*****/ gint -ed_set_list_of_gradients(GdkGC *gc, GtkWidget *clist,gradient_t *sel_gradient) +ed_set_list_of_gradients (GdkGC *gc, + GtkWidget *clist, + gradient_t *sel_gradient) { - GSList *list; - gradient_t *grad; - int n; - int select_pos = -1; - - list = gradients_list; - n = 0; + GSList *list; + gradient_t *grad; + gint n; + gint select_pos = -1; - if(sel_gradient == NULL) - sel_gradient = curr_gradient; + list = gradients_list; + n = 0; - gtk_clist_freeze(GTK_CLIST(clist)); + if (sel_gradient == NULL) + sel_gradient = curr_gradient; - while (list) { - grad = list->data; + gtk_clist_freeze (GTK_CLIST (clist)); - if (grad == sel_gradient) { - ed_insert_in_gradients_listbox(gc,clist,grad, n, 1); - select_pos = n; - } - else { - ed_insert_in_gradients_listbox(gc,clist,grad, n, 0); - } + while (list) + { + grad = list->data; - list = g_slist_next(list); - n++; - } /* while */ + if (grad == sel_gradient) + { + ed_insert_in_gradients_listbox (gc, clist, grad, n, 1); + select_pos = n; + } + else + { + ed_insert_in_gradients_listbox (gc, clist, grad, n, 0); + } - gtk_clist_thaw(GTK_CLIST(clist)); + list = g_slist_next (list); + n++; + } - return select_pos; -} /* ed_set_list_of_gradients */ + gtk_clist_thaw (GTK_CLIST (clist)); + return select_pos; +} /*****/ @@ -1214,33 +1319,15 @@ ed_initialize_saved_colors(void) g_editor->saved_colors[9].a = 1.0; } /* ed_initialize_saved_colors */ -/*****/ - -static gint -ed_delete_callback (GtkWidget *widget, - GdkEvent *event, - gpointer client_data) -{ - ed_close_callback (widget, client_data); - - return TRUE; -} - -/*****/ +/***** Main gradient editor dialog callbacks *****/ -static void -ed_close_callback (GtkWidget *widget, - gpointer client_data) -{ - if (GTK_WIDGET_VISIBLE (g_editor->shell)) - gtk_widget_hide (g_editor->shell); -} +/***** the "new gradient" dialog functions *****/ /*****/ static void ed_new_gradient_callback (GtkWidget *widget, - gpointer client_data) + gpointer data) { gtk_widget_show (query_string_box(_("New gradient"), _("Enter a name for the new gradient"), @@ -1251,7 +1338,7 @@ ed_new_gradient_callback (GtkWidget *widget, static void ed_do_new_gradient_callback (GtkWidget *widget, - gpointer client_data, + gpointer data, gpointer call_data) { gradient_t *grad; @@ -1288,11 +1375,13 @@ ed_do_new_gradient_callback (GtkWidget *widget, grad_sel_new_all (pos, grad); } +/***** The "copy gradient" dialog functions *****/ + /*****/ static void ed_copy_gradient_callback (GtkWidget *widget, - gpointer client_data) + gpointer data) { gchar *name; @@ -1312,7 +1401,7 @@ ed_copy_gradient_callback (GtkWidget *widget, static void ed_do_copy_gradient_callback (GtkWidget *widget, - gpointer client_data, + gpointer data, gpointer call_data) { gradient_t *grad; @@ -1373,11 +1462,13 @@ ed_do_copy_gradient_callback (GtkWidget *widget, grad_sel_copy_all (pos, grad); } +/***** The "rename gradient" dialog functions *****/ + /*****/ static void ed_rename_gradient_callback (GtkWidget *widget, - gpointer client_data) + gpointer data) { if (curr_gradient == NULL) return; @@ -1392,10 +1483,10 @@ ed_rename_gradient_callback (GtkWidget *widget, static void ed_do_rename_gradient_callback (GtkWidget *widget, - gpointer client_data, + gpointer data, gpointer call_data) { - gradient_t *grad = (gradient_t *) client_data; + gradient_t *grad = (gradient_t *) data; gradient_t *grad_list = NULL; gchar *gradient_name; GSList *tmp; @@ -1447,11 +1538,13 @@ ed_do_rename_gradient_callback (GtkWidget *widget, grad_sel_rename_all (n, grad); } +/***** The "delete gradient" dialog functions *****/ + /*****/ static void ed_delete_gradient_callback (GtkWidget *widget, - gpointer client_data) + gpointer data) { GtkWidget *dialog; GtkWidget *vbox; @@ -1468,11 +1561,11 @@ ed_delete_gradient_callback (GtkWidget *widget, return; dialog = gtk_dialog_new (); + gtk_window_set_wmclass (GTK_WINDOW (dialog), "delete_gradient", "Gimp"); gtk_window_set_title (GTK_WINDOW (dialog), _("Delete gradient")); gtk_window_position (GTK_WINDOW (dialog), GTK_WIN_POS_MOUSE); - gtk_container_set_border_width (GTK_CONTAINER (dialog), 0); - /* Handle the wm close signal */ + /* Handle the wm delete event */ gtk_signal_connect (GTK_OBJECT (dialog), "delete_event", GTK_SIGNAL_FUNC (ed_delete_delete_gradient_callback), dialog); @@ -1504,14 +1597,14 @@ ed_delete_gradient_callback (GtkWidget *widget, static void ed_do_delete_gradient_callback (GtkWidget *widget, - gpointer client_data) + gpointer data) { GSList *tmp; gint n; gint real_pos; gradient_t *gradient; - gtk_widget_destroy (GTK_WIDGET (client_data)); + gtk_widget_destroy (GTK_WIDGET (data)); gtk_widget_set_sensitive (g_editor->shell, TRUE); /* See which gradient we will have to select once the current one is deleted */ @@ -1561,29 +1654,31 @@ ed_do_delete_gradient_callback (GtkWidget *widget, grad_sel_delete_all (real_pos); } +static void +ed_cancel_delete_gradient_callback (GtkWidget *widget, + gpointer data) +{ + gtk_widget_destroy (GTK_WIDGET (data)); + gtk_widget_set_sensitive (g_editor->shell, TRUE); +} + static gint ed_delete_delete_gradient_callback (GtkWidget *widget, GdkEvent *event, - gpointer client_data) + gpointer data) { - ed_cancel_delete_gradient_callback (widget, client_data); + ed_cancel_delete_gradient_callback (widget, data); return TRUE; } -static void -ed_cancel_delete_gradient_callback (GtkWidget *widget, - gpointer client_data) -{ - gtk_widget_destroy (GTK_WIDGET (client_data)); - gtk_widget_set_sensitive (g_editor->shell, TRUE); -} +/***** The "save as pov" dialog functions *****/ /*****/ static void ed_save_pov_callback (GtkWidget *widget, - gpointer client_data) + gpointer data) { GtkWidget *window; @@ -1601,19 +1696,23 @@ ed_save_pov_callback (GtkWidget *widget, "clicked", (GtkSignalFunc) ed_cancel_save_pov_callback, window); + gtk_signal_connect (GTK_OBJECT (window), "delete_event", + (GdkEventFunc) ed_delete_save_pov_callback, + window); + gtk_widget_show (window); gtk_widget_set_sensitive (g_editor->shell, FALSE); } static void ed_do_save_pov_callback (GtkWidget *widget, - gpointer client_data) + gpointer data) { gchar *filename; FILE *file; grad_segment_t *seg; - filename = gtk_file_selection_get_filename (GTK_FILE_SELECTION (client_data)); + filename = gtk_file_selection_get_filename (GTK_FILE_SELECTION (data)); file = fopen (filename, "wb"); @@ -1652,32 +1751,42 @@ ed_do_save_pov_callback (GtkWidget *widget, fclose (file); } - gtk_widget_destroy (GTK_WIDGET (client_data)); + gtk_widget_destroy (GTK_WIDGET (data)); gtk_widget_set_sensitive (g_editor->shell, TRUE); } static void ed_cancel_save_pov_callback (GtkWidget *widget, - gpointer client_data) + gpointer data) { - gtk_widget_destroy (GTK_WIDGET (client_data)); + gtk_widget_destroy (GTK_WIDGET (data)); gtk_widget_set_sensitive (g_editor->shell, TRUE); } +static gint +ed_delete_save_pov_callback (GtkWidget *widget, + GdkEvent *event, + gpointer data) +{ + ed_cancel_save_pov_callback (widget, data); + + return TRUE; +} + +/***** The main dialog action area button callbacks *****/ + /*****/ static void ed_save_grads_callback (GtkWidget *widget, - gpointer client_data) + gpointer data) { grad_save_all (0); } -/*****/ - static void ed_refresh_grads_callback (GtkWidget *widget, - gpointer client_data) + gpointer data) { gint select_pos; gtk_clist_freeze (GTK_CLIST (g_editor->clist)); @@ -1702,247 +1811,266 @@ ed_refresh_grads_callback (GtkWidget *widget, grad_sel_refill_all (); } -/*****/ - static void -ed_scrollbar_update(GtkAdjustment *adjustment, gpointer data) +ed_close_callback (GtkWidget *widget, + gpointer data) { - char str[256]; - - g_snprintf(str, sizeof(str), _("Zoom factor: %d:1 Displaying [%0.6f, %0.6f]"), - g_editor->zoom_factor, adjustment->value, adjustment->value + adjustment->page_size); + if (GTK_WIDGET_VISIBLE (g_editor->shell)) + gtk_widget_hide (g_editor->shell); +} - ed_set_hint(str); +static gint +ed_delete_callback (GtkWidget *widget, + GdkEvent *event, + gpointer data) +{ + ed_close_callback (widget, data); - ed_update_editor(GRAD_UPDATE_PREVIEW | GRAD_UPDATE_CONTROL); -} /* ed_scrollbar_update */ + return TRUE; +} +/***** Zoom, scrollbar & instant update callbacks *****/ /*****/ static void -ed_zoom_all_callback(GtkWidget *widget, gpointer client_data) +ed_scrollbar_update (GtkAdjustment *adjustment, + gpointer data) { - GtkAdjustment *adjustment; + gchar str[256]; - adjustment = GTK_ADJUSTMENT(g_editor->scroll_data); + g_snprintf (str, sizeof (str), + _("Zoom factor: %d:1 Displaying [%0.6f, %0.6f]"), + g_editor->zoom_factor, adjustment->value, + adjustment->value + adjustment->page_size); - g_editor->zoom_factor = 1; + ed_set_hint (str); - adjustment->value = 0.0; - adjustment->page_size = 1.0; - adjustment->step_increment = 1.0 * GRAD_SCROLLBAR_STEP_SIZE; - adjustment->page_increment = 1.0 * GRAD_SCROLLBAR_PAGE_SIZE; + ed_update_editor (GRAD_UPDATE_PREVIEW | GRAD_UPDATE_CONTROL); +} - gtk_signal_emit_by_name(g_editor->scroll_data, "changed"); -} /* ed_zoom_all_callback */ +static void +ed_zoom_all_callback(GtkWidget *widget, + gpointer data) +{ + GtkAdjustment *adjustment; + adjustment = GTK_ADJUSTMENT (g_editor->scroll_data); -/*****/ + g_editor->zoom_factor = 1; -static void -ed_zoom_out_callback(GtkWidget *widget, gpointer client_data) -{ - GtkAdjustment *adjustment; - double old_value, value; - double old_page_size, page_size; + adjustment->value = 0.0; + adjustment->page_size = 1.0; + adjustment->step_increment = 1.0 * GRAD_SCROLLBAR_STEP_SIZE; + adjustment->page_increment = 1.0 * GRAD_SCROLLBAR_PAGE_SIZE; - if (g_editor->zoom_factor <= 1) - return; + gtk_signal_emit_by_name (g_editor->scroll_data, "changed"); +} - adjustment = GTK_ADJUSTMENT(g_editor->scroll_data); +static void +ed_zoom_out_callback (GtkWidget *widget, + gpointer data) +{ + GtkAdjustment *adjustment; + double old_value, value; + double old_page_size, page_size; - old_value = adjustment->value; - old_page_size = adjustment->page_size; + if (g_editor->zoom_factor <= 1) + return; - g_editor->zoom_factor--; + adjustment = GTK_ADJUSTMENT (g_editor->scroll_data); - page_size = 1.0 / g_editor->zoom_factor; - value = old_value - (page_size - old_page_size) / 2.0; + old_value = adjustment->value; + old_page_size = adjustment->page_size; - if (value < 0.0) - value = 0.0; - else if ((value + page_size) > 1.0) - value = 1.0 - page_size; + g_editor->zoom_factor--; - adjustment->value = value; - adjustment->page_size = page_size; - adjustment->step_increment = page_size * GRAD_SCROLLBAR_STEP_SIZE; - adjustment->page_increment = page_size * GRAD_SCROLLBAR_PAGE_SIZE; + page_size = 1.0 / g_editor->zoom_factor; + value = old_value - (page_size - old_page_size) / 2.0; - gtk_signal_emit_by_name(g_editor->scroll_data, "changed"); -} /* ed_zoom_out_callback */ + if (value < 0.0) + value = 0.0; + else if ((value + page_size) > 1.0) + value = 1.0 - page_size; + adjustment->value = value; + adjustment->page_size = page_size; + adjustment->step_increment = page_size * GRAD_SCROLLBAR_STEP_SIZE; + adjustment->page_increment = page_size * GRAD_SCROLLBAR_PAGE_SIZE; -/*****/ + gtk_signal_emit_by_name (g_editor->scroll_data, "changed"); +} static void -ed_zoom_in_callback(GtkWidget *widget, gpointer client_data) +ed_zoom_in_callback (GtkWidget *widget, + gpointer data) { - GtkAdjustment *adjustment; - double old_value; - double old_page_size, page_size; - - adjustment = GTK_ADJUSTMENT(g_editor->scroll_data); + GtkAdjustment *adjustment; + double old_value; + double old_page_size, page_size; - old_value = adjustment->value; - old_page_size = adjustment->page_size; + adjustment = GTK_ADJUSTMENT (g_editor->scroll_data); - g_editor->zoom_factor++; + old_value = adjustment->value; + old_page_size = adjustment->page_size; - page_size = 1.0 / g_editor->zoom_factor; + g_editor->zoom_factor++; - adjustment->value = old_value + (old_page_size - page_size) / 2.0; - adjustment->page_size = page_size; - adjustment->step_increment = page_size * GRAD_SCROLLBAR_STEP_SIZE; - adjustment->page_increment = page_size * GRAD_SCROLLBAR_PAGE_SIZE; + page_size = 1.0 / g_editor->zoom_factor; - gtk_signal_emit_by_name(g_editor->scroll_data, "changed"); -} /* ed_zoom_in_callback */ + adjustment->value = old_value + (old_page_size - page_size) / 2.0; + adjustment->page_size = page_size; + adjustment->step_increment = page_size * GRAD_SCROLLBAR_STEP_SIZE; + adjustment->page_increment = page_size * GRAD_SCROLLBAR_PAGE_SIZE; - -/*****/ + gtk_signal_emit_by_name (g_editor->scroll_data, "changed"); +} static void -ed_instant_update_update(GtkWidget *widget, gpointer data) +ed_instant_update_update (GtkWidget *widget, + gpointer data) { - if (GTK_TOGGLE_BUTTON(widget)->active) { - g_editor->instant_update = 1; - gtk_range_set_update_policy(GTK_RANGE(g_editor->scrollbar), GTK_UPDATE_CONTINUOUS); - } else { - g_editor->instant_update = 0; - gtk_range_set_update_policy(GTK_RANGE(g_editor->scrollbar), GTK_UPDATE_DELAYED); - } /* else */ -} /* ed_instant_update_update */ - + if (GTK_TOGGLE_BUTTON (widget)->active) + { + g_editor->instant_update = 1; + gtk_range_set_update_policy (GTK_RANGE (g_editor->scrollbar), + GTK_UPDATE_CONTINUOUS); + } + else + { + g_editor->instant_update = 0; + gtk_range_set_update_policy (GTK_RANGE (g_editor->scrollbar), + GTK_UPDATE_DELAYED); + } +} /***** Gradient preview functions *****/ /*****/ static gint -prev_events(GtkWidget *widget, GdkEvent *event) +prev_events (GtkWidget *widget, + GdkEvent *event, + gpointer data) { - gint x, y; - GdkEventButton *bevent; - GdkEventMotion *mevent; + gint x, y; + GdkEventButton *bevent; + GdkEventMotion *mevent; - /* ignore events when no gradient is present */ - if (curr_gradient == NULL) - return FALSE; - - switch (event->type) { - case GDK_EXPOSE: - prev_update(0); - break; - - case GDK_LEAVE_NOTIFY: - ed_set_hint(""); - break; - - case GDK_MOTION_NOTIFY: - gtk_widget_get_pointer(g_editor->preview, &x, &y); - - mevent = (GdkEventMotion *) event; - - if (x != g_editor->preview_last_x) - { - g_editor->preview_last_x = x; + /* ignore events when no gradient is present */ + if (curr_gradient == NULL) + return FALSE; - if (g_editor->preview_button_down) - { - if (mevent->state & GDK_CONTROL_MASK) - prev_set_background (x); - else - prev_set_foreground (x); - } - else - prev_set_hint (x); - } /* if */ + switch (event->type) + { + case GDK_EXPOSE: + prev_update (FALSE); + break; - break; + case GDK_LEAVE_NOTIFY: + ed_set_hint(""); + break; - case GDK_BUTTON_PRESS: - gtk_widget_get_pointer(g_editor->preview, &x, &y); + case GDK_MOTION_NOTIFY: + gtk_widget_get_pointer (g_editor->preview, &x, &y); - bevent = (GdkEventButton *) event; + mevent = (GdkEventMotion *) event; - switch (bevent->button) - { - case 1: - g_editor->preview_last_x = x; - g_editor->preview_button_down = 1; - if (bevent->state & GDK_CONTROL_MASK) - prev_set_background (x); - else - prev_set_foreground (x); - break; + if (x != g_editor->preview_last_x) + { + g_editor->preview_last_x = x; + + if (g_editor->preview_button_down) + { + if (mevent->state & GDK_CONTROL_MASK) + prev_set_background (x); + else + prev_set_foreground (x); + } + else + prev_set_hint (x); + } + break; - case 3: - cpopup_do_popup(); - break; + case GDK_BUTTON_PRESS: + gtk_widget_get_pointer (g_editor->preview, &x, &y); - default: - break; - } + bevent = (GdkEventButton *) event; - break; + switch (bevent->button) + { + case 1: + g_editor->preview_last_x = x; + g_editor->preview_button_down = 1; + if (bevent->state & GDK_CONTROL_MASK) + prev_set_background (x); + else + prev_set_foreground (x); + break; + + case 3: + cpopup_do_popup (); + break; + + default: + break; + } - case GDK_BUTTON_RELEASE: - if (g_editor->preview_button_down) - { - gtk_widget_get_pointer (g_editor->preview, &x, &y); + break; - bevent = (GdkEventButton *) event; + case GDK_BUTTON_RELEASE: + if (g_editor->preview_button_down) + { + gtk_widget_get_pointer (g_editor->preview, &x, &y); - g_editor->preview_last_x = x; - g_editor->preview_button_down = 0; - if (bevent->state & GDK_CONTROL_MASK) - prev_set_background (x); - else - prev_set_foreground (x); - break; - } + bevent = (GdkEventButton *) event; - break; + g_editor->preview_last_x = x; + g_editor->preview_button_down = 0; + if (bevent->state & GDK_CONTROL_MASK) + prev_set_background (x); + else + prev_set_foreground (x); + break; + } - default: - break; - } /* switch */ + break; - return FALSE; -} /* prev_events */ + default: + break; + } + return FALSE; +} /*****/ static void -prev_set_hint(gint x) +prev_set_hint (gint x) { - double xpos; - double r, g, b, a; - double h, s, v; - char str[256]; - - xpos = control_calc_g_pos(x); + double xpos; + double r, g, b, a; + double h, s, v; + gchar str[256]; - grad_get_color_at(xpos, &r, &g, &b, &a); + xpos = control_calc_g_pos (x); - h = r; - s = g; - v = b; + grad_get_color_at (xpos, &r, &g, &b, &a); - calc_rgb_to_hsv(&h, &s, &v); + h = r; + s = g; + v = b; - g_snprintf(str, sizeof(str), _("Position: %0.6f " - "RGB (%0.3f, %0.3f, %0.3f) " - "HSV (%0.3f, %0.3f, %0.3f) " - "Opacity: %0.3f"), - xpos, r, g, b, h * 360.0, s, v, a); + calc_rgb_to_hsv (&h, &s, &v); - ed_set_hint(str); -} /* prev_set_hint */ + g_snprintf (str, sizeof (str), _("Position: %0.6f " + "RGB (%0.3f, %0.3f, %0.3f) " + "HSV (%0.3f, %0.3f, %0.3f) " + "Opacity: %0.3f"), + xpos, r, g, b, h * 360.0, s, v, a); + ed_set_hint (str); +} /*****/ @@ -1995,97 +2123,91 @@ prev_set_background (gint x) /*****/ static void -prev_update(int recalculate) +prev_update (gboolean recalculate) { - long rowsiz; - GtkAdjustment *adjustment; - guint16 width, height; - guint16 pwidth, pheight; - GSList *tmp; - int n; - gradient_t *g; - static gradient_t *last_grad = NULL; - static int last_row = -1; - - /* We only update if we can draw to the widget and a gradient is present */ - - if (curr_gradient == NULL) - return; - if (!GTK_WIDGET_DRAWABLE(g_editor->preview)) - return; - - /* See whether we have to re-create the preview widget */ + long rowsiz; + GtkAdjustment *adjustment; + guint16 width, height; + GSList *tmp; + int n; + gradient_t *g; - width = g_editor->preview->allocation.width; - height = g_editor->preview->allocation.height; + static gradient_t *last_grad = NULL; + static int last_row = -1; - /* hof: do not change preview size on Window resize. - * The original code allows expansion of the preview - * on window resize events. But once expanded, there is no way to shrink - * the window back to the original size. - * A full Bugfix should change the preview size according to the users - * window resize actions. - */ + static guint16 last_width = 0; + static guint16 last_height = 0; - width = GRAD_PREVIEW_WIDTH; - height = GRAD_PREVIEW_HEIGHT; - - pwidth = GTK_PREVIEW(g_editor->preview)->buffer_width; - pheight = GTK_PREVIEW(g_editor->preview)->buffer_height; + /* We only update if we can draw to the widget and a gradient is present */ + if (curr_gradient == NULL) + return; + if (!GTK_WIDGET_DRAWABLE (g_editor->preview)) + return; - if (!g_editor->preview_rows[0] || !g_editor->preview_rows[1] || - (width != pwidth) || (height != pheight)) { - if (g_editor->preview_rows[0]) - g_free(g_editor->preview_rows[0]); + /* See whether we have to re-create the preview widget + * (note that the preview automatically follows the size of it's container) + */ + width = g_editor->preview->allocation.width; + height = g_editor->preview->allocation.height; - if (g_editor->preview_rows[1]) - g_free(g_editor->preview_rows[1]); + if (!g_editor->preview_rows[0] || + !g_editor->preview_rows[1] || + (width != last_width) || + (height != last_height)) + { + if (g_editor->preview_rows[0]) + g_free (g_editor->preview_rows[0]); - gtk_preview_size(GTK_PREVIEW(g_editor->preview), width, height); + if (g_editor->preview_rows[1]) + g_free (g_editor->preview_rows[1]); - rowsiz = width * 3 * sizeof(guchar); + rowsiz = width * 3 * sizeof (guchar); - g_editor->preview_rows[0] = g_malloc(rowsiz); - g_editor->preview_rows[1] = g_malloc(rowsiz); + g_editor->preview_rows[0] = g_malloc (rowsiz); + g_editor->preview_rows[1] = g_malloc (rowsiz); - recalculate = 1; /* Force recalculation */ - } /* if */ + recalculate = TRUE; /* Force recalculation */ + } - /* Have to redraw? */ + last_width = width; + last_height = height; - if (recalculate) { - adjustment = GTK_ADJUSTMENT(g_editor->scroll_data); + /* Have to redraw? */ + if (recalculate) + { + adjustment = GTK_ADJUSTMENT (g_editor->scroll_data); - prev_fill_image(width, height, - adjustment->value, - adjustment->value + adjustment->page_size); + prev_fill_image (width, height, + adjustment->value, + adjustment->value + adjustment->page_size); - gtk_widget_draw(g_editor->preview, NULL); - } /* if */ + gtk_widget_draw (g_editor->preview, NULL); + } - if(last_grad != curr_gradient || last_row < 0) { - n = 0; - tmp = gradients_list; + if (last_grad != curr_gradient || last_row < 0) + { + n = 0; + tmp = gradients_list; - while (tmp) { - g = tmp->data; + while (tmp) + { + g = tmp->data; - if (g == curr_gradient) { - break; /* We found the one we want */ - } /* if */ + if (g == curr_gradient) + break; /* We found the one we want */ - n++; /* Next gradient */ - tmp = g_slist_next(tmp); - } /* while */ - last_grad = curr_gradient; - last_row = n; - } /* if */ + n++; /* Next gradient */ + tmp = g_slist_next (tmp); + } + last_grad = curr_gradient; + last_row = n; + } - draw_small_preview(g_editor->gc,g_editor->clist,curr_gradient,last_row); - /* Update any others that are on screen */ - sel_update_dialogs(last_row,curr_gradient); -} /* prev_update */ + draw_small_preview (g_editor->gc, g_editor->clist, curr_gradient,last_row); + /* Update any others that are on screen */ + sel_update_dialogs (last_row, curr_gradient); +} /*****/ @@ -2152,100 +2274,106 @@ prev_fill_image(int width, int height, double left, double right) /*****/ static gint -control_events(GtkWidget *widget, GdkEvent *event) +control_events (GtkWidget *widget, + GdkEvent *event, + gpointer data) { - gint x, y; - guint32 time; - GdkEventButton *bevent; - grad_segment_t *seg; - - switch (event->type) { - case GDK_EXPOSE: - control_update(0); - break; - - case GDK_LEAVE_NOTIFY: - ed_set_hint(""); - break; - - case GDK_BUTTON_PRESS: - if (g_editor->control_drag_mode == GRAD_DRAG_NONE) { - gtk_widget_get_pointer(g_editor->control, &x, &y); - - bevent = (GdkEventButton *) event; + GdkEventButton *bevent; + grad_segment_t *seg; + gint x, y; + guint32 time; - g_editor->control_last_x = x; - g_editor->control_click_time = bevent->time; + switch (event->type) + { + case GDK_EXPOSE: + control_update (FALSE); + break; - control_button_press(x, y, bevent->button, bevent->state); + case GDK_LEAVE_NOTIFY: + ed_set_hint (""); + break; - if (g_editor->control_drag_mode != GRAD_DRAG_NONE) - gtk_grab_add(widget); - } /* if */ + case GDK_BUTTON_PRESS: + if (g_editor->control_drag_mode == GRAD_DRAG_NONE) + { + gtk_widget_get_pointer (g_editor->control, &x, &y); - break; + bevent = (GdkEventButton *) event; - case GDK_BUTTON_RELEASE: - ed_set_hint(""); + g_editor->control_last_x = x; + g_editor->control_click_time = bevent->time; - if (g_editor->control_drag_mode != GRAD_DRAG_NONE) { - gtk_grab_remove(widget); + control_button_press (x, y, bevent->button, bevent->state); - gtk_widget_get_pointer(g_editor->control, &x, &y); + if (g_editor->control_drag_mode != GRAD_DRAG_NONE) + gtk_grab_add (widget); + } + break; - time = ((GdkEventButton *) event)->time; + case GDK_BUTTON_RELEASE: + ed_set_hint (""); - if ((time - g_editor->control_click_time) >= GRAD_MOVE_TIME) - ed_update_editor(GRAD_UPDATE_PREVIEW); /* Possible move */ - else - if ((g_editor->control_drag_mode == GRAD_DRAG_MIDDLE) || - (g_editor->control_drag_mode == GRAD_DRAG_ALL)) { - seg = g_editor->control_drag_segment; + if (g_editor->control_drag_mode != GRAD_DRAG_NONE) + { + gtk_grab_remove (widget); - if ((g_editor->control_drag_mode == GRAD_DRAG_ALL) && - g_editor->control_compress) - control_extend_selection(seg, control_calc_g_pos(x)); - else - control_select_single_segment(seg); + gtk_widget_get_pointer (g_editor->control, &x, &y); - ed_update_editor(GRAD_UPDATE_CONTROL); - } /* if */ + time = ((GdkEventButton *) event)->time; - g_editor->control_drag_mode = GRAD_DRAG_NONE; - g_editor->control_compress = 0; + if ((time - g_editor->control_click_time) >= GRAD_MOVE_TIME) + ed_update_editor (GRAD_UPDATE_PREVIEW); /* Possible move */ + else + if ((g_editor->control_drag_mode == GRAD_DRAG_MIDDLE) || + (g_editor->control_drag_mode == GRAD_DRAG_ALL)) + { + seg = g_editor->control_drag_segment; - control_do_hint(x, y); - } /* if */ + if ((g_editor->control_drag_mode == GRAD_DRAG_ALL) && + g_editor->control_compress) + control_extend_selection (seg, control_calc_g_pos (x)); + else + control_select_single_segment (seg); - break; + ed_update_editor (GRAD_UPDATE_CONTROL); + } - case GDK_MOTION_NOTIFY: - gtk_widget_get_pointer(g_editor->control, &x, &y); + g_editor->control_drag_mode = GRAD_DRAG_NONE; + g_editor->control_compress = 0; - if (x != g_editor->control_last_x) { - g_editor->control_last_x = x; + control_do_hint (x, y); + } + break; - if (g_editor->control_drag_mode != GRAD_DRAG_NONE) { - time = ((GdkEventButton *) event)->time; + case GDK_MOTION_NOTIFY: + gtk_widget_get_pointer (g_editor->control, &x, &y); - if ((time - g_editor->control_click_time) >= GRAD_MOVE_TIME) - control_motion(x); - } else { - ed_update_editor(GRAD_UPDATE_CONTROL); + if (x != g_editor->control_last_x) + { + g_editor->control_last_x = x; - control_do_hint(x, y); - } /* else */ - } /* if */ + if (g_editor->control_drag_mode != GRAD_DRAG_NONE) + { + time = ((GdkEventButton *) event)->time; - break; + if ((time - g_editor->control_click_time) >= GRAD_MOVE_TIME) + control_motion(x); + } + else + { + ed_update_editor (GRAD_UPDATE_CONTROL); - default: - break; - } /* switch */ + control_do_hint (x, y); + } + } + break; - return FALSE; -} /* control_events */ + default: + break; + } + return FALSE; +} /*****/ @@ -2753,59 +2881,59 @@ control_move(grad_segment_t *range_l, grad_segment_t *range_r, double delta) /*****/ static void -control_update(int recalculate) +control_update (gboolean recalculate) { - gint cwidth, cheight; - gint pwidth, pheight; - GtkAdjustment *adjustment; - - /* We only update if we can redraw and a gradient is present */ - - if (curr_gradient == NULL) - return; - if (!GTK_WIDGET_DRAWABLE(g_editor->control)) - return; - - /* See whether we have to re-create the control pixmap */ - - gdk_window_get_size(g_editor->control->window, &cwidth, &cheight); + GtkAdjustment *adjustment; + gint cwidth, cheight; + gint pwidth, pheight; - /* as long as we have that ugly workaround in prev_update() don't - change the size of the controls either when the window is resized */ - - cwidth = GRAD_PREVIEW_WIDTH; - cheight = GRAD_PREVIEW_HEIGHT; - - if (g_editor->control_pixmap) - gdk_window_get_size(g_editor->control_pixmap, &pwidth, &pheight); + /* We only update if we can redraw and a gradient is present */ + if (curr_gradient == NULL) + return; + if (!GTK_WIDGET_DRAWABLE (g_editor->control)) + return; - if (!g_editor->control_pixmap || (cwidth != pwidth) || (cheight != pheight)) { - if (g_editor->control_pixmap) - gdk_pixmap_unref(g_editor->control_pixmap); + /* See whether we have to re-create the control pixmap + * depending on the preview's width + */ + cwidth = g_editor->preview->allocation.width; + cheight = GRAD_CONTROL_HEIGHT; - g_editor->control_pixmap = gdk_pixmap_new(g_editor->control->window, cwidth, cheight, -1); + if (g_editor->control_pixmap) + gdk_window_get_size (g_editor->control_pixmap, &pwidth, &pheight); - recalculate = 1; - } /* if */ + if (!g_editor->control_pixmap || + (cwidth != pwidth) || + (cheight != pheight)) + { + if (g_editor->control_pixmap) + gdk_pixmap_unref (g_editor->control_pixmap); - /* Have to reset the selection? */ + g_editor->control_pixmap = + gdk_pixmap_new (g_editor->control->window, cwidth, cheight, -1); - if (recalculate) - control_select_single_segment(curr_gradient->segments); + recalculate = TRUE; + } - /* Redraw pixmap */ + /* Avaoid segfault on first invocation */ + if (cwidth < GRAD_PREVIEW_WIDTH) + return; - adjustment = GTK_ADJUSTMENT(g_editor->scroll_data); + /* Have to reset the selection? */ + if (recalculate) + control_select_single_segment (curr_gradient->segments); - control_draw(g_editor->control_pixmap, - cwidth, cheight, - adjustment->value, - adjustment->value + adjustment->page_size); + /* Redraw pixmap */ + adjustment = GTK_ADJUSTMENT (g_editor->scroll_data); - gdk_draw_pixmap(g_editor->control->window, g_editor->control->style->black_gc, - g_editor->control_pixmap, 0, 0, 0, 0, cwidth, cheight); -} /* control_update */ + control_draw (g_editor->control_pixmap, + cwidth, cheight, + adjustment->value, + adjustment->value + adjustment->page_size); + gdk_draw_pixmap (g_editor->control->window, g_editor->control->style->black_gc, + g_editor->control_pixmap, 0, 0, 0, 0, cwidth, cheight); +} /*****/ @@ -2963,560 +3091,536 @@ control_calc_g_pos(int pos) /*****/ static void -cpopup_create_main_menu(void) -{ - GtkWidget *menu; - GtkWidget *menuitem; - GtkWidget *label; - GtkAccelGroup *accel_group; - - menu = gtk_menu_new(); - accel_group = gtk_accel_group_new(); - - g_editor->accel_group = accel_group; - - gtk_menu_set_accel_group (GTK_MENU(menu), accel_group); - gtk_window_add_accel_group (GTK_WINDOW (g_editor->shell), accel_group); - - /* Left endpoint */ - - menuitem = cpopup_create_color_item(&g_editor->left_color_preview, &label); - gtk_label_set(GTK_LABEL(label), _("Left endpoint's color")); - gtk_signal_connect(GTK_OBJECT(menuitem), "activate", - (GtkSignalFunc) cpopup_set_left_color_callback, - NULL); - gtk_menu_append(GTK_MENU(menu), menuitem); - gtk_widget_show(menuitem); - gtk_widget_add_accelerator(menuitem, - "activate", - accel_group, - 'L', 0, - GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED); - - menuitem = gtk_menu_item_new_with_label(_("Load from")); - g_editor->control_left_load_popup = cpopup_create_load_menu(g_editor->left_load_color_boxes, - g_editor->left_load_labels, - _("Left neighbor's right endpoint"), - _("Right endpoint"), - (GtkSignalFunc) - cpopup_load_left_callback, - 'L', GDK_CONTROL_MASK, - 'L', GDK_MOD1_MASK, - 'F', GDK_CONTROL_MASK); - gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), g_editor->control_left_load_popup); - gtk_menu_append(GTK_MENU(menu), menuitem); - gtk_widget_show(menuitem); - - menuitem = gtk_menu_item_new_with_label(_("Save to")); - g_editor->control_left_save_popup = cpopup_create_save_menu(g_editor->left_save_color_boxes, - g_editor->left_save_labels, - (GtkSignalFunc) - cpopup_save_left_callback); - gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), g_editor->control_left_save_popup); - gtk_menu_append(GTK_MENU(menu), menuitem); - gtk_widget_show(menuitem); - - /* Right endpoint */ - - menuitem = gtk_menu_item_new(); - gtk_menu_append(GTK_MENU(menu), menuitem); - gtk_widget_show(menuitem); - - menuitem = cpopup_create_color_item(&g_editor->right_color_preview, &label); - gtk_label_set(GTK_LABEL(label), _("Right endpoint's color")); - gtk_signal_connect(GTK_OBJECT(menuitem), "activate", - (GtkSignalFunc) cpopup_set_right_color_callback, - NULL); - gtk_menu_append(GTK_MENU(menu), menuitem); - gtk_widget_show(menuitem); - gtk_widget_add_accelerator(menuitem, - "activate", - accel_group, - 'R', 0, - GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED); - - menuitem = gtk_menu_item_new_with_label(_("Load from")); - g_editor->control_right_load_popup = cpopup_create_load_menu(g_editor->right_load_color_boxes, - g_editor->right_load_labels, - _("Right neighbor's left endpoint"), - _("Left endpoint"), - (GtkSignalFunc) - cpopup_load_right_callback, - 'R', GDK_CONTROL_MASK, - 'R', GDK_MOD1_MASK, - 'F', GDK_MOD1_MASK); - gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), g_editor->control_right_load_popup); - gtk_menu_append(GTK_MENU(menu), menuitem); - gtk_widget_show(menuitem); - - menuitem = gtk_menu_item_new_with_label(_("Save to")); - g_editor->control_right_save_popup = cpopup_create_save_menu(g_editor->right_save_color_boxes, - g_editor->right_save_labels, - (GtkSignalFunc) - cpopup_save_right_callback); - gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), g_editor->control_right_save_popup); - gtk_menu_append(GTK_MENU(menu), menuitem); - gtk_widget_show(menuitem); - - /* Blending function */ - - menuitem = gtk_menu_item_new(); - gtk_menu_append(GTK_MENU(menu), menuitem); - gtk_widget_show(menuitem); - - menuitem = cpopup_create_menu_item_with_label("", &g_editor->control_blending_label); - g_editor->control_blending_popup = cpopup_create_blending_menu(); - gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), g_editor->control_blending_popup); - gtk_menu_append(GTK_MENU(menu), menuitem); - gtk_widget_show(menuitem); - - /* Coloring type */ - - menuitem = cpopup_create_menu_item_with_label("", &g_editor->control_coloring_label); - g_editor->control_coloring_popup = cpopup_create_coloring_menu(); - gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), g_editor->control_coloring_popup); - gtk_menu_append(GTK_MENU(menu), menuitem); - gtk_widget_show(menuitem); - - /* Operations */ - - menuitem = gtk_menu_item_new(); - gtk_menu_append(GTK_MENU(menu), menuitem); - gtk_widget_show(menuitem); - - /* Split at midpoint */ - - menuitem = cpopup_create_menu_item_with_label("", &g_editor->control_splitm_label); - gtk_signal_connect(GTK_OBJECT(menuitem), "activate", - (GtkSignalFunc) cpopup_split_midpoint_callback, - NULL); - gtk_menu_append(GTK_MENU(menu), menuitem); - gtk_widget_show(menuitem); - gtk_widget_add_accelerator(menuitem, - "activate", - accel_group, - 'S', 0, - GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED); - - /* Split uniformly */ - - menuitem = cpopup_create_menu_item_with_label("", &g_editor->control_splitu_label); - gtk_signal_connect(GTK_OBJECT(menuitem), "activate", - (GtkSignalFunc) cpopup_split_uniform_callback, - NULL); - gtk_menu_append(GTK_MENU(menu), menuitem); - gtk_widget_show(menuitem); - gtk_widget_add_accelerator(menuitem, - "activate", - accel_group, - 'U', 0, - GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED); - - /* Delete */ - - menuitem = cpopup_create_menu_item_with_label("", &g_editor->control_delete_label); - gtk_signal_connect(GTK_OBJECT(menuitem), "activate", - (GtkSignalFunc) cpopup_delete_callback, - NULL); - gtk_menu_append(GTK_MENU(menu), menuitem); - gtk_widget_show(menuitem); - g_editor->control_delete_menu_item = menuitem; - gtk_widget_add_accelerator(menuitem, - "activate", - accel_group, - 'D', 0, - GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED); - - /* Recenter */ - - menuitem = cpopup_create_menu_item_with_label("", &g_editor->control_recenter_label); - gtk_signal_connect(GTK_OBJECT(menuitem), "activate", - (GtkSignalFunc) cpopup_recenter_callback, - NULL); - gtk_menu_append(GTK_MENU(menu), menuitem); - gtk_widget_show(menuitem); - gtk_widget_add_accelerator(menuitem, - "activate", - accel_group, - 'C', 0, - GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED); - - /* Redistribute */ - - menuitem = cpopup_create_menu_item_with_label("", &g_editor->control_redistribute_label); - gtk_signal_connect(GTK_OBJECT(menuitem), "activate", - (GtkSignalFunc) cpopup_redistribute_callback, - NULL); - gtk_menu_append(GTK_MENU(menu), menuitem); - gtk_widget_show(menuitem); - gtk_widget_add_accelerator(menuitem, - "activate", - accel_group, - 'C', GDK_CONTROL_MASK, - GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED); - - /* Selection ops */ - - menuitem = gtk_menu_item_new(); - gtk_menu_append(GTK_MENU(menu), menuitem); - gtk_widget_show(menuitem); - - menuitem = gtk_menu_item_new_with_label(_("Selection operations")); - g_editor->control_sel_ops_popup = cpopup_create_sel_ops_menu(); - gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), g_editor->control_sel_ops_popup); - gtk_menu_append(GTK_MENU(menu), menuitem); - gtk_widget_show(menuitem); - - /* Done */ - - g_editor->control_main_popup = menu; -} /* cpopup_create_main_menu */ +cpopup_create_main_menu (void) +{ + GtkWidget *menu; + GtkWidget *menuitem; + GtkWidget *label; + GtkAccelGroup *accel_group; + menu = gtk_menu_new (); + accel_group = gtk_accel_group_new (); -/*****/ + g_editor->accel_group = accel_group; + + gtk_menu_set_accel_group (GTK_MENU (menu), accel_group); + gtk_window_add_accel_group (GTK_WINDOW (g_editor->shell), accel_group); + + /* Left endpoint */ + menuitem = cpopup_create_color_item (&g_editor->left_color_preview, &label); + gtk_label_set_text (GTK_LABEL (label), _("Left endpoint's color")); + gtk_signal_connect (GTK_OBJECT (menuitem), "activate", + (GtkSignalFunc) cpopup_set_left_color_callback, + NULL); + gtk_menu_append (GTK_MENU (menu), menuitem); + gtk_widget_show (menuitem); + gtk_widget_add_accelerator (menuitem, "activate", + accel_group, + 'L', 0, + GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED); + + menuitem = gtk_menu_item_new_with_label (_("Load from")); + g_editor->control_left_load_popup = + cpopup_create_load_menu (g_editor->left_load_color_boxes, + g_editor->left_load_labels, + _("Left neighbor's right endpoint"), + _("Right endpoint"), + (GtkSignalFunc) cpopup_load_left_callback, + 'L', GDK_CONTROL_MASK, + 'L', GDK_MOD1_MASK, + 'F', GDK_CONTROL_MASK); + gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), + g_editor->control_left_load_popup); + gtk_menu_append (GTK_MENU (menu), menuitem); + gtk_widget_show (menuitem); + + menuitem = gtk_menu_item_new_with_label (_("Save to")); + g_editor->control_left_save_popup = + cpopup_create_save_menu (g_editor->left_save_color_boxes, + g_editor->left_save_labels, + (GtkSignalFunc) cpopup_save_left_callback); + gtk_menu_item_set_submenu (GTK_MENU_ITEM(menuitem), + g_editor->control_left_save_popup); + gtk_menu_append (GTK_MENU (menu), menuitem); + gtk_widget_show (menuitem); + + /* Right endpoint */ + menuitem = gtk_menu_item_new (); + gtk_menu_append (GTK_MENU (menu), menuitem); + gtk_widget_show (menuitem); + + menuitem = cpopup_create_color_item (&g_editor->right_color_preview, &label); + gtk_label_set_text (GTK_LABEL (label), _("Right endpoint's color")); + gtk_signal_connect (GTK_OBJECT (menuitem), "activate", + (GtkSignalFunc) cpopup_set_right_color_callback, + NULL); + gtk_menu_append (GTK_MENU (menu), menuitem); + gtk_widget_show (menuitem); + gtk_widget_add_accelerator (menuitem, "activate", + accel_group, + 'R', 0, + GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED); + + menuitem = gtk_menu_item_new_with_label (_("Load from")); + g_editor->control_right_load_popup = + cpopup_create_load_menu (g_editor->right_load_color_boxes, + g_editor->right_load_labels, + _("Right neighbor's left endpoint"), + _("Left endpoint"), + (GtkSignalFunc) cpopup_load_right_callback, + 'R', GDK_CONTROL_MASK, + 'R', GDK_MOD1_MASK, + 'F', GDK_MOD1_MASK); + gtk_menu_item_set_submenu (GTK_MENU_ITEM(menuitem), + g_editor->control_right_load_popup); + gtk_menu_append (GTK_MENU (menu), menuitem); + gtk_widget_show (menuitem); + + menuitem = gtk_menu_item_new_with_label (_("Save to")); + g_editor->control_right_save_popup = + cpopup_create_save_menu (g_editor->right_save_color_boxes, + g_editor->right_save_labels, + (GtkSignalFunc) cpopup_save_right_callback); + gtk_menu_item_set_submenu (GTK_MENU_ITEM(menuitem), + g_editor->control_right_save_popup); + gtk_menu_append (GTK_MENU (menu), menuitem); + gtk_widget_show (menuitem); + + /* Blending function */ + menuitem = gtk_menu_item_new (); + gtk_menu_append (GTK_MENU (menu), menuitem); + gtk_widget_show (menuitem); + + menuitem = cpopup_create_menu_item_with_label ("", &g_editor->control_blending_label); + g_editor->control_blending_popup = cpopup_create_blending_menu (); + gtk_menu_item_set_submenu (GTK_MENU_ITEM(menuitem), + g_editor->control_blending_popup); + gtk_menu_append (GTK_MENU(menu), menuitem); + gtk_widget_show (menuitem); + + /* Coloring type */ + menuitem = cpopup_create_menu_item_with_label ("", &g_editor->control_coloring_label); + g_editor->control_coloring_popup = cpopup_create_coloring_menu (); + gtk_menu_item_set_submenu (GTK_MENU_ITEM(menuitem), + g_editor->control_coloring_popup); + gtk_menu_append (GTK_MENU (menu), menuitem); + gtk_widget_show (menuitem); + + /* Operations */ + menuitem = gtk_menu_item_new (); + gtk_menu_append (GTK_MENU (menu), menuitem); + gtk_widget_show (menuitem); + + /* Split at midpoint */ + menuitem = cpopup_create_menu_item_with_label ("", &g_editor->control_splitm_label); + gtk_signal_connect (GTK_OBJECT (menuitem), "activate", + (GtkSignalFunc) cpopup_split_midpoint_callback, + NULL); + gtk_menu_append (GTK_MENU (menu), menuitem); + gtk_widget_show (menuitem); + gtk_widget_add_accelerator(menuitem, "activate", + accel_group, + 'S', 0, + GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED); + + /* Split uniformly */ + menuitem = cpopup_create_menu_item_with_label ("", &g_editor->control_splitu_label); + gtk_signal_connect (GTK_OBJECT(menuitem), "activate", + (GtkSignalFunc) cpopup_split_uniform_callback, + NULL); + gtk_menu_append (GTK_MENU (menu), menuitem); + gtk_widget_show (menuitem); + gtk_widget_add_accelerator (menuitem, "activate", + accel_group, + 'U', 0, + GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED); + + /* Delete */ + menuitem = cpopup_create_menu_item_with_label ("", &g_editor->control_delete_label); + gtk_signal_connect (GTK_OBJECT (menuitem), "activate", + (GtkSignalFunc) cpopup_delete_callback, + NULL); + gtk_menu_append (GTK_MENU (menu), menuitem); + gtk_widget_show (menuitem); + g_editor->control_delete_menu_item = menuitem; + gtk_widget_add_accelerator (menuitem, "activate", + accel_group, + 'D', 0, + GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED); + + /* Recenter */ + menuitem = cpopup_create_menu_item_with_label ("", &g_editor->control_recenter_label); + gtk_signal_connect (GTK_OBJECT (menuitem), "activate", + (GtkSignalFunc) cpopup_recenter_callback, + NULL); + gtk_menu_append (GTK_MENU (menu), menuitem); + gtk_widget_show (menuitem); + gtk_widget_add_accelerator (menuitem, "activate", + accel_group, + 'C', 0, + GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED); + + /* Redistribute */ + menuitem = cpopup_create_menu_item_with_label ("", &g_editor->control_redistribute_label); + gtk_signal_connect (GTK_OBJECT (menuitem), "activate", + (GtkSignalFunc) cpopup_redistribute_callback, + NULL); + gtk_menu_append (GTK_MENU (menu), menuitem); + gtk_widget_show (menuitem); + gtk_widget_add_accelerator (menuitem, "activate", + accel_group, + 'C', GDK_CONTROL_MASK, + GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED); + + /* Selection ops */ + menuitem = gtk_menu_item_new (); + gtk_menu_append (GTK_MENU (menu), menuitem); + gtk_widget_show (menuitem); + + menuitem = gtk_menu_item_new_with_label (_("Selection operations")); + g_editor->control_sel_ops_popup = cpopup_create_sel_ops_menu (); + gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), + g_editor->control_sel_ops_popup); + gtk_menu_append (GTK_MENU (menu), menuitem); + gtk_widget_show (menuitem); + + /* Done */ + g_editor->control_main_popup = menu; +} static void -cpopup_do_popup(void) +cpopup_do_popup (void) { - cpopup_adjust_menus(); - gtk_menu_popup(GTK_MENU(g_editor->control_main_popup), NULL, NULL, NULL, NULL, 3, 0); -} /* cpopup_do_popup */ + cpopup_adjust_menus(); + gtk_menu_popup (GTK_MENU (g_editor->control_main_popup), + NULL, NULL, NULL, NULL, 3, 0); +} +/***** Create a single menu item *****/ /*****/ static GtkWidget * -cpopup_create_color_item(GtkWidget **color_box, GtkWidget **label) +cpopup_create_color_item (GtkWidget **color_box, + GtkWidget **label) { - GtkWidget *menuitem; - GtkWidget *hbox; - GtkWidget *vbox; - GtkWidget *wcolor_box; - GtkWidget *wlabel; - - menuitem = gtk_menu_item_new(); - - hbox = gtk_hbox_new(FALSE, 0); - gtk_container_add(GTK_CONTAINER(menuitem), hbox); - gtk_widget_show(hbox); + GtkWidget *menuitem; + GtkWidget *hbox; + GtkWidget *vbox; + GtkWidget *wcolor_box; + GtkWidget *wlabel; - vbox = gtk_vbox_new(FALSE, 0); - gtk_box_pack_start(GTK_BOX(hbox), vbox, FALSE, FALSE, 0); - gtk_widget_show(vbox); + menuitem = gtk_menu_item_new(); - wcolor_box = gtk_preview_new(GTK_PREVIEW_COLOR); - gtk_preview_set_dither (GTK_PREVIEW (wcolor_box), GDK_RGB_DITHER_MAX); - gtk_preview_size(GTK_PREVIEW(wcolor_box), GRAD_COLOR_BOX_WIDTH, GRAD_COLOR_BOX_HEIGHT); - gtk_box_pack_start(GTK_BOX(vbox), wcolor_box, FALSE, FALSE, 2); - gtk_widget_show(wcolor_box); + hbox = gtk_hbox_new (FALSE, 0); + gtk_container_add (GTK_CONTAINER (menuitem), hbox); + gtk_widget_show (hbox); - if (color_box) - *color_box = wcolor_box; + vbox = gtk_vbox_new (FALSE, 0); + gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0); + gtk_widget_show (vbox); - wlabel = gtk_label_new(""); - gtk_misc_set_alignment(GTK_MISC(wlabel), 0.0, 0.5); - gtk_box_pack_start(GTK_BOX(hbox), wlabel, TRUE, TRUE, 4); - gtk_widget_show(wlabel); + wcolor_box = gtk_preview_new (GTK_PREVIEW_COLOR); + gtk_preview_set_dither (GTK_PREVIEW (wcolor_box), GDK_RGB_DITHER_MAX); + gtk_preview_size (GTK_PREVIEW (wcolor_box), + GRAD_COLOR_BOX_WIDTH, GRAD_COLOR_BOX_HEIGHT); + gtk_box_pack_start (GTK_BOX (vbox), wcolor_box, FALSE, FALSE, 2); + gtk_widget_show (wcolor_box); - if (label) - *label = wlabel; + if (color_box) + *color_box = wcolor_box; - return menuitem; -} /* cpopup_create_color_item */ + wlabel = gtk_label_new (""); + gtk_misc_set_alignment (GTK_MISC (wlabel), 0.0, 0.5); + gtk_box_pack_start (GTK_BOX (hbox), wlabel, FALSE, FALSE, 4); + gtk_widget_show (wlabel); + if (label) + *label = wlabel; -/*****/ + return menuitem; +} -static void -cpopup_adjust_menus(void) +static GtkWidget * +cpopup_create_menu_item_with_label (gchar *str, + GtkWidget **label) { - grad_segment_t *seg; - int i; - double fg_r, fg_g, fg_b; - double fg_a; + GtkWidget *menuitem; + GtkWidget *accel_label; - /* Render main menu color boxes */ + menuitem = gtk_menu_item_new (); - cpopup_render_color_box(GTK_PREVIEW(g_editor->left_color_preview), - g_editor->control_sel_l->r0, - g_editor->control_sel_l->g0, - g_editor->control_sel_l->b0, - g_editor->control_sel_l->a0); + accel_label = gtk_accel_label_new (str); + gtk_misc_set_alignment (GTK_MISC (accel_label), 0.0, 0.5); + gtk_container_add (GTK_CONTAINER (menuitem), accel_label); + gtk_accel_label_set_accel_widget (GTK_ACCEL_LABEL (accel_label), menuitem); + gtk_widget_show (accel_label); - cpopup_render_color_box(GTK_PREVIEW(g_editor->right_color_preview), - g_editor->control_sel_r->r1, - g_editor->control_sel_r->g1, - g_editor->control_sel_r->b1, - g_editor->control_sel_r->a1); + if (label) + *label = accel_label; - /* Render load color from endpoint color boxes */ - - if (g_editor->control_sel_l->prev != NULL) - seg = g_editor->control_sel_l->prev; - else - seg = seg_get_last_segment(g_editor->control_sel_l); - - cpopup_render_color_box(GTK_PREVIEW(g_editor->left_load_color_boxes[0]), - seg->r1, - seg->g1, - seg->b1, - seg->a1); - - cpopup_render_color_box(GTK_PREVIEW(g_editor->left_load_color_boxes[1]), - g_editor->control_sel_r->r1, - g_editor->control_sel_r->g1, - g_editor->control_sel_r->b1, - g_editor->control_sel_r->a1); - - if (g_editor->control_sel_r->next != NULL) - seg = g_editor->control_sel_r->next; - else - seg = curr_gradient->segments; - - cpopup_render_color_box(GTK_PREVIEW(g_editor->right_load_color_boxes[0]), - seg->r0, - seg->g0, - seg->b0, - seg->a0); - - cpopup_render_color_box(GTK_PREVIEW(g_editor->right_load_color_boxes[1]), - g_editor->control_sel_l->r0, - g_editor->control_sel_l->g0, - g_editor->control_sel_l->b0, - g_editor->control_sel_l->a0); - - /* Render Foreground color boxes */ - - ed_fetch_foreground(&fg_r, &fg_g, &fg_b, &fg_a); - - cpopup_render_color_box(GTK_PREVIEW(g_editor->left_load_color_boxes[2]), - fg_r, - fg_g, - fg_b, - fg_a); - - cpopup_render_color_box(GTK_PREVIEW(g_editor->right_load_color_boxes[2]), - fg_r, - fg_g, - fg_b, - fg_a); - - /* Render saved color boxes */ - - for (i = 0; i < GRAD_NUM_COLORS; i++) - cpopup_update_saved_color(i, - g_editor->saved_colors[i].r, - g_editor->saved_colors[i].g, - g_editor->saved_colors[i].b, - g_editor->saved_colors[i].a); - - /* Adjust labels */ - - if (g_editor->control_sel_l == g_editor->control_sel_r) { - gtk_label_set(GTK_LABEL(g_editor->control_blending_label), - _("Blending function for segment")); - gtk_label_set(GTK_LABEL(g_editor->control_coloring_label), - _("Coloring type for segment")); - gtk_label_set(GTK_LABEL(g_editor->control_splitm_label), - _("Split segment at midpoint")); - gtk_label_set(GTK_LABEL(g_editor->control_splitu_label), - _("Split segment uniformly")); - gtk_label_set(GTK_LABEL(g_editor->control_delete_label), - _("Delete segment")); - gtk_label_set(GTK_LABEL(g_editor->control_recenter_label), - _("Re-center segment's midpoint")); - gtk_label_set(GTK_LABEL(g_editor->control_redistribute_label), - _("Re-distribute handles in segment")); - gtk_label_set(GTK_LABEL(g_editor->control_flip_label), - _("Flip segment")); - gtk_label_set(GTK_LABEL(g_editor->control_replicate_label), - _("Replicate segment")); - } else { - gtk_label_set(GTK_LABEL(g_editor->control_blending_label), - _("Blending function for selection")); - gtk_label_set(GTK_LABEL(g_editor->control_coloring_label), - _("Coloring type for selection")); - gtk_label_set(GTK_LABEL(g_editor->control_splitm_label), - _("Split segments at midpoints")); - gtk_label_set(GTK_LABEL(g_editor->control_splitu_label), - _("Split segments uniformly")); - gtk_label_set(GTK_LABEL(g_editor->control_delete_label), - _("Delete selection")); - gtk_label_set(GTK_LABEL(g_editor->control_recenter_label), - _("Re-center midpoints in selection")); - gtk_label_set(GTK_LABEL(g_editor->control_redistribute_label), - _("Re-distribute handles in selection")); - gtk_label_set(GTK_LABEL(g_editor->control_flip_label), - _("Flip selection")); - gtk_label_set(GTK_LABEL(g_editor->control_replicate_label), - _("Replicate selection")); - } /* else */ - - /* Adjust blending and coloring menus */ - - cpopup_adjust_blending_menu(); - cpopup_adjust_coloring_menu(); - - /* Can invoke delete? */ - - if ((g_editor->control_sel_l->prev == NULL) && (g_editor->control_sel_r->next == NULL)) - gtk_widget_set_sensitive(g_editor->control_delete_menu_item, FALSE); - else - gtk_widget_set_sensitive(g_editor->control_delete_menu_item, TRUE); - - /* Can invoke blend colors / opacity? */ - - if (g_editor->control_sel_l == g_editor->control_sel_r) { - gtk_widget_set_sensitive(g_editor->control_blend_colors_menu_item, FALSE); - gtk_widget_set_sensitive(g_editor->control_blend_opacity_menu_item, FALSE); - } else { - gtk_widget_set_sensitive(g_editor->control_blend_colors_menu_item, TRUE); - gtk_widget_set_sensitive(g_editor->control_blend_opacity_menu_item, TRUE); - } /* else */ -} /* cpopup_adjust_menus */ + return menuitem; +} +/***** Update all menus *****/ /*****/ static void -cpopup_adjust_blending_menu(void) +cpopup_adjust_menus (void) { - int equal; - long i, num_items; - int type; - - cpopup_check_selection_params(&equal, NULL); - - /* Block activate signals */ - - num_items = sizeof(g_editor->control_blending_items) / sizeof(g_editor->control_blending_items[0]); - - type = (int) g_editor->control_sel_l->type; - - for (i = 0; i < num_items; i++) - gtk_signal_handler_block_by_data(GTK_OBJECT(g_editor->control_blending_items[i]), - (gpointer) i); + grad_segment_t *seg; + int i; + double fg_r, fg_g, fg_b; + double fg_a; + + /* Render main menu color boxes */ + cpopup_render_color_box (GTK_PREVIEW (g_editor->left_color_preview), + g_editor->control_sel_l->r0, + g_editor->control_sel_l->g0, + g_editor->control_sel_l->b0, + g_editor->control_sel_l->a0); + + cpopup_render_color_box (GTK_PREVIEW (g_editor->right_color_preview), + g_editor->control_sel_r->r1, + g_editor->control_sel_r->g1, + g_editor->control_sel_r->b1, + g_editor->control_sel_r->a1); + + /* Render load color from endpoint color boxes */ + + if (g_editor->control_sel_l->prev != NULL) + seg = g_editor->control_sel_l->prev; + else + seg = seg_get_last_segment (g_editor->control_sel_l); + + cpopup_render_color_box (GTK_PREVIEW (g_editor->left_load_color_boxes[0]), + seg->r1, + seg->g1, + seg->b1, + seg->a1); + + cpopup_render_color_box (GTK_PREVIEW (g_editor->left_load_color_boxes[1]), + g_editor->control_sel_r->r1, + g_editor->control_sel_r->g1, + g_editor->control_sel_r->b1, + g_editor->control_sel_r->a1); + + if (g_editor->control_sel_r->next != NULL) + seg = g_editor->control_sel_r->next; + else + seg = curr_gradient->segments; + + cpopup_render_color_box (GTK_PREVIEW (g_editor->right_load_color_boxes[0]), + seg->r0, + seg->g0, + seg->b0, + seg->a0); + + cpopup_render_color_box (GTK_PREVIEW (g_editor->right_load_color_boxes[1]), + g_editor->control_sel_l->r0, + g_editor->control_sel_l->g0, + g_editor->control_sel_l->b0, + g_editor->control_sel_l->a0); + + /* Render Foreground color boxes */ + + ed_fetch_foreground (&fg_r, &fg_g, &fg_b, &fg_a); + + cpopup_render_color_box (GTK_PREVIEW (g_editor->left_load_color_boxes[2]), + fg_r, + fg_g, + fg_b, + fg_a); + + cpopup_render_color_box (GTK_PREVIEW (g_editor->right_load_color_boxes[2]), + fg_r, + fg_g, + fg_b, + fg_a); + + /* Render saved color boxes */ - /* Set state */ + for (i = 0; i < GRAD_NUM_COLORS; i++) + cpopup_update_saved_color(i, + g_editor->saved_colors[i].r, + g_editor->saved_colors[i].g, + g_editor->saved_colors[i].b, + g_editor->saved_colors[i].a); - if (equal) { - gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(g_editor->control_blending_items[type]), - TRUE); - gtk_widget_hide(g_editor->control_blending_items[num_items - 1]); - } else { - gtk_widget_show(g_editor->control_blending_items[num_items - 1]); - gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(g_editor->control_blending_items - [num_items - 1]), - TRUE); - } /* else */ + /* Adjust labels */ - /* Unblock signals */ + if (g_editor->control_sel_l == g_editor->control_sel_r) + { + gtk_label_set_text (GTK_LABEL (g_editor->control_blending_label), + _("Blending function for segment")); + gtk_label_set_text (GTK_LABEL (g_editor->control_coloring_label), + _("Coloring type for segment")); + gtk_label_set_text (GTK_LABEL (g_editor->control_splitm_label), + _("Split segment at midpoint")); + gtk_label_set_text (GTK_LABEL (g_editor->control_splitu_label), + _("Split segment uniformly")); + gtk_label_set_text (GTK_LABEL (g_editor->control_delete_label), + _("Delete segment")); + gtk_label_set_text (GTK_LABEL (g_editor->control_recenter_label), + _("Re-center segment's midpoint")); + gtk_label_set_text (GTK_LABEL (g_editor->control_redistribute_label), + _("Re-distribute handles in segment")); + gtk_label_set_text (GTK_LABEL (g_editor->control_flip_label), + _("Flip segment")); + gtk_label_set_text (GTK_LABEL (g_editor->control_replicate_label), + _("Replicate segment")); + } + else + { + gtk_label_set_text (GTK_LABEL (g_editor->control_blending_label), + _("Blending function for selection")); + gtk_label_set_text (GTK_LABEL (g_editor->control_coloring_label), + _("Coloring type for selection")); + gtk_label_set_text (GTK_LABEL (g_editor->control_splitm_label), + _("Split segments at midpoints")); + gtk_label_set_text (GTK_LABEL (g_editor->control_splitu_label), + _("Split segments uniformly")); + gtk_label_set_text (GTK_LABEL (g_editor->control_delete_label), + _("Delete selection")); + gtk_label_set_text (GTK_LABEL (g_editor->control_recenter_label), + _("Re-center midpoints in selection")); + gtk_label_set_text (GTK_LABEL (g_editor->control_redistribute_label), + _("Re-distribute handles in selection")); + gtk_label_set_text (GTK_LABEL (g_editor->control_flip_label), + _("Flip selection")); + gtk_label_set_text (GTK_LABEL (g_editor->control_replicate_label), + _("Replicate selection")); + } - for (i = 0; i < num_items; i++) - gtk_signal_handler_unblock_by_data(GTK_OBJECT(g_editor->control_blending_items[i]), - (gpointer) i); -} /* cpopup_adjust_blending_menu */ + /* Adjust blending and coloring menus */ + cpopup_adjust_blending_menu (); + cpopup_adjust_coloring_menu (); + /* Can invoke delete? */ + if ((g_editor->control_sel_l->prev == NULL) && + (g_editor->control_sel_r->next == NULL)) + gtk_widget_set_sensitive (g_editor->control_delete_menu_item, FALSE); + else + gtk_widget_set_sensitive (g_editor->control_delete_menu_item, TRUE); -/*****/ + /* Can invoke blend colors / opacity? */ + if (g_editor->control_sel_l == g_editor->control_sel_r) + { + gtk_widget_set_sensitive (g_editor->control_blend_colors_menu_item, FALSE); + gtk_widget_set_sensitive (g_editor->control_blend_opacity_menu_item, FALSE); + } + else + { + gtk_widget_set_sensitive (g_editor->control_blend_colors_menu_item, TRUE); + gtk_widget_set_sensitive (g_editor->control_blend_opacity_menu_item, TRUE); + } +} static void -cpopup_adjust_coloring_menu(void) +cpopup_adjust_blending_menu (void) { - int equal; - long i, num_items; - int coloring; + gint equal; + glong i, num_items; + gint type; - cpopup_check_selection_params(NULL, &equal); + cpopup_check_selection_params (&equal, NULL); - /* Block activate signals */ + /* Block activate signals */ + num_items = (sizeof (g_editor->control_blending_items) / + sizeof (g_editor->control_blending_items[0])); - num_items = sizeof(g_editor->control_coloring_items) / sizeof(g_editor->control_coloring_items[0]); + type = (int) g_editor->control_sel_l->type; - coloring = (int) g_editor->control_sel_l->color; - - for (i = 0; i < num_items; i++) - gtk_signal_handler_block_by_data(GTK_OBJECT(g_editor->control_coloring_items[i]), - (gpointer) i); - - /* Set state */ - - if (equal) { - gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(g_editor->control_coloring_items - [coloring]), - TRUE); - gtk_widget_hide(g_editor->control_coloring_items[num_items - 1]); - } else { - gtk_widget_show(g_editor->control_coloring_items[num_items - 1]); - gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(g_editor->control_coloring_items - [num_items - 1]), - TRUE); - } /* else */ - - /* Unblock signals */ - - for (i = 0; i < num_items; i++) - gtk_signal_handler_unblock_by_data(GTK_OBJECT(g_editor->control_coloring_items[i]), - (gpointer) i); -} /* cpopup_adjust_coloring_menu */ + for (i = 0; i < num_items; i++) + gtk_signal_handler_block_by_data + (GTK_OBJECT (g_editor->control_blending_items[i]), (gpointer) i); + /* Set state */ + if (equal) + { + gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (g_editor->control_blending_items[type]), TRUE); + gtk_widget_hide (g_editor->control_blending_items[num_items - 1]); + } + else + { + gtk_widget_show (g_editor->control_blending_items[num_items - 1]); + gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (g_editor->control_blending_items[num_items - 1]), TRUE); + } -/*****/ + /* Unblock signals */ + for (i = 0; i < num_items; i++) + gtk_signal_handler_unblock_by_data (GTK_OBJECT (g_editor->control_blending_items[i]), (gpointer) i); +} static void -cpopup_check_selection_params(int *equal_blending, int *equal_coloring) +cpopup_adjust_coloring_menu (void) { - grad_type_t type; - grad_color_t color; - int etype, ecolor; - grad_segment_t *seg, *aseg; - - type = g_editor->control_sel_l->type; - color = g_editor->control_sel_l->color; + gint equal; + glong i, num_items; + gint coloring; - etype = 1; - ecolor = 1; + cpopup_check_selection_params (NULL, &equal); - seg = g_editor->control_sel_l; + /* Block activate signals */ + num_items = (sizeof (g_editor->control_coloring_items) / + sizeof (g_editor->control_coloring_items[0])); - do { - etype = etype && (seg->type == type); - ecolor = ecolor && (seg->color == color); + coloring = (int) g_editor->control_sel_l->color; - aseg = seg; - seg = seg->next; - } while (aseg != g_editor->control_sel_r); + for (i = 0; i < num_items; i++) + gtk_signal_handler_block_by_data (GTK_OBJECT (g_editor->control_coloring_items[i]), (gpointer) i); - if (equal_blending) - *equal_blending = etype; + /* Set state */ + if (equal) + { + gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (g_editor->control_coloring_items[coloring]), TRUE); + gtk_widget_hide (g_editor->control_coloring_items[num_items - 1]); + } + else + { + gtk_widget_show (g_editor->control_coloring_items[num_items - 1]); + gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (g_editor->control_coloring_items[num_items - 1]), TRUE); + } - if (equal_coloring) - *equal_coloring = ecolor; -} /* cpopup_check_selection_params */ + /* Unblock signals */ + for (i = 0; i < num_items; i++) + gtk_signal_handler_unblock_by_data (GTK_OBJECT (g_editor->control_coloring_items[i]), (gpointer) i); +} +static void +cpopup_check_selection_params (gint *equal_blending, + gint *equal_coloring) +{ + grad_type_t type; + grad_color_t color; + int etype, ecolor; + grad_segment_t *seg, *aseg; -/*****/ + type = g_editor->control_sel_l->type; + color = g_editor->control_sel_l->color; -static GtkWidget * -cpopup_create_menu_item_with_label(char *str, GtkWidget **label) -{ - GtkWidget *menuitem; - GtkWidget *accel_label; + etype = 1; + ecolor = 1; - menuitem = gtk_menu_item_new(); + seg = g_editor->control_sel_l; - accel_label = gtk_accel_label_new(str); - gtk_misc_set_alignment(GTK_MISC(accel_label), 0.0, 0.5); - gtk_container_add(GTK_CONTAINER(menuitem), accel_label); - gtk_accel_label_set_accel_widget (GTK_ACCEL_LABEL (accel_label), menuitem); - gtk_widget_show(accel_label); + do + { + etype = etype && (seg->type == type); + ecolor = ecolor && (seg->color == color); - if (label) - *label = accel_label; + aseg = seg; + seg = seg->next; + } + while (aseg != g_editor->control_sel_r); - return menuitem; -} /* cpopup_create_menu_item_with_label */ + if (equal_blending) + *equal_blending = etype; + if (equal_coloring) + *equal_coloring = ecolor; +} /*****/ @@ -3590,104 +3694,105 @@ cpopup_render_color_box(GtkPreview *preview, double r, double g, double b, doubl gtk_preview_draw_row(preview, rows[2], 0, y, GRAD_COLOR_BOX_WIDTH); } /* cpopup_render_color_box */ +/***** Creale load & save menus *****/ /*****/ static GtkWidget * -cpopup_create_load_menu(GtkWidget **color_boxes, GtkWidget **labels, - char *label1, char *label2, GtkSignalFunc callback, - gchar accel_key_0, guint8 accel_mods_0, - gchar accel_key_1, guint8 accel_mods_1, - gchar accel_key_2, guint8 accel_mods_2) -{ - GtkWidget *menu; - GtkWidget *menuitem; - GtkAccelGroup *accel_group; - int i; +cpopup_create_load_menu (GtkWidget **color_boxes, + GtkWidget **labels, + gchar *label1, + gchar *label2, + GtkSignalFunc callback, + gchar accel_key_0, guint8 accel_mods_0, + gchar accel_key_1, guint8 accel_mods_1, + gchar accel_key_2, guint8 accel_mods_2) +{ + GtkWidget *menu; + GtkWidget *menuitem; + GtkAccelGroup *accel_group; + gint i; + + menu = gtk_menu_new (); + accel_group = g_editor->accel_group; - menu = gtk_menu_new(); - accel_group = g_editor->accel_group; + gtk_menu_set_accel_group (GTK_MENU (menu), accel_group); - gtk_menu_set_accel_group (GTK_MENU (menu), accel_group); + /* Create items */ + for (i = 0; i < (GRAD_NUM_COLORS + 3); i++) + { + if (i == 3) + { + /* Insert separator between "to fetch" and "saved" colors */ + menuitem = gtk_menu_item_new (); + gtk_menu_append (GTK_MENU (menu), menuitem); + gtk_widget_show (menuitem); + } - /* Create items */ + menuitem = cpopup_create_color_item (&color_boxes[i], &labels[i]); + gtk_signal_connect (GTK_OBJECT (menuitem), "activate", + callback, (gpointer) ((long) i)); + gtk_menu_append (GTK_MENU (menu), menuitem); + gtk_widget_show (menuitem); - for (i = 0; i < (GRAD_NUM_COLORS + 3); i++) { - if (i == 3) { - /* Insert separator between "to fetch" and "saved" colors */ - - menuitem = gtk_menu_item_new(); - gtk_menu_append(GTK_MENU(menu), menuitem); - gtk_widget_show(menuitem); - } /* if */ - - menuitem = cpopup_create_color_item(&color_boxes[i], &labels[i]); - gtk_signal_connect(GTK_OBJECT(menuitem), "activate", - callback, (gpointer) ((long) i)); /* FIXME: I don't like this cast */ - gtk_menu_append(GTK_MENU(menu), menuitem); - gtk_widget_show(menuitem); - - switch (i) { - case 0: - gtk_widget_add_accelerator(menuitem, - "activate", - accel_group, - accel_key_0, accel_mods_0, - GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED); - break; + switch (i) + { + case 0: + gtk_widget_add_accelerator (menuitem, "activate", + accel_group, + accel_key_0, accel_mods_0, + GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED); + break; - case 1: - gtk_widget_add_accelerator(menuitem, - "activate", - accel_group, - accel_key_1, accel_mods_1, - GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED); - break; + case 1: + gtk_widget_add_accelerator (menuitem, "activate", + accel_group, + accel_key_1, accel_mods_1, + GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED); + break; - case 2: - gtk_widget_add_accelerator(menuitem, - "activate", - accel_group, - accel_key_2, accel_mods_2, - GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED); - break; + case 2: + gtk_widget_add_accelerator (menuitem, "activate", + accel_group, + accel_key_2, accel_mods_2, + GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED); + break; - default: - break; - } /* switch */ - } /* for */ - - /* Set labels */ - - gtk_label_set(GTK_LABEL(labels[0]), label1); - gtk_label_set(GTK_LABEL(labels[1]), label2); - gtk_label_set(GTK_LABEL(labels[2]), _("FG color")); - - return menu; -} /* cpopup_create_load_menu */ + default: + break; + } + } + /* Set labels */ + gtk_label_set_text (GTK_LABEL (labels[0]), label1); + gtk_label_set_text (GTK_LABEL (labels[1]), label2); + gtk_label_set_text (GTK_LABEL (labels[2]), _("FG color")); -/*****/ + return menu; +} static GtkWidget * -cpopup_create_save_menu(GtkWidget **color_boxes, GtkWidget **labels, GtkSignalFunc callback) +cpopup_create_save_menu (GtkWidget **color_boxes, + GtkWidget **labels, + GtkSignalFunc callback) { - GtkWidget *menu; - GtkWidget *menuitem; - int i; + GtkWidget *menu; + GtkWidget *menuitem; + gint i; - menu = gtk_menu_new(); + menu = gtk_menu_new (); - for (i = 0; i < GRAD_NUM_COLORS; i++) { - menuitem = cpopup_create_color_item(&color_boxes[i], &labels[i]); - gtk_signal_connect(GTK_OBJECT(menuitem), "activate", - callback, (gpointer) ((long) i)); /* FIXME: I don't like this cast */ - gtk_menu_append(GTK_MENU(menu), menuitem); - gtk_widget_show(menuitem); - } /* for */ + for (i = 0; i < GRAD_NUM_COLORS; i++) + { + menuitem = cpopup_create_color_item (&color_boxes[i], &labels[i]); + gtk_signal_connect (GTK_OBJECT (menuitem), "activate", + callback, (gpointer) ((long) i)); + gtk_menu_append (GTK_MENU (menu), menuitem); + gtk_widget_show (menuitem); + } - return menu; -} /* cpopup_create_save_menu */ + return menu; +} /*****/ @@ -3708,10 +3813,10 @@ cpopup_update_saved_color(int n, double r, double g, double b, double a) g_snprintf(str, sizeof(str), _("RGBA (%0.3f, %0.3f, %0.3f, %0.3f)"), r, g, b, a); - gtk_label_set(GTK_LABEL(g_editor->left_load_labels[n + 3]), str); - gtk_label_set(GTK_LABEL(g_editor->left_save_labels[n]), str); - gtk_label_set(GTK_LABEL(g_editor->right_load_labels[n + 3]), str); - gtk_label_set(GTK_LABEL(g_editor->right_save_labels[n]), str); + gtk_label_set_text (GTK_LABEL (g_editor->left_load_labels[n + 3]), str); + gtk_label_set_text (GTK_LABEL (g_editor->left_save_labels[n]), str); + gtk_label_set_text (GTK_LABEL (g_editor->right_load_labels[n + 3]), str); + gtk_label_set_text (GTK_LABEL (g_editor->right_save_labels[n]), str); g_editor->saved_colors[n].r = r; g_editor->saved_colors[n].g = g; @@ -3880,1462 +3985,1435 @@ cpopup_save_right_callback(GtkWidget *widget, gpointer data) /*****/ -static GtkWidget * -cpopup_create_blending_menu(void) +static void +cpopup_set_color_selection_color(GtkColorSelection *cs, + double r, double g, double b, double a) { - GtkWidget *menu; - GtkWidget *menuitem; - GSList *group; - int i; - int num_items; - - menu = gtk_menu_new(); - group = NULL; - - num_items = sizeof(g_editor->control_blending_items) / sizeof(g_editor->control_blending_items[0]); - - for (i = 0; i < num_items; i++) { - if (i == (num_items - 1)) - menuitem = gtk_radio_menu_item_new_with_label(group, _("(Varies)")); - else - menuitem = gtk_radio_menu_item_new_with_label(group, gettext(blending_types[i])); - - group = gtk_radio_menu_item_group(GTK_RADIO_MENU_ITEM(menuitem)); - - gtk_signal_connect(GTK_OBJECT(menuitem), "activate", - (GtkSignalFunc) cpopup_blending_callback, - (gpointer) ((long) i)); /* FIXME: I don't like this cast */ - - gtk_menu_append(GTK_MENU(menu), menuitem); - gtk_widget_show(menuitem); - - g_editor->control_blending_items[i] = menuitem; - } /* for */ - - /* "Varies" is always disabled */ + gdouble color[4]; - gtk_widget_set_sensitive(g_editor->control_blending_items[num_items - 1], FALSE); + color[0] = r; + color[1] = g; + color[2] = b; + color[3] = a; - return menu; -} /* cpopup_create_blending_menu */ + gtk_color_selection_set_color(cs, color); +} /* cpopup_set_color_selection_color */ /*****/ static void -cpopup_blending_callback(GtkWidget *widget, gpointer data) +cpopup_get_color_selection_color(GtkColorSelection *cs, + double *r, double *g, double *b, double *a) { - grad_type_t type; - grad_segment_t *seg, *aseg; - - if (!GTK_CHECK_MENU_ITEM(widget)->active) - return; /* Do nothing if the menu item is being deactivated */ - - type = (grad_type_t) data; - seg = g_editor->control_sel_l; - - do { - seg->type = type; + gdouble color[4]; - aseg = seg; - seg = seg->next; - } while (aseg != g_editor->control_sel_r); + gtk_color_selection_get_color(cs, color); - curr_gradient->dirty = 1; - ed_update_editor(GRAD_UPDATE_PREVIEW); -} /* cpopup_blending_callback */ + *r = color[0]; + *g = color[1]; + *b = color[2]; + *a = color[3]; +} /* cpopup_get_color_selection_color */ /*****/ -static GtkWidget * -cpopup_create_coloring_menu(void) +static grad_segment_t * +cpopup_save_selection(void) { - GtkWidget *menu; - GtkWidget *menuitem; - GSList *group; - int i; - int num_items; + grad_segment_t *seg, *prev, *tmp; + grad_segment_t *oseg, *oaseg; + + prev = NULL; + oseg = g_editor->control_sel_l; + tmp = NULL; - menu = gtk_menu_new(); - group = NULL; + do { + seg = seg_new_segment(); - num_items = sizeof(g_editor->control_coloring_items) / sizeof(g_editor->control_coloring_items[0]); + *seg = *oseg; /* Copy everything */ - for (i = 0; i < num_items; i++) { - if (i == (num_items - 1)) - menuitem = gtk_radio_menu_item_new_with_label(group, _("(Varies)")); + if (prev == NULL) + tmp = seg; /* Remember first segment */ else - menuitem = gtk_radio_menu_item_new_with_label(group, gettext(coloring_types[i])); - - group = gtk_radio_menu_item_group(GTK_RADIO_MENU_ITEM(menuitem)); + prev->next = seg; - gtk_signal_connect(GTK_OBJECT(menuitem), "activate", - (GtkSignalFunc) cpopup_coloring_callback, - (gpointer) ((long) i)); /* FIXME: I don't like this cast */ + seg->prev = prev; + seg->next = NULL; - gtk_menu_append(GTK_MENU(menu), menuitem); - gtk_widget_show(menuitem); + prev = seg; + oaseg = oseg; + oseg = oseg->next; + } while (oaseg != g_editor->control_sel_r); - g_editor->control_coloring_items[i] = menuitem; - } /* for */ + return tmp; +} /* cpopup_save_selection */ - /* "Varies" is always disabled */ - gtk_widget_set_sensitive(g_editor->control_coloring_items[num_items - 1], FALSE); +/*****/ - return menu; -} /* cpopup_create_coloring_menu */ +static void +cpopup_free_selection(grad_segment_t *seg) +{ + seg_free_segments(seg); +} /* cpopup_free_selection */ /*****/ static void -cpopup_coloring_callback(GtkWidget *widget, gpointer data) +cpopup_replace_selection(grad_segment_t *replace_seg) { - grad_color_t color; - grad_segment_t *seg, *aseg; + grad_segment_t *lseg, *rseg; + grad_segment_t *replace_last; - if (!GTK_CHECK_MENU_ITEM(widget)->active) - return; /* Do nothing if the menu item is being deactivated */ + /* Remember left and right segments */ - color = (grad_color_t) data; - seg = g_editor->control_sel_l; + lseg = g_editor->control_sel_l->prev; + rseg = g_editor->control_sel_r->next; - do { - seg->color = color; + replace_last = seg_get_last_segment(replace_seg); - aseg = seg; - seg = seg->next; - } while (aseg != g_editor->control_sel_r); + /* Free old selection */ - curr_gradient->dirty = 1; - ed_update_editor(GRAD_UPDATE_PREVIEW); -} /* cpopup_coloring_callback */ + g_editor->control_sel_r->next = NULL; + seg_free_segments(g_editor->control_sel_l); -/*****/ + /* Link in new segments */ -static GtkWidget * -cpopup_create_sel_ops_menu(void) -{ - GtkWidget *menu; - GtkWidget *menuitem; - GtkAccelGroup *accel_group; - - menu = gtk_menu_new(); - accel_group = g_editor->accel_group; - - gtk_menu_set_accel_group (GTK_MENU (menu), accel_group); - - /* Flip */ - - menuitem = cpopup_create_menu_item_with_label("", &g_editor->control_flip_label); - gtk_signal_connect(GTK_OBJECT(menuitem), "activate", - (GtkSignalFunc) cpopup_flip_callback, - NULL); - gtk_menu_append(GTK_MENU(menu), menuitem); - gtk_widget_show(menuitem); - gtk_widget_add_accelerator(menuitem, - "activate", - accel_group, - 'F', 0, - GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED); - - /* Replicate */ - - menuitem = cpopup_create_menu_item_with_label("", &g_editor->control_replicate_label); - gtk_signal_connect(GTK_OBJECT(menuitem), "activate", - (GtkSignalFunc) cpopup_replicate_callback, - NULL); - gtk_menu_append(GTK_MENU(menu), menuitem); - gtk_widget_show(menuitem); - gtk_widget_add_accelerator(menuitem, - "activate", - accel_group, - 'M', 0, - GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED); - - /* Blend colors / opacity */ - - menuitem = gtk_menu_item_new(); - gtk_menu_append(GTK_MENU(menu), menuitem); - gtk_widget_show(menuitem); - - menuitem = gtk_menu_item_new_with_label(_("Blend endpoints' colors")); - gtk_signal_connect(GTK_OBJECT(menuitem), "activate", - (GtkSignalFunc) cpopup_blend_colors, - NULL); - gtk_menu_append(GTK_MENU(menu), menuitem); - gtk_widget_show(menuitem); - g_editor->control_blend_colors_menu_item = menuitem; - gtk_widget_add_accelerator(menuitem, - "activate", - accel_group, - 'B', 0, - GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED); - - menuitem = gtk_menu_item_new_with_label(_("Blend endpoints' opacity")); - gtk_signal_connect(GTK_OBJECT(menuitem), "activate", - (GtkSignalFunc) cpopup_blend_opacity, - NULL); - gtk_menu_append(GTK_MENU(menu), menuitem); - gtk_widget_show(menuitem); - gtk_widget_add_accelerator(menuitem, - "activate", - accel_group, - 'B', GDK_CONTROL_MASK, - GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED); - g_editor->control_blend_opacity_menu_item = menuitem; - - return menu; -} /* cpopup_create_sel_ops_menu */ + if (lseg) + lseg->next = replace_seg; + else + curr_gradient->segments = replace_seg; + replace_seg->prev = lseg; -/*****/ + if (rseg) + rseg->prev = replace_last; -static void -cpopup_blend_colors(GtkWidget *widget, gpointer data) -{ - cpopup_blend_endpoints(g_editor->control_sel_l->r0, - g_editor->control_sel_l->g0, - g_editor->control_sel_l->b0, - g_editor->control_sel_l->a0, - g_editor->control_sel_r->r1, - g_editor->control_sel_r->g1, - g_editor->control_sel_r->b1, - g_editor->control_sel_r->a1, - TRUE, FALSE); + replace_last->next = rseg; - curr_gradient->dirty = 1; - ed_update_editor(GRAD_UPDATE_PREVIEW); -} /* cpopup_blend_colors */ + g_editor->control_sel_l = replace_seg; + g_editor->control_sel_r = replace_last; + + curr_gradient->last_visited = NULL; /* Force re-search */ +} /* cpopup_replace_selection */ +/***** Color dialogs for left and right endpoint *****/ /*****/ static void -cpopup_blend_opacity(GtkWidget *widget, gpointer data) -{ - cpopup_blend_endpoints(g_editor->control_sel_l->r0, - g_editor->control_sel_l->g0, - g_editor->control_sel_l->b0, - g_editor->control_sel_l->a0, - g_editor->control_sel_r->r1, - g_editor->control_sel_r->g1, - g_editor->control_sel_r->b1, - g_editor->control_sel_r->a1, - FALSE, TRUE); +cpopup_create_color_dialog (gchar *title, + double r, double g, double b, double a, + GtkSignalFunc color_changed_callback, + GtkSignalFunc ok_callback, + GtkSignalFunc cancel_callback, + GtkSignalFunc delete_callback) +{ + GtkWidget *window; + GtkColorSelection *cs; + GtkColorSelectionDialog *csd; + + window = gtk_color_selection_dialog_new (title); + + csd = GTK_COLOR_SELECTION_DIALOG (window); + cs = GTK_COLOR_SELECTION (csd->colorsel); + + gtk_color_selection_set_opacity (cs, TRUE); + gtk_color_selection_set_update_policy (cs, + g_editor->instant_update ? + GTK_UPDATE_CONTINUOUS : + GTK_UPDATE_DELAYED); + + /* FIXME: this is a hack; we set the color twice so that the + * color selector remembers it as its "old" color, too + */ + cpopup_set_color_selection_color (cs, r, g, b, a); + cpopup_set_color_selection_color (cs, r, g, b, a); - curr_gradient->dirty = 1; - ed_update_editor(GRAD_UPDATE_PREVIEW); -} /* cpopup_blend_opacity */ + gtk_signal_connect (GTK_OBJECT (csd), "delete_event", + delete_callback, window); + gtk_signal_connect (GTK_OBJECT (cs), "color_changed", + color_changed_callback, window); -/*****/ + gtk_signal_connect (GTK_OBJECT (csd->ok_button), "clicked", + ok_callback, window); -static void -cpopup_set_color_selection_color(GtkColorSelection *cs, - double r, double g, double b, double a) -{ - gdouble color[4]; - - color[0] = r; - color[1] = g; - color[2] = b; - color[3] = a; - - gtk_color_selection_set_color(cs, color); -} /* cpopup_set_color_selection_color */ + gtk_signal_connect (GTK_OBJECT (csd->cancel_button), "clicked", + cancel_callback, window); + gtk_window_position (GTK_WINDOW (window), GTK_WIN_POS_MOUSE); + gtk_widget_show (window); +} /*****/ static void -cpopup_get_color_selection_color(GtkColorSelection *cs, - double *r, double *g, double *b, double *a) -{ - gdouble color[4]; - - gtk_color_selection_get_color(cs, color); +cpopup_set_left_color_callback (GtkWidget *widget, + gpointer data) +{ + g_editor->left_saved_dirty = curr_gradient->dirty; + g_editor->left_saved_segments = cpopup_save_selection (); + + cpopup_create_color_dialog (_("Left endpoint's color"), + g_editor->control_sel_l->r0, + g_editor->control_sel_l->g0, + g_editor->control_sel_l->b0, + g_editor->control_sel_l->a0, + (GtkSignalFunc) cpopup_left_color_changed, + (GtkSignalFunc) cpopup_left_color_dialog_ok, + (GtkSignalFunc) cpopup_left_color_dialog_cancel, + (GtkSignalFunc) cpopup_left_color_dialog_delete); - *r = color[0]; - *g = color[1]; - *b = color[2]; - *a = color[3]; -} /* cpopup_get_color_selection_color */ - - -/*****/ + gtk_widget_set_sensitive (g_editor->shell, FALSE); +} static void -cpopup_create_color_dialog(char *title, double r, double g, double b, double a, - GtkSignalFunc color_changed_callback, - GtkSignalFunc ok_callback, - GtkSignalFunc cancel_callback, - GtkSignalFunc delete_callback) +cpopup_left_color_changed (GtkWidget *widget, + gpointer data) { - GtkWidget *window; - GtkColorSelection *cs; - GtkColorSelectionDialog *csd; - - window = gtk_color_selection_dialog_new(title); - - csd = GTK_COLOR_SELECTION_DIALOG(window); - cs = GTK_COLOR_SELECTION(csd->colorsel); - - gtk_color_selection_set_opacity(cs, TRUE); - gtk_color_selection_set_update_policy(cs, - g_editor->instant_update ? - GTK_UPDATE_CONTINUOUS : - GTK_UPDATE_DELAYED); - - - /* FIXME: this is a hack; we set the color twice so that the - * color selector remembers it as its "old" color, too - */ + GtkColorSelection *cs; + double r, g, b, a; - cpopup_set_color_selection_color(cs, r, g, b, a); - cpopup_set_color_selection_color(cs, r, g, b, a); + cs = GTK_COLOR_SELECTION (GTK_COLOR_SELECTION_DIALOG (data)->colorsel); - gtk_signal_connect(GTK_OBJECT(csd), "delete_event", - delete_callback, NULL); + cpopup_get_color_selection_color (cs, &r, &g, &b, &a); - gtk_signal_connect(GTK_OBJECT(cs), "color_changed", - color_changed_callback, window); + cpopup_blend_endpoints (r, g, b, a, + g_editor->control_sel_r->r1, + g_editor->control_sel_r->g1, + g_editor->control_sel_r->b1, + g_editor->control_sel_r->a1, + TRUE, TRUE); - gtk_signal_connect(GTK_OBJECT(csd->ok_button), "clicked", - ok_callback, window); - - gtk_signal_connect(GTK_OBJECT(csd->cancel_button), "clicked", - cancel_callback, window); - - gtk_window_position(GTK_WINDOW(window), GTK_WIN_POS_MOUSE); - gtk_widget_show(window); -} /* cpopup_create_color_dialog */ - - -/*****/ + ed_update_editor (GRAD_UPDATE_PREVIEW); +} -static grad_segment_t * -cpopup_save_selection(void) +static void +cpopup_left_color_dialog_ok (GtkWidget *widget, + gpointer data) { - grad_segment_t *seg, *prev, *tmp; - grad_segment_t *oseg, *oaseg; + cpopup_left_color_changed (widget, data); - prev = NULL; - oseg = g_editor->control_sel_l; - tmp = NULL; - - do { - seg = seg_new_segment(); + curr_gradient->dirty = 1; + cpopup_free_selection(g_editor->left_saved_segments); - *seg = *oseg; /* Copy everything */ - - if (prev == NULL) - tmp = seg; /* Remember first segment */ - else - prev->next = seg; + gtk_widget_destroy (GTK_WIDGET (data)); + gtk_widget_set_sensitive (g_editor->shell, TRUE); +} - seg->prev = prev; - seg->next = NULL; +static void +cpopup_left_color_dialog_cancel (GtkWidget *widget, + gpointer data) +{ + curr_gradient->dirty = g_editor->left_saved_dirty; + cpopup_replace_selection (g_editor->left_saved_segments); + ed_update_editor (GRAD_UPDATE_PREVIEW); - prev = seg; - oaseg = oseg; - oseg = oseg->next; - } while (oaseg != g_editor->control_sel_r); + gtk_widget_destroy (GTK_WIDGET (data)); + gtk_widget_set_sensitive (g_editor->shell, TRUE); +} - return tmp; -} /* cpopup_save_selection */ +static int +cpopup_left_color_dialog_delete (GtkWidget *widget, + GdkEvent *event, + gpointer data) +{ + cpopup_left_color_dialog_cancel (widget, data); + return TRUE; +} /*****/ static void -cpopup_free_selection(grad_segment_t *seg) -{ - seg_free_segments(seg); -} /* cpopup_free_selection */ - +cpopup_set_right_color_callback (GtkWidget *widget, + gpointer data) +{ + g_editor->right_saved_dirty = curr_gradient->dirty; + g_editor->right_saved_segments = cpopup_save_selection (); + + cpopup_create_color_dialog (_("Right endpoint's color"), + g_editor->control_sel_r->r1, + g_editor->control_sel_r->g1, + g_editor->control_sel_r->b1, + g_editor->control_sel_r->a1, + (GtkSignalFunc) cpopup_right_color_changed, + (GtkSignalFunc) cpopup_right_color_dialog_ok, + (GtkSignalFunc) cpopup_right_color_dialog_cancel, + (GtkSignalFunc) cpopup_right_color_dialog_delete); -/*****/ + gtk_widget_set_sensitive (g_editor->shell, FALSE); +} static void -cpopup_replace_selection(grad_segment_t *replace_seg) +cpopup_right_color_changed (GtkWidget *widget, + gpointer data) { - grad_segment_t *lseg, *rseg; - grad_segment_t *replace_last; - - /* Remember left and right segments */ + GtkColorSelection *cs; + double r, g, b, a; - lseg = g_editor->control_sel_l->prev; - rseg = g_editor->control_sel_r->next; + cs = GTK_COLOR_SELECTION (GTK_COLOR_SELECTION_DIALOG (data)->colorsel); - replace_last = seg_get_last_segment(replace_seg); + cpopup_get_color_selection_color (cs, &r, &g, &b, &a); - /* Free old selection */ + cpopup_blend_endpoints (g_editor->control_sel_l->r0, + g_editor->control_sel_l->g0, + g_editor->control_sel_l->b0, + g_editor->control_sel_l->a0, + r, g, b, a, + TRUE, TRUE); - g_editor->control_sel_r->next = NULL; - - seg_free_segments(g_editor->control_sel_l); + ed_update_editor (GRAD_UPDATE_PREVIEW); +} - /* Link in new segments */ +static void +cpopup_right_color_dialog_ok (GtkWidget *widget, + gpointer data) +{ + cpopup_right_color_changed (widget, data); - if (lseg) - lseg->next = replace_seg; - else - curr_gradient->segments = replace_seg; + curr_gradient->dirty = 1; + cpopup_free_selection (g_editor->right_saved_segments); - replace_seg->prev = lseg; + gtk_widget_destroy (GTK_WIDGET (data)); + gtk_widget_set_sensitive (g_editor->shell, TRUE); +} - if (rseg) - rseg->prev = replace_last; +static void +cpopup_right_color_dialog_cancel (GtkWidget *widget, + gpointer data) +{ + curr_gradient->dirty = g_editor->right_saved_dirty; + cpopup_replace_selection (g_editor->right_saved_segments); + ed_update_editor (GRAD_UPDATE_PREVIEW); - replace_last->next = rseg; + gtk_widget_destroy (GTK_WIDGET (data)); + gtk_widget_set_sensitive (g_editor->shell, TRUE); +} - g_editor->control_sel_l = replace_seg; - g_editor->control_sel_r = replace_last; +static int +cpopup_right_color_dialog_delete (GtkWidget *widget, + GdkEvent *event, + gpointer data) +{ + cpopup_right_color_dialog_cancel (widget, data); - curr_gradient->last_visited = NULL; /* Force re-search */ -} /* cpopup_replace_selection */ + return TRUE; +} +/***** Blending menu *****/ /*****/ -static void -cpopup_set_left_color_callback(GtkWidget *widget, gpointer data) +static GtkWidget * +cpopup_create_blending_menu (void) { - g_editor->left_saved_dirty = curr_gradient->dirty; - g_editor->left_saved_segments = cpopup_save_selection(); - - cpopup_create_color_dialog(_("Left endpoint's color"), - g_editor->control_sel_l->r0, - g_editor->control_sel_l->g0, - g_editor->control_sel_l->b0, - g_editor->control_sel_l->a0, - (GtkSignalFunc) cpopup_left_color_changed, - (GtkSignalFunc) cpopup_left_color_dialog_ok, - (GtkSignalFunc) cpopup_left_color_dialog_cancel, - (GtkSignalFunc) cpopup_left_color_dialog_delete); - - gtk_widget_set_sensitive(g_editor->shell, FALSE); -} /* cpopup_set_left_color_callback */ + GtkWidget *menu; + GtkWidget *menuitem; + GSList *group; + gint i; + gint num_items; + menu = gtk_menu_new (); + group = NULL; -/*****/ + num_items = (sizeof (g_editor->control_blending_items) / + sizeof (g_editor->control_blending_items[0])); -static void -cpopup_left_color_changed(GtkWidget *widget, gpointer client_data) -{ - GtkColorSelection *cs; - double r, g, b, a; + for (i = 0; i < num_items; i++) + { + if (i == (num_items - 1)) + menuitem = gtk_radio_menu_item_new_with_label(group, _("(Varies)")); + else + menuitem = + gtk_radio_menu_item_new_with_label (group, + gettext (blending_types[i])); - cs = GTK_COLOR_SELECTION(GTK_COLOR_SELECTION_DIALOG(client_data)->colorsel); + group = gtk_radio_menu_item_group (GTK_RADIO_MENU_ITEM (menuitem)); - cpopup_get_color_selection_color(cs, &r, &g, &b, &a); + gtk_signal_connect (GTK_OBJECT (menuitem), "activate", + (GtkSignalFunc) cpopup_blending_callback, + (gpointer) ((long) i)); - cpopup_blend_endpoints(r, g, b, a, - g_editor->control_sel_r->r1, - g_editor->control_sel_r->g1, - g_editor->control_sel_r->b1, - g_editor->control_sel_r->a1, - TRUE, TRUE); + gtk_menu_append (GTK_MENU (menu), menuitem); + gtk_widget_show (menuitem); - ed_update_editor(GRAD_UPDATE_PREVIEW); -} /* cpopup_left_color_changed */ + g_editor->control_blending_items[i] = menuitem; + } + /* "Varies" is always disabled */ + gtk_widget_set_sensitive (g_editor->control_blending_items[num_items - 1], FALSE); -/*****/ + return menu; +} static void -cpopup_left_color_dialog_ok(GtkWidget *widget, gpointer client_data) +cpopup_blending_callback (GtkWidget *widget, + gpointer data) { - GtkColorSelection *cs; - double r, g, b, a; + grad_type_t type; + grad_segment_t *seg, *aseg; - cs = GTK_COLOR_SELECTION(GTK_COLOR_SELECTION_DIALOG(client_data)->colorsel); + if (!GTK_CHECK_MENU_ITEM (widget)->active) + return; /* Do nothing if the menu item is being deactivated */ - cpopup_get_color_selection_color(cs, &r, &g, &b, &a); + type = (grad_type_t) data; + seg = g_editor->control_sel_l; - cpopup_blend_endpoints(r, g, b, a, - g_editor->control_sel_r->r1, - g_editor->control_sel_r->g1, - g_editor->control_sel_r->b1, - g_editor->control_sel_r->a1, - TRUE, TRUE); + do + { + seg->type = type; - curr_gradient->dirty = 1; - cpopup_free_selection(g_editor->left_saved_segments); - ed_update_editor(GRAD_UPDATE_PREVIEW); + aseg = seg; + seg = seg->next; + } + while (aseg != g_editor->control_sel_r); - gtk_widget_destroy(GTK_WIDGET(client_data)); - gtk_widget_set_sensitive(g_editor->shell, TRUE); -} /* cpopup_left_color_dialog_ok */ + curr_gradient->dirty = 1; + ed_update_editor (GRAD_UPDATE_PREVIEW); +} +/***** Coloring menu *****/ /*****/ -static void -cpopup_left_color_dialog_cancel(GtkWidget *widget, gpointer client_data) +static GtkWidget * +cpopup_create_coloring_menu (void) { - curr_gradient->dirty = g_editor->left_saved_dirty; - cpopup_replace_selection(g_editor->left_saved_segments); - ed_update_editor(GRAD_UPDATE_PREVIEW); - - gtk_widget_destroy(GTK_WIDGET(client_data)); - gtk_widget_set_sensitive(g_editor->shell, TRUE); -} /* cpopup_left_color_dialog_cancel */ + GtkWidget *menu; + GtkWidget *menuitem; + GSList *group; + gint i; + gint num_items; + menu = gtk_menu_new (); + group = NULL; -/*****/ + num_items = (sizeof (g_editor->control_coloring_items) / + sizeof (g_editor->control_coloring_items[0])); -static int -cpopup_left_color_dialog_delete(GtkWidget *widget, GdkEvent *event, - gpointer data) -{ - curr_gradient->dirty = g_editor->left_saved_dirty; - cpopup_replace_selection(g_editor->left_saved_segments); - ed_update_editor(GRAD_UPDATE_PREVIEW); - - gtk_widget_set_sensitive(g_editor->shell, TRUE); - return FALSE; -} /* cpopup_left_color_dialog_delete */ + for (i = 0; i < num_items; i++) + { + if (i == (num_items - 1)) + menuitem = gtk_radio_menu_item_new_with_label(group, _("(Varies)")); + else + menuitem = gtk_radio_menu_item_new_with_label (group, gettext (coloring_types[i])); -/*****/ + group = gtk_radio_menu_item_group (GTK_RADIO_MENU_ITEM (menuitem)); -static void -cpopup_set_right_color_callback(GtkWidget *widget, gpointer data) -{ - g_editor->right_saved_dirty = curr_gradient->dirty; - g_editor->right_saved_segments = cpopup_save_selection(); + gtk_signal_connect (GTK_OBJECT (menuitem), "activate", + (GtkSignalFunc) cpopup_coloring_callback, + (gpointer) ((long) i)); - cpopup_create_color_dialog(_("Right endpoint's color"), - g_editor->control_sel_r->r1, - g_editor->control_sel_r->g1, - g_editor->control_sel_r->b1, - g_editor->control_sel_r->a1, - (GtkSignalFunc) cpopup_right_color_changed, - (GtkSignalFunc) cpopup_right_color_dialog_ok, - (GtkSignalFunc) cpopup_right_color_dialog_cancel, - (GtkSignalFunc) cpopup_right_color_dialog_delete); + gtk_menu_append (GTK_MENU (menu), menuitem); + gtk_widget_show (menuitem); - gtk_widget_set_sensitive(g_editor->shell, FALSE); -} /* cpopup_set_right_color_callback */ + g_editor->control_coloring_items[i] = menuitem; + } + /* "Varies" is always disabled */ + gtk_widget_set_sensitive (g_editor->control_coloring_items[num_items - 1], FALSE); -/*****/ + return menu; +} static void -cpopup_right_color_changed(GtkWidget *widget, gpointer client_data) +cpopup_coloring_callback (GtkWidget *widget, + gpointer data) { - GtkColorSelection *cs; - double r, g, b, a; + grad_color_t color; + grad_segment_t *seg, *aseg; - cs = GTK_COLOR_SELECTION(GTK_COLOR_SELECTION_DIALOG(client_data)->colorsel); + if (! GTK_CHECK_MENU_ITEM (widget)->active) + return; /* Do nothing if the menu item is being deactivated */ - cpopup_get_color_selection_color(cs, &r, &g, &b, &a); + color = (grad_color_t) data; + seg = g_editor->control_sel_l; - cpopup_blend_endpoints(g_editor->control_sel_l->r0, - g_editor->control_sel_l->g0, - g_editor->control_sel_l->b0, - g_editor->control_sel_l->a0, - r, g, b, a, - TRUE, TRUE); + do + { + seg->color = color; - ed_update_editor(GRAD_UPDATE_PREVIEW); -} /* cpopup_right_color_changed */ + aseg = seg; + seg = seg->next; + } + while (aseg != g_editor->control_sel_r); + curr_gradient->dirty = 1; + ed_update_editor (GRAD_UPDATE_PREVIEW); +} /*****/ static void -cpopup_right_color_dialog_ok(GtkWidget *widget, gpointer client_data) +cpopup_split_midpoint_callback (GtkWidget *widget, + gpointer data) { - GtkColorSelection *cs; - double r, g, b, a; + grad_segment_t *seg, *lseg, *rseg; - cs = GTK_COLOR_SELECTION(GTK_COLOR_SELECTION_DIALOG(client_data)->colorsel); + seg = g_editor->control_sel_l; - cpopup_get_color_selection_color(cs, &r, &g, &b, &a); + do + { + cpopup_split_midpoint (seg, &lseg, &rseg); + seg = rseg->next; + } + while (lseg != g_editor->control_sel_r); - cpopup_blend_endpoints(g_editor->control_sel_l->r0, - g_editor->control_sel_l->g0, - g_editor->control_sel_l->b0, - g_editor->control_sel_l->a0, - r, g, b, a, - TRUE, TRUE); + g_editor->control_sel_r = rseg; - curr_gradient->dirty = 1; - cpopup_free_selection(g_editor->right_saved_segments); - ed_update_editor(GRAD_UPDATE_PREVIEW); + curr_gradient->last_visited = NULL; /* Force re-search */ + curr_gradient->dirty = 1; + ed_update_editor (GRAD_UPDATE_PREVIEW | GRAD_UPDATE_CONTROL); +} - gtk_widget_destroy(GTK_WIDGET(client_data)); - gtk_widget_set_sensitive(g_editor->shell, TRUE); -} /* cpopup_right_color_dialog_ok */ +static void +cpopup_split_midpoint (grad_segment_t *lseg, + grad_segment_t **newl, + grad_segment_t **newr) +{ + double r, g, b, a; + grad_segment_t *newseg; + /* Get color at original segment's midpoint */ + grad_get_color_at(lseg->middle, &r, &g, &b, &a); -/*****/ + /* Create a new segment and insert it in the list */ -static void -cpopup_right_color_dialog_cancel(GtkWidget *widget, gpointer client_data) -{ - curr_gradient->dirty = g_editor->right_saved_dirty; - cpopup_replace_selection(g_editor->right_saved_segments); - ed_update_editor(GRAD_UPDATE_PREVIEW); + newseg = seg_new_segment(); - gtk_widget_destroy(GTK_WIDGET(client_data)); - gtk_widget_set_sensitive(g_editor->shell, TRUE); -} /* cpopup_right_color_dialog_cancel */ + newseg->prev = lseg; + newseg->next = lseg->next; + lseg->next = newseg; -/*****/ + if (newseg->next) + newseg->next->prev = newseg; -static int -cpopup_right_color_dialog_delete(GtkWidget *widget, GdkEvent *event, - gpointer data) -{ - curr_gradient->dirty = g_editor->right_saved_dirty; - cpopup_replace_selection(g_editor->right_saved_segments); - ed_update_editor(GRAD_UPDATE_PREVIEW); + /* Set coordinates of new segment */ - gtk_widget_set_sensitive(g_editor->shell, TRUE); - return FALSE; -} /* cpopup_right_color_dialog_delete */ + newseg->left = lseg->middle; + newseg->right = lseg->right; + newseg->middle = (newseg->left + newseg->right) / 2.0; + /* Set coordinates of original segment */ -/*****/ + lseg->right = newseg->left; + lseg->middle = (lseg->left + lseg->right) / 2.0; -static void -cpopup_split_midpoint_callback(GtkWidget *widget, gpointer data) -{ - grad_segment_t *seg, *lseg, *rseg; + /* Set colors of both segments */ - seg = g_editor->control_sel_l; + newseg->r1 = lseg->r1; + newseg->g1 = lseg->g1; + newseg->b1 = lseg->b1; + newseg->a1 = lseg->a1; - do { - cpopup_split_midpoint(seg, &lseg, &rseg); - seg = rseg->next; - } while (lseg != g_editor->control_sel_r); + lseg->r1 = newseg->r0 = r; + lseg->g1 = newseg->g0 = g; + lseg->b1 = newseg->b0 = b; + lseg->a1 = newseg->a0 = a; - g_editor->control_sel_r = rseg; + /* Set parameters of new segment */ - curr_gradient->last_visited = NULL; /* Force re-search */ - curr_gradient->dirty = 1; - ed_update_editor(GRAD_UPDATE_PREVIEW | GRAD_UPDATE_CONTROL); -} /* cpopup_split_midpoint_callback */ + newseg->type = lseg->type; + newseg->color = lseg->color; + + /* Done */ + *newl = lseg; + *newr = newseg; +} /*****/ static void -cpopup_split_uniform_callback(GtkWidget *widget, - gpointer data) +cpopup_split_uniform_callback (GtkWidget *widget, + gpointer data) { GtkWidget *dialog; GtkWidget *vbox; GtkWidget *label; GtkWidget *scale; - GtkWidget *button; GtkObject *scale_data; - /* Create dialog window */ + static ActionAreaItem action_items[] = + { + { N_("Split"), cpopup_split_uniform_split_callback, NULL, NULL }, + { N_("Cancel"), cpopup_split_uniform_cancel_callback, NULL, NULL } + }; + /* Create dialog window */ dialog = gtk_dialog_new (); + gtk_window_set_wmclass (GTK_WINDOW (g_editor->shell), + "gradient_segment_split_uniformly", "Gimp"); gtk_window_set_title (GTK_WINDOW (dialog), (g_editor->control_sel_l == g_editor->control_sel_r) ? _("Split segment uniformly") : _("Split segments uniformly")); gtk_window_position (GTK_WINDOW (dialog), GTK_WIN_POS_MOUSE); - gtk_container_set_border_width (GTK_CONTAINER (dialog), 0); + /* Handle the wm delete event */ + gtk_signal_connect (GTK_OBJECT (dialog), "delete_event", + GTK_SIGNAL_FUNC (cpopup_split_uniform_delete_callback), + dialog); + + /* The main vbox */ vbox = gtk_vbox_new (FALSE, 0); - gtk_container_set_border_width (GTK_CONTAINER (vbox), 8); - gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), vbox, - FALSE, FALSE, 0); + gtk_container_set_border_width (GTK_CONTAINER (vbox), 6); + gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), vbox); gtk_widget_show (vbox); - /* Instructions */ - + /* Instructions */ label = gtk_label_new (_("Please select the number of uniform parts")); - gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.0); gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0); gtk_widget_show (label); - label = gtk_label_new ((g_editor->control_sel_l == g_editor->control_sel_r) ? - _("in which you want to split the selected segment") : - _("in which you want to split the segments in the selection")); - gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.0); + label = + gtk_label_new ((g_editor->control_sel_l == g_editor->control_sel_r) ? + _("in which you want to split the selected segment") : + _("in which you want to split the segments in the selection")); gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0); gtk_widget_show (label); - /* Scale */ - + /* Scale */ g_editor->split_parts = 2; scale_data = gtk_adjustment_new (2.0, 2.0, 21.0, 1.0, 1.0, 1.0); scale = gtk_hscale_new (GTK_ADJUSTMENT (scale_data)); gtk_scale_set_digits (GTK_SCALE (scale), 0); gtk_scale_set_value_pos (GTK_SCALE (scale), GTK_POS_TOP); - gtk_box_pack_start (GTK_BOX (vbox), scale, FALSE, TRUE, 8); + gtk_box_pack_start (GTK_BOX (vbox), scale, FALSE, FALSE, 4); gtk_widget_show (scale); gtk_signal_connect (scale_data, "value_changed", (GtkSignalFunc) cpopup_split_uniform_scale_update, NULL); - /* Buttons */ - - button = ed_create_button (_("Split"), 0.5, 0.5, - (GtkSignalFunc) cpopup_split_uniform_split_callback, - (gpointer) dialog); - GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT); - gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->action_area), - button, TRUE, TRUE, 0); - gtk_widget_grab_default (button); - gtk_widget_show (button); - - button = ed_create_button (_("Cancel"), 0.5, 0.5, - (GtkSignalFunc) cpopup_split_uniform_cancel_callback, - (gpointer) dialog); - GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT); - gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->action_area), - button, TRUE, TRUE, 0); - gtk_widget_show (button); - - /* Show! */ + /* The action area */ + action_items[0].user_data = dialog; + action_items[1].user_data = dialog; + build_action_area (GTK_DIALOG (dialog), action_items, 2, 0); + /* Show! */ gtk_widget_show (dialog); gtk_widget_set_sensitive (g_editor->shell, FALSE); -} /* cpopup_split_uniform_callback */ - - -/*****/ +} static void -cpopup_delete_callback(GtkWidget *widget, gpointer data) +cpopup_split_uniform_scale_update (GtkAdjustment *adjustment, + gpointer data) { - grad_segment_t *lseg, *rseg, *seg, *aseg, *next; - double join; - - /* Remember segments to the left and to the right of the selection */ - - lseg = g_editor->control_sel_l->prev; - rseg = g_editor->control_sel_r->next; - - /* Cannot delete all the segments in the gradient */ - - if ((lseg == NULL) && (rseg == NULL)) - return; - - /* Calculate join point */ - - join = (g_editor->control_sel_l->left + g_editor->control_sel_r->right) / 2.0; - - if (lseg == NULL) - join = 0.0; - else if (rseg == NULL) - join = 1.0; - - /* Move segments */ - - if (lseg != NULL) - control_compress_range(lseg, lseg, lseg->left, join); - - if (rseg != NULL) - control_compress_range(rseg, rseg, join, rseg->right); - - /* Link */ - - if (lseg) - lseg->next = rseg; - - if (rseg) - rseg->prev = lseg; - - /* Delete old segments */ - - seg = g_editor->control_sel_l; - - do { - next = seg->next; - aseg = seg; + g_editor->split_parts = (gint) (adjustment->value + 0.5); +} - seg_free_segment(seg); +static void +cpopup_split_uniform_split_callback (GtkWidget *widget, + gpointer data) +{ + grad_segment_t *seg, *aseg, *lseg, *rseg, *lsel; - seg = next; - } while (aseg != g_editor->control_sel_r); + gtk_widget_destroy (GTK_WIDGET (data)); + gtk_widget_set_sensitive (g_editor->shell, TRUE); - /* Change selection */ + seg = g_editor->control_sel_l; + lsel = NULL; - if (rseg) { - g_editor->control_sel_l = rseg; - g_editor->control_sel_r = rseg; - } else { - g_editor->control_sel_l = lseg; - g_editor->control_sel_r = lseg; - } /* else */ + do + { + aseg = seg; - if (lseg == NULL) - curr_gradient->segments = rseg; + cpopup_split_uniform (seg, g_editor->split_parts, &lseg, &rseg); - /* Done */ + if (seg == g_editor->control_sel_l) + lsel = lseg; - curr_gradient->last_visited = NULL; /* Force re-search */ - curr_gradient->dirty = 1; - - ed_update_editor(GRAD_UPDATE_PREVIEW | GRAD_UPDATE_CONTROL); -} /* cpopup_delete_callback */ + seg = rseg->next; + } + while (aseg != g_editor->control_sel_r); + g_editor->control_sel_l = lsel; + g_editor->control_sel_r = rseg; -/*****/ + curr_gradient->last_visited = NULL; /* Force re-search */ + curr_gradient->dirty = 1; + ed_update_editor (GRAD_UPDATE_PREVIEW | GRAD_UPDATE_CONTROL); +} static void -cpopup_recenter_callback(GtkWidget *wiodget, gpointer data) +cpopup_split_uniform_cancel_callback (GtkWidget *widget, + gpointer data) { - grad_segment_t *seg, *aseg; - - seg = g_editor->control_sel_l; - - do { - seg->middle = (seg->left + seg->right) / 2.0; - - aseg = seg; - seg = seg->next; - } while (aseg != g_editor->control_sel_r); - - curr_gradient->dirty = 1; - ed_update_editor(GRAD_UPDATE_PREVIEW | GRAD_UPDATE_CONTROL); -} /* cpopup_recenter_callback */ - - -/*****/ + gtk_widget_destroy (GTK_WIDGET (data)); + gtk_widget_set_sensitive (g_editor->shell, TRUE); +} -static void -cpopup_redistribute_callback(GtkWidget *widget, gpointer data) +static gint +cpopup_split_uniform_delete_callback (GtkWidget *widget, + GdkEvent *event, + gpointer data) { - grad_segment_t *seg, *aseg; - double left, right, seg_len; - int num_segs; - int i; + cpopup_split_uniform_cancel_callback (widget, data); - /* Count number of segments in selection */ - - num_segs = 0; - seg = g_editor->control_sel_l; - - do { - num_segs++; - aseg = seg; - seg = seg->next; - } while (aseg != g_editor->control_sel_r); - - /* Calculate new segment length */ - - left = g_editor->control_sel_l->left; - right = g_editor->control_sel_r->right; - seg_len = (right - left) / num_segs; - - /* Redistribute */ - - seg = g_editor->control_sel_l; - - for (i = 0; i < num_segs; i++) { - seg->left = left + i * seg_len; - seg->right = left + (i + 1) * seg_len; - seg->middle = (seg->left + seg->right) / 2.0; - - seg = seg->next; - } /* for */ - - /* Fix endpoints to squish accumulative error */ - - g_editor->control_sel_l->left = left; - g_editor->control_sel_r->right = right; - - /* Done */ - - curr_gradient->dirty = 1; - ed_update_editor(GRAD_UPDATE_PREVIEW | GRAD_UPDATE_CONTROL); -} /* cpopup_redistribute_callback */ - - -/*****/ + return TRUE; +} static void -cpopup_flip_callback(GtkWidget *widget, gpointer data) +cpopup_split_uniform (grad_segment_t *lseg, + int parts, + grad_segment_t **newl, + grad_segment_t **newr) { - grad_segment_t *oseg, *oaseg; - grad_segment_t *seg, *prev, *tmp; - grad_segment_t *lseg, *rseg; - double left, right; - - left = g_editor->control_sel_l->left; - right = g_editor->control_sel_r->right; - - /* Build flipped segments */ - - prev = NULL; - oseg = g_editor->control_sel_r; - tmp = NULL; - - do { - seg = seg_new_segment(); - - if (prev == NULL) { - seg->left = left; - tmp = seg; /* Remember first segment */ - } else - seg->left = left + right - oseg->right; - - seg->middle = left + right - oseg->middle; - seg->right = left + right - oseg->left; - - seg->r0 = oseg->r1; - seg->g0 = oseg->g1; - seg->b0 = oseg->b1; - seg->a0 = oseg->a1; - - seg->r1 = oseg->r0; - seg->g1 = oseg->g0; - seg->b1 = oseg->b0; - seg->a1 = oseg->a0; - - switch (oseg->type) { - case GRAD_SPHERE_INCREASING: - seg->type = GRAD_SPHERE_DECREASING; - break; - - case GRAD_SPHERE_DECREASING: - seg->type = GRAD_SPHERE_INCREASING; - break; - - default: - seg->type = oseg->type; - } /* switch */ + grad_segment_t *seg, *prev, *tmp; + gdouble seg_len; + gint i; - switch (oseg->color) { - case GRAD_HSV_CCW: - seg->color = GRAD_HSV_CW; - break; + seg_len = (lseg->right - lseg->left) / parts; /* Length of divisions */ - case GRAD_HSV_CW: - seg->color = GRAD_HSV_CCW; - break; + seg = NULL; + prev = NULL; + tmp = NULL; - default: - seg->color = oseg->color; - } /* switch */ + for (i = 0; i < parts; i++) + { + seg = seg_new_segment(); - seg->prev = prev; - seg->next = NULL; + if (i == 0) + tmp = seg; /* Remember first segment */ - if (prev) - prev->next = seg; + seg->left = lseg->left + i * seg_len; + seg->right = lseg->left + (i + 1) * seg_len; + seg->middle = (seg->left + seg->right) / 2.0; - prev = seg; + grad_get_color_at (seg->left, &seg->r0, &seg->g0, &seg->b0, &seg->a0); + grad_get_color_at (seg->right, &seg->r1, &seg->g1, &seg->b1, &seg->a1); - oaseg = oseg; - oseg = oseg->prev; /* Move backwards! */ - } while (oaseg != g_editor->control_sel_l); - - seg->right = right; /* Squish accumulative error */ + seg->type = lseg->type; + seg->color = lseg->color; - /* Free old segments */ + seg->prev = prev; + seg->next = NULL; - lseg = g_editor->control_sel_l->prev; - rseg = g_editor->control_sel_r->next; + if (prev) + prev->next = seg; - oseg = g_editor->control_sel_l; + prev = seg; + } - do { - oaseg = oseg->next; - seg_free_segment(oseg); - oseg = oaseg; - } while (oaseg != rseg); + /* Fix edges */ - /* Link in new segments */ + tmp->r0 = lseg->r0; + tmp->g0 = lseg->g0; + tmp->b0 = lseg->b0; + tmp->a0 = lseg->a0; - if (lseg) - lseg->next = tmp; - else - curr_gradient->segments = tmp; + seg->r1 = lseg->r1; + seg->g1 = lseg->g1; + seg->b1 = lseg->b1; + seg->a1 = lseg->a1; - tmp->prev = lseg; + tmp->left = lseg->left; + seg->right = lseg->right; /* To squish accumulative error */ - seg->next = rseg; + /* Link in list */ - if (rseg) - rseg->prev = seg; + tmp->prev = lseg->prev; + seg->next = lseg->next; - /* Reset selection */ + if (lseg->prev) + lseg->prev->next = tmp; + else + curr_gradient->segments = tmp; /* We are on leftmost segment */ - g_editor->control_sel_l = tmp; - g_editor->control_sel_r = seg; + if (lseg->next) + lseg->next->prev = seg; - /* Done */ + curr_gradient->last_visited = NULL; /* Force re-search */ - curr_gradient->last_visited = NULL; /* Force re-search */ - curr_gradient->dirty = 1; + /* Done */ + + *newl = tmp; + *newr = seg; - ed_update_editor(GRAD_UPDATE_PREVIEW | GRAD_UPDATE_CONTROL); -} /* cpopup_flip_callback */ + /* Delete old segment */ + seg_free_segment (lseg); +} /*****/ static void -cpopup_replicate_callback(GtkWidget *widget, gpointer data) +cpopup_delete_callback (GtkWidget *widget, + gpointer data) { - GtkWidget *dialog; - GtkWidget *vbox; - GtkWidget *label; - GtkWidget *scale; - GtkWidget *button; - GtkObject *scale_data; + grad_segment_t *lseg, *rseg, *seg, *aseg, *next; + double join; - /* Create dialog window */ + /* Remember segments to the left and to the right of the selection */ - dialog = gtk_dialog_new (); - gtk_window_set_title (GTK_WINDOW (dialog), - (g_editor->control_sel_l == g_editor->control_sel_r) ? - _("Replicate segment") : - _("Replicate selection")); - gtk_window_position (GTK_WINDOW (dialog), GTK_WIN_POS_MOUSE); - gtk_container_set_border_width (GTK_CONTAINER (dialog), 0); + lseg = g_editor->control_sel_l->prev; + rseg = g_editor->control_sel_r->next; - vbox = gtk_vbox_new (FALSE, 0); - gtk_container_set_border_width (GTK_CONTAINER (vbox), 8); - gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), vbox, - FALSE, FALSE, 0); - gtk_widget_show (vbox); + /* Cannot delete all the segments in the gradient */ - /* Instructions */ + if ((lseg == NULL) && (rseg == NULL)) + return; - label = gtk_label_new (_("Please select the number of times")); - gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.0); - gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0); - gtk_widget_show (label); + /* Calculate join point */ - label = gtk_label_new ((g_editor->control_sel_l == g_editor->control_sel_r) ? - _("you want to replicate the selected segment") : - _("you want to replicate the selection")); - gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.0); - gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0); - gtk_widget_show (label); + join = (g_editor->control_sel_l->left + g_editor->control_sel_r->right) / 2.0; - /* Scale */ + if (lseg == NULL) + join = 0.0; + else if (rseg == NULL) + join = 1.0; - g_editor->replicate_times = 2; - scale_data = gtk_adjustment_new (2.0, 2.0, 21.0, 1.0, 1.0, 1.0); + /* Move segments */ - scale = gtk_hscale_new (GTK_ADJUSTMENT (scale_data)); - gtk_scale_set_digits (GTK_SCALE (scale), 0); - gtk_scale_set_value_pos (GTK_SCALE (scale), GTK_POS_TOP); - gtk_box_pack_start (GTK_BOX (vbox), scale, FALSE, TRUE, 8); - gtk_widget_show (scale); + if (lseg != NULL) + control_compress_range (lseg, lseg, lseg->left, join); - gtk_signal_connect (scale_data, "value_changed", - (GtkSignalFunc) cpopup_replicate_scale_update, - NULL); + if (rseg != NULL) + control_compress_range (rseg, rseg, join, rseg->right); - /* Buttons */ + /* Link */ - button = ed_create_button (_("Replicate"), 0.5, 0.5, - (GtkSignalFunc) cpopup_do_replicate_callback, - (gpointer) dialog); - GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT); - gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->action_area), - button, TRUE, TRUE, 0); - gtk_widget_grab_default (button); - gtk_widget_show (button); + if (lseg) + lseg->next = rseg; - button = ed_create_button (_("Cancel"), 0.5, 0.5, - (GtkSignalFunc) cpopup_replicate_cancel_callback, - (gpointer) dialog); - GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT); - gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->action_area), - button, TRUE, TRUE, 0); - gtk_widget_show (button); + if (rseg) + rseg->prev = lseg; - /* Show! */ + /* Delete old segments */ - gtk_widget_show (dialog); - gtk_widget_set_sensitive (g_editor->shell, FALSE); -} /* cpopup_replicate_callback */ + seg = g_editor->control_sel_l; + + do + { + next = seg->next; + aseg = seg; + + seg_free_segment (seg); + + seg = next; + } + while (aseg != g_editor->control_sel_r); + /* Change selection */ + + if (rseg) + { + g_editor->control_sel_l = rseg; + g_editor->control_sel_r = rseg; + } + else + { + g_editor->control_sel_l = lseg; + g_editor->control_sel_r = lseg; + } + + if (lseg == NULL) + curr_gradient->segments = rseg; + + /* Done */ + + curr_gradient->last_visited = NULL; /* Force re-search */ + curr_gradient->dirty = 1; + + ed_update_editor (GRAD_UPDATE_PREVIEW | GRAD_UPDATE_CONTROL); +} /*****/ static void -cpopup_split_uniform_scale_update(GtkAdjustment *adjustment, gpointer data) +cpopup_recenter_callback (GtkWidget *wiodget, + gpointer data) { - g_editor->split_parts = (int) (adjustment->value + 0.5); /* We have to round */ -} /* cpopup_split_uniform_scale_update */ + grad_segment_t *seg, *aseg; + + seg = g_editor->control_sel_l; + + do + { + seg->middle = (seg->left + seg->right) / 2.0; + + aseg = seg; + seg = seg->next; + } + while (aseg != g_editor->control_sel_r); + curr_gradient->dirty = 1; + ed_update_editor (GRAD_UPDATE_PREVIEW | GRAD_UPDATE_CONTROL); +} /*****/ static void -cpopup_split_uniform_split_callback(GtkWidget *widget, gpointer client_data) +cpopup_redistribute_callback (GtkWidget *widget, + gpointer data) { - grad_segment_t *seg, *aseg, *lseg, *rseg, *lsel; + grad_segment_t *seg, *aseg; + double left, right, seg_len; + int num_segs; + int i; - gtk_widget_destroy(GTK_WIDGET(client_data)); - gtk_widget_set_sensitive(g_editor->shell, TRUE); + /* Count number of segments in selection */ - seg = g_editor->control_sel_l; - lsel = NULL; + num_segs = 0; + seg = g_editor->control_sel_l; - do { - aseg = seg; + do + { + num_segs++; + aseg = seg; + seg = seg->next; + } + while (aseg != g_editor->control_sel_r); - cpopup_split_uniform(seg, g_editor->split_parts, &lseg, &rseg); + /* Calculate new segment length */ - if (seg == g_editor->control_sel_l) - lsel = lseg; + left = g_editor->control_sel_l->left; + right = g_editor->control_sel_r->right; + seg_len = (right - left) / num_segs; - seg = rseg->next; - } while (aseg != g_editor->control_sel_r); + /* Redistribute */ - g_editor->control_sel_l = lsel; - g_editor->control_sel_r = rseg; + seg = g_editor->control_sel_l; - curr_gradient->last_visited = NULL; /* Force re-search */ - curr_gradient->dirty = 1; - ed_update_editor(GRAD_UPDATE_PREVIEW | GRAD_UPDATE_CONTROL); -} /* cpopup_split_uniform_split_callback */ + for (i = 0; i < num_segs; i++) + { + seg->left = left + i * seg_len; + seg->right = left + (i + 1) * seg_len; + seg->middle = (seg->left + seg->right) / 2.0; + seg = seg->next; + } -/*****/ + /* Fix endpoints to squish accumulative error */ -static void -cpopup_split_uniform_cancel_callback(GtkWidget *widget, gpointer client_data) -{ - gtk_widget_destroy(GTK_WIDGET(client_data)); - gtk_widget_set_sensitive(g_editor->shell, TRUE); -} /* cpopup_split_uniform_cancel_callback */ + g_editor->control_sel_l->left = left; + g_editor->control_sel_r->right = right; + + /* Done */ + + curr_gradient->dirty = 1; + ed_update_editor (GRAD_UPDATE_PREVIEW | GRAD_UPDATE_CONTROL); +} +/***** Control popup -> selection options functions *****/ /*****/ -static void -cpopup_replicate_scale_update(GtkAdjustment *adjustment, gpointer data) +static GtkWidget * +cpopup_create_sel_ops_menu (void) { - g_editor->replicate_times = (int) (adjustment->value + 0.5); /* We have to round */ -} /* cpopup_replicate_scale_update */ + GtkWidget *menu; + GtkWidget *menuitem; + GtkAccelGroup *accel_group; + + menu = gtk_menu_new (); + accel_group = g_editor->accel_group; + + gtk_menu_set_accel_group (GTK_MENU (menu), accel_group); + /* Flip */ + menuitem = + cpopup_create_menu_item_with_label ("", &g_editor->control_flip_label); + gtk_signal_connect (GTK_OBJECT (menuitem), "activate", + (GtkSignalFunc) cpopup_flip_callback, + NULL); + gtk_menu_append (GTK_MENU (menu), menuitem); + gtk_widget_show (menuitem); + gtk_widget_add_accelerator (menuitem, "activate", + accel_group, + 'F', 0, + GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED); + + /* Replicate */ + menuitem = + cpopup_create_menu_item_with_label ("", &g_editor->control_replicate_label); + gtk_signal_connect (GTK_OBJECT (menuitem), "activate", + (GtkSignalFunc) cpopup_replicate_callback, + NULL); + gtk_menu_append (GTK_MENU (menu), menuitem); + gtk_widget_show (menuitem); + gtk_widget_add_accelerator (menuitem, "activate", + accel_group, + 'M', 0, + GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED); + + /* Blend colors / opacity */ + menuitem = gtk_menu_item_new (); + gtk_menu_append (GTK_MENU (menu), menuitem); + gtk_widget_show (menuitem); + + menuitem = gtk_menu_item_new_with_label (_("Blend endpoints' colors")); + gtk_signal_connect (GTK_OBJECT (menuitem), "activate", + (GtkSignalFunc) cpopup_blend_colors, + NULL); + gtk_menu_append (GTK_MENU (menu), menuitem); + gtk_widget_show (menuitem); + g_editor->control_blend_colors_menu_item = menuitem; + gtk_widget_add_accelerator (menuitem, "activate", + accel_group, + 'B', 0, + GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED); + + menuitem = gtk_menu_item_new_with_label (_("Blend endpoints' opacity")); + gtk_signal_connect (GTK_OBJECT (menuitem), "activate", + (GtkSignalFunc) cpopup_blend_opacity, + NULL); + gtk_menu_append (GTK_MENU (menu), menuitem); + gtk_widget_show (menuitem); + gtk_widget_add_accelerator (menuitem, "activate", + accel_group, + 'B', GDK_CONTROL_MASK, + GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED); + g_editor->control_blend_opacity_menu_item = menuitem; + + return menu; +} /*****/ static void -cpopup_do_replicate_callback(GtkWidget *widget, gpointer client_data) +cpopup_flip_callback (GtkWidget *widget, + gpointer data) { - double sel_left, sel_right, sel_len; - double new_left; - double factor; - grad_segment_t *prev, *seg, *tmp; - grad_segment_t *oseg, *oaseg; - grad_segment_t *lseg, *rseg; - int i; + grad_segment_t *oseg, *oaseg; + grad_segment_t *seg, *prev, *tmp; + grad_segment_t *lseg, *rseg; + double left, right; - gtk_widget_destroy(GTK_WIDGET(client_data)); - gtk_widget_set_sensitive(g_editor->shell, TRUE); + left = g_editor->control_sel_l->left; + right = g_editor->control_sel_r->right; - /* Remember original parameters */ + /* Build flipped segments */ - sel_left = g_editor->control_sel_l->left; - sel_right = g_editor->control_sel_r->right; - sel_len = sel_right - sel_left; - - factor = 1.0 / g_editor->replicate_times; - - /* Build replicated segments */ + prev = NULL; + oseg = g_editor->control_sel_r; + tmp = NULL; - prev = NULL; - seg = NULL; - tmp = NULL; + do + { + seg = seg_new_segment (); - for (i = 0; i < g_editor->replicate_times; i++) { - /* Build one cycle */ + if (prev == NULL) + { + seg->left = left; + tmp = seg; /* Remember first segment */ + } + else + seg->left = left + right - oseg->right; - new_left = sel_left + i * factor * sel_len; + seg->middle = left + right - oseg->middle; + seg->right = left + right - oseg->left; - oseg = g_editor->control_sel_l; + seg->r0 = oseg->r1; + seg->g0 = oseg->g1; + seg->b0 = oseg->b1; + seg->a0 = oseg->a1; - do { - seg = seg_new_segment(); + seg->r1 = oseg->r0; + seg->g1 = oseg->g0; + seg->b1 = oseg->b0; + seg->a1 = oseg->a0; - if (prev == NULL) { - seg->left = sel_left; - tmp = seg; /* Remember first segment */ - } else - seg->left = new_left + factor * (oseg->left - sel_left); + switch (oseg->type) + { + case GRAD_SPHERE_INCREASING: + seg->type = GRAD_SPHERE_DECREASING; + break; - seg->middle = new_left + factor * (oseg->middle - sel_left); - seg->right = new_left + factor * (oseg->right - sel_left); + case GRAD_SPHERE_DECREASING: + seg->type = GRAD_SPHERE_INCREASING; + break; - seg->r0 = oseg->r0; - seg->g0 = oseg->g0; - seg->b0 = oseg->b0; - seg->a0 = oseg->a0; + default: + seg->type = oseg->type; + } - seg->r1 = oseg->r1; - seg->g1 = oseg->g1; - seg->b1 = oseg->b1; - seg->a1 = oseg->a1; + switch (oseg->color) + { + case GRAD_HSV_CCW: + seg->color = GRAD_HSV_CW; + break; - seg->type = oseg->type; - seg->color = oseg->color; + case GRAD_HSV_CW: + seg->color = GRAD_HSV_CCW; + break; - seg->prev = prev; - seg->next = NULL; + default: + seg->color = oseg->color; + } - if (prev) - prev->next = seg; + seg->prev = prev; + seg->next = NULL; - prev = seg; + if (prev) + prev->next = seg; - oaseg = oseg; - oseg = oseg->next; - } while (oaseg != g_editor->control_sel_r); - } /* for */ + prev = seg; - seg->right = sel_right; /* Squish accumulative error */ + oaseg = oseg; + oseg = oseg->prev; /* Move backwards! */ + } + while (oaseg != g_editor->control_sel_l); - /* Free old segments */ + seg->right = right; /* Squish accumulative error */ - lseg = g_editor->control_sel_l->prev; - rseg = g_editor->control_sel_r->next; + /* Free old segments */ - oseg = g_editor->control_sel_l; + lseg = g_editor->control_sel_l->prev; + rseg = g_editor->control_sel_r->next; - do { - oaseg = oseg->next; - seg_free_segment(oseg); - oseg = oaseg; - } while (oaseg != rseg); + oseg = g_editor->control_sel_l; - /* Link in new segments */ + do + { + oaseg = oseg->next; + seg_free_segment (oseg); + oseg = oaseg; + } + while (oaseg != rseg); - if (lseg) - lseg->next = tmp; - else - curr_gradient->segments = tmp; + /* Link in new segments */ - tmp->prev = lseg; + if (lseg) + lseg->next = tmp; + else + curr_gradient->segments = tmp; - seg->next = rseg; + tmp->prev = lseg; - if (rseg) - rseg->prev = seg; + seg->next = rseg; - /* Reset selection */ + if (rseg) + rseg->prev = seg; - g_editor->control_sel_l = tmp; - g_editor->control_sel_r = seg; + /* Reset selection */ - /* Done */ + g_editor->control_sel_l = tmp; + g_editor->control_sel_r = seg; - curr_gradient->last_visited = NULL; /* Force re-search */ - curr_gradient->dirty = 1; + /* Done */ - ed_update_editor(GRAD_UPDATE_PREVIEW | GRAD_UPDATE_CONTROL); -} /* cpopup_do_replicate_callback */ + curr_gradient->last_visited = NULL; /* Force re-search */ + curr_gradient->dirty = 1; + ed_update_editor (GRAD_UPDATE_PREVIEW | GRAD_UPDATE_CONTROL); +} /*****/ static void -cpopup_replicate_cancel_callback(GtkWidget *widget, gpointer client_data) +cpopup_replicate_callback (GtkWidget *widget, + gpointer data) { - gtk_widget_destroy(GTK_WIDGET(client_data)); - gtk_widget_set_sensitive(g_editor->shell, TRUE); -} /* cpopup_replicate_cancel_callback */ + GtkWidget *dialog; + GtkWidget *vbox; + GtkWidget *label; + GtkWidget *scale; + GtkObject *scale_data; + static ActionAreaItem action_items[] = + { + { N_("Replicate"), cpopup_do_replicate_callback, NULL, NULL }, + { N_("Cancel"), cpopup_replicate_cancel_callback, NULL, NULL } + }; -/*****/ + /* Create dialog window */ + dialog = gtk_dialog_new (); + gtk_window_set_wmclass (GTK_WINDOW (dialog), + "gradient_segment_replicate", "Gimp"); + gtk_window_set_title (GTK_WINDOW (dialog), + (g_editor->control_sel_l == g_editor->control_sel_r) ? + _("Replicate segment") : + _("Replicate selection")); + gtk_window_position (GTK_WINDOW (dialog), GTK_WIN_POS_MOUSE); -static void -cpopup_blend_endpoints(double r0, double g0, double b0, double a0, - double r1, double g1, double b1, double a1, - int blend_colors, int blend_opacity) -{ - double dr, dg, db, da; - double left, len; - grad_segment_t *seg, *aseg; + /* Handle the wm delete event */ + gtk_signal_connect (GTK_OBJECT (dialog), "delete_event", + GTK_SIGNAL_FUNC (cpopup_replicate_delete_callback), + dialog); - dr = r1 - r0; - dg = g1 - g0; - db = b1 - b0; - da = a1 - a0; + vbox = gtk_vbox_new (FALSE, 0); + gtk_container_set_border_width (GTK_CONTAINER (vbox), 6); + gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), vbox); + gtk_widget_show (vbox); - left = g_editor->control_sel_l->left; - len = g_editor->control_sel_r->right - left; + /* Instructions */ + label = gtk_label_new (_("Please select the number of times")); + gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0); + gtk_widget_show (label); - seg = g_editor->control_sel_l; + label = gtk_label_new ((g_editor->control_sel_l == g_editor->control_sel_r) ? + _("you want to replicate the selected segment") : + _("you want to replicate the selection")); + gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0); + gtk_widget_show (label); - do { - if (blend_colors) { - seg->r0 = r0 + (seg->left - left) / len * dr; - seg->g0 = g0 + (seg->left - left) / len * dg; - seg->b0 = b0 + (seg->left - left) / len * db; + /* Scale */ + g_editor->replicate_times = 2; + scale_data = gtk_adjustment_new (2.0, 2.0, 21.0, 1.0, 1.0, 1.0); - seg->r1 = r0 + (seg->right - left) / len * dr; - seg->g1 = g0 + (seg->right - left) / len * dg; - seg->b1 = b0 + (seg->right - left) / len * db; - } /* if */ + scale = gtk_hscale_new (GTK_ADJUSTMENT (scale_data)); + gtk_scale_set_digits (GTK_SCALE (scale), 0); + gtk_scale_set_value_pos (GTK_SCALE (scale), GTK_POS_TOP); + gtk_box_pack_start (GTK_BOX (vbox), scale, FALSE, TRUE, 4); + gtk_widget_show (scale); - if (blend_opacity) { - seg->a0 = a0 + (seg->left - left) / len * da; - seg->a1 = a0 + (seg->right - left) / len * da; - } /* if */ + gtk_signal_connect (scale_data, "value_changed", + (GtkSignalFunc) cpopup_replicate_scale_update, + NULL); - aseg = seg; - seg = seg->next; - } while (aseg != g_editor->control_sel_r); -} /* cpopup_blend_endpoints */ + /* The action area */ + action_items[0].user_data = dialog; + action_items[1].user_data = dialog; + build_action_area (GTK_DIALOG (dialog), action_items, 2, 1); + /* Show! */ + gtk_widget_show (dialog); + gtk_widget_set_sensitive (g_editor->shell, FALSE); +} -/*****/ +static void +cpopup_replicate_scale_update (GtkAdjustment *adjustment, + gpointer data) +{ + g_editor->replicate_times = (int) (adjustment->value + 0.5); +} static void -cpopup_split_midpoint(grad_segment_t *lseg, grad_segment_t **newl, grad_segment_t **newr) +cpopup_do_replicate_callback (GtkWidget *widget, + gpointer data) { - double r, g, b, a; - grad_segment_t *newseg; + gdouble sel_left, sel_right, sel_len; + gdouble new_left; + gdouble factor; + grad_segment_t *prev, *seg, *tmp; + grad_segment_t *oseg, *oaseg; + grad_segment_t *lseg, *rseg; + gint i; - /* Get color at original segment's midpoint */ + gtk_widget_destroy (GTK_WIDGET (data)); + gtk_widget_set_sensitive (g_editor->shell, TRUE); - grad_get_color_at(lseg->middle, &r, &g, &b, &a); + /* Remember original parameters */ + sel_left = g_editor->control_sel_l->left; + sel_right = g_editor->control_sel_r->right; + sel_len = sel_right - sel_left; - /* Create a new segment and insert it in the list */ + factor = 1.0 / g_editor->replicate_times; - newseg = seg_new_segment(); + /* Build replicated segments */ - newseg->prev = lseg; - newseg->next = lseg->next; + prev = NULL; + seg = NULL; + tmp = NULL; - lseg->next = newseg; + for (i = 0; i < g_editor->replicate_times; i++) + { + /* Build one cycle */ - if (newseg->next) - newseg->next->prev = newseg; + new_left = sel_left + i * factor * sel_len; - /* Set coordinates of new segment */ + oseg = g_editor->control_sel_l; - newseg->left = lseg->middle; - newseg->right = lseg->right; - newseg->middle = (newseg->left + newseg->right) / 2.0; + do + { + seg = seg_new_segment(); - /* Set coordinates of original segment */ + if (prev == NULL) + { + seg->left = sel_left; + tmp = seg; /* Remember first segment */ + } + else + seg->left = new_left + factor * (oseg->left - sel_left); - lseg->right = newseg->left; - lseg->middle = (lseg->left + lseg->right) / 2.0; + seg->middle = new_left + factor * (oseg->middle - sel_left); + seg->right = new_left + factor * (oseg->right - sel_left); - /* Set colors of both segments */ + seg->r0 = oseg->r0; + seg->g0 = oseg->g0; + seg->b0 = oseg->b0; + seg->a0 = oseg->a0; - newseg->r1 = lseg->r1; - newseg->g1 = lseg->g1; - newseg->b1 = lseg->b1; - newseg->a1 = lseg->a1; + seg->r1 = oseg->r1; + seg->g1 = oseg->g1; + seg->b1 = oseg->b1; + seg->a1 = oseg->a1; - lseg->r1 = newseg->r0 = r; - lseg->g1 = newseg->g0 = g; - lseg->b1 = newseg->b0 = b; - lseg->a1 = newseg->a0 = a; + seg->type = oseg->type; + seg->color = oseg->color; - /* Set parameters of new segment */ + seg->prev = prev; + seg->next = NULL; - newseg->type = lseg->type; - newseg->color = lseg->color; + if (prev) + prev->next = seg; - /* Done */ + prev = seg; - *newl = lseg; - *newr = newseg; -} /* cpopup_split_midpoint */ + oaseg = oseg; + oseg = oseg->next; + } + while (oaseg != g_editor->control_sel_r); + } + seg->right = sel_right; /* Squish accumulative error */ -/*****/ + /* Free old segments */ -static void -cpopup_split_uniform(grad_segment_t *lseg, int parts, - grad_segment_t **newl, grad_segment_t **newr) -{ - grad_segment_t *seg, *prev, *tmp; - double seg_len; - int i; + lseg = g_editor->control_sel_l->prev; + rseg = g_editor->control_sel_r->next; - seg_len = (lseg->right - lseg->left) / parts; /* Length of divisions */ + oseg = g_editor->control_sel_l; - seg = NULL; - prev = NULL; - tmp = NULL; + do + { + oaseg = oseg->next; + seg_free_segment(oseg); + oseg = oaseg; + } + while (oaseg != rseg); - for (i = 0; i < parts; i++) { - seg = seg_new_segment(); + /* Link in new segments */ - if (i == 0) - tmp = seg; /* Remember first segment */ + if (lseg) + lseg->next = tmp; + else + curr_gradient->segments = tmp; - seg->left = lseg->left + i * seg_len; - seg->right = lseg->left + (i + 1) * seg_len; - seg->middle = (seg->left + seg->right) / 2.0; + tmp->prev = lseg; - grad_get_color_at(seg->left, &seg->r0, &seg->g0, &seg->b0, &seg->a0); - grad_get_color_at(seg->right, &seg->r1, &seg->g1, &seg->b1, &seg->a1); + seg->next = rseg; - seg->type = lseg->type; - seg->color = lseg->color; + if (rseg) + rseg->prev = seg; - seg->prev = prev; - seg->next = NULL; + /* Reset selection */ - if (prev) - prev->next = seg; + g_editor->control_sel_l = tmp; + g_editor->control_sel_r = seg; - prev = seg; - } /* for */ + /* Done */ + + curr_gradient->last_visited = NULL; /* Force re-search */ + curr_gradient->dirty = 1; - /* Fix edges */ + ed_update_editor (GRAD_UPDATE_PREVIEW | GRAD_UPDATE_CONTROL); +} + +static void +cpopup_replicate_cancel_callback (GtkWidget *widget, + gpointer data) +{ + gtk_widget_destroy (GTK_WIDGET (data)); + gtk_widget_set_sensitive (g_editor->shell, TRUE); +} - tmp->r0 = lseg->r0; - tmp->g0 = lseg->g0; - tmp->b0 = lseg->b0; - tmp->a0 = lseg->a0; +static gint +cpopup_replicate_delete_callback (GtkWidget *widget, + GdkEvent *event, + gpointer data) +{ + cpopup_replicate_cancel_callback (widget, data); - seg->r1 = lseg->r1; - seg->g1 = lseg->g1; - seg->b1 = lseg->b1; - seg->a1 = lseg->a1; + return TRUE; +} - tmp->left = lseg->left; - seg->right = lseg->right; /* To squish accumulative error */ +/*****/ - /* Link in list */ +static void +cpopup_blend_colors (GtkWidget *widget, + gpointer data) +{ + cpopup_blend_endpoints (g_editor->control_sel_l->r0, + g_editor->control_sel_l->g0, + g_editor->control_sel_l->b0, + g_editor->control_sel_l->a0, + g_editor->control_sel_r->r1, + g_editor->control_sel_r->g1, + g_editor->control_sel_r->b1, + g_editor->control_sel_r->a1, + TRUE, FALSE); + + curr_gradient->dirty = 1; + ed_update_editor (GRAD_UPDATE_PREVIEW); +} - tmp->prev = lseg->prev; - seg->next = lseg->next; +static void +cpopup_blend_opacity (GtkWidget *widget, + gpointer data) +{ + cpopup_blend_endpoints (g_editor->control_sel_l->r0, + g_editor->control_sel_l->g0, + g_editor->control_sel_l->b0, + g_editor->control_sel_l->a0, + g_editor->control_sel_r->r1, + g_editor->control_sel_r->g1, + g_editor->control_sel_r->b1, + g_editor->control_sel_r->a1, + FALSE, TRUE); + + curr_gradient->dirty = 1; + ed_update_editor (GRAD_UPDATE_PREVIEW); +} - if (lseg->prev) - lseg->prev->next = tmp; - else - curr_gradient->segments = tmp; /* We are on leftmost segment */ +/***** Main blend function *****/ - if (lseg->next) - lseg->next->prev = seg; +/*****/ - curr_gradient->last_visited = NULL; /* Force re-search */ +static void +cpopup_blend_endpoints (double r0, double g0, double b0, double a0, + double r1, double g1, double b1, double a1, + int blend_colors, + int blend_opacity) +{ + double dr, dg, db, da; + double left, len; + grad_segment_t *seg, *aseg; - /* Done */ + dr = r1 - r0; + dg = g1 - g0; + db = b1 - b0; + da = a1 - a0; - *newl = tmp; - *newr = seg; + left = g_editor->control_sel_l->left; + len = g_editor->control_sel_r->right - left; - /* Delete old segment */ + seg = g_editor->control_sel_l; - seg_free_segment(lseg); -} /* cpopup_split_uniform */ + do + { + if (blend_colors) + { + seg->r0 = r0 + (seg->left - left) / len * dr; + seg->g0 = g0 + (seg->left - left) / len * dg; + seg->b0 = b0 + (seg->left - left) / len * db; + + seg->r1 = r0 + (seg->right - left) / len * dr; + seg->g1 = g0 + (seg->right - left) / len * dg; + seg->b1 = b0 + (seg->right - left) / len * db; + } + if (blend_opacity) + { + seg->a0 = a0 + (seg->left - left) / len * da; + seg->a1 = a0 + (seg->right - left) / len * da; + } + + aseg = seg; + seg = seg->next; + } + while (aseg != g_editor->control_sel_r); +} /***** Gradient functions *****/ @@ -5978,87 +6056,92 @@ calc_hsv_to_rgb(double *h, double *s, double *v) /*****/ -static char * -build_user_filename(char *name, char *path_str) +static gchar * +build_user_filename (gchar *name, + gchar *path_str) { - char *home; - char *local_path; - char *first_token; - char *token; - char *path; - char *filename; - - g_assert(name != NULL); + gchar *home; + gchar *local_path; + gchar *first_token; + gchar *token; + gchar *path; + gchar *filename; - if (!path_str) - return NULL; /* Perhaps this is not a good idea */ + g_assert (name != NULL); - /* Get the first path specified in the list */ + if (!path_str) + return NULL; /* Perhaps this is not a good idea */ - home = g_get_home_dir (); - local_path = g_strdup(path_str); - first_token = local_path; - token = xstrsep(&first_token, G_SEARCHPATH_SEPARATOR_S); - filename = NULL; + /* Get the first path specified in the list */ - if (token) { - if (*token == '~') { - if (!home) - return NULL; - path = g_strdup_printf("%s%s", home, token + 1); - } else { - path = g_strdup(token); - } /* else */ + home = g_get_home_dir (); + local_path = g_strdup (path_str); + first_token = local_path; + token = xstrsep (&first_token, G_SEARCHPATH_SEPARATOR_S); + filename = NULL; - filename = g_strdup_printf("%s" G_DIR_SEPARATOR_S "%s", - path, name); + if (token) + { + if (*token == '~') + { + if (!home) + return NULL; + path = g_strdup_printf ("%s%s", home, token + 1); + } + else + { + path = g_strdup (token); + } - g_free(path); - } /* if */ + filename = g_strdup_printf ("%s" G_DIR_SEPARATOR_S "%s", + path, name); - g_free(local_path); + g_free (path); + } - return filename; -} /* build_user_filename */ + g_free (local_path); + return filename; +} gint -grad_set_grad_to_name(gchar *name) +grad_set_grad_to_name (gchar *name) { GSList *list; gradient_t *grad; - int n = 0; + gint n = 0; list = gradients_list; - while (list) { - grad = list->data; + while (list) + { + grad = list->data; - if (strcmp(grad->name, name) == 0) { - /* We found it! */ - - /* Select that gradient in the listbox */ - /* Only if gradient editor has been created */ - - if(g_editor) + if (strcmp (grad->name, name) == 0) { - gtk_clist_select_row(GTK_CLIST(g_editor->clist),n,-1); - gtk_clist_moveto(GTK_CLIST(g_editor->clist),n,0,0.5,0.0); - } - else - { - /* force internal structs to use selected gradient */ - GSList* tmp = g_slist_nth(gradients_list,n); - if(tmp) - curr_gradient = (gradient_t *)(tmp->data); + /* We found it! */ + + /* Select that gradient in the listbox */ + /* Only if gradient editor has been created */ + if (g_editor) + { + gtk_clist_select_row (GTK_CLIST (g_editor->clist), n, -1); + gtk_clist_moveto (GTK_CLIST (g_editor->clist), n, 0, 0.5, 0.0); + } + else + { + /* force internal structs to use selected gradient */ + GSList* tmp = g_slist_nth (gradients_list,n); + if(tmp) + curr_gradient = (gradient_t *) (tmp->data); + } + return TRUE; } - return TRUE; - } /* if */ - n++; - list = g_slist_next(list); - } /* while */ - + n++; + list = g_slist_next (list); + } + return FALSE; } diff --git a/app/gui/info-dialog.c b/app/gui/info-dialog.c index f66c5a4910..696269404a 100644 --- a/app/gui/info-dialog.c +++ b/app/gui/info-dialog.c @@ -43,14 +43,14 @@ info_field_new (InfoDialog *idialog, { GtkWidget *label; InfoField *field; - int row; + gint row; - field = (InfoField *) g_malloc (sizeof (InfoField)); + field = g_new (InfoField, 1); row = idialog->nfields + 1; gtk_table_resize (GTK_TABLE (idialog->info_table), 2, row); - label = gtk_label_new (gettext (title)); + label = gtk_label_new (title); gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5); gtk_table_attach (GTK_TABLE (idialog->info_table), label, 0, 1, row - 1, row, @@ -149,13 +149,13 @@ info_dialog_new (char *title) GtkWidget *vbox; GtkWidget *info_table; - idialog = (InfoDialog *) g_malloc (sizeof (InfoDialog)); + idialog = g_new (InfoDialog, 1); idialog->field_list = NULL; idialog->nfields = 0; shell = gtk_dialog_new (); gtk_window_set_wmclass (GTK_WINDOW (shell), "info_dialog", "Gimp"); - gtk_window_set_title (GTK_WINDOW (shell), gettext(title)); + gtk_window_set_title (GTK_WINDOW (shell), title); session_set_window_geometry (shell, &info_dialog_session_info, FALSE ); gtk_signal_connect (GTK_OBJECT (shell), "delete_event", diff --git a/app/gui/palette-editor.c b/app/gui/palette-editor.c index 26834c670f..f1ecbf5dc7 100644 --- a/app/gui/palette-editor.c +++ b/app/gui/palette-editor.c @@ -39,7 +39,6 @@ #include "datafiles.h" #include "devices.h" #include "errors.h" -#include "general.h" #include "gimprc.h" #include "gradient_header.h" #include "gradient.h" @@ -50,16 +49,16 @@ #include "palette_select.h" #include "dialog_handler.h" +#include "libgimp/gimpintl.h" + #include "pixmaps/zoom_in.xpm" #include "pixmaps/zoom_out.xpm" -#include "libgimp/gimpintl.h" - #define ENTRY_WIDTH 12 #define ENTRY_HEIGHT 10 -#define SPACING 1 -#define COLUMNS 16 -#define ROWS 11 +#define SPACING 1 +#define COLUMNS 16 +#define ROWS 11 #define PREVIEW_WIDTH ((ENTRY_WIDTH * COLUMNS) + (SPACING * (COLUMNS + 1))) #define PREVIEW_HEIGHT ((ENTRY_HEIGHT * ROWS) + (SPACING * (ROWS + 1))) @@ -70,7 +69,7 @@ #define IMPORT_PREVIEW_WIDTH 80 #define IMPORT_PREVIEW_HEIGHT 80 -#define MAX_IMAGE_COLOURS (10000*2) +#define MAX_IMAGE_COLORS (10000*2) typedef enum { @@ -78,8 +77,10 @@ typedef enum IMAGE_IMPORT = 1, } ImportType; +typedef struct _ImportDialog ImportDialog; -struct _ImportDialog { +struct _ImportDialog +{ GtkWidget *dialog; GtkWidget *preview; GtkWidget *entry; @@ -98,11 +99,10 @@ struct _ImportDialog { GimpImage *gimage; }; +typedef struct _PaletteDialog PaletteDialog; -typedef struct _ImportDialog ImportDialog ,*ImportDialogP; -typedef struct _Palette _Palette, *PaletteP; - -struct _Palette { +struct _PaletteDialog +{ GtkWidget *shell; GtkWidget *color_area; GtkWidget *scrolled_window; @@ -121,38 +121,46 @@ struct _Palette { gint freeze_update; }; +/* This one is called from palette_select.c */ +void palette_clist_init(GtkWidget *clist, GtkWidget *shell, GdkGC *gc); + +/* Local function prototypes */ +static void palette_entries_free (PaletteEntriesP); +static void palette_entries_load (char *); +static void palette_entry_free (PaletteEntryP); +static void palette_entries_save (PaletteEntriesP, char *); + +PaletteDialog * create_palette_dialog (gboolean vert); + +static void palette_draw_entries (PaletteDialog *palette, gint row_start, + gint column_highlight); +static void redraw_palette (PaletteDialog *palette); + +static GSList * palette_entries_insert_list (GSList *list, + PaletteEntriesP entries, gint pos); +static void palette_draw_small_preview (GdkGC *gc, PaletteEntriesP p_entry); +static void palette_scroll_clist_to_current (PaletteDialog *palette); +static void palette_update_small_preview (PaletteDialog *palette); +static void palette_scroll_top_left (PaletteDialog *palette); + +static ImportDialog * palette_import_dialog (PaletteDialog *palette); +static void palette_import_dialog_callback (GtkWidget *, gpointer); +static void import_palette_create_from_image (GImage *gimage, + guchar *pname, + PaletteDialog *palette); + +static void palette_merge_dialog_callback (GtkWidget *, gpointer); -static void palette_entries_free (PaletteEntriesP); -static void palette_entries_load (char *); -static void palette_entry_free (PaletteEntryP); -static void palette_entries_save (PaletteEntriesP, char *); - -PaletteP create_palette_dialog (gint vert); -static void palette_draw_entries (PaletteP palette,gint row_start, gint column_highlight); -static void redraw_palette(PaletteP palette); -static GSList * palette_entries_insert_list (GSList *list,PaletteEntriesP entries,gint pos); -void palette_clist_init(GtkWidget *clist, - GtkWidget *shell, - GdkGC *gc); -static void palette_draw_small_preview(GdkGC *gc, PaletteEntriesP p_entry); -static void palette_scroll_clist_to_current(PaletteP palette); -static void palette_update_small_preview(PaletteP palette); -static void palette_scroll_top_left(PaletteP palette); -static ImportDialogP palette_import_dialog(PaletteP palette); -static void palette_import_dialog_callback (GtkWidget *w,gpointer client_data); -static void import_palette_create_from_image (GImage *gimage,guchar *pname,PaletteP palette); -static void palette_merge_dialog_callback (GtkWidget *w,gpointer client_data); - - -GSList *palette_entries_list = NULL; + +GSList *palette_entries_list = NULL; static PaletteEntriesP default_palette_entries = NULL; -static int num_palette_entries = 0; -static unsigned char foreground[3] = { 0, 0, 0 }; -static unsigned char background[3] = { 255, 255, 255 }; -static ImportDialogP import_dialog = NULL; +static gint num_palette_entries = 0; +static guchar foreground[3] = { 0, 0, 0 }; +static guchar background[3] = { 255, 255, 255 }; +static ImportDialog *import_dialog = NULL; -PaletteP top_level_edit_palette = NULL; -PaletteP top_level_palette = NULL; +PaletteDialog *top_level_edit_palette = NULL; +PaletteDialog *top_level_palette = NULL; static void palette_entries_free (PaletteEntriesP entries) @@ -175,14 +183,14 @@ palette_entries_free (PaletteEntriesP entries) } static void -palette_entries_delete (char *filename) +palette_entries_delete (gchar *filename) { if (filename) unlink (filename); } void -palettes_init (int no_data) +palettes_init (gint no_data) { palette_init_palettes (no_data); } @@ -221,9 +229,9 @@ palettes_free () } void -palette_get_foreground (unsigned char *r, - unsigned char *g, - unsigned char *b) +palette_get_foreground (guchar *r, + guchar *g, + guchar *b) { *r = foreground[0]; *g = foreground[1]; @@ -231,9 +239,9 @@ palette_get_foreground (unsigned char *r, } void -palette_get_background (unsigned char *r, - unsigned char *g, - unsigned char *b) +palette_get_background (guchar *r, + guchar *g, + guchar *b) { *r = background[0]; *g = background[1]; @@ -241,11 +249,11 @@ palette_get_background (unsigned char *r, } void -palette_set_foreground (int r, - int g, - int b) +palette_set_foreground (gint r, + gint g, + gint b) { - unsigned char rr, gg, bb; + guchar rr, gg, bb; /* Foreground */ foreground[0] = r; @@ -262,11 +270,11 @@ palette_set_foreground (int r, } void -palette_set_background (int r, - int g, - int b) +palette_set_background (gint r, + gint g, + gint b) { - unsigned char rr, gg, bb; + guchar rr, gg, bb; /* Background */ background[0] = r; @@ -292,8 +300,8 @@ palette_set_default_colors (void) void palette_swap_colors (void) { - unsigned char fg_r, fg_g, fg_b; - unsigned char bg_r, bg_g, bg_b; + guchar fg_r, fg_g, fg_b; + guchar bg_r, bg_g, bg_b; palette_get_foreground (&fg_r, &fg_g, &fg_b); palette_get_background (&bg_r, &bg_g, &bg_b); @@ -303,20 +311,20 @@ palette_swap_colors (void) } void -palette_init_palettes (int no_data) +palette_init_palettes (gint no_data) { - if(!no_data) + if (!no_data) datafiles_read_directories (palette_path, palette_entries_load, 0); } static void -palette_select2_set_text_all(PaletteEntriesP entries) +palette_select2_set_text_all (PaletteEntriesP entries) { gint pos = 0; - char *num_buf; + gchar *num_buf; GSList *plist; - PaletteP pp; + PaletteDialog *pp; PaletteEntriesP p_entries = NULL; gchar * num_copy; @@ -335,38 +343,38 @@ palette_select2_set_text_all(PaletteEntriesP entries) if(p_entries == NULL) return; /* This is actually and error */ - num_buf = g_strdup_printf("%d",p_entries->n_colors);; + num_buf = g_strdup_printf ("%d", p_entries->n_colors);; - num_copy = g_strdup(num_buf); + num_copy = g_strdup (num_buf); pp = top_level_palette; - gtk_clist_set_text(GTK_CLIST(pp->clist),pos,1,num_copy); - redraw_palette(pp); + gtk_clist_set_text (GTK_CLIST (pp->clist), pos, 1, num_copy); + redraw_palette (pp); } static void -palette_select2_refresh_all() +palette_select2_refresh_all () { - PaletteP pp; + PaletteDialog *pp; if(!top_level_palette) return; pp = top_level_palette; - gtk_clist_freeze(GTK_CLIST(pp->clist)); - gtk_clist_clear(GTK_CLIST(pp->clist)); - palette_clist_init(pp->clist,pp->shell,pp->gc); - gtk_clist_thaw(GTK_CLIST(pp->clist)); + gtk_clist_freeze (GTK_CLIST(pp->clist)); + gtk_clist_clear (GTK_CLIST(pp->clist)); + palette_clist_init (pp->clist, pp->shell, pp->gc); + gtk_clist_thaw (GTK_CLIST (pp->clist)); pp->entries = palette_entries_list->data; - redraw_palette(pp); - palette_scroll_clist_to_current(pp); + redraw_palette (pp); + palette_scroll_clist_to_current (pp); } static void -palette_select2_clist_insert_all(PaletteEntriesP p_entries) +palette_select2_clist_insert_all (PaletteEntriesP p_entries) { PaletteEntriesP chk_entries; - PaletteP pp; + PaletteDialog *pp; GSList *plist; gint pos = 0; @@ -382,15 +390,15 @@ palette_select2_clist_insert_all(PaletteEntriesP p_entries) { return; } - if (strcmp(p_entries->name, chk_entries->name) == 0) + if (strcmp (p_entries->name, chk_entries->name) == 0) break; pos++; } pp = top_level_palette; - gtk_clist_freeze(GTK_CLIST(pp->clist)); - palette_insert_clist(pp->clist,pp->shell,pp->gc,p_entries,pos); - gtk_clist_thaw(GTK_CLIST(pp->clist)); + gtk_clist_freeze (GTK_CLIST (pp->clist)); + palette_insert_clist (pp->clist, pp->shell, pp->gc, p_entries, pos); + gtk_clist_thaw (GTK_CLIST (pp->clist)); /* if(gradient_select_dialog) */ /* { */ @@ -398,9 +406,8 @@ palette_select2_clist_insert_all(PaletteEntriesP p_entries) /* } */ } - static void -palette_save_palettes() +palette_save_palettes () { GSList *list; PaletteEntriesP entries; @@ -421,10 +428,10 @@ palette_save_palettes() } static void -palette_save_palettes_callback(GtkWidget *w, - gpointer client_data) +palette_save_palettes_callback (GtkWidget *widget, + gpointer data) { - palette_save_palettes(); + palette_save_palettes (); } static void @@ -444,8 +451,8 @@ palette_free () { if(import_dialog) { - gtk_widget_destroy(import_dialog->dialog); - g_free(import_dialog); + gtk_widget_destroy (import_dialog->dialog); + g_free (import_dialog); import_dialog = NULL; } @@ -459,7 +466,7 @@ palette_free () top_level_edit_palette = NULL; } - if(top_level_palette) + if (top_level_palette) { gdk_gc_destroy (top_level_palette->gc); session_get_window_info (top_level_palette->shell, &palette_session_info); @@ -469,7 +476,7 @@ palette_free () static void palette_entries_save (PaletteEntriesP palette, - char *filename) + gchar *filename) { FILE * fp; GSList * list; @@ -501,20 +508,18 @@ palette_entries_save (PaletteEntriesP palette, fclose (fp); } - - static PaletteEntryP palette_add_entry (PaletteEntriesP entries, - char *name, - int r, - int g, - int b) + gchar *name, + gint r, + gint g, + gint b) { PaletteEntryP entry; if (entries) { - entry = g_malloc (sizeof (_PaletteEntry)); + entry = g_new (_PaletteEntry, 1); entry->color[0] = r; entry->color[1] = g; @@ -537,28 +542,30 @@ palette_add_entry (PaletteEntriesP entries, } static void -palette_change_color (int r, - int g, - int b, - int state) +palette_change_color (gint r, + gint g, + gint b, + gint state) { if (top_level_edit_palette && top_level_edit_palette->entries) { switch (state) { case COLOR_NEW: - top_level_edit_palette->color = palette_add_entry (top_level_edit_palette->entries, _("Untitled"), r, g, b); + top_level_edit_palette->color = + palette_add_entry (top_level_edit_palette->entries, + _("Untitled"), r, g, b); - palette_update_small_preview(top_level_edit_palette); - redraw_palette(top_level_edit_palette); + palette_update_small_preview (top_level_edit_palette); + redraw_palette (top_level_edit_palette); break; case COLOR_UPDATE_NEW: top_level_edit_palette->color->color[0] = r; top_level_edit_palette->color->color[1] = g; top_level_edit_palette->color->color[2] = b; - palette_update_small_preview(top_level_edit_palette); - redraw_palette(top_level_edit_palette); + palette_update_small_preview (top_level_edit_palette); + redraw_palette (top_level_edit_palette); break; default: @@ -573,31 +580,30 @@ palette_change_color (int r, } void -palette_set_active_color (int r, - int g, - int b, - int state) +palette_set_active_color (gint r, + gint g, + gint b, + gint state) { palette_change_color (r, g, b, state); } static void -palette_entries_load (char *filename) +palette_entries_load (gchar *filename) { PaletteEntriesP entries; - char str[512]; - char *tok; - FILE *fp; - int r, g, b; - int linenum; - GSList *list; - gint pos = 0; PaletteEntriesP p_entries = NULL; - + gchar str[512]; + gchar *tok; + FILE *fp; + gint r, g, b; + gint linenum; + GSList *list; + gint pos = 0; r = g = b = 0; - entries = (PaletteEntriesP) g_malloc (sizeof (_PaletteEntries)); + entries = g_new (_PaletteEntries, 1); entries->filename = g_strdup (filename); entries->name = g_strdup (g_basename (filename)); @@ -606,7 +612,6 @@ palette_entries_load (char *filename) entries->pixmap = NULL; /* Open the requested file */ - if (!(fp = fopen (filename, "r"))) { palette_entries_free (entries); @@ -623,9 +628,13 @@ palette_entries_load (char *filename) { /* bad magic, but maybe it has \r\n at the end of lines? */ if (!strcmp (str, "GIMP Palette\r")) - g_message (_("Loading palette %s:\nCorrupt palette: missing magic header\nDoes this file need converting from DOS?"), filename); + g_message (_("Loading palette %s:\n" + "Corrupt palette:\n" + "missing magic header\n" + "Does this file need converting from DOS?"), filename); else - g_message (_("Loading palette %s:\nCorrupt palette: missing magic header"), filename); + g_message (_("Loading palette %s:\n" + "Corrupt palette: missing magic header"), filename); fclose (fp); palette_entries_free (entries); return; @@ -649,26 +658,26 @@ palette_entries_load (char *filename) if (str[0] != '#') { tok = strtok (str, " \t"); - if (tok) { + if (tok) r = atoi (tok); - } else { - g_message (_("Loading palette %s (line %d):\nMissing RED component"), filename, linenum); + else + g_message (_("Loading palette %s (line %d):\n" + "Missing RED component"), filename, linenum); /* maybe we should just abort? */ - } tok = strtok (NULL, " \t"); - if (tok) { + if (tok) g = atoi (tok); - } else { - g_message (_("Loading palette %s (line %d):\nMissing GREEN component"), filename, linenum); - } - + else + g_message (_("Loading palette %s (line %d):\n" + "Missing GREEN component"), filename, linenum); + tok = strtok (NULL, " \t"); - if (tok) { + if (tok) b = atoi (tok); - } else { - g_message (_("Loading palette %s (line %d):\nMissing BLUE component"), filename, linenum); - } + else + g_message (_("Loading palette %s (line %d):\n" + "Missing BLUE component"), filename, linenum); /* optional name */ tok = strtok (NULL, "\n"); @@ -676,11 +685,12 @@ palette_entries_load (char *filename) if (r < 0 || r > 255 || g < 0 || g > 255 || b < 0 || b > 255) - g_message (_("Loading palette %s (line %d):\nRGB value out of range"), filename, linenum); + g_message (_("Loading palette %s (line %d):\n" + "RGB value out of range"), filename, linenum); palette_add_entry (entries, tok, r, g, b); - } /* if */ - } /* while */ + } + } /* Clean up */ @@ -699,52 +709,53 @@ palette_entries_load (char *filename) { p_entries = default_palette_entries; } - if (strcmp(p_entries->name, entries->name) > 0) + if (strcmp (p_entries->name, entries->name) > 0) break; pos++; } - palette_entries_list = palette_entries_insert_list (palette_entries_list, entries,pos); + palette_entries_list = palette_entries_insert_list (palette_entries_list, entries, pos); /* Check if the current palette is the default one */ - if (strcmp(default_palette, g_basename(filename)) == 0) + if (strcmp (default_palette, g_basename (filename)) == 0) default_palette_entries = entries; } -static PaletteP -new_top_palette(gint vert) +static PaletteDialog * +new_top_palette (gboolean vert) { - PaletteP p; + PaletteDialog *p; - p = create_palette_dialog(vert); - palette_clist_init(p->clist,p->shell,p->gc); + p = create_palette_dialog (vert); + palette_clist_init (p->clist, p->shell, p->gc); - return(p); + return p; } void -palette_select_palette_init(void) +palette_select_palette_init (void) { /* Load them if they are not already loaded */ if(top_level_edit_palette == NULL) { - top_level_edit_palette = new_top_palette(FALSE); + top_level_edit_palette = new_top_palette (FALSE); } } void -palette_create(void) +palette_create (void) { - if(top_level_palette == NULL) + if (top_level_palette == NULL) { - top_level_palette = new_top_palette(TRUE); -/* top_level_palette = palette_new_selection(_("Palette"),NULL); */ - session_set_window_geometry (top_level_palette->shell, &palette_session_info, TRUE); + top_level_palette = new_top_palette (TRUE); + /* top_level_palette = palette_new_selection(_("Palette"),NULL); */ + session_set_window_geometry (top_level_palette->shell, + &palette_session_info, TRUE); /* register this one only */ - dialog_register(top_level_palette->shell); + dialog_register (top_level_palette->shell); - gtk_widget_show(top_level_palette->shell); - palette_scroll_clist_to_current(top_level_palette); + gtk_widget_show (top_level_palette->shell); + palette_scroll_clist_to_current (top_level_palette); } else { @@ -754,68 +765,68 @@ palette_create(void) } else { - gdk_window_raise(top_level_palette->shell->window); + gdk_window_raise (top_level_palette->shell->window); } } } void -palette_create_edit(PaletteEntriesP entries) +palette_create_edit (PaletteEntriesP entries) { - PaletteP p; + PaletteDialog *p; - if(top_level_edit_palette == NULL) + if (top_level_edit_palette == NULL) { + p = new_top_palette (FALSE); - p = new_top_palette(FALSE); - gtk_widget_show(p->shell); palette_draw_entries(p,-1,-1); top_level_edit_palette = p; - } else { if (!GTK_WIDGET_VISIBLE (top_level_edit_palette->shell)) { gtk_widget_show (top_level_edit_palette->shell); - palette_draw_entries(top_level_edit_palette,-1,-1); + palette_draw_entries (top_level_edit_palette, -1, -1); } else { - gdk_window_raise(top_level_edit_palette->shell->window); + gdk_window_raise (top_level_edit_palette->shell->window); } } if(entries != NULL) { top_level_edit_palette->entries = entries; - gtk_clist_unselect_all(GTK_CLIST(top_level_edit_palette->clist)); - palette_scroll_clist_to_current(top_level_edit_palette); + gtk_clist_unselect_all (GTK_CLIST (top_level_edit_palette->clist)); + palette_scroll_clist_to_current (top_level_edit_palette); } } static GSList * -palette_entries_insert_list (GSList * list, - PaletteEntriesP entries, - gint pos) +palette_entries_insert_list (GSList *list, + PaletteEntriesP entries, + gint pos) { GSList *ret_list; + /* add it to the list */ num_palette_entries++; - ret_list = g_slist_insert(list, (void *) entries,pos); + ret_list = g_slist_insert (list, (void *) entries, pos); return ret_list; } -static void palette_update_small_preview(PaletteP palette) +static void +palette_update_small_preview (PaletteDialog *palette) { GSList *list; gint pos = 0; PaletteEntriesP p_entries = NULL; - char *num_buf; + gchar *num_buf; list = palette_entries_list; @@ -836,21 +847,21 @@ static void palette_update_small_preview(PaletteP palette) pos++; } - num_buf = g_strdup_printf("%d",p_entries->n_colors); - palette_draw_small_preview(palette->gc,p_entries); - gtk_clist_set_text(GTK_CLIST(palette->clist),pos,1,num_buf); + num_buf = g_strdup_printf ("%d", p_entries->n_colors); + palette_draw_small_preview (palette->gc, p_entries); + gtk_clist_set_text (GTK_CLIST (palette->clist), pos, 1, num_buf); } static void -palette_delete_entry (GtkWidget *w, - gpointer client_data) +palette_delete_entry (GtkWidget *widget, + gpointer data) { PaletteEntryP entry; GSList *tmp_link; - PaletteP palette; + PaletteDialog *palette; gint pos = 0; - palette = client_data; + palette = data; if (palette && palette->entries && palette->color) { entry = palette->color; @@ -883,25 +894,24 @@ palette_delete_entry (GtkWidget *w, if (palette->entries->n_colors == 0) palette->color = palette_add_entry (palette->entries, _("Black"), 0, 0, 0); - palette_update_small_preview(palette); - palette_select_set_text_all(palette->entries); - palette_select2_set_text_all(palette->entries); - redraw_palette(palette); + palette_update_small_preview (palette); + palette_select_set_text_all (palette->entries); + palette_select2_set_text_all (palette->entries); + redraw_palette (palette); } } - static void -palette_new_callback (GtkWidget *w, - gpointer client_data) +palette_new_callback (GtkWidget *widget, + gpointer data) { - PaletteP palette; + PaletteDialog *palette; char *num_buf; GSList *list; gint pos = 0; PaletteEntriesP p_entries = NULL; - palette = client_data; + palette = data; if (palette && palette->entries) { if (active_color == FOREGROUND) @@ -913,7 +923,7 @@ palette_new_callback (GtkWidget *w, palette_add_entry (palette->entries, _("Untitled"), background[0], background[1], background[2]); - redraw_palette(palette); + redraw_palette (palette); list = palette_entries_list; @@ -932,54 +942,53 @@ palette_new_callback (GtkWidget *w, pos++; } - num_buf = g_strdup_printf("%d",p_entries->n_colors);; - palette_draw_small_preview(palette->gc,p_entries); - gtk_clist_set_text(GTK_CLIST(palette->clist),pos,1,num_buf); - palette_select_set_text_all(palette->entries); - palette_select2_set_text_all(palette->entries); + num_buf = g_strdup_printf ("%d", p_entries->n_colors);; + palette_draw_small_preview (palette->gc, p_entries); + gtk_clist_set_text (GTK_CLIST (palette->clist), pos, 1, num_buf); + palette_select_set_text_all (palette->entries); + palette_select2_set_text_all (palette->entries); } } - static PaletteEntriesP -palette_create_entries(gpointer client_data, - gpointer call_data) -{ - char *home; - char *palette_name; - char *local_path; - char *first_token; - char *token; - char *path; +palette_create_entries (gpointer data, + gpointer call_data) +{ + gchar *home; + gchar *palette_name; + gchar *local_path; + gchar *first_token; + gchar *token; + gchar *path; PaletteEntriesP entries = NULL; - PaletteP palette; + PaletteDialog *palette; GSList *list; gint pos = 0; PaletteEntriesP p_entries = NULL; - palette = client_data; + palette = data; palette_name = (char *) call_data; if (palette && palette_name) { - entries = g_malloc (sizeof (_PaletteEntries)); + entries = g_new (_PaletteEntries, 1); if (palette_path) { /* Get the first path specified in the palette path list */ home = g_get_home_dir (); local_path = g_strdup (palette_path); first_token = local_path; - token = xstrsep(&first_token, G_SEARCHPATH_SEPARATOR_S); + token = xstrsep (&first_token, G_SEARCHPATH_SEPARATOR_S); if (token) { if (*token == '~') { if (home) - path = g_strdup_printf("%s%s", home, token + 1); + path = g_strdup_printf ("%s%s", home, token + 1); else /* Just ignore the ~ if no HOME ??? */ - path = g_strdup(token + 1); + path = g_strdup (token + 1); } else { @@ -1022,82 +1031,87 @@ palette_create_entries(gpointer client_data, pos++; } - palette_entries_list = palette_entries_insert_list (palette_entries_list, entries,pos); - - palette_insert_clist(palette->clist,palette->shell,palette->gc,entries,pos); + palette_entries_list = + palette_entries_insert_list (palette_entries_list, entries, pos); + palette_insert_clist (palette->clist, palette->shell, palette->gc, + entries,pos); palette->entries = entries; - palette_save_palettes(); + palette_save_palettes (); } + return entries; } static void -palette_add_entries_callback (GtkWidget *w, - gpointer client_data, - gpointer call_data) +palette_add_entries_callback (GtkWidget *widget, + gpointer data, + gpointer call_data) { PaletteEntriesP entries; - entries = palette_create_entries(client_data,call_data); + + entries = palette_create_entries (data, call_data); /* Update other selectors on screen */ - palette_select_clist_insert_all(entries); - palette_select2_clist_insert_all(entries); - palette_scroll_clist_to_current((PaletteP)client_data); + palette_select_clist_insert_all (entries); + palette_select2_clist_insert_all (entries); + palette_scroll_clist_to_current ((PaletteDialog *) data); } static void -palette_new_entries_callback (GtkWidget *w, - gpointer client_data) +palette_new_entries_callback (GtkWidget *widget, + gpointer data) { gtk_widget_show (query_string_box (_("New Palette"), _("Enter a name for new palette"), NULL, NULL, NULL, - palette_add_entries_callback, client_data)); + palette_add_entries_callback, data)); } static void -redraw_zoom(PaletteP palette) +redraw_zoom (PaletteDialog *palette) { - if(palette->zoom_factor > 4.0) + if (palette->zoom_factor > 4.0) { palette->zoom_factor = 4.0; } - else if(palette->zoom_factor < 0.1) + else if (palette->zoom_factor < 0.1) { palette->zoom_factor = 0.1; } palette->columns = COLUMNS; - redraw_palette(palette); + redraw_palette (palette); - palette_scroll_top_left(palette); + palette_scroll_top_left (palette); } static void -palette_zoomin(GtkWidget *w, - gpointer client_data) +palette_zoomin (GtkWidget *widget, + gpointer data) { - PaletteP palette = client_data; + PaletteDialog *palette = data; + palette->zoom_factor += 0.1; - redraw_zoom(palette); + redraw_zoom (palette); } static void -palette_zoomout (GtkWidget *w, - gpointer client_data) +palette_zoomout (GtkWidget *widget, + gpointer data) { - PaletteP palette = client_data; + PaletteDialog *palette = data; + palette->zoom_factor -= 0.1; - redraw_zoom(palette); + redraw_zoom (palette); } static void -palette_refresh(PaletteP palette) +palette_refresh (PaletteDialog *palette) { - if(palette) + if (palette) { if (default_palette_entries == palette->entries) default_palette_entries = NULL; @@ -1112,50 +1126,50 @@ palette_refresh(PaletteP palette) palette_free_palettes (); /* free palettes, don't save any modified versions */ palette_init_palettes (FALSE); /* reload palettes */ - gtk_clist_freeze(GTK_CLIST(palette->clist)); - gtk_clist_clear(GTK_CLIST(palette->clist)); - palette_clist_init(palette->clist,palette->shell,palette->gc); - gtk_clist_thaw(GTK_CLIST(palette->clist)); + gtk_clist_freeze (GTK_CLIST (palette->clist)); + gtk_clist_clear (GTK_CLIST (palette->clist)); + palette_clist_init (palette->clist, palette->shell, palette->gc); + gtk_clist_thaw (GTK_CLIST (palette->clist)); - if(palette->entries == NULL) + if (palette->entries == NULL) palette->entries = default_palette_entries; if(palette->entries == NULL && palette_entries_list) palette->entries = palette_entries_list->data; - redraw_palette(palette); + redraw_palette (palette); - palette_scroll_clist_to_current(palette); + palette_scroll_clist_to_current (palette); - palette_select_refresh_all(); - palette_select2_refresh_all(); + palette_select_refresh_all (); + palette_select2_refresh_all (); } else { palette_free_palettes (); - palette_init_palettes(FALSE); + palette_init_palettes (FALSE); } - } static void -palette_refresh_callback (GtkWidget *w, - gpointer client_data) +palette_refresh_callback (GtkWidget *widget, + gpointer data) { - palette_refresh(client_data); + palette_refresh (data); } /*****/ static void -palette_draw_small_preview(GdkGC *gc, PaletteEntriesP p_entry) +palette_draw_small_preview(GdkGC *gc, + PaletteEntriesP p_entry) { - guchar rgb_buf[SM_PREVIEW_WIDTH*SM_PREVIEW_HEIGHT*3]; + guchar rgb_buf[SM_PREVIEW_WIDTH * SM_PREVIEW_HEIGHT * 3]; GSList *tmp_link; gint index; PaletteEntryP entry; - + /*fill_clist_prev(p_entry,rgb_buf,48,16,0.0,1.0);*/ - memset(rgb_buf,0x0,SM_PREVIEW_WIDTH*SM_PREVIEW_HEIGHT*3); + memset (rgb_buf, 0x0, sizeof (rgb_buf)); gdk_draw_rgb_image (p_entry->pixmap, gc, @@ -1173,12 +1187,12 @@ palette_draw_small_preview(GdkGC *gc, PaletteEntriesP p_entry) while (tmp_link) { guchar cell[3*3*3]; - int loop; - + gint loop; + entry = tmp_link->data; tmp_link = tmp_link->next; - for(loop = 0; loop < 27 ; loop+=3) + for (loop = 0; loop < 27 ; loop+=3) { cell[0+loop] = entry->color[0]; cell[1+loop] = entry->color[1]; @@ -1203,84 +1217,85 @@ palette_draw_small_preview(GdkGC *gc, PaletteEntriesP p_entry) static void -palette_select_callback (int r, - int g, - int b, - ColorSelectState state, - void *client_data) -{ - PaletteP palette; - unsigned char * color; - GSList *list; +palette_select_callback (gint r, + gint g, + gint b, + ColorSelectState state, + void *data) +{ + PaletteDialog *palette; + guchar *color; + GSList *list; gint pos = 0; PaletteEntriesP p_entries = NULL; - palette = client_data; + palette = data; if (palette && palette->entries) { - switch (state) { - case COLOR_SELECT_UPDATE: - break; - case COLOR_SELECT_OK: - if (palette->color) - { - color = palette->color->color; + switch (state) + { + case COLOR_SELECT_UPDATE: + break; + case COLOR_SELECT_OK: + if (palette->color) + { + color = palette->color->color; - color[0] = r; - color[1] = g; - color[2] = b; + color[0] = r; + color[1] = g; + color[2] = b; - /* Update either foreground or background colors */ - if (active_color == FOREGROUND) - palette_set_foreground (r, g, b); - else if (active_color == BACKGROUND) - palette_set_background (r, g, b); + /* Update either foreground or background colors */ + if (active_color == FOREGROUND) + palette_set_foreground (r, g, b); + else if (active_color == BACKGROUND) + palette_set_background (r, g, b); - palette_draw_entries (palette, - palette->color->position/(palette->columns), - palette->color->position%(palette->columns)); - palette_draw_small_preview(palette->gc,palette->entries); + palette_draw_entries (palette, + palette->color->position/(palette->columns), + palette->color->position%(palette->columns)); + palette_draw_small_preview (palette->gc,palette->entries); - /* Add into the clist */ - - list = palette_entries_list; - - while (list) - { - p_entries = (PaletteEntriesP) list->data; - list = g_slist_next (list); - - /* to make sure we get something! */ - if (p_entries == NULL) + /* Add into the clist */ + list = palette_entries_list; + + while (list) { - p_entries = default_palette_entries; + p_entries = (PaletteEntriesP) list->data; + list = g_slist_next (list); + + /* to make sure we get something! */ + if (p_entries == NULL) + { + p_entries = default_palette_entries; + } + if (p_entries == palette->entries) + break; + pos++; } - if (p_entries == palette->entries) - break; - pos++; - } - gtk_clist_set_text(GTK_CLIST(palette->clist),pos,2,p_entries->name); - palette_select_set_text_all(palette->entries); - palette_select2_set_text_all(palette->entries); - } - /* Fallthrough */ - case COLOR_SELECT_CANCEL: - color_select_hide (palette->color_select); - palette->color_select_active = 0; - } + gtk_clist_set_text (GTK_CLIST (palette->clist), + pos, 2, p_entries->name); + palette_select_set_text_all (palette->entries); + palette_select2_set_text_all (palette->entries); + } + /* Fallthrough */ + case COLOR_SELECT_CANCEL: + color_select_hide (palette->color_select); + palette->color_select_active = 0; + } } } static void -palette_scroll_clist_to_current(PaletteP palette) +palette_scroll_clist_to_current (PaletteDialog *palette) { GSList *list; gint pos = 0; PaletteEntriesP p_entries; - if(palette && palette->entries) + if (palette && palette->entries) { list = palette_entries_list; @@ -1294,40 +1309,39 @@ palette_scroll_clist_to_current(PaletteP palette) pos++; } - gtk_clist_unselect_all(GTK_CLIST(palette->clist)); - gtk_clist_select_row(GTK_CLIST(palette->clist),pos,-1); - gtk_clist_moveto(GTK_CLIST(palette->clist),pos,0,0.0,0.0); + gtk_clist_unselect_all (GTK_CLIST (palette->clist)); + gtk_clist_select_row (GTK_CLIST (palette->clist), pos, -1); + gtk_clist_moveto (GTK_CLIST (palette->clist), pos, 0, 0.0, 0.0); } } static void -palette_delete_entries_callback (GtkWidget *w, - gpointer client_data) +palette_delete_entries_callback (GtkWidget *widget, + gpointer data) { - PaletteP palette; + PaletteDialog *palette; PaletteEntriesP entries; - palette = client_data; + palette = data; if (palette && palette->entries) { entries = palette->entries; if (entries && entries->filename) palette_entries_delete (entries->filename); - palette_entries_list = g_slist_remove(palette_entries_list,entries); + palette_entries_list = g_slist_remove (palette_entries_list, entries); - palette_refresh(palette); + palette_refresh (palette); } } - static void -palette_close_callback (GtkWidget *w, - gpointer client_data) +palette_close_callback (GtkWidget *widget, + gpointer data) { - PaletteP palette; + PaletteDialog *palette; - palette = client_data; + palette = data; if (palette) { if (palette->color_select_active) @@ -1338,8 +1352,8 @@ palette_close_callback (GtkWidget *w, if(import_dialog) { - gtk_widget_destroy(import_dialog->dialog); - g_free(import_dialog); + gtk_widget_destroy (import_dialog->dialog); + g_free (import_dialog); import_dialog = NULL; } @@ -1348,48 +1362,50 @@ palette_close_callback (GtkWidget *w, } } - static gint -palette_dialog_delete_callback (GtkWidget *w, - GdkEvent *e, - gpointer client_data) +palette_dialog_delete_callback (GtkWidget *widget, + GdkEvent *event, + gpointer data) { - palette_close_callback (w, client_data); - + palette_close_callback (widget, data); + return TRUE; } static void -color_name_entry_changed (GtkWidget *widget, gpointer pdata) +color_name_entry_changed (GtkWidget *widget, + gpointer data) { - PaletteP palette; + PaletteDialog *palette; - palette = pdata; - if(palette->color->name) - g_free(palette->color->name); + palette = data; + if (palette->color->name) + g_free (palette->color->name); palette->entries->changed = 1; - palette->color->name = g_strdup(gtk_entry_get_text(GTK_ENTRY (palette->color_name))); + palette->color->name = + g_strdup (gtk_entry_get_text (GTK_ENTRY (palette->color_name))); } static void -palette_edit_callback (GtkWidget * widget, - gpointer client_data) +palette_edit_callback (GtkWidget *widget, + gpointer data) { - PaletteP palette; - unsigned char *color; + PaletteDialog *palette; + guchar *color; - palette = client_data; + palette = data; if (palette && palette->entries && palette->color) { color = palette->color->color; if (!palette->color_select) { - palette->color_select = color_select_new (color[0], color[1], color[2], - palette_select_callback, palette, - FALSE); + palette->color_select = + color_select_new (color[0], color[1], color[2], + palette_select_callback, palette, + FALSE); palette->color_select_active = 1; } else @@ -1400,56 +1416,61 @@ palette_edit_callback (GtkWidget * widget, palette->color_select_active = 1; } - color_select_set_color (palette->color_select, color[0], color[1], color[2], 1); + color_select_set_color (palette->color_select, + color[0], color[1], color[2], 1); } } } static void -palette_popup_menu(PaletteP palette) +palette_popup_menu (PaletteDialog *palette) { GtkWidget *menu; GtkWidget *menu_items; - menu = gtk_menu_new(); - menu_items = gtk_menu_item_new_with_label(_("Edit")); - gtk_menu_append(GTK_MENU (menu), menu_items); - - gtk_signal_connect(GTK_OBJECT(menu_items), "activate", - GTK_SIGNAL_FUNC(palette_edit_callback), (gpointer)palette); - gtk_widget_show(menu_items); - - menu_items = gtk_menu_item_new_with_label(_("New")); - gtk_menu_append(GTK_MENU (menu), menu_items); - gtk_signal_connect(GTK_OBJECT(menu_items), "activate", - GTK_SIGNAL_FUNC(palette_new_callback), (gpointer)palette); - gtk_widget_show(menu_items); - - menu_items = gtk_menu_item_new_with_label(_("Delete")); - gtk_signal_connect(GTK_OBJECT(menu_items), "activate", - GTK_SIGNAL_FUNC(palette_delete_entry), (gpointer)palette); - gtk_menu_append(GTK_MENU (menu), menu_items); - gtk_widget_show(menu_items); + menu = gtk_menu_new (); + menu_items = gtk_menu_item_new_with_label (_("Edit")); + gtk_menu_append (GTK_MENU (menu), menu_items); + + gtk_signal_connect (GTK_OBJECT (menu_items), "activate", + GTK_SIGNAL_FUNC (palette_edit_callback), + (gpointer) palette); + gtk_widget_show (menu_items); + + menu_items = gtk_menu_item_new_with_label (_("New")); + gtk_menu_append (GTK_MENU (menu), menu_items); + gtk_signal_connect (GTK_OBJECT (menu_items), "activate", + GTK_SIGNAL_FUNC (palette_new_callback), + (gpointer) palette); + gtk_widget_show (menu_items); + + menu_items = gtk_menu_item_new_with_label (_("Delete")); + gtk_signal_connect (GTK_OBJECT(menu_items), "activate", + GTK_SIGNAL_FUNC (palette_delete_entry), + (gpointer) palette); + gtk_menu_append (GTK_MENU (menu), menu_items); + gtk_widget_show (menu_items); /* Do something interesting when the menuitem is selected */ /* gtk_signal_connect_object(GTK_OBJECT(menu_items), "activate", */ /* GTK_SIGNAL_FUNC(menuitem_response), (gpointer) g_strdup(buf)); */ - + palette->popup_menu = menu; - palette->popup_small_menu = menu = gtk_menu_new(); - menu_items = gtk_menu_item_new_with_label(_("New")); - gtk_menu_append(GTK_MENU (menu), menu_items); - gtk_signal_connect(GTK_OBJECT(menu_items), "activate", - GTK_SIGNAL_FUNC(palette_new_callback), (gpointer)palette); - gtk_widget_show(menu_items); + palette->popup_small_menu = menu = gtk_menu_new (); + menu_items = gtk_menu_item_new_with_label (_("New")); + gtk_menu_append (GTK_MENU (menu), menu_items); + gtk_signal_connect (GTK_OBJECT (menu_items), "activate", + GTK_SIGNAL_FUNC (palette_new_callback), + (gpointer) palette); + gtk_widget_show (menu_items); } static gint -palette_color_area_events (GtkWidget *widget, - GdkEvent *event, - PaletteP palette) +palette_color_area_events (GtkWidget *widget, + GdkEvent *event, + PaletteDialog *palette) { GdkEventButton *bevent; GSList *tmp_link; @@ -1480,7 +1501,7 @@ palette_color_area_events (GtkWidget *widget, if(palette->color) { palette->freeze_update = TRUE; - palette_draw_entries(palette,-1,-1); + palette_draw_entries (palette, -1, -1); palette->freeze_update = FALSE; } palette->color = tmp_link->data; @@ -1494,16 +1515,18 @@ palette_color_area_events (GtkWidget *widget, else if (active_color == BACKGROUND) palette_set_background (r, g, b); - palette_draw_entries(palette,row,col); + palette_draw_entries (palette, row, col); /* Update the active color name */ - gtk_entry_set_text (GTK_ENTRY (palette->color_name), palette->color->name); + gtk_entry_set_text (GTK_ENTRY (palette->color_name), + palette->color->name); gtk_widget_set_sensitive (palette->color_name, TRUE); /* palette_update_current_entry (palette); */ - if(bevent->button == 3) + if (bevent->button == 3) { /* Popup the edit menu */ gtk_menu_popup (GTK_MENU (palette->popup_menu), NULL, NULL, - NULL, NULL, 3, ((GdkEventButton *)event)->time); + NULL, NULL, 3, + ((GdkEventButton *)event)->time); } } else @@ -1511,95 +1534,96 @@ palette_color_area_events (GtkWidget *widget, if(bevent->button == 3) { /* Popup the small new menu */ - gtk_menu_popup (GTK_MENU (palette->popup_small_menu), NULL, NULL, - NULL, NULL, 3, ((GdkEventButton *)event)->time); + gtk_menu_popup (GTK_MENU (palette->popup_small_menu), + NULL, NULL, + NULL, NULL, 3, + ((GdkEventButton *)event)->time); } } } break; - + default: break; } - + return FALSE; } void -palette_insert_clist(GtkWidget *clist, - GtkWidget *shell, - GdkGC *gc, - PaletteEntriesP p_entries, - gint pos) +palette_insert_clist (GtkWidget *clist, + GtkWidget *shell, + GdkGC *gc, + PaletteEntriesP p_entries, + gint pos) { gchar *string[3]; - + string[0] = NULL; - string[1] = g_strdup_printf("%d",p_entries->n_colors); + string[1] = g_strdup_printf ("%d", p_entries->n_colors); string[2] = p_entries->name; + + gtk_clist_insert (GTK_CLIST (clist), pos, string); + + g_free (string[1]); - gtk_clist_insert(GTK_CLIST(clist),pos,string); - - g_free((void *)string[1]); - - if(p_entries->pixmap == NULL) - p_entries->pixmap = gdk_pixmap_new(shell->window, - SM_PREVIEW_WIDTH, - SM_PREVIEW_HEIGHT, - gtk_widget_get_visual(shell)->depth); + if (p_entries->pixmap == NULL) + p_entries->pixmap = gdk_pixmap_new (shell->window, + SM_PREVIEW_WIDTH, + SM_PREVIEW_HEIGHT, + gtk_widget_get_visual (shell)->depth); - palette_draw_small_preview(gc,p_entries); - gtk_clist_set_pixmap(GTK_CLIST(clist), pos, 0, p_entries->pixmap, NULL); - gtk_clist_set_row_data(GTK_CLIST(clist),pos,(gpointer)p_entries); + palette_draw_small_preview (gc, p_entries); + gtk_clist_set_pixmap (GTK_CLIST (clist), pos, 0, p_entries->pixmap, NULL); + gtk_clist_set_row_data (GTK_CLIST (clist), pos, (gpointer) p_entries); } void -palette_clist_init(GtkWidget *clist, - GtkWidget *shell, - GdkGC *gc) +palette_clist_init (GtkWidget *clist, + GtkWidget *shell, + GdkGC *gc) { GSList *list; PaletteEntriesP p_entries = NULL; gint pos = 0; - + list = palette_entries_list; - + while (list) { - p_entries = (PaletteEntriesP) list->data; list = g_slist_next (list); - + /* to make sure we get something! */ if (p_entries == NULL) { p_entries = default_palette_entries; } - - palette_insert_clist(clist,shell,gc,p_entries,pos); + + palette_insert_clist (clist, shell, gc, p_entries, pos); pos++; } } static int -palette_draw_color_row (unsigned char **colors, - gint ncolors, - gint y, - gint column_highlight, - unsigned char *buffer, - PaletteP palette) -{ - unsigned char *p; - unsigned char bcolor; - int width, height; - int entry_width; - int entry_height; - int vsize; - int vspacing; - int i, j; - GtkWidget *preview; +palette_draw_color_row (guchar **colors, + gint ncolors, + gint y, + gint column_highlight, + guchar *buffer, + PaletteDialog *palette) +{ + guchar *p; + guchar bcolor; + gint width, height; + gint entry_width; + gint entry_height; + gint vsize; + gint vspacing; + gint i, j; + GtkWidget *preview; - if(!palette) + if (!palette) return -1; preview = palette->color_area; @@ -1608,8 +1632,8 @@ palette_draw_color_row (unsigned char **colors, width = preview->requisition.width; height = preview->requisition.height; - entry_width = (ENTRY_WIDTH*palette->zoom_factor); - entry_height = (ENTRY_HEIGHT*palette->zoom_factor); + entry_width = (ENTRY_WIDTH * palette->zoom_factor); + entry_height = (ENTRY_HEIGHT * palette->zoom_factor); if ((y >= 0) && ((y + SPACING) < height)) vspacing = SPACING; @@ -1633,16 +1657,17 @@ palette_draw_color_row (unsigned char **colors, *p++ = bcolor; } - if(column_highlight >= 0) + if (column_highlight >= 0) { guchar *ph = &buffer[3*column_highlight*(entry_width+SPACING)]; - for(j = 0 ; j <= entry_width + SPACING; j++) + for (j = 0 ; j <= entry_width + SPACING; j++) { *ph++ = ~bcolor; *ph++ = ~bcolor; *ph++ = ~bcolor; } - gtk_preview_draw_row (GTK_PREVIEW (preview), buffer, 0, y+entry_height+1, width); + gtk_preview_draw_row (GTK_PREVIEW (preview), buffer, 0, + y + entry_height + 1, width); } gtk_preview_draw_row (GTK_PREVIEW (preview), buffer, 0, y, width); @@ -1695,7 +1720,7 @@ palette_draw_color_row (unsigned char **colors, for (j = 0; j < SPACING; j++) { - if(ncolors == column_highlight) + if (ncolors == column_highlight) { *p++ = ~bcolor; *p++ = ~bcolor; @@ -1713,7 +1738,7 @@ palette_draw_color_row (unsigned char **colors, y += entry_height - vsize; for (i = 0; i < vsize; i++, y++) { - if(column_highlight >= 0) + if (column_highlight >= 0) { guchar *ph = &buffer[3*column_highlight*(entry_width+SPACING)]; *ph++ = ~bcolor; @@ -1735,28 +1760,29 @@ palette_draw_color_row (unsigned char **colors, return y; } - static void -palette_draw_entries (PaletteP palette,gint row_start, gint column_highlight) +palette_draw_entries (PaletteDialog *palette, + gint row_start, + gint column_highlight) { PaletteEntryP entry; - unsigned char *buffer; - unsigned char **colors; + guchar *buffer; + guchar **colors; GSList *tmp_link; - int width, height; - int entry_width; - int entry_height; - int index, y; + gint width, height; + gint entry_width; + gint entry_height; + gint index, y; if (palette && palette->entries) { width = palette->color_area->requisition.width; height = palette->color_area->requisition.height; - entry_width = (ENTRY_WIDTH*palette->zoom_factor); - entry_height = (ENTRY_HEIGHT*palette->zoom_factor); + entry_width = (ENTRY_WIDTH * palette->zoom_factor); + entry_height = (ENTRY_HEIGHT * palette->zoom_factor); - colors = g_malloc (sizeof(unsigned char *) * palette->columns * 3); + colors = g_malloc (sizeof (guchar *) * palette->columns * 3); buffer = g_malloc (width * 3); if(row_start < 0) @@ -1812,7 +1838,7 @@ palette_draw_entries (PaletteP palette,gint row_start, gint column_highlight) } static void -palette_scroll_top_left(PaletteP palette) +palette_scroll_top_left (PaletteDialog *palette) { GtkAdjustment *hadj; GtkAdjustment *vadj; @@ -1820,23 +1846,23 @@ palette_scroll_top_left(PaletteP palette) /* scroll viewport to top left */ if(palette && palette->scrolled_window) { - hadj = gtk_scrolled_window_get_hadjustment(GTK_SCROLLED_WINDOW(palette->scrolled_window)); - vadj = gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(palette->scrolled_window)); + hadj = gtk_scrolled_window_get_hadjustment (GTK_SCROLLED_WINDOW (palette->scrolled_window)); + vadj = gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (palette->scrolled_window)); if(hadj) - gtk_adjustment_set_value(hadj,0.0); + gtk_adjustment_set_value (hadj, 0.0); if(vadj) - gtk_adjustment_set_value(vadj,0.0); + gtk_adjustment_set_value (vadj, 0.0); } } static void -redraw_palette(PaletteP palette) +redraw_palette (PaletteDialog *palette) { + GtkWidget *parent; gint vsize; gint nrows; gint n_entries; - GtkWidget *parent; gint new_pre_width; n_entries = palette->entries->n_colors; @@ -1844,37 +1870,36 @@ redraw_palette(PaletteP palette) if (n_entries % palette->columns) nrows += 1; - vsize = nrows*(SPACING + (gint)(ENTRY_HEIGHT*palette->zoom_factor))+SPACING; + vsize = nrows* (SPACING + (gint)(ENTRY_HEIGHT*palette->zoom_factor)) + SPACING; parent = palette->color_area->parent; - gtk_widget_ref(palette->color_area); - gtk_container_remove(GTK_CONTAINER(parent),palette->color_area); - - new_pre_width = (gint)(ENTRY_WIDTH*palette->zoom_factor); - new_pre_width = (new_pre_width+SPACING)*palette->columns+SPACING; + gtk_widget_ref (palette->color_area); + gtk_container_remove (GTK_CONTAINER (parent), palette->color_area); - gtk_preview_size(GTK_PREVIEW(palette->color_area), - new_pre_width, /*PREVIEW_WIDTH,*/ - vsize); + new_pre_width = (gint) (ENTRY_WIDTH * palette->zoom_factor); + new_pre_width = (new_pre_width + SPACING) * palette->columns + SPACING; - gtk_container_add(GTK_CONTAINER(parent),palette->color_area); - gtk_widget_unref(palette->color_area); + gtk_preview_size (GTK_PREVIEW (palette->color_area), + new_pre_width, /*PREVIEW_WIDTH,*/ + vsize); + gtk_container_add (GTK_CONTAINER (parent), palette->color_area); + gtk_widget_unref (palette->color_area); - palette_draw_entries(palette,-1,-1); + palette_draw_entries (palette, -1, -1); } static void -palette_list_item_update(GtkWidget *widget, - gint row, - gint column, - GdkEventButton *event, - gpointer data) +palette_list_item_update (GtkWidget *widget, + gint row, + gint column, + GdkEventButton *event, + gpointer data) { - PaletteP palette; + PaletteDialog *palette; PaletteEntriesP p_entries; - palette = (PaletteP)data; + palette = (PaletteDialog *) data; if (palette->color_select_active) { @@ -1882,37 +1907,40 @@ palette_list_item_update(GtkWidget *widget, color_select_hide (palette->color_select); } - if(palette->color_select) - color_select_free(palette->color_select); + if (palette->color_select) + color_select_free (palette->color_select); palette->color_select = NULL; p_entries = - (PaletteEntriesP)gtk_clist_get_row_data(GTK_CLIST(palette->clist),row); + (PaletteEntriesP) gtk_clist_get_row_data (GTK_CLIST (palette->clist), row); palette->entries = p_entries; - redraw_palette(palette); + redraw_palette (palette); - palette_scroll_top_left(palette); + palette_scroll_top_left (palette); - /* Stop errors in case no colours are selected */ - gtk_signal_handler_block(GTK_OBJECT (palette->color_name),palette->entry_sig_id); + /* Stop errors in case no colors are selected */ + gtk_signal_handler_block (GTK_OBJECT (palette->color_name), + palette->entry_sig_id); gtk_entry_set_text (GTK_ENTRY (palette->color_name), _("Undefined")); gtk_widget_set_sensitive (palette->color_name, FALSE); - gtk_signal_handler_unblock(GTK_OBJECT (palette->color_name),palette->entry_sig_id); + gtk_signal_handler_unblock (GTK_OBJECT (palette->color_name), + palette->entry_sig_id); } static void -palette_edit_palette_callback (GtkWidget *w, - gpointer client_data) +palette_edit_palette_callback (GtkWidget *widget, + gpointer data) { PaletteEntriesP p_entries = NULL; - PaletteP palette = (PaletteP)client_data; + PaletteDialog *palette; GList *sel_list; - sel_list = GTK_CLIST(palette->clist)->selection; + palette = (PaletteDialog *) data; + sel_list = GTK_CLIST (palette->clist)->selection; - if(sel_list) + if (sel_list) { while (sel_list) { @@ -1921,9 +1949,9 @@ palette_edit_palette_callback (GtkWidget *w, row = GPOINTER_TO_INT (sel_list->data); p_entries = - (PaletteEntriesP)gtk_clist_get_row_data(GTK_CLIST(palette->clist),row); + (PaletteEntriesP)gtk_clist_get_row_data (GTK_CLIST (palette->clist), row); - palette_create_edit(p_entries); + palette_create_edit (p_entries); /* One only */ return; @@ -1931,44 +1959,38 @@ palette_edit_palette_callback (GtkWidget *w, } } - -PaletteP +PaletteDialog * create_palette_dialog (gint vert) { - GtkWidget *palette_dialog; - GtkWidget *dialog_vbox3; - GtkWidget *hbox3; - GtkWidget *hbox4; - GtkWidget *hbox5; - GtkWidget *vbox4; - GtkWidget *palette_scrolledwindow; + PaletteDialog *palette; + GtkWidget *hbox; + GtkWidget *hbox2; + GtkWidget *vbox; + GtkWidget *scrolledwindow; GtkWidget *palette_region; - GtkWidget *color_name; - GtkWidget *alignment1; + GtkWidget *entry; + GtkWidget *alignment; GtkWidget *palette_list; - GtkWidget *frame1; - GtkWidget *vbuttonbox2; - GtkWidget *new_palette; - GtkWidget *delete_palette; - GtkWidget *save_palettes; - GtkWidget *import_palette; - GtkWidget *merge_palette; - GtkWidget *dialog_action_area3; - GtkWidget *alignment2; - GtkWidget *hbuttonbox3; - GtkWidget *close_button; - GtkWidget *refresh_button; - GtkWidget *clist_scrolledwindow; - PaletteP palette; - GdkColormap *colormap; - GtkWidget* button_plus; - GtkWidget* button_minus; - GtkWidget* pixmapwid; - GdkPixmap* pixmap; - GdkBitmap* mask; - GtkStyle* style; + GtkWidget *frame; + GtkWidget *button; + GtkWidget *pixmapwid; + GdkPixmap *pixmap; + GdkBitmap *mask; + GtkStyle *style; - palette = g_malloc (sizeof (_Palette)); + static ActionAreaItem vert_action_items[] = + { + { N_("Edit"), palette_edit_palette_callback, NULL, NULL }, + { N_("Close"), palette_close_callback, NULL, NULL } + }; + static ActionAreaItem horz_action_items[] = + { + { N_("Save"), palette_save_palettes_callback, NULL, NULL }, + { N_("Refresh"), palette_refresh_callback, NULL, NULL }, + { N_("Close"), palette_close_callback, NULL, NULL } + }; + + palette = g_new (PaletteDialog, 1); palette->entries = default_palette_entries; palette->color = NULL; @@ -1978,68 +2000,58 @@ create_palette_dialog (gint vert) palette->columns = COLUMNS; palette->freeze_update = FALSE; - palette->shell = palette_dialog = gtk_dialog_new (); - + palette->shell = gtk_dialog_new (); gtk_window_set_wmclass (GTK_WINDOW (palette->shell), "color_palette", "Gimp"); - if(!vert) - { - gtk_widget_set_usize (palette_dialog, 615, 200); - } - else - { - gtk_widget_set_usize (palette_dialog, 230, 300); - } - - if(!vert) + if (!vert) { - gtk_window_set_title (GTK_WINDOW (palette_dialog), _("Color Palette Edit")); + gtk_widget_set_usize (palette->shell, 615, 200); + gtk_window_set_title (GTK_WINDOW (palette->shell), + _("Color Palette Edit")); } else { - gtk_window_set_title (GTK_WINDOW (palette_dialog), _("Color Palette")); + gtk_widget_set_usize (palette->shell, 230, 300); + gtk_window_set_title (GTK_WINDOW (palette->shell), + _("Color Palette")); } - gtk_window_set_policy (GTK_WINDOW (palette_dialog), TRUE, TRUE, FALSE); - - dialog_vbox3 = GTK_DIALOG (palette_dialog)->vbox; - gtk_object_set_data (GTK_OBJECT (palette_dialog), "dialog_vbox3", dialog_vbox3); - gtk_widget_show (dialog_vbox3); + /* Handle the wm delete event */ + gtk_signal_connect (GTK_OBJECT (palette->shell), "delete_event", + GTK_SIGNAL_FUNC (palette_dialog_delete_callback), + palette); - if(vert) + /* The main container widget */ + if (vert) { - hbox3 = gtk_notebook_new(); - gtk_widget_show (hbox3); - gtk_box_pack_start (GTK_BOX (dialog_vbox3), hbox3, TRUE, TRUE, 0); + hbox = gtk_notebook_new (); + gtk_container_set_border_width (GTK_CONTAINER (hbox), 1); } else { - hbox3 = gtk_hbox_new (FALSE, 0); - gtk_widget_show (hbox3); - gtk_box_pack_start (GTK_BOX (dialog_vbox3), hbox3, TRUE, TRUE, 0); + hbox = gtk_hbox_new (FALSE, 4); + gtk_container_set_border_width (GTK_CONTAINER (hbox), 4); } + gtk_container_add (GTK_CONTAINER (GTK_DIALOG (palette->shell)->vbox), hbox); + gtk_widget_show (hbox); - vbox4 = gtk_vbox_new (FALSE, 0); - gtk_object_set_data (GTK_OBJECT (palette_dialog), "vbox4", vbox4); - gtk_widget_show (vbox4); - if(!vert) + vbox = gtk_vbox_new (FALSE, 2); + if (!vert) { - gtk_box_pack_start (GTK_BOX (hbox3), vbox4, TRUE, TRUE, 0); + gtk_box_pack_start (GTK_BOX (hbox), vbox, TRUE, TRUE, 0); } + gtk_widget_show (vbox); - alignment1 = gtk_alignment_new (0.5, 0.5, 0.0, 0.0); - gtk_object_set_data (GTK_OBJECT (palette_dialog), "alignment1", alignment1); - gtk_widget_show (alignment1); + alignment = gtk_alignment_new (0.5, 0.5, 0.0, 0.0); + gtk_widget_show (alignment); - palette->scrolled_window = - palette_scrolledwindow = gtk_scrolled_window_new (NULL, NULL); - gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (palette_scrolledwindow), + palette->scrolled_window = + scrolledwindow = gtk_scrolled_window_new (NULL, NULL); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); - - gtk_object_set_data (GTK_OBJECT (palette_dialog), "palette_scrolledwindow", palette_scrolledwindow); - gtk_widget_show (palette_scrolledwindow); - gtk_box_pack_start (GTK_BOX (vbox4), palette_scrolledwindow, TRUE, TRUE, 0); + gtk_box_pack_start (GTK_BOX (vbox), scrolledwindow, TRUE, TRUE, 0); + gtk_widget_show (scrolledwindow); palette->color_area = palette_region = gtk_preview_new (GTK_PREVIEW_COLOR); gtk_preview_set_dither (GTK_PREVIEW (palette->color_area), @@ -2052,242 +2064,192 @@ create_palette_dialog (gint vert) palette); gtk_widget_show (palette_region); - gtk_container_add (GTK_CONTAINER (alignment1), palette_region); - gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (palette_scrolledwindow), alignment1); - - hbox4 = gtk_hbox_new (FALSE, 0); - gtk_box_pack_start (GTK_BOX (vbox4), hbox4, FALSE, FALSE, 0); - gtk_widget_show(hbox4); - - palette->color_name = color_name = gtk_entry_new (); - gtk_widget_show (color_name); - gtk_box_pack_start (GTK_BOX (hbox4), color_name, TRUE, TRUE, 0); - gtk_entry_set_text (GTK_ENTRY (color_name), _("Undefined")); - palette->entry_sig_id = gtk_signal_connect (GTK_OBJECT (color_name), "changed", - GTK_SIGNAL_FUNC (color_name_entry_changed), - palette); - - /* + and - buttons */ - style = gtk_widget_get_style(palette_dialog); - gtk_widget_realize(palette_dialog); - - button_plus = gtk_button_new (); - GTK_WIDGET_UNSET_FLAGS (button_plus, GTK_RECEIVES_DEFAULT); - gtk_signal_connect (GTK_OBJECT (button_plus), "clicked", + gtk_container_add (GTK_CONTAINER (alignment), palette_region); + gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolledwindow), + alignment); + + /* The color name entry */ + hbox2 = gtk_hbox_new (FALSE, 2); + gtk_box_pack_start (GTK_BOX (vbox), hbox2, FALSE, FALSE, 0); + gtk_widget_show(hbox2); + + entry = palette->color_name = gtk_entry_new (); + gtk_widget_show (entry); + gtk_box_pack_start (GTK_BOX (hbox2), entry, TRUE, TRUE, 0); + gtk_entry_set_text (GTK_ENTRY (entry), _("Undefined")); + palette->entry_sig_id = + gtk_signal_connect (GTK_OBJECT (entry), "changed", + GTK_SIGNAL_FUNC (color_name_entry_changed), + palette); + + /* + and - buttons */ + gtk_widget_realize (palette->shell); + style = gtk_widget_get_style (palette->shell); + + button = gtk_button_new (); + GTK_WIDGET_UNSET_FLAGS (button, GTK_RECEIVES_DEFAULT); + gtk_signal_connect (GTK_OBJECT (button), "clicked", GTK_SIGNAL_FUNC (palette_zoomin), (gpointer) palette); - gtk_box_pack_start (GTK_BOX (hbox4), button_plus, FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX (hbox2), button, FALSE, FALSE, 0); - button_minus = gtk_button_new (); - GTK_WIDGET_UNSET_FLAGS (button_minus, GTK_RECEIVES_DEFAULT); - gtk_signal_connect (GTK_OBJECT (button_minus), "clicked", - GTK_SIGNAL_FUNC (palette_zoomout), (gpointer) palette); - gtk_box_pack_start (GTK_BOX (hbox4), button_minus, FALSE, FALSE, 0); - - pixmap = gdk_pixmap_create_from_xpm_d(palette_dialog->window, &mask, - &style->bg[GTK_STATE_NORMAL], - zoom_in_xpm); - pixmapwid = gtk_pixmap_new(pixmap, mask); - gtk_container_add (GTK_CONTAINER (button_plus), pixmapwid); + pixmap = gdk_pixmap_create_from_xpm_d (palette->shell->window, &mask, + &style->bg[GTK_STATE_NORMAL], + zoom_in_xpm); + pixmapwid = gtk_pixmap_new (pixmap, mask); + gtk_container_add (GTK_CONTAINER (button), pixmapwid); gtk_widget_show (pixmapwid); + gtk_widget_show (button); - pixmap = gdk_pixmap_create_from_xpm_d(palette_dialog->window, &mask, - &style->bg[GTK_STATE_NORMAL], - zoom_out_xpm); - pixmapwid = gtk_pixmap_new(pixmap, mask); - gtk_container_add (GTK_CONTAINER (button_minus), pixmapwid); - gtk_widget_show (pixmapwid); - - gtk_widget_show (button_plus); - gtk_widget_show (button_minus); + button = gtk_button_new (); + GTK_WIDGET_UNSET_FLAGS (button, GTK_RECEIVES_DEFAULT); + gtk_signal_connect (GTK_OBJECT (button), "clicked", + GTK_SIGNAL_FUNC (palette_zoomout), (gpointer) palette); + gtk_box_pack_start (GTK_BOX (hbox2), button, FALSE, FALSE, 0); + pixmap = gdk_pixmap_create_from_xpm_d (palette->shell->window, &mask, + &style->bg[GTK_STATE_NORMAL], + zoom_out_xpm); + pixmapwid = gtk_pixmap_new (pixmap, mask); + gtk_container_add (GTK_CONTAINER (button), pixmapwid); + gtk_widget_show (pixmapwid); + gtk_widget_show (button); - /* clist preview of palettes */ - clist_scrolledwindow = gtk_scrolled_window_new (NULL, NULL); + /* clist preview of palettes */ + scrolledwindow = gtk_scrolled_window_new (NULL, NULL); palette->clist = palette_list = gtk_clist_new (3); - gtk_object_set_data (GTK_OBJECT (palette_dialog), "palette_list", palette_list); - gtk_clist_set_row_height(GTK_CLIST(palette_list),SM_PREVIEW_HEIGHT+2); - gtk_signal_connect(GTK_OBJECT(palette->clist), "select_row", - GTK_SIGNAL_FUNC(palette_list_item_update), - (gpointer) palette); - if(vert) + gtk_clist_set_row_height (GTK_CLIST (palette_list), SM_PREVIEW_HEIGHT + 2); + gtk_signal_connect (GTK_OBJECT (palette->clist), "select_row", + GTK_SIGNAL_FUNC (palette_list_item_update), + (gpointer) palette); + if (vert) { gtk_widget_set_usize (palette_list, 203, 90); - gtk_notebook_append_page(GTK_NOTEBOOK(hbox3), - vbox4, - gtk_label_new("Palette")); - gtk_notebook_append_page(GTK_NOTEBOOK(hbox3), - clist_scrolledwindow, - gtk_label_new("Select")); + gtk_notebook_append_page (GTK_NOTEBOOK (hbox), vbox, + gtk_label_new (_("Palette"))); + gtk_notebook_append_page (GTK_NOTEBOOK (hbox), scrolledwindow, + gtk_label_new (_("Select"))); gtk_widget_show (palette_list); } else { - gtk_container_add (GTK_CONTAINER (hbox3), clist_scrolledwindow); + gtk_container_add (GTK_CONTAINER (hbox), scrolledwindow); gtk_widget_set_usize (palette_list, 203, -1); gtk_widget_show (palette_list); } - gtk_clist_set_column_title(GTK_CLIST(palette_list), 0, _("Palette")); - gtk_clist_set_column_title(GTK_CLIST(palette_list), 1, _("Ncols")); - gtk_clist_set_column_title(GTK_CLIST(palette_list), 2, _("Name")); - gtk_clist_column_titles_show(GTK_CLIST(palette_list)); + gtk_clist_set_column_title (GTK_CLIST (palette_list), 0, _("Palette")); + gtk_clist_set_column_title (GTK_CLIST (palette_list), 1, _("Ncols")); + gtk_clist_set_column_title (GTK_CLIST (palette_list), 2, _("Name")); + gtk_clist_column_titles_show (GTK_CLIST (palette_list)); - gtk_container_add (GTK_CONTAINER (clist_scrolledwindow), GTK_WIDGET(palette->clist)); + gtk_container_add (GTK_CONTAINER (scrolledwindow), palette->clist); - gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (clist_scrolledwindow), + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow), GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS); - if(!vert) - { - gtk_clist_set_selection_mode(GTK_CLIST(palette_list),GTK_SELECTION_EXTENDED); - } + if (!vert) + gtk_clist_set_selection_mode (GTK_CLIST (palette_list), + GTK_SELECTION_EXTENDED); + + gtk_widget_show (scrolledwindow); - gtk_widget_show(clist_scrolledwindow); - - gtk_container_set_border_width (GTK_CONTAINER (palette_list), 4); gtk_clist_set_column_width (GTK_CLIST (palette_list), 0, SM_PREVIEW_WIDTH+2); gtk_clist_column_titles_show (GTK_CLIST (palette_list)); - if(!vert) + if (!vert) { - frame1 = gtk_frame_new (_("Palette Ops")); - gtk_object_set_data (GTK_OBJECT (palette_dialog), "frame1", frame1); - gtk_widget_show (frame1); - gtk_box_pack_end (GTK_BOX (hbox3), frame1, FALSE, FALSE, 7); - - vbuttonbox2 = gtk_vbutton_box_new (); - gtk_object_set_data (GTK_OBJECT (palette_dialog), "vbuttonbox2", vbuttonbox2); - gtk_widget_show (vbuttonbox2); - gtk_container_add (GTK_CONTAINER (frame1), vbuttonbox2); - gtk_container_set_border_width (GTK_CONTAINER (vbuttonbox2), 6); - gtk_button_box_set_layout (GTK_BUTTON_BOX (vbuttonbox2), GTK_BUTTONBOX_SPREAD); - gtk_button_box_set_spacing (GTK_BUTTON_BOX (vbuttonbox2), 0); - gtk_button_box_set_child_size (GTK_BUTTON_BOX (vbuttonbox2), 44, 22); - gtk_button_box_set_child_ipadding (GTK_BUTTON_BOX (vbuttonbox2), 17, 0); + frame = gtk_frame_new (_("Palette Ops")); + gtk_box_pack_end (GTK_BOX (hbox), frame, FALSE, FALSE, 0); + gtk_widget_show (frame); + + vbox = gtk_vbox_new (FALSE, 2); + gtk_container_set_border_width (GTK_CONTAINER (vbox), 4); + gtk_container_add (GTK_CONTAINER (frame), vbox); + gtk_widget_show (vbox); - new_palette = gtk_button_new_with_label (_("New")); - GTK_WIDGET_UNSET_FLAGS (new_palette, GTK_RECEIVES_DEFAULT); - gtk_signal_connect (GTK_OBJECT (new_palette), "clicked", + button = gtk_button_new_with_label (_("New")); + GTK_WIDGET_UNSET_FLAGS (button, GTK_RECEIVES_DEFAULT); + gtk_misc_set_padding (GTK_MISC (GTK_BIN (button)->child), 2, 0); + gtk_signal_connect (GTK_OBJECT (button), "clicked", (GtkSignalFunc) palette_new_entries_callback, (gpointer) palette); - gtk_object_set_data (GTK_OBJECT (palette_dialog), "new_palette", new_palette); - gtk_widget_show (new_palette); - gtk_container_add (GTK_CONTAINER (vbuttonbox2), new_palette); - - delete_palette = gtk_button_new_with_label (_("Delete")); - GTK_WIDGET_UNSET_FLAGS (delete_palette, GTK_RECEIVES_DEFAULT); - gtk_signal_connect (GTK_OBJECT (delete_palette), "clicked", + gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0); + gtk_widget_show (button); + + button = gtk_button_new_with_label (_("Delete")); + GTK_WIDGET_UNSET_FLAGS (button, GTK_RECEIVES_DEFAULT); + gtk_misc_set_padding (GTK_MISC (GTK_BIN (button)->child), 2, 0); + gtk_signal_connect (GTK_OBJECT (button), "clicked", (GtkSignalFunc) palette_delete_entries_callback, (gpointer) palette); - gtk_widget_show (delete_palette); - gtk_container_add (GTK_CONTAINER (vbuttonbox2), delete_palette); + gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0); + gtk_widget_show (button); - save_palettes = gtk_button_new_with_label (_("Save")); - GTK_WIDGET_UNSET_FLAGS (save_palettes, GTK_RECEIVES_DEFAULT); - gtk_signal_connect (GTK_OBJECT (save_palettes), "clicked", - (GtkSignalFunc) palette_save_palettes_callback, - (gpointer) NULL); - gtk_widget_show (save_palettes); - gtk_container_add (GTK_CONTAINER (vbuttonbox2), save_palettes); - - import_palette = gtk_button_new_with_label (_("Import")); - GTK_WIDGET_UNSET_FLAGS (import_palette, GTK_RECEIVES_DEFAULT); - gtk_signal_connect (GTK_OBJECT (import_palette), "clicked", + button = gtk_button_new_with_label (_("Import")); + GTK_WIDGET_UNSET_FLAGS (button, GTK_RECEIVES_DEFAULT); + gtk_misc_set_padding (GTK_MISC (GTK_BIN (button)->child), 2, 0); + gtk_signal_connect (GTK_OBJECT (button), "clicked", (GtkSignalFunc) palette_import_dialog_callback, (gpointer) palette); - gtk_widget_show (import_palette); - gtk_container_add (GTK_CONTAINER (vbuttonbox2), import_palette); - - merge_palette = gtk_button_new_with_label (_("Merge")); - GTK_WIDGET_UNSET_FLAGS (merge_palette, GTK_RECEIVES_DEFAULT); - gtk_signal_connect (GTK_OBJECT (merge_palette), "clicked", + gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0); + gtk_widget_show (button); + + button = gtk_button_new_with_label (_("Merge")); + GTK_WIDGET_UNSET_FLAGS (button, GTK_RECEIVES_DEFAULT); + gtk_misc_set_padding (GTK_MISC (GTK_BIN (button)->child), 2, 0); + gtk_signal_connect (GTK_OBJECT (button), "clicked", (GtkSignalFunc) palette_merge_dialog_callback, (gpointer) palette); - gtk_widget_show (merge_palette); - gtk_container_add (GTK_CONTAINER (vbuttonbox2), merge_palette); + gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0); + gtk_widget_show (button); } - dialog_action_area3 = GTK_DIALOG (palette_dialog)->action_area; - gtk_object_set_data (GTK_OBJECT (palette_dialog), "dialog_action_area3", dialog_action_area3); - gtk_widget_show (dialog_action_area3); - gtk_container_set_border_width (GTK_CONTAINER (dialog_action_area3), 2); - - alignment2 = gtk_alignment_new (0.5, 0.5, 1, 1); - gtk_object_set_data (GTK_OBJECT (palette_dialog), "alignment2", alignment2); - gtk_widget_show (alignment2); - gtk_box_pack_start (GTK_BOX (dialog_action_area3), alignment2, TRUE, TRUE, 0); - - hbox5 = gtk_hbox_new (FALSE, 0); - gtk_container_add (GTK_CONTAINER (alignment2), hbox5); - gtk_widget_show (hbox5); - - hbuttonbox3 = gtk_hbutton_box_new (); - gtk_object_set_data (GTK_OBJECT (palette_dialog), "hbuttonbox3", hbuttonbox3); - gtk_widget_show (hbuttonbox3); - gtk_box_pack_end (GTK_BOX(hbox5), hbuttonbox3, FALSE, FALSE, 0); - gtk_button_box_set_spacing (GTK_BUTTON_BOX (hbuttonbox3), 4); - gtk_signal_connect (GTK_OBJECT (palette->shell), "delete_event", - GTK_SIGNAL_FUNC (palette_dialog_delete_callback), - palette); - - close_button = gtk_button_new_with_label (_("Close")); - GTK_WIDGET_SET_FLAGS (close_button, GTK_CAN_DEFAULT); - gtk_window_set_default (GTK_WINDOW (palette->shell), close_button); - gtk_signal_connect(GTK_OBJECT(close_button), "clicked", - GTK_SIGNAL_FUNC(palette_close_callback), (gpointer)palette); - - if(!vert) + if (!vert) { - refresh_button = gtk_button_new_with_label (_("Refresh")); - gtk_signal_connect(GTK_OBJECT(refresh_button), "clicked", - GTK_SIGNAL_FUNC(palette_refresh_callback), (gpointer)palette); + horz_action_items[0].user_data = palette; + horz_action_items[1].user_data = palette; + horz_action_items[2].user_data = palette; + build_action_area (GTK_DIALOG (palette->shell), horz_action_items, 3, 2); } else { - refresh_button = gtk_button_new_with_label (_("Edit")); - gtk_signal_connect(GTK_OBJECT(refresh_button), "clicked", - GTK_SIGNAL_FUNC(palette_edit_palette_callback), (gpointer)palette); + vert_action_items[0].user_data = palette; + vert_action_items[1].user_data = palette; + build_action_area (GTK_DIALOG (palette->shell), vert_action_items, 2, 1); } - GTK_WIDGET_SET_FLAGS (refresh_button, GTK_CAN_DEFAULT); - gtk_container_add (GTK_CONTAINER (hbuttonbox3), refresh_button); - gtk_widget_show (refresh_button); - gtk_container_add (GTK_CONTAINER (hbuttonbox3), close_button); - gtk_widget_show (close_button); - - gtk_widget_realize(palette->shell); - palette->gc = gdk_gc_new(palette->shell->window); + palette->gc = gdk_gc_new (palette->shell->window); - colormap = gtk_widget_get_colormap(palette->clist); + palette_popup_menu (palette); - palette_popup_menu(palette); - return palette; } static void -import_dialog_select_grad_callback (GtkWidget *w, - gpointer client_data) +import_dialog_select_grad_callback (GtkWidget *widget, + gpointer data) { /* Popup grad edit box .... */ - grad_create_gradient_editor(); + grad_create_gradient_editor (); } static void -import_dialog_close_callback (GtkWidget *w, - gpointer client_data) +import_dialog_close_callback (GtkWidget *widget, + gpointer data) { - gtk_widget_destroy(import_dialog->dialog); - g_free(import_dialog); + gtk_widget_destroy (import_dialog->dialog); + g_free (import_dialog); import_dialog = NULL; } static void -import_palette_create_from_grad(gchar *name,PaletteP palette) +import_palette_create_from_grad (gchar *name, + PaletteDialog *palette) { PaletteEntriesP entries; + if(curr_gradient) { /* Add names to entry */ @@ -2297,7 +2259,7 @@ import_palette_create_from_grad(gchar *name,PaletteP palette) gint sample_sz; gint loop; - entries = palette_create_entries(palette,name); + entries = palette_create_entries (palette, name); sample_sz = (gint)import_dialog->sample->value; dx = 1.0/ (sample_sz - 1); @@ -2310,73 +2272,77 @@ import_palette_create_from_grad(gchar *name,PaletteP palette) g = g * 255.0; b = b * 255.0; cur_x += dx; - palette_add_entry (palette->entries, _("Untitled"), (gint)r, (gint)g, (gint)b); + palette_add_entry (palette->entries, _("Untitled"), + (gint) r, (gint) g, (gint) b); } - palette_update_small_preview(palette); - redraw_palette(palette); + palette_update_small_preview (palette); + redraw_palette (palette); /* Update other selectors on screen */ - palette_select_clist_insert_all(entries); - palette_select2_clist_insert_all(entries); - palette_scroll_clist_to_current(palette); + palette_select_clist_insert_all (entries); + palette_select2_clist_insert_all (entries); + palette_scroll_clist_to_current (palette); } } static void -import_dialog_import_callback (GtkWidget *w, - gpointer client_data) +import_dialog_import_callback (GtkWidget *widget, + gpointer data) { - PaletteP palette; - palette = client_data; - if(import_dialog) + PaletteDialog *palette; + + palette = data; + if (import_dialog) { guchar *pname; - pname = gtk_entry_get_text(GTK_ENTRY(import_dialog->entry)); - if(!pname || strlen(pname) == 0) - pname = g_strdup("tmp"); + pname = gtk_entry_get_text (GTK_ENTRY (import_dialog->entry)); + if (!pname || strlen (pname) == 0) + pname = g_strdup ("tmp"); else - pname = g_strdup(pname); - switch(import_dialog->import_type) + pname = g_strdup (pname); + switch (import_dialog->import_type) { case GRAD_IMPORT: - import_palette_create_from_grad(pname,palette); + import_palette_create_from_grad (pname, palette); break; case IMAGE_IMPORT: - import_palette_create_from_image(import_dialog->gimage,pname,palette); + import_palette_create_from_image (import_dialog->gimage, + pname, palette); break; default: break; } - import_dialog_close_callback(NULL,NULL); + import_dialog_close_callback (NULL, NULL); } } static gint -import_dialog_delete_callback (GtkWidget *w, - GdkEvent *e, - gpointer client_data) +import_dialog_delete_callback (GtkWidget *widget, + GdkEvent *event, + gpointer data) { - import_dialog_close_callback(w,client_data); + import_dialog_close_callback (widget, data); + return TRUE; } static void -palette_merge_entries_callback (GtkWidget *w, - gpointer client_data, - gpointer call_data) +palette_merge_entries_callback (GtkWidget *widget, + gpointer data, + gpointer call_data) { - PaletteP palette; + PaletteDialog *palette; PaletteEntriesP p_entries; PaletteEntriesP new_entries; GList *sel_list; - new_entries = palette_create_entries(client_data,call_data); + new_entries = palette_create_entries (data, call_data); - palette = (PaletteP)client_data; + palette = (PaletteDialog *) data; - sel_list = GTK_CLIST(palette->clist)->selection; + sel_list = GTK_CLIST (palette->clist)->selection; - if(sel_list) + if (sel_list) { while (sel_list) { @@ -2385,15 +2351,15 @@ palette_merge_entries_callback (GtkWidget *w, row = GPOINTER_TO_INT (sel_list->data); p_entries = - (PaletteEntriesP)gtk_clist_get_row_data(GTK_CLIST(palette->clist),row); + (PaletteEntriesP)gtk_clist_get_row_data (GTK_CLIST (palette->clist), row); - /* Go through each palette and merge the colours */ + /* Go through each palette and merge the colors */ cols = p_entries->colors; - while(cols) + while (cols) { PaletteEntryP entry = cols->data; palette_add_entry (new_entries, - g_strdup(entry->name), + g_strdup (entry->name), entry->color[0], entry->color[1], entry->color[2]); @@ -2403,51 +2369,51 @@ palette_merge_entries_callback (GtkWidget *w, } } - palette_update_small_preview(palette); - redraw_palette(palette); - gtk_clist_unselect_all(GTK_CLIST(palette->clist)); + palette_update_small_preview (palette); + redraw_palette (palette); + gtk_clist_unselect_all (GTK_CLIST (palette->clist)); /* Update other selectors on screen */ - palette_select_clist_insert_all(new_entries); - palette_select2_clist_insert_all(new_entries); - palette_scroll_clist_to_current(palette); + palette_select_clist_insert_all (new_entries); + palette_select2_clist_insert_all (new_entries); + palette_scroll_clist_to_current (palette); } static void -palette_merge_dialog_callback (GtkWidget *w, - gpointer client_data) +palette_merge_dialog_callback (GtkWidget *widget, + gpointer data) { gtk_widget_show (query_string_box (_("Merge Palette"), _("Enter a name for merged palette"), NULL, NULL, NULL, palette_merge_entries_callback, - client_data)); + data)); } static void -palette_import_dialog_callback (GtkWidget *w, - gpointer client_data) +palette_import_dialog_callback (GtkWidget *widget, + gpointer data) { - if(!import_dialog) + if (!import_dialog) { - import_dialog = palette_import_dialog((PaletteP)client_data); - gtk_widget_show(import_dialog->dialog); + import_dialog = palette_import_dialog ((PaletteDialog *) data); + gtk_widget_show (import_dialog->dialog); } else { - gdk_window_raise(import_dialog->dialog->window); + gdk_window_raise (import_dialog->dialog->window); } } static void -palette_import_fill_grad_preview(GtkWidget *preview, - gradient_t *gradient) +palette_import_fill_grad_preview (GtkWidget *preview, + gradient_t *gradient) { guchar buffer[3*IMPORT_PREVIEW_WIDTH]; gint loop; guchar *p = buffer; - double dx, cur_x; - double r, g, b, a; + gdouble dx, cur_x; + gdouble r, g, b, a; extern void grad_get_color_at(double, double *, double *, double *, double *); gradient_t *last_grad; @@ -2474,45 +2440,51 @@ palette_import_fill_grad_preview(GtkWidget *preview, } -void import_palette_grad_update(gradient_t *grad) +void +import_palette_grad_update (gradient_t *grad) { - if(import_dialog && import_dialog->import_type == GRAD_IMPORT) + if (import_dialog && import_dialog->import_type == GRAD_IMPORT) { /* redraw gradient */ - palette_import_fill_grad_preview(import_dialog->preview,grad); + palette_import_fill_grad_preview (import_dialog->preview, grad); gtk_entry_set_text (GTK_ENTRY (import_dialog->entry), grad->name); } } static void -import_grad_callback(GtkWidget *widget, gpointer data) +import_grad_callback (GtkWidget *widget, + gpointer data) { - if(import_dialog) + if (import_dialog) { import_dialog->import_type = GRAD_IMPORT; - if(import_dialog->image_list) + if (import_dialog->image_list) { - gtk_widget_hide(import_dialog->image_list); - gtk_widget_destroy(import_dialog->image_list); + gtk_widget_hide (import_dialog->image_list); + gtk_widget_destroy (import_dialog->image_list); import_dialog->image_list = NULL; } - gtk_widget_show(import_dialog->select); - palette_import_fill_grad_preview(import_dialog->preview,curr_gradient); + gtk_widget_show (import_dialog->select); + palette_import_fill_grad_preview (import_dialog->preview, curr_gradient); gtk_entry_set_text (GTK_ENTRY (import_dialog->entry), curr_gradient->name); - gtk_widget_set_sensitive(import_dialog->threshold_scale,FALSE); - gtk_widget_set_sensitive(import_dialog->threshold_text,FALSE); + gtk_widget_set_sensitive (import_dialog->threshold_scale, FALSE); + gtk_widget_set_sensitive (import_dialog->threshold_text, FALSE); } } static void -gimlist_cb(gpointer im, gpointer data){ - GSList** l=(GSList**)data; - *l=g_slist_prepend(*l, im); +gimlist_cb (gpointer im, + gpointer data) +{ + GSList** l; + + l = (GSList**) data; + *l = g_slist_prepend (*l, im); } static void -import_image_update_image_preview(GimpImage *gimage) +import_image_update_image_preview (GimpImage *gimage) { TempBuf * preview_buf; gchar *src, *buf; @@ -2537,16 +2509,16 @@ import_image_update_image_preview(GimpImage *gimage) /* Min size is 2 */ - preview_buf = gimp_image_construct_composite_preview(gimage, - MAX(pwidth, 2), - MAX(pheight, 2)); - - gtk_preview_size(GTK_PREVIEW(import_dialog->preview), - preview_buf->width, - preview_buf->height); + preview_buf = gimp_image_construct_composite_preview (gimage, + MAX (pwidth, 2), + MAX (pheight, 2)); + + gtk_preview_size (GTK_PREVIEW (import_dialog->preview), + preview_buf->width, + preview_buf->height); buf = g_new (gchar, IMPORT_PREVIEW_WIDTH * 3); - src = (gchar *)temp_buf_data (preview_buf); + src = (gchar *) temp_buf_data (preview_buf); has_alpha = (preview_buf->bytes == 2 || preview_buf->bytes == 4); for (y = 0; y height ; y++) { @@ -2565,52 +2537,55 @@ import_image_update_image_preview(GimpImage *gimage) buf[x*3+1] = src[x*stride+1]; buf[x*3+2] = src[x*stride+2]; } - gtk_preview_draw_row (GTK_PREVIEW (import_dialog->preview), (guchar *)buf, 0, y, preview_buf->width); + gtk_preview_draw_row (GTK_PREVIEW (import_dialog->preview), + (guchar *)buf, 0, y, preview_buf->width); src += preview_buf->width * preview_buf->bytes; } - g_free(buf); - temp_buf_free(preview_buf); + g_free (buf); + temp_buf_free (preview_buf); - gtk_widget_hide(import_dialog->preview); - gtk_widget_draw(import_dialog->preview, NULL); - gtk_widget_show(import_dialog->preview); + gtk_widget_hide (import_dialog->preview); + gtk_widget_draw (import_dialog->preview, NULL); + gtk_widget_show (import_dialog->preview); } static void -import_image_sel_callback(GtkWidget *widget, gpointer data) +import_image_sel_callback (GtkWidget *widget, + gpointer data) { GimpImage *gimage; gchar *lab; - gimage = GIMP_IMAGE(data); - import_image_update_image_preview(gimage); + gimage = GIMP_IMAGE (data); + import_image_update_image_preview (gimage); - lab = g_strdup_printf("%s-%d", - g_basename(gimage_filename(import_dialog->gimage)), - pdb_image_to_id (import_dialog->gimage)); + lab = g_strdup_printf ("%s-%d", + g_basename (gimage_filename (import_dialog->gimage)), + pdb_image_to_id (import_dialog->gimage)); - gtk_entry_set_text (GTK_ENTRY (import_dialog->entry),lab); + gtk_entry_set_text (GTK_ENTRY (import_dialog->entry), lab); } static void -import_image_menu_add(GimpImage *gimage) +import_image_menu_add (GimpImage *gimage) { GtkWidget *menuitem; - gchar *lab = g_strdup_printf("%s-%d", - g_basename(gimage_filename(gimage)), - pdb_image_to_id (gimage)); - menuitem = gtk_menu_item_new_with_label(lab); + gchar *lab = g_strdup_printf ("%s-%d", + g_basename (gimage_filename (gimage)), + pdb_image_to_id (gimage)); + menuitem = gtk_menu_item_new_with_label (lab); gtk_widget_show (menuitem); - gtk_signal_connect(GTK_OBJECT(menuitem), "activate", - (GtkSignalFunc) import_image_sel_callback, - gimage); + gtk_signal_connect (GTK_OBJECT (menuitem), "activate", + (GtkSignalFunc) import_image_sel_callback, + gimage); gtk_menu_append (GTK_MENU (import_dialog->optionmenu1_menu), menuitem); } /* Last Param gives us control over what goes in the menu on a delete oper */ static void -import_image_menu_activate(gint redo,GimpImage * del_image) +import_image_menu_activate (gint redo, + GimpImage *del_image) { GSList *list=NULL; gint num_images; @@ -2620,19 +2595,19 @@ import_image_menu_activate(gint redo,GimpImage * del_image) gint count = 0; gchar *lab; - if(import_dialog) + if (import_dialog) { - if(import_dialog->import_type == IMAGE_IMPORT) + if (import_dialog->import_type == IMAGE_IMPORT) { - if(!redo) + if (!redo) return; else { - if(import_dialog->image_list) + if (import_dialog->image_list) { last_img = import_dialog->gimage; - gtk_widget_hide(import_dialog->image_list); - gtk_widget_destroy(import_dialog->image_list); + gtk_widget_hide (import_dialog->image_list); + gtk_widget_destroy (import_dialog->image_list); import_dialog->image_list = NULL; } } @@ -2640,325 +2615,321 @@ import_image_menu_activate(gint redo,GimpImage * del_image) import_dialog->import_type = IMAGE_IMPORT; /* Get list of images */ - gimage_foreach(gimlist_cb, &list); + gimage_foreach (gimlist_cb, &list); num_images = g_slist_length (list); if (num_images) { - int i; + gint i; GtkWidget *optionmenu1; GtkWidget *optionmenu1_menu; import_dialog->image_list = optionmenu1 = gtk_option_menu_new (); - gtk_widget_set_usize (optionmenu1,IMPORT_PREVIEW_WIDTH,-1); + gtk_widget_set_usize (optionmenu1, IMPORT_PREVIEW_WIDTH, -1); import_dialog->optionmenu1_menu = optionmenu1_menu = gtk_menu_new (); for (i = 0; i < num_images; i++, list = g_slist_next (list)) { - if(GIMP_IMAGE(list->data) != del_image) + if (GIMP_IMAGE (list->data) != del_image) { - if(first_img == NULL) - first_img = GIMP_IMAGE(list->data); - import_image_menu_add(GIMP_IMAGE(list->data)); - if(last_img == GIMP_IMAGE(list->data)) + if (first_img == NULL) + first_img = GIMP_IMAGE (list->data); + import_image_menu_add (GIMP_IMAGE (list->data)); + if (last_img == GIMP_IMAGE (list->data)) act_num = count; else count++; } } - gtk_option_menu_set_menu (GTK_OPTION_MENU (optionmenu1), optionmenu1_menu); - gtk_widget_hide(import_dialog->select); - gtk_container_add(GTK_CONTAINER(import_dialog->select_area),optionmenu1); + gtk_option_menu_set_menu (GTK_OPTION_MENU (optionmenu1), + optionmenu1_menu); + gtk_widget_hide (import_dialog->select); + gtk_box_pack_start (GTK_BOX (import_dialog->select_area), + optionmenu1, FALSE, FALSE, 0); if(last_img != NULL && last_img != del_image) - import_image_update_image_preview(last_img); - else if(first_img != NULL) - import_image_update_image_preview(first_img); + import_image_update_image_preview (last_img); + else if (first_img != NULL) + import_image_update_image_preview (first_img); gtk_widget_show (optionmenu1); /* reset to last one */ if(redo && act_num >= 0) { - gchar *lab = g_strdup_printf("%s-%d", - g_basename(gimage_filename(import_dialog->gimage)), - pdb_image_to_id (import_dialog->gimage)); + gchar *lab = + g_strdup_printf ("%s-%d", + g_basename (gimage_filename (import_dialog->gimage)), + pdb_image_to_id (import_dialog->gimage)); - gtk_option_menu_set_history(GTK_OPTION_MENU(optionmenu1),act_num); - gtk_entry_set_text (GTK_ENTRY (import_dialog->entry),lab); + gtk_option_menu_set_history (GTK_OPTION_MENU (optionmenu1), act_num); + gtk_entry_set_text (GTK_ENTRY (import_dialog->entry), lab); } } - g_slist_free(list); + g_slist_free (list); - lab = g_strdup_printf("%s-%d", - g_basename(gimage_filename(import_dialog->gimage)), - pdb_image_to_id (import_dialog->gimage)); + lab = + g_strdup_printf ("%s-%d", + g_basename (gimage_filename (import_dialog->gimage)), + pdb_image_to_id (import_dialog->gimage)); - gtk_entry_set_text (GTK_ENTRY (import_dialog->entry),lab); + gtk_entry_set_text (GTK_ENTRY (import_dialog->entry), lab); } } static void -import_image_callback(GtkWidget *widget, gpointer data) +import_image_callback (GtkWidget *widget, + gpointer data) { - import_image_menu_activate(FALSE,NULL); - gtk_widget_set_sensitive(import_dialog->threshold_scale,TRUE); - gtk_widget_set_sensitive(import_dialog->threshold_text,TRUE); + import_image_menu_activate (FALSE, NULL); + gtk_widget_set_sensitive (import_dialog->threshold_scale, TRUE); + gtk_widget_set_sensitive (import_dialog->threshold_text, TRUE); } static gint -image_count() +image_count () { GSList *list=NULL; gint num_images = 0; - gimage_foreach(gimlist_cb, &list); + gimage_foreach (gimlist_cb, &list); num_images = g_slist_length (list); - g_slist_free(list); + g_slist_free (list); - return (num_images); + return num_images; } -static ImportDialogP -palette_import_dialog(PaletteP palette) +static ImportDialog * +palette_import_dialog (PaletteDialog *palette) { - GtkWidget *dialog1; - GtkWidget *dialog_vbox1; - GtkWidget *hbox2; - GtkWidget *import_frame; - GtkWidget *vbox2; - GtkWidget *table1; - GtkWidget *steps; - GtkWidget *import_name; - GtkWidget *import_type; - GtkWidget *spinbutton2; - GtkWidget *entry1; - GtkWidget *optionmenu1; - GtkWidget *optionmenu1_menu; + GtkWidget *dialog; + GtkWidget *hbox; + GtkWidget *frame; + GtkWidget *vbox; + GtkWidget *table; + GtkWidget *label; + GtkWidget *spinbutton; + GtkWidget *button; + GtkWidget *entry; + GtkWidget *optionmenu; + GtkWidget *optionmenu_menu; GtkWidget *menuitem; - GtkWidget *preview_frame; - GtkWidget *vbox1; - GtkWidget *image1; - GtkWidget *select; - GtkWidget *dialog_action_area1; - GtkWidget *hbox1; - GtkWidget *hscale1; - GtkWidget *import; - GtkWidget *close; - - import_dialog = g_malloc(sizeof(struct _ImportDialog)); - import_dialog->image_list = NULL; - import_dialog->gimage = NULL; + GtkWidget *image; + GtkWidget *hscale; - import_dialog->dialog = dialog1 = gtk_dialog_new (); - gtk_window_set_title (GTK_WINDOW (dialog1), _("Import Palette")); - gtk_window_set_policy (GTK_WINDOW (dialog1), TRUE, TRUE, FALSE); + static ActionAreaItem action_items[] = + { + { N_("Import"), import_dialog_import_callback, NULL, NULL }, + { N_("Close"), import_dialog_close_callback, NULL, NULL } + }; - dialog_vbox1 = GTK_DIALOG (dialog1)->vbox; - gtk_widget_show (dialog_vbox1); - - hbox2 = gtk_hbox_new (FALSE, 0); - gtk_widget_show (hbox2); - gtk_box_pack_start (GTK_BOX (dialog_vbox1), hbox2, FALSE, FALSE, 0); - - import_frame = gtk_frame_new (_("Import")); - gtk_widget_show (import_frame); - gtk_box_pack_start (GTK_BOX (hbox2), import_frame, TRUE, TRUE, 0); - - vbox2 = gtk_vbox_new (FALSE, 0); - gtk_widget_show (vbox2); - gtk_container_add (GTK_CONTAINER (import_frame), vbox2); - - table1 = gtk_table_new (4, 2, FALSE); - gtk_widget_show (table1); - gtk_box_pack_start (GTK_BOX (vbox2), table1, TRUE, TRUE, 0); - - steps = gtk_label_new (_("Sample Size:")); - gtk_widget_show (steps); - gtk_table_attach (GTK_TABLE (table1), steps, 0, 1, 2, 3, - GTK_EXPAND | GTK_FILL, GTK_EXPAND, 0, 0); - gtk_label_set_justify (GTK_LABEL (steps), GTK_JUSTIFY_LEFT); - - import_dialog->threshold_text = - steps = gtk_label_new (_("Interval:")); - gtk_widget_show (steps); - gtk_table_attach (GTK_TABLE (table1), steps, 0, 1, 3, 4, - GTK_EXPAND | GTK_FILL, GTK_EXPAND, 0, 0); - gtk_label_set_justify (GTK_LABEL (steps), GTK_JUSTIFY_LEFT); - gtk_widget_set_sensitive(steps,FALSE); + import_dialog = g_new (ImportDialog, 1); + import_dialog->image_list = NULL; + import_dialog->gimage = NULL; - import_name = gtk_label_new (_("Name:")); - gtk_widget_show (import_name); - gtk_table_attach (GTK_TABLE (table1), import_name, 0, 1, 0, 1, - GTK_EXPAND | GTK_FILL, GTK_EXPAND, 0, 0); - gtk_label_set_justify (GTK_LABEL (import_name), GTK_JUSTIFY_LEFT); + import_dialog->dialog = dialog = gtk_dialog_new (); + gtk_window_set_wmclass (GTK_WINDOW (dialog), "import_palette", "Gimp"); + gtk_window_set_title (GTK_WINDOW (dialog), _("Import Palette")); - import_type = gtk_label_new (_("Source:")); - gtk_widget_show (import_type); - gtk_table_attach (GTK_TABLE (table1), import_type, 0, 1, 1, 2, - GTK_EXPAND | GTK_FILL, GTK_EXPAND, 0, 0); - gtk_label_set_justify (GTK_LABEL (import_type), GTK_JUSTIFY_LEFT); + /* Handle the wm delete event */ + gtk_signal_connect (GTK_OBJECT (dialog), "delete_event", + GTK_SIGNAL_FUNC (import_dialog_delete_callback), + (gpointer)palette); - import_dialog->sample = GTK_ADJUSTMENT(gtk_adjustment_new (256, 2, 10000, 1, 10, 10)); - spinbutton2 = gtk_spin_button_new (import_dialog->sample, 1, 0); - gtk_widget_show (spinbutton2); - gtk_table_attach (GTK_TABLE (table1), spinbutton2, 1, 2, 2, 3, + /* The main hbox */ + hbox = gtk_hbox_new (FALSE, 4); + gtk_container_set_border_width (GTK_CONTAINER (hbox), 4); + gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), hbox); + gtk_widget_show (hbox); + + /* The "Import" frame */ + frame = gtk_frame_new (_("Import")); + gtk_box_pack_start (GTK_BOX (hbox), frame, TRUE, TRUE, 0); + gtk_widget_show (frame); + + vbox = gtk_vbox_new (FALSE, 2); + gtk_container_set_border_width (GTK_CONTAINER (vbox), 2); + gtk_container_add (GTK_CONTAINER (frame), vbox); + gtk_widget_show (vbox); + + table = gtk_table_new (4, 2, FALSE); + gtk_table_set_col_spacing (GTK_TABLE (table), 0, 4); + gtk_table_set_row_spacings (GTK_TABLE (table), 2); + gtk_box_pack_start (GTK_BOX (vbox), table, FALSE, FALSE, 0); + gtk_widget_show (table); + + /* The source's name */ + label = gtk_label_new (_("Name:")); + gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5); + gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1, GTK_EXPAND | GTK_FILL, GTK_EXPAND, 0, 0); - - import_dialog->threshold_scale = - hscale1 = - gtk_hscale_new (import_dialog->threshold = - GTK_ADJUSTMENT (gtk_adjustment_new (1, 1, 128, 1, 1, 1))); - gtk_scale_set_value_pos (GTK_SCALE (hscale1), GTK_POS_TOP); - gtk_scale_set_digits (GTK_SCALE (hscale1), 0); - gtk_widget_show (hscale1); - gtk_table_attach (GTK_TABLE (table1), hscale1, 1, 2, 3, 4, + gtk_widget_show (label); + + entry = import_dialog->entry = gtk_entry_new (); + gtk_table_attach_defaults (GTK_TABLE (table), entry, 1, 2, 0, 1); + gtk_entry_set_text (GTK_ENTRY (entry), + curr_gradient ? curr_gradient->name : _("new_import")); + gtk_widget_show (entry); + + /* The source type */ + label = gtk_label_new (_("Source:")); + gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5); + gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2, GTK_EXPAND | GTK_FILL, GTK_EXPAND, 0, 0); - gtk_widget_set_sensitive(hscale1,FALSE); - - import_dialog->entry = entry1 = gtk_entry_new (); - gtk_widget_show (entry1); - gtk_table_attach (GTK_TABLE (table1), entry1, 1, 2, 0, 1, - GTK_FILL, 0, 0, 0); -/* gtk_widget_set_usize (entry1, 100, -1); */ - gtk_entry_set_text (GTK_ENTRY (entry1), (curr_gradient)?curr_gradient->name:_("new_import")); - - import_dialog->type_option = optionmenu1 = gtk_option_menu_new (); - gtk_widget_show (optionmenu1); - gtk_table_attach (GTK_TABLE (table1), optionmenu1, 1, 2, 1, 2, - GTK_FILL, 0, 0, 0); - optionmenu1_menu = gtk_menu_new (); - import_dialog->image_menu_item_gradient = - menuitem = gtk_menu_item_new_with_label (_("Gradient")); + gtk_widget_show (label); + + optionmenu = import_dialog->type_option = gtk_option_menu_new (); + optionmenu_menu = gtk_menu_new (); + gtk_table_attach_defaults (GTK_TABLE (table), optionmenu, 1, 2, 1, 2); + menuitem = import_dialog->image_menu_item_gradient = + gtk_menu_item_new_with_label (_("Gradient")); + gtk_signal_connect (GTK_OBJECT (menuitem), "activate", + (GtkSignalFunc) import_grad_callback, + NULL); + gtk_menu_append (GTK_MENU (optionmenu_menu), menuitem); gtk_widget_show (menuitem); - gtk_signal_connect(GTK_OBJECT(menuitem), "activate", - (GtkSignalFunc) import_grad_callback, - NULL); - gtk_menu_append (GTK_MENU (optionmenu1_menu), menuitem); - import_dialog->image_menu_item_image = menuitem = gtk_menu_item_new_with_label ("Image"); - gtk_widget_show (menuitem); - gtk_signal_connect(GTK_OBJECT(menuitem), "activate", - (GtkSignalFunc) import_image_callback, - (gpointer)import_dialog); - gtk_menu_append (GTK_MENU (optionmenu1_menu), menuitem); - - gtk_option_menu_set_menu (GTK_OPTION_MENU (optionmenu1), optionmenu1_menu); - gtk_widget_set_sensitive(menuitem,image_count() > 0); - - preview_frame = gtk_frame_new (_("Preview")); - gtk_widget_show (preview_frame); - gtk_box_pack_start (GTK_BOX (hbox2), preview_frame, TRUE, TRUE, 0); - import_dialog->select_area = vbox1 = gtk_vbox_new (FALSE, 0); - gtk_widget_show (vbox1); - gtk_container_add (GTK_CONTAINER (preview_frame), vbox1); + menuitem = import_dialog->image_menu_item_image = + gtk_menu_item_new_with_label ("Image"); + gtk_signal_connect (GTK_OBJECT (menuitem), "activate", + (GtkSignalFunc) import_image_callback, + (gpointer) import_dialog); + gtk_menu_append (GTK_MENU (optionmenu_menu), menuitem); + gtk_widget_show (menuitem); - import_dialog->preview = image1 = gtk_preview_new (GTK_PREVIEW_COLOR); - gtk_preview_set_dither (GTK_PREVIEW (image1), - GDK_RGB_DITHER_MAX); - gtk_preview_size (GTK_PREVIEW (image1), IMPORT_PREVIEW_WIDTH, IMPORT_PREVIEW_HEIGHT); - gtk_widget_show (image1); - gtk_widget_set_usize (image1,IMPORT_PREVIEW_WIDTH, IMPORT_PREVIEW_HEIGHT); - gtk_box_pack_start (GTK_BOX (vbox1), image1, FALSE, FALSE, 0); - - import_dialog->select = select = gtk_button_new_with_label (_("select")); - gtk_signal_connect(GTK_OBJECT(select), "clicked", - GTK_SIGNAL_FUNC(import_dialog_select_grad_callback),(gpointer)image1); - gtk_widget_show (select); - gtk_box_pack_start (GTK_BOX (vbox1), select, FALSE, FALSE, 0); - - dialog_action_area1 = GTK_DIALOG (dialog1)->action_area; - gtk_container_set_border_width (GTK_CONTAINER (dialog_action_area1), 2); - gtk_widget_show (dialog_action_area1); - - hbox1 = gtk_hbox_new (FALSE, 0); - gtk_widget_show (hbox1); - gtk_box_pack_start (GTK_BOX (dialog_action_area1), hbox1, TRUE, TRUE, 0); - - import = gtk_button_new_with_label (_("import")); - gtk_widget_show (import); - gtk_signal_connect(GTK_OBJECT(import), "clicked", - GTK_SIGNAL_FUNC(import_dialog_import_callback),(gpointer)palette); - gtk_container_set_border_width (GTK_CONTAINER (import), 4); - gtk_box_pack_end (GTK_BOX (hbox1), import, FALSE, FALSE, 0); - - close = gtk_button_new_with_label (_("close")); - gtk_signal_connect(GTK_OBJECT(close), "clicked", - GTK_SIGNAL_FUNC(import_dialog_close_callback),(gpointer)NULL); - gtk_widget_show (close); - gtk_box_pack_start (GTK_BOX (hbox1), close, FALSE, FALSE, 0); - GTK_WIDGET_SET_FLAGS (close, GTK_CAN_DEFAULT); - gtk_widget_grab_default (close); - - gtk_signal_connect (GTK_OBJECT (dialog1), "delete_event", - GTK_SIGNAL_FUNC (import_dialog_delete_callback), - (gpointer)palette); + gtk_option_menu_set_menu (GTK_OPTION_MENU (optionmenu), optionmenu_menu); + gtk_widget_set_sensitive (menuitem, image_count() > 0); + gtk_widget_show (optionmenu); - /* Fill with the selected gradient */ - palette_import_fill_grad_preview(image1,curr_gradient); + /* The sample size */ + label = gtk_label_new (_("Sample Size:")); + gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5); + gtk_table_attach (GTK_TABLE (table), label, 0, 1, 2, 3, + GTK_EXPAND | GTK_FILL, GTK_EXPAND, 0, 0); + gtk_widget_show (label); + + import_dialog->sample = + GTK_ADJUSTMENT(gtk_adjustment_new (256, 2, 10000, 1, 10, 10)); + spinbutton = gtk_spin_button_new (import_dialog->sample, 1, 0); + gtk_table_attach_defaults (GTK_TABLE (table), spinbutton, 1, 2, 2, 3); + gtk_widget_show (spinbutton); + + /* The interval */ + label = import_dialog->threshold_text = gtk_label_new (_("Interval:")); + gtk_misc_set_alignment (GTK_MISC (label), 1.0, 1.0); + gtk_table_attach (GTK_TABLE (table), label, 0, 1, 3, 4, + GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0); + gtk_widget_set_sensitive(label, FALSE); + gtk_widget_show (label); + + import_dialog->threshold = + GTK_ADJUSTMENT (gtk_adjustment_new (1, 1, 128, 1, 1, 1)); + hscale = import_dialog->threshold_scale = + gtk_hscale_new (import_dialog->threshold); + gtk_scale_set_value_pos (GTK_SCALE (hscale), GTK_POS_TOP); + gtk_scale_set_digits (GTK_SCALE (hscale), 0); + gtk_table_attach_defaults (GTK_TABLE (table), hscale, 1, 2, 3, 4); + gtk_widget_set_sensitive (hscale, FALSE); + gtk_widget_show (hscale); + + /* The preview frame */ + frame = gtk_frame_new (_("Preview")); + gtk_box_pack_start (GTK_BOX (hbox), frame, TRUE, TRUE, 0); + gtk_widget_show (frame); + + vbox = import_dialog->select_area = gtk_vbox_new (FALSE, 2); + gtk_container_set_border_width (GTK_CONTAINER (vbox), 2); + gtk_container_add (GTK_CONTAINER (frame), vbox); + gtk_widget_show (vbox); + + image = import_dialog->preview = gtk_preview_new (GTK_PREVIEW_COLOR); + gtk_preview_set_dither (GTK_PREVIEW (image), GDK_RGB_DITHER_MAX); + gtk_preview_size (GTK_PREVIEW (image), + IMPORT_PREVIEW_WIDTH, IMPORT_PREVIEW_HEIGHT); + gtk_widget_set_usize (image, IMPORT_PREVIEW_WIDTH, IMPORT_PREVIEW_HEIGHT); + gtk_box_pack_start (GTK_BOX (vbox), image, FALSE, FALSE, 0); + gtk_widget_show (image); + + button = import_dialog->select = gtk_button_new_with_label (_("Select")); + GTK_WIDGET_UNSET_FLAGS (button, GTK_RECEIVES_DEFAULT); + gtk_signal_connect (GTK_OBJECT (button), "clicked", + GTK_SIGNAL_FUNC (import_dialog_select_grad_callback), + (gpointer) image); + gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0); + gtk_widget_show (button); + + /* The action area */ + action_items[0].user_data = palette; + action_items[1].user_data = palette; + build_action_area (GTK_DIALOG (dialog), action_items, 2, 1); + + /* Fill with the selected gradient */ + palette_import_fill_grad_preview (image, curr_gradient); import_dialog->import_type = GRAD_IMPORT; return import_dialog; } - /* Stuff to keep dialog uptodate */ void -palette_import_image_new(GimpImage * gimage) +palette_import_image_new (GimpImage * gimage) { - if(!import_dialog) + if (!import_dialog) return; - if(!GTK_WIDGET_IS_SENSITIVE(import_dialog->image_menu_item_image)) + if (!GTK_WIDGET_IS_SENSITIVE (import_dialog->image_menu_item_image)) { - gtk_widget_set_sensitive(import_dialog->image_menu_item_image,TRUE); + gtk_widget_set_sensitive (import_dialog->image_menu_item_image, TRUE); return; } /* Now fill in the names if image menu shown */ - if(import_dialog->import_type == IMAGE_IMPORT) + if (import_dialog->import_type == IMAGE_IMPORT) { - import_image_menu_activate(TRUE,NULL); + import_image_menu_activate (TRUE, NULL); } } void -palette_import_image_destroyed(GimpImage* gimage) +palette_import_image_destroyed (GimpImage* gimage) { /* Now fill in the names if image menu shown */ - if(!import_dialog) + if (!import_dialog) return; - if(image_count() <= 1) + if (image_count() <= 1) { /* Back to gradient type */ - gtk_option_menu_set_history(GTK_OPTION_MENU(import_dialog->type_option),0); - import_grad_callback(NULL,NULL); - if(import_dialog->image_menu_item_image) - gtk_widget_set_sensitive(import_dialog->image_menu_item_image,FALSE); + gtk_option_menu_set_history (GTK_OPTION_MENU (import_dialog->type_option), 0); + import_grad_callback (NULL, NULL); + if (import_dialog->image_menu_item_image) + gtk_widget_set_sensitive (import_dialog->image_menu_item_image, FALSE); return; } - if(import_dialog->import_type == IMAGE_IMPORT) + if (import_dialog->import_type == IMAGE_IMPORT) { - import_image_menu_activate(TRUE,gimage); + import_image_menu_activate (TRUE, gimage); } } void -palette_import_image_renamed(GimpImage* gimage) +palette_import_image_renamed (GimpImage* gimage) { /* Now fill in the names if image menu shown */ if(import_dialog && import_dialog->import_type == IMAGE_IMPORT) { - import_image_menu_activate(TRUE,NULL); + import_image_menu_activate (TRUE, NULL); } } -struct _img_colours { +typedef struct _ImgColors ImgColors; + +struct _ImgColors +{ guint count; guint r_adj; guint g_adj; @@ -2968,153 +2939,162 @@ struct _img_colours { guchar b; }; -typedef struct _img_colours ImgColours, *ImgColoursP; -static int count_colour_entries = 0; +static gint count_color_entries = 0; static void -create_storted_list(gpointer key,gpointer value,gpointer user_data) +create_storted_list (gpointer key, + gpointer value, + gpointer user_data) { - GSList **sorted_list = (GSList**)user_data; - ImgColoursP colour_tab = (ImgColoursP)value; + GSList **sorted_list = (GSList**) user_data; + ImgColors *color_tab = (ImgColors *) value; - *sorted_list = g_slist_prepend(*sorted_list,colour_tab); + *sorted_list = g_slist_prepend (*sorted_list, color_tab); } static void -create_image_palette(gpointer data,gpointer user_data) +create_image_palette (gpointer data, + gpointer user_data) { - PaletteP palette = (PaletteP)user_data; - ImgColoursP colour_tab = (ImgColoursP)data; + PaletteDialog *palette = (PaletteDialog *) user_data; + ImgColors *color_tab = (ImgColors *) data; gint sample_sz; gchar *lab; - sample_sz = (gint)import_dialog->sample->value; + sample_sz = (gint) import_dialog->sample->value; - if(palette->entries->n_colors >= sample_sz) + if (palette->entries->n_colors >= sample_sz) return; - lab = g_strdup_printf("%s (occurs %u)",_("Untitled"),colour_tab->count); + lab = g_strdup_printf ("%s (occurs %u)", _("Untitled"), color_tab->count); - /* Adjust the colours to the mean of the the sample */ + /* Adjust the colors to the mean of the the sample */ palette_add_entry (palette->entries, lab, - (gint)colour_tab->r + (colour_tab->r_adj/colour_tab->count), - (gint)colour_tab->g + (colour_tab->g_adj/colour_tab->count), - (gint)colour_tab->b + (colour_tab->b_adj/colour_tab->count)); + (gint)color_tab->r + (color_tab->r_adj/color_tab->count), + (gint)color_tab->g + (color_tab->g_adj/color_tab->count), + (gint)color_tab->b + (color_tab->b_adj/color_tab->count)); } static gboolean -colour_print_remove(gpointer key,gpointer value,gpointer user_data) +color_print_remove (gpointer key, + gpointer value, + gpointer user_data) { - g_free(value); + g_free (value); + return TRUE; } static gint -sort_colours (gconstpointer a,gconstpointer b) +sort_colors (gconstpointer a, + gconstpointer b) { - ImgColoursP s1 = (ImgColoursP) a; - ImgColoursP s2 = (ImgColoursP) b; + ImgColors *s1 = (ImgColors *) a; + ImgColors *s2 = (ImgColors *) b; if(s1->count > s2->count) return -1; if(s1->count < s2->count) return 1; + return 0; } static void -import_image_make_palette(GHashTable *h_array,guchar *name, PaletteP palette) +import_image_make_palette (GHashTable *h_array, + guchar *name, + PaletteDialog *palette) { GSList * sorted_list = NULL; PaletteEntriesP entries; - g_hash_table_foreach(h_array,create_storted_list,&sorted_list); - sorted_list = g_slist_sort(sorted_list,sort_colours); + g_hash_table_foreach (h_array, create_storted_list, &sorted_list); + sorted_list = g_slist_sort (sorted_list, sort_colors); - entries = palette_create_entries(palette,name); - g_slist_foreach(sorted_list,create_image_palette,palette); + entries = palette_create_entries (palette, name); + g_slist_foreach (sorted_list, create_image_palette, palette); /* Free up used memory */ /* Note the same structure is on both the hash list and the sorted * list. So only delete it once. */ - g_hash_table_freeze(h_array); - g_hash_table_foreach_remove(h_array,colour_print_remove,NULL); - g_hash_table_thaw(h_array); - g_hash_table_destroy(h_array); - g_slist_free(sorted_list); + g_hash_table_freeze (h_array); + g_hash_table_foreach_remove (h_array, color_print_remove, NULL); + g_hash_table_thaw (h_array); + g_hash_table_destroy (h_array); + g_slist_free (sorted_list); /* Redraw with new palette */ - palette_update_small_preview(palette); - redraw_palette(palette); + palette_update_small_preview (palette); + redraw_palette (palette); /* Update other selectors on screen */ - palette_select_clist_insert_all(entries); - palette_select2_clist_insert_all(entries); - palette_scroll_clist_to_current(palette); + palette_select_clist_insert_all (entries); + palette_select2_clist_insert_all (entries); + palette_scroll_clist_to_current (palette); } static GHashTable * -store_colours(GHashTable *h_array, - guchar * colours, - guchar * colours_real, - gint sample_sz) +store_colors (GHashTable *h_array, + guchar *colors, + guchar *colors_real, + gint sample_sz) { - gpointer found_colour = NULL; - ImgColoursP new_colour; - guint key_colours = colours[0]*256*256+colours[1]*256+colours[2]; + gpointer found_color = NULL; + ImgColors *new_color; + guint key_colors = colors[0]*256*256+colors[1]*256+colors[2]; if(h_array == NULL) { - h_array = g_hash_table_new(g_direct_hash,g_direct_equal); - count_colour_entries = 0; + h_array = g_hash_table_new (g_direct_hash, g_direct_equal); + count_color_entries = 0; } else { - found_colour = g_hash_table_lookup(h_array,(gpointer)key_colours); + found_color = g_hash_table_lookup (h_array, (gpointer) key_colors); } - if(found_colour == NULL) + if (found_color == NULL) { - if(count_colour_entries > MAX_IMAGE_COLOURS) + if (count_color_entries > MAX_IMAGE_COLORS) { /* Don't add any more new ones */ return h_array; } - count_colour_entries++; + count_color_entries++; - new_colour = g_new(ImgColours,1); + new_color = g_new (ImgColors, 1); - new_colour->count = 1; - new_colour->r_adj = 0; - new_colour->g_adj = 0; - new_colour->b_adj = 0; - new_colour->r = colours[0]; - new_colour->g = colours[1]; - new_colour->b = colours[2]; + new_color->count = 1; + new_color->r_adj = 0; + new_color->g_adj = 0; + new_color->b_adj = 0; + new_color->r = colors[0]; + new_color->g = colors[1]; + new_color->b = colors[2]; - g_hash_table_insert(h_array,(gpointer)key_colours,new_colour); + g_hash_table_insert (h_array, (gpointer) key_colors, new_color); } else { - new_colour = (ImgColoursP)found_colour; - if(new_colour->count < (G_MAXINT - 1)) - new_colour->count++; + new_color = (ImgColors *) found_color; + if(new_color->count < (G_MAXINT - 1)) + new_color->count++; /* Now do the adjustments ...*/ - new_colour->r_adj += (colours_real[0] - colours[0]); - new_colour->g_adj += (colours_real[1] - colours[1]); - new_colour->b_adj += (colours_real[2] - colours[2]); + new_color->r_adj += (colors_real[0] - colors[0]); + new_color->g_adj += (colors_real[1] - colors[1]); + new_color->b_adj += (colors_real[2] - colors[2]); /* Boundary conditions */ - if(new_colour->r_adj > (G_MAXINT - 255)) - new_colour->r_adj /= new_colour->count; + if(new_color->r_adj > (G_MAXINT - 255)) + new_color->r_adj /= new_color->count; - if(new_colour->g_adj > (G_MAXINT - 255)) - new_colour->g_adj /= new_colour->count; + if(new_color->g_adj > (G_MAXINT - 255)) + new_color->g_adj /= new_color->count; - if(new_colour->b_adj > (G_MAXINT - 255)) - new_colour->b_adj /= new_colour->count; + if(new_color->b_adj > (G_MAXINT - 255)) + new_color->b_adj /= new_color->count; } @@ -3122,26 +3102,28 @@ store_colours(GHashTable *h_array, } static void -import_palette_create_from_image (GImage *gimage,guchar *pname,PaletteP palette) +import_palette_create_from_image (GImage *gimage, + guchar *pname, + PaletteDialog *palette) { PixelRegion imagePR; - unsigned char *image_data; - unsigned char *idata; - guchar rgb[MAX_CHANNELS]; - guchar rgb_real[MAX_CHANNELS]; - int has_alpha, indexed; - int width, height; - int bytes, alpha; - int i, j; + guchar *image_data; + guchar *idata; + guchar rgb[MAX_CHANNELS]; + guchar rgb_real[MAX_CHANNELS]; + gint has_alpha, indexed; + gint width, height; + gint bytes, alpha; + gint i, j; void * pr; - int d_type; + gint d_type; GHashTable *store_array = NULL; gint sample_sz; gint threshold = 1; - sample_sz = (gint)import_dialog->sample->value; + sample_sz = (gint) import_dialog->sample->value; - if(gimage == NULL) + if (gimage == NULL) return; /* Get the image information */ @@ -3153,17 +3135,20 @@ import_palette_create_from_image (GImage *gimage,guchar *pname,PaletteP palette) indexed = d_type == INDEXEDA_GIMAGE || d_type == INDEXED_GIMAGE; width = gimage->width; height = gimage->height; - pixel_region_init (&imagePR, gimage_composite (gimage), 0, 0, width, height, FALSE); + pixel_region_init (&imagePR, gimage_composite (gimage), 0, 0, + width, height, FALSE); alpha = bytes - 1; - threshold = (gint)import_dialog->threshold->value; + threshold = (gint) import_dialog->threshold->value; if(threshold < 1) threshold = 1; /* iterate over the entire image */ - for (pr = pixel_regions_register (1, &imagePR); pr != NULL; pr = pixel_regions_process (pr)) + for (pr = pixel_regions_register (1, &imagePR); + pr != NULL; + pr = pixel_regions_process (pr)) { image_data = imagePR.data; @@ -3175,13 +3160,14 @@ import_palette_create_from_image (GImage *gimage,guchar *pname,PaletteP palette) { /* Get the rgb values for the color */ gimage_get_color (gimage, d_type, rgb, idata); - memcpy(rgb_real,rgb,MAX_CHANNELS); /* Structure copy */ + memcpy (rgb_real, rgb, MAX_CHANNELS); /* Structure copy */ - rgb[0] = (rgb[0]/threshold)*threshold; - rgb[1] = (rgb[1]/threshold)*threshold; - rgb[2] = (rgb[2]/threshold)*threshold; + rgb[0] = (rgb[0] / threshold) * threshold; + rgb[1] = (rgb[1] / threshold) * threshold; + rgb[2] = (rgb[2] / threshold) * threshold; - store_array = store_colours(store_array,rgb,rgb_real,sample_sz); + store_array = + store_colors (store_array, rgb, rgb_real, sample_sz); idata += bytes; } @@ -3191,6 +3177,5 @@ import_palette_create_from_image (GImage *gimage,guchar *pname,PaletteP palette) } /* Make palette from the store_array */ - import_image_make_palette(store_array,pname,palette); + import_image_make_palette (store_array, pname, palette); } - diff --git a/app/info_dialog.c b/app/info_dialog.c index f66c5a4910..696269404a 100644 --- a/app/info_dialog.c +++ b/app/info_dialog.c @@ -43,14 +43,14 @@ info_field_new (InfoDialog *idialog, { GtkWidget *label; InfoField *field; - int row; + gint row; - field = (InfoField *) g_malloc (sizeof (InfoField)); + field = g_new (InfoField, 1); row = idialog->nfields + 1; gtk_table_resize (GTK_TABLE (idialog->info_table), 2, row); - label = gtk_label_new (gettext (title)); + label = gtk_label_new (title); gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5); gtk_table_attach (GTK_TABLE (idialog->info_table), label, 0, 1, row - 1, row, @@ -149,13 +149,13 @@ info_dialog_new (char *title) GtkWidget *vbox; GtkWidget *info_table; - idialog = (InfoDialog *) g_malloc (sizeof (InfoDialog)); + idialog = g_new (InfoDialog, 1); idialog->field_list = NULL; idialog->nfields = 0; shell = gtk_dialog_new (); gtk_window_set_wmclass (GTK_WINDOW (shell), "info_dialog", "Gimp"); - gtk_window_set_title (GTK_WINDOW (shell), gettext(title)); + gtk_window_set_title (GTK_WINDOW (shell), title); session_set_window_geometry (shell, &info_dialog_session_info, FALSE ); gtk_signal_connect (GTK_OBJECT (shell), "delete_event", diff --git a/app/ink.c b/app/ink.c index 59de8a9a9d..eeb0b1ddda 100644 --- a/app/ink.c +++ b/app/ink.c @@ -622,13 +622,7 @@ brush_widget_button_press (GtkWidget *widget, { brush_widget->state = TRUE; - /* theoretically, this should work. Dunno why it doesn't --Michael - gdk_pointer_grab (brush_widget->widget->window, TRUE, - GDK_POINTER_MOTION_HINT_MASK | - GDK_BUTTON1_MOTION_MASK | - GDK_BUTTON_RELEASE_MASK, - NULL, NULL, event->time); - */ + gtk_grab_add (brush_widget->widget); } } @@ -639,9 +633,7 @@ brush_widget_button_release (GtkWidget *widget, { brush_widget->state = FALSE; - /* - gdk_pointer_ungrab (event->time); - */ + gtk_grab_remove (brush_widget->widget); } static void diff --git a/app/paint/gimpink.c b/app/paint/gimpink.c index 59de8a9a9d..eeb0b1ddda 100644 --- a/app/paint/gimpink.c +++ b/app/paint/gimpink.c @@ -622,13 +622,7 @@ brush_widget_button_press (GtkWidget *widget, { brush_widget->state = TRUE; - /* theoretically, this should work. Dunno why it doesn't --Michael - gdk_pointer_grab (brush_widget->widget->window, TRUE, - GDK_POINTER_MOTION_HINT_MASK | - GDK_BUTTON1_MOTION_MASK | - GDK_BUTTON_RELEASE_MASK, - NULL, NULL, event->time); - */ + gtk_grab_add (brush_widget->widget); } } @@ -639,9 +633,7 @@ brush_widget_button_release (GtkWidget *widget, { brush_widget->state = FALSE; - /* - gdk_pointer_ungrab (event->time); - */ + gtk_grab_remove (brush_widget->widget); } static void diff --git a/app/palette.c b/app/palette.c index 26834c670f..f1ecbf5dc7 100644 --- a/app/palette.c +++ b/app/palette.c @@ -39,7 +39,6 @@ #include "datafiles.h" #include "devices.h" #include "errors.h" -#include "general.h" #include "gimprc.h" #include "gradient_header.h" #include "gradient.h" @@ -50,16 +49,16 @@ #include "palette_select.h" #include "dialog_handler.h" +#include "libgimp/gimpintl.h" + #include "pixmaps/zoom_in.xpm" #include "pixmaps/zoom_out.xpm" -#include "libgimp/gimpintl.h" - #define ENTRY_WIDTH 12 #define ENTRY_HEIGHT 10 -#define SPACING 1 -#define COLUMNS 16 -#define ROWS 11 +#define SPACING 1 +#define COLUMNS 16 +#define ROWS 11 #define PREVIEW_WIDTH ((ENTRY_WIDTH * COLUMNS) + (SPACING * (COLUMNS + 1))) #define PREVIEW_HEIGHT ((ENTRY_HEIGHT * ROWS) + (SPACING * (ROWS + 1))) @@ -70,7 +69,7 @@ #define IMPORT_PREVIEW_WIDTH 80 #define IMPORT_PREVIEW_HEIGHT 80 -#define MAX_IMAGE_COLOURS (10000*2) +#define MAX_IMAGE_COLORS (10000*2) typedef enum { @@ -78,8 +77,10 @@ typedef enum IMAGE_IMPORT = 1, } ImportType; +typedef struct _ImportDialog ImportDialog; -struct _ImportDialog { +struct _ImportDialog +{ GtkWidget *dialog; GtkWidget *preview; GtkWidget *entry; @@ -98,11 +99,10 @@ struct _ImportDialog { GimpImage *gimage; }; +typedef struct _PaletteDialog PaletteDialog; -typedef struct _ImportDialog ImportDialog ,*ImportDialogP; -typedef struct _Palette _Palette, *PaletteP; - -struct _Palette { +struct _PaletteDialog +{ GtkWidget *shell; GtkWidget *color_area; GtkWidget *scrolled_window; @@ -121,38 +121,46 @@ struct _Palette { gint freeze_update; }; +/* This one is called from palette_select.c */ +void palette_clist_init(GtkWidget *clist, GtkWidget *shell, GdkGC *gc); + +/* Local function prototypes */ +static void palette_entries_free (PaletteEntriesP); +static void palette_entries_load (char *); +static void palette_entry_free (PaletteEntryP); +static void palette_entries_save (PaletteEntriesP, char *); + +PaletteDialog * create_palette_dialog (gboolean vert); + +static void palette_draw_entries (PaletteDialog *palette, gint row_start, + gint column_highlight); +static void redraw_palette (PaletteDialog *palette); + +static GSList * palette_entries_insert_list (GSList *list, + PaletteEntriesP entries, gint pos); +static void palette_draw_small_preview (GdkGC *gc, PaletteEntriesP p_entry); +static void palette_scroll_clist_to_current (PaletteDialog *palette); +static void palette_update_small_preview (PaletteDialog *palette); +static void palette_scroll_top_left (PaletteDialog *palette); + +static ImportDialog * palette_import_dialog (PaletteDialog *palette); +static void palette_import_dialog_callback (GtkWidget *, gpointer); +static void import_palette_create_from_image (GImage *gimage, + guchar *pname, + PaletteDialog *palette); + +static void palette_merge_dialog_callback (GtkWidget *, gpointer); -static void palette_entries_free (PaletteEntriesP); -static void palette_entries_load (char *); -static void palette_entry_free (PaletteEntryP); -static void palette_entries_save (PaletteEntriesP, char *); - -PaletteP create_palette_dialog (gint vert); -static void palette_draw_entries (PaletteP palette,gint row_start, gint column_highlight); -static void redraw_palette(PaletteP palette); -static GSList * palette_entries_insert_list (GSList *list,PaletteEntriesP entries,gint pos); -void palette_clist_init(GtkWidget *clist, - GtkWidget *shell, - GdkGC *gc); -static void palette_draw_small_preview(GdkGC *gc, PaletteEntriesP p_entry); -static void palette_scroll_clist_to_current(PaletteP palette); -static void palette_update_small_preview(PaletteP palette); -static void palette_scroll_top_left(PaletteP palette); -static ImportDialogP palette_import_dialog(PaletteP palette); -static void palette_import_dialog_callback (GtkWidget *w,gpointer client_data); -static void import_palette_create_from_image (GImage *gimage,guchar *pname,PaletteP palette); -static void palette_merge_dialog_callback (GtkWidget *w,gpointer client_data); - - -GSList *palette_entries_list = NULL; + +GSList *palette_entries_list = NULL; static PaletteEntriesP default_palette_entries = NULL; -static int num_palette_entries = 0; -static unsigned char foreground[3] = { 0, 0, 0 }; -static unsigned char background[3] = { 255, 255, 255 }; -static ImportDialogP import_dialog = NULL; +static gint num_palette_entries = 0; +static guchar foreground[3] = { 0, 0, 0 }; +static guchar background[3] = { 255, 255, 255 }; +static ImportDialog *import_dialog = NULL; -PaletteP top_level_edit_palette = NULL; -PaletteP top_level_palette = NULL; +PaletteDialog *top_level_edit_palette = NULL; +PaletteDialog *top_level_palette = NULL; static void palette_entries_free (PaletteEntriesP entries) @@ -175,14 +183,14 @@ palette_entries_free (PaletteEntriesP entries) } static void -palette_entries_delete (char *filename) +palette_entries_delete (gchar *filename) { if (filename) unlink (filename); } void -palettes_init (int no_data) +palettes_init (gint no_data) { palette_init_palettes (no_data); } @@ -221,9 +229,9 @@ palettes_free () } void -palette_get_foreground (unsigned char *r, - unsigned char *g, - unsigned char *b) +palette_get_foreground (guchar *r, + guchar *g, + guchar *b) { *r = foreground[0]; *g = foreground[1]; @@ -231,9 +239,9 @@ palette_get_foreground (unsigned char *r, } void -palette_get_background (unsigned char *r, - unsigned char *g, - unsigned char *b) +palette_get_background (guchar *r, + guchar *g, + guchar *b) { *r = background[0]; *g = background[1]; @@ -241,11 +249,11 @@ palette_get_background (unsigned char *r, } void -palette_set_foreground (int r, - int g, - int b) +palette_set_foreground (gint r, + gint g, + gint b) { - unsigned char rr, gg, bb; + guchar rr, gg, bb; /* Foreground */ foreground[0] = r; @@ -262,11 +270,11 @@ palette_set_foreground (int r, } void -palette_set_background (int r, - int g, - int b) +palette_set_background (gint r, + gint g, + gint b) { - unsigned char rr, gg, bb; + guchar rr, gg, bb; /* Background */ background[0] = r; @@ -292,8 +300,8 @@ palette_set_default_colors (void) void palette_swap_colors (void) { - unsigned char fg_r, fg_g, fg_b; - unsigned char bg_r, bg_g, bg_b; + guchar fg_r, fg_g, fg_b; + guchar bg_r, bg_g, bg_b; palette_get_foreground (&fg_r, &fg_g, &fg_b); palette_get_background (&bg_r, &bg_g, &bg_b); @@ -303,20 +311,20 @@ palette_swap_colors (void) } void -palette_init_palettes (int no_data) +palette_init_palettes (gint no_data) { - if(!no_data) + if (!no_data) datafiles_read_directories (palette_path, palette_entries_load, 0); } static void -palette_select2_set_text_all(PaletteEntriesP entries) +palette_select2_set_text_all (PaletteEntriesP entries) { gint pos = 0; - char *num_buf; + gchar *num_buf; GSList *plist; - PaletteP pp; + PaletteDialog *pp; PaletteEntriesP p_entries = NULL; gchar * num_copy; @@ -335,38 +343,38 @@ palette_select2_set_text_all(PaletteEntriesP entries) if(p_entries == NULL) return; /* This is actually and error */ - num_buf = g_strdup_printf("%d",p_entries->n_colors);; + num_buf = g_strdup_printf ("%d", p_entries->n_colors);; - num_copy = g_strdup(num_buf); + num_copy = g_strdup (num_buf); pp = top_level_palette; - gtk_clist_set_text(GTK_CLIST(pp->clist),pos,1,num_copy); - redraw_palette(pp); + gtk_clist_set_text (GTK_CLIST (pp->clist), pos, 1, num_copy); + redraw_palette (pp); } static void -palette_select2_refresh_all() +palette_select2_refresh_all () { - PaletteP pp; + PaletteDialog *pp; if(!top_level_palette) return; pp = top_level_palette; - gtk_clist_freeze(GTK_CLIST(pp->clist)); - gtk_clist_clear(GTK_CLIST(pp->clist)); - palette_clist_init(pp->clist,pp->shell,pp->gc); - gtk_clist_thaw(GTK_CLIST(pp->clist)); + gtk_clist_freeze (GTK_CLIST(pp->clist)); + gtk_clist_clear (GTK_CLIST(pp->clist)); + palette_clist_init (pp->clist, pp->shell, pp->gc); + gtk_clist_thaw (GTK_CLIST (pp->clist)); pp->entries = palette_entries_list->data; - redraw_palette(pp); - palette_scroll_clist_to_current(pp); + redraw_palette (pp); + palette_scroll_clist_to_current (pp); } static void -palette_select2_clist_insert_all(PaletteEntriesP p_entries) +palette_select2_clist_insert_all (PaletteEntriesP p_entries) { PaletteEntriesP chk_entries; - PaletteP pp; + PaletteDialog *pp; GSList *plist; gint pos = 0; @@ -382,15 +390,15 @@ palette_select2_clist_insert_all(PaletteEntriesP p_entries) { return; } - if (strcmp(p_entries->name, chk_entries->name) == 0) + if (strcmp (p_entries->name, chk_entries->name) == 0) break; pos++; } pp = top_level_palette; - gtk_clist_freeze(GTK_CLIST(pp->clist)); - palette_insert_clist(pp->clist,pp->shell,pp->gc,p_entries,pos); - gtk_clist_thaw(GTK_CLIST(pp->clist)); + gtk_clist_freeze (GTK_CLIST (pp->clist)); + palette_insert_clist (pp->clist, pp->shell, pp->gc, p_entries, pos); + gtk_clist_thaw (GTK_CLIST (pp->clist)); /* if(gradient_select_dialog) */ /* { */ @@ -398,9 +406,8 @@ palette_select2_clist_insert_all(PaletteEntriesP p_entries) /* } */ } - static void -palette_save_palettes() +palette_save_palettes () { GSList *list; PaletteEntriesP entries; @@ -421,10 +428,10 @@ palette_save_palettes() } static void -palette_save_palettes_callback(GtkWidget *w, - gpointer client_data) +palette_save_palettes_callback (GtkWidget *widget, + gpointer data) { - palette_save_palettes(); + palette_save_palettes (); } static void @@ -444,8 +451,8 @@ palette_free () { if(import_dialog) { - gtk_widget_destroy(import_dialog->dialog); - g_free(import_dialog); + gtk_widget_destroy (import_dialog->dialog); + g_free (import_dialog); import_dialog = NULL; } @@ -459,7 +466,7 @@ palette_free () top_level_edit_palette = NULL; } - if(top_level_palette) + if (top_level_palette) { gdk_gc_destroy (top_level_palette->gc); session_get_window_info (top_level_palette->shell, &palette_session_info); @@ -469,7 +476,7 @@ palette_free () static void palette_entries_save (PaletteEntriesP palette, - char *filename) + gchar *filename) { FILE * fp; GSList * list; @@ -501,20 +508,18 @@ palette_entries_save (PaletteEntriesP palette, fclose (fp); } - - static PaletteEntryP palette_add_entry (PaletteEntriesP entries, - char *name, - int r, - int g, - int b) + gchar *name, + gint r, + gint g, + gint b) { PaletteEntryP entry; if (entries) { - entry = g_malloc (sizeof (_PaletteEntry)); + entry = g_new (_PaletteEntry, 1); entry->color[0] = r; entry->color[1] = g; @@ -537,28 +542,30 @@ palette_add_entry (PaletteEntriesP entries, } static void -palette_change_color (int r, - int g, - int b, - int state) +palette_change_color (gint r, + gint g, + gint b, + gint state) { if (top_level_edit_palette && top_level_edit_palette->entries) { switch (state) { case COLOR_NEW: - top_level_edit_palette->color = palette_add_entry (top_level_edit_palette->entries, _("Untitled"), r, g, b); + top_level_edit_palette->color = + palette_add_entry (top_level_edit_palette->entries, + _("Untitled"), r, g, b); - palette_update_small_preview(top_level_edit_palette); - redraw_palette(top_level_edit_palette); + palette_update_small_preview (top_level_edit_palette); + redraw_palette (top_level_edit_palette); break; case COLOR_UPDATE_NEW: top_level_edit_palette->color->color[0] = r; top_level_edit_palette->color->color[1] = g; top_level_edit_palette->color->color[2] = b; - palette_update_small_preview(top_level_edit_palette); - redraw_palette(top_level_edit_palette); + palette_update_small_preview (top_level_edit_palette); + redraw_palette (top_level_edit_palette); break; default: @@ -573,31 +580,30 @@ palette_change_color (int r, } void -palette_set_active_color (int r, - int g, - int b, - int state) +palette_set_active_color (gint r, + gint g, + gint b, + gint state) { palette_change_color (r, g, b, state); } static void -palette_entries_load (char *filename) +palette_entries_load (gchar *filename) { PaletteEntriesP entries; - char str[512]; - char *tok; - FILE *fp; - int r, g, b; - int linenum; - GSList *list; - gint pos = 0; PaletteEntriesP p_entries = NULL; - + gchar str[512]; + gchar *tok; + FILE *fp; + gint r, g, b; + gint linenum; + GSList *list; + gint pos = 0; r = g = b = 0; - entries = (PaletteEntriesP) g_malloc (sizeof (_PaletteEntries)); + entries = g_new (_PaletteEntries, 1); entries->filename = g_strdup (filename); entries->name = g_strdup (g_basename (filename)); @@ -606,7 +612,6 @@ palette_entries_load (char *filename) entries->pixmap = NULL; /* Open the requested file */ - if (!(fp = fopen (filename, "r"))) { palette_entries_free (entries); @@ -623,9 +628,13 @@ palette_entries_load (char *filename) { /* bad magic, but maybe it has \r\n at the end of lines? */ if (!strcmp (str, "GIMP Palette\r")) - g_message (_("Loading palette %s:\nCorrupt palette: missing magic header\nDoes this file need converting from DOS?"), filename); + g_message (_("Loading palette %s:\n" + "Corrupt palette:\n" + "missing magic header\n" + "Does this file need converting from DOS?"), filename); else - g_message (_("Loading palette %s:\nCorrupt palette: missing magic header"), filename); + g_message (_("Loading palette %s:\n" + "Corrupt palette: missing magic header"), filename); fclose (fp); palette_entries_free (entries); return; @@ -649,26 +658,26 @@ palette_entries_load (char *filename) if (str[0] != '#') { tok = strtok (str, " \t"); - if (tok) { + if (tok) r = atoi (tok); - } else { - g_message (_("Loading palette %s (line %d):\nMissing RED component"), filename, linenum); + else + g_message (_("Loading palette %s (line %d):\n" + "Missing RED component"), filename, linenum); /* maybe we should just abort? */ - } tok = strtok (NULL, " \t"); - if (tok) { + if (tok) g = atoi (tok); - } else { - g_message (_("Loading palette %s (line %d):\nMissing GREEN component"), filename, linenum); - } - + else + g_message (_("Loading palette %s (line %d):\n" + "Missing GREEN component"), filename, linenum); + tok = strtok (NULL, " \t"); - if (tok) { + if (tok) b = atoi (tok); - } else { - g_message (_("Loading palette %s (line %d):\nMissing BLUE component"), filename, linenum); - } + else + g_message (_("Loading palette %s (line %d):\n" + "Missing BLUE component"), filename, linenum); /* optional name */ tok = strtok (NULL, "\n"); @@ -676,11 +685,12 @@ palette_entries_load (char *filename) if (r < 0 || r > 255 || g < 0 || g > 255 || b < 0 || b > 255) - g_message (_("Loading palette %s (line %d):\nRGB value out of range"), filename, linenum); + g_message (_("Loading palette %s (line %d):\n" + "RGB value out of range"), filename, linenum); palette_add_entry (entries, tok, r, g, b); - } /* if */ - } /* while */ + } + } /* Clean up */ @@ -699,52 +709,53 @@ palette_entries_load (char *filename) { p_entries = default_palette_entries; } - if (strcmp(p_entries->name, entries->name) > 0) + if (strcmp (p_entries->name, entries->name) > 0) break; pos++; } - palette_entries_list = palette_entries_insert_list (palette_entries_list, entries,pos); + palette_entries_list = palette_entries_insert_list (palette_entries_list, entries, pos); /* Check if the current palette is the default one */ - if (strcmp(default_palette, g_basename(filename)) == 0) + if (strcmp (default_palette, g_basename (filename)) == 0) default_palette_entries = entries; } -static PaletteP -new_top_palette(gint vert) +static PaletteDialog * +new_top_palette (gboolean vert) { - PaletteP p; + PaletteDialog *p; - p = create_palette_dialog(vert); - palette_clist_init(p->clist,p->shell,p->gc); + p = create_palette_dialog (vert); + palette_clist_init (p->clist, p->shell, p->gc); - return(p); + return p; } void -palette_select_palette_init(void) +palette_select_palette_init (void) { /* Load them if they are not already loaded */ if(top_level_edit_palette == NULL) { - top_level_edit_palette = new_top_palette(FALSE); + top_level_edit_palette = new_top_palette (FALSE); } } void -palette_create(void) +palette_create (void) { - if(top_level_palette == NULL) + if (top_level_palette == NULL) { - top_level_palette = new_top_palette(TRUE); -/* top_level_palette = palette_new_selection(_("Palette"),NULL); */ - session_set_window_geometry (top_level_palette->shell, &palette_session_info, TRUE); + top_level_palette = new_top_palette (TRUE); + /* top_level_palette = palette_new_selection(_("Palette"),NULL); */ + session_set_window_geometry (top_level_palette->shell, + &palette_session_info, TRUE); /* register this one only */ - dialog_register(top_level_palette->shell); + dialog_register (top_level_palette->shell); - gtk_widget_show(top_level_palette->shell); - palette_scroll_clist_to_current(top_level_palette); + gtk_widget_show (top_level_palette->shell); + palette_scroll_clist_to_current (top_level_palette); } else { @@ -754,68 +765,68 @@ palette_create(void) } else { - gdk_window_raise(top_level_palette->shell->window); + gdk_window_raise (top_level_palette->shell->window); } } } void -palette_create_edit(PaletteEntriesP entries) +palette_create_edit (PaletteEntriesP entries) { - PaletteP p; + PaletteDialog *p; - if(top_level_edit_palette == NULL) + if (top_level_edit_palette == NULL) { + p = new_top_palette (FALSE); - p = new_top_palette(FALSE); - gtk_widget_show(p->shell); palette_draw_entries(p,-1,-1); top_level_edit_palette = p; - } else { if (!GTK_WIDGET_VISIBLE (top_level_edit_palette->shell)) { gtk_widget_show (top_level_edit_palette->shell); - palette_draw_entries(top_level_edit_palette,-1,-1); + palette_draw_entries (top_level_edit_palette, -1, -1); } else { - gdk_window_raise(top_level_edit_palette->shell->window); + gdk_window_raise (top_level_edit_palette->shell->window); } } if(entries != NULL) { top_level_edit_palette->entries = entries; - gtk_clist_unselect_all(GTK_CLIST(top_level_edit_palette->clist)); - palette_scroll_clist_to_current(top_level_edit_palette); + gtk_clist_unselect_all (GTK_CLIST (top_level_edit_palette->clist)); + palette_scroll_clist_to_current (top_level_edit_palette); } } static GSList * -palette_entries_insert_list (GSList * list, - PaletteEntriesP entries, - gint pos) +palette_entries_insert_list (GSList *list, + PaletteEntriesP entries, + gint pos) { GSList *ret_list; + /* add it to the list */ num_palette_entries++; - ret_list = g_slist_insert(list, (void *) entries,pos); + ret_list = g_slist_insert (list, (void *) entries, pos); return ret_list; } -static void palette_update_small_preview(PaletteP palette) +static void +palette_update_small_preview (PaletteDialog *palette) { GSList *list; gint pos = 0; PaletteEntriesP p_entries = NULL; - char *num_buf; + gchar *num_buf; list = palette_entries_list; @@ -836,21 +847,21 @@ static void palette_update_small_preview(PaletteP palette) pos++; } - num_buf = g_strdup_printf("%d",p_entries->n_colors); - palette_draw_small_preview(palette->gc,p_entries); - gtk_clist_set_text(GTK_CLIST(palette->clist),pos,1,num_buf); + num_buf = g_strdup_printf ("%d", p_entries->n_colors); + palette_draw_small_preview (palette->gc, p_entries); + gtk_clist_set_text (GTK_CLIST (palette->clist), pos, 1, num_buf); } static void -palette_delete_entry (GtkWidget *w, - gpointer client_data) +palette_delete_entry (GtkWidget *widget, + gpointer data) { PaletteEntryP entry; GSList *tmp_link; - PaletteP palette; + PaletteDialog *palette; gint pos = 0; - palette = client_data; + palette = data; if (palette && palette->entries && palette->color) { entry = palette->color; @@ -883,25 +894,24 @@ palette_delete_entry (GtkWidget *w, if (palette->entries->n_colors == 0) palette->color = palette_add_entry (palette->entries, _("Black"), 0, 0, 0); - palette_update_small_preview(palette); - palette_select_set_text_all(palette->entries); - palette_select2_set_text_all(palette->entries); - redraw_palette(palette); + palette_update_small_preview (palette); + palette_select_set_text_all (palette->entries); + palette_select2_set_text_all (palette->entries); + redraw_palette (palette); } } - static void -palette_new_callback (GtkWidget *w, - gpointer client_data) +palette_new_callback (GtkWidget *widget, + gpointer data) { - PaletteP palette; + PaletteDialog *palette; char *num_buf; GSList *list; gint pos = 0; PaletteEntriesP p_entries = NULL; - palette = client_data; + palette = data; if (palette && palette->entries) { if (active_color == FOREGROUND) @@ -913,7 +923,7 @@ palette_new_callback (GtkWidget *w, palette_add_entry (palette->entries, _("Untitled"), background[0], background[1], background[2]); - redraw_palette(palette); + redraw_palette (palette); list = palette_entries_list; @@ -932,54 +942,53 @@ palette_new_callback (GtkWidget *w, pos++; } - num_buf = g_strdup_printf("%d",p_entries->n_colors);; - palette_draw_small_preview(palette->gc,p_entries); - gtk_clist_set_text(GTK_CLIST(palette->clist),pos,1,num_buf); - palette_select_set_text_all(palette->entries); - palette_select2_set_text_all(palette->entries); + num_buf = g_strdup_printf ("%d", p_entries->n_colors);; + palette_draw_small_preview (palette->gc, p_entries); + gtk_clist_set_text (GTK_CLIST (palette->clist), pos, 1, num_buf); + palette_select_set_text_all (palette->entries); + palette_select2_set_text_all (palette->entries); } } - static PaletteEntriesP -palette_create_entries(gpointer client_data, - gpointer call_data) -{ - char *home; - char *palette_name; - char *local_path; - char *first_token; - char *token; - char *path; +palette_create_entries (gpointer data, + gpointer call_data) +{ + gchar *home; + gchar *palette_name; + gchar *local_path; + gchar *first_token; + gchar *token; + gchar *path; PaletteEntriesP entries = NULL; - PaletteP palette; + PaletteDialog *palette; GSList *list; gint pos = 0; PaletteEntriesP p_entries = NULL; - palette = client_data; + palette = data; palette_name = (char *) call_data; if (palette && palette_name) { - entries = g_malloc (sizeof (_PaletteEntries)); + entries = g_new (_PaletteEntries, 1); if (palette_path) { /* Get the first path specified in the palette path list */ home = g_get_home_dir (); local_path = g_strdup (palette_path); first_token = local_path; - token = xstrsep(&first_token, G_SEARCHPATH_SEPARATOR_S); + token = xstrsep (&first_token, G_SEARCHPATH_SEPARATOR_S); if (token) { if (*token == '~') { if (home) - path = g_strdup_printf("%s%s", home, token + 1); + path = g_strdup_printf ("%s%s", home, token + 1); else /* Just ignore the ~ if no HOME ??? */ - path = g_strdup(token + 1); + path = g_strdup (token + 1); } else { @@ -1022,82 +1031,87 @@ palette_create_entries(gpointer client_data, pos++; } - palette_entries_list = palette_entries_insert_list (palette_entries_list, entries,pos); - - palette_insert_clist(palette->clist,palette->shell,palette->gc,entries,pos); + palette_entries_list = + palette_entries_insert_list (palette_entries_list, entries, pos); + palette_insert_clist (palette->clist, palette->shell, palette->gc, + entries,pos); palette->entries = entries; - palette_save_palettes(); + palette_save_palettes (); } + return entries; } static void -palette_add_entries_callback (GtkWidget *w, - gpointer client_data, - gpointer call_data) +palette_add_entries_callback (GtkWidget *widget, + gpointer data, + gpointer call_data) { PaletteEntriesP entries; - entries = palette_create_entries(client_data,call_data); + + entries = palette_create_entries (data, call_data); /* Update other selectors on screen */ - palette_select_clist_insert_all(entries); - palette_select2_clist_insert_all(entries); - palette_scroll_clist_to_current((PaletteP)client_data); + palette_select_clist_insert_all (entries); + palette_select2_clist_insert_all (entries); + palette_scroll_clist_to_current ((PaletteDialog *) data); } static void -palette_new_entries_callback (GtkWidget *w, - gpointer client_data) +palette_new_entries_callback (GtkWidget *widget, + gpointer data) { gtk_widget_show (query_string_box (_("New Palette"), _("Enter a name for new palette"), NULL, NULL, NULL, - palette_add_entries_callback, client_data)); + palette_add_entries_callback, data)); } static void -redraw_zoom(PaletteP palette) +redraw_zoom (PaletteDialog *palette) { - if(palette->zoom_factor > 4.0) + if (palette->zoom_factor > 4.0) { palette->zoom_factor = 4.0; } - else if(palette->zoom_factor < 0.1) + else if (palette->zoom_factor < 0.1) { palette->zoom_factor = 0.1; } palette->columns = COLUMNS; - redraw_palette(palette); + redraw_palette (palette); - palette_scroll_top_left(palette); + palette_scroll_top_left (palette); } static void -palette_zoomin(GtkWidget *w, - gpointer client_data) +palette_zoomin (GtkWidget *widget, + gpointer data) { - PaletteP palette = client_data; + PaletteDialog *palette = data; + palette->zoom_factor += 0.1; - redraw_zoom(palette); + redraw_zoom (palette); } static void -palette_zoomout (GtkWidget *w, - gpointer client_data) +palette_zoomout (GtkWidget *widget, + gpointer data) { - PaletteP palette = client_data; + PaletteDialog *palette = data; + palette->zoom_factor -= 0.1; - redraw_zoom(palette); + redraw_zoom (palette); } static void -palette_refresh(PaletteP palette) +palette_refresh (PaletteDialog *palette) { - if(palette) + if (palette) { if (default_palette_entries == palette->entries) default_palette_entries = NULL; @@ -1112,50 +1126,50 @@ palette_refresh(PaletteP palette) palette_free_palettes (); /* free palettes, don't save any modified versions */ palette_init_palettes (FALSE); /* reload palettes */ - gtk_clist_freeze(GTK_CLIST(palette->clist)); - gtk_clist_clear(GTK_CLIST(palette->clist)); - palette_clist_init(palette->clist,palette->shell,palette->gc); - gtk_clist_thaw(GTK_CLIST(palette->clist)); + gtk_clist_freeze (GTK_CLIST (palette->clist)); + gtk_clist_clear (GTK_CLIST (palette->clist)); + palette_clist_init (palette->clist, palette->shell, palette->gc); + gtk_clist_thaw (GTK_CLIST (palette->clist)); - if(palette->entries == NULL) + if (palette->entries == NULL) palette->entries = default_palette_entries; if(palette->entries == NULL && palette_entries_list) palette->entries = palette_entries_list->data; - redraw_palette(palette); + redraw_palette (palette); - palette_scroll_clist_to_current(palette); + palette_scroll_clist_to_current (palette); - palette_select_refresh_all(); - palette_select2_refresh_all(); + palette_select_refresh_all (); + palette_select2_refresh_all (); } else { palette_free_palettes (); - palette_init_palettes(FALSE); + palette_init_palettes (FALSE); } - } static void -palette_refresh_callback (GtkWidget *w, - gpointer client_data) +palette_refresh_callback (GtkWidget *widget, + gpointer data) { - palette_refresh(client_data); + palette_refresh (data); } /*****/ static void -palette_draw_small_preview(GdkGC *gc, PaletteEntriesP p_entry) +palette_draw_small_preview(GdkGC *gc, + PaletteEntriesP p_entry) { - guchar rgb_buf[SM_PREVIEW_WIDTH*SM_PREVIEW_HEIGHT*3]; + guchar rgb_buf[SM_PREVIEW_WIDTH * SM_PREVIEW_HEIGHT * 3]; GSList *tmp_link; gint index; PaletteEntryP entry; - + /*fill_clist_prev(p_entry,rgb_buf,48,16,0.0,1.0);*/ - memset(rgb_buf,0x0,SM_PREVIEW_WIDTH*SM_PREVIEW_HEIGHT*3); + memset (rgb_buf, 0x0, sizeof (rgb_buf)); gdk_draw_rgb_image (p_entry->pixmap, gc, @@ -1173,12 +1187,12 @@ palette_draw_small_preview(GdkGC *gc, PaletteEntriesP p_entry) while (tmp_link) { guchar cell[3*3*3]; - int loop; - + gint loop; + entry = tmp_link->data; tmp_link = tmp_link->next; - for(loop = 0; loop < 27 ; loop+=3) + for (loop = 0; loop < 27 ; loop+=3) { cell[0+loop] = entry->color[0]; cell[1+loop] = entry->color[1]; @@ -1203,84 +1217,85 @@ palette_draw_small_preview(GdkGC *gc, PaletteEntriesP p_entry) static void -palette_select_callback (int r, - int g, - int b, - ColorSelectState state, - void *client_data) -{ - PaletteP palette; - unsigned char * color; - GSList *list; +palette_select_callback (gint r, + gint g, + gint b, + ColorSelectState state, + void *data) +{ + PaletteDialog *palette; + guchar *color; + GSList *list; gint pos = 0; PaletteEntriesP p_entries = NULL; - palette = client_data; + palette = data; if (palette && palette->entries) { - switch (state) { - case COLOR_SELECT_UPDATE: - break; - case COLOR_SELECT_OK: - if (palette->color) - { - color = palette->color->color; + switch (state) + { + case COLOR_SELECT_UPDATE: + break; + case COLOR_SELECT_OK: + if (palette->color) + { + color = palette->color->color; - color[0] = r; - color[1] = g; - color[2] = b; + color[0] = r; + color[1] = g; + color[2] = b; - /* Update either foreground or background colors */ - if (active_color == FOREGROUND) - palette_set_foreground (r, g, b); - else if (active_color == BACKGROUND) - palette_set_background (r, g, b); + /* Update either foreground or background colors */ + if (active_color == FOREGROUND) + palette_set_foreground (r, g, b); + else if (active_color == BACKGROUND) + palette_set_background (r, g, b); - palette_draw_entries (palette, - palette->color->position/(palette->columns), - palette->color->position%(palette->columns)); - palette_draw_small_preview(palette->gc,palette->entries); + palette_draw_entries (palette, + palette->color->position/(palette->columns), + palette->color->position%(palette->columns)); + palette_draw_small_preview (palette->gc,palette->entries); - /* Add into the clist */ - - list = palette_entries_list; - - while (list) - { - p_entries = (PaletteEntriesP) list->data; - list = g_slist_next (list); - - /* to make sure we get something! */ - if (p_entries == NULL) + /* Add into the clist */ + list = palette_entries_list; + + while (list) { - p_entries = default_palette_entries; + p_entries = (PaletteEntriesP) list->data; + list = g_slist_next (list); + + /* to make sure we get something! */ + if (p_entries == NULL) + { + p_entries = default_palette_entries; + } + if (p_entries == palette->entries) + break; + pos++; } - if (p_entries == palette->entries) - break; - pos++; - } - gtk_clist_set_text(GTK_CLIST(palette->clist),pos,2,p_entries->name); - palette_select_set_text_all(palette->entries); - palette_select2_set_text_all(palette->entries); - } - /* Fallthrough */ - case COLOR_SELECT_CANCEL: - color_select_hide (palette->color_select); - palette->color_select_active = 0; - } + gtk_clist_set_text (GTK_CLIST (palette->clist), + pos, 2, p_entries->name); + palette_select_set_text_all (palette->entries); + palette_select2_set_text_all (palette->entries); + } + /* Fallthrough */ + case COLOR_SELECT_CANCEL: + color_select_hide (palette->color_select); + palette->color_select_active = 0; + } } } static void -palette_scroll_clist_to_current(PaletteP palette) +palette_scroll_clist_to_current (PaletteDialog *palette) { GSList *list; gint pos = 0; PaletteEntriesP p_entries; - if(palette && palette->entries) + if (palette && palette->entries) { list = palette_entries_list; @@ -1294,40 +1309,39 @@ palette_scroll_clist_to_current(PaletteP palette) pos++; } - gtk_clist_unselect_all(GTK_CLIST(palette->clist)); - gtk_clist_select_row(GTK_CLIST(palette->clist),pos,-1); - gtk_clist_moveto(GTK_CLIST(palette->clist),pos,0,0.0,0.0); + gtk_clist_unselect_all (GTK_CLIST (palette->clist)); + gtk_clist_select_row (GTK_CLIST (palette->clist), pos, -1); + gtk_clist_moveto (GTK_CLIST (palette->clist), pos, 0, 0.0, 0.0); } } static void -palette_delete_entries_callback (GtkWidget *w, - gpointer client_data) +palette_delete_entries_callback (GtkWidget *widget, + gpointer data) { - PaletteP palette; + PaletteDialog *palette; PaletteEntriesP entries; - palette = client_data; + palette = data; if (palette && palette->entries) { entries = palette->entries; if (entries && entries->filename) palette_entries_delete (entries->filename); - palette_entries_list = g_slist_remove(palette_entries_list,entries); + palette_entries_list = g_slist_remove (palette_entries_list, entries); - palette_refresh(palette); + palette_refresh (palette); } } - static void -palette_close_callback (GtkWidget *w, - gpointer client_data) +palette_close_callback (GtkWidget *widget, + gpointer data) { - PaletteP palette; + PaletteDialog *palette; - palette = client_data; + palette = data; if (palette) { if (palette->color_select_active) @@ -1338,8 +1352,8 @@ palette_close_callback (GtkWidget *w, if(import_dialog) { - gtk_widget_destroy(import_dialog->dialog); - g_free(import_dialog); + gtk_widget_destroy (import_dialog->dialog); + g_free (import_dialog); import_dialog = NULL; } @@ -1348,48 +1362,50 @@ palette_close_callback (GtkWidget *w, } } - static gint -palette_dialog_delete_callback (GtkWidget *w, - GdkEvent *e, - gpointer client_data) +palette_dialog_delete_callback (GtkWidget *widget, + GdkEvent *event, + gpointer data) { - palette_close_callback (w, client_data); - + palette_close_callback (widget, data); + return TRUE; } static void -color_name_entry_changed (GtkWidget *widget, gpointer pdata) +color_name_entry_changed (GtkWidget *widget, + gpointer data) { - PaletteP palette; + PaletteDialog *palette; - palette = pdata; - if(palette->color->name) - g_free(palette->color->name); + palette = data; + if (palette->color->name) + g_free (palette->color->name); palette->entries->changed = 1; - palette->color->name = g_strdup(gtk_entry_get_text(GTK_ENTRY (palette->color_name))); + palette->color->name = + g_strdup (gtk_entry_get_text (GTK_ENTRY (palette->color_name))); } static void -palette_edit_callback (GtkWidget * widget, - gpointer client_data) +palette_edit_callback (GtkWidget *widget, + gpointer data) { - PaletteP palette; - unsigned char *color; + PaletteDialog *palette; + guchar *color; - palette = client_data; + palette = data; if (palette && palette->entries && palette->color) { color = palette->color->color; if (!palette->color_select) { - palette->color_select = color_select_new (color[0], color[1], color[2], - palette_select_callback, palette, - FALSE); + palette->color_select = + color_select_new (color[0], color[1], color[2], + palette_select_callback, palette, + FALSE); palette->color_select_active = 1; } else @@ -1400,56 +1416,61 @@ palette_edit_callback (GtkWidget * widget, palette->color_select_active = 1; } - color_select_set_color (palette->color_select, color[0], color[1], color[2], 1); + color_select_set_color (palette->color_select, + color[0], color[1], color[2], 1); } } } static void -palette_popup_menu(PaletteP palette) +palette_popup_menu (PaletteDialog *palette) { GtkWidget *menu; GtkWidget *menu_items; - menu = gtk_menu_new(); - menu_items = gtk_menu_item_new_with_label(_("Edit")); - gtk_menu_append(GTK_MENU (menu), menu_items); - - gtk_signal_connect(GTK_OBJECT(menu_items), "activate", - GTK_SIGNAL_FUNC(palette_edit_callback), (gpointer)palette); - gtk_widget_show(menu_items); - - menu_items = gtk_menu_item_new_with_label(_("New")); - gtk_menu_append(GTK_MENU (menu), menu_items); - gtk_signal_connect(GTK_OBJECT(menu_items), "activate", - GTK_SIGNAL_FUNC(palette_new_callback), (gpointer)palette); - gtk_widget_show(menu_items); - - menu_items = gtk_menu_item_new_with_label(_("Delete")); - gtk_signal_connect(GTK_OBJECT(menu_items), "activate", - GTK_SIGNAL_FUNC(palette_delete_entry), (gpointer)palette); - gtk_menu_append(GTK_MENU (menu), menu_items); - gtk_widget_show(menu_items); + menu = gtk_menu_new (); + menu_items = gtk_menu_item_new_with_label (_("Edit")); + gtk_menu_append (GTK_MENU (menu), menu_items); + + gtk_signal_connect (GTK_OBJECT (menu_items), "activate", + GTK_SIGNAL_FUNC (palette_edit_callback), + (gpointer) palette); + gtk_widget_show (menu_items); + + menu_items = gtk_menu_item_new_with_label (_("New")); + gtk_menu_append (GTK_MENU (menu), menu_items); + gtk_signal_connect (GTK_OBJECT (menu_items), "activate", + GTK_SIGNAL_FUNC (palette_new_callback), + (gpointer) palette); + gtk_widget_show (menu_items); + + menu_items = gtk_menu_item_new_with_label (_("Delete")); + gtk_signal_connect (GTK_OBJECT(menu_items), "activate", + GTK_SIGNAL_FUNC (palette_delete_entry), + (gpointer) palette); + gtk_menu_append (GTK_MENU (menu), menu_items); + gtk_widget_show (menu_items); /* Do something interesting when the menuitem is selected */ /* gtk_signal_connect_object(GTK_OBJECT(menu_items), "activate", */ /* GTK_SIGNAL_FUNC(menuitem_response), (gpointer) g_strdup(buf)); */ - + palette->popup_menu = menu; - palette->popup_small_menu = menu = gtk_menu_new(); - menu_items = gtk_menu_item_new_with_label(_("New")); - gtk_menu_append(GTK_MENU (menu), menu_items); - gtk_signal_connect(GTK_OBJECT(menu_items), "activate", - GTK_SIGNAL_FUNC(palette_new_callback), (gpointer)palette); - gtk_widget_show(menu_items); + palette->popup_small_menu = menu = gtk_menu_new (); + menu_items = gtk_menu_item_new_with_label (_("New")); + gtk_menu_append (GTK_MENU (menu), menu_items); + gtk_signal_connect (GTK_OBJECT (menu_items), "activate", + GTK_SIGNAL_FUNC (palette_new_callback), + (gpointer) palette); + gtk_widget_show (menu_items); } static gint -palette_color_area_events (GtkWidget *widget, - GdkEvent *event, - PaletteP palette) +palette_color_area_events (GtkWidget *widget, + GdkEvent *event, + PaletteDialog *palette) { GdkEventButton *bevent; GSList *tmp_link; @@ -1480,7 +1501,7 @@ palette_color_area_events (GtkWidget *widget, if(palette->color) { palette->freeze_update = TRUE; - palette_draw_entries(palette,-1,-1); + palette_draw_entries (palette, -1, -1); palette->freeze_update = FALSE; } palette->color = tmp_link->data; @@ -1494,16 +1515,18 @@ palette_color_area_events (GtkWidget *widget, else if (active_color == BACKGROUND) palette_set_background (r, g, b); - palette_draw_entries(palette,row,col); + palette_draw_entries (palette, row, col); /* Update the active color name */ - gtk_entry_set_text (GTK_ENTRY (palette->color_name), palette->color->name); + gtk_entry_set_text (GTK_ENTRY (palette->color_name), + palette->color->name); gtk_widget_set_sensitive (palette->color_name, TRUE); /* palette_update_current_entry (palette); */ - if(bevent->button == 3) + if (bevent->button == 3) { /* Popup the edit menu */ gtk_menu_popup (GTK_MENU (palette->popup_menu), NULL, NULL, - NULL, NULL, 3, ((GdkEventButton *)event)->time); + NULL, NULL, 3, + ((GdkEventButton *)event)->time); } } else @@ -1511,95 +1534,96 @@ palette_color_area_events (GtkWidget *widget, if(bevent->button == 3) { /* Popup the small new menu */ - gtk_menu_popup (GTK_MENU (palette->popup_small_menu), NULL, NULL, - NULL, NULL, 3, ((GdkEventButton *)event)->time); + gtk_menu_popup (GTK_MENU (palette->popup_small_menu), + NULL, NULL, + NULL, NULL, 3, + ((GdkEventButton *)event)->time); } } } break; - + default: break; } - + return FALSE; } void -palette_insert_clist(GtkWidget *clist, - GtkWidget *shell, - GdkGC *gc, - PaletteEntriesP p_entries, - gint pos) +palette_insert_clist (GtkWidget *clist, + GtkWidget *shell, + GdkGC *gc, + PaletteEntriesP p_entries, + gint pos) { gchar *string[3]; - + string[0] = NULL; - string[1] = g_strdup_printf("%d",p_entries->n_colors); + string[1] = g_strdup_printf ("%d", p_entries->n_colors); string[2] = p_entries->name; + + gtk_clist_insert (GTK_CLIST (clist), pos, string); + + g_free (string[1]); - gtk_clist_insert(GTK_CLIST(clist),pos,string); - - g_free((void *)string[1]); - - if(p_entries->pixmap == NULL) - p_entries->pixmap = gdk_pixmap_new(shell->window, - SM_PREVIEW_WIDTH, - SM_PREVIEW_HEIGHT, - gtk_widget_get_visual(shell)->depth); + if (p_entries->pixmap == NULL) + p_entries->pixmap = gdk_pixmap_new (shell->window, + SM_PREVIEW_WIDTH, + SM_PREVIEW_HEIGHT, + gtk_widget_get_visual (shell)->depth); - palette_draw_small_preview(gc,p_entries); - gtk_clist_set_pixmap(GTK_CLIST(clist), pos, 0, p_entries->pixmap, NULL); - gtk_clist_set_row_data(GTK_CLIST(clist),pos,(gpointer)p_entries); + palette_draw_small_preview (gc, p_entries); + gtk_clist_set_pixmap (GTK_CLIST (clist), pos, 0, p_entries->pixmap, NULL); + gtk_clist_set_row_data (GTK_CLIST (clist), pos, (gpointer) p_entries); } void -palette_clist_init(GtkWidget *clist, - GtkWidget *shell, - GdkGC *gc) +palette_clist_init (GtkWidget *clist, + GtkWidget *shell, + GdkGC *gc) { GSList *list; PaletteEntriesP p_entries = NULL; gint pos = 0; - + list = palette_entries_list; - + while (list) { - p_entries = (PaletteEntriesP) list->data; list = g_slist_next (list); - + /* to make sure we get something! */ if (p_entries == NULL) { p_entries = default_palette_entries; } - - palette_insert_clist(clist,shell,gc,p_entries,pos); + + palette_insert_clist (clist, shell, gc, p_entries, pos); pos++; } } static int -palette_draw_color_row (unsigned char **colors, - gint ncolors, - gint y, - gint column_highlight, - unsigned char *buffer, - PaletteP palette) -{ - unsigned char *p; - unsigned char bcolor; - int width, height; - int entry_width; - int entry_height; - int vsize; - int vspacing; - int i, j; - GtkWidget *preview; +palette_draw_color_row (guchar **colors, + gint ncolors, + gint y, + gint column_highlight, + guchar *buffer, + PaletteDialog *palette) +{ + guchar *p; + guchar bcolor; + gint width, height; + gint entry_width; + gint entry_height; + gint vsize; + gint vspacing; + gint i, j; + GtkWidget *preview; - if(!palette) + if (!palette) return -1; preview = palette->color_area; @@ -1608,8 +1632,8 @@ palette_draw_color_row (unsigned char **colors, width = preview->requisition.width; height = preview->requisition.height; - entry_width = (ENTRY_WIDTH*palette->zoom_factor); - entry_height = (ENTRY_HEIGHT*palette->zoom_factor); + entry_width = (ENTRY_WIDTH * palette->zoom_factor); + entry_height = (ENTRY_HEIGHT * palette->zoom_factor); if ((y >= 0) && ((y + SPACING) < height)) vspacing = SPACING; @@ -1633,16 +1657,17 @@ palette_draw_color_row (unsigned char **colors, *p++ = bcolor; } - if(column_highlight >= 0) + if (column_highlight >= 0) { guchar *ph = &buffer[3*column_highlight*(entry_width+SPACING)]; - for(j = 0 ; j <= entry_width + SPACING; j++) + for (j = 0 ; j <= entry_width + SPACING; j++) { *ph++ = ~bcolor; *ph++ = ~bcolor; *ph++ = ~bcolor; } - gtk_preview_draw_row (GTK_PREVIEW (preview), buffer, 0, y+entry_height+1, width); + gtk_preview_draw_row (GTK_PREVIEW (preview), buffer, 0, + y + entry_height + 1, width); } gtk_preview_draw_row (GTK_PREVIEW (preview), buffer, 0, y, width); @@ -1695,7 +1720,7 @@ palette_draw_color_row (unsigned char **colors, for (j = 0; j < SPACING; j++) { - if(ncolors == column_highlight) + if (ncolors == column_highlight) { *p++ = ~bcolor; *p++ = ~bcolor; @@ -1713,7 +1738,7 @@ palette_draw_color_row (unsigned char **colors, y += entry_height - vsize; for (i = 0; i < vsize; i++, y++) { - if(column_highlight >= 0) + if (column_highlight >= 0) { guchar *ph = &buffer[3*column_highlight*(entry_width+SPACING)]; *ph++ = ~bcolor; @@ -1735,28 +1760,29 @@ palette_draw_color_row (unsigned char **colors, return y; } - static void -palette_draw_entries (PaletteP palette,gint row_start, gint column_highlight) +palette_draw_entries (PaletteDialog *palette, + gint row_start, + gint column_highlight) { PaletteEntryP entry; - unsigned char *buffer; - unsigned char **colors; + guchar *buffer; + guchar **colors; GSList *tmp_link; - int width, height; - int entry_width; - int entry_height; - int index, y; + gint width, height; + gint entry_width; + gint entry_height; + gint index, y; if (palette && palette->entries) { width = palette->color_area->requisition.width; height = palette->color_area->requisition.height; - entry_width = (ENTRY_WIDTH*palette->zoom_factor); - entry_height = (ENTRY_HEIGHT*palette->zoom_factor); + entry_width = (ENTRY_WIDTH * palette->zoom_factor); + entry_height = (ENTRY_HEIGHT * palette->zoom_factor); - colors = g_malloc (sizeof(unsigned char *) * palette->columns * 3); + colors = g_malloc (sizeof (guchar *) * palette->columns * 3); buffer = g_malloc (width * 3); if(row_start < 0) @@ -1812,7 +1838,7 @@ palette_draw_entries (PaletteP palette,gint row_start, gint column_highlight) } static void -palette_scroll_top_left(PaletteP palette) +palette_scroll_top_left (PaletteDialog *palette) { GtkAdjustment *hadj; GtkAdjustment *vadj; @@ -1820,23 +1846,23 @@ palette_scroll_top_left(PaletteP palette) /* scroll viewport to top left */ if(palette && palette->scrolled_window) { - hadj = gtk_scrolled_window_get_hadjustment(GTK_SCROLLED_WINDOW(palette->scrolled_window)); - vadj = gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(palette->scrolled_window)); + hadj = gtk_scrolled_window_get_hadjustment (GTK_SCROLLED_WINDOW (palette->scrolled_window)); + vadj = gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (palette->scrolled_window)); if(hadj) - gtk_adjustment_set_value(hadj,0.0); + gtk_adjustment_set_value (hadj, 0.0); if(vadj) - gtk_adjustment_set_value(vadj,0.0); + gtk_adjustment_set_value (vadj, 0.0); } } static void -redraw_palette(PaletteP palette) +redraw_palette (PaletteDialog *palette) { + GtkWidget *parent; gint vsize; gint nrows; gint n_entries; - GtkWidget *parent; gint new_pre_width; n_entries = palette->entries->n_colors; @@ -1844,37 +1870,36 @@ redraw_palette(PaletteP palette) if (n_entries % palette->columns) nrows += 1; - vsize = nrows*(SPACING + (gint)(ENTRY_HEIGHT*palette->zoom_factor))+SPACING; + vsize = nrows* (SPACING + (gint)(ENTRY_HEIGHT*palette->zoom_factor)) + SPACING; parent = palette->color_area->parent; - gtk_widget_ref(palette->color_area); - gtk_container_remove(GTK_CONTAINER(parent),palette->color_area); - - new_pre_width = (gint)(ENTRY_WIDTH*palette->zoom_factor); - new_pre_width = (new_pre_width+SPACING)*palette->columns+SPACING; + gtk_widget_ref (palette->color_area); + gtk_container_remove (GTK_CONTAINER (parent), palette->color_area); - gtk_preview_size(GTK_PREVIEW(palette->color_area), - new_pre_width, /*PREVIEW_WIDTH,*/ - vsize); + new_pre_width = (gint) (ENTRY_WIDTH * palette->zoom_factor); + new_pre_width = (new_pre_width + SPACING) * palette->columns + SPACING; - gtk_container_add(GTK_CONTAINER(parent),palette->color_area); - gtk_widget_unref(palette->color_area); + gtk_preview_size (GTK_PREVIEW (palette->color_area), + new_pre_width, /*PREVIEW_WIDTH,*/ + vsize); + gtk_container_add (GTK_CONTAINER (parent), palette->color_area); + gtk_widget_unref (palette->color_area); - palette_draw_entries(palette,-1,-1); + palette_draw_entries (palette, -1, -1); } static void -palette_list_item_update(GtkWidget *widget, - gint row, - gint column, - GdkEventButton *event, - gpointer data) +palette_list_item_update (GtkWidget *widget, + gint row, + gint column, + GdkEventButton *event, + gpointer data) { - PaletteP palette; + PaletteDialog *palette; PaletteEntriesP p_entries; - palette = (PaletteP)data; + palette = (PaletteDialog *) data; if (palette->color_select_active) { @@ -1882,37 +1907,40 @@ palette_list_item_update(GtkWidget *widget, color_select_hide (palette->color_select); } - if(palette->color_select) - color_select_free(palette->color_select); + if (palette->color_select) + color_select_free (palette->color_select); palette->color_select = NULL; p_entries = - (PaletteEntriesP)gtk_clist_get_row_data(GTK_CLIST(palette->clist),row); + (PaletteEntriesP) gtk_clist_get_row_data (GTK_CLIST (palette->clist), row); palette->entries = p_entries; - redraw_palette(palette); + redraw_palette (palette); - palette_scroll_top_left(palette); + palette_scroll_top_left (palette); - /* Stop errors in case no colours are selected */ - gtk_signal_handler_block(GTK_OBJECT (palette->color_name),palette->entry_sig_id); + /* Stop errors in case no colors are selected */ + gtk_signal_handler_block (GTK_OBJECT (palette->color_name), + palette->entry_sig_id); gtk_entry_set_text (GTK_ENTRY (palette->color_name), _("Undefined")); gtk_widget_set_sensitive (palette->color_name, FALSE); - gtk_signal_handler_unblock(GTK_OBJECT (palette->color_name),palette->entry_sig_id); + gtk_signal_handler_unblock (GTK_OBJECT (palette->color_name), + palette->entry_sig_id); } static void -palette_edit_palette_callback (GtkWidget *w, - gpointer client_data) +palette_edit_palette_callback (GtkWidget *widget, + gpointer data) { PaletteEntriesP p_entries = NULL; - PaletteP palette = (PaletteP)client_data; + PaletteDialog *palette; GList *sel_list; - sel_list = GTK_CLIST(palette->clist)->selection; + palette = (PaletteDialog *) data; + sel_list = GTK_CLIST (palette->clist)->selection; - if(sel_list) + if (sel_list) { while (sel_list) { @@ -1921,9 +1949,9 @@ palette_edit_palette_callback (GtkWidget *w, row = GPOINTER_TO_INT (sel_list->data); p_entries = - (PaletteEntriesP)gtk_clist_get_row_data(GTK_CLIST(palette->clist),row); + (PaletteEntriesP)gtk_clist_get_row_data (GTK_CLIST (palette->clist), row); - palette_create_edit(p_entries); + palette_create_edit (p_entries); /* One only */ return; @@ -1931,44 +1959,38 @@ palette_edit_palette_callback (GtkWidget *w, } } - -PaletteP +PaletteDialog * create_palette_dialog (gint vert) { - GtkWidget *palette_dialog; - GtkWidget *dialog_vbox3; - GtkWidget *hbox3; - GtkWidget *hbox4; - GtkWidget *hbox5; - GtkWidget *vbox4; - GtkWidget *palette_scrolledwindow; + PaletteDialog *palette; + GtkWidget *hbox; + GtkWidget *hbox2; + GtkWidget *vbox; + GtkWidget *scrolledwindow; GtkWidget *palette_region; - GtkWidget *color_name; - GtkWidget *alignment1; + GtkWidget *entry; + GtkWidget *alignment; GtkWidget *palette_list; - GtkWidget *frame1; - GtkWidget *vbuttonbox2; - GtkWidget *new_palette; - GtkWidget *delete_palette; - GtkWidget *save_palettes; - GtkWidget *import_palette; - GtkWidget *merge_palette; - GtkWidget *dialog_action_area3; - GtkWidget *alignment2; - GtkWidget *hbuttonbox3; - GtkWidget *close_button; - GtkWidget *refresh_button; - GtkWidget *clist_scrolledwindow; - PaletteP palette; - GdkColormap *colormap; - GtkWidget* button_plus; - GtkWidget* button_minus; - GtkWidget* pixmapwid; - GdkPixmap* pixmap; - GdkBitmap* mask; - GtkStyle* style; + GtkWidget *frame; + GtkWidget *button; + GtkWidget *pixmapwid; + GdkPixmap *pixmap; + GdkBitmap *mask; + GtkStyle *style; - palette = g_malloc (sizeof (_Palette)); + static ActionAreaItem vert_action_items[] = + { + { N_("Edit"), palette_edit_palette_callback, NULL, NULL }, + { N_("Close"), palette_close_callback, NULL, NULL } + }; + static ActionAreaItem horz_action_items[] = + { + { N_("Save"), palette_save_palettes_callback, NULL, NULL }, + { N_("Refresh"), palette_refresh_callback, NULL, NULL }, + { N_("Close"), palette_close_callback, NULL, NULL } + }; + + palette = g_new (PaletteDialog, 1); palette->entries = default_palette_entries; palette->color = NULL; @@ -1978,68 +2000,58 @@ create_palette_dialog (gint vert) palette->columns = COLUMNS; palette->freeze_update = FALSE; - palette->shell = palette_dialog = gtk_dialog_new (); - + palette->shell = gtk_dialog_new (); gtk_window_set_wmclass (GTK_WINDOW (palette->shell), "color_palette", "Gimp"); - if(!vert) - { - gtk_widget_set_usize (palette_dialog, 615, 200); - } - else - { - gtk_widget_set_usize (palette_dialog, 230, 300); - } - - if(!vert) + if (!vert) { - gtk_window_set_title (GTK_WINDOW (palette_dialog), _("Color Palette Edit")); + gtk_widget_set_usize (palette->shell, 615, 200); + gtk_window_set_title (GTK_WINDOW (palette->shell), + _("Color Palette Edit")); } else { - gtk_window_set_title (GTK_WINDOW (palette_dialog), _("Color Palette")); + gtk_widget_set_usize (palette->shell, 230, 300); + gtk_window_set_title (GTK_WINDOW (palette->shell), + _("Color Palette")); } - gtk_window_set_policy (GTK_WINDOW (palette_dialog), TRUE, TRUE, FALSE); - - dialog_vbox3 = GTK_DIALOG (palette_dialog)->vbox; - gtk_object_set_data (GTK_OBJECT (palette_dialog), "dialog_vbox3", dialog_vbox3); - gtk_widget_show (dialog_vbox3); + /* Handle the wm delete event */ + gtk_signal_connect (GTK_OBJECT (palette->shell), "delete_event", + GTK_SIGNAL_FUNC (palette_dialog_delete_callback), + palette); - if(vert) + /* The main container widget */ + if (vert) { - hbox3 = gtk_notebook_new(); - gtk_widget_show (hbox3); - gtk_box_pack_start (GTK_BOX (dialog_vbox3), hbox3, TRUE, TRUE, 0); + hbox = gtk_notebook_new (); + gtk_container_set_border_width (GTK_CONTAINER (hbox), 1); } else { - hbox3 = gtk_hbox_new (FALSE, 0); - gtk_widget_show (hbox3); - gtk_box_pack_start (GTK_BOX (dialog_vbox3), hbox3, TRUE, TRUE, 0); + hbox = gtk_hbox_new (FALSE, 4); + gtk_container_set_border_width (GTK_CONTAINER (hbox), 4); } + gtk_container_add (GTK_CONTAINER (GTK_DIALOG (palette->shell)->vbox), hbox); + gtk_widget_show (hbox); - vbox4 = gtk_vbox_new (FALSE, 0); - gtk_object_set_data (GTK_OBJECT (palette_dialog), "vbox4", vbox4); - gtk_widget_show (vbox4); - if(!vert) + vbox = gtk_vbox_new (FALSE, 2); + if (!vert) { - gtk_box_pack_start (GTK_BOX (hbox3), vbox4, TRUE, TRUE, 0); + gtk_box_pack_start (GTK_BOX (hbox), vbox, TRUE, TRUE, 0); } + gtk_widget_show (vbox); - alignment1 = gtk_alignment_new (0.5, 0.5, 0.0, 0.0); - gtk_object_set_data (GTK_OBJECT (palette_dialog), "alignment1", alignment1); - gtk_widget_show (alignment1); + alignment = gtk_alignment_new (0.5, 0.5, 0.0, 0.0); + gtk_widget_show (alignment); - palette->scrolled_window = - palette_scrolledwindow = gtk_scrolled_window_new (NULL, NULL); - gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (palette_scrolledwindow), + palette->scrolled_window = + scrolledwindow = gtk_scrolled_window_new (NULL, NULL); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); - - gtk_object_set_data (GTK_OBJECT (palette_dialog), "palette_scrolledwindow", palette_scrolledwindow); - gtk_widget_show (palette_scrolledwindow); - gtk_box_pack_start (GTK_BOX (vbox4), palette_scrolledwindow, TRUE, TRUE, 0); + gtk_box_pack_start (GTK_BOX (vbox), scrolledwindow, TRUE, TRUE, 0); + gtk_widget_show (scrolledwindow); palette->color_area = palette_region = gtk_preview_new (GTK_PREVIEW_COLOR); gtk_preview_set_dither (GTK_PREVIEW (palette->color_area), @@ -2052,242 +2064,192 @@ create_palette_dialog (gint vert) palette); gtk_widget_show (palette_region); - gtk_container_add (GTK_CONTAINER (alignment1), palette_region); - gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (palette_scrolledwindow), alignment1); - - hbox4 = gtk_hbox_new (FALSE, 0); - gtk_box_pack_start (GTK_BOX (vbox4), hbox4, FALSE, FALSE, 0); - gtk_widget_show(hbox4); - - palette->color_name = color_name = gtk_entry_new (); - gtk_widget_show (color_name); - gtk_box_pack_start (GTK_BOX (hbox4), color_name, TRUE, TRUE, 0); - gtk_entry_set_text (GTK_ENTRY (color_name), _("Undefined")); - palette->entry_sig_id = gtk_signal_connect (GTK_OBJECT (color_name), "changed", - GTK_SIGNAL_FUNC (color_name_entry_changed), - palette); - - /* + and - buttons */ - style = gtk_widget_get_style(palette_dialog); - gtk_widget_realize(palette_dialog); - - button_plus = gtk_button_new (); - GTK_WIDGET_UNSET_FLAGS (button_plus, GTK_RECEIVES_DEFAULT); - gtk_signal_connect (GTK_OBJECT (button_plus), "clicked", + gtk_container_add (GTK_CONTAINER (alignment), palette_region); + gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolledwindow), + alignment); + + /* The color name entry */ + hbox2 = gtk_hbox_new (FALSE, 2); + gtk_box_pack_start (GTK_BOX (vbox), hbox2, FALSE, FALSE, 0); + gtk_widget_show(hbox2); + + entry = palette->color_name = gtk_entry_new (); + gtk_widget_show (entry); + gtk_box_pack_start (GTK_BOX (hbox2), entry, TRUE, TRUE, 0); + gtk_entry_set_text (GTK_ENTRY (entry), _("Undefined")); + palette->entry_sig_id = + gtk_signal_connect (GTK_OBJECT (entry), "changed", + GTK_SIGNAL_FUNC (color_name_entry_changed), + palette); + + /* + and - buttons */ + gtk_widget_realize (palette->shell); + style = gtk_widget_get_style (palette->shell); + + button = gtk_button_new (); + GTK_WIDGET_UNSET_FLAGS (button, GTK_RECEIVES_DEFAULT); + gtk_signal_connect (GTK_OBJECT (button), "clicked", GTK_SIGNAL_FUNC (palette_zoomin), (gpointer) palette); - gtk_box_pack_start (GTK_BOX (hbox4), button_plus, FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX (hbox2), button, FALSE, FALSE, 0); - button_minus = gtk_button_new (); - GTK_WIDGET_UNSET_FLAGS (button_minus, GTK_RECEIVES_DEFAULT); - gtk_signal_connect (GTK_OBJECT (button_minus), "clicked", - GTK_SIGNAL_FUNC (palette_zoomout), (gpointer) palette); - gtk_box_pack_start (GTK_BOX (hbox4), button_minus, FALSE, FALSE, 0); - - pixmap = gdk_pixmap_create_from_xpm_d(palette_dialog->window, &mask, - &style->bg[GTK_STATE_NORMAL], - zoom_in_xpm); - pixmapwid = gtk_pixmap_new(pixmap, mask); - gtk_container_add (GTK_CONTAINER (button_plus), pixmapwid); + pixmap = gdk_pixmap_create_from_xpm_d (palette->shell->window, &mask, + &style->bg[GTK_STATE_NORMAL], + zoom_in_xpm); + pixmapwid = gtk_pixmap_new (pixmap, mask); + gtk_container_add (GTK_CONTAINER (button), pixmapwid); gtk_widget_show (pixmapwid); + gtk_widget_show (button); - pixmap = gdk_pixmap_create_from_xpm_d(palette_dialog->window, &mask, - &style->bg[GTK_STATE_NORMAL], - zoom_out_xpm); - pixmapwid = gtk_pixmap_new(pixmap, mask); - gtk_container_add (GTK_CONTAINER (button_minus), pixmapwid); - gtk_widget_show (pixmapwid); - - gtk_widget_show (button_plus); - gtk_widget_show (button_minus); + button = gtk_button_new (); + GTK_WIDGET_UNSET_FLAGS (button, GTK_RECEIVES_DEFAULT); + gtk_signal_connect (GTK_OBJECT (button), "clicked", + GTK_SIGNAL_FUNC (palette_zoomout), (gpointer) palette); + gtk_box_pack_start (GTK_BOX (hbox2), button, FALSE, FALSE, 0); + pixmap = gdk_pixmap_create_from_xpm_d (palette->shell->window, &mask, + &style->bg[GTK_STATE_NORMAL], + zoom_out_xpm); + pixmapwid = gtk_pixmap_new (pixmap, mask); + gtk_container_add (GTK_CONTAINER (button), pixmapwid); + gtk_widget_show (pixmapwid); + gtk_widget_show (button); - /* clist preview of palettes */ - clist_scrolledwindow = gtk_scrolled_window_new (NULL, NULL); + /* clist preview of palettes */ + scrolledwindow = gtk_scrolled_window_new (NULL, NULL); palette->clist = palette_list = gtk_clist_new (3); - gtk_object_set_data (GTK_OBJECT (palette_dialog), "palette_list", palette_list); - gtk_clist_set_row_height(GTK_CLIST(palette_list),SM_PREVIEW_HEIGHT+2); - gtk_signal_connect(GTK_OBJECT(palette->clist), "select_row", - GTK_SIGNAL_FUNC(palette_list_item_update), - (gpointer) palette); - if(vert) + gtk_clist_set_row_height (GTK_CLIST (palette_list), SM_PREVIEW_HEIGHT + 2); + gtk_signal_connect (GTK_OBJECT (palette->clist), "select_row", + GTK_SIGNAL_FUNC (palette_list_item_update), + (gpointer) palette); + if (vert) { gtk_widget_set_usize (palette_list, 203, 90); - gtk_notebook_append_page(GTK_NOTEBOOK(hbox3), - vbox4, - gtk_label_new("Palette")); - gtk_notebook_append_page(GTK_NOTEBOOK(hbox3), - clist_scrolledwindow, - gtk_label_new("Select")); + gtk_notebook_append_page (GTK_NOTEBOOK (hbox), vbox, + gtk_label_new (_("Palette"))); + gtk_notebook_append_page (GTK_NOTEBOOK (hbox), scrolledwindow, + gtk_label_new (_("Select"))); gtk_widget_show (palette_list); } else { - gtk_container_add (GTK_CONTAINER (hbox3), clist_scrolledwindow); + gtk_container_add (GTK_CONTAINER (hbox), scrolledwindow); gtk_widget_set_usize (palette_list, 203, -1); gtk_widget_show (palette_list); } - gtk_clist_set_column_title(GTK_CLIST(palette_list), 0, _("Palette")); - gtk_clist_set_column_title(GTK_CLIST(palette_list), 1, _("Ncols")); - gtk_clist_set_column_title(GTK_CLIST(palette_list), 2, _("Name")); - gtk_clist_column_titles_show(GTK_CLIST(palette_list)); + gtk_clist_set_column_title (GTK_CLIST (palette_list), 0, _("Palette")); + gtk_clist_set_column_title (GTK_CLIST (palette_list), 1, _("Ncols")); + gtk_clist_set_column_title (GTK_CLIST (palette_list), 2, _("Name")); + gtk_clist_column_titles_show (GTK_CLIST (palette_list)); - gtk_container_add (GTK_CONTAINER (clist_scrolledwindow), GTK_WIDGET(palette->clist)); + gtk_container_add (GTK_CONTAINER (scrolledwindow), palette->clist); - gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (clist_scrolledwindow), + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow), GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS); - if(!vert) - { - gtk_clist_set_selection_mode(GTK_CLIST(palette_list),GTK_SELECTION_EXTENDED); - } + if (!vert) + gtk_clist_set_selection_mode (GTK_CLIST (palette_list), + GTK_SELECTION_EXTENDED); + + gtk_widget_show (scrolledwindow); - gtk_widget_show(clist_scrolledwindow); - - gtk_container_set_border_width (GTK_CONTAINER (palette_list), 4); gtk_clist_set_column_width (GTK_CLIST (palette_list), 0, SM_PREVIEW_WIDTH+2); gtk_clist_column_titles_show (GTK_CLIST (palette_list)); - if(!vert) + if (!vert) { - frame1 = gtk_frame_new (_("Palette Ops")); - gtk_object_set_data (GTK_OBJECT (palette_dialog), "frame1", frame1); - gtk_widget_show (frame1); - gtk_box_pack_end (GTK_BOX (hbox3), frame1, FALSE, FALSE, 7); - - vbuttonbox2 = gtk_vbutton_box_new (); - gtk_object_set_data (GTK_OBJECT (palette_dialog), "vbuttonbox2", vbuttonbox2); - gtk_widget_show (vbuttonbox2); - gtk_container_add (GTK_CONTAINER (frame1), vbuttonbox2); - gtk_container_set_border_width (GTK_CONTAINER (vbuttonbox2), 6); - gtk_button_box_set_layout (GTK_BUTTON_BOX (vbuttonbox2), GTK_BUTTONBOX_SPREAD); - gtk_button_box_set_spacing (GTK_BUTTON_BOX (vbuttonbox2), 0); - gtk_button_box_set_child_size (GTK_BUTTON_BOX (vbuttonbox2), 44, 22); - gtk_button_box_set_child_ipadding (GTK_BUTTON_BOX (vbuttonbox2), 17, 0); + frame = gtk_frame_new (_("Palette Ops")); + gtk_box_pack_end (GTK_BOX (hbox), frame, FALSE, FALSE, 0); + gtk_widget_show (frame); + + vbox = gtk_vbox_new (FALSE, 2); + gtk_container_set_border_width (GTK_CONTAINER (vbox), 4); + gtk_container_add (GTK_CONTAINER (frame), vbox); + gtk_widget_show (vbox); - new_palette = gtk_button_new_with_label (_("New")); - GTK_WIDGET_UNSET_FLAGS (new_palette, GTK_RECEIVES_DEFAULT); - gtk_signal_connect (GTK_OBJECT (new_palette), "clicked", + button = gtk_button_new_with_label (_("New")); + GTK_WIDGET_UNSET_FLAGS (button, GTK_RECEIVES_DEFAULT); + gtk_misc_set_padding (GTK_MISC (GTK_BIN (button)->child), 2, 0); + gtk_signal_connect (GTK_OBJECT (button), "clicked", (GtkSignalFunc) palette_new_entries_callback, (gpointer) palette); - gtk_object_set_data (GTK_OBJECT (palette_dialog), "new_palette", new_palette); - gtk_widget_show (new_palette); - gtk_container_add (GTK_CONTAINER (vbuttonbox2), new_palette); - - delete_palette = gtk_button_new_with_label (_("Delete")); - GTK_WIDGET_UNSET_FLAGS (delete_palette, GTK_RECEIVES_DEFAULT); - gtk_signal_connect (GTK_OBJECT (delete_palette), "clicked", + gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0); + gtk_widget_show (button); + + button = gtk_button_new_with_label (_("Delete")); + GTK_WIDGET_UNSET_FLAGS (button, GTK_RECEIVES_DEFAULT); + gtk_misc_set_padding (GTK_MISC (GTK_BIN (button)->child), 2, 0); + gtk_signal_connect (GTK_OBJECT (button), "clicked", (GtkSignalFunc) palette_delete_entries_callback, (gpointer) palette); - gtk_widget_show (delete_palette); - gtk_container_add (GTK_CONTAINER (vbuttonbox2), delete_palette); + gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0); + gtk_widget_show (button); - save_palettes = gtk_button_new_with_label (_("Save")); - GTK_WIDGET_UNSET_FLAGS (save_palettes, GTK_RECEIVES_DEFAULT); - gtk_signal_connect (GTK_OBJECT (save_palettes), "clicked", - (GtkSignalFunc) palette_save_palettes_callback, - (gpointer) NULL); - gtk_widget_show (save_palettes); - gtk_container_add (GTK_CONTAINER (vbuttonbox2), save_palettes); - - import_palette = gtk_button_new_with_label (_("Import")); - GTK_WIDGET_UNSET_FLAGS (import_palette, GTK_RECEIVES_DEFAULT); - gtk_signal_connect (GTK_OBJECT (import_palette), "clicked", + button = gtk_button_new_with_label (_("Import")); + GTK_WIDGET_UNSET_FLAGS (button, GTK_RECEIVES_DEFAULT); + gtk_misc_set_padding (GTK_MISC (GTK_BIN (button)->child), 2, 0); + gtk_signal_connect (GTK_OBJECT (button), "clicked", (GtkSignalFunc) palette_import_dialog_callback, (gpointer) palette); - gtk_widget_show (import_palette); - gtk_container_add (GTK_CONTAINER (vbuttonbox2), import_palette); - - merge_palette = gtk_button_new_with_label (_("Merge")); - GTK_WIDGET_UNSET_FLAGS (merge_palette, GTK_RECEIVES_DEFAULT); - gtk_signal_connect (GTK_OBJECT (merge_palette), "clicked", + gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0); + gtk_widget_show (button); + + button = gtk_button_new_with_label (_("Merge")); + GTK_WIDGET_UNSET_FLAGS (button, GTK_RECEIVES_DEFAULT); + gtk_misc_set_padding (GTK_MISC (GTK_BIN (button)->child), 2, 0); + gtk_signal_connect (GTK_OBJECT (button), "clicked", (GtkSignalFunc) palette_merge_dialog_callback, (gpointer) palette); - gtk_widget_show (merge_palette); - gtk_container_add (GTK_CONTAINER (vbuttonbox2), merge_palette); + gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0); + gtk_widget_show (button); } - dialog_action_area3 = GTK_DIALOG (palette_dialog)->action_area; - gtk_object_set_data (GTK_OBJECT (palette_dialog), "dialog_action_area3", dialog_action_area3); - gtk_widget_show (dialog_action_area3); - gtk_container_set_border_width (GTK_CONTAINER (dialog_action_area3), 2); - - alignment2 = gtk_alignment_new (0.5, 0.5, 1, 1); - gtk_object_set_data (GTK_OBJECT (palette_dialog), "alignment2", alignment2); - gtk_widget_show (alignment2); - gtk_box_pack_start (GTK_BOX (dialog_action_area3), alignment2, TRUE, TRUE, 0); - - hbox5 = gtk_hbox_new (FALSE, 0); - gtk_container_add (GTK_CONTAINER (alignment2), hbox5); - gtk_widget_show (hbox5); - - hbuttonbox3 = gtk_hbutton_box_new (); - gtk_object_set_data (GTK_OBJECT (palette_dialog), "hbuttonbox3", hbuttonbox3); - gtk_widget_show (hbuttonbox3); - gtk_box_pack_end (GTK_BOX(hbox5), hbuttonbox3, FALSE, FALSE, 0); - gtk_button_box_set_spacing (GTK_BUTTON_BOX (hbuttonbox3), 4); - gtk_signal_connect (GTK_OBJECT (palette->shell), "delete_event", - GTK_SIGNAL_FUNC (palette_dialog_delete_callback), - palette); - - close_button = gtk_button_new_with_label (_("Close")); - GTK_WIDGET_SET_FLAGS (close_button, GTK_CAN_DEFAULT); - gtk_window_set_default (GTK_WINDOW (palette->shell), close_button); - gtk_signal_connect(GTK_OBJECT(close_button), "clicked", - GTK_SIGNAL_FUNC(palette_close_callback), (gpointer)palette); - - if(!vert) + if (!vert) { - refresh_button = gtk_button_new_with_label (_("Refresh")); - gtk_signal_connect(GTK_OBJECT(refresh_button), "clicked", - GTK_SIGNAL_FUNC(palette_refresh_callback), (gpointer)palette); + horz_action_items[0].user_data = palette; + horz_action_items[1].user_data = palette; + horz_action_items[2].user_data = palette; + build_action_area (GTK_DIALOG (palette->shell), horz_action_items, 3, 2); } else { - refresh_button = gtk_button_new_with_label (_("Edit")); - gtk_signal_connect(GTK_OBJECT(refresh_button), "clicked", - GTK_SIGNAL_FUNC(palette_edit_palette_callback), (gpointer)palette); + vert_action_items[0].user_data = palette; + vert_action_items[1].user_data = palette; + build_action_area (GTK_DIALOG (palette->shell), vert_action_items, 2, 1); } - GTK_WIDGET_SET_FLAGS (refresh_button, GTK_CAN_DEFAULT); - gtk_container_add (GTK_CONTAINER (hbuttonbox3), refresh_button); - gtk_widget_show (refresh_button); - gtk_container_add (GTK_CONTAINER (hbuttonbox3), close_button); - gtk_widget_show (close_button); - - gtk_widget_realize(palette->shell); - palette->gc = gdk_gc_new(palette->shell->window); + palette->gc = gdk_gc_new (palette->shell->window); - colormap = gtk_widget_get_colormap(palette->clist); + palette_popup_menu (palette); - palette_popup_menu(palette); - return palette; } static void -import_dialog_select_grad_callback (GtkWidget *w, - gpointer client_data) +import_dialog_select_grad_callback (GtkWidget *widget, + gpointer data) { /* Popup grad edit box .... */ - grad_create_gradient_editor(); + grad_create_gradient_editor (); } static void -import_dialog_close_callback (GtkWidget *w, - gpointer client_data) +import_dialog_close_callback (GtkWidget *widget, + gpointer data) { - gtk_widget_destroy(import_dialog->dialog); - g_free(import_dialog); + gtk_widget_destroy (import_dialog->dialog); + g_free (import_dialog); import_dialog = NULL; } static void -import_palette_create_from_grad(gchar *name,PaletteP palette) +import_palette_create_from_grad (gchar *name, + PaletteDialog *palette) { PaletteEntriesP entries; + if(curr_gradient) { /* Add names to entry */ @@ -2297,7 +2259,7 @@ import_palette_create_from_grad(gchar *name,PaletteP palette) gint sample_sz; gint loop; - entries = palette_create_entries(palette,name); + entries = palette_create_entries (palette, name); sample_sz = (gint)import_dialog->sample->value; dx = 1.0/ (sample_sz - 1); @@ -2310,73 +2272,77 @@ import_palette_create_from_grad(gchar *name,PaletteP palette) g = g * 255.0; b = b * 255.0; cur_x += dx; - palette_add_entry (palette->entries, _("Untitled"), (gint)r, (gint)g, (gint)b); + palette_add_entry (palette->entries, _("Untitled"), + (gint) r, (gint) g, (gint) b); } - palette_update_small_preview(palette); - redraw_palette(palette); + palette_update_small_preview (palette); + redraw_palette (palette); /* Update other selectors on screen */ - palette_select_clist_insert_all(entries); - palette_select2_clist_insert_all(entries); - palette_scroll_clist_to_current(palette); + palette_select_clist_insert_all (entries); + palette_select2_clist_insert_all (entries); + palette_scroll_clist_to_current (palette); } } static void -import_dialog_import_callback (GtkWidget *w, - gpointer client_data) +import_dialog_import_callback (GtkWidget *widget, + gpointer data) { - PaletteP palette; - palette = client_data; - if(import_dialog) + PaletteDialog *palette; + + palette = data; + if (import_dialog) { guchar *pname; - pname = gtk_entry_get_text(GTK_ENTRY(import_dialog->entry)); - if(!pname || strlen(pname) == 0) - pname = g_strdup("tmp"); + pname = gtk_entry_get_text (GTK_ENTRY (import_dialog->entry)); + if (!pname || strlen (pname) == 0) + pname = g_strdup ("tmp"); else - pname = g_strdup(pname); - switch(import_dialog->import_type) + pname = g_strdup (pname); + switch (import_dialog->import_type) { case GRAD_IMPORT: - import_palette_create_from_grad(pname,palette); + import_palette_create_from_grad (pname, palette); break; case IMAGE_IMPORT: - import_palette_create_from_image(import_dialog->gimage,pname,palette); + import_palette_create_from_image (import_dialog->gimage, + pname, palette); break; default: break; } - import_dialog_close_callback(NULL,NULL); + import_dialog_close_callback (NULL, NULL); } } static gint -import_dialog_delete_callback (GtkWidget *w, - GdkEvent *e, - gpointer client_data) +import_dialog_delete_callback (GtkWidget *widget, + GdkEvent *event, + gpointer data) { - import_dialog_close_callback(w,client_data); + import_dialog_close_callback (widget, data); + return TRUE; } static void -palette_merge_entries_callback (GtkWidget *w, - gpointer client_data, - gpointer call_data) +palette_merge_entries_callback (GtkWidget *widget, + gpointer data, + gpointer call_data) { - PaletteP palette; + PaletteDialog *palette; PaletteEntriesP p_entries; PaletteEntriesP new_entries; GList *sel_list; - new_entries = palette_create_entries(client_data,call_data); + new_entries = palette_create_entries (data, call_data); - palette = (PaletteP)client_data; + palette = (PaletteDialog *) data; - sel_list = GTK_CLIST(palette->clist)->selection; + sel_list = GTK_CLIST (palette->clist)->selection; - if(sel_list) + if (sel_list) { while (sel_list) { @@ -2385,15 +2351,15 @@ palette_merge_entries_callback (GtkWidget *w, row = GPOINTER_TO_INT (sel_list->data); p_entries = - (PaletteEntriesP)gtk_clist_get_row_data(GTK_CLIST(palette->clist),row); + (PaletteEntriesP)gtk_clist_get_row_data (GTK_CLIST (palette->clist), row); - /* Go through each palette and merge the colours */ + /* Go through each palette and merge the colors */ cols = p_entries->colors; - while(cols) + while (cols) { PaletteEntryP entry = cols->data; palette_add_entry (new_entries, - g_strdup(entry->name), + g_strdup (entry->name), entry->color[0], entry->color[1], entry->color[2]); @@ -2403,51 +2369,51 @@ palette_merge_entries_callback (GtkWidget *w, } } - palette_update_small_preview(palette); - redraw_palette(palette); - gtk_clist_unselect_all(GTK_CLIST(palette->clist)); + palette_update_small_preview (palette); + redraw_palette (palette); + gtk_clist_unselect_all (GTK_CLIST (palette->clist)); /* Update other selectors on screen */ - palette_select_clist_insert_all(new_entries); - palette_select2_clist_insert_all(new_entries); - palette_scroll_clist_to_current(palette); + palette_select_clist_insert_all (new_entries); + palette_select2_clist_insert_all (new_entries); + palette_scroll_clist_to_current (palette); } static void -palette_merge_dialog_callback (GtkWidget *w, - gpointer client_data) +palette_merge_dialog_callback (GtkWidget *widget, + gpointer data) { gtk_widget_show (query_string_box (_("Merge Palette"), _("Enter a name for merged palette"), NULL, NULL, NULL, palette_merge_entries_callback, - client_data)); + data)); } static void -palette_import_dialog_callback (GtkWidget *w, - gpointer client_data) +palette_import_dialog_callback (GtkWidget *widget, + gpointer data) { - if(!import_dialog) + if (!import_dialog) { - import_dialog = palette_import_dialog((PaletteP)client_data); - gtk_widget_show(import_dialog->dialog); + import_dialog = palette_import_dialog ((PaletteDialog *) data); + gtk_widget_show (import_dialog->dialog); } else { - gdk_window_raise(import_dialog->dialog->window); + gdk_window_raise (import_dialog->dialog->window); } } static void -palette_import_fill_grad_preview(GtkWidget *preview, - gradient_t *gradient) +palette_import_fill_grad_preview (GtkWidget *preview, + gradient_t *gradient) { guchar buffer[3*IMPORT_PREVIEW_WIDTH]; gint loop; guchar *p = buffer; - double dx, cur_x; - double r, g, b, a; + gdouble dx, cur_x; + gdouble r, g, b, a; extern void grad_get_color_at(double, double *, double *, double *, double *); gradient_t *last_grad; @@ -2474,45 +2440,51 @@ palette_import_fill_grad_preview(GtkWidget *preview, } -void import_palette_grad_update(gradient_t *grad) +void +import_palette_grad_update (gradient_t *grad) { - if(import_dialog && import_dialog->import_type == GRAD_IMPORT) + if (import_dialog && import_dialog->import_type == GRAD_IMPORT) { /* redraw gradient */ - palette_import_fill_grad_preview(import_dialog->preview,grad); + palette_import_fill_grad_preview (import_dialog->preview, grad); gtk_entry_set_text (GTK_ENTRY (import_dialog->entry), grad->name); } } static void -import_grad_callback(GtkWidget *widget, gpointer data) +import_grad_callback (GtkWidget *widget, + gpointer data) { - if(import_dialog) + if (import_dialog) { import_dialog->import_type = GRAD_IMPORT; - if(import_dialog->image_list) + if (import_dialog->image_list) { - gtk_widget_hide(import_dialog->image_list); - gtk_widget_destroy(import_dialog->image_list); + gtk_widget_hide (import_dialog->image_list); + gtk_widget_destroy (import_dialog->image_list); import_dialog->image_list = NULL; } - gtk_widget_show(import_dialog->select); - palette_import_fill_grad_preview(import_dialog->preview,curr_gradient); + gtk_widget_show (import_dialog->select); + palette_import_fill_grad_preview (import_dialog->preview, curr_gradient); gtk_entry_set_text (GTK_ENTRY (import_dialog->entry), curr_gradient->name); - gtk_widget_set_sensitive(import_dialog->threshold_scale,FALSE); - gtk_widget_set_sensitive(import_dialog->threshold_text,FALSE); + gtk_widget_set_sensitive (import_dialog->threshold_scale, FALSE); + gtk_widget_set_sensitive (import_dialog->threshold_text, FALSE); } } static void -gimlist_cb(gpointer im, gpointer data){ - GSList** l=(GSList**)data; - *l=g_slist_prepend(*l, im); +gimlist_cb (gpointer im, + gpointer data) +{ + GSList** l; + + l = (GSList**) data; + *l = g_slist_prepend (*l, im); } static void -import_image_update_image_preview(GimpImage *gimage) +import_image_update_image_preview (GimpImage *gimage) { TempBuf * preview_buf; gchar *src, *buf; @@ -2537,16 +2509,16 @@ import_image_update_image_preview(GimpImage *gimage) /* Min size is 2 */ - preview_buf = gimp_image_construct_composite_preview(gimage, - MAX(pwidth, 2), - MAX(pheight, 2)); - - gtk_preview_size(GTK_PREVIEW(import_dialog->preview), - preview_buf->width, - preview_buf->height); + preview_buf = gimp_image_construct_composite_preview (gimage, + MAX (pwidth, 2), + MAX (pheight, 2)); + + gtk_preview_size (GTK_PREVIEW (import_dialog->preview), + preview_buf->width, + preview_buf->height); buf = g_new (gchar, IMPORT_PREVIEW_WIDTH * 3); - src = (gchar *)temp_buf_data (preview_buf); + src = (gchar *) temp_buf_data (preview_buf); has_alpha = (preview_buf->bytes == 2 || preview_buf->bytes == 4); for (y = 0; y height ; y++) { @@ -2565,52 +2537,55 @@ import_image_update_image_preview(GimpImage *gimage) buf[x*3+1] = src[x*stride+1]; buf[x*3+2] = src[x*stride+2]; } - gtk_preview_draw_row (GTK_PREVIEW (import_dialog->preview), (guchar *)buf, 0, y, preview_buf->width); + gtk_preview_draw_row (GTK_PREVIEW (import_dialog->preview), + (guchar *)buf, 0, y, preview_buf->width); src += preview_buf->width * preview_buf->bytes; } - g_free(buf); - temp_buf_free(preview_buf); + g_free (buf); + temp_buf_free (preview_buf); - gtk_widget_hide(import_dialog->preview); - gtk_widget_draw(import_dialog->preview, NULL); - gtk_widget_show(import_dialog->preview); + gtk_widget_hide (import_dialog->preview); + gtk_widget_draw (import_dialog->preview, NULL); + gtk_widget_show (import_dialog->preview); } static void -import_image_sel_callback(GtkWidget *widget, gpointer data) +import_image_sel_callback (GtkWidget *widget, + gpointer data) { GimpImage *gimage; gchar *lab; - gimage = GIMP_IMAGE(data); - import_image_update_image_preview(gimage); + gimage = GIMP_IMAGE (data); + import_image_update_image_preview (gimage); - lab = g_strdup_printf("%s-%d", - g_basename(gimage_filename(import_dialog->gimage)), - pdb_image_to_id (import_dialog->gimage)); + lab = g_strdup_printf ("%s-%d", + g_basename (gimage_filename (import_dialog->gimage)), + pdb_image_to_id (import_dialog->gimage)); - gtk_entry_set_text (GTK_ENTRY (import_dialog->entry),lab); + gtk_entry_set_text (GTK_ENTRY (import_dialog->entry), lab); } static void -import_image_menu_add(GimpImage *gimage) +import_image_menu_add (GimpImage *gimage) { GtkWidget *menuitem; - gchar *lab = g_strdup_printf("%s-%d", - g_basename(gimage_filename(gimage)), - pdb_image_to_id (gimage)); - menuitem = gtk_menu_item_new_with_label(lab); + gchar *lab = g_strdup_printf ("%s-%d", + g_basename (gimage_filename (gimage)), + pdb_image_to_id (gimage)); + menuitem = gtk_menu_item_new_with_label (lab); gtk_widget_show (menuitem); - gtk_signal_connect(GTK_OBJECT(menuitem), "activate", - (GtkSignalFunc) import_image_sel_callback, - gimage); + gtk_signal_connect (GTK_OBJECT (menuitem), "activate", + (GtkSignalFunc) import_image_sel_callback, + gimage); gtk_menu_append (GTK_MENU (import_dialog->optionmenu1_menu), menuitem); } /* Last Param gives us control over what goes in the menu on a delete oper */ static void -import_image_menu_activate(gint redo,GimpImage * del_image) +import_image_menu_activate (gint redo, + GimpImage *del_image) { GSList *list=NULL; gint num_images; @@ -2620,19 +2595,19 @@ import_image_menu_activate(gint redo,GimpImage * del_image) gint count = 0; gchar *lab; - if(import_dialog) + if (import_dialog) { - if(import_dialog->import_type == IMAGE_IMPORT) + if (import_dialog->import_type == IMAGE_IMPORT) { - if(!redo) + if (!redo) return; else { - if(import_dialog->image_list) + if (import_dialog->image_list) { last_img = import_dialog->gimage; - gtk_widget_hide(import_dialog->image_list); - gtk_widget_destroy(import_dialog->image_list); + gtk_widget_hide (import_dialog->image_list); + gtk_widget_destroy (import_dialog->image_list); import_dialog->image_list = NULL; } } @@ -2640,325 +2615,321 @@ import_image_menu_activate(gint redo,GimpImage * del_image) import_dialog->import_type = IMAGE_IMPORT; /* Get list of images */ - gimage_foreach(gimlist_cb, &list); + gimage_foreach (gimlist_cb, &list); num_images = g_slist_length (list); if (num_images) { - int i; + gint i; GtkWidget *optionmenu1; GtkWidget *optionmenu1_menu; import_dialog->image_list = optionmenu1 = gtk_option_menu_new (); - gtk_widget_set_usize (optionmenu1,IMPORT_PREVIEW_WIDTH,-1); + gtk_widget_set_usize (optionmenu1, IMPORT_PREVIEW_WIDTH, -1); import_dialog->optionmenu1_menu = optionmenu1_menu = gtk_menu_new (); for (i = 0; i < num_images; i++, list = g_slist_next (list)) { - if(GIMP_IMAGE(list->data) != del_image) + if (GIMP_IMAGE (list->data) != del_image) { - if(first_img == NULL) - first_img = GIMP_IMAGE(list->data); - import_image_menu_add(GIMP_IMAGE(list->data)); - if(last_img == GIMP_IMAGE(list->data)) + if (first_img == NULL) + first_img = GIMP_IMAGE (list->data); + import_image_menu_add (GIMP_IMAGE (list->data)); + if (last_img == GIMP_IMAGE (list->data)) act_num = count; else count++; } } - gtk_option_menu_set_menu (GTK_OPTION_MENU (optionmenu1), optionmenu1_menu); - gtk_widget_hide(import_dialog->select); - gtk_container_add(GTK_CONTAINER(import_dialog->select_area),optionmenu1); + gtk_option_menu_set_menu (GTK_OPTION_MENU (optionmenu1), + optionmenu1_menu); + gtk_widget_hide (import_dialog->select); + gtk_box_pack_start (GTK_BOX (import_dialog->select_area), + optionmenu1, FALSE, FALSE, 0); if(last_img != NULL && last_img != del_image) - import_image_update_image_preview(last_img); - else if(first_img != NULL) - import_image_update_image_preview(first_img); + import_image_update_image_preview (last_img); + else if (first_img != NULL) + import_image_update_image_preview (first_img); gtk_widget_show (optionmenu1); /* reset to last one */ if(redo && act_num >= 0) { - gchar *lab = g_strdup_printf("%s-%d", - g_basename(gimage_filename(import_dialog->gimage)), - pdb_image_to_id (import_dialog->gimage)); + gchar *lab = + g_strdup_printf ("%s-%d", + g_basename (gimage_filename (import_dialog->gimage)), + pdb_image_to_id (import_dialog->gimage)); - gtk_option_menu_set_history(GTK_OPTION_MENU(optionmenu1),act_num); - gtk_entry_set_text (GTK_ENTRY (import_dialog->entry),lab); + gtk_option_menu_set_history (GTK_OPTION_MENU (optionmenu1), act_num); + gtk_entry_set_text (GTK_ENTRY (import_dialog->entry), lab); } } - g_slist_free(list); + g_slist_free (list); - lab = g_strdup_printf("%s-%d", - g_basename(gimage_filename(import_dialog->gimage)), - pdb_image_to_id (import_dialog->gimage)); + lab = + g_strdup_printf ("%s-%d", + g_basename (gimage_filename (import_dialog->gimage)), + pdb_image_to_id (import_dialog->gimage)); - gtk_entry_set_text (GTK_ENTRY (import_dialog->entry),lab); + gtk_entry_set_text (GTK_ENTRY (import_dialog->entry), lab); } } static void -import_image_callback(GtkWidget *widget, gpointer data) +import_image_callback (GtkWidget *widget, + gpointer data) { - import_image_menu_activate(FALSE,NULL); - gtk_widget_set_sensitive(import_dialog->threshold_scale,TRUE); - gtk_widget_set_sensitive(import_dialog->threshold_text,TRUE); + import_image_menu_activate (FALSE, NULL); + gtk_widget_set_sensitive (import_dialog->threshold_scale, TRUE); + gtk_widget_set_sensitive (import_dialog->threshold_text, TRUE); } static gint -image_count() +image_count () { GSList *list=NULL; gint num_images = 0; - gimage_foreach(gimlist_cb, &list); + gimage_foreach (gimlist_cb, &list); num_images = g_slist_length (list); - g_slist_free(list); + g_slist_free (list); - return (num_images); + return num_images; } -static ImportDialogP -palette_import_dialog(PaletteP palette) +static ImportDialog * +palette_import_dialog (PaletteDialog *palette) { - GtkWidget *dialog1; - GtkWidget *dialog_vbox1; - GtkWidget *hbox2; - GtkWidget *import_frame; - GtkWidget *vbox2; - GtkWidget *table1; - GtkWidget *steps; - GtkWidget *import_name; - GtkWidget *import_type; - GtkWidget *spinbutton2; - GtkWidget *entry1; - GtkWidget *optionmenu1; - GtkWidget *optionmenu1_menu; + GtkWidget *dialog; + GtkWidget *hbox; + GtkWidget *frame; + GtkWidget *vbox; + GtkWidget *table; + GtkWidget *label; + GtkWidget *spinbutton; + GtkWidget *button; + GtkWidget *entry; + GtkWidget *optionmenu; + GtkWidget *optionmenu_menu; GtkWidget *menuitem; - GtkWidget *preview_frame; - GtkWidget *vbox1; - GtkWidget *image1; - GtkWidget *select; - GtkWidget *dialog_action_area1; - GtkWidget *hbox1; - GtkWidget *hscale1; - GtkWidget *import; - GtkWidget *close; - - import_dialog = g_malloc(sizeof(struct _ImportDialog)); - import_dialog->image_list = NULL; - import_dialog->gimage = NULL; + GtkWidget *image; + GtkWidget *hscale; - import_dialog->dialog = dialog1 = gtk_dialog_new (); - gtk_window_set_title (GTK_WINDOW (dialog1), _("Import Palette")); - gtk_window_set_policy (GTK_WINDOW (dialog1), TRUE, TRUE, FALSE); + static ActionAreaItem action_items[] = + { + { N_("Import"), import_dialog_import_callback, NULL, NULL }, + { N_("Close"), import_dialog_close_callback, NULL, NULL } + }; - dialog_vbox1 = GTK_DIALOG (dialog1)->vbox; - gtk_widget_show (dialog_vbox1); - - hbox2 = gtk_hbox_new (FALSE, 0); - gtk_widget_show (hbox2); - gtk_box_pack_start (GTK_BOX (dialog_vbox1), hbox2, FALSE, FALSE, 0); - - import_frame = gtk_frame_new (_("Import")); - gtk_widget_show (import_frame); - gtk_box_pack_start (GTK_BOX (hbox2), import_frame, TRUE, TRUE, 0); - - vbox2 = gtk_vbox_new (FALSE, 0); - gtk_widget_show (vbox2); - gtk_container_add (GTK_CONTAINER (import_frame), vbox2); - - table1 = gtk_table_new (4, 2, FALSE); - gtk_widget_show (table1); - gtk_box_pack_start (GTK_BOX (vbox2), table1, TRUE, TRUE, 0); - - steps = gtk_label_new (_("Sample Size:")); - gtk_widget_show (steps); - gtk_table_attach (GTK_TABLE (table1), steps, 0, 1, 2, 3, - GTK_EXPAND | GTK_FILL, GTK_EXPAND, 0, 0); - gtk_label_set_justify (GTK_LABEL (steps), GTK_JUSTIFY_LEFT); - - import_dialog->threshold_text = - steps = gtk_label_new (_("Interval:")); - gtk_widget_show (steps); - gtk_table_attach (GTK_TABLE (table1), steps, 0, 1, 3, 4, - GTK_EXPAND | GTK_FILL, GTK_EXPAND, 0, 0); - gtk_label_set_justify (GTK_LABEL (steps), GTK_JUSTIFY_LEFT); - gtk_widget_set_sensitive(steps,FALSE); + import_dialog = g_new (ImportDialog, 1); + import_dialog->image_list = NULL; + import_dialog->gimage = NULL; - import_name = gtk_label_new (_("Name:")); - gtk_widget_show (import_name); - gtk_table_attach (GTK_TABLE (table1), import_name, 0, 1, 0, 1, - GTK_EXPAND | GTK_FILL, GTK_EXPAND, 0, 0); - gtk_label_set_justify (GTK_LABEL (import_name), GTK_JUSTIFY_LEFT); + import_dialog->dialog = dialog = gtk_dialog_new (); + gtk_window_set_wmclass (GTK_WINDOW (dialog), "import_palette", "Gimp"); + gtk_window_set_title (GTK_WINDOW (dialog), _("Import Palette")); - import_type = gtk_label_new (_("Source:")); - gtk_widget_show (import_type); - gtk_table_attach (GTK_TABLE (table1), import_type, 0, 1, 1, 2, - GTK_EXPAND | GTK_FILL, GTK_EXPAND, 0, 0); - gtk_label_set_justify (GTK_LABEL (import_type), GTK_JUSTIFY_LEFT); + /* Handle the wm delete event */ + gtk_signal_connect (GTK_OBJECT (dialog), "delete_event", + GTK_SIGNAL_FUNC (import_dialog_delete_callback), + (gpointer)palette); - import_dialog->sample = GTK_ADJUSTMENT(gtk_adjustment_new (256, 2, 10000, 1, 10, 10)); - spinbutton2 = gtk_spin_button_new (import_dialog->sample, 1, 0); - gtk_widget_show (spinbutton2); - gtk_table_attach (GTK_TABLE (table1), spinbutton2, 1, 2, 2, 3, + /* The main hbox */ + hbox = gtk_hbox_new (FALSE, 4); + gtk_container_set_border_width (GTK_CONTAINER (hbox), 4); + gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), hbox); + gtk_widget_show (hbox); + + /* The "Import" frame */ + frame = gtk_frame_new (_("Import")); + gtk_box_pack_start (GTK_BOX (hbox), frame, TRUE, TRUE, 0); + gtk_widget_show (frame); + + vbox = gtk_vbox_new (FALSE, 2); + gtk_container_set_border_width (GTK_CONTAINER (vbox), 2); + gtk_container_add (GTK_CONTAINER (frame), vbox); + gtk_widget_show (vbox); + + table = gtk_table_new (4, 2, FALSE); + gtk_table_set_col_spacing (GTK_TABLE (table), 0, 4); + gtk_table_set_row_spacings (GTK_TABLE (table), 2); + gtk_box_pack_start (GTK_BOX (vbox), table, FALSE, FALSE, 0); + gtk_widget_show (table); + + /* The source's name */ + label = gtk_label_new (_("Name:")); + gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5); + gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1, GTK_EXPAND | GTK_FILL, GTK_EXPAND, 0, 0); - - import_dialog->threshold_scale = - hscale1 = - gtk_hscale_new (import_dialog->threshold = - GTK_ADJUSTMENT (gtk_adjustment_new (1, 1, 128, 1, 1, 1))); - gtk_scale_set_value_pos (GTK_SCALE (hscale1), GTK_POS_TOP); - gtk_scale_set_digits (GTK_SCALE (hscale1), 0); - gtk_widget_show (hscale1); - gtk_table_attach (GTK_TABLE (table1), hscale1, 1, 2, 3, 4, + gtk_widget_show (label); + + entry = import_dialog->entry = gtk_entry_new (); + gtk_table_attach_defaults (GTK_TABLE (table), entry, 1, 2, 0, 1); + gtk_entry_set_text (GTK_ENTRY (entry), + curr_gradient ? curr_gradient->name : _("new_import")); + gtk_widget_show (entry); + + /* The source type */ + label = gtk_label_new (_("Source:")); + gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5); + gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2, GTK_EXPAND | GTK_FILL, GTK_EXPAND, 0, 0); - gtk_widget_set_sensitive(hscale1,FALSE); - - import_dialog->entry = entry1 = gtk_entry_new (); - gtk_widget_show (entry1); - gtk_table_attach (GTK_TABLE (table1), entry1, 1, 2, 0, 1, - GTK_FILL, 0, 0, 0); -/* gtk_widget_set_usize (entry1, 100, -1); */ - gtk_entry_set_text (GTK_ENTRY (entry1), (curr_gradient)?curr_gradient->name:_("new_import")); - - import_dialog->type_option = optionmenu1 = gtk_option_menu_new (); - gtk_widget_show (optionmenu1); - gtk_table_attach (GTK_TABLE (table1), optionmenu1, 1, 2, 1, 2, - GTK_FILL, 0, 0, 0); - optionmenu1_menu = gtk_menu_new (); - import_dialog->image_menu_item_gradient = - menuitem = gtk_menu_item_new_with_label (_("Gradient")); + gtk_widget_show (label); + + optionmenu = import_dialog->type_option = gtk_option_menu_new (); + optionmenu_menu = gtk_menu_new (); + gtk_table_attach_defaults (GTK_TABLE (table), optionmenu, 1, 2, 1, 2); + menuitem = import_dialog->image_menu_item_gradient = + gtk_menu_item_new_with_label (_("Gradient")); + gtk_signal_connect (GTK_OBJECT (menuitem), "activate", + (GtkSignalFunc) import_grad_callback, + NULL); + gtk_menu_append (GTK_MENU (optionmenu_menu), menuitem); gtk_widget_show (menuitem); - gtk_signal_connect(GTK_OBJECT(menuitem), "activate", - (GtkSignalFunc) import_grad_callback, - NULL); - gtk_menu_append (GTK_MENU (optionmenu1_menu), menuitem); - import_dialog->image_menu_item_image = menuitem = gtk_menu_item_new_with_label ("Image"); - gtk_widget_show (menuitem); - gtk_signal_connect(GTK_OBJECT(menuitem), "activate", - (GtkSignalFunc) import_image_callback, - (gpointer)import_dialog); - gtk_menu_append (GTK_MENU (optionmenu1_menu), menuitem); - - gtk_option_menu_set_menu (GTK_OPTION_MENU (optionmenu1), optionmenu1_menu); - gtk_widget_set_sensitive(menuitem,image_count() > 0); - - preview_frame = gtk_frame_new (_("Preview")); - gtk_widget_show (preview_frame); - gtk_box_pack_start (GTK_BOX (hbox2), preview_frame, TRUE, TRUE, 0); - import_dialog->select_area = vbox1 = gtk_vbox_new (FALSE, 0); - gtk_widget_show (vbox1); - gtk_container_add (GTK_CONTAINER (preview_frame), vbox1); + menuitem = import_dialog->image_menu_item_image = + gtk_menu_item_new_with_label ("Image"); + gtk_signal_connect (GTK_OBJECT (menuitem), "activate", + (GtkSignalFunc) import_image_callback, + (gpointer) import_dialog); + gtk_menu_append (GTK_MENU (optionmenu_menu), menuitem); + gtk_widget_show (menuitem); - import_dialog->preview = image1 = gtk_preview_new (GTK_PREVIEW_COLOR); - gtk_preview_set_dither (GTK_PREVIEW (image1), - GDK_RGB_DITHER_MAX); - gtk_preview_size (GTK_PREVIEW (image1), IMPORT_PREVIEW_WIDTH, IMPORT_PREVIEW_HEIGHT); - gtk_widget_show (image1); - gtk_widget_set_usize (image1,IMPORT_PREVIEW_WIDTH, IMPORT_PREVIEW_HEIGHT); - gtk_box_pack_start (GTK_BOX (vbox1), image1, FALSE, FALSE, 0); - - import_dialog->select = select = gtk_button_new_with_label (_("select")); - gtk_signal_connect(GTK_OBJECT(select), "clicked", - GTK_SIGNAL_FUNC(import_dialog_select_grad_callback),(gpointer)image1); - gtk_widget_show (select); - gtk_box_pack_start (GTK_BOX (vbox1), select, FALSE, FALSE, 0); - - dialog_action_area1 = GTK_DIALOG (dialog1)->action_area; - gtk_container_set_border_width (GTK_CONTAINER (dialog_action_area1), 2); - gtk_widget_show (dialog_action_area1); - - hbox1 = gtk_hbox_new (FALSE, 0); - gtk_widget_show (hbox1); - gtk_box_pack_start (GTK_BOX (dialog_action_area1), hbox1, TRUE, TRUE, 0); - - import = gtk_button_new_with_label (_("import")); - gtk_widget_show (import); - gtk_signal_connect(GTK_OBJECT(import), "clicked", - GTK_SIGNAL_FUNC(import_dialog_import_callback),(gpointer)palette); - gtk_container_set_border_width (GTK_CONTAINER (import), 4); - gtk_box_pack_end (GTK_BOX (hbox1), import, FALSE, FALSE, 0); - - close = gtk_button_new_with_label (_("close")); - gtk_signal_connect(GTK_OBJECT(close), "clicked", - GTK_SIGNAL_FUNC(import_dialog_close_callback),(gpointer)NULL); - gtk_widget_show (close); - gtk_box_pack_start (GTK_BOX (hbox1), close, FALSE, FALSE, 0); - GTK_WIDGET_SET_FLAGS (close, GTK_CAN_DEFAULT); - gtk_widget_grab_default (close); - - gtk_signal_connect (GTK_OBJECT (dialog1), "delete_event", - GTK_SIGNAL_FUNC (import_dialog_delete_callback), - (gpointer)palette); + gtk_option_menu_set_menu (GTK_OPTION_MENU (optionmenu), optionmenu_menu); + gtk_widget_set_sensitive (menuitem, image_count() > 0); + gtk_widget_show (optionmenu); - /* Fill with the selected gradient */ - palette_import_fill_grad_preview(image1,curr_gradient); + /* The sample size */ + label = gtk_label_new (_("Sample Size:")); + gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5); + gtk_table_attach (GTK_TABLE (table), label, 0, 1, 2, 3, + GTK_EXPAND | GTK_FILL, GTK_EXPAND, 0, 0); + gtk_widget_show (label); + + import_dialog->sample = + GTK_ADJUSTMENT(gtk_adjustment_new (256, 2, 10000, 1, 10, 10)); + spinbutton = gtk_spin_button_new (import_dialog->sample, 1, 0); + gtk_table_attach_defaults (GTK_TABLE (table), spinbutton, 1, 2, 2, 3); + gtk_widget_show (spinbutton); + + /* The interval */ + label = import_dialog->threshold_text = gtk_label_new (_("Interval:")); + gtk_misc_set_alignment (GTK_MISC (label), 1.0, 1.0); + gtk_table_attach (GTK_TABLE (table), label, 0, 1, 3, 4, + GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0); + gtk_widget_set_sensitive(label, FALSE); + gtk_widget_show (label); + + import_dialog->threshold = + GTK_ADJUSTMENT (gtk_adjustment_new (1, 1, 128, 1, 1, 1)); + hscale = import_dialog->threshold_scale = + gtk_hscale_new (import_dialog->threshold); + gtk_scale_set_value_pos (GTK_SCALE (hscale), GTK_POS_TOP); + gtk_scale_set_digits (GTK_SCALE (hscale), 0); + gtk_table_attach_defaults (GTK_TABLE (table), hscale, 1, 2, 3, 4); + gtk_widget_set_sensitive (hscale, FALSE); + gtk_widget_show (hscale); + + /* The preview frame */ + frame = gtk_frame_new (_("Preview")); + gtk_box_pack_start (GTK_BOX (hbox), frame, TRUE, TRUE, 0); + gtk_widget_show (frame); + + vbox = import_dialog->select_area = gtk_vbox_new (FALSE, 2); + gtk_container_set_border_width (GTK_CONTAINER (vbox), 2); + gtk_container_add (GTK_CONTAINER (frame), vbox); + gtk_widget_show (vbox); + + image = import_dialog->preview = gtk_preview_new (GTK_PREVIEW_COLOR); + gtk_preview_set_dither (GTK_PREVIEW (image), GDK_RGB_DITHER_MAX); + gtk_preview_size (GTK_PREVIEW (image), + IMPORT_PREVIEW_WIDTH, IMPORT_PREVIEW_HEIGHT); + gtk_widget_set_usize (image, IMPORT_PREVIEW_WIDTH, IMPORT_PREVIEW_HEIGHT); + gtk_box_pack_start (GTK_BOX (vbox), image, FALSE, FALSE, 0); + gtk_widget_show (image); + + button = import_dialog->select = gtk_button_new_with_label (_("Select")); + GTK_WIDGET_UNSET_FLAGS (button, GTK_RECEIVES_DEFAULT); + gtk_signal_connect (GTK_OBJECT (button), "clicked", + GTK_SIGNAL_FUNC (import_dialog_select_grad_callback), + (gpointer) image); + gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0); + gtk_widget_show (button); + + /* The action area */ + action_items[0].user_data = palette; + action_items[1].user_data = palette; + build_action_area (GTK_DIALOG (dialog), action_items, 2, 1); + + /* Fill with the selected gradient */ + palette_import_fill_grad_preview (image, curr_gradient); import_dialog->import_type = GRAD_IMPORT; return import_dialog; } - /* Stuff to keep dialog uptodate */ void -palette_import_image_new(GimpImage * gimage) +palette_import_image_new (GimpImage * gimage) { - if(!import_dialog) + if (!import_dialog) return; - if(!GTK_WIDGET_IS_SENSITIVE(import_dialog->image_menu_item_image)) + if (!GTK_WIDGET_IS_SENSITIVE (import_dialog->image_menu_item_image)) { - gtk_widget_set_sensitive(import_dialog->image_menu_item_image,TRUE); + gtk_widget_set_sensitive (import_dialog->image_menu_item_image, TRUE); return; } /* Now fill in the names if image menu shown */ - if(import_dialog->import_type == IMAGE_IMPORT) + if (import_dialog->import_type == IMAGE_IMPORT) { - import_image_menu_activate(TRUE,NULL); + import_image_menu_activate (TRUE, NULL); } } void -palette_import_image_destroyed(GimpImage* gimage) +palette_import_image_destroyed (GimpImage* gimage) { /* Now fill in the names if image menu shown */ - if(!import_dialog) + if (!import_dialog) return; - if(image_count() <= 1) + if (image_count() <= 1) { /* Back to gradient type */ - gtk_option_menu_set_history(GTK_OPTION_MENU(import_dialog->type_option),0); - import_grad_callback(NULL,NULL); - if(import_dialog->image_menu_item_image) - gtk_widget_set_sensitive(import_dialog->image_menu_item_image,FALSE); + gtk_option_menu_set_history (GTK_OPTION_MENU (import_dialog->type_option), 0); + import_grad_callback (NULL, NULL); + if (import_dialog->image_menu_item_image) + gtk_widget_set_sensitive (import_dialog->image_menu_item_image, FALSE); return; } - if(import_dialog->import_type == IMAGE_IMPORT) + if (import_dialog->import_type == IMAGE_IMPORT) { - import_image_menu_activate(TRUE,gimage); + import_image_menu_activate (TRUE, gimage); } } void -palette_import_image_renamed(GimpImage* gimage) +palette_import_image_renamed (GimpImage* gimage) { /* Now fill in the names if image menu shown */ if(import_dialog && import_dialog->import_type == IMAGE_IMPORT) { - import_image_menu_activate(TRUE,NULL); + import_image_menu_activate (TRUE, NULL); } } -struct _img_colours { +typedef struct _ImgColors ImgColors; + +struct _ImgColors +{ guint count; guint r_adj; guint g_adj; @@ -2968,153 +2939,162 @@ struct _img_colours { guchar b; }; -typedef struct _img_colours ImgColours, *ImgColoursP; -static int count_colour_entries = 0; +static gint count_color_entries = 0; static void -create_storted_list(gpointer key,gpointer value,gpointer user_data) +create_storted_list (gpointer key, + gpointer value, + gpointer user_data) { - GSList **sorted_list = (GSList**)user_data; - ImgColoursP colour_tab = (ImgColoursP)value; + GSList **sorted_list = (GSList**) user_data; + ImgColors *color_tab = (ImgColors *) value; - *sorted_list = g_slist_prepend(*sorted_list,colour_tab); + *sorted_list = g_slist_prepend (*sorted_list, color_tab); } static void -create_image_palette(gpointer data,gpointer user_data) +create_image_palette (gpointer data, + gpointer user_data) { - PaletteP palette = (PaletteP)user_data; - ImgColoursP colour_tab = (ImgColoursP)data; + PaletteDialog *palette = (PaletteDialog *) user_data; + ImgColors *color_tab = (ImgColors *) data; gint sample_sz; gchar *lab; - sample_sz = (gint)import_dialog->sample->value; + sample_sz = (gint) import_dialog->sample->value; - if(palette->entries->n_colors >= sample_sz) + if (palette->entries->n_colors >= sample_sz) return; - lab = g_strdup_printf("%s (occurs %u)",_("Untitled"),colour_tab->count); + lab = g_strdup_printf ("%s (occurs %u)", _("Untitled"), color_tab->count); - /* Adjust the colours to the mean of the the sample */ + /* Adjust the colors to the mean of the the sample */ palette_add_entry (palette->entries, lab, - (gint)colour_tab->r + (colour_tab->r_adj/colour_tab->count), - (gint)colour_tab->g + (colour_tab->g_adj/colour_tab->count), - (gint)colour_tab->b + (colour_tab->b_adj/colour_tab->count)); + (gint)color_tab->r + (color_tab->r_adj/color_tab->count), + (gint)color_tab->g + (color_tab->g_adj/color_tab->count), + (gint)color_tab->b + (color_tab->b_adj/color_tab->count)); } static gboolean -colour_print_remove(gpointer key,gpointer value,gpointer user_data) +color_print_remove (gpointer key, + gpointer value, + gpointer user_data) { - g_free(value); + g_free (value); + return TRUE; } static gint -sort_colours (gconstpointer a,gconstpointer b) +sort_colors (gconstpointer a, + gconstpointer b) { - ImgColoursP s1 = (ImgColoursP) a; - ImgColoursP s2 = (ImgColoursP) b; + ImgColors *s1 = (ImgColors *) a; + ImgColors *s2 = (ImgColors *) b; if(s1->count > s2->count) return -1; if(s1->count < s2->count) return 1; + return 0; } static void -import_image_make_palette(GHashTable *h_array,guchar *name, PaletteP palette) +import_image_make_palette (GHashTable *h_array, + guchar *name, + PaletteDialog *palette) { GSList * sorted_list = NULL; PaletteEntriesP entries; - g_hash_table_foreach(h_array,create_storted_list,&sorted_list); - sorted_list = g_slist_sort(sorted_list,sort_colours); + g_hash_table_foreach (h_array, create_storted_list, &sorted_list); + sorted_list = g_slist_sort (sorted_list, sort_colors); - entries = palette_create_entries(palette,name); - g_slist_foreach(sorted_list,create_image_palette,palette); + entries = palette_create_entries (palette, name); + g_slist_foreach (sorted_list, create_image_palette, palette); /* Free up used memory */ /* Note the same structure is on both the hash list and the sorted * list. So only delete it once. */ - g_hash_table_freeze(h_array); - g_hash_table_foreach_remove(h_array,colour_print_remove,NULL); - g_hash_table_thaw(h_array); - g_hash_table_destroy(h_array); - g_slist_free(sorted_list); + g_hash_table_freeze (h_array); + g_hash_table_foreach_remove (h_array, color_print_remove, NULL); + g_hash_table_thaw (h_array); + g_hash_table_destroy (h_array); + g_slist_free (sorted_list); /* Redraw with new palette */ - palette_update_small_preview(palette); - redraw_palette(palette); + palette_update_small_preview (palette); + redraw_palette (palette); /* Update other selectors on screen */ - palette_select_clist_insert_all(entries); - palette_select2_clist_insert_all(entries); - palette_scroll_clist_to_current(palette); + palette_select_clist_insert_all (entries); + palette_select2_clist_insert_all (entries); + palette_scroll_clist_to_current (palette); } static GHashTable * -store_colours(GHashTable *h_array, - guchar * colours, - guchar * colours_real, - gint sample_sz) +store_colors (GHashTable *h_array, + guchar *colors, + guchar *colors_real, + gint sample_sz) { - gpointer found_colour = NULL; - ImgColoursP new_colour; - guint key_colours = colours[0]*256*256+colours[1]*256+colours[2]; + gpointer found_color = NULL; + ImgColors *new_color; + guint key_colors = colors[0]*256*256+colors[1]*256+colors[2]; if(h_array == NULL) { - h_array = g_hash_table_new(g_direct_hash,g_direct_equal); - count_colour_entries = 0; + h_array = g_hash_table_new (g_direct_hash, g_direct_equal); + count_color_entries = 0; } else { - found_colour = g_hash_table_lookup(h_array,(gpointer)key_colours); + found_color = g_hash_table_lookup (h_array, (gpointer) key_colors); } - if(found_colour == NULL) + if (found_color == NULL) { - if(count_colour_entries > MAX_IMAGE_COLOURS) + if (count_color_entries > MAX_IMAGE_COLORS) { /* Don't add any more new ones */ return h_array; } - count_colour_entries++; + count_color_entries++; - new_colour = g_new(ImgColours,1); + new_color = g_new (ImgColors, 1); - new_colour->count = 1; - new_colour->r_adj = 0; - new_colour->g_adj = 0; - new_colour->b_adj = 0; - new_colour->r = colours[0]; - new_colour->g = colours[1]; - new_colour->b = colours[2]; + new_color->count = 1; + new_color->r_adj = 0; + new_color->g_adj = 0; + new_color->b_adj = 0; + new_color->r = colors[0]; + new_color->g = colors[1]; + new_color->b = colors[2]; - g_hash_table_insert(h_array,(gpointer)key_colours,new_colour); + g_hash_table_insert (h_array, (gpointer) key_colors, new_color); } else { - new_colour = (ImgColoursP)found_colour; - if(new_colour->count < (G_MAXINT - 1)) - new_colour->count++; + new_color = (ImgColors *) found_color; + if(new_color->count < (G_MAXINT - 1)) + new_color->count++; /* Now do the adjustments ...*/ - new_colour->r_adj += (colours_real[0] - colours[0]); - new_colour->g_adj += (colours_real[1] - colours[1]); - new_colour->b_adj += (colours_real[2] - colours[2]); + new_color->r_adj += (colors_real[0] - colors[0]); + new_color->g_adj += (colors_real[1] - colors[1]); + new_color->b_adj += (colors_real[2] - colors[2]); /* Boundary conditions */ - if(new_colour->r_adj > (G_MAXINT - 255)) - new_colour->r_adj /= new_colour->count; + if(new_color->r_adj > (G_MAXINT - 255)) + new_color->r_adj /= new_color->count; - if(new_colour->g_adj > (G_MAXINT - 255)) - new_colour->g_adj /= new_colour->count; + if(new_color->g_adj > (G_MAXINT - 255)) + new_color->g_adj /= new_color->count; - if(new_colour->b_adj > (G_MAXINT - 255)) - new_colour->b_adj /= new_colour->count; + if(new_color->b_adj > (G_MAXINT - 255)) + new_color->b_adj /= new_color->count; } @@ -3122,26 +3102,28 @@ store_colours(GHashTable *h_array, } static void -import_palette_create_from_image (GImage *gimage,guchar *pname,PaletteP palette) +import_palette_create_from_image (GImage *gimage, + guchar *pname, + PaletteDialog *palette) { PixelRegion imagePR; - unsigned char *image_data; - unsigned char *idata; - guchar rgb[MAX_CHANNELS]; - guchar rgb_real[MAX_CHANNELS]; - int has_alpha, indexed; - int width, height; - int bytes, alpha; - int i, j; + guchar *image_data; + guchar *idata; + guchar rgb[MAX_CHANNELS]; + guchar rgb_real[MAX_CHANNELS]; + gint has_alpha, indexed; + gint width, height; + gint bytes, alpha; + gint i, j; void * pr; - int d_type; + gint d_type; GHashTable *store_array = NULL; gint sample_sz; gint threshold = 1; - sample_sz = (gint)import_dialog->sample->value; + sample_sz = (gint) import_dialog->sample->value; - if(gimage == NULL) + if (gimage == NULL) return; /* Get the image information */ @@ -3153,17 +3135,20 @@ import_palette_create_from_image (GImage *gimage,guchar *pname,PaletteP palette) indexed = d_type == INDEXEDA_GIMAGE || d_type == INDEXED_GIMAGE; width = gimage->width; height = gimage->height; - pixel_region_init (&imagePR, gimage_composite (gimage), 0, 0, width, height, FALSE); + pixel_region_init (&imagePR, gimage_composite (gimage), 0, 0, + width, height, FALSE); alpha = bytes - 1; - threshold = (gint)import_dialog->threshold->value; + threshold = (gint) import_dialog->threshold->value; if(threshold < 1) threshold = 1; /* iterate over the entire image */ - for (pr = pixel_regions_register (1, &imagePR); pr != NULL; pr = pixel_regions_process (pr)) + for (pr = pixel_regions_register (1, &imagePR); + pr != NULL; + pr = pixel_regions_process (pr)) { image_data = imagePR.data; @@ -3175,13 +3160,14 @@ import_palette_create_from_image (GImage *gimage,guchar *pname,PaletteP palette) { /* Get the rgb values for the color */ gimage_get_color (gimage, d_type, rgb, idata); - memcpy(rgb_real,rgb,MAX_CHANNELS); /* Structure copy */ + memcpy (rgb_real, rgb, MAX_CHANNELS); /* Structure copy */ - rgb[0] = (rgb[0]/threshold)*threshold; - rgb[1] = (rgb[1]/threshold)*threshold; - rgb[2] = (rgb[2]/threshold)*threshold; + rgb[0] = (rgb[0] / threshold) * threshold; + rgb[1] = (rgb[1] / threshold) * threshold; + rgb[2] = (rgb[2] / threshold) * threshold; - store_array = store_colours(store_array,rgb,rgb_real,sample_sz); + store_array = + store_colors (store_array, rgb, rgb_real, sample_sz); idata += bytes; } @@ -3191,6 +3177,5 @@ import_palette_create_from_image (GImage *gimage,guchar *pname,PaletteP palette) } /* Make palette from the store_array */ - import_image_make_palette(store_array,pname,palette); + import_image_make_palette (store_array, pname, palette); } - diff --git a/app/tools/color_picker.c b/app/tools/color_picker.c index cfab77fd6d..c6c4d127a7 100644 --- a/app/tools/color_picker.c +++ b/app/tools/color_picker.c @@ -15,8 +15,6 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#include -#include #include "appenv.h" #include "actionarea.h" #include "color_picker.h" @@ -42,46 +40,45 @@ struct _ColorPickerOptions { ToolOptions tool_options; - int sample_merged; - int sample_merged_d; + gint sample_merged; + gint sample_merged_d; GtkWidget *sample_merged_w; - int sample_average; - int sample_average_d; + gint sample_average; + gint sample_average_d; GtkWidget *sample_average_w; - double average_radius; - double average_radius_d; + gdouble average_radius; + gdouble average_radius_d; GtkObject *average_radius_w; }; -typedef struct _ColourPickerTool ColourPickerTool; -struct _ColourPickerTool +typedef struct _ColorPickerTool ColorPickerTool; +struct _ColorPickerTool { - DrawCore * core; /* Core select object */ + DrawCore *core; /* Core select object */ - int centerx; /* starting x coord */ - int centery; /* starting y coord */ + gint centerx; /* starting x coord */ + gint centery; /* starting y coord */ }; /* the color picker tool options */ static ColorPickerOptions * color_picker_options = NULL; /* the color value */ -int col_value[5] = { 0, 0, 0, 0, 0 }; +gint col_value[5] = { 0, 0, 0, 0, 0 }; /* the color picker dialog */ -static GimpDrawable * active_drawable; -static int update_type; -static int sample_type; +static gint update_type; +static gint sample_type; static InfoDialog * color_picker_info = NULL; -static char red_buf [MAX_INFO_BUF]; -static char green_buf [MAX_INFO_BUF]; -static char blue_buf [MAX_INFO_BUF]; -static char alpha_buf [MAX_INFO_BUF]; -static char index_buf [MAX_INFO_BUF]; -static char gray_buf [MAX_INFO_BUF]; -static char hex_buf [MAX_INFO_BUF]; +static gchar red_buf [MAX_INFO_BUF]; +static gchar green_buf [MAX_INFO_BUF]; +static gchar blue_buf [MAX_INFO_BUF]; +static gchar alpha_buf [MAX_INFO_BUF]; +static gchar index_buf [MAX_INFO_BUF]; +static gchar gray_buf [MAX_INFO_BUF]; +static gchar hex_buf [MAX_INFO_BUF]; /* local function prototypes */ @@ -93,7 +90,7 @@ static void color_picker_cursor_update (Tool *, GdkEventMotion *, gpointer); static void color_picker_control (Tool *, ToolAction, gpointer); static void color_picker_info_window_close_callback (GtkWidget *, gpointer); -static void color_picker_info_update (Tool *, int); +static void color_picker_info_update (Tool *, gboolean); /* functions */ @@ -123,7 +120,7 @@ color_picker_options_new (void) GtkWidget *scale; /* the new color picker tool options structure */ - options = (ColorPickerOptions *) g_malloc (sizeof (ColorPickerOptions)); + options = g_new (ColorPickerOptions, 1); tool_options_init ((ToolOptions *) options, _("Color Picker Options"), color_picker_options_reset); @@ -201,8 +198,8 @@ color_picker_button_press (Tool *tool, gpointer gdisp_ptr) { GDisplay * gdisp; - ColourPickerTool *cp_tool; - int x, y; + ColorPickerTool *cp_tool; + gint x, y; static ActionAreaItem action_items[] = { @@ -210,23 +207,20 @@ color_picker_button_press (Tool *tool, }; gdisp = (GDisplay *) gdisp_ptr; - cp_tool = (ColourPickerTool *) tool->private; + cp_tool = (ColorPickerTool *) tool->private; - /* If this is the first invocation of the tool, or a different gdisplay, - * create (or recreate) the info dialog... - */ - if (tool->state == INACTIVE || gdisp_ptr != tool->gdisp_ptr || - active_drawable != gimage_active_drawable (gdisp->gimage)) - { - /* if the dialog exists, free it */ - if (color_picker_info) - info_dialog_free (color_picker_info); + /* Make the tool active and set it's gdisplay & drawable */ + tool->gdisp_ptr = gdisp; + tool->drawable = gimage_active_drawable (gdisp->gimage); + tool->state = ACTIVE; + /* create the info dialog if it doesn't exist */ + if (! color_picker_info) + { color_picker_info = info_dialog_new (_("Color Picker")); - active_drawable = gimage_active_drawable (gdisp->gimage); /* if the gdisplay is for a color image, the dialog must have RGB */ - switch (drawable_type (active_drawable)) + switch (drawable_type (tool->drawable)) { case RGB_GIMAGE: case RGBA_GIMAGE: info_dialog_add_label (color_picker_info, _("Red:"), red_buf); @@ -271,38 +265,36 @@ color_picker_button_press (Tool *tool, GDK_BUTTON_RELEASE_MASK), NULL, NULL, bevent->time); - /* Make the tool active and set the gdisplay which owns it */ - tool->gdisp_ptr = gdisp_ptr; - tool->state = ACTIVE; - /* First, transform the coordinates to gimp image space */ - gdisplay_untransform_coords (gdisp, bevent->x, bevent->y, &x, &y, FALSE, FALSE); + gdisplay_untransform_coords (gdisp, bevent->x, bevent->y, &x, &y, + FALSE, FALSE); /* if the shift key is down, create a new color. * otherwise, modify the current color. */ if (bevent->state & GDK_SHIFT_MASK) { - color_picker_info_update (tool, pick_color (gdisp->gimage, active_drawable, x, y, - color_picker_options->sample_merged, - color_picker_options->sample_average, - color_picker_options->average_radius, - COLOR_NEW)); + color_picker_info_update (tool, + pick_color (gdisp->gimage, tool->drawable, x, y, + color_picker_options->sample_merged, + color_picker_options->sample_average, + color_picker_options->average_radius, + COLOR_NEW)); update_type = COLOR_UPDATE_NEW; } else { - color_picker_info_update (tool, pick_color (gdisp->gimage, active_drawable, x, y, - color_picker_options->sample_merged, - color_picker_options->sample_average, - color_picker_options->average_radius, - COLOR_UPDATE)); + color_picker_info_update (tool, + pick_color (gdisp->gimage, tool->drawable, x, y, + color_picker_options->sample_merged, + color_picker_options->sample_average, + color_picker_options->average_radius, + COLOR_UPDATE)); update_type = COLOR_UPDATE; } - /* Start drawing the colourpicker tool */ + /* Start drawing the colorpicker tool */ draw_core_start (cp_tool->core, gdisp->canvas->window, tool); - } static void @@ -311,22 +303,24 @@ color_picker_button_release (Tool *tool, gpointer gdisp_ptr) { GDisplay *gdisp; - ColourPickerTool *cp_tool; - int x, y; + ColorPickerTool *cp_tool; + gint x, y; gdk_pointer_ungrab (bevent->time); gdk_flush (); gdisp = (GDisplay *) gdisp_ptr; - cp_tool = (ColourPickerTool *) tool->private; + cp_tool = (ColorPickerTool *) tool->private; /* First, transform the coordinates to gimp image space */ - gdisplay_untransform_coords (gdisp, bevent->x, bevent->y, &x, &y, FALSE, FALSE); + gdisplay_untransform_coords (gdisp, bevent->x, bevent->y, &x, &y, + FALSE, FALSE); - color_picker_info_update (tool, pick_color (gdisp->gimage, active_drawable, x, y, - color_picker_options->sample_merged, - color_picker_options->sample_average, - color_picker_options->average_radius, - update_type)); + color_picker_info_update (tool, + pick_color (gdisp->gimage, tool->drawable, x, y, + color_picker_options->sample_merged, + color_picker_options->sample_average, + color_picker_options->average_radius, + update_type)); draw_core_stop (cp_tool->core, tool); tool->state = INACTIVE; @@ -338,25 +332,30 @@ color_picker_motion (Tool *tool, gpointer gdisp_ptr) { GDisplay *gdisp; - ColourPickerTool *cp_tool; + ColorPickerTool *cp_tool; int x, y; gdisp = (GDisplay *) gdisp_ptr; - cp_tool = (ColourPickerTool *) tool->private; + cp_tool = (ColorPickerTool *) tool->private; /* undraw the current tool */ draw_core_pause (cp_tool->core, tool); /* First, transform the coordinates to gimp image space */ - gdisplay_untransform_coords (gdisp, mevent->x, mevent->y, &x, &y, FALSE, FALSE); + gdisplay_untransform_coords (gdisp, mevent->x, mevent->y, &x, &y, + FALSE, FALSE); - gdisplay_untransform_coords (gdisp, mevent->x, mevent->y, &cp_tool->centerx, &cp_tool->centery, FALSE, TRUE); + gdisplay_untransform_coords (gdisp, mevent->x, mevent->y, + &cp_tool->centerx, &cp_tool->centery, + FALSE, TRUE); + + color_picker_info_update (tool, + pick_color (gdisp->gimage, tool->drawable, x, y, + color_picker_options->sample_merged, + color_picker_options->sample_average, + color_picker_options->average_radius, + update_type)); - color_picker_info_update (tool, pick_color (gdisp->gimage, active_drawable, x, y, - color_picker_options->sample_merged, - color_picker_options->sample_average, - color_picker_options->average_radius, - update_type)); /* redraw the current tool */ draw_core_resume (cp_tool->core, tool); } @@ -371,7 +370,9 @@ color_picker_cursor_update (Tool *tool, gdisp = (GDisplay *) gdisp_ptr; - gdisplay_untransform_coords (gdisp, mevent->x, mevent->y, &x, &y, FALSE, FALSE); + gdisplay_untransform_coords (gdisp, mevent->x, mevent->y, &x, &y, + FALSE, FALSE); + if (gimage_pick_correlate_layer (gdisp->gimage, x, y)) gdisplay_install_tool_cursor (gdisp, GIMP_COLOR_PICKER_CURSOR); else @@ -383,9 +384,9 @@ color_picker_control (Tool *tool, ToolAction action, gpointer gdisp_ptr) { - ColourPickerTool * cp_tool; + ColorPickerTool * cp_tool; - cp_tool = (ColourPickerTool *) tool->private; + cp_tool = (ColorPickerTool *) tool->private; switch (action) { @@ -408,20 +409,20 @@ color_picker_control (Tool *tool, typedef guchar * (*GetColorFunc) (GtkObject *, int, int); -int -pick_color (GimpImage *gimage, +gboolean +pick_color (GimpImage *gimage, GimpDrawable *drawable, - int x, - int y, - gboolean sample_merged, - gboolean sample_average, - double average_radius, - int final) + gint x, + gint y, + gboolean sample_merged, + gboolean sample_average, + gdouble average_radius, + gint final) { guchar *color; - int offx, offy; - int has_alpha; - int is_indexed; + gint offx, offy; + gint has_alpha; + gint is_indexed; GetColorFunc get_color_func; GtkObject *get_color_obj; @@ -456,11 +457,11 @@ pick_color (GimpImage *gimage, if (sample_average) { - int i, j; - int count = 0; - int color_avg[4] = { 0, 0, 0, 0 }; + gint i, j; + gint count = 0; + gint color_avg[4] = { 0, 0, 0, 0 }; guchar *tmp_color; - int radius = (int) average_radius; + gint radius = (gint) average_radius; for (i = x - radius; i <= x + radius; i++) for (j = y - radius; j <= y + radius; j++) @@ -496,70 +497,70 @@ pick_color (GimpImage *gimage, palette_set_active_color (col_value [RED_PIX], col_value [GREEN_PIX], col_value [BLUE_PIX], final); - g_free(color); + g_free (color); return TRUE; } static void -colourpicker_draw (Tool *tool) +colorpicker_draw (Tool *tool) { GDisplay * gdisp; - ColourPickerTool * cp_tool; - int tx, ty; - int radiusx,radiusy; - int cx,cy; + ColorPickerTool * cp_tool; + gint tx, ty; + gint radiusx, radiusy; + gint cx, cy; if(!color_picker_options->sample_average) return; gdisp = (GDisplay *) tool->gdisp_ptr; - cp_tool = (ColourPickerTool *) tool->private; + cp_tool = (ColorPickerTool *) tool->private; gdisplay_transform_coords (gdisp, cp_tool->centerx, cp_tool->centery, - &tx, &ty, 1); + &tx, &ty, TRUE); - radiusx = SCALEX(gdisp,color_picker_options->average_radius); - radiusy = SCALEY(gdisp,color_picker_options->average_radius); - cx = SCALEX(gdisp,1); - cy = SCALEY(gdisp,1); + radiusx = SCALEX (gdisp, color_picker_options->average_radius); + radiusy = SCALEY (gdisp, color_picker_options->average_radius); + cx = SCALEX (gdisp, 1); + cy = SCALEY (gdisp, 1); /* Draw the circle around the collecting area */ - gdk_draw_rectangle(cp_tool->core->win, cp_tool->core->gc, 0, - tx - radiusx, - ty - radiusy, - 2*radiusx+cx, 2*radiusy+cy); + gdk_draw_rectangle (cp_tool->core->win, cp_tool->core->gc, 0, + tx - radiusx, + ty - radiusy, + 2 * radiusx + cx, 2 * radiusy + cy); if(radiusx > 1 && radiusy > 1) { - gdk_draw_rectangle(cp_tool->core->win, cp_tool->core->gc, 0, - tx - radiusx+2, - ty - radiusy+2, - 2*radiusx+cx-4, 2*radiusy+cy-4); + gdk_draw_rectangle (cp_tool->core->win, cp_tool->core->gc, 0, + tx - radiusx + 2, + ty - radiusy + 2, + 2 * radiusx + cx - 4, 2 * radiusy + cy - 4); } } static void -color_picker_info_update (Tool *tool, - int valid) +color_picker_info_update (Tool *tool, + gboolean valid) { if (!valid) { - g_snprintf (red_buf, MAX_INFO_BUF, _("N/A")); + g_snprintf (red_buf, MAX_INFO_BUF, _("N/A")); g_snprintf (green_buf, MAX_INFO_BUF, _("N/A")); - g_snprintf (blue_buf, MAX_INFO_BUF, _("N/A")); + g_snprintf (blue_buf, MAX_INFO_BUF, _("N/A")); g_snprintf (alpha_buf, MAX_INFO_BUF, _("N/A")); g_snprintf (index_buf, MAX_INFO_BUF, _("N/A")); - g_snprintf (gray_buf, MAX_INFO_BUF, _("N/A")); - g_snprintf (hex_buf, MAX_INFO_BUF, _("N/A")); + g_snprintf (gray_buf, MAX_INFO_BUF, _("N/A")); + g_snprintf (hex_buf, MAX_INFO_BUF, _("N/A")); } else { switch (sample_type) { case RGB_GIMAGE: case RGBA_GIMAGE: - g_snprintf (red_buf, MAX_INFO_BUF, "%d", col_value [RED_PIX]); + g_snprintf (red_buf, MAX_INFO_BUF, "%d", col_value [RED_PIX]); g_snprintf (green_buf, MAX_INFO_BUF, "%d", col_value [GREEN_PIX]); - g_snprintf (blue_buf, MAX_INFO_BUF, "%d", col_value [BLUE_PIX]); + g_snprintf (blue_buf, MAX_INFO_BUF, "%d", col_value [BLUE_PIX]); if (sample_type == RGBA_GIMAGE) g_snprintf (alpha_buf, MAX_INFO_BUF, "%d", col_value [ALPHA_PIX]); else @@ -576,10 +577,10 @@ color_picker_info_update (Tool *tool, g_snprintf (alpha_buf, MAX_INFO_BUF, "%d", col_value [ALPHA_PIX]); else g_snprintf (alpha_buf, MAX_INFO_BUF, _("N/A")); - g_snprintf (red_buf, MAX_INFO_BUF, "%d", col_value [RED_PIX]); + g_snprintf (red_buf, MAX_INFO_BUF, "%d", col_value [RED_PIX]); g_snprintf (green_buf, MAX_INFO_BUF, "%d", col_value [GREEN_PIX]); - g_snprintf (blue_buf, MAX_INFO_BUF, "%d", col_value [BLUE_PIX]); - g_snprintf (hex_buf, MAX_INFO_BUF, "#%.2x%.2x%.2x", + g_snprintf (blue_buf, MAX_INFO_BUF, "%d", col_value [BLUE_PIX]); + g_snprintf (hex_buf, MAX_INFO_BUF, "#%.2x%.2x%.2x", col_value [RED_PIX], col_value [GREEN_PIX], col_value [BLUE_PIX]); @@ -603,11 +604,18 @@ color_picker_info_update (Tool *tool, info_dialog_popup (color_picker_info); } +static void +color_picker_info_window_close_callback (GtkWidget *widget, + gpointer client_data) +{ + info_dialog_popdown ((InfoDialog *) client_data); +} + Tool * tools_new_color_picker () { Tool * tool; - ColourPickerTool * private; + ColorPickerTool * private; /* The tool options */ if (! color_picker_options) @@ -617,9 +625,11 @@ tools_new_color_picker () } tool = tools_new_tool (COLOR_PICKER); - private = (ColourPickerTool *) g_malloc(sizeof(ColourPickerTool)); + private = g_new (ColorPickerTool, 1); + + private->core = draw_core_new (colorpicker_draw); - private->core = draw_core_new (colourpicker_draw); + tool->preserve = FALSE; /* Don't preserve on drawable change */ tool->private = (void *) private; @@ -635,9 +645,9 @@ tools_new_color_picker () void tools_free_color_picker (Tool *tool) { - ColourPickerTool * cp_tool; + ColorPickerTool * cp_tool; - cp_tool = (ColourPickerTool *) tool->private; + cp_tool = (ColorPickerTool *) tool->private; if (tool->state == ACTIVE) draw_core_stop (cp_tool->core, tool); @@ -652,10 +662,3 @@ tools_free_color_picker (Tool *tool) g_free (cp_tool); } - -static void -color_picker_info_window_close_callback (GtkWidget *widget, - gpointer client_data) -{ - info_dialog_popdown ((InfoDialog *) client_data); -} diff --git a/app/tools/color_picker.h b/app/tools/color_picker.h index fe417be31c..c15cf9941e 100644 --- a/app/tools/color_picker.h +++ b/app/tools/color_picker.h @@ -22,12 +22,18 @@ #include "gimpdrawableF.h" #include "tools.h" -int pick_color (GimpImage *, GimpDrawable *, int , int, - gboolean, gboolean, double, int); +gboolean pick_color (GimpImage *gimage, + GimpDrawable *drawable, + gint x, + gint y, + gboolean sample_merged, + gboolean sample_average, + double average_radius, + gint final); -Tool * tools_new_color_picker (void); -void tools_free_color_picker (Tool *); +Tool * tools_new_color_picker (void); +void tools_free_color_picker (Tool *tool); -extern int col_value[5]; +extern gint col_value[5]; #endif /* __COLOR_PICKER_H__ */ diff --git a/app/tools/gimpinktool.c b/app/tools/gimpinktool.c index 59de8a9a9d..eeb0b1ddda 100644 --- a/app/tools/gimpinktool.c +++ b/app/tools/gimpinktool.c @@ -622,13 +622,7 @@ brush_widget_button_press (GtkWidget *widget, { brush_widget->state = TRUE; - /* theoretically, this should work. Dunno why it doesn't --Michael - gdk_pointer_grab (brush_widget->widget->window, TRUE, - GDK_POINTER_MOTION_HINT_MASK | - GDK_BUTTON1_MOTION_MASK | - GDK_BUTTON_RELEASE_MASK, - NULL, NULL, event->time); - */ + gtk_grab_add (brush_widget->widget); } } @@ -639,9 +633,7 @@ brush_widget_button_release (GtkWidget *widget, { brush_widget->state = FALSE; - /* - gdk_pointer_ungrab (event->time); - */ + gtk_grab_remove (brush_widget->widget); } static void diff --git a/app/tools/ink.c b/app/tools/ink.c index 59de8a9a9d..eeb0b1ddda 100644 --- a/app/tools/ink.c +++ b/app/tools/ink.c @@ -622,13 +622,7 @@ brush_widget_button_press (GtkWidget *widget, { brush_widget->state = TRUE; - /* theoretically, this should work. Dunno why it doesn't --Michael - gdk_pointer_grab (brush_widget->widget->window, TRUE, - GDK_POINTER_MOTION_HINT_MASK | - GDK_BUTTON1_MOTION_MASK | - GDK_BUTTON_RELEASE_MASK, - NULL, NULL, event->time); - */ + gtk_grab_add (brush_widget->widget); } } @@ -639,9 +633,7 @@ brush_widget_button_release (GtkWidget *widget, { brush_widget->state = FALSE; - /* - gdk_pointer_ungrab (event->time); - */ + gtk_grab_remove (brush_widget->widget); } static void diff --git a/app/widgets/gimpgradienteditor.c b/app/widgets/gimpgradienteditor.c index 01cb35da0a..e8752b2553 100644 --- a/app/widgets/gimpgradienteditor.c +++ b/app/widgets/gimpgradienteditor.c @@ -19,7 +19,6 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - /* alt: Added previews and some other buttons to gradient dialog. * * hof: Hofer Wolfgang, 1998.01.27 avoid resize bug by keeping @@ -38,7 +37,6 @@ * Many thanks to Eiichi and Marcelo for their suggestions! */ - /* Release date: 1997/05/07 * * - Added accelerator keys for the popup functions. This allows for @@ -52,7 +50,6 @@ * - Added grad_dump_gradient(); it is useful for debugging. */ - /* Release date: 1997/04/30 * * - All `dangerous' dialogs now de-sensitize the main editor window. @@ -67,7 +64,6 @@ * for debugging). */ - /* Release date: 1997/04/22 * * - Added GtkRadioMenuItems to the blending and coloring pop-up @@ -81,7 +77,6 @@ * know why nobody killed me for not having done it before. */ - /* Release date: 1997/04/21 * * - Re-wrote the old pop-up menu code, which was *horrible*. The @@ -104,7 +99,6 @@ * them. */ - /* Special thanks to: * * Luis Albarran (luis4@mindspring.com) - Nice UI suggestions @@ -119,7 +113,6 @@ * Everyone on #gimp - many suggestions */ - /* TODO: * * - Fix memory leaks: grad_free_gradient_editor() and any others @@ -174,6 +167,9 @@ #include "libgimp/gimpintl.h" +#include "pixmaps/zoom_in.xpm" +#include "pixmaps/zoom_out.xpm" + /***** Magic numbers *****/ #ifndef M_PI @@ -193,9 +189,9 @@ static GtkWidget *ed_create_button (gchar *label, static void ed_fetch_foreground (double *fg_r, double *fg_g, double *fg_b, double *fg_a); -static void ed_update_editor (int flags); +static void ed_update_editor (int flags); -static void ed_set_hint (char *str); +static void ed_set_hint (gchar *str); static void ed_list_item_update (GtkWidget *widget, @@ -206,14 +202,13 @@ static void ed_list_item_update (GtkWidget *widget, static void ed_initialize_saved_colors (void); -static gint ed_delete_callback (GtkWidget *, GdkEvent *, gpointer); -static void ed_close_callback (GtkWidget *, gpointer); +/* Main dialog button callbacks & functions */ -static void ed_new_gradient_callback (GtkWidget *, gpointer); -static void ed_do_new_gradient_callback (GtkWidget *, gpointer , gpointer); +static void ed_new_gradient_callback (GtkWidget *, gpointer); +static void ed_do_new_gradient_callback (GtkWidget *, gpointer , gpointer); -static void ed_copy_gradient_callback (GtkWidget *, gpointer); -static void ed_do_copy_gradient_callback (GtkWidget *, gpointer , gpointer); +static void ed_copy_gradient_callback (GtkWidget *, gpointer); +static void ed_do_copy_gradient_callback (GtkWidget *, gpointer , gpointer); static void ed_delete_gradient_callback (GtkWidget *, gpointer); static void ed_do_delete_gradient_callback (GtkWidget *, gpointer); @@ -224,12 +219,18 @@ static gint ed_delete_delete_gradient_callback (GtkWidget *, GdkEvent *, static void ed_rename_gradient_callback (GtkWidget *, gpointer); static void ed_do_rename_gradient_callback (GtkWidget *, gpointer, gpointer); -static void ed_save_pov_callback (GtkWidget *, gpointer); -static void ed_do_save_pov_callback (GtkWidget *, gpointer); -static void ed_cancel_save_pov_callback (GtkWidget *, gpointer); +static void ed_save_pov_callback (GtkWidget *, gpointer); +static void ed_do_save_pov_callback (GtkWidget *, gpointer); +static void ed_cancel_save_pov_callback (GtkWidget *, gpointer); +static gint ed_delete_save_pov_callback (GtkWidget *, GdkEvent *, gpointer); -static void ed_save_grads_callback (GtkWidget *, gpointer); -static void ed_refresh_grads_callback (GtkWidget *, gpointer); +static void ed_save_grads_callback (GtkWidget *, gpointer); +static void ed_refresh_grads_callback (GtkWidget *, gpointer); + +static gint ed_delete_callback (GtkWidget *, GdkEvent *, gpointer); +static void ed_close_callback (GtkWidget *, gpointer); + +/* Zoom, scrollbar & instant update callbacks */ static void ed_scrollbar_update (GtkAdjustment *, gpointer); static void ed_zoom_all_callback (GtkWidget *, gpointer); @@ -239,354 +240,421 @@ static void ed_instant_update_update (GtkWidget *, gpointer); /* Gradient preview functions */ -static gint prev_events(GtkWidget *widget, GdkEvent *event); -static void prev_set_hint(gint x); +static gint prev_events (GtkWidget *, GdkEvent *, gpointer); +static void prev_set_hint (gint x); static void prev_set_foreground (gint x); static void prev_set_background (gint x); -static void prev_update(int recalculate); -static void prev_fill_image(int width, int height, double left, double right); +static void prev_update (gboolean recalculate); +static void prev_fill_image (int width, int height, + double left, double right); /* Gradient control functions */ -static gint control_events(GtkWidget *widget, GdkEvent *event); -static void control_do_hint(gint x, gint y); -static void control_button_press(gint x, gint y, guint button, guint state); -static int control_point_in_handle(gint x, gint y, grad_segment_t *seg, control_drag_mode_t handle); -static void control_select_single_segment(grad_segment_t *seg); -static void control_extend_selection(grad_segment_t *seg, double pos); -static void control_motion(gint x); - -static void control_compress_left(grad_segment_t *range_l, grad_segment_t *range_r, - grad_segment_t *drag_seg, double pos); -static void control_compress_range(grad_segment_t *range_l, grad_segment_t *range_r, - double new_l, double new_r); - -static double control_move(grad_segment_t *range_l, grad_segment_t *range_r, double delta); - -static void control_update(int recalculate); -static void control_draw(GdkPixmap *pixmap, int width, int height, double left, double right); -static void control_draw_normal_handle(GdkPixmap *pixmap, double pos, int height); -static void control_draw_middle_handle(GdkPixmap *pixmap, double pos, int height); -static void control_draw_handle(GdkPixmap *pixmap, GdkGC *border_gc, GdkGC *fill_gc, int xpos, int height); -static int control_calc_p_pos(double pos); -static double control_calc_g_pos(int pos); +static gint control_events (GtkWidget *, GdkEvent *, gpointer); +static void control_do_hint (gint x, gint y); +static void control_button_press (gint x, gint y, + guint button, guint state); +static int control_point_in_handle (gint x, gint y, grad_segment_t *seg, + control_drag_mode_t handle); +static void control_select_single_segment (grad_segment_t *seg); +static void control_extend_selection (grad_segment_t *seg, double pos); +static void control_motion (gint x); + +static void control_compress_left (grad_segment_t *range_l, + grad_segment_t *range_r, + grad_segment_t *drag_seg, + double pos); +static void control_compress_range (grad_segment_t *range_l, + grad_segment_t *range_r, + double new_l, double new_r); + +static double control_move (grad_segment_t *range_l, + grad_segment_t *range_r, + double delta); + +/* Control update/redraw functions */ + +static void control_update (gboolean recalculate); +static void control_draw (GdkPixmap *pixmap, + int width, int height, + double left, double right); +static void control_draw_normal_handle (GdkPixmap *pixmap, + double pos, int height); +static void control_draw_middle_handle (GdkPixmap *pixmap, + double pos, int height); +static void control_draw_handle (GdkPixmap *pixmap, + GdkGC *border_gc, GdkGC *fill_gc, + int xpos, int height); + +static int control_calc_p_pos (double pos); +static double control_calc_g_pos (int pos); /* Control popup functions */ -static void cpopup_create_main_menu(void); -static void cpopup_do_popup(void); -static GtkWidget *cpopup_create_color_item(GtkWidget **color_box, GtkWidget **label); -static void cpopup_adjust_menus(void); -static void cpopup_adjust_blending_menu(void); -static void cpopup_adjust_coloring_menu(void); -static void cpopup_check_selection_params(int *equal_blending, int *equal_coloring); -static GtkWidget *cpopup_create_menu_item_with_label(char *str, GtkWidget **label); -static void cpopup_render_color_box(GtkPreview *preview, double r, double g, double b, double a); - -static GtkWidget *cpopup_create_load_menu(GtkWidget **color_boxes, GtkWidget **labels, - char *label1, char *label2, GtkSignalFunc callback, - gchar accel_key_0, guint8 accel_mods_0, - gchar accel_key_1, guint8 accel_mods_1, - gchar accel_key_2, guint8 accel_mods_2); -static GtkWidget *cpopup_create_save_menu(GtkWidget **color_boxes, GtkWidget **labels, GtkSignalFunc callback); -static void cpopup_update_saved_color(int n, double r, double g, double b, double a); -static void cpopup_load_left_callback(GtkWidget *widget, gpointer data); -static void cpopup_save_left_callback(GtkWidget *widget, gpointer data); -static void cpopup_load_right_callback(GtkWidget *widget, gpointer data); -static void cpopup_save_right_callback(GtkWidget *widget, gpointer data); - -static GtkWidget *cpopup_create_blending_menu(void); -static void cpopup_blending_callback(GtkWidget *widget, gpointer data); -static GtkWidget *cpopup_create_coloring_menu(void); -static void cpopup_coloring_callback(GtkWidget *widget, gpointer data); - -static GtkWidget *cpopup_create_sel_ops_menu(void); - -static void cpopup_blend_colors(GtkWidget *widget, gpointer data); -static void cpopup_blend_opacity(GtkWidget *widget, gpointer data); - -static void cpopup_set_color_selection_color(GtkColorSelection *cs, - double r, double g, double b, double a); -static void cpopup_get_color_selection_color(GtkColorSelection *cs, - double *r, double *g, double *b, double *a); - -static void cpopup_create_color_dialog(char *title, double r, double g, double b, double a, - GtkSignalFunc color_changed_callback, - GtkSignalFunc ok_callback, - GtkSignalFunc cancel_callback, - GtkSignalFunc delete_callback); - -static grad_segment_t *cpopup_save_selection(void); -static void cpopup_free_selection(grad_segment_t *seg); -static void cpopup_replace_selection(grad_segment_t *replace_seg); - -static void cpopup_set_left_color_callback(GtkWidget *widget, gpointer data); -static void cpopup_left_color_changed(GtkWidget *widget, gpointer client_data); -static void cpopup_left_color_dialog_ok(GtkWidget *widget, gpointer client_data); -static void cpopup_left_color_dialog_cancel(GtkWidget *widget, gpointer client_data); -static int cpopup_left_color_dialog_delete(GtkWidget *widget, GdkEvent *event, gpointer data); -static void cpopup_set_right_color_callback(GtkWidget *widget, gpointer data); -static void cpopup_right_color_changed(GtkWidget *widget, gpointer client_data); -static void cpopup_right_color_dialog_ok(GtkWidget *widget, gpointer client_data); -static void cpopup_right_color_dialog_cancel(GtkWidget *widget, gpointer client_data); -static int cpopup_right_color_dialog_delete(GtkWidget *widget, GdkEvent *event, gpointer data); - -static void cpopup_split_midpoint_callback(GtkWidget *widget, gpointer data); -static void cpopup_split_uniform_callback(GtkWidget *widget, gpointer data); -static void cpopup_delete_callback(GtkWidget *widget, gpointer data); -static void cpopup_recenter_callback(GtkWidget *widget, gpointer data); -static void cpopup_redistribute_callback(GtkWidget *widget, gpointer data); -static void cpopup_flip_callback(GtkWidget *widget, gpointer data); -static void cpopup_replicate_callback(GtkWidget *widget, gpointer data); - -static void cpopup_split_uniform_scale_update(GtkAdjustment *adjustment, gpointer data); -static void cpopup_split_uniform_split_callback(GtkWidget *widget, gpointer client_data); -static void cpopup_split_uniform_cancel_callback(GtkWidget *widget, gpointer client_data); - -static void cpopup_replicate_scale_update(GtkAdjustment *adjustment, gpointer data); -static void cpopup_do_replicate_callback(GtkWidget *widget, gpointer client_data); -static void cpopup_replicate_cancel_callback(GtkWidget *widget, gpointer client_data); - -static void cpopup_blend_endpoints(double r0, double g0, double b0, double a0, - double r1, double g1, double b1, double a1, - int blend_colors, int blend_opacity); -static void cpopup_split_midpoint(grad_segment_t *lseg, grad_segment_t **newl, grad_segment_t **newr); -static void cpopup_split_uniform(grad_segment_t *lseg, int parts, - grad_segment_t **newl, grad_segment_t **newr); +static void cpopup_create_main_menu (void); +static void cpopup_do_popup (void); + +static GtkWidget *cpopup_create_color_item (GtkWidget **color_box, + GtkWidget **label); +static GtkWidget *cpopup_create_menu_item_with_label (gchar *str, + GtkWidget **label); + +static void cpopup_adjust_menus (void); +static void cpopup_adjust_blending_menu (void); +static void cpopup_adjust_coloring_menu (void); +static void cpopup_check_selection_params (gint *equal_blending, + gint *equal_coloring); + +static void cpopup_render_color_box (GtkPreview *preview, + double r, double g, double b, double a); + +static GtkWidget *cpopup_create_load_menu (GtkWidget **color_boxes, + GtkWidget **labels, + gchar *label1, gchar *label2, + GtkSignalFunc callback, + gchar accel_key_0, + guint8 accel_mods_0, + gchar accel_key_1, + guint8 accel_mods_1, + gchar accel_key_2, + guint8 accel_mods_2); +static GtkWidget *cpopup_create_save_menu (GtkWidget **color_boxes, + GtkWidget **labels, + GtkSignalFunc callback); + +static void cpopup_update_saved_color (int n, + double r, double g, double b, double a); + +static void cpopup_load_left_callback (GtkWidget *, gpointer); +static void cpopup_save_left_callback (GtkWidget *, gpointer); +static void cpopup_load_right_callback (GtkWidget *, gpointer); +static void cpopup_save_right_callback (GtkWidget *, gpointer); + +static void cpopup_set_color_selection_color (GtkColorSelection *cs, + double r, double g, + double b, double a); +static void cpopup_get_color_selection_color (GtkColorSelection *cs, + double *r, double *g, + double *b, double *a); + +static grad_segment_t *cpopup_save_selection (void); +static void cpopup_free_selection (grad_segment_t *seg); +static void cpopup_replace_selection (grad_segment_t *replace_seg); + +/* ----- */ + +static void cpopup_create_color_dialog (gchar *title, + double r, double g, double b, double a, + GtkSignalFunc color_changed_callback, + GtkSignalFunc ok_callback, + GtkSignalFunc cancel_callback, + GtkSignalFunc delete_callback); + +static void cpopup_set_left_color_callback (GtkWidget *, gpointer); +static void cpopup_left_color_changed (GtkWidget *, gpointer); +static void cpopup_left_color_dialog_ok (GtkWidget *, gpointer); +static void cpopup_left_color_dialog_cancel (GtkWidget *, gpointer); +static int cpopup_left_color_dialog_delete (GtkWidget *, GdkEvent *, + gpointer); + +static void cpopup_set_right_color_callback (GtkWidget *, gpointer); +static void cpopup_right_color_changed (GtkWidget *, gpointer); +static void cpopup_right_color_dialog_ok (GtkWidget *, gpointer); +static void cpopup_right_color_dialog_cancel (GtkWidget *, gpointer); +static int cpopup_right_color_dialog_delete (GtkWidget *, GdkEvent *, + gpointer); + +/* ----- */ + +static GtkWidget *cpopup_create_blending_menu (void); +static void cpopup_blending_callback (GtkWidget *, gpointer); +static GtkWidget *cpopup_create_coloring_menu (void); +static void cpopup_coloring_callback (GtkWidget *, gpointer); + +/* ----- */ + +static void cpopup_split_midpoint_callback (GtkWidget *, gpointer); +static void cpopup_split_midpoint (grad_segment_t *lseg, grad_segment_t **newl, + grad_segment_t **newr); + +static void cpopup_split_uniform_callback (GtkWidget *, gpointer); +static void cpopup_split_uniform_scale_update (GtkAdjustment *, gpointer); +static void cpopup_split_uniform_split_callback (GtkWidget *, gpointer); +static void cpopup_split_uniform_cancel_callback (GtkWidget *, gpointer); +static gint cpopup_split_uniform_delete_callback (GtkWidget *, GdkEvent *, + gpointer); +static void cpopup_split_uniform (grad_segment_t *lseg, int parts, + grad_segment_t **newl, grad_segment_t **newr); + +static void cpopup_delete_callback (GtkWidget *, gpointer); +static void cpopup_recenter_callback (GtkWidget *, gpointer); +static void cpopup_redistribute_callback (GtkWidget *, gpointer); + +/* Control popup -> Selection operations functions */ + +static GtkWidget * cpopup_create_sel_ops_menu (void); + +static void cpopup_flip_callback (GtkWidget *, gpointer); + +static void cpopup_replicate_callback (GtkWidget *, gpointer); +static void cpopup_replicate_scale_update (GtkAdjustment *, gpointer); +static void cpopup_do_replicate_callback (GtkWidget *, gpointer); +static void cpopup_replicate_cancel_callback (GtkWidget *, gpointer); +static gint cpopup_replicate_delete_callback (GtkWidget *, GdkEvent *, + gpointer); + +static void cpopup_blend_colors (GtkWidget *, gpointer); +static void cpopup_blend_opacity (GtkWidget *, gpointer); + +/* Blend function */ + +static void cpopup_blend_endpoints (double r0, double g0, double b0, double a0, + double r1, double g1, double b1, double a1, + int blend_colors, int blend_opacity); /* Gradient functions */ -static gradient_t *grad_new_gradient(void); -static void grad_free_gradient(gradient_t *grad); -static void grad_free_gradients(void); -static void grad_load_gradient(char *filename); -static void grad_save_gradient(gradient_t *grad, char *filename); -static void grad_save_all(int need_free); +static gradient_t *grad_new_gradient (void); +static void grad_free_gradient (gradient_t *grad); +static void grad_free_gradients (void); +static void grad_load_gradient (char *filename); +static void grad_save_gradient (gradient_t *grad, + char *filename); +static void grad_save_all (int need_free); -static gradient_t *grad_create_default_gradient(void); +static gradient_t *grad_create_default_gradient (void); -static int grad_insert_in_gradients_list(gradient_t *grad); +static int grad_insert_in_gradients_list (gradient_t *grad); -static void grad_dump_gradient(gradient_t *grad, FILE *file); +static void grad_dump_gradient (gradient_t *grad, FILE *file); /* Segment functions */ -static grad_segment_t *seg_new_segment(void); -static void seg_free_segment(grad_segment_t *seg); -static void seg_free_segments(grad_segment_t *seg); +static grad_segment_t *seg_new_segment (void); +static void seg_free_segment (grad_segment_t *seg); +static void seg_free_segments (grad_segment_t *seg); -static grad_segment_t *seg_get_segment_at(gradient_t *grad, double pos); -static grad_segment_t *seg_get_last_segment(grad_segment_t *seg); -static void seg_get_closest_handle(gradient_t *grad, double pos, - grad_segment_t **seg, control_drag_mode_t *handle); +static grad_segment_t *seg_get_segment_at (gradient_t *grad, double pos); +static grad_segment_t *seg_get_last_segment (grad_segment_t *seg); +static void seg_get_closest_handle (gradient_t *grad, double pos, + grad_segment_t **seg, + control_drag_mode_t *handle); /* Calculation functions */ -static double calc_linear_factor(double middle, double pos); -static double calc_curved_factor(double middle, double pos); -static double calc_sine_factor(double middle, double pos); -static double calc_sphere_increasing_factor(double middle, double pos); -static double calc_sphere_decreasing_factor(double middle, double pos); +static double calc_linear_factor (double middle, double pos); +static double calc_curved_factor (double middle, double pos); +static double calc_sine_factor (double middle, double pos); +static double calc_sphere_increasing_factor (double middle, double pos); +static double calc_sphere_decreasing_factor (double middle, double pos); -static void calc_rgb_to_hsv(double *r, double *g, double *b); -static void calc_hsv_to_rgb(double *h, double *s, double *v); +static void calc_rgb_to_hsv (double *r, double *g, double *b); +static void calc_hsv_to_rgb (double *h, double *s, double *v); /* Files and paths functions */ -static char *build_user_filename(char *name, char *path_str); - +static gchar *build_user_filename (char *name, char *path_str); /***** Local variables *****/ -GdkColor black; -int num_gradients = 0; -gradient_t *curr_gradient = NULL; /* The active gradient */ -GSList *gradients_list = NULL; /* The list of gradients */ -gradient_t *grad_default_gradient = NULL; -gradient_editor_t *g_editor = NULL; /* The gradient editor */ - -static const char *blending_types[] = { - N_("Linear"), - N_("Curved"), - N_("Sinusoidal"), - N_("Spherical (increasing)"), - N_("Spherical (decreasing)") -}; /* blending_types */ +GdkColor black; +gint num_gradients = 0; +gradient_t * curr_gradient = NULL; /* The active gradient */ +GSList * gradients_list = NULL; /* The list of gradients */ +gradient_t * grad_default_gradient = NULL; +gradient_editor_t * g_editor = NULL; /* The gradient editor */ -static const char *coloring_types[] = { - N_("Plain RGB"), - N_("HSV (counter-clockwise hue)"), - N_("HSV (clockwise hue)") -}; /* coloring_types */ +static const gchar *blending_types[] = +{ + N_("Linear"), + N_("Curved"), + N_("Sinusoidal"), + N_("Spherical (increasing)"), + N_("Spherical (decreasing)") +}; +static const gchar *coloring_types[] = +{ + N_("Plain RGB"), + N_("HSV (counter-clockwise hue)"), + N_("HSV (clockwise hue)") +}; /***** Public functions *****/ /*****/ void -gradients_init(int no_data) +gradients_init (int no_data) { - if(!no_data) - datafiles_read_directories(gradient_path, grad_load_gradient, 0); + if (!no_data) + datafiles_read_directories (gradient_path, grad_load_gradient, 0); if (grad_default_gradient != NULL) curr_gradient = grad_default_gradient; else if (gradients_list != NULL) curr_gradient = (gradient_t *) gradients_list->data; - else { - curr_gradient = grad_create_default_gradient(); - curr_gradient->name = g_strdup(_("Default")); - curr_gradient->filename = build_user_filename(curr_gradient->name, gradient_path); - curr_gradient->dirty = FALSE; - - grad_insert_in_gradients_list(curr_gradient); - } /* else */ -} /* gradients_init */ + else + { + curr_gradient = grad_create_default_gradient (); + curr_gradient->name = g_strdup (_("Default")); + curr_gradient->filename = + build_user_filename (curr_gradient->name, gradient_path); + curr_gradient->dirty = FALSE; + grad_insert_in_gradients_list (curr_gradient); + } +} /*****/ void -gradients_free(void) +gradients_free (void) { - grad_free_gradients(); -} /* gradients_free */ - + grad_free_gradients (); +} /*****/ void -grad_get_color_at(double pos, double *r, double *g, double *b, double *a) +grad_get_color_at (double pos, + double *r, double *g, double *b, double *a) { - double factor; - grad_segment_t *seg; - double seg_len, middle; - double h0, s0, v0; - double h1, s1, v1; - - /* if there is no gradient return a totally transparent black */ - if (curr_gradient == NULL) - { - r = 0; g = 0; b = 0; a = 0; - return; - } - - if (pos < 0.0) - pos = 0.0; - else if (pos > 1.0) - pos = 1.0; - - seg = seg_get_segment_at(curr_gradient, pos); - - seg_len = seg->right - seg->left; - - if (seg_len < EPSILON) { - middle = 0.5; - pos = 0.5; - } else { - middle = (seg->middle - seg->left) / seg_len; - pos = (pos - seg->left) / seg_len; - } /* else */ + double factor = 0.0; + grad_segment_t *seg; + double seg_len, middle; + double h0, s0, v0; + double h1, s1, v1; - switch (seg->type) { - case GRAD_LINEAR: - factor = calc_linear_factor(middle, pos); - break; + /* if there is no gradient return a totally transparent black */ + if (curr_gradient == NULL) + { + r = 0; g = 0; b = 0; a = 0; + return; + } - case GRAD_CURVED: - factor = calc_curved_factor(middle, pos); - break; + if (pos < 0.0) + pos = 0.0; + else if (pos > 1.0) + pos = 1.0; - case GRAD_SINE: - factor = calc_sine_factor(middle, pos); - break; + seg = seg_get_segment_at (curr_gradient, pos); - case GRAD_SPHERE_INCREASING: - factor = calc_sphere_increasing_factor(middle, pos); - break; + seg_len = seg->right - seg->left; - case GRAD_SPHERE_DECREASING: - factor = calc_sphere_decreasing_factor(middle, pos); - break; + if (seg_len < EPSILON) + { + middle = 0.5; + pos = 0.5; + } + else + { + middle = (seg->middle - seg->left) / seg_len; + pos = (pos - seg->left) / seg_len; + } - default: - grad_dump_gradient (curr_gradient, stderr); - gimp_fatal_error (_("grad_get_color_at(): Unknown gradient type %d"), - (int) seg->type); - factor = 0.0; /* Shut up -Wall */ - break; - } /* switch */ + switch (seg->type) + { + case GRAD_LINEAR: + factor = calc_linear_factor (middle, pos); + break; + + case GRAD_CURVED: + factor = calc_curved_factor (middle, pos); + break; + + case GRAD_SINE: + factor = calc_sine_factor (middle, pos); + break; + + case GRAD_SPHERE_INCREASING: + factor = calc_sphere_increasing_factor (middle, pos); + break; + + case GRAD_SPHERE_DECREASING: + factor = calc_sphere_decreasing_factor (middle, pos); + break; + + default: + grad_dump_gradient (curr_gradient, stderr); + gimp_fatal_error (_("grad_get_color_at(): Unknown gradient type %d"), + (int) seg->type); + break; + } - /* Calculate color components */ + /* Calculate color components */ - *a = seg->a0 + (seg->a1 - seg->a0) * factor; + *a = seg->a0 + (seg->a1 - seg->a0) * factor; - if (seg->color == GRAD_RGB) { - *r = seg->r0 + (seg->r1 - seg->r0) * factor; - *g = seg->g0 + (seg->g1 - seg->g0) * factor; - *b = seg->b0 + (seg->b1 - seg->b0) * factor; - } else { - h0 = seg->r0; - s0 = seg->g0; - v0 = seg->b0; - - h1 = seg->r1; - s1 = seg->g1; - v1 = seg->b1; - - calc_rgb_to_hsv(&h0, &s0, &v0); - calc_rgb_to_hsv(&h1, &s1, &v1); - - s0 = s0 + (s1 - s0) * factor; - v0 = v0 + (v1 - v0) * factor; - - switch (seg->color) { - case GRAD_HSV_CCW: - if (h0 < h1) - h0 = h0 + (h1 - h0) * factor; - else { - h0 = h0 + (1.0 - (h0 - h1)) * factor; - if (h0 > 1.0) - h0 -= 1.0; - } /* else */ + if (seg->color == GRAD_RGB) + { + *r = seg->r0 + (seg->r1 - seg->r0) * factor; + *g = seg->g0 + (seg->g1 - seg->g0) * factor; + *b = seg->b0 + (seg->b1 - seg->b0) * factor; + } + else + { + h0 = seg->r0; + s0 = seg->g0; + v0 = seg->b0; - break; + h1 = seg->r1; + s1 = seg->g1; + v1 = seg->b1; - case GRAD_HSV_CW: - if (h1 < h0) - h0 = h0 - (h0 - h1) * factor; - else { - h0 = h0 - (1.0 - (h1 - h0)) * factor; - if (h0 < 0.0) - h0 += 1.0; - } /* else */ + calc_rgb_to_hsv(&h0, &s0, &v0); + calc_rgb_to_hsv(&h1, &s1, &v1); - break; + s0 = s0 + (s1 - s0) * factor; + v0 = v0 + (v1 - v0) * factor; - default: - grad_dump_gradient (curr_gradient, stderr); - gimp_fatal_error (_("grad_get_color_at(): Unknown coloring mode %d"), - (int) seg->color); - break; - } /* switch */ + switch (seg->color) + { + case GRAD_HSV_CCW: + if (h0 < h1) + h0 = h0 + (h1 - h0) * factor; + else + { + h0 = h0 + (1.0 - (h0 - h1)) * factor; + if (h0 > 1.0) + h0 -= 1.0; + } + break; + + case GRAD_HSV_CW: + if (h1 < h0) + h0 = h0 - (h0 - h1) * factor; + else + { + h0 = h0 - (1.0 - (h1 - h0)) * factor; + if (h0 < 0.0) + h0 += 1.0; + } + break; + + default: + grad_dump_gradient (curr_gradient, stderr); + gimp_fatal_error (_("grad_get_color_at(): Unknown coloring mode %d"), + (int) seg->color); + break; + } - *r = h0; - *g = s0; - *b = v0; + *r = h0; + *g = s0; + *b = v0; - calc_hsv_to_rgb(r, g, b); - } /* else */ -} /* grad_get_color_at */ + calc_hsv_to_rgb (r, g, b); + } +} +/***** The main gradient editor dialog *****/ /*****/ - void grad_create_gradient_editor_init (gint need_show) { @@ -597,6 +665,10 @@ grad_create_gradient_editor_init (gint need_show) GtkWidget *frame; GtkWidget *scrolled_win; GdkColormap *colormap; + GtkWidget* pixmapwid; + GdkPixmap* pixmap; + GdkBitmap* mask; + GtkStyle* style; gint i; gint select_pos; @@ -631,10 +703,11 @@ grad_create_gradient_editor_init (gint need_show) /* Shell and main vbox */ g_editor->shell = gtk_dialog_new (); - gtk_window_set_wmclass (GTK_WINDOW (g_editor->shell), "gradient_editor", "Gimp"); + gtk_window_set_wmclass (GTK_WINDOW (g_editor->shell), + "gradient_editor", "Gimp"); gtk_window_set_title (GTK_WINDOW (g_editor->shell), _("Gradient Editor")); - /* handle window manager close signals */ + /* Handle the wm delete event */ gtk_signal_connect (GTK_OBJECT (g_editor->shell), "delete_event", GTK_SIGNAL_FUNC (ed_delete_callback), NULL); @@ -690,56 +763,85 @@ grad_create_gradient_editor_init (gint need_show) /* Buttons for gradient functions */ button = ed_create_button (_("New Gradient"), 0.5, 0.5, (GtkSignalFunc) ed_new_gradient_callback, NULL); + GTK_WIDGET_UNSET_FLAGS (button, GTK_RECEIVES_DEFAULT); gtk_box_pack_start (GTK_BOX (gvbox), button, FALSE, FALSE, 0); gtk_widget_show (button); button = ed_create_button (_("Copy Gradient"), 0.5, 0.5, (GtkSignalFunc) ed_copy_gradient_callback, NULL); + GTK_WIDGET_UNSET_FLAGS (button, GTK_RECEIVES_DEFAULT); gtk_box_pack_start (GTK_BOX (gvbox), button, FALSE, FALSE, 0); gtk_widget_show (button); button = ed_create_button (_("Delete Gradient"), 0.5, 0.5, (GtkSignalFunc) ed_delete_gradient_callback, NULL); + GTK_WIDGET_UNSET_FLAGS (button, GTK_RECEIVES_DEFAULT); gtk_box_pack_start (GTK_BOX (gvbox), button, FALSE, FALSE, 0); gtk_widget_show (button); button = ed_create_button (_("Rename Gradient"), 0.5, 0.5, (GtkSignalFunc) ed_rename_gradient_callback, NULL); + GTK_WIDGET_UNSET_FLAGS (button, GTK_RECEIVES_DEFAULT); gtk_box_pack_start (GTK_BOX (gvbox), button, FALSE, FALSE, 0); gtk_widget_show (button); button = ed_create_button (_("Save as POV-Ray"), 0.5, 0.5, (GtkSignalFunc) ed_save_pov_callback, NULL); + GTK_WIDGET_UNSET_FLAGS (button, GTK_RECEIVES_DEFAULT); gtk_box_pack_start (GTK_BOX (gvbox), button, FALSE, FALSE, 0); gtk_widget_show (button); gtk_widget_show (gvbox); gtk_widget_show (frame); - /* Horizontal box for zoom controls, scrollbar, and instant update toggle */ - + /* Horizontal box for zoom controls, scrollbar and instant update toggle */ hbox = gtk_hbox_new (FALSE, 4); gtk_container_set_border_width (GTK_CONTAINER (hbox), 0); gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0); gtk_widget_show (hbox); - /* Zoom buttons */ + /* Zoom all button */ button = ed_create_button (_("Zoom all"), 0.5, 0.5, (GtkSignalFunc) ed_zoom_all_callback, g_editor); + GTK_WIDGET_UNSET_FLAGS (button, GTK_RECEIVES_DEFAULT); gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0); gtk_widget_show (button); - button = ed_create_button (_("Zoom -"), 0.5, 0.5, - (GtkSignalFunc) ed_zoom_out_callback, g_editor); + /* + and - buttons */ + gtk_widget_realize (g_editor->shell); + style = gtk_widget_get_style (g_editor->shell); + + button = gtk_button_new (); + GTK_WIDGET_UNSET_FLAGS (button, GTK_RECEIVES_DEFAULT); + gtk_signal_connect (GTK_OBJECT (button), "clicked", + GTK_SIGNAL_FUNC (ed_zoom_in_callback), + (gpointer) g_editor); gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0); - gtk_widget_show(button); - button = ed_create_button (_("Zoom +"), 0.5, 0.5, - (GtkSignalFunc) ed_zoom_in_callback, g_editor); + pixmap = gdk_pixmap_create_from_xpm_d (g_editor->shell->window, &mask, + &style->bg[GTK_STATE_NORMAL], + zoom_in_xpm); + pixmapwid = gtk_pixmap_new (pixmap, mask); + gtk_container_add (GTK_CONTAINER (button), pixmapwid); + gtk_widget_show (pixmapwid); + gtk_widget_show (button); + + button = gtk_button_new (); + GTK_WIDGET_UNSET_FLAGS (button, GTK_RECEIVES_DEFAULT); + gtk_signal_connect (GTK_OBJECT (button), "clicked", + GTK_SIGNAL_FUNC (ed_zoom_out_callback), + (gpointer) g_editor); gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0); + + pixmap = gdk_pixmap_create_from_xpm_d (g_editor->shell->window, &mask, + &style->bg[GTK_STATE_NORMAL], + zoom_out_xpm); + pixmapwid = gtk_pixmap_new (pixmap, mask); + gtk_container_add (GTK_CONTAINER (button), pixmapwid); + gtk_widget_show (pixmapwid); gtk_widget_show (button); - /* Scrollbar */ + /* Scrollbar */ g_editor->zoom_factor = 1; g_editor->scroll_data = gtk_adjustment_new (0.0, 0.0, 1.0, @@ -772,18 +874,10 @@ grad_create_gradient_editor_init (gint need_show) gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE); gtk_widget_show (button); - /* hbox for that holds the frame for gradient preview and gradient control; - * this is only here, because resizing the preview doesn't work - * (and is disabled) to keep the preview and controls together - */ - hbox = gtk_hbox_new (FALSE, 0); - gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0); - gtk_widget_show (hbox); - /* Frame for gradient preview and gradient control */ frame = gtk_frame_new (NULL); gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN); - gtk_box_pack_start (GTK_BOX (hbox), frame, FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0); gtk_widget_show (frame); gvbox = gtk_vbox_new (FALSE, 0); @@ -798,13 +892,18 @@ grad_create_gradient_editor_init (gint need_show) g_editor->preview_button_down = 0; g_editor->preview = gtk_preview_new (GTK_PREVIEW_COLOR); - gtk_preview_set_dither (GTK_PREVIEW (g_editor->preview), - GDK_RGB_DITHER_MAX); + gtk_preview_set_dither (GTK_PREVIEW (g_editor->preview), GDK_RGB_DITHER_MAX); gtk_preview_size (GTK_PREVIEW (g_editor->preview), GRAD_PREVIEW_WIDTH, GRAD_PREVIEW_HEIGHT); + + /* Enable auto-resizing of the preview but ensure a minimal size */ + gtk_widget_set_usize (g_editor->preview, + GRAD_PREVIEW_WIDTH, GRAD_PREVIEW_HEIGHT); + gtk_preview_set_expand (GTK_PREVIEW (g_editor->preview), TRUE); + gtk_widget_set_events (g_editor->preview, GRAD_PREVIEW_EVENT_MASK); gtk_signal_connect (GTK_OBJECT(g_editor->preview), "event", - (GtkSignalFunc) prev_events, + (GdkEventFunc) prev_events, g_editor); gtk_box_pack_start (GTK_BOX (gvbox), g_editor->preview, TRUE, TRUE, 0); gtk_widget_show (g_editor->preview); @@ -861,9 +960,9 @@ grad_create_gradient_editor_init (gint need_show) GRAD_PREVIEW_WIDTH, GRAD_CONTROL_HEIGHT); gtk_widget_set_events (g_editor->control, GRAD_CONTROL_EVENT_MASK); gtk_signal_connect (GTK_OBJECT (g_editor->control), "event", - (GtkSignalFunc) control_events, + (GdkEventFunc) control_events, g_editor); - gtk_box_pack_start (GTK_BOX (gvbox), g_editor->control, FALSE, TRUE, 0); + gtk_box_pack_start (GTK_BOX (gvbox), g_editor->control, TRUE, TRUE, 0); gtk_widget_show (g_editor->control); /* Hint bar and close button */ @@ -888,7 +987,6 @@ grad_create_gradient_editor_init (gint need_show) cpopup_create_main_menu(); /* Show everything */ - gtk_widget_realize (g_editor->shell); g_editor->gc = gdk_gc_new (g_editor->shell->window); select_pos = ed_set_list_of_gradients (g_editor->gc, g_editor->clist, @@ -907,105 +1005,112 @@ grad_create_gradient_editor_init (gint need_show) /*****/ static void -ed_fetch_foreground(double *fg_r, double *fg_g, double *fg_b, double *fg_a) +ed_fetch_foreground (double *fg_r, double *fg_g, double *fg_b, double *fg_a) { - unsigned char r, g, b; + guchar r, g, b; - palette_get_foreground (&r, &g, &b); + palette_get_foreground (&r, &g, &b); - *fg_r = (double) r / 255.0; - *fg_g = (double) g / 255.0; - *fg_b = (double) b / 255.0; - *fg_a = 1.0; /* opacity 100 % */ -} /* ed_fetch_foreground */ - + *fg_r = (double) r / 255.0; + *fg_g = (double) g / 255.0; + *fg_b = (double) b / 255.0; + *fg_a = 1.0; /* opacity 100 % */ +} /*****/ static void -ed_update_editor(int flags) +ed_update_editor (int flags) { - if (flags & GRAD_UPDATE_PREVIEW) - prev_update(1); - - if (flags & GRAD_UPDATE_CONTROL) - control_update(0); + if (flags & GRAD_UPDATE_PREVIEW) + prev_update (TRUE); - if (flags & GRAD_RESET_CONTROL) - control_update(1); -} /* ed_update_editor */ + if (flags & GRAD_UPDATE_CONTROL) + control_update(FALSE); + if (flags & GRAD_RESET_CONTROL) + control_update (TRUE); +} /*****/ static GtkWidget * -ed_create_button(gchar *label, double xalign, double yalign, GtkSignalFunc signal_func, gpointer user_data) +ed_create_button (gchar *label, + double xalign, + double yalign, + GtkSignalFunc signal_func, + gpointer user_data) { - GtkWidget *button; - GtkWidget *text; - - button = gtk_button_new(); - text = gtk_label_new(gettext(label)); + GtkWidget *button; + GtkWidget *text; - gtk_misc_set_alignment(GTK_MISC(text), xalign, yalign); - gtk_container_add(GTK_CONTAINER(button), text); - gtk_widget_show(text); + button = gtk_button_new (); + text = gtk_label_new (label); - if (signal_func != NULL) - gtk_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC (signal_func), user_data); + gtk_misc_set_alignment (GTK_MISC (text), xalign, yalign); + gtk_misc_set_padding (GTK_MISC (text), 4, 0); + gtk_container_add (GTK_CONTAINER (button), text); + gtk_widget_show (text); - return button; -} /* ed_create_button */ + if (signal_func != NULL) + gtk_signal_connect (GTK_OBJECT (button), "clicked", + (GtkSignalFunc) signal_func, + user_data); + return button; +} /*****/ static void -ed_set_hint(char *str) +ed_set_hint (gchar *str) { - gtk_label_set(GTK_LABEL(g_editor->hint_label), gettext(str)); - gdk_flush(); -} /* ed_set_hint */ - + gtk_label_set_text (GTK_LABEL (g_editor->hint_label), str); + gdk_flush(); +} /*****/ gint -ed_set_list_of_gradients(GdkGC *gc, GtkWidget *clist,gradient_t *sel_gradient) +ed_set_list_of_gradients (GdkGC *gc, + GtkWidget *clist, + gradient_t *sel_gradient) { - GSList *list; - gradient_t *grad; - int n; - int select_pos = -1; - - list = gradients_list; - n = 0; + GSList *list; + gradient_t *grad; + gint n; + gint select_pos = -1; - if(sel_gradient == NULL) - sel_gradient = curr_gradient; + list = gradients_list; + n = 0; - gtk_clist_freeze(GTK_CLIST(clist)); + if (sel_gradient == NULL) + sel_gradient = curr_gradient; - while (list) { - grad = list->data; + gtk_clist_freeze (GTK_CLIST (clist)); - if (grad == sel_gradient) { - ed_insert_in_gradients_listbox(gc,clist,grad, n, 1); - select_pos = n; - } - else { - ed_insert_in_gradients_listbox(gc,clist,grad, n, 0); - } + while (list) + { + grad = list->data; - list = g_slist_next(list); - n++; - } /* while */ + if (grad == sel_gradient) + { + ed_insert_in_gradients_listbox (gc, clist, grad, n, 1); + select_pos = n; + } + else + { + ed_insert_in_gradients_listbox (gc, clist, grad, n, 0); + } - gtk_clist_thaw(GTK_CLIST(clist)); + list = g_slist_next (list); + n++; + } - return select_pos; -} /* ed_set_list_of_gradients */ + gtk_clist_thaw (GTK_CLIST (clist)); + return select_pos; +} /*****/ @@ -1214,33 +1319,15 @@ ed_initialize_saved_colors(void) g_editor->saved_colors[9].a = 1.0; } /* ed_initialize_saved_colors */ -/*****/ - -static gint -ed_delete_callback (GtkWidget *widget, - GdkEvent *event, - gpointer client_data) -{ - ed_close_callback (widget, client_data); - - return TRUE; -} - -/*****/ +/***** Main gradient editor dialog callbacks *****/ -static void -ed_close_callback (GtkWidget *widget, - gpointer client_data) -{ - if (GTK_WIDGET_VISIBLE (g_editor->shell)) - gtk_widget_hide (g_editor->shell); -} +/***** the "new gradient" dialog functions *****/ /*****/ static void ed_new_gradient_callback (GtkWidget *widget, - gpointer client_data) + gpointer data) { gtk_widget_show (query_string_box(_("New gradient"), _("Enter a name for the new gradient"), @@ -1251,7 +1338,7 @@ ed_new_gradient_callback (GtkWidget *widget, static void ed_do_new_gradient_callback (GtkWidget *widget, - gpointer client_data, + gpointer data, gpointer call_data) { gradient_t *grad; @@ -1288,11 +1375,13 @@ ed_do_new_gradient_callback (GtkWidget *widget, grad_sel_new_all (pos, grad); } +/***** The "copy gradient" dialog functions *****/ + /*****/ static void ed_copy_gradient_callback (GtkWidget *widget, - gpointer client_data) + gpointer data) { gchar *name; @@ -1312,7 +1401,7 @@ ed_copy_gradient_callback (GtkWidget *widget, static void ed_do_copy_gradient_callback (GtkWidget *widget, - gpointer client_data, + gpointer data, gpointer call_data) { gradient_t *grad; @@ -1373,11 +1462,13 @@ ed_do_copy_gradient_callback (GtkWidget *widget, grad_sel_copy_all (pos, grad); } +/***** The "rename gradient" dialog functions *****/ + /*****/ static void ed_rename_gradient_callback (GtkWidget *widget, - gpointer client_data) + gpointer data) { if (curr_gradient == NULL) return; @@ -1392,10 +1483,10 @@ ed_rename_gradient_callback (GtkWidget *widget, static void ed_do_rename_gradient_callback (GtkWidget *widget, - gpointer client_data, + gpointer data, gpointer call_data) { - gradient_t *grad = (gradient_t *) client_data; + gradient_t *grad = (gradient_t *) data; gradient_t *grad_list = NULL; gchar *gradient_name; GSList *tmp; @@ -1447,11 +1538,13 @@ ed_do_rename_gradient_callback (GtkWidget *widget, grad_sel_rename_all (n, grad); } +/***** The "delete gradient" dialog functions *****/ + /*****/ static void ed_delete_gradient_callback (GtkWidget *widget, - gpointer client_data) + gpointer data) { GtkWidget *dialog; GtkWidget *vbox; @@ -1468,11 +1561,11 @@ ed_delete_gradient_callback (GtkWidget *widget, return; dialog = gtk_dialog_new (); + gtk_window_set_wmclass (GTK_WINDOW (dialog), "delete_gradient", "Gimp"); gtk_window_set_title (GTK_WINDOW (dialog), _("Delete gradient")); gtk_window_position (GTK_WINDOW (dialog), GTK_WIN_POS_MOUSE); - gtk_container_set_border_width (GTK_CONTAINER (dialog), 0); - /* Handle the wm close signal */ + /* Handle the wm delete event */ gtk_signal_connect (GTK_OBJECT (dialog), "delete_event", GTK_SIGNAL_FUNC (ed_delete_delete_gradient_callback), dialog); @@ -1504,14 +1597,14 @@ ed_delete_gradient_callback (GtkWidget *widget, static void ed_do_delete_gradient_callback (GtkWidget *widget, - gpointer client_data) + gpointer data) { GSList *tmp; gint n; gint real_pos; gradient_t *gradient; - gtk_widget_destroy (GTK_WIDGET (client_data)); + gtk_widget_destroy (GTK_WIDGET (data)); gtk_widget_set_sensitive (g_editor->shell, TRUE); /* See which gradient we will have to select once the current one is deleted */ @@ -1561,29 +1654,31 @@ ed_do_delete_gradient_callback (GtkWidget *widget, grad_sel_delete_all (real_pos); } +static void +ed_cancel_delete_gradient_callback (GtkWidget *widget, + gpointer data) +{ + gtk_widget_destroy (GTK_WIDGET (data)); + gtk_widget_set_sensitive (g_editor->shell, TRUE); +} + static gint ed_delete_delete_gradient_callback (GtkWidget *widget, GdkEvent *event, - gpointer client_data) + gpointer data) { - ed_cancel_delete_gradient_callback (widget, client_data); + ed_cancel_delete_gradient_callback (widget, data); return TRUE; } -static void -ed_cancel_delete_gradient_callback (GtkWidget *widget, - gpointer client_data) -{ - gtk_widget_destroy (GTK_WIDGET (client_data)); - gtk_widget_set_sensitive (g_editor->shell, TRUE); -} +/***** The "save as pov" dialog functions *****/ /*****/ static void ed_save_pov_callback (GtkWidget *widget, - gpointer client_data) + gpointer data) { GtkWidget *window; @@ -1601,19 +1696,23 @@ ed_save_pov_callback (GtkWidget *widget, "clicked", (GtkSignalFunc) ed_cancel_save_pov_callback, window); + gtk_signal_connect (GTK_OBJECT (window), "delete_event", + (GdkEventFunc) ed_delete_save_pov_callback, + window); + gtk_widget_show (window); gtk_widget_set_sensitive (g_editor->shell, FALSE); } static void ed_do_save_pov_callback (GtkWidget *widget, - gpointer client_data) + gpointer data) { gchar *filename; FILE *file; grad_segment_t *seg; - filename = gtk_file_selection_get_filename (GTK_FILE_SELECTION (client_data)); + filename = gtk_file_selection_get_filename (GTK_FILE_SELECTION (data)); file = fopen (filename, "wb"); @@ -1652,32 +1751,42 @@ ed_do_save_pov_callback (GtkWidget *widget, fclose (file); } - gtk_widget_destroy (GTK_WIDGET (client_data)); + gtk_widget_destroy (GTK_WIDGET (data)); gtk_widget_set_sensitive (g_editor->shell, TRUE); } static void ed_cancel_save_pov_callback (GtkWidget *widget, - gpointer client_data) + gpointer data) { - gtk_widget_destroy (GTK_WIDGET (client_data)); + gtk_widget_destroy (GTK_WIDGET (data)); gtk_widget_set_sensitive (g_editor->shell, TRUE); } +static gint +ed_delete_save_pov_callback (GtkWidget *widget, + GdkEvent *event, + gpointer data) +{ + ed_cancel_save_pov_callback (widget, data); + + return TRUE; +} + +/***** The main dialog action area button callbacks *****/ + /*****/ static void ed_save_grads_callback (GtkWidget *widget, - gpointer client_data) + gpointer data) { grad_save_all (0); } -/*****/ - static void ed_refresh_grads_callback (GtkWidget *widget, - gpointer client_data) + gpointer data) { gint select_pos; gtk_clist_freeze (GTK_CLIST (g_editor->clist)); @@ -1702,247 +1811,266 @@ ed_refresh_grads_callback (GtkWidget *widget, grad_sel_refill_all (); } -/*****/ - static void -ed_scrollbar_update(GtkAdjustment *adjustment, gpointer data) +ed_close_callback (GtkWidget *widget, + gpointer data) { - char str[256]; - - g_snprintf(str, sizeof(str), _("Zoom factor: %d:1 Displaying [%0.6f, %0.6f]"), - g_editor->zoom_factor, adjustment->value, adjustment->value + adjustment->page_size); + if (GTK_WIDGET_VISIBLE (g_editor->shell)) + gtk_widget_hide (g_editor->shell); +} - ed_set_hint(str); +static gint +ed_delete_callback (GtkWidget *widget, + GdkEvent *event, + gpointer data) +{ + ed_close_callback (widget, data); - ed_update_editor(GRAD_UPDATE_PREVIEW | GRAD_UPDATE_CONTROL); -} /* ed_scrollbar_update */ + return TRUE; +} +/***** Zoom, scrollbar & instant update callbacks *****/ /*****/ static void -ed_zoom_all_callback(GtkWidget *widget, gpointer client_data) +ed_scrollbar_update (GtkAdjustment *adjustment, + gpointer data) { - GtkAdjustment *adjustment; + gchar str[256]; - adjustment = GTK_ADJUSTMENT(g_editor->scroll_data); + g_snprintf (str, sizeof (str), + _("Zoom factor: %d:1 Displaying [%0.6f, %0.6f]"), + g_editor->zoom_factor, adjustment->value, + adjustment->value + adjustment->page_size); - g_editor->zoom_factor = 1; + ed_set_hint (str); - adjustment->value = 0.0; - adjustment->page_size = 1.0; - adjustment->step_increment = 1.0 * GRAD_SCROLLBAR_STEP_SIZE; - adjustment->page_increment = 1.0 * GRAD_SCROLLBAR_PAGE_SIZE; + ed_update_editor (GRAD_UPDATE_PREVIEW | GRAD_UPDATE_CONTROL); +} - gtk_signal_emit_by_name(g_editor->scroll_data, "changed"); -} /* ed_zoom_all_callback */ +static void +ed_zoom_all_callback(GtkWidget *widget, + gpointer data) +{ + GtkAdjustment *adjustment; + adjustment = GTK_ADJUSTMENT (g_editor->scroll_data); -/*****/ + g_editor->zoom_factor = 1; -static void -ed_zoom_out_callback(GtkWidget *widget, gpointer client_data) -{ - GtkAdjustment *adjustment; - double old_value, value; - double old_page_size, page_size; + adjustment->value = 0.0; + adjustment->page_size = 1.0; + adjustment->step_increment = 1.0 * GRAD_SCROLLBAR_STEP_SIZE; + adjustment->page_increment = 1.0 * GRAD_SCROLLBAR_PAGE_SIZE; - if (g_editor->zoom_factor <= 1) - return; + gtk_signal_emit_by_name (g_editor->scroll_data, "changed"); +} - adjustment = GTK_ADJUSTMENT(g_editor->scroll_data); +static void +ed_zoom_out_callback (GtkWidget *widget, + gpointer data) +{ + GtkAdjustment *adjustment; + double old_value, value; + double old_page_size, page_size; - old_value = adjustment->value; - old_page_size = adjustment->page_size; + if (g_editor->zoom_factor <= 1) + return; - g_editor->zoom_factor--; + adjustment = GTK_ADJUSTMENT (g_editor->scroll_data); - page_size = 1.0 / g_editor->zoom_factor; - value = old_value - (page_size - old_page_size) / 2.0; + old_value = adjustment->value; + old_page_size = adjustment->page_size; - if (value < 0.0) - value = 0.0; - else if ((value + page_size) > 1.0) - value = 1.0 - page_size; + g_editor->zoom_factor--; - adjustment->value = value; - adjustment->page_size = page_size; - adjustment->step_increment = page_size * GRAD_SCROLLBAR_STEP_SIZE; - adjustment->page_increment = page_size * GRAD_SCROLLBAR_PAGE_SIZE; + page_size = 1.0 / g_editor->zoom_factor; + value = old_value - (page_size - old_page_size) / 2.0; - gtk_signal_emit_by_name(g_editor->scroll_data, "changed"); -} /* ed_zoom_out_callback */ + if (value < 0.0) + value = 0.0; + else if ((value + page_size) > 1.0) + value = 1.0 - page_size; + adjustment->value = value; + adjustment->page_size = page_size; + adjustment->step_increment = page_size * GRAD_SCROLLBAR_STEP_SIZE; + adjustment->page_increment = page_size * GRAD_SCROLLBAR_PAGE_SIZE; -/*****/ + gtk_signal_emit_by_name (g_editor->scroll_data, "changed"); +} static void -ed_zoom_in_callback(GtkWidget *widget, gpointer client_data) +ed_zoom_in_callback (GtkWidget *widget, + gpointer data) { - GtkAdjustment *adjustment; - double old_value; - double old_page_size, page_size; - - adjustment = GTK_ADJUSTMENT(g_editor->scroll_data); + GtkAdjustment *adjustment; + double old_value; + double old_page_size, page_size; - old_value = adjustment->value; - old_page_size = adjustment->page_size; + adjustment = GTK_ADJUSTMENT (g_editor->scroll_data); - g_editor->zoom_factor++; + old_value = adjustment->value; + old_page_size = adjustment->page_size; - page_size = 1.0 / g_editor->zoom_factor; + g_editor->zoom_factor++; - adjustment->value = old_value + (old_page_size - page_size) / 2.0; - adjustment->page_size = page_size; - adjustment->step_increment = page_size * GRAD_SCROLLBAR_STEP_SIZE; - adjustment->page_increment = page_size * GRAD_SCROLLBAR_PAGE_SIZE; + page_size = 1.0 / g_editor->zoom_factor; - gtk_signal_emit_by_name(g_editor->scroll_data, "changed"); -} /* ed_zoom_in_callback */ + adjustment->value = old_value + (old_page_size - page_size) / 2.0; + adjustment->page_size = page_size; + adjustment->step_increment = page_size * GRAD_SCROLLBAR_STEP_SIZE; + adjustment->page_increment = page_size * GRAD_SCROLLBAR_PAGE_SIZE; - -/*****/ + gtk_signal_emit_by_name (g_editor->scroll_data, "changed"); +} static void -ed_instant_update_update(GtkWidget *widget, gpointer data) +ed_instant_update_update (GtkWidget *widget, + gpointer data) { - if (GTK_TOGGLE_BUTTON(widget)->active) { - g_editor->instant_update = 1; - gtk_range_set_update_policy(GTK_RANGE(g_editor->scrollbar), GTK_UPDATE_CONTINUOUS); - } else { - g_editor->instant_update = 0; - gtk_range_set_update_policy(GTK_RANGE(g_editor->scrollbar), GTK_UPDATE_DELAYED); - } /* else */ -} /* ed_instant_update_update */ - + if (GTK_TOGGLE_BUTTON (widget)->active) + { + g_editor->instant_update = 1; + gtk_range_set_update_policy (GTK_RANGE (g_editor->scrollbar), + GTK_UPDATE_CONTINUOUS); + } + else + { + g_editor->instant_update = 0; + gtk_range_set_update_policy (GTK_RANGE (g_editor->scrollbar), + GTK_UPDATE_DELAYED); + } +} /***** Gradient preview functions *****/ /*****/ static gint -prev_events(GtkWidget *widget, GdkEvent *event) +prev_events (GtkWidget *widget, + GdkEvent *event, + gpointer data) { - gint x, y; - GdkEventButton *bevent; - GdkEventMotion *mevent; + gint x, y; + GdkEventButton *bevent; + GdkEventMotion *mevent; - /* ignore events when no gradient is present */ - if (curr_gradient == NULL) - return FALSE; - - switch (event->type) { - case GDK_EXPOSE: - prev_update(0); - break; - - case GDK_LEAVE_NOTIFY: - ed_set_hint(""); - break; - - case GDK_MOTION_NOTIFY: - gtk_widget_get_pointer(g_editor->preview, &x, &y); - - mevent = (GdkEventMotion *) event; - - if (x != g_editor->preview_last_x) - { - g_editor->preview_last_x = x; + /* ignore events when no gradient is present */ + if (curr_gradient == NULL) + return FALSE; - if (g_editor->preview_button_down) - { - if (mevent->state & GDK_CONTROL_MASK) - prev_set_background (x); - else - prev_set_foreground (x); - } - else - prev_set_hint (x); - } /* if */ + switch (event->type) + { + case GDK_EXPOSE: + prev_update (FALSE); + break; - break; + case GDK_LEAVE_NOTIFY: + ed_set_hint(""); + break; - case GDK_BUTTON_PRESS: - gtk_widget_get_pointer(g_editor->preview, &x, &y); + case GDK_MOTION_NOTIFY: + gtk_widget_get_pointer (g_editor->preview, &x, &y); - bevent = (GdkEventButton *) event; + mevent = (GdkEventMotion *) event; - switch (bevent->button) - { - case 1: - g_editor->preview_last_x = x; - g_editor->preview_button_down = 1; - if (bevent->state & GDK_CONTROL_MASK) - prev_set_background (x); - else - prev_set_foreground (x); - break; + if (x != g_editor->preview_last_x) + { + g_editor->preview_last_x = x; + + if (g_editor->preview_button_down) + { + if (mevent->state & GDK_CONTROL_MASK) + prev_set_background (x); + else + prev_set_foreground (x); + } + else + prev_set_hint (x); + } + break; - case 3: - cpopup_do_popup(); - break; + case GDK_BUTTON_PRESS: + gtk_widget_get_pointer (g_editor->preview, &x, &y); - default: - break; - } + bevent = (GdkEventButton *) event; - break; + switch (bevent->button) + { + case 1: + g_editor->preview_last_x = x; + g_editor->preview_button_down = 1; + if (bevent->state & GDK_CONTROL_MASK) + prev_set_background (x); + else + prev_set_foreground (x); + break; + + case 3: + cpopup_do_popup (); + break; + + default: + break; + } - case GDK_BUTTON_RELEASE: - if (g_editor->preview_button_down) - { - gtk_widget_get_pointer (g_editor->preview, &x, &y); + break; - bevent = (GdkEventButton *) event; + case GDK_BUTTON_RELEASE: + if (g_editor->preview_button_down) + { + gtk_widget_get_pointer (g_editor->preview, &x, &y); - g_editor->preview_last_x = x; - g_editor->preview_button_down = 0; - if (bevent->state & GDK_CONTROL_MASK) - prev_set_background (x); - else - prev_set_foreground (x); - break; - } + bevent = (GdkEventButton *) event; - break; + g_editor->preview_last_x = x; + g_editor->preview_button_down = 0; + if (bevent->state & GDK_CONTROL_MASK) + prev_set_background (x); + else + prev_set_foreground (x); + break; + } - default: - break; - } /* switch */ + break; - return FALSE; -} /* prev_events */ + default: + break; + } + return FALSE; +} /*****/ static void -prev_set_hint(gint x) +prev_set_hint (gint x) { - double xpos; - double r, g, b, a; - double h, s, v; - char str[256]; - - xpos = control_calc_g_pos(x); + double xpos; + double r, g, b, a; + double h, s, v; + gchar str[256]; - grad_get_color_at(xpos, &r, &g, &b, &a); + xpos = control_calc_g_pos (x); - h = r; - s = g; - v = b; + grad_get_color_at (xpos, &r, &g, &b, &a); - calc_rgb_to_hsv(&h, &s, &v); + h = r; + s = g; + v = b; - g_snprintf(str, sizeof(str), _("Position: %0.6f " - "RGB (%0.3f, %0.3f, %0.3f) " - "HSV (%0.3f, %0.3f, %0.3f) " - "Opacity: %0.3f"), - xpos, r, g, b, h * 360.0, s, v, a); + calc_rgb_to_hsv (&h, &s, &v); - ed_set_hint(str); -} /* prev_set_hint */ + g_snprintf (str, sizeof (str), _("Position: %0.6f " + "RGB (%0.3f, %0.3f, %0.3f) " + "HSV (%0.3f, %0.3f, %0.3f) " + "Opacity: %0.3f"), + xpos, r, g, b, h * 360.0, s, v, a); + ed_set_hint (str); +} /*****/ @@ -1995,97 +2123,91 @@ prev_set_background (gint x) /*****/ static void -prev_update(int recalculate) +prev_update (gboolean recalculate) { - long rowsiz; - GtkAdjustment *adjustment; - guint16 width, height; - guint16 pwidth, pheight; - GSList *tmp; - int n; - gradient_t *g; - static gradient_t *last_grad = NULL; - static int last_row = -1; - - /* We only update if we can draw to the widget and a gradient is present */ - - if (curr_gradient == NULL) - return; - if (!GTK_WIDGET_DRAWABLE(g_editor->preview)) - return; - - /* See whether we have to re-create the preview widget */ + long rowsiz; + GtkAdjustment *adjustment; + guint16 width, height; + GSList *tmp; + int n; + gradient_t *g; - width = g_editor->preview->allocation.width; - height = g_editor->preview->allocation.height; + static gradient_t *last_grad = NULL; + static int last_row = -1; - /* hof: do not change preview size on Window resize. - * The original code allows expansion of the preview - * on window resize events. But once expanded, there is no way to shrink - * the window back to the original size. - * A full Bugfix should change the preview size according to the users - * window resize actions. - */ + static guint16 last_width = 0; + static guint16 last_height = 0; - width = GRAD_PREVIEW_WIDTH; - height = GRAD_PREVIEW_HEIGHT; - - pwidth = GTK_PREVIEW(g_editor->preview)->buffer_width; - pheight = GTK_PREVIEW(g_editor->preview)->buffer_height; + /* We only update if we can draw to the widget and a gradient is present */ + if (curr_gradient == NULL) + return; + if (!GTK_WIDGET_DRAWABLE (g_editor->preview)) + return; - if (!g_editor->preview_rows[0] || !g_editor->preview_rows[1] || - (width != pwidth) || (height != pheight)) { - if (g_editor->preview_rows[0]) - g_free(g_editor->preview_rows[0]); + /* See whether we have to re-create the preview widget + * (note that the preview automatically follows the size of it's container) + */ + width = g_editor->preview->allocation.width; + height = g_editor->preview->allocation.height; - if (g_editor->preview_rows[1]) - g_free(g_editor->preview_rows[1]); + if (!g_editor->preview_rows[0] || + !g_editor->preview_rows[1] || + (width != last_width) || + (height != last_height)) + { + if (g_editor->preview_rows[0]) + g_free (g_editor->preview_rows[0]); - gtk_preview_size(GTK_PREVIEW(g_editor->preview), width, height); + if (g_editor->preview_rows[1]) + g_free (g_editor->preview_rows[1]); - rowsiz = width * 3 * sizeof(guchar); + rowsiz = width * 3 * sizeof (guchar); - g_editor->preview_rows[0] = g_malloc(rowsiz); - g_editor->preview_rows[1] = g_malloc(rowsiz); + g_editor->preview_rows[0] = g_malloc (rowsiz); + g_editor->preview_rows[1] = g_malloc (rowsiz); - recalculate = 1; /* Force recalculation */ - } /* if */ + recalculate = TRUE; /* Force recalculation */ + } - /* Have to redraw? */ + last_width = width; + last_height = height; - if (recalculate) { - adjustment = GTK_ADJUSTMENT(g_editor->scroll_data); + /* Have to redraw? */ + if (recalculate) + { + adjustment = GTK_ADJUSTMENT (g_editor->scroll_data); - prev_fill_image(width, height, - adjustment->value, - adjustment->value + adjustment->page_size); + prev_fill_image (width, height, + adjustment->value, + adjustment->value + adjustment->page_size); - gtk_widget_draw(g_editor->preview, NULL); - } /* if */ + gtk_widget_draw (g_editor->preview, NULL); + } - if(last_grad != curr_gradient || last_row < 0) { - n = 0; - tmp = gradients_list; + if (last_grad != curr_gradient || last_row < 0) + { + n = 0; + tmp = gradients_list; - while (tmp) { - g = tmp->data; + while (tmp) + { + g = tmp->data; - if (g == curr_gradient) { - break; /* We found the one we want */ - } /* if */ + if (g == curr_gradient) + break; /* We found the one we want */ - n++; /* Next gradient */ - tmp = g_slist_next(tmp); - } /* while */ - last_grad = curr_gradient; - last_row = n; - } /* if */ + n++; /* Next gradient */ + tmp = g_slist_next (tmp); + } + last_grad = curr_gradient; + last_row = n; + } - draw_small_preview(g_editor->gc,g_editor->clist,curr_gradient,last_row); - /* Update any others that are on screen */ - sel_update_dialogs(last_row,curr_gradient); -} /* prev_update */ + draw_small_preview (g_editor->gc, g_editor->clist, curr_gradient,last_row); + /* Update any others that are on screen */ + sel_update_dialogs (last_row, curr_gradient); +} /*****/ @@ -2152,100 +2274,106 @@ prev_fill_image(int width, int height, double left, double right) /*****/ static gint -control_events(GtkWidget *widget, GdkEvent *event) +control_events (GtkWidget *widget, + GdkEvent *event, + gpointer data) { - gint x, y; - guint32 time; - GdkEventButton *bevent; - grad_segment_t *seg; - - switch (event->type) { - case GDK_EXPOSE: - control_update(0); - break; - - case GDK_LEAVE_NOTIFY: - ed_set_hint(""); - break; - - case GDK_BUTTON_PRESS: - if (g_editor->control_drag_mode == GRAD_DRAG_NONE) { - gtk_widget_get_pointer(g_editor->control, &x, &y); - - bevent = (GdkEventButton *) event; + GdkEventButton *bevent; + grad_segment_t *seg; + gint x, y; + guint32 time; - g_editor->control_last_x = x; - g_editor->control_click_time = bevent->time; + switch (event->type) + { + case GDK_EXPOSE: + control_update (FALSE); + break; - control_button_press(x, y, bevent->button, bevent->state); + case GDK_LEAVE_NOTIFY: + ed_set_hint (""); + break; - if (g_editor->control_drag_mode != GRAD_DRAG_NONE) - gtk_grab_add(widget); - } /* if */ + case GDK_BUTTON_PRESS: + if (g_editor->control_drag_mode == GRAD_DRAG_NONE) + { + gtk_widget_get_pointer (g_editor->control, &x, &y); - break; + bevent = (GdkEventButton *) event; - case GDK_BUTTON_RELEASE: - ed_set_hint(""); + g_editor->control_last_x = x; + g_editor->control_click_time = bevent->time; - if (g_editor->control_drag_mode != GRAD_DRAG_NONE) { - gtk_grab_remove(widget); + control_button_press (x, y, bevent->button, bevent->state); - gtk_widget_get_pointer(g_editor->control, &x, &y); + if (g_editor->control_drag_mode != GRAD_DRAG_NONE) + gtk_grab_add (widget); + } + break; - time = ((GdkEventButton *) event)->time; + case GDK_BUTTON_RELEASE: + ed_set_hint (""); - if ((time - g_editor->control_click_time) >= GRAD_MOVE_TIME) - ed_update_editor(GRAD_UPDATE_PREVIEW); /* Possible move */ - else - if ((g_editor->control_drag_mode == GRAD_DRAG_MIDDLE) || - (g_editor->control_drag_mode == GRAD_DRAG_ALL)) { - seg = g_editor->control_drag_segment; + if (g_editor->control_drag_mode != GRAD_DRAG_NONE) + { + gtk_grab_remove (widget); - if ((g_editor->control_drag_mode == GRAD_DRAG_ALL) && - g_editor->control_compress) - control_extend_selection(seg, control_calc_g_pos(x)); - else - control_select_single_segment(seg); + gtk_widget_get_pointer (g_editor->control, &x, &y); - ed_update_editor(GRAD_UPDATE_CONTROL); - } /* if */ + time = ((GdkEventButton *) event)->time; - g_editor->control_drag_mode = GRAD_DRAG_NONE; - g_editor->control_compress = 0; + if ((time - g_editor->control_click_time) >= GRAD_MOVE_TIME) + ed_update_editor (GRAD_UPDATE_PREVIEW); /* Possible move */ + else + if ((g_editor->control_drag_mode == GRAD_DRAG_MIDDLE) || + (g_editor->control_drag_mode == GRAD_DRAG_ALL)) + { + seg = g_editor->control_drag_segment; - control_do_hint(x, y); - } /* if */ + if ((g_editor->control_drag_mode == GRAD_DRAG_ALL) && + g_editor->control_compress) + control_extend_selection (seg, control_calc_g_pos (x)); + else + control_select_single_segment (seg); - break; + ed_update_editor (GRAD_UPDATE_CONTROL); + } - case GDK_MOTION_NOTIFY: - gtk_widget_get_pointer(g_editor->control, &x, &y); + g_editor->control_drag_mode = GRAD_DRAG_NONE; + g_editor->control_compress = 0; - if (x != g_editor->control_last_x) { - g_editor->control_last_x = x; + control_do_hint (x, y); + } + break; - if (g_editor->control_drag_mode != GRAD_DRAG_NONE) { - time = ((GdkEventButton *) event)->time; + case GDK_MOTION_NOTIFY: + gtk_widget_get_pointer (g_editor->control, &x, &y); - if ((time - g_editor->control_click_time) >= GRAD_MOVE_TIME) - control_motion(x); - } else { - ed_update_editor(GRAD_UPDATE_CONTROL); + if (x != g_editor->control_last_x) + { + g_editor->control_last_x = x; - control_do_hint(x, y); - } /* else */ - } /* if */ + if (g_editor->control_drag_mode != GRAD_DRAG_NONE) + { + time = ((GdkEventButton *) event)->time; - break; + if ((time - g_editor->control_click_time) >= GRAD_MOVE_TIME) + control_motion(x); + } + else + { + ed_update_editor (GRAD_UPDATE_CONTROL); - default: - break; - } /* switch */ + control_do_hint (x, y); + } + } + break; - return FALSE; -} /* control_events */ + default: + break; + } + return FALSE; +} /*****/ @@ -2753,59 +2881,59 @@ control_move(grad_segment_t *range_l, grad_segment_t *range_r, double delta) /*****/ static void -control_update(int recalculate) +control_update (gboolean recalculate) { - gint cwidth, cheight; - gint pwidth, pheight; - GtkAdjustment *adjustment; - - /* We only update if we can redraw and a gradient is present */ - - if (curr_gradient == NULL) - return; - if (!GTK_WIDGET_DRAWABLE(g_editor->control)) - return; - - /* See whether we have to re-create the control pixmap */ - - gdk_window_get_size(g_editor->control->window, &cwidth, &cheight); + GtkAdjustment *adjustment; + gint cwidth, cheight; + gint pwidth, pheight; - /* as long as we have that ugly workaround in prev_update() don't - change the size of the controls either when the window is resized */ - - cwidth = GRAD_PREVIEW_WIDTH; - cheight = GRAD_PREVIEW_HEIGHT; - - if (g_editor->control_pixmap) - gdk_window_get_size(g_editor->control_pixmap, &pwidth, &pheight); + /* We only update if we can redraw and a gradient is present */ + if (curr_gradient == NULL) + return; + if (!GTK_WIDGET_DRAWABLE (g_editor->control)) + return; - if (!g_editor->control_pixmap || (cwidth != pwidth) || (cheight != pheight)) { - if (g_editor->control_pixmap) - gdk_pixmap_unref(g_editor->control_pixmap); + /* See whether we have to re-create the control pixmap + * depending on the preview's width + */ + cwidth = g_editor->preview->allocation.width; + cheight = GRAD_CONTROL_HEIGHT; - g_editor->control_pixmap = gdk_pixmap_new(g_editor->control->window, cwidth, cheight, -1); + if (g_editor->control_pixmap) + gdk_window_get_size (g_editor->control_pixmap, &pwidth, &pheight); - recalculate = 1; - } /* if */ + if (!g_editor->control_pixmap || + (cwidth != pwidth) || + (cheight != pheight)) + { + if (g_editor->control_pixmap) + gdk_pixmap_unref (g_editor->control_pixmap); - /* Have to reset the selection? */ + g_editor->control_pixmap = + gdk_pixmap_new (g_editor->control->window, cwidth, cheight, -1); - if (recalculate) - control_select_single_segment(curr_gradient->segments); + recalculate = TRUE; + } - /* Redraw pixmap */ + /* Avaoid segfault on first invocation */ + if (cwidth < GRAD_PREVIEW_WIDTH) + return; - adjustment = GTK_ADJUSTMENT(g_editor->scroll_data); + /* Have to reset the selection? */ + if (recalculate) + control_select_single_segment (curr_gradient->segments); - control_draw(g_editor->control_pixmap, - cwidth, cheight, - adjustment->value, - adjustment->value + adjustment->page_size); + /* Redraw pixmap */ + adjustment = GTK_ADJUSTMENT (g_editor->scroll_data); - gdk_draw_pixmap(g_editor->control->window, g_editor->control->style->black_gc, - g_editor->control_pixmap, 0, 0, 0, 0, cwidth, cheight); -} /* control_update */ + control_draw (g_editor->control_pixmap, + cwidth, cheight, + adjustment->value, + adjustment->value + adjustment->page_size); + gdk_draw_pixmap (g_editor->control->window, g_editor->control->style->black_gc, + g_editor->control_pixmap, 0, 0, 0, 0, cwidth, cheight); +} /*****/ @@ -2963,560 +3091,536 @@ control_calc_g_pos(int pos) /*****/ static void -cpopup_create_main_menu(void) -{ - GtkWidget *menu; - GtkWidget *menuitem; - GtkWidget *label; - GtkAccelGroup *accel_group; - - menu = gtk_menu_new(); - accel_group = gtk_accel_group_new(); - - g_editor->accel_group = accel_group; - - gtk_menu_set_accel_group (GTK_MENU(menu), accel_group); - gtk_window_add_accel_group (GTK_WINDOW (g_editor->shell), accel_group); - - /* Left endpoint */ - - menuitem = cpopup_create_color_item(&g_editor->left_color_preview, &label); - gtk_label_set(GTK_LABEL(label), _("Left endpoint's color")); - gtk_signal_connect(GTK_OBJECT(menuitem), "activate", - (GtkSignalFunc) cpopup_set_left_color_callback, - NULL); - gtk_menu_append(GTK_MENU(menu), menuitem); - gtk_widget_show(menuitem); - gtk_widget_add_accelerator(menuitem, - "activate", - accel_group, - 'L', 0, - GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED); - - menuitem = gtk_menu_item_new_with_label(_("Load from")); - g_editor->control_left_load_popup = cpopup_create_load_menu(g_editor->left_load_color_boxes, - g_editor->left_load_labels, - _("Left neighbor's right endpoint"), - _("Right endpoint"), - (GtkSignalFunc) - cpopup_load_left_callback, - 'L', GDK_CONTROL_MASK, - 'L', GDK_MOD1_MASK, - 'F', GDK_CONTROL_MASK); - gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), g_editor->control_left_load_popup); - gtk_menu_append(GTK_MENU(menu), menuitem); - gtk_widget_show(menuitem); - - menuitem = gtk_menu_item_new_with_label(_("Save to")); - g_editor->control_left_save_popup = cpopup_create_save_menu(g_editor->left_save_color_boxes, - g_editor->left_save_labels, - (GtkSignalFunc) - cpopup_save_left_callback); - gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), g_editor->control_left_save_popup); - gtk_menu_append(GTK_MENU(menu), menuitem); - gtk_widget_show(menuitem); - - /* Right endpoint */ - - menuitem = gtk_menu_item_new(); - gtk_menu_append(GTK_MENU(menu), menuitem); - gtk_widget_show(menuitem); - - menuitem = cpopup_create_color_item(&g_editor->right_color_preview, &label); - gtk_label_set(GTK_LABEL(label), _("Right endpoint's color")); - gtk_signal_connect(GTK_OBJECT(menuitem), "activate", - (GtkSignalFunc) cpopup_set_right_color_callback, - NULL); - gtk_menu_append(GTK_MENU(menu), menuitem); - gtk_widget_show(menuitem); - gtk_widget_add_accelerator(menuitem, - "activate", - accel_group, - 'R', 0, - GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED); - - menuitem = gtk_menu_item_new_with_label(_("Load from")); - g_editor->control_right_load_popup = cpopup_create_load_menu(g_editor->right_load_color_boxes, - g_editor->right_load_labels, - _("Right neighbor's left endpoint"), - _("Left endpoint"), - (GtkSignalFunc) - cpopup_load_right_callback, - 'R', GDK_CONTROL_MASK, - 'R', GDK_MOD1_MASK, - 'F', GDK_MOD1_MASK); - gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), g_editor->control_right_load_popup); - gtk_menu_append(GTK_MENU(menu), menuitem); - gtk_widget_show(menuitem); - - menuitem = gtk_menu_item_new_with_label(_("Save to")); - g_editor->control_right_save_popup = cpopup_create_save_menu(g_editor->right_save_color_boxes, - g_editor->right_save_labels, - (GtkSignalFunc) - cpopup_save_right_callback); - gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), g_editor->control_right_save_popup); - gtk_menu_append(GTK_MENU(menu), menuitem); - gtk_widget_show(menuitem); - - /* Blending function */ - - menuitem = gtk_menu_item_new(); - gtk_menu_append(GTK_MENU(menu), menuitem); - gtk_widget_show(menuitem); - - menuitem = cpopup_create_menu_item_with_label("", &g_editor->control_blending_label); - g_editor->control_blending_popup = cpopup_create_blending_menu(); - gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), g_editor->control_blending_popup); - gtk_menu_append(GTK_MENU(menu), menuitem); - gtk_widget_show(menuitem); - - /* Coloring type */ - - menuitem = cpopup_create_menu_item_with_label("", &g_editor->control_coloring_label); - g_editor->control_coloring_popup = cpopup_create_coloring_menu(); - gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), g_editor->control_coloring_popup); - gtk_menu_append(GTK_MENU(menu), menuitem); - gtk_widget_show(menuitem); - - /* Operations */ - - menuitem = gtk_menu_item_new(); - gtk_menu_append(GTK_MENU(menu), menuitem); - gtk_widget_show(menuitem); - - /* Split at midpoint */ - - menuitem = cpopup_create_menu_item_with_label("", &g_editor->control_splitm_label); - gtk_signal_connect(GTK_OBJECT(menuitem), "activate", - (GtkSignalFunc) cpopup_split_midpoint_callback, - NULL); - gtk_menu_append(GTK_MENU(menu), menuitem); - gtk_widget_show(menuitem); - gtk_widget_add_accelerator(menuitem, - "activate", - accel_group, - 'S', 0, - GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED); - - /* Split uniformly */ - - menuitem = cpopup_create_menu_item_with_label("", &g_editor->control_splitu_label); - gtk_signal_connect(GTK_OBJECT(menuitem), "activate", - (GtkSignalFunc) cpopup_split_uniform_callback, - NULL); - gtk_menu_append(GTK_MENU(menu), menuitem); - gtk_widget_show(menuitem); - gtk_widget_add_accelerator(menuitem, - "activate", - accel_group, - 'U', 0, - GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED); - - /* Delete */ - - menuitem = cpopup_create_menu_item_with_label("", &g_editor->control_delete_label); - gtk_signal_connect(GTK_OBJECT(menuitem), "activate", - (GtkSignalFunc) cpopup_delete_callback, - NULL); - gtk_menu_append(GTK_MENU(menu), menuitem); - gtk_widget_show(menuitem); - g_editor->control_delete_menu_item = menuitem; - gtk_widget_add_accelerator(menuitem, - "activate", - accel_group, - 'D', 0, - GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED); - - /* Recenter */ - - menuitem = cpopup_create_menu_item_with_label("", &g_editor->control_recenter_label); - gtk_signal_connect(GTK_OBJECT(menuitem), "activate", - (GtkSignalFunc) cpopup_recenter_callback, - NULL); - gtk_menu_append(GTK_MENU(menu), menuitem); - gtk_widget_show(menuitem); - gtk_widget_add_accelerator(menuitem, - "activate", - accel_group, - 'C', 0, - GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED); - - /* Redistribute */ - - menuitem = cpopup_create_menu_item_with_label("", &g_editor->control_redistribute_label); - gtk_signal_connect(GTK_OBJECT(menuitem), "activate", - (GtkSignalFunc) cpopup_redistribute_callback, - NULL); - gtk_menu_append(GTK_MENU(menu), menuitem); - gtk_widget_show(menuitem); - gtk_widget_add_accelerator(menuitem, - "activate", - accel_group, - 'C', GDK_CONTROL_MASK, - GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED); - - /* Selection ops */ - - menuitem = gtk_menu_item_new(); - gtk_menu_append(GTK_MENU(menu), menuitem); - gtk_widget_show(menuitem); - - menuitem = gtk_menu_item_new_with_label(_("Selection operations")); - g_editor->control_sel_ops_popup = cpopup_create_sel_ops_menu(); - gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), g_editor->control_sel_ops_popup); - gtk_menu_append(GTK_MENU(menu), menuitem); - gtk_widget_show(menuitem); - - /* Done */ - - g_editor->control_main_popup = menu; -} /* cpopup_create_main_menu */ +cpopup_create_main_menu (void) +{ + GtkWidget *menu; + GtkWidget *menuitem; + GtkWidget *label; + GtkAccelGroup *accel_group; + menu = gtk_menu_new (); + accel_group = gtk_accel_group_new (); -/*****/ + g_editor->accel_group = accel_group; + + gtk_menu_set_accel_group (GTK_MENU (menu), accel_group); + gtk_window_add_accel_group (GTK_WINDOW (g_editor->shell), accel_group); + + /* Left endpoint */ + menuitem = cpopup_create_color_item (&g_editor->left_color_preview, &label); + gtk_label_set_text (GTK_LABEL (label), _("Left endpoint's color")); + gtk_signal_connect (GTK_OBJECT (menuitem), "activate", + (GtkSignalFunc) cpopup_set_left_color_callback, + NULL); + gtk_menu_append (GTK_MENU (menu), menuitem); + gtk_widget_show (menuitem); + gtk_widget_add_accelerator (menuitem, "activate", + accel_group, + 'L', 0, + GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED); + + menuitem = gtk_menu_item_new_with_label (_("Load from")); + g_editor->control_left_load_popup = + cpopup_create_load_menu (g_editor->left_load_color_boxes, + g_editor->left_load_labels, + _("Left neighbor's right endpoint"), + _("Right endpoint"), + (GtkSignalFunc) cpopup_load_left_callback, + 'L', GDK_CONTROL_MASK, + 'L', GDK_MOD1_MASK, + 'F', GDK_CONTROL_MASK); + gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), + g_editor->control_left_load_popup); + gtk_menu_append (GTK_MENU (menu), menuitem); + gtk_widget_show (menuitem); + + menuitem = gtk_menu_item_new_with_label (_("Save to")); + g_editor->control_left_save_popup = + cpopup_create_save_menu (g_editor->left_save_color_boxes, + g_editor->left_save_labels, + (GtkSignalFunc) cpopup_save_left_callback); + gtk_menu_item_set_submenu (GTK_MENU_ITEM(menuitem), + g_editor->control_left_save_popup); + gtk_menu_append (GTK_MENU (menu), menuitem); + gtk_widget_show (menuitem); + + /* Right endpoint */ + menuitem = gtk_menu_item_new (); + gtk_menu_append (GTK_MENU (menu), menuitem); + gtk_widget_show (menuitem); + + menuitem = cpopup_create_color_item (&g_editor->right_color_preview, &label); + gtk_label_set_text (GTK_LABEL (label), _("Right endpoint's color")); + gtk_signal_connect (GTK_OBJECT (menuitem), "activate", + (GtkSignalFunc) cpopup_set_right_color_callback, + NULL); + gtk_menu_append (GTK_MENU (menu), menuitem); + gtk_widget_show (menuitem); + gtk_widget_add_accelerator (menuitem, "activate", + accel_group, + 'R', 0, + GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED); + + menuitem = gtk_menu_item_new_with_label (_("Load from")); + g_editor->control_right_load_popup = + cpopup_create_load_menu (g_editor->right_load_color_boxes, + g_editor->right_load_labels, + _("Right neighbor's left endpoint"), + _("Left endpoint"), + (GtkSignalFunc) cpopup_load_right_callback, + 'R', GDK_CONTROL_MASK, + 'R', GDK_MOD1_MASK, + 'F', GDK_MOD1_MASK); + gtk_menu_item_set_submenu (GTK_MENU_ITEM(menuitem), + g_editor->control_right_load_popup); + gtk_menu_append (GTK_MENU (menu), menuitem); + gtk_widget_show (menuitem); + + menuitem = gtk_menu_item_new_with_label (_("Save to")); + g_editor->control_right_save_popup = + cpopup_create_save_menu (g_editor->right_save_color_boxes, + g_editor->right_save_labels, + (GtkSignalFunc) cpopup_save_right_callback); + gtk_menu_item_set_submenu (GTK_MENU_ITEM(menuitem), + g_editor->control_right_save_popup); + gtk_menu_append (GTK_MENU (menu), menuitem); + gtk_widget_show (menuitem); + + /* Blending function */ + menuitem = gtk_menu_item_new (); + gtk_menu_append (GTK_MENU (menu), menuitem); + gtk_widget_show (menuitem); + + menuitem = cpopup_create_menu_item_with_label ("", &g_editor->control_blending_label); + g_editor->control_blending_popup = cpopup_create_blending_menu (); + gtk_menu_item_set_submenu (GTK_MENU_ITEM(menuitem), + g_editor->control_blending_popup); + gtk_menu_append (GTK_MENU(menu), menuitem); + gtk_widget_show (menuitem); + + /* Coloring type */ + menuitem = cpopup_create_menu_item_with_label ("", &g_editor->control_coloring_label); + g_editor->control_coloring_popup = cpopup_create_coloring_menu (); + gtk_menu_item_set_submenu (GTK_MENU_ITEM(menuitem), + g_editor->control_coloring_popup); + gtk_menu_append (GTK_MENU (menu), menuitem); + gtk_widget_show (menuitem); + + /* Operations */ + menuitem = gtk_menu_item_new (); + gtk_menu_append (GTK_MENU (menu), menuitem); + gtk_widget_show (menuitem); + + /* Split at midpoint */ + menuitem = cpopup_create_menu_item_with_label ("", &g_editor->control_splitm_label); + gtk_signal_connect (GTK_OBJECT (menuitem), "activate", + (GtkSignalFunc) cpopup_split_midpoint_callback, + NULL); + gtk_menu_append (GTK_MENU (menu), menuitem); + gtk_widget_show (menuitem); + gtk_widget_add_accelerator(menuitem, "activate", + accel_group, + 'S', 0, + GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED); + + /* Split uniformly */ + menuitem = cpopup_create_menu_item_with_label ("", &g_editor->control_splitu_label); + gtk_signal_connect (GTK_OBJECT(menuitem), "activate", + (GtkSignalFunc) cpopup_split_uniform_callback, + NULL); + gtk_menu_append (GTK_MENU (menu), menuitem); + gtk_widget_show (menuitem); + gtk_widget_add_accelerator (menuitem, "activate", + accel_group, + 'U', 0, + GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED); + + /* Delete */ + menuitem = cpopup_create_menu_item_with_label ("", &g_editor->control_delete_label); + gtk_signal_connect (GTK_OBJECT (menuitem), "activate", + (GtkSignalFunc) cpopup_delete_callback, + NULL); + gtk_menu_append (GTK_MENU (menu), menuitem); + gtk_widget_show (menuitem); + g_editor->control_delete_menu_item = menuitem; + gtk_widget_add_accelerator (menuitem, "activate", + accel_group, + 'D', 0, + GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED); + + /* Recenter */ + menuitem = cpopup_create_menu_item_with_label ("", &g_editor->control_recenter_label); + gtk_signal_connect (GTK_OBJECT (menuitem), "activate", + (GtkSignalFunc) cpopup_recenter_callback, + NULL); + gtk_menu_append (GTK_MENU (menu), menuitem); + gtk_widget_show (menuitem); + gtk_widget_add_accelerator (menuitem, "activate", + accel_group, + 'C', 0, + GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED); + + /* Redistribute */ + menuitem = cpopup_create_menu_item_with_label ("", &g_editor->control_redistribute_label); + gtk_signal_connect (GTK_OBJECT (menuitem), "activate", + (GtkSignalFunc) cpopup_redistribute_callback, + NULL); + gtk_menu_append (GTK_MENU (menu), menuitem); + gtk_widget_show (menuitem); + gtk_widget_add_accelerator (menuitem, "activate", + accel_group, + 'C', GDK_CONTROL_MASK, + GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED); + + /* Selection ops */ + menuitem = gtk_menu_item_new (); + gtk_menu_append (GTK_MENU (menu), menuitem); + gtk_widget_show (menuitem); + + menuitem = gtk_menu_item_new_with_label (_("Selection operations")); + g_editor->control_sel_ops_popup = cpopup_create_sel_ops_menu (); + gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), + g_editor->control_sel_ops_popup); + gtk_menu_append (GTK_MENU (menu), menuitem); + gtk_widget_show (menuitem); + + /* Done */ + g_editor->control_main_popup = menu; +} static void -cpopup_do_popup(void) +cpopup_do_popup (void) { - cpopup_adjust_menus(); - gtk_menu_popup(GTK_MENU(g_editor->control_main_popup), NULL, NULL, NULL, NULL, 3, 0); -} /* cpopup_do_popup */ + cpopup_adjust_menus(); + gtk_menu_popup (GTK_MENU (g_editor->control_main_popup), + NULL, NULL, NULL, NULL, 3, 0); +} +/***** Create a single menu item *****/ /*****/ static GtkWidget * -cpopup_create_color_item(GtkWidget **color_box, GtkWidget **label) +cpopup_create_color_item (GtkWidget **color_box, + GtkWidget **label) { - GtkWidget *menuitem; - GtkWidget *hbox; - GtkWidget *vbox; - GtkWidget *wcolor_box; - GtkWidget *wlabel; - - menuitem = gtk_menu_item_new(); - - hbox = gtk_hbox_new(FALSE, 0); - gtk_container_add(GTK_CONTAINER(menuitem), hbox); - gtk_widget_show(hbox); + GtkWidget *menuitem; + GtkWidget *hbox; + GtkWidget *vbox; + GtkWidget *wcolor_box; + GtkWidget *wlabel; - vbox = gtk_vbox_new(FALSE, 0); - gtk_box_pack_start(GTK_BOX(hbox), vbox, FALSE, FALSE, 0); - gtk_widget_show(vbox); + menuitem = gtk_menu_item_new(); - wcolor_box = gtk_preview_new(GTK_PREVIEW_COLOR); - gtk_preview_set_dither (GTK_PREVIEW (wcolor_box), GDK_RGB_DITHER_MAX); - gtk_preview_size(GTK_PREVIEW(wcolor_box), GRAD_COLOR_BOX_WIDTH, GRAD_COLOR_BOX_HEIGHT); - gtk_box_pack_start(GTK_BOX(vbox), wcolor_box, FALSE, FALSE, 2); - gtk_widget_show(wcolor_box); + hbox = gtk_hbox_new (FALSE, 0); + gtk_container_add (GTK_CONTAINER (menuitem), hbox); + gtk_widget_show (hbox); - if (color_box) - *color_box = wcolor_box; + vbox = gtk_vbox_new (FALSE, 0); + gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0); + gtk_widget_show (vbox); - wlabel = gtk_label_new(""); - gtk_misc_set_alignment(GTK_MISC(wlabel), 0.0, 0.5); - gtk_box_pack_start(GTK_BOX(hbox), wlabel, TRUE, TRUE, 4); - gtk_widget_show(wlabel); + wcolor_box = gtk_preview_new (GTK_PREVIEW_COLOR); + gtk_preview_set_dither (GTK_PREVIEW (wcolor_box), GDK_RGB_DITHER_MAX); + gtk_preview_size (GTK_PREVIEW (wcolor_box), + GRAD_COLOR_BOX_WIDTH, GRAD_COLOR_BOX_HEIGHT); + gtk_box_pack_start (GTK_BOX (vbox), wcolor_box, FALSE, FALSE, 2); + gtk_widget_show (wcolor_box); - if (label) - *label = wlabel; + if (color_box) + *color_box = wcolor_box; - return menuitem; -} /* cpopup_create_color_item */ + wlabel = gtk_label_new (""); + gtk_misc_set_alignment (GTK_MISC (wlabel), 0.0, 0.5); + gtk_box_pack_start (GTK_BOX (hbox), wlabel, FALSE, FALSE, 4); + gtk_widget_show (wlabel); + if (label) + *label = wlabel; -/*****/ + return menuitem; +} -static void -cpopup_adjust_menus(void) +static GtkWidget * +cpopup_create_menu_item_with_label (gchar *str, + GtkWidget **label) { - grad_segment_t *seg; - int i; - double fg_r, fg_g, fg_b; - double fg_a; + GtkWidget *menuitem; + GtkWidget *accel_label; - /* Render main menu color boxes */ + menuitem = gtk_menu_item_new (); - cpopup_render_color_box(GTK_PREVIEW(g_editor->left_color_preview), - g_editor->control_sel_l->r0, - g_editor->control_sel_l->g0, - g_editor->control_sel_l->b0, - g_editor->control_sel_l->a0); + accel_label = gtk_accel_label_new (str); + gtk_misc_set_alignment (GTK_MISC (accel_label), 0.0, 0.5); + gtk_container_add (GTK_CONTAINER (menuitem), accel_label); + gtk_accel_label_set_accel_widget (GTK_ACCEL_LABEL (accel_label), menuitem); + gtk_widget_show (accel_label); - cpopup_render_color_box(GTK_PREVIEW(g_editor->right_color_preview), - g_editor->control_sel_r->r1, - g_editor->control_sel_r->g1, - g_editor->control_sel_r->b1, - g_editor->control_sel_r->a1); + if (label) + *label = accel_label; - /* Render load color from endpoint color boxes */ - - if (g_editor->control_sel_l->prev != NULL) - seg = g_editor->control_sel_l->prev; - else - seg = seg_get_last_segment(g_editor->control_sel_l); - - cpopup_render_color_box(GTK_PREVIEW(g_editor->left_load_color_boxes[0]), - seg->r1, - seg->g1, - seg->b1, - seg->a1); - - cpopup_render_color_box(GTK_PREVIEW(g_editor->left_load_color_boxes[1]), - g_editor->control_sel_r->r1, - g_editor->control_sel_r->g1, - g_editor->control_sel_r->b1, - g_editor->control_sel_r->a1); - - if (g_editor->control_sel_r->next != NULL) - seg = g_editor->control_sel_r->next; - else - seg = curr_gradient->segments; - - cpopup_render_color_box(GTK_PREVIEW(g_editor->right_load_color_boxes[0]), - seg->r0, - seg->g0, - seg->b0, - seg->a0); - - cpopup_render_color_box(GTK_PREVIEW(g_editor->right_load_color_boxes[1]), - g_editor->control_sel_l->r0, - g_editor->control_sel_l->g0, - g_editor->control_sel_l->b0, - g_editor->control_sel_l->a0); - - /* Render Foreground color boxes */ - - ed_fetch_foreground(&fg_r, &fg_g, &fg_b, &fg_a); - - cpopup_render_color_box(GTK_PREVIEW(g_editor->left_load_color_boxes[2]), - fg_r, - fg_g, - fg_b, - fg_a); - - cpopup_render_color_box(GTK_PREVIEW(g_editor->right_load_color_boxes[2]), - fg_r, - fg_g, - fg_b, - fg_a); - - /* Render saved color boxes */ - - for (i = 0; i < GRAD_NUM_COLORS; i++) - cpopup_update_saved_color(i, - g_editor->saved_colors[i].r, - g_editor->saved_colors[i].g, - g_editor->saved_colors[i].b, - g_editor->saved_colors[i].a); - - /* Adjust labels */ - - if (g_editor->control_sel_l == g_editor->control_sel_r) { - gtk_label_set(GTK_LABEL(g_editor->control_blending_label), - _("Blending function for segment")); - gtk_label_set(GTK_LABEL(g_editor->control_coloring_label), - _("Coloring type for segment")); - gtk_label_set(GTK_LABEL(g_editor->control_splitm_label), - _("Split segment at midpoint")); - gtk_label_set(GTK_LABEL(g_editor->control_splitu_label), - _("Split segment uniformly")); - gtk_label_set(GTK_LABEL(g_editor->control_delete_label), - _("Delete segment")); - gtk_label_set(GTK_LABEL(g_editor->control_recenter_label), - _("Re-center segment's midpoint")); - gtk_label_set(GTK_LABEL(g_editor->control_redistribute_label), - _("Re-distribute handles in segment")); - gtk_label_set(GTK_LABEL(g_editor->control_flip_label), - _("Flip segment")); - gtk_label_set(GTK_LABEL(g_editor->control_replicate_label), - _("Replicate segment")); - } else { - gtk_label_set(GTK_LABEL(g_editor->control_blending_label), - _("Blending function for selection")); - gtk_label_set(GTK_LABEL(g_editor->control_coloring_label), - _("Coloring type for selection")); - gtk_label_set(GTK_LABEL(g_editor->control_splitm_label), - _("Split segments at midpoints")); - gtk_label_set(GTK_LABEL(g_editor->control_splitu_label), - _("Split segments uniformly")); - gtk_label_set(GTK_LABEL(g_editor->control_delete_label), - _("Delete selection")); - gtk_label_set(GTK_LABEL(g_editor->control_recenter_label), - _("Re-center midpoints in selection")); - gtk_label_set(GTK_LABEL(g_editor->control_redistribute_label), - _("Re-distribute handles in selection")); - gtk_label_set(GTK_LABEL(g_editor->control_flip_label), - _("Flip selection")); - gtk_label_set(GTK_LABEL(g_editor->control_replicate_label), - _("Replicate selection")); - } /* else */ - - /* Adjust blending and coloring menus */ - - cpopup_adjust_blending_menu(); - cpopup_adjust_coloring_menu(); - - /* Can invoke delete? */ - - if ((g_editor->control_sel_l->prev == NULL) && (g_editor->control_sel_r->next == NULL)) - gtk_widget_set_sensitive(g_editor->control_delete_menu_item, FALSE); - else - gtk_widget_set_sensitive(g_editor->control_delete_menu_item, TRUE); - - /* Can invoke blend colors / opacity? */ - - if (g_editor->control_sel_l == g_editor->control_sel_r) { - gtk_widget_set_sensitive(g_editor->control_blend_colors_menu_item, FALSE); - gtk_widget_set_sensitive(g_editor->control_blend_opacity_menu_item, FALSE); - } else { - gtk_widget_set_sensitive(g_editor->control_blend_colors_menu_item, TRUE); - gtk_widget_set_sensitive(g_editor->control_blend_opacity_menu_item, TRUE); - } /* else */ -} /* cpopup_adjust_menus */ + return menuitem; +} +/***** Update all menus *****/ /*****/ static void -cpopup_adjust_blending_menu(void) +cpopup_adjust_menus (void) { - int equal; - long i, num_items; - int type; - - cpopup_check_selection_params(&equal, NULL); - - /* Block activate signals */ - - num_items = sizeof(g_editor->control_blending_items) / sizeof(g_editor->control_blending_items[0]); - - type = (int) g_editor->control_sel_l->type; - - for (i = 0; i < num_items; i++) - gtk_signal_handler_block_by_data(GTK_OBJECT(g_editor->control_blending_items[i]), - (gpointer) i); + grad_segment_t *seg; + int i; + double fg_r, fg_g, fg_b; + double fg_a; + + /* Render main menu color boxes */ + cpopup_render_color_box (GTK_PREVIEW (g_editor->left_color_preview), + g_editor->control_sel_l->r0, + g_editor->control_sel_l->g0, + g_editor->control_sel_l->b0, + g_editor->control_sel_l->a0); + + cpopup_render_color_box (GTK_PREVIEW (g_editor->right_color_preview), + g_editor->control_sel_r->r1, + g_editor->control_sel_r->g1, + g_editor->control_sel_r->b1, + g_editor->control_sel_r->a1); + + /* Render load color from endpoint color boxes */ + + if (g_editor->control_sel_l->prev != NULL) + seg = g_editor->control_sel_l->prev; + else + seg = seg_get_last_segment (g_editor->control_sel_l); + + cpopup_render_color_box (GTK_PREVIEW (g_editor->left_load_color_boxes[0]), + seg->r1, + seg->g1, + seg->b1, + seg->a1); + + cpopup_render_color_box (GTK_PREVIEW (g_editor->left_load_color_boxes[1]), + g_editor->control_sel_r->r1, + g_editor->control_sel_r->g1, + g_editor->control_sel_r->b1, + g_editor->control_sel_r->a1); + + if (g_editor->control_sel_r->next != NULL) + seg = g_editor->control_sel_r->next; + else + seg = curr_gradient->segments; + + cpopup_render_color_box (GTK_PREVIEW (g_editor->right_load_color_boxes[0]), + seg->r0, + seg->g0, + seg->b0, + seg->a0); + + cpopup_render_color_box (GTK_PREVIEW (g_editor->right_load_color_boxes[1]), + g_editor->control_sel_l->r0, + g_editor->control_sel_l->g0, + g_editor->control_sel_l->b0, + g_editor->control_sel_l->a0); + + /* Render Foreground color boxes */ + + ed_fetch_foreground (&fg_r, &fg_g, &fg_b, &fg_a); + + cpopup_render_color_box (GTK_PREVIEW (g_editor->left_load_color_boxes[2]), + fg_r, + fg_g, + fg_b, + fg_a); + + cpopup_render_color_box (GTK_PREVIEW (g_editor->right_load_color_boxes[2]), + fg_r, + fg_g, + fg_b, + fg_a); + + /* Render saved color boxes */ - /* Set state */ + for (i = 0; i < GRAD_NUM_COLORS; i++) + cpopup_update_saved_color(i, + g_editor->saved_colors[i].r, + g_editor->saved_colors[i].g, + g_editor->saved_colors[i].b, + g_editor->saved_colors[i].a); - if (equal) { - gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(g_editor->control_blending_items[type]), - TRUE); - gtk_widget_hide(g_editor->control_blending_items[num_items - 1]); - } else { - gtk_widget_show(g_editor->control_blending_items[num_items - 1]); - gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(g_editor->control_blending_items - [num_items - 1]), - TRUE); - } /* else */ + /* Adjust labels */ - /* Unblock signals */ + if (g_editor->control_sel_l == g_editor->control_sel_r) + { + gtk_label_set_text (GTK_LABEL (g_editor->control_blending_label), + _("Blending function for segment")); + gtk_label_set_text (GTK_LABEL (g_editor->control_coloring_label), + _("Coloring type for segment")); + gtk_label_set_text (GTK_LABEL (g_editor->control_splitm_label), + _("Split segment at midpoint")); + gtk_label_set_text (GTK_LABEL (g_editor->control_splitu_label), + _("Split segment uniformly")); + gtk_label_set_text (GTK_LABEL (g_editor->control_delete_label), + _("Delete segment")); + gtk_label_set_text (GTK_LABEL (g_editor->control_recenter_label), + _("Re-center segment's midpoint")); + gtk_label_set_text (GTK_LABEL (g_editor->control_redistribute_label), + _("Re-distribute handles in segment")); + gtk_label_set_text (GTK_LABEL (g_editor->control_flip_label), + _("Flip segment")); + gtk_label_set_text (GTK_LABEL (g_editor->control_replicate_label), + _("Replicate segment")); + } + else + { + gtk_label_set_text (GTK_LABEL (g_editor->control_blending_label), + _("Blending function for selection")); + gtk_label_set_text (GTK_LABEL (g_editor->control_coloring_label), + _("Coloring type for selection")); + gtk_label_set_text (GTK_LABEL (g_editor->control_splitm_label), + _("Split segments at midpoints")); + gtk_label_set_text (GTK_LABEL (g_editor->control_splitu_label), + _("Split segments uniformly")); + gtk_label_set_text (GTK_LABEL (g_editor->control_delete_label), + _("Delete selection")); + gtk_label_set_text (GTK_LABEL (g_editor->control_recenter_label), + _("Re-center midpoints in selection")); + gtk_label_set_text (GTK_LABEL (g_editor->control_redistribute_label), + _("Re-distribute handles in selection")); + gtk_label_set_text (GTK_LABEL (g_editor->control_flip_label), + _("Flip selection")); + gtk_label_set_text (GTK_LABEL (g_editor->control_replicate_label), + _("Replicate selection")); + } - for (i = 0; i < num_items; i++) - gtk_signal_handler_unblock_by_data(GTK_OBJECT(g_editor->control_blending_items[i]), - (gpointer) i); -} /* cpopup_adjust_blending_menu */ + /* Adjust blending and coloring menus */ + cpopup_adjust_blending_menu (); + cpopup_adjust_coloring_menu (); + /* Can invoke delete? */ + if ((g_editor->control_sel_l->prev == NULL) && + (g_editor->control_sel_r->next == NULL)) + gtk_widget_set_sensitive (g_editor->control_delete_menu_item, FALSE); + else + gtk_widget_set_sensitive (g_editor->control_delete_menu_item, TRUE); -/*****/ + /* Can invoke blend colors / opacity? */ + if (g_editor->control_sel_l == g_editor->control_sel_r) + { + gtk_widget_set_sensitive (g_editor->control_blend_colors_menu_item, FALSE); + gtk_widget_set_sensitive (g_editor->control_blend_opacity_menu_item, FALSE); + } + else + { + gtk_widget_set_sensitive (g_editor->control_blend_colors_menu_item, TRUE); + gtk_widget_set_sensitive (g_editor->control_blend_opacity_menu_item, TRUE); + } +} static void -cpopup_adjust_coloring_menu(void) +cpopup_adjust_blending_menu (void) { - int equal; - long i, num_items; - int coloring; + gint equal; + glong i, num_items; + gint type; - cpopup_check_selection_params(NULL, &equal); + cpopup_check_selection_params (&equal, NULL); - /* Block activate signals */ + /* Block activate signals */ + num_items = (sizeof (g_editor->control_blending_items) / + sizeof (g_editor->control_blending_items[0])); - num_items = sizeof(g_editor->control_coloring_items) / sizeof(g_editor->control_coloring_items[0]); + type = (int) g_editor->control_sel_l->type; - coloring = (int) g_editor->control_sel_l->color; - - for (i = 0; i < num_items; i++) - gtk_signal_handler_block_by_data(GTK_OBJECT(g_editor->control_coloring_items[i]), - (gpointer) i); - - /* Set state */ - - if (equal) { - gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(g_editor->control_coloring_items - [coloring]), - TRUE); - gtk_widget_hide(g_editor->control_coloring_items[num_items - 1]); - } else { - gtk_widget_show(g_editor->control_coloring_items[num_items - 1]); - gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(g_editor->control_coloring_items - [num_items - 1]), - TRUE); - } /* else */ - - /* Unblock signals */ - - for (i = 0; i < num_items; i++) - gtk_signal_handler_unblock_by_data(GTK_OBJECT(g_editor->control_coloring_items[i]), - (gpointer) i); -} /* cpopup_adjust_coloring_menu */ + for (i = 0; i < num_items; i++) + gtk_signal_handler_block_by_data + (GTK_OBJECT (g_editor->control_blending_items[i]), (gpointer) i); + /* Set state */ + if (equal) + { + gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (g_editor->control_blending_items[type]), TRUE); + gtk_widget_hide (g_editor->control_blending_items[num_items - 1]); + } + else + { + gtk_widget_show (g_editor->control_blending_items[num_items - 1]); + gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (g_editor->control_blending_items[num_items - 1]), TRUE); + } -/*****/ + /* Unblock signals */ + for (i = 0; i < num_items; i++) + gtk_signal_handler_unblock_by_data (GTK_OBJECT (g_editor->control_blending_items[i]), (gpointer) i); +} static void -cpopup_check_selection_params(int *equal_blending, int *equal_coloring) +cpopup_adjust_coloring_menu (void) { - grad_type_t type; - grad_color_t color; - int etype, ecolor; - grad_segment_t *seg, *aseg; - - type = g_editor->control_sel_l->type; - color = g_editor->control_sel_l->color; + gint equal; + glong i, num_items; + gint coloring; - etype = 1; - ecolor = 1; + cpopup_check_selection_params (NULL, &equal); - seg = g_editor->control_sel_l; + /* Block activate signals */ + num_items = (sizeof (g_editor->control_coloring_items) / + sizeof (g_editor->control_coloring_items[0])); - do { - etype = etype && (seg->type == type); - ecolor = ecolor && (seg->color == color); + coloring = (int) g_editor->control_sel_l->color; - aseg = seg; - seg = seg->next; - } while (aseg != g_editor->control_sel_r); + for (i = 0; i < num_items; i++) + gtk_signal_handler_block_by_data (GTK_OBJECT (g_editor->control_coloring_items[i]), (gpointer) i); - if (equal_blending) - *equal_blending = etype; + /* Set state */ + if (equal) + { + gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (g_editor->control_coloring_items[coloring]), TRUE); + gtk_widget_hide (g_editor->control_coloring_items[num_items - 1]); + } + else + { + gtk_widget_show (g_editor->control_coloring_items[num_items - 1]); + gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (g_editor->control_coloring_items[num_items - 1]), TRUE); + } - if (equal_coloring) - *equal_coloring = ecolor; -} /* cpopup_check_selection_params */ + /* Unblock signals */ + for (i = 0; i < num_items; i++) + gtk_signal_handler_unblock_by_data (GTK_OBJECT (g_editor->control_coloring_items[i]), (gpointer) i); +} +static void +cpopup_check_selection_params (gint *equal_blending, + gint *equal_coloring) +{ + grad_type_t type; + grad_color_t color; + int etype, ecolor; + grad_segment_t *seg, *aseg; -/*****/ + type = g_editor->control_sel_l->type; + color = g_editor->control_sel_l->color; -static GtkWidget * -cpopup_create_menu_item_with_label(char *str, GtkWidget **label) -{ - GtkWidget *menuitem; - GtkWidget *accel_label; + etype = 1; + ecolor = 1; - menuitem = gtk_menu_item_new(); + seg = g_editor->control_sel_l; - accel_label = gtk_accel_label_new(str); - gtk_misc_set_alignment(GTK_MISC(accel_label), 0.0, 0.5); - gtk_container_add(GTK_CONTAINER(menuitem), accel_label); - gtk_accel_label_set_accel_widget (GTK_ACCEL_LABEL (accel_label), menuitem); - gtk_widget_show(accel_label); + do + { + etype = etype && (seg->type == type); + ecolor = ecolor && (seg->color == color); - if (label) - *label = accel_label; + aseg = seg; + seg = seg->next; + } + while (aseg != g_editor->control_sel_r); - return menuitem; -} /* cpopup_create_menu_item_with_label */ + if (equal_blending) + *equal_blending = etype; + if (equal_coloring) + *equal_coloring = ecolor; +} /*****/ @@ -3590,104 +3694,105 @@ cpopup_render_color_box(GtkPreview *preview, double r, double g, double b, doubl gtk_preview_draw_row(preview, rows[2], 0, y, GRAD_COLOR_BOX_WIDTH); } /* cpopup_render_color_box */ +/***** Creale load & save menus *****/ /*****/ static GtkWidget * -cpopup_create_load_menu(GtkWidget **color_boxes, GtkWidget **labels, - char *label1, char *label2, GtkSignalFunc callback, - gchar accel_key_0, guint8 accel_mods_0, - gchar accel_key_1, guint8 accel_mods_1, - gchar accel_key_2, guint8 accel_mods_2) -{ - GtkWidget *menu; - GtkWidget *menuitem; - GtkAccelGroup *accel_group; - int i; +cpopup_create_load_menu (GtkWidget **color_boxes, + GtkWidget **labels, + gchar *label1, + gchar *label2, + GtkSignalFunc callback, + gchar accel_key_0, guint8 accel_mods_0, + gchar accel_key_1, guint8 accel_mods_1, + gchar accel_key_2, guint8 accel_mods_2) +{ + GtkWidget *menu; + GtkWidget *menuitem; + GtkAccelGroup *accel_group; + gint i; + + menu = gtk_menu_new (); + accel_group = g_editor->accel_group; - menu = gtk_menu_new(); - accel_group = g_editor->accel_group; + gtk_menu_set_accel_group (GTK_MENU (menu), accel_group); - gtk_menu_set_accel_group (GTK_MENU (menu), accel_group); + /* Create items */ + for (i = 0; i < (GRAD_NUM_COLORS + 3); i++) + { + if (i == 3) + { + /* Insert separator between "to fetch" and "saved" colors */ + menuitem = gtk_menu_item_new (); + gtk_menu_append (GTK_MENU (menu), menuitem); + gtk_widget_show (menuitem); + } - /* Create items */ + menuitem = cpopup_create_color_item (&color_boxes[i], &labels[i]); + gtk_signal_connect (GTK_OBJECT (menuitem), "activate", + callback, (gpointer) ((long) i)); + gtk_menu_append (GTK_MENU (menu), menuitem); + gtk_widget_show (menuitem); - for (i = 0; i < (GRAD_NUM_COLORS + 3); i++) { - if (i == 3) { - /* Insert separator between "to fetch" and "saved" colors */ - - menuitem = gtk_menu_item_new(); - gtk_menu_append(GTK_MENU(menu), menuitem); - gtk_widget_show(menuitem); - } /* if */ - - menuitem = cpopup_create_color_item(&color_boxes[i], &labels[i]); - gtk_signal_connect(GTK_OBJECT(menuitem), "activate", - callback, (gpointer) ((long) i)); /* FIXME: I don't like this cast */ - gtk_menu_append(GTK_MENU(menu), menuitem); - gtk_widget_show(menuitem); - - switch (i) { - case 0: - gtk_widget_add_accelerator(menuitem, - "activate", - accel_group, - accel_key_0, accel_mods_0, - GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED); - break; + switch (i) + { + case 0: + gtk_widget_add_accelerator (menuitem, "activate", + accel_group, + accel_key_0, accel_mods_0, + GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED); + break; - case 1: - gtk_widget_add_accelerator(menuitem, - "activate", - accel_group, - accel_key_1, accel_mods_1, - GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED); - break; + case 1: + gtk_widget_add_accelerator (menuitem, "activate", + accel_group, + accel_key_1, accel_mods_1, + GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED); + break; - case 2: - gtk_widget_add_accelerator(menuitem, - "activate", - accel_group, - accel_key_2, accel_mods_2, - GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED); - break; + case 2: + gtk_widget_add_accelerator (menuitem, "activate", + accel_group, + accel_key_2, accel_mods_2, + GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED); + break; - default: - break; - } /* switch */ - } /* for */ - - /* Set labels */ - - gtk_label_set(GTK_LABEL(labels[0]), label1); - gtk_label_set(GTK_LABEL(labels[1]), label2); - gtk_label_set(GTK_LABEL(labels[2]), _("FG color")); - - return menu; -} /* cpopup_create_load_menu */ + default: + break; + } + } + /* Set labels */ + gtk_label_set_text (GTK_LABEL (labels[0]), label1); + gtk_label_set_text (GTK_LABEL (labels[1]), label2); + gtk_label_set_text (GTK_LABEL (labels[2]), _("FG color")); -/*****/ + return menu; +} static GtkWidget * -cpopup_create_save_menu(GtkWidget **color_boxes, GtkWidget **labels, GtkSignalFunc callback) +cpopup_create_save_menu (GtkWidget **color_boxes, + GtkWidget **labels, + GtkSignalFunc callback) { - GtkWidget *menu; - GtkWidget *menuitem; - int i; + GtkWidget *menu; + GtkWidget *menuitem; + gint i; - menu = gtk_menu_new(); + menu = gtk_menu_new (); - for (i = 0; i < GRAD_NUM_COLORS; i++) { - menuitem = cpopup_create_color_item(&color_boxes[i], &labels[i]); - gtk_signal_connect(GTK_OBJECT(menuitem), "activate", - callback, (gpointer) ((long) i)); /* FIXME: I don't like this cast */ - gtk_menu_append(GTK_MENU(menu), menuitem); - gtk_widget_show(menuitem); - } /* for */ + for (i = 0; i < GRAD_NUM_COLORS; i++) + { + menuitem = cpopup_create_color_item (&color_boxes[i], &labels[i]); + gtk_signal_connect (GTK_OBJECT (menuitem), "activate", + callback, (gpointer) ((long) i)); + gtk_menu_append (GTK_MENU (menu), menuitem); + gtk_widget_show (menuitem); + } - return menu; -} /* cpopup_create_save_menu */ + return menu; +} /*****/ @@ -3708,10 +3813,10 @@ cpopup_update_saved_color(int n, double r, double g, double b, double a) g_snprintf(str, sizeof(str), _("RGBA (%0.3f, %0.3f, %0.3f, %0.3f)"), r, g, b, a); - gtk_label_set(GTK_LABEL(g_editor->left_load_labels[n + 3]), str); - gtk_label_set(GTK_LABEL(g_editor->left_save_labels[n]), str); - gtk_label_set(GTK_LABEL(g_editor->right_load_labels[n + 3]), str); - gtk_label_set(GTK_LABEL(g_editor->right_save_labels[n]), str); + gtk_label_set_text (GTK_LABEL (g_editor->left_load_labels[n + 3]), str); + gtk_label_set_text (GTK_LABEL (g_editor->left_save_labels[n]), str); + gtk_label_set_text (GTK_LABEL (g_editor->right_load_labels[n + 3]), str); + gtk_label_set_text (GTK_LABEL (g_editor->right_save_labels[n]), str); g_editor->saved_colors[n].r = r; g_editor->saved_colors[n].g = g; @@ -3880,1462 +3985,1435 @@ cpopup_save_right_callback(GtkWidget *widget, gpointer data) /*****/ -static GtkWidget * -cpopup_create_blending_menu(void) +static void +cpopup_set_color_selection_color(GtkColorSelection *cs, + double r, double g, double b, double a) { - GtkWidget *menu; - GtkWidget *menuitem; - GSList *group; - int i; - int num_items; - - menu = gtk_menu_new(); - group = NULL; - - num_items = sizeof(g_editor->control_blending_items) / sizeof(g_editor->control_blending_items[0]); - - for (i = 0; i < num_items; i++) { - if (i == (num_items - 1)) - menuitem = gtk_radio_menu_item_new_with_label(group, _("(Varies)")); - else - menuitem = gtk_radio_menu_item_new_with_label(group, gettext(blending_types[i])); - - group = gtk_radio_menu_item_group(GTK_RADIO_MENU_ITEM(menuitem)); - - gtk_signal_connect(GTK_OBJECT(menuitem), "activate", - (GtkSignalFunc) cpopup_blending_callback, - (gpointer) ((long) i)); /* FIXME: I don't like this cast */ - - gtk_menu_append(GTK_MENU(menu), menuitem); - gtk_widget_show(menuitem); - - g_editor->control_blending_items[i] = menuitem; - } /* for */ - - /* "Varies" is always disabled */ + gdouble color[4]; - gtk_widget_set_sensitive(g_editor->control_blending_items[num_items - 1], FALSE); + color[0] = r; + color[1] = g; + color[2] = b; + color[3] = a; - return menu; -} /* cpopup_create_blending_menu */ + gtk_color_selection_set_color(cs, color); +} /* cpopup_set_color_selection_color */ /*****/ static void -cpopup_blending_callback(GtkWidget *widget, gpointer data) +cpopup_get_color_selection_color(GtkColorSelection *cs, + double *r, double *g, double *b, double *a) { - grad_type_t type; - grad_segment_t *seg, *aseg; - - if (!GTK_CHECK_MENU_ITEM(widget)->active) - return; /* Do nothing if the menu item is being deactivated */ - - type = (grad_type_t) data; - seg = g_editor->control_sel_l; - - do { - seg->type = type; + gdouble color[4]; - aseg = seg; - seg = seg->next; - } while (aseg != g_editor->control_sel_r); + gtk_color_selection_get_color(cs, color); - curr_gradient->dirty = 1; - ed_update_editor(GRAD_UPDATE_PREVIEW); -} /* cpopup_blending_callback */ + *r = color[0]; + *g = color[1]; + *b = color[2]; + *a = color[3]; +} /* cpopup_get_color_selection_color */ /*****/ -static GtkWidget * -cpopup_create_coloring_menu(void) +static grad_segment_t * +cpopup_save_selection(void) { - GtkWidget *menu; - GtkWidget *menuitem; - GSList *group; - int i; - int num_items; + grad_segment_t *seg, *prev, *tmp; + grad_segment_t *oseg, *oaseg; + + prev = NULL; + oseg = g_editor->control_sel_l; + tmp = NULL; - menu = gtk_menu_new(); - group = NULL; + do { + seg = seg_new_segment(); - num_items = sizeof(g_editor->control_coloring_items) / sizeof(g_editor->control_coloring_items[0]); + *seg = *oseg; /* Copy everything */ - for (i = 0; i < num_items; i++) { - if (i == (num_items - 1)) - menuitem = gtk_radio_menu_item_new_with_label(group, _("(Varies)")); + if (prev == NULL) + tmp = seg; /* Remember first segment */ else - menuitem = gtk_radio_menu_item_new_with_label(group, gettext(coloring_types[i])); - - group = gtk_radio_menu_item_group(GTK_RADIO_MENU_ITEM(menuitem)); + prev->next = seg; - gtk_signal_connect(GTK_OBJECT(menuitem), "activate", - (GtkSignalFunc) cpopup_coloring_callback, - (gpointer) ((long) i)); /* FIXME: I don't like this cast */ + seg->prev = prev; + seg->next = NULL; - gtk_menu_append(GTK_MENU(menu), menuitem); - gtk_widget_show(menuitem); + prev = seg; + oaseg = oseg; + oseg = oseg->next; + } while (oaseg != g_editor->control_sel_r); - g_editor->control_coloring_items[i] = menuitem; - } /* for */ + return tmp; +} /* cpopup_save_selection */ - /* "Varies" is always disabled */ - gtk_widget_set_sensitive(g_editor->control_coloring_items[num_items - 1], FALSE); +/*****/ - return menu; -} /* cpopup_create_coloring_menu */ +static void +cpopup_free_selection(grad_segment_t *seg) +{ + seg_free_segments(seg); +} /* cpopup_free_selection */ /*****/ static void -cpopup_coloring_callback(GtkWidget *widget, gpointer data) +cpopup_replace_selection(grad_segment_t *replace_seg) { - grad_color_t color; - grad_segment_t *seg, *aseg; + grad_segment_t *lseg, *rseg; + grad_segment_t *replace_last; - if (!GTK_CHECK_MENU_ITEM(widget)->active) - return; /* Do nothing if the menu item is being deactivated */ + /* Remember left and right segments */ - color = (grad_color_t) data; - seg = g_editor->control_sel_l; + lseg = g_editor->control_sel_l->prev; + rseg = g_editor->control_sel_r->next; - do { - seg->color = color; + replace_last = seg_get_last_segment(replace_seg); - aseg = seg; - seg = seg->next; - } while (aseg != g_editor->control_sel_r); + /* Free old selection */ - curr_gradient->dirty = 1; - ed_update_editor(GRAD_UPDATE_PREVIEW); -} /* cpopup_coloring_callback */ + g_editor->control_sel_r->next = NULL; + seg_free_segments(g_editor->control_sel_l); -/*****/ + /* Link in new segments */ -static GtkWidget * -cpopup_create_sel_ops_menu(void) -{ - GtkWidget *menu; - GtkWidget *menuitem; - GtkAccelGroup *accel_group; - - menu = gtk_menu_new(); - accel_group = g_editor->accel_group; - - gtk_menu_set_accel_group (GTK_MENU (menu), accel_group); - - /* Flip */ - - menuitem = cpopup_create_menu_item_with_label("", &g_editor->control_flip_label); - gtk_signal_connect(GTK_OBJECT(menuitem), "activate", - (GtkSignalFunc) cpopup_flip_callback, - NULL); - gtk_menu_append(GTK_MENU(menu), menuitem); - gtk_widget_show(menuitem); - gtk_widget_add_accelerator(menuitem, - "activate", - accel_group, - 'F', 0, - GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED); - - /* Replicate */ - - menuitem = cpopup_create_menu_item_with_label("", &g_editor->control_replicate_label); - gtk_signal_connect(GTK_OBJECT(menuitem), "activate", - (GtkSignalFunc) cpopup_replicate_callback, - NULL); - gtk_menu_append(GTK_MENU(menu), menuitem); - gtk_widget_show(menuitem); - gtk_widget_add_accelerator(menuitem, - "activate", - accel_group, - 'M', 0, - GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED); - - /* Blend colors / opacity */ - - menuitem = gtk_menu_item_new(); - gtk_menu_append(GTK_MENU(menu), menuitem); - gtk_widget_show(menuitem); - - menuitem = gtk_menu_item_new_with_label(_("Blend endpoints' colors")); - gtk_signal_connect(GTK_OBJECT(menuitem), "activate", - (GtkSignalFunc) cpopup_blend_colors, - NULL); - gtk_menu_append(GTK_MENU(menu), menuitem); - gtk_widget_show(menuitem); - g_editor->control_blend_colors_menu_item = menuitem; - gtk_widget_add_accelerator(menuitem, - "activate", - accel_group, - 'B', 0, - GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED); - - menuitem = gtk_menu_item_new_with_label(_("Blend endpoints' opacity")); - gtk_signal_connect(GTK_OBJECT(menuitem), "activate", - (GtkSignalFunc) cpopup_blend_opacity, - NULL); - gtk_menu_append(GTK_MENU(menu), menuitem); - gtk_widget_show(menuitem); - gtk_widget_add_accelerator(menuitem, - "activate", - accel_group, - 'B', GDK_CONTROL_MASK, - GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED); - g_editor->control_blend_opacity_menu_item = menuitem; - - return menu; -} /* cpopup_create_sel_ops_menu */ + if (lseg) + lseg->next = replace_seg; + else + curr_gradient->segments = replace_seg; + replace_seg->prev = lseg; -/*****/ + if (rseg) + rseg->prev = replace_last; -static void -cpopup_blend_colors(GtkWidget *widget, gpointer data) -{ - cpopup_blend_endpoints(g_editor->control_sel_l->r0, - g_editor->control_sel_l->g0, - g_editor->control_sel_l->b0, - g_editor->control_sel_l->a0, - g_editor->control_sel_r->r1, - g_editor->control_sel_r->g1, - g_editor->control_sel_r->b1, - g_editor->control_sel_r->a1, - TRUE, FALSE); + replace_last->next = rseg; - curr_gradient->dirty = 1; - ed_update_editor(GRAD_UPDATE_PREVIEW); -} /* cpopup_blend_colors */ + g_editor->control_sel_l = replace_seg; + g_editor->control_sel_r = replace_last; + + curr_gradient->last_visited = NULL; /* Force re-search */ +} /* cpopup_replace_selection */ +/***** Color dialogs for left and right endpoint *****/ /*****/ static void -cpopup_blend_opacity(GtkWidget *widget, gpointer data) -{ - cpopup_blend_endpoints(g_editor->control_sel_l->r0, - g_editor->control_sel_l->g0, - g_editor->control_sel_l->b0, - g_editor->control_sel_l->a0, - g_editor->control_sel_r->r1, - g_editor->control_sel_r->g1, - g_editor->control_sel_r->b1, - g_editor->control_sel_r->a1, - FALSE, TRUE); +cpopup_create_color_dialog (gchar *title, + double r, double g, double b, double a, + GtkSignalFunc color_changed_callback, + GtkSignalFunc ok_callback, + GtkSignalFunc cancel_callback, + GtkSignalFunc delete_callback) +{ + GtkWidget *window; + GtkColorSelection *cs; + GtkColorSelectionDialog *csd; + + window = gtk_color_selection_dialog_new (title); + + csd = GTK_COLOR_SELECTION_DIALOG (window); + cs = GTK_COLOR_SELECTION (csd->colorsel); + + gtk_color_selection_set_opacity (cs, TRUE); + gtk_color_selection_set_update_policy (cs, + g_editor->instant_update ? + GTK_UPDATE_CONTINUOUS : + GTK_UPDATE_DELAYED); + + /* FIXME: this is a hack; we set the color twice so that the + * color selector remembers it as its "old" color, too + */ + cpopup_set_color_selection_color (cs, r, g, b, a); + cpopup_set_color_selection_color (cs, r, g, b, a); - curr_gradient->dirty = 1; - ed_update_editor(GRAD_UPDATE_PREVIEW); -} /* cpopup_blend_opacity */ + gtk_signal_connect (GTK_OBJECT (csd), "delete_event", + delete_callback, window); + gtk_signal_connect (GTK_OBJECT (cs), "color_changed", + color_changed_callback, window); -/*****/ + gtk_signal_connect (GTK_OBJECT (csd->ok_button), "clicked", + ok_callback, window); -static void -cpopup_set_color_selection_color(GtkColorSelection *cs, - double r, double g, double b, double a) -{ - gdouble color[4]; - - color[0] = r; - color[1] = g; - color[2] = b; - color[3] = a; - - gtk_color_selection_set_color(cs, color); -} /* cpopup_set_color_selection_color */ + gtk_signal_connect (GTK_OBJECT (csd->cancel_button), "clicked", + cancel_callback, window); + gtk_window_position (GTK_WINDOW (window), GTK_WIN_POS_MOUSE); + gtk_widget_show (window); +} /*****/ static void -cpopup_get_color_selection_color(GtkColorSelection *cs, - double *r, double *g, double *b, double *a) -{ - gdouble color[4]; - - gtk_color_selection_get_color(cs, color); +cpopup_set_left_color_callback (GtkWidget *widget, + gpointer data) +{ + g_editor->left_saved_dirty = curr_gradient->dirty; + g_editor->left_saved_segments = cpopup_save_selection (); + + cpopup_create_color_dialog (_("Left endpoint's color"), + g_editor->control_sel_l->r0, + g_editor->control_sel_l->g0, + g_editor->control_sel_l->b0, + g_editor->control_sel_l->a0, + (GtkSignalFunc) cpopup_left_color_changed, + (GtkSignalFunc) cpopup_left_color_dialog_ok, + (GtkSignalFunc) cpopup_left_color_dialog_cancel, + (GtkSignalFunc) cpopup_left_color_dialog_delete); - *r = color[0]; - *g = color[1]; - *b = color[2]; - *a = color[3]; -} /* cpopup_get_color_selection_color */ - - -/*****/ + gtk_widget_set_sensitive (g_editor->shell, FALSE); +} static void -cpopup_create_color_dialog(char *title, double r, double g, double b, double a, - GtkSignalFunc color_changed_callback, - GtkSignalFunc ok_callback, - GtkSignalFunc cancel_callback, - GtkSignalFunc delete_callback) +cpopup_left_color_changed (GtkWidget *widget, + gpointer data) { - GtkWidget *window; - GtkColorSelection *cs; - GtkColorSelectionDialog *csd; - - window = gtk_color_selection_dialog_new(title); - - csd = GTK_COLOR_SELECTION_DIALOG(window); - cs = GTK_COLOR_SELECTION(csd->colorsel); - - gtk_color_selection_set_opacity(cs, TRUE); - gtk_color_selection_set_update_policy(cs, - g_editor->instant_update ? - GTK_UPDATE_CONTINUOUS : - GTK_UPDATE_DELAYED); - - - /* FIXME: this is a hack; we set the color twice so that the - * color selector remembers it as its "old" color, too - */ + GtkColorSelection *cs; + double r, g, b, a; - cpopup_set_color_selection_color(cs, r, g, b, a); - cpopup_set_color_selection_color(cs, r, g, b, a); + cs = GTK_COLOR_SELECTION (GTK_COLOR_SELECTION_DIALOG (data)->colorsel); - gtk_signal_connect(GTK_OBJECT(csd), "delete_event", - delete_callback, NULL); + cpopup_get_color_selection_color (cs, &r, &g, &b, &a); - gtk_signal_connect(GTK_OBJECT(cs), "color_changed", - color_changed_callback, window); + cpopup_blend_endpoints (r, g, b, a, + g_editor->control_sel_r->r1, + g_editor->control_sel_r->g1, + g_editor->control_sel_r->b1, + g_editor->control_sel_r->a1, + TRUE, TRUE); - gtk_signal_connect(GTK_OBJECT(csd->ok_button), "clicked", - ok_callback, window); - - gtk_signal_connect(GTK_OBJECT(csd->cancel_button), "clicked", - cancel_callback, window); - - gtk_window_position(GTK_WINDOW(window), GTK_WIN_POS_MOUSE); - gtk_widget_show(window); -} /* cpopup_create_color_dialog */ - - -/*****/ + ed_update_editor (GRAD_UPDATE_PREVIEW); +} -static grad_segment_t * -cpopup_save_selection(void) +static void +cpopup_left_color_dialog_ok (GtkWidget *widget, + gpointer data) { - grad_segment_t *seg, *prev, *tmp; - grad_segment_t *oseg, *oaseg; + cpopup_left_color_changed (widget, data); - prev = NULL; - oseg = g_editor->control_sel_l; - tmp = NULL; - - do { - seg = seg_new_segment(); + curr_gradient->dirty = 1; + cpopup_free_selection(g_editor->left_saved_segments); - *seg = *oseg; /* Copy everything */ - - if (prev == NULL) - tmp = seg; /* Remember first segment */ - else - prev->next = seg; + gtk_widget_destroy (GTK_WIDGET (data)); + gtk_widget_set_sensitive (g_editor->shell, TRUE); +} - seg->prev = prev; - seg->next = NULL; +static void +cpopup_left_color_dialog_cancel (GtkWidget *widget, + gpointer data) +{ + curr_gradient->dirty = g_editor->left_saved_dirty; + cpopup_replace_selection (g_editor->left_saved_segments); + ed_update_editor (GRAD_UPDATE_PREVIEW); - prev = seg; - oaseg = oseg; - oseg = oseg->next; - } while (oaseg != g_editor->control_sel_r); + gtk_widget_destroy (GTK_WIDGET (data)); + gtk_widget_set_sensitive (g_editor->shell, TRUE); +} - return tmp; -} /* cpopup_save_selection */ +static int +cpopup_left_color_dialog_delete (GtkWidget *widget, + GdkEvent *event, + gpointer data) +{ + cpopup_left_color_dialog_cancel (widget, data); + return TRUE; +} /*****/ static void -cpopup_free_selection(grad_segment_t *seg) -{ - seg_free_segments(seg); -} /* cpopup_free_selection */ - +cpopup_set_right_color_callback (GtkWidget *widget, + gpointer data) +{ + g_editor->right_saved_dirty = curr_gradient->dirty; + g_editor->right_saved_segments = cpopup_save_selection (); + + cpopup_create_color_dialog (_("Right endpoint's color"), + g_editor->control_sel_r->r1, + g_editor->control_sel_r->g1, + g_editor->control_sel_r->b1, + g_editor->control_sel_r->a1, + (GtkSignalFunc) cpopup_right_color_changed, + (GtkSignalFunc) cpopup_right_color_dialog_ok, + (GtkSignalFunc) cpopup_right_color_dialog_cancel, + (GtkSignalFunc) cpopup_right_color_dialog_delete); -/*****/ + gtk_widget_set_sensitive (g_editor->shell, FALSE); +} static void -cpopup_replace_selection(grad_segment_t *replace_seg) +cpopup_right_color_changed (GtkWidget *widget, + gpointer data) { - grad_segment_t *lseg, *rseg; - grad_segment_t *replace_last; - - /* Remember left and right segments */ + GtkColorSelection *cs; + double r, g, b, a; - lseg = g_editor->control_sel_l->prev; - rseg = g_editor->control_sel_r->next; + cs = GTK_COLOR_SELECTION (GTK_COLOR_SELECTION_DIALOG (data)->colorsel); - replace_last = seg_get_last_segment(replace_seg); + cpopup_get_color_selection_color (cs, &r, &g, &b, &a); - /* Free old selection */ + cpopup_blend_endpoints (g_editor->control_sel_l->r0, + g_editor->control_sel_l->g0, + g_editor->control_sel_l->b0, + g_editor->control_sel_l->a0, + r, g, b, a, + TRUE, TRUE); - g_editor->control_sel_r->next = NULL; - - seg_free_segments(g_editor->control_sel_l); + ed_update_editor (GRAD_UPDATE_PREVIEW); +} - /* Link in new segments */ +static void +cpopup_right_color_dialog_ok (GtkWidget *widget, + gpointer data) +{ + cpopup_right_color_changed (widget, data); - if (lseg) - lseg->next = replace_seg; - else - curr_gradient->segments = replace_seg; + curr_gradient->dirty = 1; + cpopup_free_selection (g_editor->right_saved_segments); - replace_seg->prev = lseg; + gtk_widget_destroy (GTK_WIDGET (data)); + gtk_widget_set_sensitive (g_editor->shell, TRUE); +} - if (rseg) - rseg->prev = replace_last; +static void +cpopup_right_color_dialog_cancel (GtkWidget *widget, + gpointer data) +{ + curr_gradient->dirty = g_editor->right_saved_dirty; + cpopup_replace_selection (g_editor->right_saved_segments); + ed_update_editor (GRAD_UPDATE_PREVIEW); - replace_last->next = rseg; + gtk_widget_destroy (GTK_WIDGET (data)); + gtk_widget_set_sensitive (g_editor->shell, TRUE); +} - g_editor->control_sel_l = replace_seg; - g_editor->control_sel_r = replace_last; +static int +cpopup_right_color_dialog_delete (GtkWidget *widget, + GdkEvent *event, + gpointer data) +{ + cpopup_right_color_dialog_cancel (widget, data); - curr_gradient->last_visited = NULL; /* Force re-search */ -} /* cpopup_replace_selection */ + return TRUE; +} +/***** Blending menu *****/ /*****/ -static void -cpopup_set_left_color_callback(GtkWidget *widget, gpointer data) +static GtkWidget * +cpopup_create_blending_menu (void) { - g_editor->left_saved_dirty = curr_gradient->dirty; - g_editor->left_saved_segments = cpopup_save_selection(); - - cpopup_create_color_dialog(_("Left endpoint's color"), - g_editor->control_sel_l->r0, - g_editor->control_sel_l->g0, - g_editor->control_sel_l->b0, - g_editor->control_sel_l->a0, - (GtkSignalFunc) cpopup_left_color_changed, - (GtkSignalFunc) cpopup_left_color_dialog_ok, - (GtkSignalFunc) cpopup_left_color_dialog_cancel, - (GtkSignalFunc) cpopup_left_color_dialog_delete); - - gtk_widget_set_sensitive(g_editor->shell, FALSE); -} /* cpopup_set_left_color_callback */ + GtkWidget *menu; + GtkWidget *menuitem; + GSList *group; + gint i; + gint num_items; + menu = gtk_menu_new (); + group = NULL; -/*****/ + num_items = (sizeof (g_editor->control_blending_items) / + sizeof (g_editor->control_blending_items[0])); -static void -cpopup_left_color_changed(GtkWidget *widget, gpointer client_data) -{ - GtkColorSelection *cs; - double r, g, b, a; + for (i = 0; i < num_items; i++) + { + if (i == (num_items - 1)) + menuitem = gtk_radio_menu_item_new_with_label(group, _("(Varies)")); + else + menuitem = + gtk_radio_menu_item_new_with_label (group, + gettext (blending_types[i])); - cs = GTK_COLOR_SELECTION(GTK_COLOR_SELECTION_DIALOG(client_data)->colorsel); + group = gtk_radio_menu_item_group (GTK_RADIO_MENU_ITEM (menuitem)); - cpopup_get_color_selection_color(cs, &r, &g, &b, &a); + gtk_signal_connect (GTK_OBJECT (menuitem), "activate", + (GtkSignalFunc) cpopup_blending_callback, + (gpointer) ((long) i)); - cpopup_blend_endpoints(r, g, b, a, - g_editor->control_sel_r->r1, - g_editor->control_sel_r->g1, - g_editor->control_sel_r->b1, - g_editor->control_sel_r->a1, - TRUE, TRUE); + gtk_menu_append (GTK_MENU (menu), menuitem); + gtk_widget_show (menuitem); - ed_update_editor(GRAD_UPDATE_PREVIEW); -} /* cpopup_left_color_changed */ + g_editor->control_blending_items[i] = menuitem; + } + /* "Varies" is always disabled */ + gtk_widget_set_sensitive (g_editor->control_blending_items[num_items - 1], FALSE); -/*****/ + return menu; +} static void -cpopup_left_color_dialog_ok(GtkWidget *widget, gpointer client_data) +cpopup_blending_callback (GtkWidget *widget, + gpointer data) { - GtkColorSelection *cs; - double r, g, b, a; + grad_type_t type; + grad_segment_t *seg, *aseg; - cs = GTK_COLOR_SELECTION(GTK_COLOR_SELECTION_DIALOG(client_data)->colorsel); + if (!GTK_CHECK_MENU_ITEM (widget)->active) + return; /* Do nothing if the menu item is being deactivated */ - cpopup_get_color_selection_color(cs, &r, &g, &b, &a); + type = (grad_type_t) data; + seg = g_editor->control_sel_l; - cpopup_blend_endpoints(r, g, b, a, - g_editor->control_sel_r->r1, - g_editor->control_sel_r->g1, - g_editor->control_sel_r->b1, - g_editor->control_sel_r->a1, - TRUE, TRUE); + do + { + seg->type = type; - curr_gradient->dirty = 1; - cpopup_free_selection(g_editor->left_saved_segments); - ed_update_editor(GRAD_UPDATE_PREVIEW); + aseg = seg; + seg = seg->next; + } + while (aseg != g_editor->control_sel_r); - gtk_widget_destroy(GTK_WIDGET(client_data)); - gtk_widget_set_sensitive(g_editor->shell, TRUE); -} /* cpopup_left_color_dialog_ok */ + curr_gradient->dirty = 1; + ed_update_editor (GRAD_UPDATE_PREVIEW); +} +/***** Coloring menu *****/ /*****/ -static void -cpopup_left_color_dialog_cancel(GtkWidget *widget, gpointer client_data) +static GtkWidget * +cpopup_create_coloring_menu (void) { - curr_gradient->dirty = g_editor->left_saved_dirty; - cpopup_replace_selection(g_editor->left_saved_segments); - ed_update_editor(GRAD_UPDATE_PREVIEW); - - gtk_widget_destroy(GTK_WIDGET(client_data)); - gtk_widget_set_sensitive(g_editor->shell, TRUE); -} /* cpopup_left_color_dialog_cancel */ + GtkWidget *menu; + GtkWidget *menuitem; + GSList *group; + gint i; + gint num_items; + menu = gtk_menu_new (); + group = NULL; -/*****/ + num_items = (sizeof (g_editor->control_coloring_items) / + sizeof (g_editor->control_coloring_items[0])); -static int -cpopup_left_color_dialog_delete(GtkWidget *widget, GdkEvent *event, - gpointer data) -{ - curr_gradient->dirty = g_editor->left_saved_dirty; - cpopup_replace_selection(g_editor->left_saved_segments); - ed_update_editor(GRAD_UPDATE_PREVIEW); - - gtk_widget_set_sensitive(g_editor->shell, TRUE); - return FALSE; -} /* cpopup_left_color_dialog_delete */ + for (i = 0; i < num_items; i++) + { + if (i == (num_items - 1)) + menuitem = gtk_radio_menu_item_new_with_label(group, _("(Varies)")); + else + menuitem = gtk_radio_menu_item_new_with_label (group, gettext (coloring_types[i])); -/*****/ + group = gtk_radio_menu_item_group (GTK_RADIO_MENU_ITEM (menuitem)); -static void -cpopup_set_right_color_callback(GtkWidget *widget, gpointer data) -{ - g_editor->right_saved_dirty = curr_gradient->dirty; - g_editor->right_saved_segments = cpopup_save_selection(); + gtk_signal_connect (GTK_OBJECT (menuitem), "activate", + (GtkSignalFunc) cpopup_coloring_callback, + (gpointer) ((long) i)); - cpopup_create_color_dialog(_("Right endpoint's color"), - g_editor->control_sel_r->r1, - g_editor->control_sel_r->g1, - g_editor->control_sel_r->b1, - g_editor->control_sel_r->a1, - (GtkSignalFunc) cpopup_right_color_changed, - (GtkSignalFunc) cpopup_right_color_dialog_ok, - (GtkSignalFunc) cpopup_right_color_dialog_cancel, - (GtkSignalFunc) cpopup_right_color_dialog_delete); + gtk_menu_append (GTK_MENU (menu), menuitem); + gtk_widget_show (menuitem); - gtk_widget_set_sensitive(g_editor->shell, FALSE); -} /* cpopup_set_right_color_callback */ + g_editor->control_coloring_items[i] = menuitem; + } + /* "Varies" is always disabled */ + gtk_widget_set_sensitive (g_editor->control_coloring_items[num_items - 1], FALSE); -/*****/ + return menu; +} static void -cpopup_right_color_changed(GtkWidget *widget, gpointer client_data) +cpopup_coloring_callback (GtkWidget *widget, + gpointer data) { - GtkColorSelection *cs; - double r, g, b, a; + grad_color_t color; + grad_segment_t *seg, *aseg; - cs = GTK_COLOR_SELECTION(GTK_COLOR_SELECTION_DIALOG(client_data)->colorsel); + if (! GTK_CHECK_MENU_ITEM (widget)->active) + return; /* Do nothing if the menu item is being deactivated */ - cpopup_get_color_selection_color(cs, &r, &g, &b, &a); + color = (grad_color_t) data; + seg = g_editor->control_sel_l; - cpopup_blend_endpoints(g_editor->control_sel_l->r0, - g_editor->control_sel_l->g0, - g_editor->control_sel_l->b0, - g_editor->control_sel_l->a0, - r, g, b, a, - TRUE, TRUE); + do + { + seg->color = color; - ed_update_editor(GRAD_UPDATE_PREVIEW); -} /* cpopup_right_color_changed */ + aseg = seg; + seg = seg->next; + } + while (aseg != g_editor->control_sel_r); + curr_gradient->dirty = 1; + ed_update_editor (GRAD_UPDATE_PREVIEW); +} /*****/ static void -cpopup_right_color_dialog_ok(GtkWidget *widget, gpointer client_data) +cpopup_split_midpoint_callback (GtkWidget *widget, + gpointer data) { - GtkColorSelection *cs; - double r, g, b, a; + grad_segment_t *seg, *lseg, *rseg; - cs = GTK_COLOR_SELECTION(GTK_COLOR_SELECTION_DIALOG(client_data)->colorsel); + seg = g_editor->control_sel_l; - cpopup_get_color_selection_color(cs, &r, &g, &b, &a); + do + { + cpopup_split_midpoint (seg, &lseg, &rseg); + seg = rseg->next; + } + while (lseg != g_editor->control_sel_r); - cpopup_blend_endpoints(g_editor->control_sel_l->r0, - g_editor->control_sel_l->g0, - g_editor->control_sel_l->b0, - g_editor->control_sel_l->a0, - r, g, b, a, - TRUE, TRUE); + g_editor->control_sel_r = rseg; - curr_gradient->dirty = 1; - cpopup_free_selection(g_editor->right_saved_segments); - ed_update_editor(GRAD_UPDATE_PREVIEW); + curr_gradient->last_visited = NULL; /* Force re-search */ + curr_gradient->dirty = 1; + ed_update_editor (GRAD_UPDATE_PREVIEW | GRAD_UPDATE_CONTROL); +} - gtk_widget_destroy(GTK_WIDGET(client_data)); - gtk_widget_set_sensitive(g_editor->shell, TRUE); -} /* cpopup_right_color_dialog_ok */ +static void +cpopup_split_midpoint (grad_segment_t *lseg, + grad_segment_t **newl, + grad_segment_t **newr) +{ + double r, g, b, a; + grad_segment_t *newseg; + /* Get color at original segment's midpoint */ + grad_get_color_at(lseg->middle, &r, &g, &b, &a); -/*****/ + /* Create a new segment and insert it in the list */ -static void -cpopup_right_color_dialog_cancel(GtkWidget *widget, gpointer client_data) -{ - curr_gradient->dirty = g_editor->right_saved_dirty; - cpopup_replace_selection(g_editor->right_saved_segments); - ed_update_editor(GRAD_UPDATE_PREVIEW); + newseg = seg_new_segment(); - gtk_widget_destroy(GTK_WIDGET(client_data)); - gtk_widget_set_sensitive(g_editor->shell, TRUE); -} /* cpopup_right_color_dialog_cancel */ + newseg->prev = lseg; + newseg->next = lseg->next; + lseg->next = newseg; -/*****/ + if (newseg->next) + newseg->next->prev = newseg; -static int -cpopup_right_color_dialog_delete(GtkWidget *widget, GdkEvent *event, - gpointer data) -{ - curr_gradient->dirty = g_editor->right_saved_dirty; - cpopup_replace_selection(g_editor->right_saved_segments); - ed_update_editor(GRAD_UPDATE_PREVIEW); + /* Set coordinates of new segment */ - gtk_widget_set_sensitive(g_editor->shell, TRUE); - return FALSE; -} /* cpopup_right_color_dialog_delete */ + newseg->left = lseg->middle; + newseg->right = lseg->right; + newseg->middle = (newseg->left + newseg->right) / 2.0; + /* Set coordinates of original segment */ -/*****/ + lseg->right = newseg->left; + lseg->middle = (lseg->left + lseg->right) / 2.0; -static void -cpopup_split_midpoint_callback(GtkWidget *widget, gpointer data) -{ - grad_segment_t *seg, *lseg, *rseg; + /* Set colors of both segments */ - seg = g_editor->control_sel_l; + newseg->r1 = lseg->r1; + newseg->g1 = lseg->g1; + newseg->b1 = lseg->b1; + newseg->a1 = lseg->a1; - do { - cpopup_split_midpoint(seg, &lseg, &rseg); - seg = rseg->next; - } while (lseg != g_editor->control_sel_r); + lseg->r1 = newseg->r0 = r; + lseg->g1 = newseg->g0 = g; + lseg->b1 = newseg->b0 = b; + lseg->a1 = newseg->a0 = a; - g_editor->control_sel_r = rseg; + /* Set parameters of new segment */ - curr_gradient->last_visited = NULL; /* Force re-search */ - curr_gradient->dirty = 1; - ed_update_editor(GRAD_UPDATE_PREVIEW | GRAD_UPDATE_CONTROL); -} /* cpopup_split_midpoint_callback */ + newseg->type = lseg->type; + newseg->color = lseg->color; + + /* Done */ + *newl = lseg; + *newr = newseg; +} /*****/ static void -cpopup_split_uniform_callback(GtkWidget *widget, - gpointer data) +cpopup_split_uniform_callback (GtkWidget *widget, + gpointer data) { GtkWidget *dialog; GtkWidget *vbox; GtkWidget *label; GtkWidget *scale; - GtkWidget *button; GtkObject *scale_data; - /* Create dialog window */ + static ActionAreaItem action_items[] = + { + { N_("Split"), cpopup_split_uniform_split_callback, NULL, NULL }, + { N_("Cancel"), cpopup_split_uniform_cancel_callback, NULL, NULL } + }; + /* Create dialog window */ dialog = gtk_dialog_new (); + gtk_window_set_wmclass (GTK_WINDOW (g_editor->shell), + "gradient_segment_split_uniformly", "Gimp"); gtk_window_set_title (GTK_WINDOW (dialog), (g_editor->control_sel_l == g_editor->control_sel_r) ? _("Split segment uniformly") : _("Split segments uniformly")); gtk_window_position (GTK_WINDOW (dialog), GTK_WIN_POS_MOUSE); - gtk_container_set_border_width (GTK_CONTAINER (dialog), 0); + /* Handle the wm delete event */ + gtk_signal_connect (GTK_OBJECT (dialog), "delete_event", + GTK_SIGNAL_FUNC (cpopup_split_uniform_delete_callback), + dialog); + + /* The main vbox */ vbox = gtk_vbox_new (FALSE, 0); - gtk_container_set_border_width (GTK_CONTAINER (vbox), 8); - gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), vbox, - FALSE, FALSE, 0); + gtk_container_set_border_width (GTK_CONTAINER (vbox), 6); + gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), vbox); gtk_widget_show (vbox); - /* Instructions */ - + /* Instructions */ label = gtk_label_new (_("Please select the number of uniform parts")); - gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.0); gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0); gtk_widget_show (label); - label = gtk_label_new ((g_editor->control_sel_l == g_editor->control_sel_r) ? - _("in which you want to split the selected segment") : - _("in which you want to split the segments in the selection")); - gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.0); + label = + gtk_label_new ((g_editor->control_sel_l == g_editor->control_sel_r) ? + _("in which you want to split the selected segment") : + _("in which you want to split the segments in the selection")); gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0); gtk_widget_show (label); - /* Scale */ - + /* Scale */ g_editor->split_parts = 2; scale_data = gtk_adjustment_new (2.0, 2.0, 21.0, 1.0, 1.0, 1.0); scale = gtk_hscale_new (GTK_ADJUSTMENT (scale_data)); gtk_scale_set_digits (GTK_SCALE (scale), 0); gtk_scale_set_value_pos (GTK_SCALE (scale), GTK_POS_TOP); - gtk_box_pack_start (GTK_BOX (vbox), scale, FALSE, TRUE, 8); + gtk_box_pack_start (GTK_BOX (vbox), scale, FALSE, FALSE, 4); gtk_widget_show (scale); gtk_signal_connect (scale_data, "value_changed", (GtkSignalFunc) cpopup_split_uniform_scale_update, NULL); - /* Buttons */ - - button = ed_create_button (_("Split"), 0.5, 0.5, - (GtkSignalFunc) cpopup_split_uniform_split_callback, - (gpointer) dialog); - GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT); - gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->action_area), - button, TRUE, TRUE, 0); - gtk_widget_grab_default (button); - gtk_widget_show (button); - - button = ed_create_button (_("Cancel"), 0.5, 0.5, - (GtkSignalFunc) cpopup_split_uniform_cancel_callback, - (gpointer) dialog); - GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT); - gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->action_area), - button, TRUE, TRUE, 0); - gtk_widget_show (button); - - /* Show! */ + /* The action area */ + action_items[0].user_data = dialog; + action_items[1].user_data = dialog; + build_action_area (GTK_DIALOG (dialog), action_items, 2, 0); + /* Show! */ gtk_widget_show (dialog); gtk_widget_set_sensitive (g_editor->shell, FALSE); -} /* cpopup_split_uniform_callback */ - - -/*****/ +} static void -cpopup_delete_callback(GtkWidget *widget, gpointer data) +cpopup_split_uniform_scale_update (GtkAdjustment *adjustment, + gpointer data) { - grad_segment_t *lseg, *rseg, *seg, *aseg, *next; - double join; - - /* Remember segments to the left and to the right of the selection */ - - lseg = g_editor->control_sel_l->prev; - rseg = g_editor->control_sel_r->next; - - /* Cannot delete all the segments in the gradient */ - - if ((lseg == NULL) && (rseg == NULL)) - return; - - /* Calculate join point */ - - join = (g_editor->control_sel_l->left + g_editor->control_sel_r->right) / 2.0; - - if (lseg == NULL) - join = 0.0; - else if (rseg == NULL) - join = 1.0; - - /* Move segments */ - - if (lseg != NULL) - control_compress_range(lseg, lseg, lseg->left, join); - - if (rseg != NULL) - control_compress_range(rseg, rseg, join, rseg->right); - - /* Link */ - - if (lseg) - lseg->next = rseg; - - if (rseg) - rseg->prev = lseg; - - /* Delete old segments */ - - seg = g_editor->control_sel_l; - - do { - next = seg->next; - aseg = seg; + g_editor->split_parts = (gint) (adjustment->value + 0.5); +} - seg_free_segment(seg); +static void +cpopup_split_uniform_split_callback (GtkWidget *widget, + gpointer data) +{ + grad_segment_t *seg, *aseg, *lseg, *rseg, *lsel; - seg = next; - } while (aseg != g_editor->control_sel_r); + gtk_widget_destroy (GTK_WIDGET (data)); + gtk_widget_set_sensitive (g_editor->shell, TRUE); - /* Change selection */ + seg = g_editor->control_sel_l; + lsel = NULL; - if (rseg) { - g_editor->control_sel_l = rseg; - g_editor->control_sel_r = rseg; - } else { - g_editor->control_sel_l = lseg; - g_editor->control_sel_r = lseg; - } /* else */ + do + { + aseg = seg; - if (lseg == NULL) - curr_gradient->segments = rseg; + cpopup_split_uniform (seg, g_editor->split_parts, &lseg, &rseg); - /* Done */ + if (seg == g_editor->control_sel_l) + lsel = lseg; - curr_gradient->last_visited = NULL; /* Force re-search */ - curr_gradient->dirty = 1; - - ed_update_editor(GRAD_UPDATE_PREVIEW | GRAD_UPDATE_CONTROL); -} /* cpopup_delete_callback */ + seg = rseg->next; + } + while (aseg != g_editor->control_sel_r); + g_editor->control_sel_l = lsel; + g_editor->control_sel_r = rseg; -/*****/ + curr_gradient->last_visited = NULL; /* Force re-search */ + curr_gradient->dirty = 1; + ed_update_editor (GRAD_UPDATE_PREVIEW | GRAD_UPDATE_CONTROL); +} static void -cpopup_recenter_callback(GtkWidget *wiodget, gpointer data) +cpopup_split_uniform_cancel_callback (GtkWidget *widget, + gpointer data) { - grad_segment_t *seg, *aseg; - - seg = g_editor->control_sel_l; - - do { - seg->middle = (seg->left + seg->right) / 2.0; - - aseg = seg; - seg = seg->next; - } while (aseg != g_editor->control_sel_r); - - curr_gradient->dirty = 1; - ed_update_editor(GRAD_UPDATE_PREVIEW | GRAD_UPDATE_CONTROL); -} /* cpopup_recenter_callback */ - - -/*****/ + gtk_widget_destroy (GTK_WIDGET (data)); + gtk_widget_set_sensitive (g_editor->shell, TRUE); +} -static void -cpopup_redistribute_callback(GtkWidget *widget, gpointer data) +static gint +cpopup_split_uniform_delete_callback (GtkWidget *widget, + GdkEvent *event, + gpointer data) { - grad_segment_t *seg, *aseg; - double left, right, seg_len; - int num_segs; - int i; + cpopup_split_uniform_cancel_callback (widget, data); - /* Count number of segments in selection */ - - num_segs = 0; - seg = g_editor->control_sel_l; - - do { - num_segs++; - aseg = seg; - seg = seg->next; - } while (aseg != g_editor->control_sel_r); - - /* Calculate new segment length */ - - left = g_editor->control_sel_l->left; - right = g_editor->control_sel_r->right; - seg_len = (right - left) / num_segs; - - /* Redistribute */ - - seg = g_editor->control_sel_l; - - for (i = 0; i < num_segs; i++) { - seg->left = left + i * seg_len; - seg->right = left + (i + 1) * seg_len; - seg->middle = (seg->left + seg->right) / 2.0; - - seg = seg->next; - } /* for */ - - /* Fix endpoints to squish accumulative error */ - - g_editor->control_sel_l->left = left; - g_editor->control_sel_r->right = right; - - /* Done */ - - curr_gradient->dirty = 1; - ed_update_editor(GRAD_UPDATE_PREVIEW | GRAD_UPDATE_CONTROL); -} /* cpopup_redistribute_callback */ - - -/*****/ + return TRUE; +} static void -cpopup_flip_callback(GtkWidget *widget, gpointer data) +cpopup_split_uniform (grad_segment_t *lseg, + int parts, + grad_segment_t **newl, + grad_segment_t **newr) { - grad_segment_t *oseg, *oaseg; - grad_segment_t *seg, *prev, *tmp; - grad_segment_t *lseg, *rseg; - double left, right; - - left = g_editor->control_sel_l->left; - right = g_editor->control_sel_r->right; - - /* Build flipped segments */ - - prev = NULL; - oseg = g_editor->control_sel_r; - tmp = NULL; - - do { - seg = seg_new_segment(); - - if (prev == NULL) { - seg->left = left; - tmp = seg; /* Remember first segment */ - } else - seg->left = left + right - oseg->right; - - seg->middle = left + right - oseg->middle; - seg->right = left + right - oseg->left; - - seg->r0 = oseg->r1; - seg->g0 = oseg->g1; - seg->b0 = oseg->b1; - seg->a0 = oseg->a1; - - seg->r1 = oseg->r0; - seg->g1 = oseg->g0; - seg->b1 = oseg->b0; - seg->a1 = oseg->a0; - - switch (oseg->type) { - case GRAD_SPHERE_INCREASING: - seg->type = GRAD_SPHERE_DECREASING; - break; - - case GRAD_SPHERE_DECREASING: - seg->type = GRAD_SPHERE_INCREASING; - break; - - default: - seg->type = oseg->type; - } /* switch */ + grad_segment_t *seg, *prev, *tmp; + gdouble seg_len; + gint i; - switch (oseg->color) { - case GRAD_HSV_CCW: - seg->color = GRAD_HSV_CW; - break; + seg_len = (lseg->right - lseg->left) / parts; /* Length of divisions */ - case GRAD_HSV_CW: - seg->color = GRAD_HSV_CCW; - break; + seg = NULL; + prev = NULL; + tmp = NULL; - default: - seg->color = oseg->color; - } /* switch */ + for (i = 0; i < parts; i++) + { + seg = seg_new_segment(); - seg->prev = prev; - seg->next = NULL; + if (i == 0) + tmp = seg; /* Remember first segment */ - if (prev) - prev->next = seg; + seg->left = lseg->left + i * seg_len; + seg->right = lseg->left + (i + 1) * seg_len; + seg->middle = (seg->left + seg->right) / 2.0; - prev = seg; + grad_get_color_at (seg->left, &seg->r0, &seg->g0, &seg->b0, &seg->a0); + grad_get_color_at (seg->right, &seg->r1, &seg->g1, &seg->b1, &seg->a1); - oaseg = oseg; - oseg = oseg->prev; /* Move backwards! */ - } while (oaseg != g_editor->control_sel_l); - - seg->right = right; /* Squish accumulative error */ + seg->type = lseg->type; + seg->color = lseg->color; - /* Free old segments */ + seg->prev = prev; + seg->next = NULL; - lseg = g_editor->control_sel_l->prev; - rseg = g_editor->control_sel_r->next; + if (prev) + prev->next = seg; - oseg = g_editor->control_sel_l; + prev = seg; + } - do { - oaseg = oseg->next; - seg_free_segment(oseg); - oseg = oaseg; - } while (oaseg != rseg); + /* Fix edges */ - /* Link in new segments */ + tmp->r0 = lseg->r0; + tmp->g0 = lseg->g0; + tmp->b0 = lseg->b0; + tmp->a0 = lseg->a0; - if (lseg) - lseg->next = tmp; - else - curr_gradient->segments = tmp; + seg->r1 = lseg->r1; + seg->g1 = lseg->g1; + seg->b1 = lseg->b1; + seg->a1 = lseg->a1; - tmp->prev = lseg; + tmp->left = lseg->left; + seg->right = lseg->right; /* To squish accumulative error */ - seg->next = rseg; + /* Link in list */ - if (rseg) - rseg->prev = seg; + tmp->prev = lseg->prev; + seg->next = lseg->next; - /* Reset selection */ + if (lseg->prev) + lseg->prev->next = tmp; + else + curr_gradient->segments = tmp; /* We are on leftmost segment */ - g_editor->control_sel_l = tmp; - g_editor->control_sel_r = seg; + if (lseg->next) + lseg->next->prev = seg; - /* Done */ + curr_gradient->last_visited = NULL; /* Force re-search */ - curr_gradient->last_visited = NULL; /* Force re-search */ - curr_gradient->dirty = 1; + /* Done */ + + *newl = tmp; + *newr = seg; - ed_update_editor(GRAD_UPDATE_PREVIEW | GRAD_UPDATE_CONTROL); -} /* cpopup_flip_callback */ + /* Delete old segment */ + seg_free_segment (lseg); +} /*****/ static void -cpopup_replicate_callback(GtkWidget *widget, gpointer data) +cpopup_delete_callback (GtkWidget *widget, + gpointer data) { - GtkWidget *dialog; - GtkWidget *vbox; - GtkWidget *label; - GtkWidget *scale; - GtkWidget *button; - GtkObject *scale_data; + grad_segment_t *lseg, *rseg, *seg, *aseg, *next; + double join; - /* Create dialog window */ + /* Remember segments to the left and to the right of the selection */ - dialog = gtk_dialog_new (); - gtk_window_set_title (GTK_WINDOW (dialog), - (g_editor->control_sel_l == g_editor->control_sel_r) ? - _("Replicate segment") : - _("Replicate selection")); - gtk_window_position (GTK_WINDOW (dialog), GTK_WIN_POS_MOUSE); - gtk_container_set_border_width (GTK_CONTAINER (dialog), 0); + lseg = g_editor->control_sel_l->prev; + rseg = g_editor->control_sel_r->next; - vbox = gtk_vbox_new (FALSE, 0); - gtk_container_set_border_width (GTK_CONTAINER (vbox), 8); - gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), vbox, - FALSE, FALSE, 0); - gtk_widget_show (vbox); + /* Cannot delete all the segments in the gradient */ - /* Instructions */ + if ((lseg == NULL) && (rseg == NULL)) + return; - label = gtk_label_new (_("Please select the number of times")); - gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.0); - gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0); - gtk_widget_show (label); + /* Calculate join point */ - label = gtk_label_new ((g_editor->control_sel_l == g_editor->control_sel_r) ? - _("you want to replicate the selected segment") : - _("you want to replicate the selection")); - gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.0); - gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0); - gtk_widget_show (label); + join = (g_editor->control_sel_l->left + g_editor->control_sel_r->right) / 2.0; - /* Scale */ + if (lseg == NULL) + join = 0.0; + else if (rseg == NULL) + join = 1.0; - g_editor->replicate_times = 2; - scale_data = gtk_adjustment_new (2.0, 2.0, 21.0, 1.0, 1.0, 1.0); + /* Move segments */ - scale = gtk_hscale_new (GTK_ADJUSTMENT (scale_data)); - gtk_scale_set_digits (GTK_SCALE (scale), 0); - gtk_scale_set_value_pos (GTK_SCALE (scale), GTK_POS_TOP); - gtk_box_pack_start (GTK_BOX (vbox), scale, FALSE, TRUE, 8); - gtk_widget_show (scale); + if (lseg != NULL) + control_compress_range (lseg, lseg, lseg->left, join); - gtk_signal_connect (scale_data, "value_changed", - (GtkSignalFunc) cpopup_replicate_scale_update, - NULL); + if (rseg != NULL) + control_compress_range (rseg, rseg, join, rseg->right); - /* Buttons */ + /* Link */ - button = ed_create_button (_("Replicate"), 0.5, 0.5, - (GtkSignalFunc) cpopup_do_replicate_callback, - (gpointer) dialog); - GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT); - gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->action_area), - button, TRUE, TRUE, 0); - gtk_widget_grab_default (button); - gtk_widget_show (button); + if (lseg) + lseg->next = rseg; - button = ed_create_button (_("Cancel"), 0.5, 0.5, - (GtkSignalFunc) cpopup_replicate_cancel_callback, - (gpointer) dialog); - GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT); - gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->action_area), - button, TRUE, TRUE, 0); - gtk_widget_show (button); + if (rseg) + rseg->prev = lseg; - /* Show! */ + /* Delete old segments */ - gtk_widget_show (dialog); - gtk_widget_set_sensitive (g_editor->shell, FALSE); -} /* cpopup_replicate_callback */ + seg = g_editor->control_sel_l; + + do + { + next = seg->next; + aseg = seg; + + seg_free_segment (seg); + + seg = next; + } + while (aseg != g_editor->control_sel_r); + /* Change selection */ + + if (rseg) + { + g_editor->control_sel_l = rseg; + g_editor->control_sel_r = rseg; + } + else + { + g_editor->control_sel_l = lseg; + g_editor->control_sel_r = lseg; + } + + if (lseg == NULL) + curr_gradient->segments = rseg; + + /* Done */ + + curr_gradient->last_visited = NULL; /* Force re-search */ + curr_gradient->dirty = 1; + + ed_update_editor (GRAD_UPDATE_PREVIEW | GRAD_UPDATE_CONTROL); +} /*****/ static void -cpopup_split_uniform_scale_update(GtkAdjustment *adjustment, gpointer data) +cpopup_recenter_callback (GtkWidget *wiodget, + gpointer data) { - g_editor->split_parts = (int) (adjustment->value + 0.5); /* We have to round */ -} /* cpopup_split_uniform_scale_update */ + grad_segment_t *seg, *aseg; + + seg = g_editor->control_sel_l; + + do + { + seg->middle = (seg->left + seg->right) / 2.0; + + aseg = seg; + seg = seg->next; + } + while (aseg != g_editor->control_sel_r); + curr_gradient->dirty = 1; + ed_update_editor (GRAD_UPDATE_PREVIEW | GRAD_UPDATE_CONTROL); +} /*****/ static void -cpopup_split_uniform_split_callback(GtkWidget *widget, gpointer client_data) +cpopup_redistribute_callback (GtkWidget *widget, + gpointer data) { - grad_segment_t *seg, *aseg, *lseg, *rseg, *lsel; + grad_segment_t *seg, *aseg; + double left, right, seg_len; + int num_segs; + int i; - gtk_widget_destroy(GTK_WIDGET(client_data)); - gtk_widget_set_sensitive(g_editor->shell, TRUE); + /* Count number of segments in selection */ - seg = g_editor->control_sel_l; - lsel = NULL; + num_segs = 0; + seg = g_editor->control_sel_l; - do { - aseg = seg; + do + { + num_segs++; + aseg = seg; + seg = seg->next; + } + while (aseg != g_editor->control_sel_r); - cpopup_split_uniform(seg, g_editor->split_parts, &lseg, &rseg); + /* Calculate new segment length */ - if (seg == g_editor->control_sel_l) - lsel = lseg; + left = g_editor->control_sel_l->left; + right = g_editor->control_sel_r->right; + seg_len = (right - left) / num_segs; - seg = rseg->next; - } while (aseg != g_editor->control_sel_r); + /* Redistribute */ - g_editor->control_sel_l = lsel; - g_editor->control_sel_r = rseg; + seg = g_editor->control_sel_l; - curr_gradient->last_visited = NULL; /* Force re-search */ - curr_gradient->dirty = 1; - ed_update_editor(GRAD_UPDATE_PREVIEW | GRAD_UPDATE_CONTROL); -} /* cpopup_split_uniform_split_callback */ + for (i = 0; i < num_segs; i++) + { + seg->left = left + i * seg_len; + seg->right = left + (i + 1) * seg_len; + seg->middle = (seg->left + seg->right) / 2.0; + seg = seg->next; + } -/*****/ + /* Fix endpoints to squish accumulative error */ -static void -cpopup_split_uniform_cancel_callback(GtkWidget *widget, gpointer client_data) -{ - gtk_widget_destroy(GTK_WIDGET(client_data)); - gtk_widget_set_sensitive(g_editor->shell, TRUE); -} /* cpopup_split_uniform_cancel_callback */ + g_editor->control_sel_l->left = left; + g_editor->control_sel_r->right = right; + + /* Done */ + + curr_gradient->dirty = 1; + ed_update_editor (GRAD_UPDATE_PREVIEW | GRAD_UPDATE_CONTROL); +} +/***** Control popup -> selection options functions *****/ /*****/ -static void -cpopup_replicate_scale_update(GtkAdjustment *adjustment, gpointer data) +static GtkWidget * +cpopup_create_sel_ops_menu (void) { - g_editor->replicate_times = (int) (adjustment->value + 0.5); /* We have to round */ -} /* cpopup_replicate_scale_update */ + GtkWidget *menu; + GtkWidget *menuitem; + GtkAccelGroup *accel_group; + + menu = gtk_menu_new (); + accel_group = g_editor->accel_group; + + gtk_menu_set_accel_group (GTK_MENU (menu), accel_group); + /* Flip */ + menuitem = + cpopup_create_menu_item_with_label ("", &g_editor->control_flip_label); + gtk_signal_connect (GTK_OBJECT (menuitem), "activate", + (GtkSignalFunc) cpopup_flip_callback, + NULL); + gtk_menu_append (GTK_MENU (menu), menuitem); + gtk_widget_show (menuitem); + gtk_widget_add_accelerator (menuitem, "activate", + accel_group, + 'F', 0, + GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED); + + /* Replicate */ + menuitem = + cpopup_create_menu_item_with_label ("", &g_editor->control_replicate_label); + gtk_signal_connect (GTK_OBJECT (menuitem), "activate", + (GtkSignalFunc) cpopup_replicate_callback, + NULL); + gtk_menu_append (GTK_MENU (menu), menuitem); + gtk_widget_show (menuitem); + gtk_widget_add_accelerator (menuitem, "activate", + accel_group, + 'M', 0, + GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED); + + /* Blend colors / opacity */ + menuitem = gtk_menu_item_new (); + gtk_menu_append (GTK_MENU (menu), menuitem); + gtk_widget_show (menuitem); + + menuitem = gtk_menu_item_new_with_label (_("Blend endpoints' colors")); + gtk_signal_connect (GTK_OBJECT (menuitem), "activate", + (GtkSignalFunc) cpopup_blend_colors, + NULL); + gtk_menu_append (GTK_MENU (menu), menuitem); + gtk_widget_show (menuitem); + g_editor->control_blend_colors_menu_item = menuitem; + gtk_widget_add_accelerator (menuitem, "activate", + accel_group, + 'B', 0, + GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED); + + menuitem = gtk_menu_item_new_with_label (_("Blend endpoints' opacity")); + gtk_signal_connect (GTK_OBJECT (menuitem), "activate", + (GtkSignalFunc) cpopup_blend_opacity, + NULL); + gtk_menu_append (GTK_MENU (menu), menuitem); + gtk_widget_show (menuitem); + gtk_widget_add_accelerator (menuitem, "activate", + accel_group, + 'B', GDK_CONTROL_MASK, + GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED); + g_editor->control_blend_opacity_menu_item = menuitem; + + return menu; +} /*****/ static void -cpopup_do_replicate_callback(GtkWidget *widget, gpointer client_data) +cpopup_flip_callback (GtkWidget *widget, + gpointer data) { - double sel_left, sel_right, sel_len; - double new_left; - double factor; - grad_segment_t *prev, *seg, *tmp; - grad_segment_t *oseg, *oaseg; - grad_segment_t *lseg, *rseg; - int i; + grad_segment_t *oseg, *oaseg; + grad_segment_t *seg, *prev, *tmp; + grad_segment_t *lseg, *rseg; + double left, right; - gtk_widget_destroy(GTK_WIDGET(client_data)); - gtk_widget_set_sensitive(g_editor->shell, TRUE); + left = g_editor->control_sel_l->left; + right = g_editor->control_sel_r->right; - /* Remember original parameters */ + /* Build flipped segments */ - sel_left = g_editor->control_sel_l->left; - sel_right = g_editor->control_sel_r->right; - sel_len = sel_right - sel_left; - - factor = 1.0 / g_editor->replicate_times; - - /* Build replicated segments */ + prev = NULL; + oseg = g_editor->control_sel_r; + tmp = NULL; - prev = NULL; - seg = NULL; - tmp = NULL; + do + { + seg = seg_new_segment (); - for (i = 0; i < g_editor->replicate_times; i++) { - /* Build one cycle */ + if (prev == NULL) + { + seg->left = left; + tmp = seg; /* Remember first segment */ + } + else + seg->left = left + right - oseg->right; - new_left = sel_left + i * factor * sel_len; + seg->middle = left + right - oseg->middle; + seg->right = left + right - oseg->left; - oseg = g_editor->control_sel_l; + seg->r0 = oseg->r1; + seg->g0 = oseg->g1; + seg->b0 = oseg->b1; + seg->a0 = oseg->a1; - do { - seg = seg_new_segment(); + seg->r1 = oseg->r0; + seg->g1 = oseg->g0; + seg->b1 = oseg->b0; + seg->a1 = oseg->a0; - if (prev == NULL) { - seg->left = sel_left; - tmp = seg; /* Remember first segment */ - } else - seg->left = new_left + factor * (oseg->left - sel_left); + switch (oseg->type) + { + case GRAD_SPHERE_INCREASING: + seg->type = GRAD_SPHERE_DECREASING; + break; - seg->middle = new_left + factor * (oseg->middle - sel_left); - seg->right = new_left + factor * (oseg->right - sel_left); + case GRAD_SPHERE_DECREASING: + seg->type = GRAD_SPHERE_INCREASING; + break; - seg->r0 = oseg->r0; - seg->g0 = oseg->g0; - seg->b0 = oseg->b0; - seg->a0 = oseg->a0; + default: + seg->type = oseg->type; + } - seg->r1 = oseg->r1; - seg->g1 = oseg->g1; - seg->b1 = oseg->b1; - seg->a1 = oseg->a1; + switch (oseg->color) + { + case GRAD_HSV_CCW: + seg->color = GRAD_HSV_CW; + break; - seg->type = oseg->type; - seg->color = oseg->color; + case GRAD_HSV_CW: + seg->color = GRAD_HSV_CCW; + break; - seg->prev = prev; - seg->next = NULL; + default: + seg->color = oseg->color; + } - if (prev) - prev->next = seg; + seg->prev = prev; + seg->next = NULL; - prev = seg; + if (prev) + prev->next = seg; - oaseg = oseg; - oseg = oseg->next; - } while (oaseg != g_editor->control_sel_r); - } /* for */ + prev = seg; - seg->right = sel_right; /* Squish accumulative error */ + oaseg = oseg; + oseg = oseg->prev; /* Move backwards! */ + } + while (oaseg != g_editor->control_sel_l); - /* Free old segments */ + seg->right = right; /* Squish accumulative error */ - lseg = g_editor->control_sel_l->prev; - rseg = g_editor->control_sel_r->next; + /* Free old segments */ - oseg = g_editor->control_sel_l; + lseg = g_editor->control_sel_l->prev; + rseg = g_editor->control_sel_r->next; - do { - oaseg = oseg->next; - seg_free_segment(oseg); - oseg = oaseg; - } while (oaseg != rseg); + oseg = g_editor->control_sel_l; - /* Link in new segments */ + do + { + oaseg = oseg->next; + seg_free_segment (oseg); + oseg = oaseg; + } + while (oaseg != rseg); - if (lseg) - lseg->next = tmp; - else - curr_gradient->segments = tmp; + /* Link in new segments */ - tmp->prev = lseg; + if (lseg) + lseg->next = tmp; + else + curr_gradient->segments = tmp; - seg->next = rseg; + tmp->prev = lseg; - if (rseg) - rseg->prev = seg; + seg->next = rseg; - /* Reset selection */ + if (rseg) + rseg->prev = seg; - g_editor->control_sel_l = tmp; - g_editor->control_sel_r = seg; + /* Reset selection */ - /* Done */ + g_editor->control_sel_l = tmp; + g_editor->control_sel_r = seg; - curr_gradient->last_visited = NULL; /* Force re-search */ - curr_gradient->dirty = 1; + /* Done */ - ed_update_editor(GRAD_UPDATE_PREVIEW | GRAD_UPDATE_CONTROL); -} /* cpopup_do_replicate_callback */ + curr_gradient->last_visited = NULL; /* Force re-search */ + curr_gradient->dirty = 1; + ed_update_editor (GRAD_UPDATE_PREVIEW | GRAD_UPDATE_CONTROL); +} /*****/ static void -cpopup_replicate_cancel_callback(GtkWidget *widget, gpointer client_data) +cpopup_replicate_callback (GtkWidget *widget, + gpointer data) { - gtk_widget_destroy(GTK_WIDGET(client_data)); - gtk_widget_set_sensitive(g_editor->shell, TRUE); -} /* cpopup_replicate_cancel_callback */ + GtkWidget *dialog; + GtkWidget *vbox; + GtkWidget *label; + GtkWidget *scale; + GtkObject *scale_data; + static ActionAreaItem action_items[] = + { + { N_("Replicate"), cpopup_do_replicate_callback, NULL, NULL }, + { N_("Cancel"), cpopup_replicate_cancel_callback, NULL, NULL } + }; -/*****/ + /* Create dialog window */ + dialog = gtk_dialog_new (); + gtk_window_set_wmclass (GTK_WINDOW (dialog), + "gradient_segment_replicate", "Gimp"); + gtk_window_set_title (GTK_WINDOW (dialog), + (g_editor->control_sel_l == g_editor->control_sel_r) ? + _("Replicate segment") : + _("Replicate selection")); + gtk_window_position (GTK_WINDOW (dialog), GTK_WIN_POS_MOUSE); -static void -cpopup_blend_endpoints(double r0, double g0, double b0, double a0, - double r1, double g1, double b1, double a1, - int blend_colors, int blend_opacity) -{ - double dr, dg, db, da; - double left, len; - grad_segment_t *seg, *aseg; + /* Handle the wm delete event */ + gtk_signal_connect (GTK_OBJECT (dialog), "delete_event", + GTK_SIGNAL_FUNC (cpopup_replicate_delete_callback), + dialog); - dr = r1 - r0; - dg = g1 - g0; - db = b1 - b0; - da = a1 - a0; + vbox = gtk_vbox_new (FALSE, 0); + gtk_container_set_border_width (GTK_CONTAINER (vbox), 6); + gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), vbox); + gtk_widget_show (vbox); - left = g_editor->control_sel_l->left; - len = g_editor->control_sel_r->right - left; + /* Instructions */ + label = gtk_label_new (_("Please select the number of times")); + gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0); + gtk_widget_show (label); - seg = g_editor->control_sel_l; + label = gtk_label_new ((g_editor->control_sel_l == g_editor->control_sel_r) ? + _("you want to replicate the selected segment") : + _("you want to replicate the selection")); + gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0); + gtk_widget_show (label); - do { - if (blend_colors) { - seg->r0 = r0 + (seg->left - left) / len * dr; - seg->g0 = g0 + (seg->left - left) / len * dg; - seg->b0 = b0 + (seg->left - left) / len * db; + /* Scale */ + g_editor->replicate_times = 2; + scale_data = gtk_adjustment_new (2.0, 2.0, 21.0, 1.0, 1.0, 1.0); - seg->r1 = r0 + (seg->right - left) / len * dr; - seg->g1 = g0 + (seg->right - left) / len * dg; - seg->b1 = b0 + (seg->right - left) / len * db; - } /* if */ + scale = gtk_hscale_new (GTK_ADJUSTMENT (scale_data)); + gtk_scale_set_digits (GTK_SCALE (scale), 0); + gtk_scale_set_value_pos (GTK_SCALE (scale), GTK_POS_TOP); + gtk_box_pack_start (GTK_BOX (vbox), scale, FALSE, TRUE, 4); + gtk_widget_show (scale); - if (blend_opacity) { - seg->a0 = a0 + (seg->left - left) / len * da; - seg->a1 = a0 + (seg->right - left) / len * da; - } /* if */ + gtk_signal_connect (scale_data, "value_changed", + (GtkSignalFunc) cpopup_replicate_scale_update, + NULL); - aseg = seg; - seg = seg->next; - } while (aseg != g_editor->control_sel_r); -} /* cpopup_blend_endpoints */ + /* The action area */ + action_items[0].user_data = dialog; + action_items[1].user_data = dialog; + build_action_area (GTK_DIALOG (dialog), action_items, 2, 1); + /* Show! */ + gtk_widget_show (dialog); + gtk_widget_set_sensitive (g_editor->shell, FALSE); +} -/*****/ +static void +cpopup_replicate_scale_update (GtkAdjustment *adjustment, + gpointer data) +{ + g_editor->replicate_times = (int) (adjustment->value + 0.5); +} static void -cpopup_split_midpoint(grad_segment_t *lseg, grad_segment_t **newl, grad_segment_t **newr) +cpopup_do_replicate_callback (GtkWidget *widget, + gpointer data) { - double r, g, b, a; - grad_segment_t *newseg; + gdouble sel_left, sel_right, sel_len; + gdouble new_left; + gdouble factor; + grad_segment_t *prev, *seg, *tmp; + grad_segment_t *oseg, *oaseg; + grad_segment_t *lseg, *rseg; + gint i; - /* Get color at original segment's midpoint */ + gtk_widget_destroy (GTK_WIDGET (data)); + gtk_widget_set_sensitive (g_editor->shell, TRUE); - grad_get_color_at(lseg->middle, &r, &g, &b, &a); + /* Remember original parameters */ + sel_left = g_editor->control_sel_l->left; + sel_right = g_editor->control_sel_r->right; + sel_len = sel_right - sel_left; - /* Create a new segment and insert it in the list */ + factor = 1.0 / g_editor->replicate_times; - newseg = seg_new_segment(); + /* Build replicated segments */ - newseg->prev = lseg; - newseg->next = lseg->next; + prev = NULL; + seg = NULL; + tmp = NULL; - lseg->next = newseg; + for (i = 0; i < g_editor->replicate_times; i++) + { + /* Build one cycle */ - if (newseg->next) - newseg->next->prev = newseg; + new_left = sel_left + i * factor * sel_len; - /* Set coordinates of new segment */ + oseg = g_editor->control_sel_l; - newseg->left = lseg->middle; - newseg->right = lseg->right; - newseg->middle = (newseg->left + newseg->right) / 2.0; + do + { + seg = seg_new_segment(); - /* Set coordinates of original segment */ + if (prev == NULL) + { + seg->left = sel_left; + tmp = seg; /* Remember first segment */ + } + else + seg->left = new_left + factor * (oseg->left - sel_left); - lseg->right = newseg->left; - lseg->middle = (lseg->left + lseg->right) / 2.0; + seg->middle = new_left + factor * (oseg->middle - sel_left); + seg->right = new_left + factor * (oseg->right - sel_left); - /* Set colors of both segments */ + seg->r0 = oseg->r0; + seg->g0 = oseg->g0; + seg->b0 = oseg->b0; + seg->a0 = oseg->a0; - newseg->r1 = lseg->r1; - newseg->g1 = lseg->g1; - newseg->b1 = lseg->b1; - newseg->a1 = lseg->a1; + seg->r1 = oseg->r1; + seg->g1 = oseg->g1; + seg->b1 = oseg->b1; + seg->a1 = oseg->a1; - lseg->r1 = newseg->r0 = r; - lseg->g1 = newseg->g0 = g; - lseg->b1 = newseg->b0 = b; - lseg->a1 = newseg->a0 = a; + seg->type = oseg->type; + seg->color = oseg->color; - /* Set parameters of new segment */ + seg->prev = prev; + seg->next = NULL; - newseg->type = lseg->type; - newseg->color = lseg->color; + if (prev) + prev->next = seg; - /* Done */ + prev = seg; - *newl = lseg; - *newr = newseg; -} /* cpopup_split_midpoint */ + oaseg = oseg; + oseg = oseg->next; + } + while (oaseg != g_editor->control_sel_r); + } + seg->right = sel_right; /* Squish accumulative error */ -/*****/ + /* Free old segments */ -static void -cpopup_split_uniform(grad_segment_t *lseg, int parts, - grad_segment_t **newl, grad_segment_t **newr) -{ - grad_segment_t *seg, *prev, *tmp; - double seg_len; - int i; + lseg = g_editor->control_sel_l->prev; + rseg = g_editor->control_sel_r->next; - seg_len = (lseg->right - lseg->left) / parts; /* Length of divisions */ + oseg = g_editor->control_sel_l; - seg = NULL; - prev = NULL; - tmp = NULL; + do + { + oaseg = oseg->next; + seg_free_segment(oseg); + oseg = oaseg; + } + while (oaseg != rseg); - for (i = 0; i < parts; i++) { - seg = seg_new_segment(); + /* Link in new segments */ - if (i == 0) - tmp = seg; /* Remember first segment */ + if (lseg) + lseg->next = tmp; + else + curr_gradient->segments = tmp; - seg->left = lseg->left + i * seg_len; - seg->right = lseg->left + (i + 1) * seg_len; - seg->middle = (seg->left + seg->right) / 2.0; + tmp->prev = lseg; - grad_get_color_at(seg->left, &seg->r0, &seg->g0, &seg->b0, &seg->a0); - grad_get_color_at(seg->right, &seg->r1, &seg->g1, &seg->b1, &seg->a1); + seg->next = rseg; - seg->type = lseg->type; - seg->color = lseg->color; + if (rseg) + rseg->prev = seg; - seg->prev = prev; - seg->next = NULL; + /* Reset selection */ - if (prev) - prev->next = seg; + g_editor->control_sel_l = tmp; + g_editor->control_sel_r = seg; - prev = seg; - } /* for */ + /* Done */ + + curr_gradient->last_visited = NULL; /* Force re-search */ + curr_gradient->dirty = 1; - /* Fix edges */ + ed_update_editor (GRAD_UPDATE_PREVIEW | GRAD_UPDATE_CONTROL); +} + +static void +cpopup_replicate_cancel_callback (GtkWidget *widget, + gpointer data) +{ + gtk_widget_destroy (GTK_WIDGET (data)); + gtk_widget_set_sensitive (g_editor->shell, TRUE); +} - tmp->r0 = lseg->r0; - tmp->g0 = lseg->g0; - tmp->b0 = lseg->b0; - tmp->a0 = lseg->a0; +static gint +cpopup_replicate_delete_callback (GtkWidget *widget, + GdkEvent *event, + gpointer data) +{ + cpopup_replicate_cancel_callback (widget, data); - seg->r1 = lseg->r1; - seg->g1 = lseg->g1; - seg->b1 = lseg->b1; - seg->a1 = lseg->a1; + return TRUE; +} - tmp->left = lseg->left; - seg->right = lseg->right; /* To squish accumulative error */ +/*****/ - /* Link in list */ +static void +cpopup_blend_colors (GtkWidget *widget, + gpointer data) +{ + cpopup_blend_endpoints (g_editor->control_sel_l->r0, + g_editor->control_sel_l->g0, + g_editor->control_sel_l->b0, + g_editor->control_sel_l->a0, + g_editor->control_sel_r->r1, + g_editor->control_sel_r->g1, + g_editor->control_sel_r->b1, + g_editor->control_sel_r->a1, + TRUE, FALSE); + + curr_gradient->dirty = 1; + ed_update_editor (GRAD_UPDATE_PREVIEW); +} - tmp->prev = lseg->prev; - seg->next = lseg->next; +static void +cpopup_blend_opacity (GtkWidget *widget, + gpointer data) +{ + cpopup_blend_endpoints (g_editor->control_sel_l->r0, + g_editor->control_sel_l->g0, + g_editor->control_sel_l->b0, + g_editor->control_sel_l->a0, + g_editor->control_sel_r->r1, + g_editor->control_sel_r->g1, + g_editor->control_sel_r->b1, + g_editor->control_sel_r->a1, + FALSE, TRUE); + + curr_gradient->dirty = 1; + ed_update_editor (GRAD_UPDATE_PREVIEW); +} - if (lseg->prev) - lseg->prev->next = tmp; - else - curr_gradient->segments = tmp; /* We are on leftmost segment */ +/***** Main blend function *****/ - if (lseg->next) - lseg->next->prev = seg; +/*****/ - curr_gradient->last_visited = NULL; /* Force re-search */ +static void +cpopup_blend_endpoints (double r0, double g0, double b0, double a0, + double r1, double g1, double b1, double a1, + int blend_colors, + int blend_opacity) +{ + double dr, dg, db, da; + double left, len; + grad_segment_t *seg, *aseg; - /* Done */ + dr = r1 - r0; + dg = g1 - g0; + db = b1 - b0; + da = a1 - a0; - *newl = tmp; - *newr = seg; + left = g_editor->control_sel_l->left; + len = g_editor->control_sel_r->right - left; - /* Delete old segment */ + seg = g_editor->control_sel_l; - seg_free_segment(lseg); -} /* cpopup_split_uniform */ + do + { + if (blend_colors) + { + seg->r0 = r0 + (seg->left - left) / len * dr; + seg->g0 = g0 + (seg->left - left) / len * dg; + seg->b0 = b0 + (seg->left - left) / len * db; + + seg->r1 = r0 + (seg->right - left) / len * dr; + seg->g1 = g0 + (seg->right - left) / len * dg; + seg->b1 = b0 + (seg->right - left) / len * db; + } + if (blend_opacity) + { + seg->a0 = a0 + (seg->left - left) / len * da; + seg->a1 = a0 + (seg->right - left) / len * da; + } + + aseg = seg; + seg = seg->next; + } + while (aseg != g_editor->control_sel_r); +} /***** Gradient functions *****/ @@ -5978,87 +6056,92 @@ calc_hsv_to_rgb(double *h, double *s, double *v) /*****/ -static char * -build_user_filename(char *name, char *path_str) +static gchar * +build_user_filename (gchar *name, + gchar *path_str) { - char *home; - char *local_path; - char *first_token; - char *token; - char *path; - char *filename; - - g_assert(name != NULL); + gchar *home; + gchar *local_path; + gchar *first_token; + gchar *token; + gchar *path; + gchar *filename; - if (!path_str) - return NULL; /* Perhaps this is not a good idea */ + g_assert (name != NULL); - /* Get the first path specified in the list */ + if (!path_str) + return NULL; /* Perhaps this is not a good idea */ - home = g_get_home_dir (); - local_path = g_strdup(path_str); - first_token = local_path; - token = xstrsep(&first_token, G_SEARCHPATH_SEPARATOR_S); - filename = NULL; + /* Get the first path specified in the list */ - if (token) { - if (*token == '~') { - if (!home) - return NULL; - path = g_strdup_printf("%s%s", home, token + 1); - } else { - path = g_strdup(token); - } /* else */ + home = g_get_home_dir (); + local_path = g_strdup (path_str); + first_token = local_path; + token = xstrsep (&first_token, G_SEARCHPATH_SEPARATOR_S); + filename = NULL; - filename = g_strdup_printf("%s" G_DIR_SEPARATOR_S "%s", - path, name); + if (token) + { + if (*token == '~') + { + if (!home) + return NULL; + path = g_strdup_printf ("%s%s", home, token + 1); + } + else + { + path = g_strdup (token); + } - g_free(path); - } /* if */ + filename = g_strdup_printf ("%s" G_DIR_SEPARATOR_S "%s", + path, name); - g_free(local_path); + g_free (path); + } - return filename; -} /* build_user_filename */ + g_free (local_path); + return filename; +} gint -grad_set_grad_to_name(gchar *name) +grad_set_grad_to_name (gchar *name) { GSList *list; gradient_t *grad; - int n = 0; + gint n = 0; list = gradients_list; - while (list) { - grad = list->data; + while (list) + { + grad = list->data; - if (strcmp(grad->name, name) == 0) { - /* We found it! */ - - /* Select that gradient in the listbox */ - /* Only if gradient editor has been created */ - - if(g_editor) + if (strcmp (grad->name, name) == 0) { - gtk_clist_select_row(GTK_CLIST(g_editor->clist),n,-1); - gtk_clist_moveto(GTK_CLIST(g_editor->clist),n,0,0.5,0.0); - } - else - { - /* force internal structs to use selected gradient */ - GSList* tmp = g_slist_nth(gradients_list,n); - if(tmp) - curr_gradient = (gradient_t *)(tmp->data); + /* We found it! */ + + /* Select that gradient in the listbox */ + /* Only if gradient editor has been created */ + if (g_editor) + { + gtk_clist_select_row (GTK_CLIST (g_editor->clist), n, -1); + gtk_clist_moveto (GTK_CLIST (g_editor->clist), n, 0, 0.5, 0.0); + } + else + { + /* force internal structs to use selected gradient */ + GSList* tmp = g_slist_nth (gradients_list,n); + if(tmp) + curr_gradient = (gradient_t *) (tmp->data); + } + return TRUE; } - return TRUE; - } /* if */ - n++; - list = g_slist_next(list); - } /* while */ - + n++; + list = g_slist_next (list); + } + return FALSE; } diff --git a/app/widgets/gimppaletteeditor.c b/app/widgets/gimppaletteeditor.c index 26834c670f..f1ecbf5dc7 100644 --- a/app/widgets/gimppaletteeditor.c +++ b/app/widgets/gimppaletteeditor.c @@ -39,7 +39,6 @@ #include "datafiles.h" #include "devices.h" #include "errors.h" -#include "general.h" #include "gimprc.h" #include "gradient_header.h" #include "gradient.h" @@ -50,16 +49,16 @@ #include "palette_select.h" #include "dialog_handler.h" +#include "libgimp/gimpintl.h" + #include "pixmaps/zoom_in.xpm" #include "pixmaps/zoom_out.xpm" -#include "libgimp/gimpintl.h" - #define ENTRY_WIDTH 12 #define ENTRY_HEIGHT 10 -#define SPACING 1 -#define COLUMNS 16 -#define ROWS 11 +#define SPACING 1 +#define COLUMNS 16 +#define ROWS 11 #define PREVIEW_WIDTH ((ENTRY_WIDTH * COLUMNS) + (SPACING * (COLUMNS + 1))) #define PREVIEW_HEIGHT ((ENTRY_HEIGHT * ROWS) + (SPACING * (ROWS + 1))) @@ -70,7 +69,7 @@ #define IMPORT_PREVIEW_WIDTH 80 #define IMPORT_PREVIEW_HEIGHT 80 -#define MAX_IMAGE_COLOURS (10000*2) +#define MAX_IMAGE_COLORS (10000*2) typedef enum { @@ -78,8 +77,10 @@ typedef enum IMAGE_IMPORT = 1, } ImportType; +typedef struct _ImportDialog ImportDialog; -struct _ImportDialog { +struct _ImportDialog +{ GtkWidget *dialog; GtkWidget *preview; GtkWidget *entry; @@ -98,11 +99,10 @@ struct _ImportDialog { GimpImage *gimage; }; +typedef struct _PaletteDialog PaletteDialog; -typedef struct _ImportDialog ImportDialog ,*ImportDialogP; -typedef struct _Palette _Palette, *PaletteP; - -struct _Palette { +struct _PaletteDialog +{ GtkWidget *shell; GtkWidget *color_area; GtkWidget *scrolled_window; @@ -121,38 +121,46 @@ struct _Palette { gint freeze_update; }; +/* This one is called from palette_select.c */ +void palette_clist_init(GtkWidget *clist, GtkWidget *shell, GdkGC *gc); + +/* Local function prototypes */ +static void palette_entries_free (PaletteEntriesP); +static void palette_entries_load (char *); +static void palette_entry_free (PaletteEntryP); +static void palette_entries_save (PaletteEntriesP, char *); + +PaletteDialog * create_palette_dialog (gboolean vert); + +static void palette_draw_entries (PaletteDialog *palette, gint row_start, + gint column_highlight); +static void redraw_palette (PaletteDialog *palette); + +static GSList * palette_entries_insert_list (GSList *list, + PaletteEntriesP entries, gint pos); +static void palette_draw_small_preview (GdkGC *gc, PaletteEntriesP p_entry); +static void palette_scroll_clist_to_current (PaletteDialog *palette); +static void palette_update_small_preview (PaletteDialog *palette); +static void palette_scroll_top_left (PaletteDialog *palette); + +static ImportDialog * palette_import_dialog (PaletteDialog *palette); +static void palette_import_dialog_callback (GtkWidget *, gpointer); +static void import_palette_create_from_image (GImage *gimage, + guchar *pname, + PaletteDialog *palette); + +static void palette_merge_dialog_callback (GtkWidget *, gpointer); -static void palette_entries_free (PaletteEntriesP); -static void palette_entries_load (char *); -static void palette_entry_free (PaletteEntryP); -static void palette_entries_save (PaletteEntriesP, char *); - -PaletteP create_palette_dialog (gint vert); -static void palette_draw_entries (PaletteP palette,gint row_start, gint column_highlight); -static void redraw_palette(PaletteP palette); -static GSList * palette_entries_insert_list (GSList *list,PaletteEntriesP entries,gint pos); -void palette_clist_init(GtkWidget *clist, - GtkWidget *shell, - GdkGC *gc); -static void palette_draw_small_preview(GdkGC *gc, PaletteEntriesP p_entry); -static void palette_scroll_clist_to_current(PaletteP palette); -static void palette_update_small_preview(PaletteP palette); -static void palette_scroll_top_left(PaletteP palette); -static ImportDialogP palette_import_dialog(PaletteP palette); -static void palette_import_dialog_callback (GtkWidget *w,gpointer client_data); -static void import_palette_create_from_image (GImage *gimage,guchar *pname,PaletteP palette); -static void palette_merge_dialog_callback (GtkWidget *w,gpointer client_data); - - -GSList *palette_entries_list = NULL; + +GSList *palette_entries_list = NULL; static PaletteEntriesP default_palette_entries = NULL; -static int num_palette_entries = 0; -static unsigned char foreground[3] = { 0, 0, 0 }; -static unsigned char background[3] = { 255, 255, 255 }; -static ImportDialogP import_dialog = NULL; +static gint num_palette_entries = 0; +static guchar foreground[3] = { 0, 0, 0 }; +static guchar background[3] = { 255, 255, 255 }; +static ImportDialog *import_dialog = NULL; -PaletteP top_level_edit_palette = NULL; -PaletteP top_level_palette = NULL; +PaletteDialog *top_level_edit_palette = NULL; +PaletteDialog *top_level_palette = NULL; static void palette_entries_free (PaletteEntriesP entries) @@ -175,14 +183,14 @@ palette_entries_free (PaletteEntriesP entries) } static void -palette_entries_delete (char *filename) +palette_entries_delete (gchar *filename) { if (filename) unlink (filename); } void -palettes_init (int no_data) +palettes_init (gint no_data) { palette_init_palettes (no_data); } @@ -221,9 +229,9 @@ palettes_free () } void -palette_get_foreground (unsigned char *r, - unsigned char *g, - unsigned char *b) +palette_get_foreground (guchar *r, + guchar *g, + guchar *b) { *r = foreground[0]; *g = foreground[1]; @@ -231,9 +239,9 @@ palette_get_foreground (unsigned char *r, } void -palette_get_background (unsigned char *r, - unsigned char *g, - unsigned char *b) +palette_get_background (guchar *r, + guchar *g, + guchar *b) { *r = background[0]; *g = background[1]; @@ -241,11 +249,11 @@ palette_get_background (unsigned char *r, } void -palette_set_foreground (int r, - int g, - int b) +palette_set_foreground (gint r, + gint g, + gint b) { - unsigned char rr, gg, bb; + guchar rr, gg, bb; /* Foreground */ foreground[0] = r; @@ -262,11 +270,11 @@ palette_set_foreground (int r, } void -palette_set_background (int r, - int g, - int b) +palette_set_background (gint r, + gint g, + gint b) { - unsigned char rr, gg, bb; + guchar rr, gg, bb; /* Background */ background[0] = r; @@ -292,8 +300,8 @@ palette_set_default_colors (void) void palette_swap_colors (void) { - unsigned char fg_r, fg_g, fg_b; - unsigned char bg_r, bg_g, bg_b; + guchar fg_r, fg_g, fg_b; + guchar bg_r, bg_g, bg_b; palette_get_foreground (&fg_r, &fg_g, &fg_b); palette_get_background (&bg_r, &bg_g, &bg_b); @@ -303,20 +311,20 @@ palette_swap_colors (void) } void -palette_init_palettes (int no_data) +palette_init_palettes (gint no_data) { - if(!no_data) + if (!no_data) datafiles_read_directories (palette_path, palette_entries_load, 0); } static void -palette_select2_set_text_all(PaletteEntriesP entries) +palette_select2_set_text_all (PaletteEntriesP entries) { gint pos = 0; - char *num_buf; + gchar *num_buf; GSList *plist; - PaletteP pp; + PaletteDialog *pp; PaletteEntriesP p_entries = NULL; gchar * num_copy; @@ -335,38 +343,38 @@ palette_select2_set_text_all(PaletteEntriesP entries) if(p_entries == NULL) return; /* This is actually and error */ - num_buf = g_strdup_printf("%d",p_entries->n_colors);; + num_buf = g_strdup_printf ("%d", p_entries->n_colors);; - num_copy = g_strdup(num_buf); + num_copy = g_strdup (num_buf); pp = top_level_palette; - gtk_clist_set_text(GTK_CLIST(pp->clist),pos,1,num_copy); - redraw_palette(pp); + gtk_clist_set_text (GTK_CLIST (pp->clist), pos, 1, num_copy); + redraw_palette (pp); } static void -palette_select2_refresh_all() +palette_select2_refresh_all () { - PaletteP pp; + PaletteDialog *pp; if(!top_level_palette) return; pp = top_level_palette; - gtk_clist_freeze(GTK_CLIST(pp->clist)); - gtk_clist_clear(GTK_CLIST(pp->clist)); - palette_clist_init(pp->clist,pp->shell,pp->gc); - gtk_clist_thaw(GTK_CLIST(pp->clist)); + gtk_clist_freeze (GTK_CLIST(pp->clist)); + gtk_clist_clear (GTK_CLIST(pp->clist)); + palette_clist_init (pp->clist, pp->shell, pp->gc); + gtk_clist_thaw (GTK_CLIST (pp->clist)); pp->entries = palette_entries_list->data; - redraw_palette(pp); - palette_scroll_clist_to_current(pp); + redraw_palette (pp); + palette_scroll_clist_to_current (pp); } static void -palette_select2_clist_insert_all(PaletteEntriesP p_entries) +palette_select2_clist_insert_all (PaletteEntriesP p_entries) { PaletteEntriesP chk_entries; - PaletteP pp; + PaletteDialog *pp; GSList *plist; gint pos = 0; @@ -382,15 +390,15 @@ palette_select2_clist_insert_all(PaletteEntriesP p_entries) { return; } - if (strcmp(p_entries->name, chk_entries->name) == 0) + if (strcmp (p_entries->name, chk_entries->name) == 0) break; pos++; } pp = top_level_palette; - gtk_clist_freeze(GTK_CLIST(pp->clist)); - palette_insert_clist(pp->clist,pp->shell,pp->gc,p_entries,pos); - gtk_clist_thaw(GTK_CLIST(pp->clist)); + gtk_clist_freeze (GTK_CLIST (pp->clist)); + palette_insert_clist (pp->clist, pp->shell, pp->gc, p_entries, pos); + gtk_clist_thaw (GTK_CLIST (pp->clist)); /* if(gradient_select_dialog) */ /* { */ @@ -398,9 +406,8 @@ palette_select2_clist_insert_all(PaletteEntriesP p_entries) /* } */ } - static void -palette_save_palettes() +palette_save_palettes () { GSList *list; PaletteEntriesP entries; @@ -421,10 +428,10 @@ palette_save_palettes() } static void -palette_save_palettes_callback(GtkWidget *w, - gpointer client_data) +palette_save_palettes_callback (GtkWidget *widget, + gpointer data) { - palette_save_palettes(); + palette_save_palettes (); } static void @@ -444,8 +451,8 @@ palette_free () { if(import_dialog) { - gtk_widget_destroy(import_dialog->dialog); - g_free(import_dialog); + gtk_widget_destroy (import_dialog->dialog); + g_free (import_dialog); import_dialog = NULL; } @@ -459,7 +466,7 @@ palette_free () top_level_edit_palette = NULL; } - if(top_level_palette) + if (top_level_palette) { gdk_gc_destroy (top_level_palette->gc); session_get_window_info (top_level_palette->shell, &palette_session_info); @@ -469,7 +476,7 @@ palette_free () static void palette_entries_save (PaletteEntriesP palette, - char *filename) + gchar *filename) { FILE * fp; GSList * list; @@ -501,20 +508,18 @@ palette_entries_save (PaletteEntriesP palette, fclose (fp); } - - static PaletteEntryP palette_add_entry (PaletteEntriesP entries, - char *name, - int r, - int g, - int b) + gchar *name, + gint r, + gint g, + gint b) { PaletteEntryP entry; if (entries) { - entry = g_malloc (sizeof (_PaletteEntry)); + entry = g_new (_PaletteEntry, 1); entry->color[0] = r; entry->color[1] = g; @@ -537,28 +542,30 @@ palette_add_entry (PaletteEntriesP entries, } static void -palette_change_color (int r, - int g, - int b, - int state) +palette_change_color (gint r, + gint g, + gint b, + gint state) { if (top_level_edit_palette && top_level_edit_palette->entries) { switch (state) { case COLOR_NEW: - top_level_edit_palette->color = palette_add_entry (top_level_edit_palette->entries, _("Untitled"), r, g, b); + top_level_edit_palette->color = + palette_add_entry (top_level_edit_palette->entries, + _("Untitled"), r, g, b); - palette_update_small_preview(top_level_edit_palette); - redraw_palette(top_level_edit_palette); + palette_update_small_preview (top_level_edit_palette); + redraw_palette (top_level_edit_palette); break; case COLOR_UPDATE_NEW: top_level_edit_palette->color->color[0] = r; top_level_edit_palette->color->color[1] = g; top_level_edit_palette->color->color[2] = b; - palette_update_small_preview(top_level_edit_palette); - redraw_palette(top_level_edit_palette); + palette_update_small_preview (top_level_edit_palette); + redraw_palette (top_level_edit_palette); break; default: @@ -573,31 +580,30 @@ palette_change_color (int r, } void -palette_set_active_color (int r, - int g, - int b, - int state) +palette_set_active_color (gint r, + gint g, + gint b, + gint state) { palette_change_color (r, g, b, state); } static void -palette_entries_load (char *filename) +palette_entries_load (gchar *filename) { PaletteEntriesP entries; - char str[512]; - char *tok; - FILE *fp; - int r, g, b; - int linenum; - GSList *list; - gint pos = 0; PaletteEntriesP p_entries = NULL; - + gchar str[512]; + gchar *tok; + FILE *fp; + gint r, g, b; + gint linenum; + GSList *list; + gint pos = 0; r = g = b = 0; - entries = (PaletteEntriesP) g_malloc (sizeof (_PaletteEntries)); + entries = g_new (_PaletteEntries, 1); entries->filename = g_strdup (filename); entries->name = g_strdup (g_basename (filename)); @@ -606,7 +612,6 @@ palette_entries_load (char *filename) entries->pixmap = NULL; /* Open the requested file */ - if (!(fp = fopen (filename, "r"))) { palette_entries_free (entries); @@ -623,9 +628,13 @@ palette_entries_load (char *filename) { /* bad magic, but maybe it has \r\n at the end of lines? */ if (!strcmp (str, "GIMP Palette\r")) - g_message (_("Loading palette %s:\nCorrupt palette: missing magic header\nDoes this file need converting from DOS?"), filename); + g_message (_("Loading palette %s:\n" + "Corrupt palette:\n" + "missing magic header\n" + "Does this file need converting from DOS?"), filename); else - g_message (_("Loading palette %s:\nCorrupt palette: missing magic header"), filename); + g_message (_("Loading palette %s:\n" + "Corrupt palette: missing magic header"), filename); fclose (fp); palette_entries_free (entries); return; @@ -649,26 +658,26 @@ palette_entries_load (char *filename) if (str[0] != '#') { tok = strtok (str, " \t"); - if (tok) { + if (tok) r = atoi (tok); - } else { - g_message (_("Loading palette %s (line %d):\nMissing RED component"), filename, linenum); + else + g_message (_("Loading palette %s (line %d):\n" + "Missing RED component"), filename, linenum); /* maybe we should just abort? */ - } tok = strtok (NULL, " \t"); - if (tok) { + if (tok) g = atoi (tok); - } else { - g_message (_("Loading palette %s (line %d):\nMissing GREEN component"), filename, linenum); - } - + else + g_message (_("Loading palette %s (line %d):\n" + "Missing GREEN component"), filename, linenum); + tok = strtok (NULL, " \t"); - if (tok) { + if (tok) b = atoi (tok); - } else { - g_message (_("Loading palette %s (line %d):\nMissing BLUE component"), filename, linenum); - } + else + g_message (_("Loading palette %s (line %d):\n" + "Missing BLUE component"), filename, linenum); /* optional name */ tok = strtok (NULL, "\n"); @@ -676,11 +685,12 @@ palette_entries_load (char *filename) if (r < 0 || r > 255 || g < 0 || g > 255 || b < 0 || b > 255) - g_message (_("Loading palette %s (line %d):\nRGB value out of range"), filename, linenum); + g_message (_("Loading palette %s (line %d):\n" + "RGB value out of range"), filename, linenum); palette_add_entry (entries, tok, r, g, b); - } /* if */ - } /* while */ + } + } /* Clean up */ @@ -699,52 +709,53 @@ palette_entries_load (char *filename) { p_entries = default_palette_entries; } - if (strcmp(p_entries->name, entries->name) > 0) + if (strcmp (p_entries->name, entries->name) > 0) break; pos++; } - palette_entries_list = palette_entries_insert_list (palette_entries_list, entries,pos); + palette_entries_list = palette_entries_insert_list (palette_entries_list, entries, pos); /* Check if the current palette is the default one */ - if (strcmp(default_palette, g_basename(filename)) == 0) + if (strcmp (default_palette, g_basename (filename)) == 0) default_palette_entries = entries; } -static PaletteP -new_top_palette(gint vert) +static PaletteDialog * +new_top_palette (gboolean vert) { - PaletteP p; + PaletteDialog *p; - p = create_palette_dialog(vert); - palette_clist_init(p->clist,p->shell,p->gc); + p = create_palette_dialog (vert); + palette_clist_init (p->clist, p->shell, p->gc); - return(p); + return p; } void -palette_select_palette_init(void) +palette_select_palette_init (void) { /* Load them if they are not already loaded */ if(top_level_edit_palette == NULL) { - top_level_edit_palette = new_top_palette(FALSE); + top_level_edit_palette = new_top_palette (FALSE); } } void -palette_create(void) +palette_create (void) { - if(top_level_palette == NULL) + if (top_level_palette == NULL) { - top_level_palette = new_top_palette(TRUE); -/* top_level_palette = palette_new_selection(_("Palette"),NULL); */ - session_set_window_geometry (top_level_palette->shell, &palette_session_info, TRUE); + top_level_palette = new_top_palette (TRUE); + /* top_level_palette = palette_new_selection(_("Palette"),NULL); */ + session_set_window_geometry (top_level_palette->shell, + &palette_session_info, TRUE); /* register this one only */ - dialog_register(top_level_palette->shell); + dialog_register (top_level_palette->shell); - gtk_widget_show(top_level_palette->shell); - palette_scroll_clist_to_current(top_level_palette); + gtk_widget_show (top_level_palette->shell); + palette_scroll_clist_to_current (top_level_palette); } else { @@ -754,68 +765,68 @@ palette_create(void) } else { - gdk_window_raise(top_level_palette->shell->window); + gdk_window_raise (top_level_palette->shell->window); } } } void -palette_create_edit(PaletteEntriesP entries) +palette_create_edit (PaletteEntriesP entries) { - PaletteP p; + PaletteDialog *p; - if(top_level_edit_palette == NULL) + if (top_level_edit_palette == NULL) { + p = new_top_palette (FALSE); - p = new_top_palette(FALSE); - gtk_widget_show(p->shell); palette_draw_entries(p,-1,-1); top_level_edit_palette = p; - } else { if (!GTK_WIDGET_VISIBLE (top_level_edit_palette->shell)) { gtk_widget_show (top_level_edit_palette->shell); - palette_draw_entries(top_level_edit_palette,-1,-1); + palette_draw_entries (top_level_edit_palette, -1, -1); } else { - gdk_window_raise(top_level_edit_palette->shell->window); + gdk_window_raise (top_level_edit_palette->shell->window); } } if(entries != NULL) { top_level_edit_palette->entries = entries; - gtk_clist_unselect_all(GTK_CLIST(top_level_edit_palette->clist)); - palette_scroll_clist_to_current(top_level_edit_palette); + gtk_clist_unselect_all (GTK_CLIST (top_level_edit_palette->clist)); + palette_scroll_clist_to_current (top_level_edit_palette); } } static GSList * -palette_entries_insert_list (GSList * list, - PaletteEntriesP entries, - gint pos) +palette_entries_insert_list (GSList *list, + PaletteEntriesP entries, + gint pos) { GSList *ret_list; + /* add it to the list */ num_palette_entries++; - ret_list = g_slist_insert(list, (void *) entries,pos); + ret_list = g_slist_insert (list, (void *) entries, pos); return ret_list; } -static void palette_update_small_preview(PaletteP palette) +static void +palette_update_small_preview (PaletteDialog *palette) { GSList *list; gint pos = 0; PaletteEntriesP p_entries = NULL; - char *num_buf; + gchar *num_buf; list = palette_entries_list; @@ -836,21 +847,21 @@ static void palette_update_small_preview(PaletteP palette) pos++; } - num_buf = g_strdup_printf("%d",p_entries->n_colors); - palette_draw_small_preview(palette->gc,p_entries); - gtk_clist_set_text(GTK_CLIST(palette->clist),pos,1,num_buf); + num_buf = g_strdup_printf ("%d", p_entries->n_colors); + palette_draw_small_preview (palette->gc, p_entries); + gtk_clist_set_text (GTK_CLIST (palette->clist), pos, 1, num_buf); } static void -palette_delete_entry (GtkWidget *w, - gpointer client_data) +palette_delete_entry (GtkWidget *widget, + gpointer data) { PaletteEntryP entry; GSList *tmp_link; - PaletteP palette; + PaletteDialog *palette; gint pos = 0; - palette = client_data; + palette = data; if (palette && palette->entries && palette->color) { entry = palette->color; @@ -883,25 +894,24 @@ palette_delete_entry (GtkWidget *w, if (palette->entries->n_colors == 0) palette->color = palette_add_entry (palette->entries, _("Black"), 0, 0, 0); - palette_update_small_preview(palette); - palette_select_set_text_all(palette->entries); - palette_select2_set_text_all(palette->entries); - redraw_palette(palette); + palette_update_small_preview (palette); + palette_select_set_text_all (palette->entries); + palette_select2_set_text_all (palette->entries); + redraw_palette (palette); } } - static void -palette_new_callback (GtkWidget *w, - gpointer client_data) +palette_new_callback (GtkWidget *widget, + gpointer data) { - PaletteP palette; + PaletteDialog *palette; char *num_buf; GSList *list; gint pos = 0; PaletteEntriesP p_entries = NULL; - palette = client_data; + palette = data; if (palette && palette->entries) { if (active_color == FOREGROUND) @@ -913,7 +923,7 @@ palette_new_callback (GtkWidget *w, palette_add_entry (palette->entries, _("Untitled"), background[0], background[1], background[2]); - redraw_palette(palette); + redraw_palette (palette); list = palette_entries_list; @@ -932,54 +942,53 @@ palette_new_callback (GtkWidget *w, pos++; } - num_buf = g_strdup_printf("%d",p_entries->n_colors);; - palette_draw_small_preview(palette->gc,p_entries); - gtk_clist_set_text(GTK_CLIST(palette->clist),pos,1,num_buf); - palette_select_set_text_all(palette->entries); - palette_select2_set_text_all(palette->entries); + num_buf = g_strdup_printf ("%d", p_entries->n_colors);; + palette_draw_small_preview (palette->gc, p_entries); + gtk_clist_set_text (GTK_CLIST (palette->clist), pos, 1, num_buf); + palette_select_set_text_all (palette->entries); + palette_select2_set_text_all (palette->entries); } } - static PaletteEntriesP -palette_create_entries(gpointer client_data, - gpointer call_data) -{ - char *home; - char *palette_name; - char *local_path; - char *first_token; - char *token; - char *path; +palette_create_entries (gpointer data, + gpointer call_data) +{ + gchar *home; + gchar *palette_name; + gchar *local_path; + gchar *first_token; + gchar *token; + gchar *path; PaletteEntriesP entries = NULL; - PaletteP palette; + PaletteDialog *palette; GSList *list; gint pos = 0; PaletteEntriesP p_entries = NULL; - palette = client_data; + palette = data; palette_name = (char *) call_data; if (palette && palette_name) { - entries = g_malloc (sizeof (_PaletteEntries)); + entries = g_new (_PaletteEntries, 1)