1
/* The GIMP -- an image manipulation program
1
/* GIMP - The GNU Image Manipulation Program
2
2
* Copyright (C) 1995 Spencer Kimball and Peter Mattis
4
4
* This program is free software; you can redistribute it and/or modify
36
36
#include "display/gimpdisplay.h"
38
#include "gimpdrawtool.h"
39
39
#include "gimptoolcontrol.h"
40
40
#include "tool_manager.h"
42
#include "gimp-intl.h"
45
43
typedef struct _GimpToolManager GimpToolManager;
62
60
static void tool_manager_tool_changed (GimpContext *user_context,
63
61
GimpToolInfo *tool_info,
65
static void tool_manager_image_clean_dirty (GimpImage *gimage,
63
static void tool_manager_image_clean_dirty (GimpImage *image,
66
64
GimpDirtyMask dirty_mask,
67
65
GimpToolManager *tool_manager);
89
87
tool_manager->image_clean_handler_id =
90
88
gimp_container_add_handler (gimp->images, "clean",
91
G_CALLBACK (tool_manager_image_clean_dirty),
89
G_CALLBACK (tool_manager_image_clean_dirty),
94
92
tool_manager->image_dirty_handler_id =
95
93
gimp_container_add_handler (gimp->images, "dirty",
96
G_CALLBACK (tool_manager_image_clean_dirty),
94
G_CALLBACK (tool_manager_image_clean_dirty),
99
97
user_context = gimp_get_user_context (gimp);
101
g_signal_connect (user_context, "tool_changed",
102
G_CALLBACK (tool_manager_tool_changed),
99
g_signal_connect (user_context, "tool-changed",
100
G_CALLBACK (tool_manager_tool_changed),
114
112
tool_manager_set (gimp, NULL);
116
114
gimp_container_remove_handler (gimp->images,
117
tool_manager->image_clean_handler_id);
115
tool_manager->image_clean_handler_id);
118
116
gimp_container_remove_handler (gimp->images,
119
tool_manager->image_dirty_handler_id);
117
tool_manager->image_dirty_handler_id);
121
119
if (tool_manager->active_tool)
122
120
g_object_unref (tool_manager->active_tool);
150
148
if (tool_manager->active_tool)
152
GimpDisplay *gdisp = tool_manager->active_tool->gdisp;
154
if (! gdisp && GIMP_IS_DRAW_TOOL (tool_manager->active_tool))
155
gdisp = GIMP_DRAW_TOOL (tool_manager->active_tool)->gdisp;
158
tool_manager_control_active (gimp, HALT, gdisp);
150
GimpTool *active_tool = tool_manager->active_tool;
151
GimpDisplay *display;
153
/* NULL image returns any display (if there is any) */
154
display = gimp_tool_has_image (active_tool, NULL);
156
tool_manager_control_active (gimp, GIMP_TOOL_ACTION_HALT, display);
160
157
tool_manager_focus_display_active (gimp, NULL);
162
159
g_object_unref (tool_manager->active_tool);
169
166
tool_manager_push_tool (Gimp *gimp,
172
169
GimpToolManager *tool_manager;
170
GimpDisplay *focus_display = NULL;
174
172
g_return_if_fail (GIMP_IS_GIMP (gimp));
175
173
g_return_if_fail (GIMP_IS_TOOL (tool));
179
177
if (tool_manager->active_tool)
179
focus_display = tool_manager->active_tool->focus_display;
181
181
tool_manager->tool_stack = g_slist_prepend (tool_manager->tool_stack,
182
tool_manager->active_tool);
182
tool_manager->active_tool);
184
184
g_object_ref (tool_manager->tool_stack->data);
187
187
tool_manager_select_tool (gimp, tool);
190
tool_manager_focus_display_active (gimp, focus_display);
199
202
if (tool_manager->tool_stack)
201
tool_manager_select_tool (gimp,
202
GIMP_TOOL (tool_manager->tool_stack->data));
204
GimpTool *tool = tool_manager->tool_stack->data;
205
GimpDisplay *focus_display = NULL;
204
g_object_unref (tool_manager->tool_stack->data);
207
if (tool_manager->active_tool)
208
focus_display = tool_manager->active_tool->focus_display;
206
210
tool_manager->tool_stack = g_slist_remove (tool_manager->tool_stack,
207
tool_manager->active_tool);
213
tool_manager_select_tool (gimp, tool);
214
g_object_unref (tool);
217
tool_manager_focus_display_active (gimp, focus_display);
212
222
tool_manager_initialize_active (Gimp *gimp,
223
GimpDisplay *display)
215
225
GimpToolManager *tool_manager;
218
227
g_return_val_if_fail (GIMP_IS_GIMP (gimp), FALSE);
219
g_return_val_if_fail (GIMP_IS_DISPLAY (gdisp), FALSE);
228
g_return_val_if_fail (GIMP_IS_DISPLAY (display), FALSE);
221
230
tool_manager = tool_manager_get (gimp);
223
232
if (tool_manager->active_tool)
225
tool = tool_manager->active_tool;
234
GimpTool *tool = tool_manager->active_tool;
227
if (gimp_tool_initialize (tool, gdisp))
236
if (gimp_tool_initialize (tool, display))
229
tool->drawable = gimp_image_active_drawable (gdisp->gimage);
238
tool->drawable = gimp_image_active_drawable (display->image);
247
256
tool_manager = tool_manager_get (gimp);
249
if (! tool_manager->active_tool)
258
if (tool_manager->active_tool)
260
GimpTool *tool = tool_manager->active_tool;
252
if (gdisp && (tool_manager->active_tool->gdisp == gdisp ||
253
(GIMP_IS_DRAW_TOOL (tool_manager->active_tool) &&
254
GIMP_DRAW_TOOL (tool_manager->active_tool)->gdisp == gdisp)))
256
gimp_tool_control (tool_manager->active_tool, action, gdisp);
258
else if (action == HALT)
260
if (gimp_tool_control_is_active (tool_manager->active_tool->control))
261
gimp_tool_control_halt (tool_manager->active_tool->control);
262
if (display && gimp_tool_has_display (tool, display))
264
gimp_tool_control (tool, action, display);
266
else if (action == GIMP_TOOL_ACTION_HALT)
268
if (gimp_tool_control_is_active (tool->control))
269
gimp_tool_control_halt (tool->control);
359
368
if (tool_manager->active_tool)
361
370
gimp_tool_set_focus_display (tool_manager->active_tool,
367
376
tool_manager_modifier_state_active (Gimp *gimp,
368
377
GdkModifierType state,
378
GimpDisplay *display)
371
380
GimpToolManager *tool_manager;
379
388
gimp_tool_set_modifier_state (tool_manager->active_tool,
395
tool_manager_active_modifier_state_active (Gimp *gimp,
396
GdkModifierType state,
397
GimpDisplay *display)
399
GimpToolManager *tool_manager;
401
g_return_if_fail (GIMP_IS_GIMP (gimp));
403
tool_manager = tool_manager_get (gimp);
405
if (tool_manager->active_tool)
407
gimp_tool_set_active_modifier_state (tool_manager->active_tool,
397
426
if (tool_manager->active_tool)
399
428
gimp_tool_oper_update (tool_manager->active_tool,
429
coords, state, proximity,
440
469
tool_manager_set (Gimp *gimp,
441
GimpToolManager *tool_manager)
470
GimpToolManager *tool_manager)
443
472
if (! tool_manager_quark)
444
473
tool_manager_quark = g_quark_from_static_string ("gimp-tool-manager");
460
489
/* FIXME: gimp_busy HACK */
461
490
if (user_context->gimp->busy)
463
/* there may be contexts waiting for the user_context's "tool_changed"
492
/* there may be contexts waiting for the user_context's "tool-changed"
464
493
* signal, so stop emitting it.
466
g_signal_stop_emission_by_name (user_context, "tool_changed");
495
g_signal_stop_emission_by_name (user_context, "tool-changed");
468
497
if (G_TYPE_FROM_INSTANCE (tool_manager->active_tool) !=
469
tool_info->tool_type)
471
g_signal_handlers_block_by_func (user_context,
472
tool_manager_tool_changed,
498
tool_info->tool_type)
500
g_signal_handlers_block_by_func (user_context,
501
tool_manager_tool_changed,
475
/* explicitly set the current tool */
476
gimp_context_set_tool (user_context,
504
/* explicitly set the current tool */
505
gimp_context_set_tool (user_context,
477
506
tool_manager->active_tool->tool_info);
479
g_signal_handlers_unblock_by_func (user_context,
480
tool_manager_tool_changed,
508
g_signal_handlers_unblock_by_func (user_context,
509
tool_manager_tool_changed,
505
534
GimpToolInfo *old_tool_info = tool_manager->active_tool->tool_info;
507
gimp_context_set_parent (GIMP_CONTEXT (old_tool_info->tool_options), NULL);
536
gimp_context_set_parent (GIMP_CONTEXT (old_tool_info->tool_options),
510
540
/* connect the new tool's context */
544
tool_manager_image_clean_dirty (GimpImage *gimage,
574
tool_manager_image_clean_dirty (GimpImage *image,
545
575
GimpDirtyMask dirty_mask,
546
576
GimpToolManager *tool_manager)
548
GimpTool *active_tool = tool_manager->active_tool;
578
GimpTool *tool = tool_manager->active_tool;
551
! gimp_tool_control_preserve (active_tool->control) &&
552
(gimp_tool_control_dirty_mask (active_tool->control) & dirty_mask))
581
! gimp_tool_control_get_preserve (tool->control) &&
582
(gimp_tool_control_get_dirty_mask (tool->control) & dirty_mask))
554
GimpDisplay *gdisp = active_tool->gdisp;
556
if (! gdisp || gdisp->gimage != gimage)
557
if (GIMP_IS_DRAW_TOOL (active_tool))
558
gdisp = GIMP_DRAW_TOOL (active_tool)->gdisp;
560
if (gdisp && gdisp->gimage == gimage)
561
tool_manager_control_active (gimage->gimp, HALT, gdisp);
584
GimpDisplay *display = gimp_tool_has_image (tool, image);
587
tool_manager_control_active (image->gimp, GIMP_TOOL_ACTION_HALT,