Commit 4b6d4f1f authored by Jehan's avatar Jehan

Bug 750546 - Include recently used colors in the Dockable Colors Dialog

New GimpColorHistory widget, replacing the code in GimpColorDialog, and
added to GimpColorEditor to have the color history accessible in the
color dock as well.
Thanks to Thomas Manni for the initial implementation attempt.
parent 3bb69dbd
......@@ -64,6 +64,8 @@ libappwidgets_a_sources = \
gimpcoloreditor.h \
gimpcolorframe.c \
gimpcolorframe.h \
gimpcolorhistory.c \
gimpcolorhistory.h \
gimpcolormapeditor.c \
gimpcolormapeditor.h \
gimpcolorpanel.c \
......
......@@ -36,6 +36,7 @@
#include "core/gimppalettemru.h"
#include "gimpcolordialog.h"
#include "gimpcolorhistory.h"
#include "gimpdialogfactory.h"
#include "gimphelp-ids.h"
#include "gimpwidgets-utils.h"
......@@ -54,26 +55,22 @@ enum
};
static void gimp_color_dialog_constructed (GObject *object);
static void gimp_color_dialog_constructed (GObject *object);
static void gimp_color_dialog_response (GtkDialog *dialog,
gint response_id);
static void gimp_color_dialog_response (GtkDialog *dialog,
gint response_id);
static void gimp_color_dialog_help_func (const gchar *help_id,
gpointer help_data);
static void gimp_color_dialog_color_changed (GimpColorSelection *selection,
GimpColorDialog *dialog);
static void gimp_color_dialog_help_func (const gchar *help_id,
gpointer help_data);
static void gimp_color_dialog_color_changed (GimpColorSelection *selection,
GimpColorDialog *dialog);
static void gimp_color_history_changed (GimpPalette *history,
GimpColorDialog *dialog);
static void gimp_color_history_color_clicked (GtkWidget *widget,
GimpColorDialog *dialog);
static void gimp_color_history_color_changed (GtkWidget *widget,
gpointer data);
static void gimp_color_history_add_clicked (GtkWidget *widget,
GimpColorDialog *dialog);
static void gimp_color_history_add_clicked (GtkWidget *widget,
GimpColorDialog *dialog);
static void gimp_color_dialog_history_selected (GimpColorHistory *history,
const GimpRGB *rgb,
GimpColorDialog *dialog);
G_DEFINE_TYPE (GimpColorDialog, gimp_color_dialog, GIMP_TYPE_VIEWABLE_DIALOG)
......@@ -107,11 +104,6 @@ gimp_color_dialog_class_init (GimpColorDialogClass *klass)
static void
gimp_color_dialog_init (GimpColorDialog *dialog)
{
GtkWidget *table;
GtkWidget *button;
GtkWidget *arrow;
gint i;
gtk_dialog_add_buttons (GTK_DIALOG (dialog),
GIMP_STOCK_RESET, RESPONSE_RESET,
GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
......@@ -134,18 +126,29 @@ gimp_color_dialog_init (GimpColorDialog *dialog)
g_signal_connect (dialog->selection, "color-changed",
G_CALLBACK (gimp_color_dialog_color_changed),
dialog);
}
static void
gimp_color_dialog_constructed (GObject *object)
{
GimpColorDialog *dialog = GIMP_COLOR_DIALOG (object);
GimpViewableDialog *viewable_dialog = GIMP_VIEWABLE_DIALOG (object);
GtkWidget *hbox;
GtkWidget *history;
GtkWidget *button;
GtkWidget *arrow;
G_OBJECT_CLASS (parent_class)->constructed (object);
/* The color history */
table = gtk_table_new (2, 1 + GIMP_COLOR_DIALOG_HISTORY_SIZE / 2, TRUE);
gtk_table_set_row_spacings (GTK_TABLE (table), 2);
gtk_table_set_col_spacings (GTK_TABLE (table), 2);
gtk_table_set_col_spacing (GTK_TABLE (table), 0, 4);
/* Color history box. */
hbox = gtk_hbox_new (FALSE, 4);
gtk_box_pack_end (GTK_BOX (GIMP_COLOR_SELECTION (dialog->selection)->right_vbox),
table, FALSE, FALSE, 0);
gtk_widget_show (table);
hbox, FALSE, FALSE, 0);
gtk_widget_show (hbox);
/* Button for adding to color history. */
button = gtk_button_new ();
gtk_table_attach_defaults (GTK_TABLE (table), button, 0, 1, 0, 1);
gtk_box_pack_start (GTK_BOX (hbox), GTK_WIDGET (button), FALSE, FALSE, 0);
gimp_help_set_help_data (button,
_("Add the current color to the color history"),
NULL);
......@@ -159,52 +162,14 @@ gimp_color_dialog_init (GimpColorDialog *dialog)
gtk_container_add (GTK_CONTAINER (button), arrow);
gtk_widget_show (arrow);
for (i = 0; i < GIMP_COLOR_DIALOG_HISTORY_SIZE; i++)
{
GimpRGB black = { 0.0, 0.0, 0.0, 1.0 };
gint row, column;
column = i % (GIMP_COLOR_DIALOG_HISTORY_SIZE / 2);
row = i / (GIMP_COLOR_DIALOG_HISTORY_SIZE / 2);
button = gtk_button_new ();
gtk_widget_set_size_request (button, COLOR_AREA_SIZE, COLOR_AREA_SIZE);
gtk_table_attach_defaults (GTK_TABLE (table), button,
column + 1, column + 2, row, row + 1);
gtk_widget_show (button);
dialog->history[i] = gimp_color_area_new (&black,
GIMP_COLOR_AREA_SMALL_CHECKS,
GDK_BUTTON2_MASK);
gtk_container_add (GTK_CONTAINER (button), dialog->history[i]);
gtk_widget_show (dialog->history[i]);
g_signal_connect (button, "clicked",
G_CALLBACK (gimp_color_history_color_clicked),
dialog);
g_signal_connect (dialog->history[i], "color-changed",
G_CALLBACK (gimp_color_history_color_changed),
GINT_TO_POINTER (i));
}
}
/* Color history table. */
history = gimp_color_history_new (viewable_dialog->context, 12);
gtk_box_pack_start (GTK_BOX (hbox), GTK_WIDGET (history), TRUE, TRUE, 0);
gtk_widget_show (GTK_WIDGET (history));
static void
gimp_color_dialog_constructed (GObject *object)
{
GimpColorDialog *dialog = GIMP_COLOR_DIALOG (object);
GimpViewableDialog *viewable_dialog = GIMP_VIEWABLE_DIALOG (object);
GimpPalette *history;
G_OBJECT_CLASS (parent_class)->constructed (object);
history = gimp_palettes_get_color_history (viewable_dialog->context->gimp);
g_signal_connect_object (history, "dirty",
G_CALLBACK (gimp_color_history_changed),
G_OBJECT (dialog), 0);
gimp_color_history_changed (history, dialog);
g_signal_connect (history, "color-selected",
G_CALLBACK (gimp_color_dialog_history_selected),
dialog);
}
static void
......@@ -390,62 +355,7 @@ gimp_color_dialog_color_changed (GimpColorSelection *selection,
}
/* color history callbacks */
static void
gimp_color_history_changed (GimpPalette *history,
GimpColorDialog *dialog)
{
gint i;
for (i = 0; i < GIMP_COLOR_DIALOG_HISTORY_SIZE; i++)
{
GimpPaletteEntry *entry = gimp_palette_get_entry (history, i);
GimpRGB black = { 0.0, 0.0, 0.0, 1.0 };
g_signal_handlers_block_by_func (dialog->history[i],
gimp_color_history_color_changed,
GINT_TO_POINTER (i));
gimp_color_area_set_color (GIMP_COLOR_AREA (dialog->history[i]),
entry ? &entry->color : &black);
g_signal_handlers_unblock_by_func (dialog->history[i],
gimp_color_history_color_changed,
GINT_TO_POINTER (i));
}
}
static void
gimp_color_history_color_clicked (GtkWidget *widget,
GimpColorDialog *dialog)
{
GimpColorArea *color_area;
GimpRGB color;
color_area = GIMP_COLOR_AREA (gtk_bin_get_child (GTK_BIN (widget)));
gimp_color_area_get_color (color_area, &color);
gimp_color_selection_set_color (GIMP_COLOR_SELECTION (dialog->selection),
&color);
}
static void
gimp_color_history_color_changed (GtkWidget *widget,
gpointer data)
{
GimpViewableDialog *viewable_dialog;
GimpPalette *history;
GimpRGB color;
viewable_dialog = GIMP_VIEWABLE_DIALOG (gtk_widget_get_toplevel (widget));
history = gimp_palettes_get_color_history (viewable_dialog->context->gimp);
gimp_color_area_get_color (GIMP_COLOR_AREA (widget), &color);
gimp_palette_set_entry_color (history, GPOINTER_TO_INT (data), &color);
}
/* History-adding button callback */
static void
gimp_color_history_add_clicked (GtkWidget *widget,
......@@ -462,3 +372,14 @@ gimp_color_history_add_clicked (GtkWidget *widget,
gimp_palette_mru_add (GIMP_PALETTE_MRU (history), &color);
}
/* Color history callback */
static void
gimp_color_dialog_history_selected (GimpColorHistory *history,
const GimpRGB *rgb,
GimpColorDialog *dialog)
{
gimp_color_selection_set_color (GIMP_COLOR_SELECTION (dialog->selection),
rgb);
}
......@@ -44,7 +44,6 @@ struct _GimpColorDialog
gboolean wants_updates;
GtkWidget *selection;
GtkWidget *history[GIMP_COLOR_DIALOG_HISTORY_SIZE];
};
struct _GimpColorDialogClass
......
......@@ -36,6 +36,7 @@
#include "core/gimpcontext.h"
#include "gimpcoloreditor.h"
#include "gimpcolorhistory.h"
#include "gimpdocked.h"
#include "gimpfgbgeditor.h"
#include "gimpfgbgview.h"
......@@ -53,6 +54,7 @@ enum
static void gimp_color_editor_docked_iface_init (GimpDockedInterface *iface);
static void gimp_color_editor_constructed (GObject *object);
static void gimp_color_editor_dispose (GObject *object);
static void gimp_color_editor_set_property (GObject *object,
guint property_id,
......@@ -96,6 +98,9 @@ static void gimp_color_editor_color_picked (GtkWidget *widget,
static void gimp_color_editor_entry_changed (GimpColorHexEntry *entry,
GimpColorEditor *editor);
static void gimp_color_editor_history_selected (GimpColorHistory *history,
const GimpRGB *rgb,
GimpColorEditor *editor);
G_DEFINE_TYPE_WITH_CODE (GimpColorEditor, gimp_color_editor, GIMP_TYPE_EDITOR,
G_IMPLEMENT_INTERFACE (GIMP_TYPE_DOCKED,
......@@ -112,6 +117,7 @@ gimp_color_editor_class_init (GimpColorEditorClass* klass)
GObjectClass *object_class = G_OBJECT_CLASS (klass);
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
object_class->constructed = gimp_color_editor_constructed;
object_class->dispose = gimp_color_editor_dispose;
object_class->set_property = gimp_color_editor_set_property;
object_class->get_property = gimp_color_editor_get_property;
......@@ -122,6 +128,7 @@ gimp_color_editor_class_init (GimpColorEditorClass* klass)
g_param_spec_object ("context",
NULL, NULL,
GIMP_TYPE_CONTEXT,
G_PARAM_CONSTRUCT |
GIMP_PARAM_READWRITE));
}
......@@ -269,6 +276,24 @@ gimp_color_editor_init (GimpColorEditor *editor)
editor);
}
static void
gimp_color_editor_constructed (GObject *object)
{
GimpColorEditor *editor = GIMP_COLOR_EDITOR (object);
GtkWidget *history;
G_OBJECT_CLASS (parent_class)->constructed (object);
/* The color history */
history = gimp_color_history_new (editor->context, 12);
gtk_box_pack_end (GTK_BOX (editor), history, FALSE, FALSE, 0);
gtk_widget_show (history);
g_signal_connect (history, "color-selected",
G_CALLBACK (gimp_color_editor_history_selected),
editor);
}
static void
gimp_color_editor_dispose (GObject *object)
{
......@@ -663,3 +688,17 @@ gimp_color_editor_entry_changed (GimpColorHexEntry *entry,
gimp_context_set_foreground (editor->context, &rgb);
}
}
static void
gimp_color_editor_history_selected (GimpColorHistory *history,
const GimpRGB *rgb,
GimpColorEditor *editor)
{
if (editor->context)
{
if (editor->edit_bg)
gimp_context_set_background (editor->context, rgb);
else
gimp_context_set_foreground (editor->context, rgb);
}
}
/* GIMP - The GNU Image Manipulation Program
* Copyright (C) 1995 Spencer Kimball and Peter Mattis
*
* gimpcolorhistory.c
* Copyright (C) 2015 Jehan <jehan@girinstud.io>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "config.h"
#include <gegl.h>
#include <gtk/gtk.h>
#include "libgimpwidgets/gimpwidgets.h"
#include "widgets-types.h"
#include "core/gimp-palettes.h"
#include "core/gimpcontext.h"
#include "core/gimpmarshal.h"
#include "core/gimppalettemru.h"
#include "gimpcolorhistory.h"
#include "gimp-intl.h"
enum
{
COLOR_SELECTED,
LAST_SIGNAL
};
enum
{
PROP_0,
PROP_CONTEXT,
PROP_HISTORY_SIZE,
};
#define DEFAULT_HISTORY_SIZE 12
#define COLOR_AREA_SIZE 20
static void gimp_color_history_constructed (GObject *object);
static void gimp_color_history_set_property (GObject *object,
guint property_id,
const GValue *value,
GParamSpec *pspec);
static void gimp_color_history_get_property (GObject *object,
guint property_id,
GValue *value,
GParamSpec *pspec);
static void gimp_color_history_color_clicked (GtkWidget *widget,
GimpColorHistory *history);
static void gimp_color_history_palette_dirty (GimpPalette *palette,
GimpColorHistory *history);
static void gimp_color_history_color_changed (GtkWidget *widget,
gpointer data);
G_DEFINE_TYPE (GimpColorHistory, gimp_color_history, GTK_TYPE_TABLE)
#define parent_class gimp_color_history_parent_class
static guint history_signals[LAST_SIGNAL] = { 0 };
static void
gimp_color_history_class_init (GimpColorHistoryClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
object_class->constructed = gimp_color_history_constructed;
object_class->set_property = gimp_color_history_set_property;
object_class->get_property = gimp_color_history_get_property;
history_signals[COLOR_SELECTED] =
g_signal_new ("color-selected",
G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_FIRST,
G_STRUCT_OFFSET (GimpColorHistoryClass, color_selected),
NULL, NULL,
gimp_marshal_VOID__OBJECT_POINTER,
G_TYPE_NONE, 1,
G_TYPE_POINTER);
g_object_class_install_property (object_class, PROP_CONTEXT,
g_param_spec_object ("context", NULL, NULL,
GIMP_TYPE_CONTEXT,
GIMP_PARAM_READWRITE |
G_PARAM_CONSTRUCT));
g_object_class_install_property (object_class, PROP_HISTORY_SIZE,
g_param_spec_int ("history-size",
NULL, NULL,
2, G_MAXINT,
DEFAULT_HISTORY_SIZE,
GIMP_PARAM_READWRITE |
G_PARAM_CONSTRUCT));
klass->color_selected = NULL;
}
static void
gimp_color_history_init (GimpColorHistory *history)
{
history->color_areas = NULL;
}
static void
gimp_color_history_constructed (GObject *object)
{
GimpColorHistory *history = GIMP_COLOR_HISTORY (object);
GimpPalette *palette;
G_OBJECT_CLASS (parent_class)->constructed (object);
palette = gimp_palettes_get_color_history (history->context->gimp);
g_signal_connect_object (palette, "dirty",
G_CALLBACK (gimp_color_history_palette_dirty),
G_OBJECT (history), 0);
gimp_color_history_palette_dirty (palette, history);
}
static void
gimp_color_history_set_property (GObject *object,
guint property_id,
const GValue *value,
GParamSpec *pspec)
{
GimpColorHistory *history = GIMP_COLOR_HISTORY (object);
switch (property_id)
{
case PROP_CONTEXT:
history->context = g_value_get_object (value);
break;
case PROP_HISTORY_SIZE:
{
GtkWidget *button;
gint i;
/* Destroy previous color buttons. */
gtk_container_foreach (GTK_CONTAINER (history),
(GtkCallback) gtk_widget_destroy, NULL);
history->history_size = g_value_get_int (value);
gtk_table_resize (GTK_TABLE (history),
2, (history->history_size + 1)/ 2);
gtk_table_set_row_spacings (GTK_TABLE (history), 2);
gtk_table_set_col_spacings (GTK_TABLE (history), 2);
history->color_areas = g_realloc_n (history->color_areas,
history->history_size,
sizeof (GtkWidget*));
for (i = 0; i < history->history_size; i++)
{
GimpRGB black = { 0.0, 0.0, 0.0, 1.0 };
gint row, column;
column = i % (history->history_size / 2);
row = i / (history->history_size / 2);
button = gtk_button_new ();
gtk_widget_set_size_request (button, COLOR_AREA_SIZE, COLOR_AREA_SIZE);
gtk_table_attach_defaults (GTK_TABLE (history), button,
column, column + 1, row, row + 1);
gtk_widget_show (button);
history->color_areas[i] = gimp_color_area_new (&black,
GIMP_COLOR_AREA_SMALL_CHECKS,
GDK_BUTTON2_MASK);
gtk_container_add (GTK_CONTAINER (button), history->color_areas[i]);
gtk_widget_show (history->color_areas[i]);
g_signal_connect (button, "clicked",
G_CALLBACK (gimp_color_history_color_clicked),
history);
g_signal_connect (history->color_areas[i], "color-changed",
G_CALLBACK (gimp_color_history_color_changed),
GINT_TO_POINTER (i));
}
}
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
break;
}
}
static void
gimp_color_history_get_property (GObject *object,
guint property_id,
GValue *value,
GParamSpec *pspec)
{
GimpColorHistory *history = GIMP_COLOR_HISTORY (object);
switch (property_id)
{
case PROP_CONTEXT:
g_value_set_object (value, history->context);
break;
case PROP_HISTORY_SIZE:
g_value_set_int (value, history->history_size);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
break;
}
}
/* Public Functions */
GtkWidget *
gimp_color_history_new (GimpContext *context,
gint history_size)
{
GimpColorHistory *history;
g_return_val_if_fail (GIMP_IS_CONTEXT (context), NULL);
history = g_object_new (GIMP_TYPE_COLOR_HISTORY,
"context", context,
"history-size", history_size,
NULL);
return GTK_WIDGET (history);
}
/* Color history callback. */
static void
gimp_color_history_color_clicked (GtkWidget *widget,
GimpColorHistory *history)
{
GimpColorArea *color_area;
GimpRGB color;
color_area = GIMP_COLOR_AREA (gtk_bin_get_child (GTK_BIN (widget)));
gimp_color_area_get_color (color_area, &color);
g_signal_emit (history, history_signals[COLOR_SELECTED], 0,
&color);
}
/* Color history palette callback. */
static void
gimp_color_history_palette_dirty (GimpPalette *palette,
GimpColorHistory *history)
{
gint i;
for (i = 0; i < history->history_size; i++)
{
GimpPaletteEntry *entry = gimp_palette_get_entry (palette, i);
GimpRGB black = { 0.0, 0.0, 0.0, 1.0 };
g_signal_handlers_block_by_func (history->color_areas[i],
gimp_color_history_color_changed,
GINT_TO_POINTER (i));
gimp_color_area_set_color (GIMP_COLOR_AREA (history->color_areas[i]),
entry ? &entry->color : &black);
g_signal_handlers_unblock_by_func (history->color_areas[i],
gimp_color_history_color_changed,
GINT_TO_POINTER (i));
}
}
/* Color area callbacks. */
static void
gimp_color_history_color_changed (GtkWidget *widget,
gpointer data)
{
GimpColorHistory *history;
GimpPalette *palette;
GimpRGB color;
history = GIMP_COLOR_HISTORY (gtk_widget_get_ancestor (widget,
GIMP_TYPE_COLOR_HISTORY));
palette = gimp_palettes_get_color_history (history->context->gimp);
gimp_color_area_get_color (GIMP_COLOR_AREA (widget), &color);
gimp_palette_set_entry_color (palette, GPOINTER_TO_INT (data), &color);
}
/* GIMP - The GNU Image Manipulation Program
* Copyright (C) 1995 Spencer Kimball and Peter Mattis
*
* gimpcolorhistory.h
* Copyright (C) 2015 Jehan <jehan@girinstud.io>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef __GIMP_COLOR_HISTORY_H__
#define __GIMP_COLOR_HISTORY_H__
#define GIMP_TYPE_COLOR_HISTORY (gimp_color_history_get_type ())
#define GIMP_COLOR_HISTORY(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GIMP_TYPE_COLOR_HISTORY, GimpColorHistory))
#define GIMP_COLOR_HISTORY_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GIMP_TYPE_COLOR_HISTORY, GimpColorHistoryClass))
#define GIMP_IS_COLOR_HISTORY(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GIMP_TYPE_COLOR_HISTORY))
#define GIMP_IS_COLOR_HISTORY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GIMP_TYPE_COLOR_HISTORY))
#define GIMP_COLOR_HISTORY_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GIMP_TYPE_COLOR_HISTORY, GimpColorHistoryClass))
typedef struct _GimpColorHistoryClass GimpColorHistoryClass;
struct _GimpColorHistory
{
GtkTable parent_instance;
GimpContext *context;
GtkWidget **color_areas;
gint history_size;
};
struct _GimpColorHistoryClass
{
GtkTableClass parent_class;
/* signals */
void (* color_selected) (GimpColorHistory *history,
const GimpRGB *rgb);
};
GType gimp_color_history_get_type (void) G_GNUC_CONST;
GtkWidget * gimp_color_history_new (GimpContext *context,
gint history_size);
#endif /* __GIMP_COLOR_HISTORY_H__ */
......@@ -166,6 +166,7 @@ typedef struct _GimpCircle GimpCircle;
typedef struct _GimpColorBar GimpColorBar;
typedef struct _GimpColorDisplayEditor GimpColorDisplayEditor;
typedef struct _GimpColorFrame GimpColorFrame;
typedef struct _GimpColorHistory GimpColorHistory;
typedef struct _GimpColorPanel GimpColorPanel;
typedef struct _GimpComboTagEntry GimpComboTagEntry;
typedef struct _GimpControllerEditor GimpControllerEditor;
......
......@@ -450,6 +450,7 @@ app/widgets/gimpcolordialog.c
app/widgets/gimpcolordisplayeditor.c
app/widgets/gimpcoloreditor.c
app/widgets/gimpcolorframe.c
app/widgets/gimpcolorhistory.c
app/widgets/gimpcolormapeditor.c
app/widgets/gimpcolorselectorpalette.c
app/widgets/gimpcontainergridview.c
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment