gimp/app/display/gimpdisplayshell-cursor.c

289 lines
8.8 KiB
C
Raw Normal View History

/* GIMP - The GNU Image Manipulation Program
* Copyright (C) 1995 Spencer Kimball and Peter Mattis
*
* 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 "display-types.h"
#include "config/gimpguiconfig.h"
#include "core/gimpimage.h"
#include "widgets/gimpcursor.h"
added new signals "sample-point-added" and "sample-point-removed" and 2005-04-03 Michael Natterer <mitch@gimp.org> * app/core/gimpimage.[ch]: added new signals "sample-point-added" and "sample-point-removed" and public functions to emit them. * app/core/gimpimage-sample-points.c (gimp_image_add_sample_point) (gimp_image_remove_sample_point): emit them accordingly. * app/core/gimpimage-undo-push.c (undo_pop_image_sample_point): ditto. (undo_pop_image_guide) (undo_pop_image_sample_point): added comments why we add/remove stuff manually instead of using the GimpImage APIs. * app/widgets/Makefile.am * app/widgets/widgets-types.h * app/widgets/gimpcursorview.[ch] * app/widgets/gimpsamplepointeditor.[ch]: new widgets. GimpCursorView is a replacement for the info window's "Cursor" page, GimpSamplePointEditor is a view on an image's sample points. The sample point editor does nothing yet except keeping a 2x2 grid of GimpColorFrames. Addresses bug #137776. * app/dialogs/dialogs.c * app/dialogs/dialogs-constructors.[ch]: register the new widgets as dockable dialogs. * app/actions/dialogs-actions.c (dialogs_dockable_actions) * menus/dialogs-menuitems.xml: added actions and menu items for the new dialogs. * app/display/gimpdisplayshell-cursor.c (gimp_display_shell_update_cursor) (gimp_display_shell_clear_cursor): update the new cursor view. * app/widgets/gimphelp-ids.h: help IDs for the new dialogs. * app/widgets/widgets-enums.[ch] (enum GimpColorFrameMode): changed description "Pixel values" to "Pixel" because the former was too long.
2005-04-03 23:48:03 +08:00
#include "widgets/gimpdialogfactory.h"
#include "widgets/gimpsessioninfo.h"
#include "gimpcanvascursor.h"
#include "gimpdisplay.h"
#include "gimpcursorview.h"
#include "gimpdisplayshell.h"
#include "gimpdisplayshell-cursor.h"
#include "gimpdisplayshell-transform.h"
#include "gimpstatusbar.h"
static void gimp_display_shell_real_set_cursor (GimpDisplayShell *shell,
GimpCursorType cursor_type,
GimpToolCursorType tool_cursor,
GimpCursorModifier modifier,
gboolean always_install);
First draft of the "no image open" window, which is implemented as a 2008-03-18 Michael Natterer <mitch@gimp.org> First draft of the "no image open" window, which is implemented as a display without image (a view with NULL model). Didn't change the display's appearance yet so I can first make sure the display without image works properly in all details before hiding these details. * app/core/gimp-gui.[ch]: add "gimp" parameter to display_create() and allow "image" to be NULL. * app/core/gimpcontext.c (gimp_context_real_set_display): a display's image can be NULL now. * app/display/gimpdisplay.[ch]: add Gimp and GimpDisplayConfig members. Add Gimp parameter to gimp_display_shell_new(). Changed gimp_display_reconnect() to gimp_display_set_image() and allow to set a NULL image. * app/gui/gui-vtable.c (gui_display_create): if there is a single display without an image, call gimp_display_set_image() on that display instead of creating a new one. * app/display/gimpdisplayshell-close.c: if the last display is closed, don't close it but make it empty. Factored out that code to gimp_display_shell_really_close(). * app/display/gimpdisplayshell-dnd.c: when dropping uris on an empty display, open the first one into that display and the other ones as layers of the newly opened image. This is consistent with dropping on an existing image but maybe needs some discussion. * app/display/gimpdisplayshell-callbacks.c: bail out early in the tool event callback so tools never have to deal with empty displays. In expose(), draw the drop zone on the empty display. * app/display/gimpdisplayshell-title.c: set the empty display's title to "Gimp - Drop Files". * app/display/gimpdisplay-foreach.c * app/display/gimpdisplay-handlers.c * app/display/gimpdisplayshell-appearance.c * app/display/gimpdisplayshell-autoscroll.c * app/display/gimpdisplayshell-callbacks.c * app/display/gimpdisplayshell-cursor.c * app/display/gimpdisplayshell-dnd.c * app/display/gimpdisplayshell-draw.c * app/display/gimpdisplayshell-filter-dialog.c * app/display/gimpdisplayshell-handlers.c * app/display/gimpdisplayshell-layer-select.c * app/display/gimpdisplayshell-preview.c * app/display/gimpdisplayshell-render.c * app/display/gimpdisplayshell-scale.c * app/display/gimpdisplayshell-scroll.c * app/display/gimpdisplayshell-selection.c * app/display/gimpdisplayshell-title.c * app/display/gimpdisplayshell.c * app/display/gimpnavigationeditor.c * app/display/gimpstatusbar.c: use display->gimp and display->config instead of going via the image. Guard against empty displays in some few places (most places can't be called). Where needed, use the canvas' dimensions instead of the image's dimensions so scroll offsets and scrollbars still have sane values instead of the last image's ones. * app/actions/actions.c (action_data_get_gimp) (action_data_get_context): use display->gimp instead of display->image->gimp. * app/actions/edit-commands.c (edit_paste_cmd_callback): redirect to "paste as new" if there is an empty display. * app/actions/tools-commands.c (tools_select_cmd_callback): don't initialize the new tool on an empty display. * app/actions/view-actions.c (view_actions_update): changed lots of sensitivity settings to be insensitive when there is no image (instead of no display). * app/actions/view-commands.c: use the display's config object instead of gimp's. svn path=/trunk/; revision=25113
2008-03-19 05:22:21 +08:00
/* public functions */
void
gimp_display_shell_set_cursor (GimpDisplayShell *shell,
GimpCursorType cursor_type,
GimpToolCursorType tool_cursor,
GimpCursorModifier modifier)
{
g_return_if_fail (GIMP_IS_DISPLAY_SHELL (shell));
if (! shell->using_override_cursor)
{
gimp_display_shell_real_set_cursor (shell,
cursor_type,
tool_cursor,
modifier,
FALSE);
}
}
void
gimp_display_shell_unset_cursor (GimpDisplayShell *shell)
{
g_return_if_fail (GIMP_IS_DISPLAY_SHELL (shell));
if (! shell->using_override_cursor)
{
gimp_display_shell_real_set_cursor (shell,
(GimpCursorType) -1, 0, 0, FALSE);
}
}
void
gimp_display_shell_set_override_cursor (GimpDisplayShell *shell,
GimpCursorType cursor_type)
{
g_return_if_fail (GIMP_IS_DISPLAY_SHELL (shell));
if (! shell->using_override_cursor ||
(shell->using_override_cursor &&
shell->override_cursor != cursor_type))
{
shell->override_cursor = cursor_type;
shell->using_override_cursor = TRUE;
gimp_cursor_set (shell->canvas,
shell->cursor_handedness,
cursor_type,
GIMP_TOOL_CURSOR_NONE,
GIMP_CURSOR_MODIFIER_NONE);
}
}
void
gimp_display_shell_unset_override_cursor (GimpDisplayShell *shell)
{
g_return_if_fail (GIMP_IS_DISPLAY_SHELL (shell));
if (shell->using_override_cursor)
{
shell->using_override_cursor = FALSE;
gimp_display_shell_real_set_cursor (shell,
shell->current_cursor,
shell->tool_cursor,
shell->cursor_modifier,
TRUE);
}
}
void
gimp_display_shell_update_software_cursor (GimpDisplayShell *shell,
GimpCursorPrecision precision,
gint display_x,
gint display_y,
gdouble image_x,
gdouble image_y)
{
GimpStatusbar *statusbar;
GtkWidget *widget;
GimpImage *image;
added new signals "sample-point-added" and "sample-point-removed" and 2005-04-03 Michael Natterer <mitch@gimp.org> * app/core/gimpimage.[ch]: added new signals "sample-point-added" and "sample-point-removed" and public functions to emit them. * app/core/gimpimage-sample-points.c (gimp_image_add_sample_point) (gimp_image_remove_sample_point): emit them accordingly. * app/core/gimpimage-undo-push.c (undo_pop_image_sample_point): ditto. (undo_pop_image_guide) (undo_pop_image_sample_point): added comments why we add/remove stuff manually instead of using the GimpImage APIs. * app/widgets/Makefile.am * app/widgets/widgets-types.h * app/widgets/gimpcursorview.[ch] * app/widgets/gimpsamplepointeditor.[ch]: new widgets. GimpCursorView is a replacement for the info window's "Cursor" page, GimpSamplePointEditor is a view on an image's sample points. The sample point editor does nothing yet except keeping a 2x2 grid of GimpColorFrames. Addresses bug #137776. * app/dialogs/dialogs.c * app/dialogs/dialogs-constructors.[ch]: register the new widgets as dockable dialogs. * app/actions/dialogs-actions.c (dialogs_dockable_actions) * menus/dialogs-menuitems.xml: added actions and menu items for the new dialogs. * app/display/gimpdisplayshell-cursor.c (gimp_display_shell_update_cursor) (gimp_display_shell_clear_cursor): update the new cursor view. * app/widgets/gimphelp-ids.h: help IDs for the new dialogs. * app/widgets/widgets-enums.[ch] (enum GimpColorFrameMode): changed description "Pixel values" to "Pixel" because the former was too long.
2005-04-03 23:48:03 +08:00
g_return_if_fail (GIMP_IS_DISPLAY_SHELL (shell));
image = gimp_display_get_image (shell->display);
if (shell->draw_cursor &&
shell->proximity &&
display_x >= 0 &&
display_y >= 0)
{
gimp_canvas_item_begin_change (shell->cursor);
gimp_canvas_cursor_set (shell->cursor,
display_x,
display_y);
gimp_canvas_item_set_visible (shell->cursor, TRUE);
gimp_canvas_item_end_change (shell->cursor);
}
else
{
gimp_canvas_item_set_visible (shell->cursor, FALSE);
}
/* use the passed image_coords for the statusbar because they are
* possibly snapped...
*/
statusbar = gimp_display_shell_get_statusbar (shell);
gimp_statusbar_update_cursor (statusbar, precision, image_x, image_y);
widget = gimp_dialog_factory_find_widget (gimp_dialog_factory_get_singleton (),
"gimp-cursor-view");
if (widget)
{
GtkWidget *cursor_view;
cursor_view = gtk_bin_get_child (GTK_BIN (widget));
if (cursor_view)
{
gint t_x = -1;
gint t_y = -1;
added new signals "sample-point-added" and "sample-point-removed" and 2005-04-03 Michael Natterer <mitch@gimp.org> * app/core/gimpimage.[ch]: added new signals "sample-point-added" and "sample-point-removed" and public functions to emit them. * app/core/gimpimage-sample-points.c (gimp_image_add_sample_point) (gimp_image_remove_sample_point): emit them accordingly. * app/core/gimpimage-undo-push.c (undo_pop_image_sample_point): ditto. (undo_pop_image_guide) (undo_pop_image_sample_point): added comments why we add/remove stuff manually instead of using the GimpImage APIs. * app/widgets/Makefile.am * app/widgets/widgets-types.h * app/widgets/gimpcursorview.[ch] * app/widgets/gimpsamplepointeditor.[ch]: new widgets. GimpCursorView is a replacement for the info window's "Cursor" page, GimpSamplePointEditor is a view on an image's sample points. The sample point editor does nothing yet except keeping a 2x2 grid of GimpColorFrames. Addresses bug #137776. * app/dialogs/dialogs.c * app/dialogs/dialogs-constructors.[ch]: register the new widgets as dockable dialogs. * app/actions/dialogs-actions.c (dialogs_dockable_actions) * menus/dialogs-menuitems.xml: added actions and menu items for the new dialogs. * app/display/gimpdisplayshell-cursor.c (gimp_display_shell_update_cursor) (gimp_display_shell_clear_cursor): update the new cursor view. * app/widgets/gimphelp-ids.h: help IDs for the new dialogs. * app/widgets/widgets-enums.[ch] (enum GimpColorFrameMode): changed description "Pixel values" to "Pixel" because the former was too long.
2005-04-03 23:48:03 +08:00
/* ...but use the unsnapped display_coords for the info window */
if (display_x >= 0 && display_y >= 0)
gimp_display_shell_untransform_xy (shell, display_x, display_y,
&t_x, &t_y, FALSE);
gimp_cursor_view_update_cursor (GIMP_CURSOR_VIEW (cursor_view),
image, shell->unit,
t_x, t_y);
}
}
}
void
gimp_display_shell_clear_software_cursor (GimpDisplayShell *shell)
{
GimpStatusbar *statusbar;
GtkWidget *widget;
added new signals "sample-point-added" and "sample-point-removed" and 2005-04-03 Michael Natterer <mitch@gimp.org> * app/core/gimpimage.[ch]: added new signals "sample-point-added" and "sample-point-removed" and public functions to emit them. * app/core/gimpimage-sample-points.c (gimp_image_add_sample_point) (gimp_image_remove_sample_point): emit them accordingly. * app/core/gimpimage-undo-push.c (undo_pop_image_sample_point): ditto. (undo_pop_image_guide) (undo_pop_image_sample_point): added comments why we add/remove stuff manually instead of using the GimpImage APIs. * app/widgets/Makefile.am * app/widgets/widgets-types.h * app/widgets/gimpcursorview.[ch] * app/widgets/gimpsamplepointeditor.[ch]: new widgets. GimpCursorView is a replacement for the info window's "Cursor" page, GimpSamplePointEditor is a view on an image's sample points. The sample point editor does nothing yet except keeping a 2x2 grid of GimpColorFrames. Addresses bug #137776. * app/dialogs/dialogs.c * app/dialogs/dialogs-constructors.[ch]: register the new widgets as dockable dialogs. * app/actions/dialogs-actions.c (dialogs_dockable_actions) * menus/dialogs-menuitems.xml: added actions and menu items for the new dialogs. * app/display/gimpdisplayshell-cursor.c (gimp_display_shell_update_cursor) (gimp_display_shell_clear_cursor): update the new cursor view. * app/widgets/gimphelp-ids.h: help IDs for the new dialogs. * app/widgets/widgets-enums.[ch] (enum GimpColorFrameMode): changed description "Pixel values" to "Pixel" because the former was too long.
2005-04-03 23:48:03 +08:00
g_return_if_fail (GIMP_IS_DISPLAY_SHELL (shell));
gimp_canvas_item_set_visible (shell->cursor, FALSE);
statusbar = gimp_display_shell_get_statusbar (shell);
gimp_statusbar_clear_cursor (statusbar);
widget = gimp_dialog_factory_find_widget (gimp_dialog_factory_get_singleton (),
"gimp-cursor-view");
if (widget)
{
GtkWidget *cursor_view;
added new signals "sample-point-added" and "sample-point-removed" and 2005-04-03 Michael Natterer <mitch@gimp.org> * app/core/gimpimage.[ch]: added new signals "sample-point-added" and "sample-point-removed" and public functions to emit them. * app/core/gimpimage-sample-points.c (gimp_image_add_sample_point) (gimp_image_remove_sample_point): emit them accordingly. * app/core/gimpimage-undo-push.c (undo_pop_image_sample_point): ditto. (undo_pop_image_guide) (undo_pop_image_sample_point): added comments why we add/remove stuff manually instead of using the GimpImage APIs. * app/widgets/Makefile.am * app/widgets/widgets-types.h * app/widgets/gimpcursorview.[ch] * app/widgets/gimpsamplepointeditor.[ch]: new widgets. GimpCursorView is a replacement for the info window's "Cursor" page, GimpSamplePointEditor is a view on an image's sample points. The sample point editor does nothing yet except keeping a 2x2 grid of GimpColorFrames. Addresses bug #137776. * app/dialogs/dialogs.c * app/dialogs/dialogs-constructors.[ch]: register the new widgets as dockable dialogs. * app/actions/dialogs-actions.c (dialogs_dockable_actions) * menus/dialogs-menuitems.xml: added actions and menu items for the new dialogs. * app/display/gimpdisplayshell-cursor.c (gimp_display_shell_update_cursor) (gimp_display_shell_clear_cursor): update the new cursor view. * app/widgets/gimphelp-ids.h: help IDs for the new dialogs. * app/widgets/widgets-enums.[ch] (enum GimpColorFrameMode): changed description "Pixel values" to "Pixel" because the former was too long.
2005-04-03 23:48:03 +08:00
cursor_view = gtk_bin_get_child (GTK_BIN (widget));
if (cursor_view)
gimp_cursor_view_clear_cursor (GIMP_CURSOR_VIEW (cursor_view));
}
}
First draft of the "no image open" window, which is implemented as a 2008-03-18 Michael Natterer <mitch@gimp.org> First draft of the "no image open" window, which is implemented as a display without image (a view with NULL model). Didn't change the display's appearance yet so I can first make sure the display without image works properly in all details before hiding these details. * app/core/gimp-gui.[ch]: add "gimp" parameter to display_create() and allow "image" to be NULL. * app/core/gimpcontext.c (gimp_context_real_set_display): a display's image can be NULL now. * app/display/gimpdisplay.[ch]: add Gimp and GimpDisplayConfig members. Add Gimp parameter to gimp_display_shell_new(). Changed gimp_display_reconnect() to gimp_display_set_image() and allow to set a NULL image. * app/gui/gui-vtable.c (gui_display_create): if there is a single display without an image, call gimp_display_set_image() on that display instead of creating a new one. * app/display/gimpdisplayshell-close.c: if the last display is closed, don't close it but make it empty. Factored out that code to gimp_display_shell_really_close(). * app/display/gimpdisplayshell-dnd.c: when dropping uris on an empty display, open the first one into that display and the other ones as layers of the newly opened image. This is consistent with dropping on an existing image but maybe needs some discussion. * app/display/gimpdisplayshell-callbacks.c: bail out early in the tool event callback so tools never have to deal with empty displays. In expose(), draw the drop zone on the empty display. * app/display/gimpdisplayshell-title.c: set the empty display's title to "Gimp - Drop Files". * app/display/gimpdisplay-foreach.c * app/display/gimpdisplay-handlers.c * app/display/gimpdisplayshell-appearance.c * app/display/gimpdisplayshell-autoscroll.c * app/display/gimpdisplayshell-callbacks.c * app/display/gimpdisplayshell-cursor.c * app/display/gimpdisplayshell-dnd.c * app/display/gimpdisplayshell-draw.c * app/display/gimpdisplayshell-filter-dialog.c * app/display/gimpdisplayshell-handlers.c * app/display/gimpdisplayshell-layer-select.c * app/display/gimpdisplayshell-preview.c * app/display/gimpdisplayshell-render.c * app/display/gimpdisplayshell-scale.c * app/display/gimpdisplayshell-scroll.c * app/display/gimpdisplayshell-selection.c * app/display/gimpdisplayshell-title.c * app/display/gimpdisplayshell.c * app/display/gimpnavigationeditor.c * app/display/gimpstatusbar.c: use display->gimp and display->config instead of going via the image. Guard against empty displays in some few places (most places can't be called). Where needed, use the canvas' dimensions instead of the image's dimensions so scroll offsets and scrollbars still have sane values instead of the last image's ones. * app/actions/actions.c (action_data_get_gimp) (action_data_get_context): use display->gimp instead of display->image->gimp. * app/actions/edit-commands.c (edit_paste_cmd_callback): redirect to "paste as new" if there is an empty display. * app/actions/tools-commands.c (tools_select_cmd_callback): don't initialize the new tool on an empty display. * app/actions/view-actions.c (view_actions_update): changed lots of sensitivity settings to be insensitive when there is no image (instead of no display). * app/actions/view-commands.c: use the display's config object instead of gimp's. svn path=/trunk/; revision=25113
2008-03-19 05:22:21 +08:00
/* private functions */
static void
gimp_display_shell_real_set_cursor (GimpDisplayShell *shell,
GimpCursorType cursor_type,
GimpToolCursorType tool_cursor,
GimpCursorModifier modifier,
gboolean always_install)
{
GimpHandedness cursor_handedness;
g_return_if_fail (GIMP_IS_DISPLAY_SHELL (shell));
if (cursor_type == (GimpCursorType) -1)
{
shell->current_cursor = cursor_type;
if (gtk_widget_is_drawable (shell->canvas))
gdk_window_set_cursor (gtk_widget_get_window (shell->canvas), NULL);
return;
}
if (cursor_type != GIMP_CURSOR_NONE &&
cursor_type != GIMP_CURSOR_BAD)
{
First draft of the "no image open" window, which is implemented as a 2008-03-18 Michael Natterer <mitch@gimp.org> First draft of the "no image open" window, which is implemented as a display without image (a view with NULL model). Didn't change the display's appearance yet so I can first make sure the display without image works properly in all details before hiding these details. * app/core/gimp-gui.[ch]: add "gimp" parameter to display_create() and allow "image" to be NULL. * app/core/gimpcontext.c (gimp_context_real_set_display): a display's image can be NULL now. * app/display/gimpdisplay.[ch]: add Gimp and GimpDisplayConfig members. Add Gimp parameter to gimp_display_shell_new(). Changed gimp_display_reconnect() to gimp_display_set_image() and allow to set a NULL image. * app/gui/gui-vtable.c (gui_display_create): if there is a single display without an image, call gimp_display_set_image() on that display instead of creating a new one. * app/display/gimpdisplayshell-close.c: if the last display is closed, don't close it but make it empty. Factored out that code to gimp_display_shell_really_close(). * app/display/gimpdisplayshell-dnd.c: when dropping uris on an empty display, open the first one into that display and the other ones as layers of the newly opened image. This is consistent with dropping on an existing image but maybe needs some discussion. * app/display/gimpdisplayshell-callbacks.c: bail out early in the tool event callback so tools never have to deal with empty displays. In expose(), draw the drop zone on the empty display. * app/display/gimpdisplayshell-title.c: set the empty display's title to "Gimp - Drop Files". * app/display/gimpdisplay-foreach.c * app/display/gimpdisplay-handlers.c * app/display/gimpdisplayshell-appearance.c * app/display/gimpdisplayshell-autoscroll.c * app/display/gimpdisplayshell-callbacks.c * app/display/gimpdisplayshell-cursor.c * app/display/gimpdisplayshell-dnd.c * app/display/gimpdisplayshell-draw.c * app/display/gimpdisplayshell-filter-dialog.c * app/display/gimpdisplayshell-handlers.c * app/display/gimpdisplayshell-layer-select.c * app/display/gimpdisplayshell-preview.c * app/display/gimpdisplayshell-render.c * app/display/gimpdisplayshell-scale.c * app/display/gimpdisplayshell-scroll.c * app/display/gimpdisplayshell-selection.c * app/display/gimpdisplayshell-title.c * app/display/gimpdisplayshell.c * app/display/gimpnavigationeditor.c * app/display/gimpstatusbar.c: use display->gimp and display->config instead of going via the image. Guard against empty displays in some few places (most places can't be called). Where needed, use the canvas' dimensions instead of the image's dimensions so scroll offsets and scrollbars still have sane values instead of the last image's ones. * app/actions/actions.c (action_data_get_gimp) (action_data_get_context): use display->gimp instead of display->image->gimp. * app/actions/edit-commands.c (edit_paste_cmd_callback): redirect to "paste as new" if there is an empty display. * app/actions/tools-commands.c (tools_select_cmd_callback): don't initialize the new tool on an empty display. * app/actions/view-actions.c (view_actions_update): changed lots of sensitivity settings to be insensitive when there is no image (instead of no display). * app/actions/view-commands.c: use the display's config object instead of gimp's. svn path=/trunk/; revision=25113
2008-03-19 05:22:21 +08:00
switch (shell->display->config->cursor_mode)
{
case GIMP_CURSOR_MODE_TOOL_ICON:
break;
case GIMP_CURSOR_MODE_TOOL_CROSSHAIR:
if (cursor_type < GIMP_CURSOR_CORNER_TOP ||
cursor_type > GIMP_CURSOR_SIDE_TOP_LEFT)
cursors/Makefile.am cursors/cursor-corner-bottom-left.png 2006-06-02 Michael Natterer <mitch@gimp.org> * cursors/Makefile.am * cursors/cursor-corner-bottom-left.png * cursors/cursor-corner-bottom-right.png * cursors/cursor-corner-top-left.png * cursors/cursor-corner-top-right.png * cursors/cursor-side-bottom.png * cursors/cursor-side-left.png * cursors/cursor-side-right.png * cursors/cursor-side-top.png * cursors/xbm/cursor-corner-bottom-left-mask.xbm * cursors/xbm/cursor-corner-bottom-left.xbm * cursors/xbm/cursor-corner-bottom-right-mask.xbm * cursors/xbm/cursor-corner-bottom-right.xbm * cursors/xbm/cursor-corner-top-left-mask.xbm * cursors/xbm/cursor-corner-top-left.xbm * cursors/xbm/cursor-corner-top-right-mask.xbm * cursors/xbm/cursor-corner-top-right.xbm * cursors/xbm/cursor-side-bottom-mask.xbm * cursors/xbm/cursor-side-bottom.xbm * cursors/xbm/cursor-side-left-mask.xbm * cursors/xbm/cursor-side-left.xbm * cursors/xbm/cursor-side-right-mask.xbm * cursors/xbm/cursor-side-right.xbm * cursors/xbm/cursor-side-top-mask.xbm * cursors/xbm/cursor-side-top.xbm: new cursors for edge and corner resizing. They perfectly align with the small crosshair and can be used together with tool cursors and cursor modifiers. * cursors/gimp-tool-cursors.xcf: add them here too. * app/widgets/widgets-enums.h: add them to the GimpCursorType enum. * app/widgets/gimpcursor.c: add them here too. * app/display/gimpdisplayshell-cursor.c: treat them like the small crosshair (don't replace them by the small crosshair but use them as-is). Also allow the bad modifier with the large crosshair. * app/tools/gimprectangletool.c (gimp_rectangle_tool_cursor_update): use the new cursors. Don't call gimp_tool_set_cursor() here. (gimp_rectangle_tool_response): reset "function" to RECT_CREATING when resetting the tool. * app/tools/gimpselectiontool.[ch] (struct GimpSelectionTool): added boolean member "allow_move" which defalts to TRUE. (gimp_selection_tool_oper_update): don't move masks, floating selections or anything when "allow_move" is FALSE. Changed behavior of click inside a selection to simply create a new selection, need to press alt+shift now to drag-float the selection. Please test this, it's apretty fundamental change! (gimp_selection_tool_cursor_update): use the tool's configured cursor instead of always GIMP_CURSOR_MOUSE, so this function can be called after gimp_rectangle_tool_cursor_update() to add the plus, minus etc. modifiers. * app/tools/gimpnewrectselecttool.c: implement GimpTool::cursor_update() and call gimp_rectangle_tool_cursor_update() from there. Chain up to get the plus, minus etc. modifiers added. Re-enble selection moving: (gimp_new_rect_select_tool_oper_update): set GimpSelectionTool's "allow_move" to FALSE unless the rectangle tool is in an idle state. (gimp_new_rect_select_tool_button_press): allow a selection moving to be started if the rectangle tool is idle. Fall back to starting a rect select if gimp_selection_tool_start_edit() returned FALSE.
2006-06-02 23:23:47 +08:00
{
/* the corner and side cursors count as crosshair, so leave
* them and override everything else
*/
cursor_type = GIMP_CURSOR_CROSSHAIR_SMALL;
}
break;
case GIMP_CURSOR_MODE_CROSSHAIR:
cursor_type = GIMP_CURSOR_CROSSHAIR;
tool_cursor = GIMP_TOOL_CURSOR_NONE;
cursors/Makefile.am cursors/cursor-corner-bottom-left.png 2006-06-02 Michael Natterer <mitch@gimp.org> * cursors/Makefile.am * cursors/cursor-corner-bottom-left.png * cursors/cursor-corner-bottom-right.png * cursors/cursor-corner-top-left.png * cursors/cursor-corner-top-right.png * cursors/cursor-side-bottom.png * cursors/cursor-side-left.png * cursors/cursor-side-right.png * cursors/cursor-side-top.png * cursors/xbm/cursor-corner-bottom-left-mask.xbm * cursors/xbm/cursor-corner-bottom-left.xbm * cursors/xbm/cursor-corner-bottom-right-mask.xbm * cursors/xbm/cursor-corner-bottom-right.xbm * cursors/xbm/cursor-corner-top-left-mask.xbm * cursors/xbm/cursor-corner-top-left.xbm * cursors/xbm/cursor-corner-top-right-mask.xbm * cursors/xbm/cursor-corner-top-right.xbm * cursors/xbm/cursor-side-bottom-mask.xbm * cursors/xbm/cursor-side-bottom.xbm * cursors/xbm/cursor-side-left-mask.xbm * cursors/xbm/cursor-side-left.xbm * cursors/xbm/cursor-side-right-mask.xbm * cursors/xbm/cursor-side-right.xbm * cursors/xbm/cursor-side-top-mask.xbm * cursors/xbm/cursor-side-top.xbm: new cursors for edge and corner resizing. They perfectly align with the small crosshair and can be used together with tool cursors and cursor modifiers. * cursors/gimp-tool-cursors.xcf: add them here too. * app/widgets/widgets-enums.h: add them to the GimpCursorType enum. * app/widgets/gimpcursor.c: add them here too. * app/display/gimpdisplayshell-cursor.c: treat them like the small crosshair (don't replace them by the small crosshair but use them as-is). Also allow the bad modifier with the large crosshair. * app/tools/gimprectangletool.c (gimp_rectangle_tool_cursor_update): use the new cursors. Don't call gimp_tool_set_cursor() here. (gimp_rectangle_tool_response): reset "function" to RECT_CREATING when resetting the tool. * app/tools/gimpselectiontool.[ch] (struct GimpSelectionTool): added boolean member "allow_move" which defalts to TRUE. (gimp_selection_tool_oper_update): don't move masks, floating selections or anything when "allow_move" is FALSE. Changed behavior of click inside a selection to simply create a new selection, need to press alt+shift now to drag-float the selection. Please test this, it's apretty fundamental change! (gimp_selection_tool_cursor_update): use the tool's configured cursor instead of always GIMP_CURSOR_MOUSE, so this function can be called after gimp_rectangle_tool_cursor_update() to add the plus, minus etc. modifiers. * app/tools/gimpnewrectselecttool.c: implement GimpTool::cursor_update() and call gimp_rectangle_tool_cursor_update() from there. Chain up to get the plus, minus etc. modifiers added. Re-enble selection moving: (gimp_new_rect_select_tool_oper_update): set GimpSelectionTool's "allow_move" to FALSE unless the rectangle tool is in an idle state. (gimp_new_rect_select_tool_button_press): allow a selection moving to be started if the rectangle tool is idle. Fall back to starting a rect select if gimp_selection_tool_start_edit() returned FALSE.
2006-06-02 23:23:47 +08:00
if (modifier != GIMP_CURSOR_MODIFIER_BAD)
{
/* the bad modifier is always shown */
modifier = GIMP_CURSOR_MODIFIER_NONE;
}
break;
}
}
cursor_type = gimp_cursor_rotate (cursor_type, shell->rotate_angle);
cursor_handedness = GIMP_GUI_CONFIG (shell->display->config)->cursor_handedness;
if (shell->cursor_handedness != cursor_handedness ||
shell->current_cursor != cursor_type ||
shell->tool_cursor != tool_cursor ||
shell->cursor_modifier != modifier ||
always_install)
{
shell->cursor_handedness = cursor_handedness;
shell->current_cursor = cursor_type;
shell->tool_cursor = tool_cursor;
shell->cursor_modifier = modifier;
gimp_cursor_set (shell->canvas,
cursor_handedness,
cursor_type, tool_cursor, modifier);
}
}