mirror of https://github.com/GNOME/gimp.git
app/display/Makefile.am app/display/gimpdisplayshell-autoscroll.[ch] new
2005-01-02 Michael Natterer <mitch@gimp.org> * app/display/Makefile.am * app/display/gimpdisplayshell-autoscroll.[ch] * app/display/gimpdisplayshell-coords.[ch]: new files factored out of gimpdisplayshell-callbacks.c * app/display/gimpdisplayshell.h (struct GimpDisplayShell): added "gpointer scroll_info" needed by autoscroll. * app/display/gimpdisplayshell-callbacks.c: removed the stuff above. Also removed the static autoscroll struct because it's not needed any longer.
This commit is contained in:
parent
9ecaa8f22c
commit
aef1cf9306
14
ChangeLog
14
ChangeLog
|
@ -1,3 +1,17 @@
|
||||||
|
2005-01-02 Michael Natterer <mitch@gimp.org>
|
||||||
|
|
||||||
|
* app/display/Makefile.am
|
||||||
|
* app/display/gimpdisplayshell-autoscroll.[ch]
|
||||||
|
* app/display/gimpdisplayshell-coords.[ch]: new files factored out
|
||||||
|
of gimpdisplayshell-callbacks.c
|
||||||
|
|
||||||
|
* app/display/gimpdisplayshell.h (struct GimpDisplayShell): added
|
||||||
|
"gpointer scroll_info" needed by autoscroll.
|
||||||
|
|
||||||
|
* app/display/gimpdisplayshell-callbacks.c: removed the stuff
|
||||||
|
above. Also removed the static autoscroll struct because it's not
|
||||||
|
needed any longer.
|
||||||
|
|
||||||
2005-01-02 DindinX <dindinx@gimp.org>
|
2005-01-02 DindinX <dindinx@gimp.org>
|
||||||
|
|
||||||
* plug-ins/common/mosaic.c: Added a preview. This still needs some
|
* plug-ins/common/mosaic.c: Added a preview. This still needs some
|
||||||
|
|
|
@ -30,10 +30,14 @@ libappdisplay_a_sources = \
|
||||||
gimpdisplayshell.h \
|
gimpdisplayshell.h \
|
||||||
gimpdisplayshell-appearance.c \
|
gimpdisplayshell-appearance.c \
|
||||||
gimpdisplayshell-appearance.h \
|
gimpdisplayshell-appearance.h \
|
||||||
|
gimpdisplayshell-autoscroll.c \
|
||||||
|
gimpdisplayshell-autoscroll.h \
|
||||||
gimpdisplayshell-callbacks.c \
|
gimpdisplayshell-callbacks.c \
|
||||||
gimpdisplayshell-callbacks.h \
|
gimpdisplayshell-callbacks.h \
|
||||||
gimpdisplayshell-close.c \
|
gimpdisplayshell-close.c \
|
||||||
gimpdisplayshell-close.h \
|
gimpdisplayshell-close.h \
|
||||||
|
gimpdisplayshell-coords.c \
|
||||||
|
gimpdisplayshell-coords.h \
|
||||||
gimpdisplayshell-cursor.c \
|
gimpdisplayshell-cursor.c \
|
||||||
gimpdisplayshell-cursor.h \
|
gimpdisplayshell-cursor.h \
|
||||||
gimpdisplayshell-dnd.c \
|
gimpdisplayshell-dnd.c \
|
||||||
|
|
|
@ -0,0 +1,156 @@
|
||||||
|
/* The GIMP -- an 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 2 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, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "config.h"
|
||||||
|
|
||||||
|
#include <gtk/gtk.h>
|
||||||
|
|
||||||
|
#include "display-types.h"
|
||||||
|
|
||||||
|
#include "core/gimpimage.h"
|
||||||
|
|
||||||
|
#include "gimpdisplay.h"
|
||||||
|
#include "gimpdisplayshell.h"
|
||||||
|
#include "gimpdisplayshell-autoscroll.h"
|
||||||
|
#include "gimpdisplayshell-coords.h"
|
||||||
|
#include "gimpdisplayshell-scroll.h"
|
||||||
|
#include "gimpdisplayshell-transform.h"
|
||||||
|
|
||||||
|
#include "tools/tools-types.h"
|
||||||
|
#include "tools/tool_manager.h"
|
||||||
|
|
||||||
|
|
||||||
|
#define AUTOSCROLL_DT 20
|
||||||
|
#define AUTOSCROLL_DX 0.1
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
GdkEventMotion *mevent;
|
||||||
|
GdkDevice *device;
|
||||||
|
guint32 time;
|
||||||
|
GdkModifierType state;
|
||||||
|
guint timeout_id;
|
||||||
|
} ScrollInfo;
|
||||||
|
|
||||||
|
|
||||||
|
/* local function prototypes */
|
||||||
|
|
||||||
|
static gboolean gimp_display_shell_autoscroll_timeout (gpointer data);
|
||||||
|
|
||||||
|
|
||||||
|
/* public functions */
|
||||||
|
|
||||||
|
void
|
||||||
|
gimp_display_shell_autoscroll_start (GimpDisplayShell *shell,
|
||||||
|
GdkModifierType state,
|
||||||
|
GdkEventMotion *mevent)
|
||||||
|
{
|
||||||
|
ScrollInfo *info;
|
||||||
|
|
||||||
|
g_return_if_fail (GIMP_IS_DISPLAY_SHELL (shell));
|
||||||
|
|
||||||
|
if (shell->scroll_info)
|
||||||
|
return;
|
||||||
|
|
||||||
|
info = g_new0 (ScrollInfo, 1);
|
||||||
|
|
||||||
|
info->mevent = mevent;
|
||||||
|
info->device = mevent->device;
|
||||||
|
info->time = gdk_event_get_time ((GdkEvent *) mevent);
|
||||||
|
info->state = state;
|
||||||
|
info->timeout_id = g_timeout_add (AUTOSCROLL_DT,
|
||||||
|
gimp_display_shell_autoscroll_timeout,
|
||||||
|
shell);
|
||||||
|
|
||||||
|
shell->scroll_info = info;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
gimp_display_shell_autoscroll_stop (GimpDisplayShell *shell)
|
||||||
|
{
|
||||||
|
ScrollInfo *info;
|
||||||
|
|
||||||
|
g_return_if_fail (GIMP_IS_DISPLAY_SHELL (shell));
|
||||||
|
|
||||||
|
if (! shell->scroll_info)
|
||||||
|
return;
|
||||||
|
|
||||||
|
info = shell->scroll_info;
|
||||||
|
|
||||||
|
if (info->timeout_id)
|
||||||
|
{
|
||||||
|
g_source_remove (info->timeout_id);
|
||||||
|
info->timeout_id = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
g_free (info);
|
||||||
|
shell->scroll_info = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* private functions */
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
gimp_display_shell_autoscroll_timeout (gpointer data)
|
||||||
|
{
|
||||||
|
GimpDisplayShell *shell = GIMP_DISPLAY_SHELL (data);
|
||||||
|
GimpDisplay *gdisp = shell->gdisp;
|
||||||
|
ScrollInfo *info = shell->scroll_info;
|
||||||
|
GimpCoords device_coords;
|
||||||
|
GimpCoords image_coords;
|
||||||
|
gint off_x = 0;
|
||||||
|
gint off_y = 0;
|
||||||
|
|
||||||
|
info->time += AUTOSCROLL_DT;
|
||||||
|
|
||||||
|
gimp_display_shell_get_device_coords (shell,
|
||||||
|
info->device, &device_coords);
|
||||||
|
|
||||||
|
if (device_coords.x < 0)
|
||||||
|
off_x = device_coords.x;
|
||||||
|
else if (device_coords.x > shell->disp_width)
|
||||||
|
off_x = device_coords.x - shell->disp_width;
|
||||||
|
|
||||||
|
if (device_coords.y < 0)
|
||||||
|
off_y = device_coords.y;
|
||||||
|
else if (device_coords.y > shell->disp_height)
|
||||||
|
off_y = device_coords.y - shell->disp_height;
|
||||||
|
|
||||||
|
if (off_x == 0 && off_y == 0)
|
||||||
|
{
|
||||||
|
g_free (info);
|
||||||
|
shell->scroll_info = NULL;
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
gimp_display_shell_scroll (shell,
|
||||||
|
AUTOSCROLL_DX * (gdouble) off_x,
|
||||||
|
AUTOSCROLL_DX * (gdouble) off_y);
|
||||||
|
|
||||||
|
gimp_display_shell_untransform_coords (shell,
|
||||||
|
&device_coords, &image_coords);
|
||||||
|
|
||||||
|
tool_manager_motion_active (gdisp->gimage->gimp,
|
||||||
|
&image_coords,
|
||||||
|
info->time, info->state,
|
||||||
|
gdisp);
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
|
@ -0,0 +1,29 @@
|
||||||
|
/* The GIMP -- an 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 2 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, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __GIMP_DISPLAY_SHELL_AUTOSCROLL_H__
|
||||||
|
#define __GIMP_DISPLAY_SHELL_AUTOSCROLL_H__
|
||||||
|
|
||||||
|
|
||||||
|
void gimp_display_shell_autoscroll_start (GimpDisplayShell *shell,
|
||||||
|
GdkModifierType state,
|
||||||
|
GdkEventMotion *mevent);
|
||||||
|
void gimp_display_shell_autoscroll_stop (GimpDisplayShell *shell);
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* __GIMP_DISPLAY_SHELL_AUTOSCROLL_H__ */
|
|
@ -17,6 +17,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
#include <gtk/gtk.h>
|
#include <gtk/gtk.h>
|
||||||
|
@ -58,7 +59,9 @@
|
||||||
#include "gimpdisplayoptions.h"
|
#include "gimpdisplayoptions.h"
|
||||||
#include "gimpdisplayshell.h"
|
#include "gimpdisplayshell.h"
|
||||||
#include "gimpdisplayshell-appearance.h"
|
#include "gimpdisplayshell-appearance.h"
|
||||||
|
#include "gimpdisplayshell-autoscroll.h"
|
||||||
#include "gimpdisplayshell-callbacks.h"
|
#include "gimpdisplayshell-callbacks.h"
|
||||||
|
#include "gimpdisplayshell-coords.h"
|
||||||
#include "gimpdisplayshell-cursor.h"
|
#include "gimpdisplayshell-cursor.h"
|
||||||
#include "gimpdisplayshell-draw.h"
|
#include "gimpdisplayshell-draw.h"
|
||||||
#include "gimpdisplayshell-layer-select.h"
|
#include "gimpdisplayshell-layer-select.h"
|
||||||
|
@ -72,17 +75,6 @@
|
||||||
|
|
||||||
#include "gimp-intl.h"
|
#include "gimp-intl.h"
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
GimpDisplayShell *shell;
|
|
||||||
GdkEventMotion *mevent;
|
|
||||||
GdkDevice *device;
|
|
||||||
guint32 time;
|
|
||||||
GdkModifierType state;
|
|
||||||
guint timeout_id;
|
|
||||||
} ScrollInfo;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* #define DEBUG_MOVE_PUSH 1 */
|
/* #define DEBUG_MOVE_PUSH 1 */
|
||||||
|
|
||||||
|
@ -94,31 +86,6 @@ static void gimp_display_shell_vscrollbar_update (GtkAdjustment *adjustme
|
||||||
static void gimp_display_shell_hscrollbar_update (GtkAdjustment *adjustment,
|
static void gimp_display_shell_hscrollbar_update (GtkAdjustment *adjustment,
|
||||||
GimpDisplayShell *shell);
|
GimpDisplayShell *shell);
|
||||||
|
|
||||||
static gboolean gimp_display_shell_get_event_coords (GimpDisplayShell *shell,
|
|
||||||
GdkEvent *event,
|
|
||||||
GdkDevice *device,
|
|
||||||
GimpCoords *coords);
|
|
||||||
static void gimp_display_shell_get_device_coords (GimpDisplayShell *shell,
|
|
||||||
GdkDevice *device,
|
|
||||||
GimpCoords *coords);
|
|
||||||
static void gimp_display_shell_get_time_coords (GimpDisplayShell *shell,
|
|
||||||
GdkDevice *device,
|
|
||||||
GdkTimeCoord *event,
|
|
||||||
GimpCoords *coords);
|
|
||||||
static gboolean gimp_display_shell_get_event_state (GimpDisplayShell *shell,
|
|
||||||
GdkEvent *event,
|
|
||||||
GdkDevice *device,
|
|
||||||
GdkModifierType *state);
|
|
||||||
static void gimp_display_shell_get_device_state (GimpDisplayShell *shell,
|
|
||||||
GdkDevice *device,
|
|
||||||
GdkModifierType *state);
|
|
||||||
static gboolean autoscroll_timeout (gpointer data);
|
|
||||||
static void begin_autoscrolling (ScrollInfo *info,
|
|
||||||
GimpDisplayShell *shell,
|
|
||||||
GdkModifierType state,
|
|
||||||
GdkEventMotion *mevent);
|
|
||||||
static void end_autoscrolling (ScrollInfo *info);
|
|
||||||
|
|
||||||
static GdkModifierType
|
static GdkModifierType
|
||||||
gimp_display_shell_key_to_state (gint key);
|
gimp_display_shell_key_to_state (gint key);
|
||||||
|
|
||||||
|
@ -465,84 +432,6 @@ gimp_display_shell_check_device_cursor (GimpDisplayShell *shell)
|
||||||
shell->draw_cursor = ! current_device->has_cursor;
|
shell->draw_cursor = ! current_device->has_cursor;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#define AUTOSCROLL_DT 20
|
|
||||||
#define AUTOSCROLL_DX 0.1
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
autoscroll_timeout (gpointer data)
|
|
||||||
{
|
|
||||||
ScrollInfo *info = data;
|
|
||||||
GimpDisplay *gdisp = info->shell->gdisp;
|
|
||||||
GimpCoords device_coords;
|
|
||||||
GimpCoords image_coords;
|
|
||||||
gint off_x = 0;
|
|
||||||
gint off_y = 0;
|
|
||||||
|
|
||||||
info->time += AUTOSCROLL_DT;
|
|
||||||
|
|
||||||
gimp_display_shell_get_device_coords (info->shell,
|
|
||||||
info->device, &device_coords);
|
|
||||||
|
|
||||||
if (device_coords.x < 0)
|
|
||||||
off_x = device_coords.x;
|
|
||||||
else if (device_coords.x > info->shell->disp_width)
|
|
||||||
off_x = device_coords.x - info->shell->disp_width;
|
|
||||||
|
|
||||||
if (device_coords.y < 0)
|
|
||||||
off_y = device_coords.y;
|
|
||||||
else if (device_coords.y > info->shell->disp_height)
|
|
||||||
off_y = device_coords.y - info->shell->disp_height;
|
|
||||||
|
|
||||||
if (off_x == 0 && off_y == 0)
|
|
||||||
{
|
|
||||||
info->timeout_id = 0;
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
gimp_display_shell_scroll (info->shell,
|
|
||||||
AUTOSCROLL_DX * (gdouble) off_x,
|
|
||||||
AUTOSCROLL_DX * (gdouble) off_y);
|
|
||||||
|
|
||||||
gimp_display_shell_untransform_coords (info->shell,
|
|
||||||
&device_coords, &image_coords);
|
|
||||||
|
|
||||||
tool_manager_motion_active (gdisp->gimage->gimp,
|
|
||||||
&image_coords,
|
|
||||||
info->time, info->state,
|
|
||||||
gdisp);
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
begin_autoscrolling (ScrollInfo *info,
|
|
||||||
GimpDisplayShell *shell,
|
|
||||||
GdkModifierType state,
|
|
||||||
GdkEventMotion *mevent)
|
|
||||||
{
|
|
||||||
if (info->timeout_id)
|
|
||||||
return;
|
|
||||||
|
|
||||||
info->shell = shell;
|
|
||||||
info->mevent = mevent;
|
|
||||||
info->device = mevent->device;
|
|
||||||
info->time = gdk_event_get_time ((GdkEvent*) mevent);
|
|
||||||
info->state = state;
|
|
||||||
info->timeout_id = g_timeout_add (AUTOSCROLL_DT, autoscroll_timeout, info);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
end_autoscrolling (ScrollInfo *info)
|
|
||||||
{
|
|
||||||
if (info->timeout_id)
|
|
||||||
{
|
|
||||||
g_source_remove (info->timeout_id);
|
|
||||||
info->timeout_id = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
gboolean
|
gboolean
|
||||||
gimp_display_shell_canvas_tool_events (GtkWidget *canvas,
|
gimp_display_shell_canvas_tool_events (GtkWidget *canvas,
|
||||||
GdkEvent *event,
|
GdkEvent *event,
|
||||||
|
@ -559,7 +448,7 @@ gimp_display_shell_canvas_tool_events (GtkWidget *canvas,
|
||||||
guint32 time;
|
guint32 time;
|
||||||
gboolean return_val = FALSE;
|
gboolean return_val = FALSE;
|
||||||
gboolean update_cursor = FALSE;
|
gboolean update_cursor = FALSE;
|
||||||
static ScrollInfo scroll_info = { NULL, NULL, NULL, 0, 0,0 };
|
|
||||||
static GimpToolInfo *space_shaded_tool = NULL;
|
static GimpToolInfo *space_shaded_tool = NULL;
|
||||||
|
|
||||||
if (! canvas->window)
|
if (! canvas->window)
|
||||||
|
@ -869,7 +758,7 @@ gimp_display_shell_canvas_tool_events (GtkWidget *canvas,
|
||||||
{
|
{
|
||||||
GdkEventButton *bevent = (GdkEventButton *) event;
|
GdkEventButton *bevent = (GdkEventButton *) event;
|
||||||
|
|
||||||
end_autoscrolling (&scroll_info);
|
gimp_display_shell_autoscroll_stop (shell);
|
||||||
|
|
||||||
if (gimp->busy)
|
if (gimp->busy)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
@ -1137,7 +1026,7 @@ gimp_display_shell_canvas_tool_events (GtkWidget *canvas,
|
||||||
mevent->y > shell->disp_height) &&
|
mevent->y > shell->disp_height) &&
|
||||||
! gimp_tool_control_scroll_lock (active_tool->control))
|
! gimp_tool_control_scroll_lock (active_tool->control))
|
||||||
{
|
{
|
||||||
begin_autoscrolling (&scroll_info, shell, state, mevent);
|
gimp_display_shell_autoscroll_start (shell, state, mevent);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (gimp_tool_control_motion_mode (active_tool->control) ==
|
if (gimp_tool_control_motion_mode (active_tool->control) ==
|
||||||
|
@ -1625,156 +1514,6 @@ gimp_display_shell_hscrollbar_update (GtkAdjustment *adjustment,
|
||||||
gimp_display_shell_scroll (shell, (adjustment->value - shell->offset_x), 0);
|
gimp_display_shell_scroll (shell, (adjustment->value - shell->offset_x), 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
|
||||||
gimp_display_shell_get_event_coords (GimpDisplayShell *shell,
|
|
||||||
GdkEvent *event,
|
|
||||||
GdkDevice *device,
|
|
||||||
GimpCoords *coords)
|
|
||||||
{
|
|
||||||
if (gdk_event_get_axis (event, GDK_AXIS_X, &coords->x))
|
|
||||||
{
|
|
||||||
gdk_event_get_axis (event, GDK_AXIS_Y, &coords->y);
|
|
||||||
|
|
||||||
/* CLAMP() the return value of each *_get_axis() call to be safe
|
|
||||||
* against buggy XInput drivers. Provide default values if the
|
|
||||||
* requested axis does not exist.
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (gdk_event_get_axis (event, GDK_AXIS_PRESSURE, &coords->pressure))
|
|
||||||
coords->pressure = CLAMP (coords->pressure, GIMP_COORDS_MIN_PRESSURE,
|
|
||||||
GIMP_COORDS_MAX_PRESSURE);
|
|
||||||
else
|
|
||||||
coords->pressure = GIMP_COORDS_DEFAULT_PRESSURE;
|
|
||||||
|
|
||||||
if (gdk_event_get_axis (event, GDK_AXIS_XTILT, &coords->xtilt))
|
|
||||||
coords->xtilt = CLAMP (coords->xtilt, GIMP_COORDS_MIN_TILT,
|
|
||||||
GIMP_COORDS_MAX_TILT);
|
|
||||||
else
|
|
||||||
coords->xtilt = GIMP_COORDS_DEFAULT_TILT;
|
|
||||||
|
|
||||||
if (gdk_event_get_axis (event, GDK_AXIS_YTILT, &coords->ytilt))
|
|
||||||
coords->ytilt = CLAMP (coords->ytilt, GIMP_COORDS_MIN_TILT,
|
|
||||||
GIMP_COORDS_MAX_TILT);
|
|
||||||
else
|
|
||||||
coords->ytilt = GIMP_COORDS_DEFAULT_TILT;
|
|
||||||
|
|
||||||
if (gdk_event_get_axis (event, GDK_AXIS_WHEEL, &coords->wheel))
|
|
||||||
coords->wheel = CLAMP (coords->wheel, GIMP_COORDS_MIN_WHEEL,
|
|
||||||
GIMP_COORDS_MAX_WHEEL);
|
|
||||||
else
|
|
||||||
coords->wheel = GIMP_COORDS_DEFAULT_WHEEL;
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
gimp_display_shell_get_device_coords (shell, device, coords);
|
|
||||||
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
gimp_display_shell_get_device_coords (GimpDisplayShell *shell,
|
|
||||||
GdkDevice *device,
|
|
||||||
GimpCoords *coords)
|
|
||||||
{
|
|
||||||
gdouble axes[GDK_AXIS_LAST];
|
|
||||||
|
|
||||||
gdk_device_get_state (device, shell->canvas->window, axes, NULL);
|
|
||||||
|
|
||||||
gdk_device_get_axis (device, axes, GDK_AXIS_X, &coords->x);
|
|
||||||
gdk_device_get_axis (device, axes, GDK_AXIS_Y, &coords->y);
|
|
||||||
|
|
||||||
/* CLAMP() the return value of each *_get_axis() call to be safe
|
|
||||||
* against buggy XInput drivers. Provide default values if the
|
|
||||||
* requested axis does not exist.
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (gdk_device_get_axis (device, axes, GDK_AXIS_PRESSURE, &coords->pressure))
|
|
||||||
coords->pressure = CLAMP (coords->pressure, GIMP_COORDS_MIN_PRESSURE,
|
|
||||||
GIMP_COORDS_MAX_PRESSURE);
|
|
||||||
else
|
|
||||||
coords->pressure = GIMP_COORDS_DEFAULT_PRESSURE;
|
|
||||||
|
|
||||||
if (gdk_device_get_axis (device, axes, GDK_AXIS_XTILT, &coords->xtilt))
|
|
||||||
coords->xtilt = CLAMP (coords->xtilt, GIMP_COORDS_MIN_TILT,
|
|
||||||
GIMP_COORDS_MAX_TILT);
|
|
||||||
else
|
|
||||||
coords->xtilt = GIMP_COORDS_DEFAULT_TILT;
|
|
||||||
|
|
||||||
if (gdk_device_get_axis (device, axes, GDK_AXIS_YTILT, &coords->ytilt))
|
|
||||||
coords->ytilt = CLAMP (coords->ytilt, GIMP_COORDS_MIN_TILT,
|
|
||||||
GIMP_COORDS_MAX_TILT);
|
|
||||||
else
|
|
||||||
coords->ytilt = GIMP_COORDS_DEFAULT_TILT;
|
|
||||||
|
|
||||||
if (gdk_device_get_axis (device, axes, GDK_AXIS_WHEEL, &coords->wheel))
|
|
||||||
coords->wheel = CLAMP (coords->wheel, GIMP_COORDS_MIN_WHEEL,
|
|
||||||
GIMP_COORDS_MAX_WHEEL);
|
|
||||||
else
|
|
||||||
coords->wheel = GIMP_COORDS_DEFAULT_WHEEL;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
gimp_display_shell_get_time_coords (GimpDisplayShell *shell,
|
|
||||||
GdkDevice *device,
|
|
||||||
GdkTimeCoord *event,
|
|
||||||
GimpCoords *coords)
|
|
||||||
{
|
|
||||||
gdk_device_get_axis (device, event->axes, GDK_AXIS_X, &coords->x);
|
|
||||||
gdk_device_get_axis (device, event->axes, GDK_AXIS_Y, &coords->y);
|
|
||||||
|
|
||||||
/* CLAMP() the return value of each *_get_axis() call to be safe
|
|
||||||
* against buggy XInput drivers. Provide default values if the
|
|
||||||
* requested axis does not exist.
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (gdk_device_get_axis (device, event->axes, GDK_AXIS_PRESSURE, &coords->pressure))
|
|
||||||
coords->pressure = CLAMP (coords->pressure, GIMP_COORDS_MIN_PRESSURE,
|
|
||||||
GIMP_COORDS_MAX_PRESSURE);
|
|
||||||
else
|
|
||||||
coords->pressure = GIMP_COORDS_DEFAULT_PRESSURE;
|
|
||||||
|
|
||||||
if (gdk_device_get_axis (device, event->axes, GDK_AXIS_XTILT, &coords->xtilt))
|
|
||||||
coords->xtilt = CLAMP (coords->xtilt, GIMP_COORDS_MIN_TILT,
|
|
||||||
GIMP_COORDS_MAX_TILT);
|
|
||||||
else
|
|
||||||
coords->xtilt = GIMP_COORDS_DEFAULT_TILT;
|
|
||||||
|
|
||||||
if (gdk_device_get_axis (device, event->axes, GDK_AXIS_YTILT, &coords->ytilt))
|
|
||||||
coords->ytilt = CLAMP (coords->ytilt, GIMP_COORDS_MIN_TILT,
|
|
||||||
GIMP_COORDS_MAX_TILT);
|
|
||||||
else
|
|
||||||
coords->ytilt = GIMP_COORDS_DEFAULT_TILT;
|
|
||||||
|
|
||||||
if (gdk_device_get_axis (device, event->axes, GDK_AXIS_WHEEL, &coords->wheel))
|
|
||||||
coords->wheel = CLAMP (coords->wheel, GIMP_COORDS_MIN_WHEEL,
|
|
||||||
GIMP_COORDS_MAX_WHEEL);
|
|
||||||
else
|
|
||||||
coords->wheel = GIMP_COORDS_DEFAULT_WHEEL;
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
gimp_display_shell_get_event_state (GimpDisplayShell *shell,
|
|
||||||
GdkEvent *event,
|
|
||||||
GdkDevice *device,
|
|
||||||
GdkModifierType *state)
|
|
||||||
{
|
|
||||||
if (gdk_event_get_state (event, state))
|
|
||||||
return TRUE;
|
|
||||||
|
|
||||||
gimp_display_shell_get_device_state (shell, device, state);
|
|
||||||
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
gimp_display_shell_get_device_state (GimpDisplayShell *shell,
|
|
||||||
GdkDevice *device,
|
|
||||||
GdkModifierType *state)
|
|
||||||
{
|
|
||||||
gdk_device_get_state (device, shell->canvas->window, NULL, state);
|
|
||||||
}
|
|
||||||
|
|
||||||
static GdkModifierType
|
static GdkModifierType
|
||||||
gimp_display_shell_key_to_state (gint key)
|
gimp_display_shell_key_to_state (gint key)
|
||||||
{
|
{
|
||||||
|
|
|
@ -0,0 +1,179 @@
|
||||||
|
/* The GIMP -- an 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 2 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, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "config.h"
|
||||||
|
|
||||||
|
#include <gtk/gtk.h>
|
||||||
|
|
||||||
|
#include "display-types.h"
|
||||||
|
|
||||||
|
#include "gimpdisplayshell.h"
|
||||||
|
#include "gimpdisplayshell-coords.h"
|
||||||
|
|
||||||
|
|
||||||
|
/* public functions */
|
||||||
|
|
||||||
|
gboolean
|
||||||
|
gimp_display_shell_get_event_coords (GimpDisplayShell *shell,
|
||||||
|
GdkEvent *event,
|
||||||
|
GdkDevice *device,
|
||||||
|
GimpCoords *coords)
|
||||||
|
{
|
||||||
|
if (gdk_event_get_axis (event, GDK_AXIS_X, &coords->x))
|
||||||
|
{
|
||||||
|
gdk_event_get_axis (event, GDK_AXIS_Y, &coords->y);
|
||||||
|
|
||||||
|
/* CLAMP() the return value of each *_get_axis() call to be safe
|
||||||
|
* against buggy XInput drivers. Provide default values if the
|
||||||
|
* requested axis does not exist.
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (gdk_event_get_axis (event, GDK_AXIS_PRESSURE, &coords->pressure))
|
||||||
|
coords->pressure = CLAMP (coords->pressure, GIMP_COORDS_MIN_PRESSURE,
|
||||||
|
GIMP_COORDS_MAX_PRESSURE);
|
||||||
|
else
|
||||||
|
coords->pressure = GIMP_COORDS_DEFAULT_PRESSURE;
|
||||||
|
|
||||||
|
if (gdk_event_get_axis (event, GDK_AXIS_XTILT, &coords->xtilt))
|
||||||
|
coords->xtilt = CLAMP (coords->xtilt, GIMP_COORDS_MIN_TILT,
|
||||||
|
GIMP_COORDS_MAX_TILT);
|
||||||
|
else
|
||||||
|
coords->xtilt = GIMP_COORDS_DEFAULT_TILT;
|
||||||
|
|
||||||
|
if (gdk_event_get_axis (event, GDK_AXIS_YTILT, &coords->ytilt))
|
||||||
|
coords->ytilt = CLAMP (coords->ytilt, GIMP_COORDS_MIN_TILT,
|
||||||
|
GIMP_COORDS_MAX_TILT);
|
||||||
|
else
|
||||||
|
coords->ytilt = GIMP_COORDS_DEFAULT_TILT;
|
||||||
|
|
||||||
|
if (gdk_event_get_axis (event, GDK_AXIS_WHEEL, &coords->wheel))
|
||||||
|
coords->wheel = CLAMP (coords->wheel, GIMP_COORDS_MIN_WHEEL,
|
||||||
|
GIMP_COORDS_MAX_WHEEL);
|
||||||
|
else
|
||||||
|
coords->wheel = GIMP_COORDS_DEFAULT_WHEEL;
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
gimp_display_shell_get_device_coords (shell, device, coords);
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
gimp_display_shell_get_device_coords (GimpDisplayShell *shell,
|
||||||
|
GdkDevice *device,
|
||||||
|
GimpCoords *coords)
|
||||||
|
{
|
||||||
|
gdouble axes[GDK_AXIS_LAST];
|
||||||
|
|
||||||
|
gdk_device_get_state (device, shell->canvas->window, axes, NULL);
|
||||||
|
|
||||||
|
gdk_device_get_axis (device, axes, GDK_AXIS_X, &coords->x);
|
||||||
|
gdk_device_get_axis (device, axes, GDK_AXIS_Y, &coords->y);
|
||||||
|
|
||||||
|
/* CLAMP() the return value of each *_get_axis() call to be safe
|
||||||
|
* against buggy XInput drivers. Provide default values if the
|
||||||
|
* requested axis does not exist.
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (gdk_device_get_axis (device, axes, GDK_AXIS_PRESSURE, &coords->pressure))
|
||||||
|
coords->pressure = CLAMP (coords->pressure, GIMP_COORDS_MIN_PRESSURE,
|
||||||
|
GIMP_COORDS_MAX_PRESSURE);
|
||||||
|
else
|
||||||
|
coords->pressure = GIMP_COORDS_DEFAULT_PRESSURE;
|
||||||
|
|
||||||
|
if (gdk_device_get_axis (device, axes, GDK_AXIS_XTILT, &coords->xtilt))
|
||||||
|
coords->xtilt = CLAMP (coords->xtilt, GIMP_COORDS_MIN_TILT,
|
||||||
|
GIMP_COORDS_MAX_TILT);
|
||||||
|
else
|
||||||
|
coords->xtilt = GIMP_COORDS_DEFAULT_TILT;
|
||||||
|
|
||||||
|
if (gdk_device_get_axis (device, axes, GDK_AXIS_YTILT, &coords->ytilt))
|
||||||
|
coords->ytilt = CLAMP (coords->ytilt, GIMP_COORDS_MIN_TILT,
|
||||||
|
GIMP_COORDS_MAX_TILT);
|
||||||
|
else
|
||||||
|
coords->ytilt = GIMP_COORDS_DEFAULT_TILT;
|
||||||
|
|
||||||
|
if (gdk_device_get_axis (device, axes, GDK_AXIS_WHEEL, &coords->wheel))
|
||||||
|
coords->wheel = CLAMP (coords->wheel, GIMP_COORDS_MIN_WHEEL,
|
||||||
|
GIMP_COORDS_MAX_WHEEL);
|
||||||
|
else
|
||||||
|
coords->wheel = GIMP_COORDS_DEFAULT_WHEEL;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
gimp_display_shell_get_time_coords (GimpDisplayShell *shell,
|
||||||
|
GdkDevice *device,
|
||||||
|
GdkTimeCoord *event,
|
||||||
|
GimpCoords *coords)
|
||||||
|
{
|
||||||
|
gdk_device_get_axis (device, event->axes, GDK_AXIS_X, &coords->x);
|
||||||
|
gdk_device_get_axis (device, event->axes, GDK_AXIS_Y, &coords->y);
|
||||||
|
|
||||||
|
/* CLAMP() the return value of each *_get_axis() call to be safe
|
||||||
|
* against buggy XInput drivers. Provide default values if the
|
||||||
|
* requested axis does not exist.
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (gdk_device_get_axis (device, event->axes, GDK_AXIS_PRESSURE, &coords->pressure))
|
||||||
|
coords->pressure = CLAMP (coords->pressure, GIMP_COORDS_MIN_PRESSURE,
|
||||||
|
GIMP_COORDS_MAX_PRESSURE);
|
||||||
|
else
|
||||||
|
coords->pressure = GIMP_COORDS_DEFAULT_PRESSURE;
|
||||||
|
|
||||||
|
if (gdk_device_get_axis (device, event->axes, GDK_AXIS_XTILT, &coords->xtilt))
|
||||||
|
coords->xtilt = CLAMP (coords->xtilt, GIMP_COORDS_MIN_TILT,
|
||||||
|
GIMP_COORDS_MAX_TILT);
|
||||||
|
else
|
||||||
|
coords->xtilt = GIMP_COORDS_DEFAULT_TILT;
|
||||||
|
|
||||||
|
if (gdk_device_get_axis (device, event->axes, GDK_AXIS_YTILT, &coords->ytilt))
|
||||||
|
coords->ytilt = CLAMP (coords->ytilt, GIMP_COORDS_MIN_TILT,
|
||||||
|
GIMP_COORDS_MAX_TILT);
|
||||||
|
else
|
||||||
|
coords->ytilt = GIMP_COORDS_DEFAULT_TILT;
|
||||||
|
|
||||||
|
if (gdk_device_get_axis (device, event->axes, GDK_AXIS_WHEEL, &coords->wheel))
|
||||||
|
coords->wheel = CLAMP (coords->wheel, GIMP_COORDS_MIN_WHEEL,
|
||||||
|
GIMP_COORDS_MAX_WHEEL);
|
||||||
|
else
|
||||||
|
coords->wheel = GIMP_COORDS_DEFAULT_WHEEL;
|
||||||
|
}
|
||||||
|
|
||||||
|
gboolean
|
||||||
|
gimp_display_shell_get_event_state (GimpDisplayShell *shell,
|
||||||
|
GdkEvent *event,
|
||||||
|
GdkDevice *device,
|
||||||
|
GdkModifierType *state)
|
||||||
|
{
|
||||||
|
if (gdk_event_get_state (event, state))
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
gimp_display_shell_get_device_state (shell, device, state);
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
gimp_display_shell_get_device_state (GimpDisplayShell *shell,
|
||||||
|
GdkDevice *device,
|
||||||
|
GdkModifierType *state)
|
||||||
|
{
|
||||||
|
gdk_device_get_state (device, shell->canvas->window, NULL, state);
|
||||||
|
}
|
|
@ -0,0 +1,43 @@
|
||||||
|
/* The GIMP -- an 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 2 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, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __GIMP_DISPLAY_SHELL_COORDS_H__
|
||||||
|
#define __GIMP_DISPLAY_SHELL_COORDS_H__
|
||||||
|
|
||||||
|
|
||||||
|
gboolean gimp_display_shell_get_event_coords (GimpDisplayShell *shell,
|
||||||
|
GdkEvent *event,
|
||||||
|
GdkDevice *device,
|
||||||
|
GimpCoords *coords);
|
||||||
|
void gimp_display_shell_get_device_coords (GimpDisplayShell *shell,
|
||||||
|
GdkDevice *device,
|
||||||
|
GimpCoords *coords);
|
||||||
|
void gimp_display_shell_get_time_coords (GimpDisplayShell *shell,
|
||||||
|
GdkDevice *device,
|
||||||
|
GdkTimeCoord *event,
|
||||||
|
GimpCoords *coords);
|
||||||
|
gboolean gimp_display_shell_get_event_state (GimpDisplayShell *shell,
|
||||||
|
GdkEvent *event,
|
||||||
|
GdkDevice *device,
|
||||||
|
GdkModifierType *state);
|
||||||
|
void gimp_display_shell_get_device_state (GimpDisplayShell *shell,
|
||||||
|
GdkDevice *device,
|
||||||
|
GdkModifierType *state);
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* __GIMP_DISPLAY_SHELL_COORDS_H__ */
|
|
@ -168,6 +168,8 @@ struct _GimpDisplayShell
|
||||||
guint32 last_motion_time;
|
guint32 last_motion_time;
|
||||||
|
|
||||||
GdkRectangle *highlight; /* in image coordinates, can be NULL */
|
GdkRectangle *highlight; /* in image coordinates, can be NULL */
|
||||||
|
|
||||||
|
gpointer scroll_info;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct _GimpDisplayShellClass
|
struct _GimpDisplayShellClass
|
||||||
|
|
Loading…
Reference in New Issue