Bug 540169 - Zenity should offer color selection dialog

This commit is contained in:
Berislav Kovacki 2010-02-23 18:24:20 +00:00 committed by Lucas Rocha
parent 3c17a5a887
commit 4ccc7f6fac
7 changed files with 212 additions and 0 deletions

View File

@ -60,6 +60,8 @@ Display warning dialog
.TP
.B \-\-scale
Display scale dialog
.B \-\-color-selection
Display color selection dialog
.PP
General options
@ -266,6 +268,16 @@ Print partial values
.B \-\-hide\-value
Hide value
.PP
Color selection options
.TP
.B \-\-color=VALUE
Set the initial color
.TP
.B \-\-show\-palette
Show the palette
.PP
Miscellaneous options

View File

@ -16,6 +16,7 @@ zenity_SOURCES = \
scale.c \
text.c \
tree.c \
color.c \
util.c \
util.h \
zenity.h

97
src/color.c Normal file
View File

@ -0,0 +1,97 @@
/*
* color.c
*
* Copyright (C) 2010 Berislav Kovacki
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library 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
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
*
* Authors: Berislav Kovacki <pantokrator@pantokrator.net>
*/
#include "config.h"
#include <string.h>
#include "zenity.h"
#include "util.h"
static ZenityData *zen_data;
static void zenity_colorselection_dialog_response (GtkWidget *widget, int response, gpointer data);
void zenity_colorselection (ZenityData *data, ZenityColorData *color_data)
{
GtkWidget *dialog;
GtkWidget *colorsel;
GdkColor color;
zen_data = data;
dialog = gtk_color_selection_dialog_new (NULL);
g_signal_connect (G_OBJECT (dialog), "response",
G_CALLBACK (zenity_colorselection_dialog_response),
color_data);
if (data->dialog_title)
gtk_window_set_title (GTK_WINDOW (dialog), data->dialog_title);
colorsel = gtk_color_selection_dialog_get_color_selection (GTK_COLOR_SELECTION_DIALOG (dialog));
if (color_data->color) {
if (gdk_color_parse (color_data->color, &color))
gtk_color_selection_set_current_color (GTK_COLOR_SELECTION (colorsel),
&color);
}
gtk_color_selection_set_has_palette (GTK_COLOR_SELECTION (colorsel),
color_data->show_palette);
zenity_util_show_dialog (dialog);
if (data->timeout_delay > 0) {
g_timeout_add (data->timeout_delay * 1000,
(GSourceFunc) zenity_util_timeout_handle,
NULL);
}
gtk_main();
}
static void
zenity_colorselection_dialog_response (GtkWidget *widget, int response, gpointer data)
{
GtkWidget *colorsel;
GdkColor color;
switch (response) {
case GTK_RESPONSE_OK:
zen_data->exit_code = zenity_util_return_exit_code (ZENITY_OK);
colorsel = gtk_color_selection_dialog_get_color_selection (GTK_COLOR_SELECTION_DIALOG (widget));
gtk_color_selection_get_current_color (GTK_COLOR_SELECTION (colorsel), &color);
g_print ("%s\n", gdk_color_to_string (&color));
break;
case GTK_RESPONSE_CANCEL:
zen_data->exit_code = zenity_util_return_exit_code (ZENITY_CANCEL);
break;
default:
zen_data->exit_code = zenity_util_return_exit_code (ZENITY_ESC);
break;
}
gtk_main_quit ();
}

View File

@ -84,6 +84,9 @@ main (gint argc, gchar **argv) {
case MODE_TEXTINFO:
zenity_text (results->data, results->text_data);
break;
case MODE_COLOR:
zenity_colorselection (results->data, results->color_data);
break;
case MODE_ABOUT:
zenity_about (results->data);
break;

View File

@ -108,6 +108,11 @@ static gint zenity_scale_step;
static gboolean zenity_scale_print_partial;
static gboolean zenity_scale_hide_value;
/* Color Selection Dialog Options */
static gboolean zenity_colorsel_active;
static gchar *zenity_colorsel_color;
static gboolean zenity_colorsel_show_palette;
/* Miscelaneus Options */
static gboolean zenity_misc_about;
static gboolean zenity_misc_version;
@ -818,6 +823,39 @@ static GOptionEntry scale_options[] = {
}
};
static GOptionEntry color_selection_options[] = {
{
"color-selection",
'\0',
G_OPTION_FLAG_IN_MAIN,
G_OPTION_ARG_NONE,
&zenity_colorsel_active,
N_("Display color selection dialog"),
NULL
},
{
"color",
'\0',
0,
G_OPTION_ARG_STRING,
&zenity_colorsel_color,
N_("Set the color"),
N_("VALUE")
},
{
"show-palette",
'\0',
0,
G_OPTION_ARG_NONE,
&zenity_colorsel_show_palette,
N_("Show the palette"),
NULL
},
{
NULL
}
};
static GOptionEntry miscellaneous_options[] = {
{
"about",
@ -862,6 +900,7 @@ zenity_option_init (void) {
results->text_data = g_new0 (ZenityTextData, 1);
results->tree_data = g_new0 (ZenityTreeData, 1);
results->notification_data = g_new0 (ZenityNotificationData, 1);
results->color_data = g_new0 (ZenityColorData, 1);
}
void
@ -897,6 +936,9 @@ zenity_option_free (void) {
if (zenity_question_cancel_button)
g_free (zenity_question_cancel_button);
if (zenity_colorsel_color)
g_free (zenity_colorsel_color);
g_option_context_free (ctx);
}
@ -1115,6 +1157,19 @@ zenity_scale_pre_callback (GOptionContext *context,
return TRUE;
}
static gboolean
zenity_color_pre_callback (GOptionContext *context,
GOptionGroup *group,
gpointer data,
GError **error)
{
zenity_colorsel_active = FALSE;
zenity_colorsel_color = NULL;
zenity_colorsel_show_palette = FALSE;
return TRUE;
}
static gboolean
zenity_misc_pre_callback (GOptionContext *context,
GOptionGroup *group,
@ -1480,6 +1535,30 @@ zenity_scale_post_callback (GOptionContext *context,
return TRUE;
}
static gboolean
zenity_color_post_callback (GOptionContext *context,
GOptionGroup *group,
gpointer data,
GError **error)
{
zenity_option_set_dialog_mode (zenity_colorsel_active, MODE_COLOR);
if (results->mode == MODE_COLOR) {
results->color_data->color = zenity_colorsel_color;
results->color_data->show_palette = zenity_colorsel_show_palette;
} else {
if (zenity_colorsel_color)
zenity_option_error (zenity_option_get_name(color_selection_options, &zenity_colorsel_color),
ERROR_SUPPORT);
if (zenity_colorsel_show_palette)
zenity_option_error (zenity_option_get_name(color_selection_options, &zenity_colorsel_show_palette),
ERROR_SUPPORT);
}
return TRUE;
}
static gboolean
zenity_misc_post_callback (GOptionContext *context,
GOptionGroup *group,
@ -1643,6 +1722,17 @@ zenity_create_context (void)
g_option_group_set_translation_domain (a_group, GETTEXT_PACKAGE);
g_option_context_add_group(tmp_ctx, a_group);
/* Adds color selection option entries */
a_group = g_option_group_new("color-selection",
N_("Color selection options"),
N_("Show color selection options"), NULL, NULL);
g_option_group_add_entries(a_group, color_selection_options);
g_option_group_set_parse_hooks (a_group,
zenity_color_pre_callback, zenity_color_post_callback);
g_option_group_set_error_hook (a_group, zenity_option_error_callback);
g_option_group_set_translation_domain (a_group, GETTEXT_PACKAGE);
g_option_context_add_group(tmp_ctx, a_group);
/* Adds misc option entries */
a_group = g_option_group_new("misc",
N_("Miscellaneous options"),

View File

@ -45,6 +45,7 @@ typedef enum {
MODE_SCALE,
MODE_INFO,
MODE_NOTIFICATION,
MODE_COLOR,
MODE_ABOUT,
MODE_VERSION,
MODE_LAST
@ -70,6 +71,7 @@ typedef struct {
ZenityTextData *text_data;
ZenityTreeData *tree_data;
ZenityNotificationData *notification_data;
ZenityColorData *color_data;
} ZenityParsingOptions;
void zenity_option_error (gchar *string,

View File

@ -126,6 +126,11 @@ typedef struct {
gboolean listen;
} ZenityNotificationData;
typedef struct {
gchar *color;
gboolean show_palette;
} ZenityColorData;
void zenity_calendar (ZenityData *data,
ZenityCalendarData *calendar_data);
void zenity_msg (ZenityData *data,
@ -142,6 +147,8 @@ void zenity_tree (ZenityData *data,
ZenityTreeData *tree_data);
void zenity_notification (ZenityData *data,
ZenityNotificationData *notification_data);
void zenity_colorselection (ZenityData *data,
ZenityColorData *notification_data);
void zenity_scale (ZenityData *data,
ZenityScaleData *scale_data);
void zenity_about (ZenityData *data);