📄 gtkcolorsel.c
字号:
{ gtk_widget_show (label); gtk_widget_show (colorsel->scales[n]); gtk_widget_show (colorsel->entries[n]); } gtk_signal_connect_object (GTK_OBJECT (adj), "value_changed", scale_vals[n].updater, (gpointer) colorsel->scales[n]); gtk_object_set_data (GTK_OBJECT (colorsel->scales[n]), "_GtkColorSelection", (gpointer) colorsel); gtk_object_set_data (GTK_OBJECT (colorsel->scales[n]), value_index_key, GINT_TO_POINTER (n)); gtk_signal_connect_object (GTK_OBJECT (colorsel->entries[n]), "changed", scale_vals[n].updater, (gpointer) colorsel->entries[n]); gtk_object_set_data (GTK_OBJECT (colorsel->entries[n]), "_GtkColorSelection", (gpointer) colorsel); gtk_object_set_data (GTK_OBJECT (colorsel->entries[n]), value_index_key, GINT_TO_POINTER (n)); } colorsel->opacity_label = label; gtk_widget_show (table); gtk_widget_show (hbox);}static voidgtk_color_selection_set_arg (GtkObject *object, GtkArg *arg, guint arg_id){ GtkColorSelection *color_selection = GTK_COLOR_SELECTION (object); switch (arg_id) { case ARG_UPDATE_POLICY: gtk_color_selection_set_update_policy (color_selection, GTK_VALUE_ENUM (*arg)); break; case ARG_USE_OPACITY: gtk_color_selection_set_opacity (color_selection, GTK_VALUE_BOOL (*arg)); break; }}static voidgtk_color_selection_get_arg (GtkObject *object, GtkArg *arg, guint arg_id){ GtkColorSelection *color_selection; color_selection = GTK_COLOR_SELECTION (object); switch (arg_id) { case ARG_UPDATE_POLICY: GTK_VALUE_ENUM (*arg) = color_selection->policy; break; case ARG_USE_OPACITY: GTK_VALUE_BOOL (*arg) = color_selection->use_opacity; break; default: break; }}GtkWidget*gtk_color_selection_new (void){ GtkColorSelection *colorsel; colorsel = gtk_type_new (GTK_TYPE_COLOR_SELECTION); return GTK_WIDGET (colorsel);}voidgtk_color_selection_set_update_policy (GtkColorSelection *colorsel, GtkUpdateType policy){ gint n; g_return_if_fail (colorsel != NULL); if (policy != colorsel->policy) { colorsel->policy = policy; for (n = 0; n < NUM_CHANNELS; n++) gtk_range_set_update_policy (GTK_RANGE (colorsel->scales[n]), policy); }}voidgtk_color_selection_set_color (GtkColorSelection *colorsel, gdouble *color){ gint n, i = 0; g_return_if_fail (colorsel != NULL); g_return_if_fail (GTK_IS_COLOR_SELECTION (colorsel)); if (GTK_WIDGET_DRAWABLE (GTK_WIDGET (colorsel))) gtk_color_selection_draw_wheel_marker (colorsel); for (n = RED; n <= BLUE; n++) { colorsel->old_values[n] = colorsel->values[n]; colorsel->values[n] = color[i++]; } if (colorsel->use_opacity) { colorsel->old_values[OPACITY] = colorsel->values[OPACITY]; colorsel->values[OPACITY] = color[i]; } RGB_TO_HSV (); gtk_color_selection_update_inputs (colorsel, RGB_INPUTS | HSV_INPUTS | OPACITY_INPUTS, BOTH); if (GTK_WIDGET_DRAWABLE (GTK_WIDGET (colorsel))) { gtk_color_selection_draw_value_bar (colorsel, FALSE); gtk_color_selection_draw_sample (colorsel, FALSE); gtk_color_selection_draw_wheel_marker (colorsel); }}voidgtk_color_selection_get_color (GtkColorSelection *colorsel, gdouble *color){ gint n, i = 0; g_return_if_fail (colorsel != NULL); g_return_if_fail (GTK_IS_COLOR_SELECTION (colorsel)); for (n = RED; n <= BLUE; n++) color[i++] = colorsel->values[n]; if (colorsel->use_opacity) color[i] = colorsel->values[OPACITY];}static voidgtk_color_selection_realize (GtkWidget *widget){ GtkColorSelection *colorsel; static const GtkTargetEntry targets[] = { { "application/x-color", 0 } }; g_return_if_fail (widget != NULL); g_return_if_fail (GTK_IS_COLOR_SELECTION (widget)); colorsel = GTK_COLOR_SELECTION (widget); if (GTK_WIDGET_CLASS (color_selection_parent_class)->realize) (*GTK_WIDGET_CLASS (color_selection_parent_class)->realize) (widget); gtk_drag_dest_set (colorsel->sample_area, GTK_DEST_DEFAULT_HIGHLIGHT | GTK_DEST_DEFAULT_MOTION | GTK_DEST_DEFAULT_DROP, targets, 1, GDK_ACTION_COPY); gtk_drag_source_set (colorsel->sample_area, GDK_BUTTON1_MASK | GDK_BUTTON3_MASK, targets, 1, GDK_ACTION_COPY | GDK_ACTION_MOVE); gtk_signal_connect (GTK_OBJECT (colorsel->sample_area), "drag_begin", GTK_SIGNAL_FUNC (gtk_color_selection_drag_begin), colorsel); gtk_signal_connect (GTK_OBJECT (colorsel->sample_area), "drag_end", GTK_SIGNAL_FUNC (gtk_color_selection_drag_end), colorsel); gtk_signal_connect (GTK_OBJECT (colorsel->sample_area), "drag_data_get", GTK_SIGNAL_FUNC (gtk_color_selection_drag_handle), colorsel); gtk_signal_connect (GTK_OBJECT (colorsel->sample_area), "drag_data_received", GTK_SIGNAL_FUNC (gtk_color_selection_drop_handle), colorsel);}static voidgtk_color_selection_unrealize (GtkWidget *widget){ GtkColorSelection *colorsel; g_return_if_fail (widget != NULL); g_return_if_fail (GTK_IS_COLOR_SELECTION (widget)); colorsel = GTK_COLOR_SELECTION (widget); if (colorsel->value_gc != NULL) { gdk_gc_unref (colorsel->value_gc); colorsel->value_gc = NULL; } if (colorsel->wheel_gc != NULL) { gdk_gc_unref (colorsel->wheel_gc); colorsel->wheel_gc = NULL; } if (colorsel->sample_gc != NULL) { gdk_gc_unref (colorsel->sample_gc); colorsel->sample_gc = NULL; } (* GTK_WIDGET_CLASS (color_selection_parent_class)->unrealize) (widget);}static voidgtk_color_selection_finalize (GtkObject *object){ GtkColorSelection *colorsel; g_return_if_fail (object != NULL); g_return_if_fail (GTK_IS_COLOR_SELECTION (object)); colorsel = GTK_COLOR_SELECTION (object); if (colorsel->wheel_buf != NULL) g_free (colorsel->wheel_buf); if (colorsel->value_buf != NULL) g_free (colorsel->value_buf); if (colorsel->sample_buf != NULL) g_free (colorsel->sample_buf); (*GTK_OBJECT_CLASS (color_selection_parent_class)->finalize) (object);}static voidgtk_color_selection_color_changed (GtkColorSelection *colorsel){ gtk_signal_emit (GTK_OBJECT (colorsel), color_selection_signals[COLOR_CHANGED]);}static voidgtk_color_selection_update_input (GtkWidget *scale, GtkWidget *entry, gdouble value){ GtkAdjustment *adj; gchar txt[32]; if (scale != NULL) { adj = gtk_range_get_adjustment (GTK_RANGE (scale)); adj->value = (gfloat) value; gtk_signal_handler_block_by_data (GTK_OBJECT (adj), (gpointer) scale); gtk_signal_emit_by_name (GTK_OBJECT (adj), "value_changed"); gtk_range_slider_update (GTK_RANGE (scale)); gtk_signal_handler_unblock_by_data (GTK_OBJECT (adj), (gpointer) scale); } if (entry != NULL) { gtk_signal_handler_block_by_data (GTK_OBJECT (entry), (gpointer) entry); sprintf (txt, "%.2f", value); gtk_entry_set_text (GTK_ENTRY (entry), txt); gtk_signal_handler_unblock_by_data (GTK_OBJECT (entry), (gpointer) entry); }}static voidgtk_color_selection_update_inputs (GtkColorSelection *colorsel, gint inputs, gint which){ gint n; switch (which) { case SCALE: if ((inputs & RGB_INPUTS) != 0) for (n = RED; n <= BLUE; n++) gtk_color_selection_update_input (colorsel->scales[n], NULL, colorsel->values[n]); if ((inputs & HSV_INPUTS) != 0) for (n = HUE; n <= VALUE; n++) gtk_color_selection_update_input (colorsel->scales[n], NULL, colorsel->values[n]); if ((inputs & OPACITY_INPUTS) != 0) gtk_color_selection_update_input(colorsel->scales[OPACITY], NULL, colorsel->values[OPACITY]); break; case ENTRY: if ((inputs & RGB_INPUTS) != 0) for (n = RED; n <= BLUE; n++) gtk_color_selection_update_input (NULL, colorsel->entries[n], colorsel->values[n]); if ((inputs & HSV_INPUTS) != 0) for (n = HUE; n <= VALUE; n++) gtk_color_selection_update_input (NULL, colorsel->entries[n], colorsel->values[n]); if ((inputs & OPACITY_INPUTS) != 0) gtk_color_selection_update_input(NULL, colorsel->entries[OPACITY], colorsel->values[OPACITY]); break; default: if ((inputs & RGB_INPUTS) != 0) for (n = RED; n <= BLUE; n++) gtk_color_selection_update_input (colorsel->scales[n], colorsel->entries[n], colorsel->values[n]); if ((inputs & HSV_INPUTS) != 0) for (n = HUE; n <= VALUE; n++) gtk_color_selection_update_input (colorsel->scales[n], colorsel->entries[n], colorsel->values[n]); if ((inputs & OPACITY_INPUTS) != 0) gtk_color_selection_update_input(colorsel->scales[OPACITY], colorsel->entries[OPACITY], colorsel->values[OPACITY]); break; }}static voidgtk_color_selection_hsv_updater (GtkWidget *widget, gpointer data){ GtkColorSelection *colorsel; GtkAdjustment *adj; gdouble newvalue; gint i, which = SCALE; if (GTK_WIDGET_DRAWABLE (GTK_WIDGET (widget))) { colorsel = (GtkColorSelection*) gtk_object_get_data (GTK_OBJECT (widget), "_GtkColorSelection"); i = GPOINTER_TO_INT (gtk_object_get_data (GTK_OBJECT (widget), value_index_key)); if (GTK_IS_SCALE (widget)) { adj = gtk_range_get_adjustment (GTK_RANGE (GTK_SCALE (widget))); newvalue = (gdouble) adj->value; which = ENTRY; } else newvalue = (gdouble) atof (gtk_entry_get_text (GTK_ENTRY (widget))); if (i == VALUE) { gtk_color_selection_draw_value_marker (colorsel); colorsel->values[i] = newvalue; HSV_TO_RGB (); gtk_color_selection_draw_value_marker (colorsel); } else { gtk_color_selection_draw_wheel_marker (colorsel); colorsel->values[i] = newvalue; HSV_TO_RGB (); gtk_color_selection_draw_wheel_marker (colorsel); gtk_color_selection_draw_value_bar (colorsel, FALSE); } gtk_color_selection_draw_sample (colorsel, FALSE); gtk_color_selection_color_changed (colorsel); gtk_color_selection_update_inputs (colorsel, HSV_INPUTS, which); gtk_color_selection_update_inputs (colorsel, RGB_INPUTS, BOTH); }}static voidgtk_color_selection_rgb_updater (GtkWidget *widget, gpointer data){ GtkColorSelection *colorsel; GtkAdjustment *adj; gdouble newvalue; gint i, which = SCALE; if (GTK_WIDGET_DRAWABLE (GTK_WIDGET (widget))) { colorsel = (GtkColorSelection*) gtk_object_get_data (GTK_OBJECT (widget), "_GtkColorSelection"); i = GPOINTER_TO_INT (gtk_object_get_data (GTK_OBJECT (widget), value_index_key)); if (GTK_IS_SCALE (widget)) { adj = gtk_range_get_adjustment (GTK_RANGE (GTK_SCALE (widget))); newvalue = (gdouble) adj->value; which = ENTRY; } else newvalue = (gdouble) atof (gtk_entry_get_text (GTK_ENTRY (widget))); gtk_color_selection_draw_wheel_marker (colorsel); colorsel->values[i] = newvalue; RGB_TO_HSV (); gtk_color_selection_draw_wheel_marker (colorsel); gtk_color_selection_draw_value_bar (colorsel, FALSE); gtk_color_selection_draw_sample (colorsel, FALSE); gtk_color_selection_color_changed (colorsel); gtk_color_selection_update_inputs (colorsel, RGB_INPUTS, which); gtk_color_selection_update_inputs (colorsel, HSV_INPUTS, BOTH); }}static voidgtk_color_selection_opacity_updater (GtkWidget *widget, gpointer data){ GtkColorSelection *colorsel; GtkAdjustment *adj; colorsel = (GtkColorSelection*) gtk_object_get_data (GTK_OBJECT (widget), "_GtkColorSelection"); if (GTK_IS_SCALE (widget)) { adj = gtk_range_get_adjustment (GTK_RANGE (widget)); colorsel->values[OPACITY] = (gdouble) adj->value; gtk_color_selection_update_input (NULL, colorsel->entries[OPACITY], colorsel->values[OPACITY]); } else { colorsel->values[OPACITY] = (gdouble) atof (gtk_entry_get_text (GTK_ENTRY (widget))); gtk_color_selection_update_input (colorsel->scales[OPACITY], NULL, colorsel->values[OPACITY]); } gtk_color_selection_draw_sample (colorsel, FALSE); gtk_color_selection_color_changed (colorsel);}voidgtk_color_selection_set_opacity (GtkColorSelection *colorsel, gint use_opacity){ g_return_if_fail (colorsel != NULL); colorsel->use_opacity = use_opacity; if (!use_opacity && GTK_WIDGET_VISIBLE (colorsel->scales[OPACITY])) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -