23
23
#include <gtk/gtk.h>
25
#include "libgimpbase/gimpbase.h"
26
#include "libgimpmath/gimpmath.h"
27
#include "libgimpcolor/gimpcolor.h"
28
#include "libgimpconfig/gimpconfig.h"
25
29
#include "libgimpwidgets/gimpwidgets.h"
27
31
#include "display-types.h"
28
32
#include "tools/tools-types.h"
30
#include "config/gimpconfig.h"
31
#include "config/gimpconfig-params.h"
32
#include "config/gimpconfig-utils.h"
34
#include "config/gimpcoreconfig.h"
33
35
#include "config/gimpdisplayconfig.h"
35
37
#include "core/gimp.h"
36
#include "core/gimpbuffer.h"
38
#include "core/gimpchannel.h"
37
39
#include "core/gimpcontext.h"
38
#include "core/gimpgrid.h"
40
#include "core/gimpguide.h"
39
41
#include "core/gimpimage.h"
40
#include "core/gimpimage-guides.h"
41
42
#include "core/gimpimage-snap.h"
42
#include "core/gimplayer.h"
43
#include "core/gimplayermask.h"
44
#include "core/gimplist.h"
45
43
#include "core/gimpmarshal.h"
46
#include "core/gimppattern.h"
48
#include "vectors/gimpvectors.h"
50
#include "widgets/gimpdnd.h"
44
#include "core/gimpsamplepoint.h"
46
#include "widgets/gimprender.h"
51
47
#include "widgets/gimphelp-ids.h"
52
48
#include "widgets/gimpmenufactory.h"
53
49
#include "widgets/gimpuimanager.h"
54
50
#include "widgets/gimpwidgets-utils.h"
57
#warning FIXME #include "dialogs/dialogs-types.h"
59
#include "dialogs/dialogs-types.h"
60
#include "dialogs/info-window.h"
62
52
#include "tools/tool_manager.h"
64
54
#include "gimpcanvas.h"
132
static guint display_shell_signals[LAST_SIGNAL] = { 0 };
134
static GtkWindowClass *parent_class = NULL;
138
gimp_display_shell_get_type (void)
140
static GType shell_type = 0;
144
static const GTypeInfo shell_info =
146
sizeof (GimpDisplayShellClass),
147
(GBaseInitFunc) NULL,
148
(GBaseFinalizeFunc) NULL,
149
(GClassInitFunc) gimp_display_shell_class_init,
150
NULL, /* class_finalize */
151
NULL, /* class_data */
152
sizeof (GimpDisplayShell),
154
(GInstanceInitFunc) gimp_display_shell_init,
157
shell_type = g_type_register_static (GTK_TYPE_WINDOW,
118
static void gimp_display_shell_show_tooltip (GimpUIManager *manager,
119
const gchar *tooltip,
120
GimpDisplayShell *shell);
121
static void gimp_display_shell_hide_tooltip (GimpUIManager *manager,
122
GimpDisplayShell *shell);
125
G_DEFINE_TYPE_WITH_CODE (GimpDisplayShell, gimp_display_shell, GTK_TYPE_WINDOW,
126
G_IMPLEMENT_INTERFACE (GIMP_TYPE_PROGRESS,
127
gimp_display_shell_progress_iface_init))
129
#define parent_class gimp_display_shell_parent_class
131
static guint display_shell_signals[LAST_SIGNAL] = { 0 };
134
static const gchar display_rc_style[] =
135
"style \"fullscreen-menubar-style\"\n"
137
" GtkMenuBar::shadow-type = none\n"
138
" GtkMenuBar::internal-padding = 0\n"
140
"widget \"*.gimp-menubar-fullscreen\" style \"fullscreen-menubar-style\"\n"
142
"style \"check-button-style\"\n"
144
" GtkToggleButton::child-displacement-x = 0\n"
145
" GtkToggleButton::child-displacement-y = 0\n"
147
"widget \"*\" style \"check-button-style\"";
166
150
gimp_display_shell_class_init (GimpDisplayShellClass *klass)
212
195
klass->scrolled = NULL;
213
196
klass->reconnect = NULL;
215
g_object_class_install_property (object_class, PROP_SCALE,
216
g_param_spec_double ("scale", NULL, NULL,
220
198
g_object_class_install_property (object_class, PROP_UNIT,
221
199
gimp_param_spec_unit ("unit", NULL, NULL,
202
GIMP_PARAM_READWRITE));
204
gtk_rc_parse_string (display_rc_style);
228
208
gimp_display_shell_init (GimpDisplayShell *shell)
210
shell->display = NULL;
232
212
shell->menubar_manager = NULL;
233
213
shell->popup_manager = NULL;
235
215
shell->unit = GIMP_UNIT_PIXEL;
217
shell->zoom = gimp_zoom_model_new ();
238
218
shell->other_scale = 0.0;
239
219
shell->dot_for_dot = TRUE;
241
221
shell->offset_x = 0;
242
222
shell->offset_y = 0;
223
shell->scale_x = 1.0;
224
shell->scale_y = 1.0;
226
shell->last_scale = 0.0;
227
shell->last_scale_time = 0;
228
shell->last_offset_x = 0;
229
shell->last_offset_y = 0;
244
231
shell->disp_width = 0;
245
232
shell->disp_height = 0;
330
322
GDK_KEY_PRESS_MASK |
331
323
GDK_KEY_RELEASE_MASK |
332
324
GDK_FOCUS_CHANGE_MASK |
325
GDK_VISIBILITY_NOTIFY_MASK |
333
326
GDK_SCROLL_MASK));
328
/* zoom model callback */
329
g_signal_connect_swapped (shell->zoom, "zoomed",
330
G_CALLBACK (gimp_display_shell_scale_changed),
335
333
/* active display callback */
336
g_signal_connect (shell, "button_press_event",
337
G_CALLBACK (gimp_display_shell_events),
339
g_signal_connect (shell, "button_release_event",
340
G_CALLBACK (gimp_display_shell_events),
342
g_signal_connect (shell, "key_press_event",
343
G_CALLBACK (gimp_display_shell_events),
345
g_signal_connect (shell, "window_state_event",
334
g_signal_connect (shell, "button-press-event",
335
G_CALLBACK (gimp_display_shell_events),
337
g_signal_connect (shell, "button-release-event",
338
G_CALLBACK (gimp_display_shell_events),
340
g_signal_connect (shell, "key-press-event",
341
G_CALLBACK (gimp_display_shell_events),
343
g_signal_connect (shell, "window-state-event",
346
344
G_CALLBACK (gimp_display_shell_events),
350
gimp_dnd_uri_list_dest_add (GTK_WIDGET (shell),
351
gimp_display_shell_drop_uri_list,
353
gimp_dnd_viewable_dest_add (GTK_WIDGET (shell), GIMP_TYPE_LAYER,
354
gimp_display_shell_drop_drawable,
356
gimp_dnd_viewable_dest_add (GTK_WIDGET (shell), GIMP_TYPE_LAYER_MASK,
357
gimp_display_shell_drop_drawable,
359
gimp_dnd_viewable_dest_add (GTK_WIDGET (shell), GIMP_TYPE_CHANNEL,
360
gimp_display_shell_drop_drawable,
362
gimp_dnd_viewable_dest_add (GTK_WIDGET (shell), GIMP_TYPE_VECTORS,
363
gimp_display_shell_drop_vectors,
365
gimp_dnd_viewable_dest_add (GTK_WIDGET (shell), GIMP_TYPE_PATTERN,
366
gimp_display_shell_drop_pattern,
368
gimp_dnd_viewable_dest_add (GTK_WIDGET (shell), GIMP_TYPE_BUFFER,
369
gimp_display_shell_drop_buffer,
371
gimp_dnd_color_dest_add (GTK_WIDGET (shell),
372
gimp_display_shell_drop_color,
374
gimp_dnd_svg_dest_add (GTK_WIDGET (shell),
375
gimp_display_shell_drop_svg,
347
gimp_display_shell_dnd_init (shell);
378
349
gimp_help_connect (GTK_WIDGET (shell), gimp_standard_help_func,
379
350
GIMP_HELP_IMAGE_WINDOW, NULL);
460
469
shell->grid_dialog = NULL;
472
shell->display = NULL;
465
474
GTK_OBJECT_CLASS (parent_class)->destroy (object);
469
gimp_display_shell_set_property (GObject *object,
474
GimpDisplayShell *shell = GIMP_DISPLAY_SHELL (object);
479
gimp_display_shell_scale (shell,
480
GIMP_ZOOM_TO, g_value_get_double (value));
483
gimp_display_shell_set_unit (shell, g_value_get_int (value));
486
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
492
gimp_display_shell_get_property (GObject *object,
497
GimpDisplayShell *shell = GIMP_DISPLAY_SHELL (object);
502
g_value_set_double (value, shell->scale);
505
g_value_set_int (value, shell->unit);
508
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
478
gimp_display_shell_unrealize (GtkWidget *widget)
480
GimpDisplayShell *shell = GIMP_DISPLAY_SHELL (widget);
484
g_object_unref (shell->grid_gc);
485
shell->grid_gc = NULL;
490
g_object_unref (shell->pen_gc);
491
shell->pen_gc = NULL;
494
if (shell->nav_popup)
495
gtk_widget_unrealize (shell->nav_popup);
497
GTK_WIDGET_CLASS (parent_class)->unrealize (widget);
611
615
GtkWidget *inner_table;
612
616
GtkWidget *image;
613
617
GdkScreen *screen;
614
619
gint image_width, image_height;
615
620
gint n_width, n_height;
616
621
gint s_width, s_height;
617
622
gdouble new_scale;
619
g_return_val_if_fail (GIMP_IS_DISPLAY (gdisp), NULL);
624
g_return_val_if_fail (GIMP_IS_DISPLAY (display), NULL);
620
625
g_return_val_if_fail (GIMP_IS_MENU_FACTORY (menu_factory), NULL);
621
626
g_return_val_if_fail (GIMP_IS_UI_MANAGER (popup_manager), NULL);
623
628
/* the toplevel shell */
624
629
shell = g_object_new (GIMP_TYPE_DISPLAY_SHELL,
630
/* "gravity", GDK_GRAVITY_CENTER, */
629
shell->gdisp = gdisp;
631
image_width = gdisp->gimage->width;
632
image_height = gdisp->gimage->height;
634
display_config = GIMP_DISPLAY_CONFIG (gdisp->gimage->gimp->config);
634
shell->display = display;
636
image_width = display->image->width;
637
image_height = display->image->height;
639
display_config = GIMP_DISPLAY_CONFIG (display->image->gimp->config);
636
641
shell->dot_for_dot = display_config->default_dot_for_dot;
638
gimp_config_sync (GIMP_CONFIG (display_config->default_view),
639
GIMP_CONFIG (shell->options), 0);
640
gimp_config_sync (GIMP_CONFIG (display_config->default_fullscreen_view),
641
GIMP_CONFIG (shell->fullscreen_options), 0);
643
gimp_config_sync (G_OBJECT (display_config->default_view),
644
G_OBJECT (shell->options), 0);
645
gimp_config_sync (G_OBJECT (display_config->default_fullscreen_view),
646
G_OBJECT (shell->fullscreen_options), 0);
648
gimp_zoom_model_zoom (shell->zoom, GIMP_ZOOM_TO, scale);
643
650
/* adjust the initial scale -- so that window fits on screen the 75%
644
651
* value is the same as in gimp_display_shell_shrink_wrap. It
668
675
/* Limit to the size of the screen... */
669
676
if (n_width > s_width || n_height > s_height)
671
new_scale = shell->scale * MIN (((gdouble) s_height) / n_height,
672
((gdouble) s_width) / n_width);
674
new_scale = gimp_display_shell_scale_zoom_step (GIMP_ZOOM_OUT,
677
/* since zooming out might skip a zoom step we zoom in again
678
* and test if we are small enough. */
679
shell->scale = gimp_display_shell_scale_zoom_step (GIMP_ZOOM_IN,
678
gdouble current = gimp_zoom_model_get_factor (shell->zoom);
680
new_scale = current * MIN (((gdouble) s_height) / n_height,
681
((gdouble) s_width) / n_width);
683
new_scale = gimp_zoom_model_zoom_step (GIMP_ZOOM_OUT, new_scale);
685
/* Since zooming out might skip a zoom step we zoom in again
686
* and test if we are small enough.
688
gimp_zoom_model_zoom (shell->zoom, GIMP_ZOOM_TO,
689
gimp_zoom_model_zoom_step (GIMP_ZOOM_IN,
682
692
if (SCALEX (shell, image_width) > s_width ||
683
693
SCALEY (shell, image_height) > s_height)
684
shell->scale = new_scale;
694
gimp_zoom_model_zoom (shell->zoom, GIMP_ZOOM_TO, new_scale);
686
696
n_width = SCALEX (shell, image_width);
687
697
n_height = SCALEY (shell, image_height);
775
793
/* active display callback */
776
g_signal_connect (shell->menubar, "button_press_event",
777
G_CALLBACK (gimp_display_shell_events),
779
g_signal_connect (shell->menubar, "button_release_event",
780
G_CALLBACK (gimp_display_shell_events),
782
g_signal_connect (shell->menubar, "key_press_event",
794
g_signal_connect (shell->menubar, "button-press-event",
795
G_CALLBACK (gimp_display_shell_events),
797
g_signal_connect (shell->menubar, "button-release-event",
798
G_CALLBACK (gimp_display_shell_events),
800
g_signal_connect (shell->menubar, "key-press-event",
783
801
G_CALLBACK (gimp_display_shell_events),
787
805
/* another vbox for everything except the statusbar */
788
806
disp_vbox = gtk_vbox_new (FALSE, 1);
789
gtk_container_set_border_width (GTK_CONTAINER (disp_vbox), 2);
790
807
gtk_box_pack_start (GTK_BOX (main_vbox), disp_vbox, TRUE, TRUE, 0);
791
808
gtk_widget_show (disp_vbox);
807
824
gtk_box_pack_start (GTK_BOX (upper_hbox), right_vbox, FALSE, FALSE, 0);
808
825
gtk_widget_show (right_vbox);
810
/* the hbox containing qmask button, vertical scrollbar and nav button */
827
/* the hbox containing the quickmask button, vertical scrollbar and
828
the navigation button */
811
829
lower_hbox = gtk_hbox_new (FALSE, 1);
812
830
gtk_box_pack_start (GTK_BOX (disp_vbox), lower_hbox, FALSE, FALSE, 0);
813
831
gtk_widget_show (lower_hbox);
815
/* create the scrollbars *************************************************/
833
/* create the scrollbars *************************************************/
817
835
/* the horizontal scrollbar */
819
GTK_ADJUSTMENT (gtk_adjustment_new (0, 0, image_width, 1, 1, image_width));
836
shell->hsbdata = GTK_ADJUSTMENT (gtk_adjustment_new (0, 0, image_width,
820
838
shell->hsb = gtk_hscrollbar_new (shell->hsbdata);
821
839
GTK_WIDGET_UNSET_FLAGS (shell->hsb, GTK_CAN_FOCUS);
823
841
/* the vertical scrollbar */
825
GTK_ADJUSTMENT (gtk_adjustment_new (0, 0, image_height, 1, 1, image_height));
842
shell->vsbdata = GTK_ADJUSTMENT (gtk_adjustment_new (0, 0, image_height,
843
1, 1, image_height));
826
844
shell->vsb = gtk_vscrollbar_new (shell->vsbdata);
827
845
GTK_WIDGET_UNSET_FLAGS (shell->vsb, GTK_CAN_FOCUS);
829
847
/* create the contents of the inner_table ********************************/
831
849
/* the menu popup button */
832
shell->origin_button = gtk_button_new ();
833
GTK_WIDGET_UNSET_FLAGS (shell->origin_button, GTK_CAN_FOCUS);
850
shell->origin = gtk_event_box_new ();
835
852
image = gtk_image_new_from_stock (GIMP_STOCK_MENU_RIGHT, GTK_ICON_SIZE_MENU);
836
gtk_container_add (GTK_CONTAINER (shell->origin_button), image);
853
gtk_container_add (GTK_CONTAINER (shell->origin), image);
837
854
gtk_widget_show (image);
839
g_signal_connect (shell->origin_button, "button_press_event",
856
g_signal_connect (shell->origin, "button-press-event",
840
857
G_CALLBACK (gimp_display_shell_origin_button_press),
843
gimp_help_set_help_data (shell->origin_button, NULL,
844
GIMP_HELP_IMAGE_WINDOW_ORIGIN_BUTTON);
846
shell->canvas = gimp_canvas_new ();
848
shell->select = gimp_display_shell_selection_new (shell);
860
gimp_help_set_help_data (shell->origin,
861
_("Access the image menu"),
862
GIMP_HELP_IMAGE_WINDOW_ORIGIN);
864
shell->canvas = gimp_canvas_new (shell->display->image->gimp);
866
gimp_display_shell_selection_init (shell);
850
868
/* the horizontal ruler */
851
869
shell->hrule = gtk_hruler_new ();
852
870
gtk_widget_set_events (GTK_WIDGET (shell->hrule),
853
871
GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK);
855
g_signal_connect_swapped (shell->canvas, "motion_notify_event",
873
g_signal_connect_swapped (shell->canvas, "motion-notify-event",
856
874
G_CALLBACK (GTK_WIDGET_GET_CLASS (shell->hrule)->motion_notify_event),
858
g_signal_connect (shell->hrule, "button_press_event",
876
g_signal_connect (shell->hrule, "button-press-event",
859
877
G_CALLBACK (gimp_display_shell_hruler_button_press),
866
884
gtk_widget_set_events (GTK_WIDGET (shell->vrule),
867
885
GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK);
869
g_signal_connect_swapped (shell->canvas, "motion_notify_event",
887
g_signal_connect_swapped (shell->canvas, "motion-notify-event",
870
888
G_CALLBACK (GTK_WIDGET_GET_CLASS (shell->vrule)->motion_notify_event),
872
g_signal_connect (shell->vrule, "button_press_event",
890
g_signal_connect (shell->vrule, "button-press-event",
873
891
G_CALLBACK (gimp_display_shell_vruler_button_press),
876
894
gimp_help_set_help_data (shell->vrule, NULL, GIMP_HELP_IMAGE_WINDOW_RULER);
878
/* Workaround for GTK+ Wintab bug on Windows when creating guides by
879
* dragging from the rulers. See bug #168516. */
896
/* Workaround for GTK+ Wintab bug on Windows when creating guides by
897
* dragging from the rulers. See bug #168516.
880
899
gtk_widget_set_extension_events (shell->hrule, GDK_EXTENSION_EVENTS_ALL);
881
900
gtk_widget_set_extension_events (shell->vrule, GDK_EXTENSION_EVENTS_ALL);
884
903
gtk_widget_set_size_request (shell->canvas, n_width, n_height);
885
904
gtk_widget_set_events (shell->canvas, GIMP_DISPLAY_SHELL_CANVAS_EVENT_MASK);
889
908
g_signal_connect (shell->canvas, "realize",
890
909
G_CALLBACK (gimp_display_shell_canvas_realize),
892
g_signal_connect (shell->canvas, "size_allocate",
911
g_signal_connect (shell->canvas, "size-allocate",
893
912
G_CALLBACK (gimp_display_shell_canvas_size_allocate),
895
g_signal_connect (shell->canvas, "expose_event",
914
g_signal_connect (shell->canvas, "expose-event",
896
915
G_CALLBACK (gimp_display_shell_canvas_expose),
899
g_signal_connect (shell->canvas, "enter_notify_event",
900
G_CALLBACK (gimp_display_shell_canvas_tool_events),
902
g_signal_connect (shell->canvas, "leave_notify_event",
903
G_CALLBACK (gimp_display_shell_canvas_tool_events),
905
g_signal_connect (shell->canvas, "proximity_in_event",
906
G_CALLBACK (gimp_display_shell_canvas_tool_events),
908
g_signal_connect (shell->canvas, "proximity_out_event",
909
G_CALLBACK (gimp_display_shell_canvas_tool_events),
911
g_signal_connect (shell->canvas, "focus_in_event",
912
G_CALLBACK (gimp_display_shell_canvas_tool_events),
914
g_signal_connect (shell->canvas, "focus_out_event",
915
G_CALLBACK (gimp_display_shell_canvas_tool_events),
917
g_signal_connect (shell->canvas, "button_press_event",
918
G_CALLBACK (gimp_display_shell_canvas_tool_events),
920
g_signal_connect (shell->canvas, "button_release_event",
921
G_CALLBACK (gimp_display_shell_canvas_tool_events),
923
g_signal_connect (shell->canvas, "scroll_event",
924
G_CALLBACK (gimp_display_shell_canvas_tool_events),
926
g_signal_connect (shell->canvas, "motion_notify_event",
927
G_CALLBACK (gimp_display_shell_canvas_tool_events),
929
g_signal_connect (shell->canvas, "key_press_event",
930
G_CALLBACK (gimp_display_shell_canvas_tool_events),
932
g_signal_connect (shell->canvas, "key_release_event",
918
g_signal_connect (shell->canvas, "enter-notify-event",
919
G_CALLBACK (gimp_display_shell_canvas_tool_events),
921
g_signal_connect (shell->canvas, "leave-notify-event",
922
G_CALLBACK (gimp_display_shell_canvas_tool_events),
924
g_signal_connect (shell->canvas, "proximity-in-event",
925
G_CALLBACK (gimp_display_shell_canvas_tool_events),
927
g_signal_connect (shell->canvas, "proximity-out-event",
928
G_CALLBACK (gimp_display_shell_canvas_tool_events),
930
g_signal_connect (shell->canvas, "focus-in-event",
931
G_CALLBACK (gimp_display_shell_canvas_tool_events),
933
g_signal_connect (shell->canvas, "focus-out-event",
934
G_CALLBACK (gimp_display_shell_canvas_tool_events),
936
g_signal_connect (shell->canvas, "button-press-event",
937
G_CALLBACK (gimp_display_shell_canvas_tool_events),
939
g_signal_connect (shell->canvas, "button-release-event",
940
G_CALLBACK (gimp_display_shell_canvas_tool_events),
942
g_signal_connect (shell->canvas, "scroll-event",
943
G_CALLBACK (gimp_display_shell_canvas_tool_events),
945
g_signal_connect (shell->canvas, "motion-notify-event",
946
G_CALLBACK (gimp_display_shell_canvas_tool_events),
948
g_signal_connect (shell->canvas, "key-press-event",
949
G_CALLBACK (gimp_display_shell_canvas_tool_events),
951
g_signal_connect (shell->canvas, "key-release-event",
933
952
G_CALLBACK (gimp_display_shell_canvas_tool_events),
936
955
/* create the contents of the right_vbox *********************************/
937
shell->zoom_button = gtk_check_button_new ();
938
gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (shell->zoom_button), FALSE);
939
gtk_widget_set_size_request (GTK_WIDGET (shell->zoom_button), 16, 16);
956
shell->zoom_button = g_object_new (GTK_TYPE_CHECK_BUTTON,
957
"draw-indicator", FALSE,
958
"relief", GTK_RELIEF_NONE,
960
"height-request", 18,
940
962
GTK_WIDGET_UNSET_FLAGS (shell->zoom_button, GTK_CAN_FOCUS);
942
964
image = gtk_image_new_from_stock (GIMP_STOCK_ZOOM_FOLLOW_WINDOW,
955
977
/* create the contents of the lower_hbox *********************************/
957
/* the qmask button */
958
shell->qmask_button = gtk_check_button_new ();
959
gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (shell->qmask_button), FALSE);
960
gtk_widget_set_size_request (GTK_WIDGET (shell->qmask_button), 16, 16);
961
GTK_WIDGET_UNSET_FLAGS (shell->qmask_button, GTK_CAN_FOCUS);
979
/* the quick mask button */
980
shell->quick_mask_button = g_object_new (GTK_TYPE_CHECK_BUTTON,
981
"draw-indicator", FALSE,
982
"relief", GTK_RELIEF_NONE,
984
"height-request", 18,
986
GTK_WIDGET_UNSET_FLAGS (shell->quick_mask_button, GTK_CAN_FOCUS);
963
image = gtk_image_new_from_stock (GIMP_STOCK_QMASK_OFF, GTK_ICON_SIZE_MENU);
964
gtk_container_add (GTK_CONTAINER (shell->qmask_button), image);
988
image = gtk_image_new_from_stock (GIMP_STOCK_QUICK_MASK_OFF,
990
gtk_container_add (GTK_CONTAINER (shell->quick_mask_button), image);
965
991
gtk_widget_show (image);
967
gimp_help_set_help_data (shell->qmask_button,
968
_("Toggle Quick Mask"),
969
GIMP_HELP_IMAGE_WINDOW_QMASK_BUTTON);
993
action = gimp_ui_manager_find_action (shell->menubar_manager,
994
"quick-mask", "quick-mask-toggle");
996
gimp_widget_set_accel_help (shell->quick_mask_button, action);
998
gimp_help_set_help_data (shell->quick_mask_button,
999
_("Toggle Quick Mask"),
1000
GIMP_HELP_IMAGE_WINDOW_QUICK_MASK_BUTTON);
971
g_signal_connect (shell->qmask_button, "toggled",
972
G_CALLBACK (gimp_display_shell_qmask_toggled),
1002
g_signal_connect (shell->quick_mask_button, "toggled",
1003
G_CALLBACK (gimp_display_shell_quick_mask_toggled),
974
g_signal_connect (shell->qmask_button, "button_press_event",
975
G_CALLBACK (gimp_display_shell_qmask_button_press),
1005
g_signal_connect (shell->quick_mask_button, "button-press-event",
1006
G_CALLBACK (gimp_display_shell_quick_mask_button_press),
978
1009
/* the navigation window button */
979
1010
shell->nav_ebox = gtk_event_box_new ();
981
1011
image = gtk_image_new_from_stock (GIMP_STOCK_NAVIGATION, GTK_ICON_SIZE_MENU);
982
1012
gtk_container_add (GTK_CONTAINER (shell->nav_ebox), image);
983
1013
gtk_widget_show (image);
985
g_signal_connect (shell->nav_ebox, "button_press_event",
1015
g_signal_connect (shell->nav_ebox, "button-press-event",
986
1016
G_CALLBACK (gimp_display_shell_nav_button_press),
989
gimp_help_set_help_data (shell->nav_ebox, NULL,
1019
gimp_help_set_help_data (shell->nav_ebox,
1020
_("Navigate the image display"),
990
1021
GIMP_HELP_IMAGE_WINDOW_NAV_BUTTON);
992
1023
/* create the contents of the status area *********************************/
1121
1186
*snapped_coords = *coords;
1123
if (shell->snap_to_guides &&
1124
shell->gdisp->gimage->guides)
1188
if (gimp_display_shell_get_snap_to_guides (shell) &&
1189
shell->display->image->guides)
1126
1191
snap_to_guides = TRUE;
1129
1194
if (gimp_display_shell_get_snap_to_grid (shell) &&
1130
shell->gdisp->gimage->grid)
1195
shell->display->image->grid)
1132
1197
snap_to_grid = TRUE;
1135
if (snap_to_guides || snap_to_grid)
1200
snap_to_canvas = gimp_display_shell_get_snap_to_canvas (shell);
1202
if (gimp_display_shell_get_snap_to_vectors (shell) &&
1203
gimp_image_get_active_vectors (shell->display->image))
1205
snap_to_vectors = TRUE;
1208
if (snap_to_guides || snap_to_grid || snap_to_canvas || snap_to_vectors)
1137
1210
gdouble tx, ty;
1138
1211
gint snap_distance;
1140
1213
snap_distance =
1141
GIMP_DISPLAY_CONFIG (shell->gdisp->gimage->gimp->config)->snap_distance;
1214
GIMP_DISPLAY_CONFIG (shell->display->image->gimp->config)->snap_distance;
1143
1216
if (snap_width > 0 && snap_height > 0)
1145
snapped = gimp_image_snap_rectangle (shell->gdisp->gimage,
1218
snapped = gimp_image_snap_rectangle (shell->display->image,
1146
1219
coords->x + snap_offset_x,
1147
1220
coords->y + snap_offset_y,
1148
1221
coords->x + snap_offset_x +
1364
gimp_display_shell_expose_sample_point (GimpDisplayShell *shell,
1365
GimpSamplePoint *sample_point)
1368
gint x1, y1, x2, y2;
1370
g_return_if_fail (GIMP_IS_DISPLAY_SHELL (shell));
1371
g_return_if_fail (sample_point != NULL);
1373
if (sample_point->x < 0)
1376
gimp_display_shell_transform_xy_f (shell,
1377
sample_point->x + 0.5,
1378
sample_point->y + 0.5,
1382
x1 = MAX (0, floor (x - GIMP_SAMPLE_POINT_DRAW_SIZE));
1383
y1 = MAX (0, floor (y - GIMP_SAMPLE_POINT_DRAW_SIZE));
1384
x2 = MIN (shell->disp_width, ceil (x + GIMP_SAMPLE_POINT_DRAW_SIZE));
1385
y2 = MIN (shell->disp_height, ceil (y + GIMP_SAMPLE_POINT_DRAW_SIZE));
1387
/* HACK: add 3 instead of 1 so the number gets cleared too */
1388
gimp_display_shell_expose_area (shell, x1, y1, x2 - x1 + 3, y2 - y1 + 3);
1285
1392
gimp_display_shell_expose_full (GimpDisplayShell *shell)
1287
1394
g_return_if_fail (GIMP_IS_DISPLAY_SHELL (shell));