Fixed problems with the brush-cursor drawing code.

This commit is contained in:
David Capello 2008-01-13 20:49:02 +00:00
parent 8cc8d732e2
commit dfae80457b
14 changed files with 148 additions and 198 deletions

View File

@ -1,3 +1,9 @@
2008-01-13 David A. Capello <dacap@users.sourceforge.net>
* src/widgets/editor/cursor.c, src/widgets/editor/editor.c: Fixed
a lot of bugs in the code that draws/cleans the brush-cursor in
the editor.
2008-01-06 David A. Capello <dacap@users.sourceforge.net>
* src/jinete/jwidget.c (jwidget_free_deferred): Added.

View File

@ -1,5 +1,5 @@
# allegro-sprite-editor convolution matrices -*- Shell-script -*-
# Copyright (C) 2001-2005 by David A. Capello
# Copyright (C) 2001-2005, 2008 by David A. Capello
#
# Loader in "plug-ins/action/convmatr.c".
#

View File

@ -1,5 +1,5 @@
# Allegro Sprite Editor tips
# Copyright (C) 2001, 2002, 2003, 2004, 2005, 2007 David A. Capello
# Copyright (C) 2001, 2002, 2003, 2004, 2005, 2007, 2008 David A. Capello
**********************************************************************
\palette ase.pcx
@ -47,6 +47,8 @@ Right = go to next frame
Up = go to last frame
\done
Enter = play animation
**********************************************************************
You can add new animation frames pressing <Ctrl+Shift+N> or using
"Frame/New" menu.

View File

@ -1,4 +1,4 @@
# Copyright (C) 2001-2005, 2007 by David A. Capello -*-Makefile-*-
# Copyright (C) 2001-2005, 2007, 2008 by David A. Capello -*-Makefile-*-
.PHONY = _default
_default: default
@ -190,9 +190,13 @@ endif
TESTS = $(addsuffix $(EXE), \
$(basename \
$(wildcard src/test/convmatr/*.c) \
$(wildcard src/test/raster/*.c) \
$(wildcard src/test/jinete/*.c)))
src/test/convmatr/%$(EXE): src/test/convmatr/%.c $(COMMON_OBJS)
$(CC) $(CFLAGS) -o $@ $^ $(LFLAGS) $(LFLAGS_LAST)
src/test/raster/%$(EXE): src/test/raster/%.c $(COMMON_OBJS)
$(CC) $(CFLAGS) -o $@ $^ $(LFLAGS) $(LFLAGS_LAST)

View File

@ -545,15 +545,15 @@ bool jmanager_generate_messages(JWidget manager)
}
}
/* generate redraw events */
jwidget_flush_redraw(manager);
return !jlist_empty(msg_queue);
}
void jmanager_dispatch_messages(JWidget manager)
{
JMessage msg;
/* redraw dirty widgets */
jwidget_flush_redraw(manager);
/* add the "Queue Processing" message for the manager */
msg = new_mouse_msg(JM_QUEUEPROCESSING);
@ -1122,13 +1122,14 @@ static void dispatch_messages(JWidget widget_manager)
link = jlist_first(msg_queue);
while (link != msg_queue->end) {
msg = link->data;
#ifdef LIMIT_DISPATCH_TIME
if (ji_clock-t > 250)
break;
#endif
/* the message to process */
msg = link->data;
/* go to next message */
if (msg->any.used) {
link = link->next;

View File

@ -1409,6 +1409,10 @@ void jwidget_close_window(JWidget widget)
jwindow_close(window, widget);
}
/**
* Captures the mouse to send the future JM_BUTTONRELEASED messsage to
* the specified widget.
*/
void jwidget_capture_mouse(JWidget widget)
{
assert_valid_widget(widget);
@ -1421,6 +1425,10 @@ void jwidget_capture_mouse(JWidget widget)
}
}
/**
* Captures the mouse to send all the future mouse messsages to the
* specified widget.
*/
void jwidget_hard_capture_mouse(JWidget widget)
{
assert_valid_widget(widget);
@ -1436,6 +1444,9 @@ void jwidget_hard_capture_mouse(JWidget widget)
}
}
/**
* Releases the capture of the mouse events.
*/
void jwidget_release_mouse(JWidget widget)
{
assert_valid_widget(widget);

View File

@ -616,10 +616,15 @@ static void move_window(JWidget widget, JRect rect, bool use_blit)
JRegion new_drawable_region;
JRegion manager_refresh_region;
JRegion window_refresh_region;
JRect old_pos = jrect_new_copy(widget->rc);
JRect man_pos = jwidget_get_rect(jwidget_get_manager(widget));
JRect old_pos;
JRect man_pos;
JMessage msg;
jmanager_dispatch_messages(ji_get_default_manager());
old_pos = jrect_new_copy(widget->rc);
man_pos = jwidget_get_rect(jwidget_get_manager(widget));
msg = jmessage_new(JM_WINMOVE);
jmessage_broadcast_to_children(msg, widget);
jmanager_enqueue_message(msg);

View File

@ -1,5 +1,5 @@
/* ASE - Allegro Sprite Editor
* Copyright (C) 2001-2005, 2007 David A. Capello
* Copyright (C) 2001, 2002, 2003, 2004, 2005, 2007, 2008 David A. Capello
*
* 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

View File

@ -56,7 +56,6 @@
#define REBUILD_LOCK 1
#define REBUILD_ROOT_MENU 2
#define REBUILD_SPRITE_LIST 4
#define REBUILD_RECENT_LIST 8
#define REBUILD_FULLREFRESH 16
@ -78,6 +77,7 @@ static int try_depths[] = { 32, 24, 16, 15, 8 };
/**************************************************************/
static JWidget manager = NULL;
static bool ji_screen_created = FALSE;
static volatile int next_idle_flags = 0;
static JList icon_buttons;
@ -258,8 +258,10 @@ void exit_module_gui(void)
if (double_buffering) {
BITMAP *old_bmp = ji_screen;
ji_set_screen(screen);
if (old_bmp && old_bmp != screen)
if (ji_screen_created)
destroy_bitmap(old_bmp);
ji_screen_created = FALSE;
}
jlist_free(icon_buttons);
@ -344,15 +346,9 @@ void gui_feedback(void)
next_idle_flags ^= REBUILD_ROOT_MENU;
load_root_menu();
next_idle_flags |= REBUILD_SPRITE_LIST;
next_idle_flags |= REBUILD_RECENT_LIST;
}
if (next_idle_flags & REBUILD_SPRITE_LIST) {
next_idle_flags ^= REBUILD_SPRITE_LIST;
app_realloc_sprite_list();
}
if (next_idle_flags & REBUILD_RECENT_LIST) {
next_idle_flags ^= REBUILD_RECENT_LIST;
app_realloc_recent_list();
@ -403,11 +399,14 @@ void gui_setup_screen(void)
BITMAP *old_bmp = ji_screen;
ji_set_screen(create_bitmap(SCREEN_W / screen_scaling,
SCREEN_H / screen_scaling));
if (old_bmp && old_bmp != screen)
if (ji_screen_created)
destroy_bitmap(old_bmp);
ji_screen_created = TRUE;
}
else {
ji_set_screen(screen);
ji_screen_created = FALSE;
}
/* set the configuration */
@ -435,7 +434,7 @@ void reload_default_font(void)
dirs_add_path(dirs, default_font);
/* big font */
/* if (JI_SCREEN_W > 320) */
/* if (JI_SCREEN_W > 400) */
/* dirs_cat_dirs(dirs, filename_in_datadir("fonts/default2.pcx")); */
/* /\* tiny font *\/ */
/* else */
@ -546,7 +545,7 @@ void rebuild_root_menu(void)
void rebuild_sprite_list(void)
{
next_idle_flags |= REBUILD_SPRITE_LIST;
app_realloc_sprite_list();
}
void rebuild_recent_list(void)
@ -554,8 +553,6 @@ void rebuild_recent_list(void)
next_idle_flags |= REBUILD_RECENT_LIST;
}
/**********************************************************************/
/* hook signals */
@ -645,7 +642,6 @@ bool get_widgets(JWidget window, ...)
return TRUE;
}
/**********************************************************************/
/* Icon in buttons */
@ -683,7 +679,6 @@ static bool button_with_icon_msg_proc(JWidget widget, JMessage msg)
return FALSE;
}
/**********************************************************************/
/* Button style (convert radio or check buttons and draw it like
normal buttons) */
@ -707,65 +702,6 @@ JWidget check_button_new(const char *text, int b1, int b2, int b3, int b4)
return widget;
}
#if 0
static int button_style_type(void)
{
static int type = 0;
if (!type)
type = ji_register_widget_type();
return type;
}
static bool button_style_msg_proc(JWidget widget, JMessage msg)
{
JHook hook = (JHook)jwidget_get_data(widget, button_style_type());
switch (msg->type) {
case JM_DESTROY:
(*hook->msg_proc)(widget, msg);
jfree(hook);
break;
case JM_REQSIZE:
return (*hook->msg_proc)(widget, msg);
}
return FALSE;
}
void change_to_button_style(JWidget widget, int b1, int b2, int b3, int b4)
{
JWidget button = jbutton_new(NULL);
JHook hook = jwidget_get_hook(button, JI_BUTTON);
/* setup button bevel */
jbutton_set_bevel(button, b1, b2, b3, b4);
/* steal JI_BUTTON hook */
_jwidget_remove_hook(button, hook);
/* put the JI_BUTTON hook data in the widget (to get it with
jwidget_get_data) */
jwidget_add_hook(widget, JI_BUTTON, NULL, hook->data);
/* put a cusomized hook to filter only some messages to the real
JI_BUTTON hook msg_proc */
jwidget_add_hook(widget, button_style_type(), button_style_msg_proc, hook);
/* setup widget geometry */
widget->align = button->align;
widget->border_width = button->border_width;
widget->draw_method = button->draw_method;
/* jwidget_set_border(widget, 2, 2, 2, 2); */
/* the data will be free after */
jwidget_free(button);
}
#endif
/**********************************************************************/
/* manager event handler */
@ -820,7 +756,7 @@ static bool manager_msg_proc(JWidget widget, JMessage msg)
return FALSE;
}
/**********************************************************************/
/* graphics */

View File

@ -291,7 +291,7 @@ int get_thickness_for_cursor(void)
else
return brush->size;
}
/***********************************************************/
/* MARKER */
/***********************************************************/
@ -307,7 +307,7 @@ Tool ase_tool_marker =
TOOL_FIRST2LAST | TOOL_UPDATE_BOX,
NULL
};
/***********************************************************/
/* DOTS */
/***********************************************************/
@ -328,7 +328,7 @@ Tool ase_tool_dots =
TOOL_ACCUMULATE_DIRTY | TOOL_OLD2LAST | TOOL_UPDATE_POINT,
tool_dots_put
};
/***********************************************************/
/* PENCIL */
/***********************************************************/
@ -349,7 +349,7 @@ Tool ase_tool_pencil =
TOOL_ACCUMULATE_DIRTY | TOOL_OLD2LAST | TOOL_UPDATE_TRACE,
tool_pencil_put
};
/***********************************************************/
/* BRUSH */
/***********************************************************/
@ -365,7 +365,7 @@ Tool ase_tool_brush =
TOOL_ACCUMULATE_DIRTY | TOOL_FOURCHAIN | TOOL_UPDATE_LAST4,
NULL
};
/***********************************************************/
/* FLOODFILL */
/***********************************************************/
@ -399,7 +399,7 @@ Tool ase_tool_floodfill =
TOOL_ACCUMULATE_DIRTY | TOOL_OLD2LAST | TOOL_UPDATE_ALL,
tool_floodfill_put
};
/***********************************************************/
/* SPRAY */
/***********************************************************/
@ -463,7 +463,7 @@ Tool ase_tool_line =
TOOL_FIRST2LAST | TOOL_UPDATE_BOX | TOOL_EIGHT_ANGLES,
tool_line_put
};
/***********************************************************/
/* RECTANGLE */
/***********************************************************/
@ -542,7 +542,7 @@ Tool ase_tool_rectangle =
TOOL_FIRST2LAST | TOOL_UPDATE_BOX | TOOL_ACCEPT_FILL,
tool_rectangle_put
};
/***********************************************************/
/* ELLIPSE */
/***********************************************************/
@ -587,7 +587,7 @@ Tool ase_tool_ellipse =
TOOL_FIRST2LAST | TOOL_UPDATE_BOX | TOOL_ACCEPT_FILL,
tool_ellipse_put
};
/***********************************************************/
/* TOOL'S LIST */
/***********************************************************/
@ -605,7 +605,7 @@ Tool *ase_tools_list[] =
&ase_tool_ellipse,
NULL
};
/***********************************************************/
/* TOOL CONTROL */
/***********************************************************/
@ -642,7 +642,7 @@ static void marker_scroll_callback(int before_change)
rect_data = NULL;
}
}
/* controls any tool to draw in the current sprite */
void control_tool(JWidget widget, Tool *tool, const char *_color)
{
@ -1304,7 +1304,7 @@ static void fourchain_line(int x1, int y1, int x2, int y2, void *data)
else
dirty_line_brush(data, brush, x1, y1, x2, y2);
}
/**********************************************************************/
/* Opaque draw mode */
/**********************************************************************/
@ -1333,7 +1333,7 @@ static void my_image_hline1_opaque(int x1, int y, int x2, void *data)
{
memset(((ase_uint8 **)tool_image->line)[y]+x1, tool_color, x2-x1+1);
}
/**********************************************************************/
/* Glass draw mode */
/**********************************************************************/
@ -1390,7 +1390,7 @@ static void my_image_hline1_glass(int x1, int y, int x2, void *data)
address++;
}
}
/**********************************************************************/
/* Semi draw mode */
/**********************************************************************/

View File

@ -42,6 +42,10 @@ typedef struct Editor
int cursor_editor_x; /* position in the editor (model) */
int cursor_editor_y;
int old_cursor_thick;
int old_cursor_screen_x;
int old_cursor_screen_y;
/* for the mouse */
unsigned lagged_mouseenter : 1;

View File

@ -1,5 +1,5 @@
/* ASE - Allegro Sprite Editor
* Copyright (C) 2001-2005, 2007 David A. Capello
* Copyright (C) 2001-2005, 2007, 2008 David A. Capello
*
* 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
@ -20,6 +20,7 @@
#ifndef USE_PRECOMPILED_HEADER
#include <assert.h>
#include <allegro.h>
#include "jinete/jbase.h"
@ -68,19 +69,20 @@ static int cursor_negative;
static int saved_pixel[MAX_SAVED];
static int saved_pixel_n;
static JRegion limit_region;
static JRegion clipping_region;
static JRegion old_clipping_region;
static void generate_cursor_boundaries(void);
static void for_each_pixel_of_brush(Editor *editor, int x, int y, int color, void (*pixel) (BITMAP *bmp, int x, int y, int color));
static void for_each_pixel_of_brush(Editor *editor, int x, int y, int color, void (*pixel)(BITMAP *bmp, int x, int y, int color));
static void editor_cursor_cross(Editor *editor, int x, int y, int color, int thickness, void (*pixel) (BITMAP *bmp, int x, int y, int color));
static void editor_cursor_brush(Editor *editor, int x, int y, int color, void (*pixel) (BITMAP *bmp, int x, int y, int color));
static void editor_cursor_cross(Editor *editor, int x, int y, int color, int thickness, void (*pixel)(BITMAP *bmp, int x, int y, int color));
static void editor_cursor_brush(Editor *editor, int x, int y, int color, void (*pixel)(BITMAP *bmp, int x, int y, int color));
static void savepixel(BITMAP *bmp, int x, int y, int color);
static void drawpixel(BITMAP *bmp, int x, int y, int color);
static void cleanpixel(BITMAP *bmp, int x, int y, int color);
static int point_inside_region(int x, int y);
static int point_inside_region(int x, int y, JRegion region);
/**
* Draws the brush cursor inside the specified editor.
@ -99,8 +101,10 @@ void editor_draw_cursor(JWidget widget, int x, int y)
Editor *editor = editor_data(widget);
int color;
assert(editor->cursor_thick == 0);
/* get drawable region */
limit_region = jwidget_get_drawable_region(widget, JI_GDR_CUTTOPWINDOWS);
clipping_region = jwidget_get_drawable_region(widget, JI_GDR_CUTTOPWINDOWS);
/* get cursor color */
cursor_negative = is_cursor_mask();
@ -136,8 +140,10 @@ void editor_draw_cursor(JWidget widget, int x, int y)
/* save area and draw the cursor */
acquire_bitmap(ji_screen);
ji_screen->clip = FALSE;
for_each_pixel_of_brush(editor, x, y, color, savepixel);
for_each_pixel_of_brush(editor, x, y, color, drawpixel);
ji_screen->clip = TRUE;
release_bitmap(ji_screen);
/* cursor thickness */
@ -147,8 +153,8 @@ void editor_draw_cursor(JWidget widget, int x, int y)
editor->cursor_editor_x = x;
editor->cursor_editor_y = y;
jregion_free(limit_region);
limit_region = NULL;
/* save the clipping-region to know where to clean the pixels */
old_clipping_region = clipping_region;
}
/**
@ -169,20 +175,26 @@ void editor_clean_cursor(JWidget widget)
Editor *editor = editor_data(widget);
int x, y;
limit_region = jwidget_get_drawable_region(widget, JI_GDR_CUTTOPWINDOWS);
assert(editor->cursor_thick != 0);
clipping_region = jwidget_get_drawable_region(widget, JI_GDR_CUTTOPWINDOWS);
x = editor->cursor_editor_x;
y = editor->cursor_editor_y;
/* restore points */
acquire_bitmap(ji_screen);
ji_screen->clip = FALSE;
for_each_pixel_of_brush(editor, x, y, 0, cleanpixel);
ji_screen->clip = TRUE;
release_bitmap(ji_screen);
editor->cursor_thick = 0;
jregion_free(limit_region);
limit_region = NULL;
jregion_free(clipping_region);
jregion_free(old_clipping_region);
clipping_region = NULL;
old_clipping_region = NULL;
}
/**
@ -231,9 +243,9 @@ static void for_each_pixel_of_brush(Editor *editor, int x, int y, int color,
}
if (IS_SUBPIXEL(editor)) {
(*pixel) (ji_screen,
editor->cursor_screen_x,
editor->cursor_screen_y, color);
(*pixel)(ji_screen,
editor->cursor_screen_x,
editor->cursor_screen_y, color);
}
}
@ -265,7 +277,7 @@ static void editor_cursor_cross(Editor *editor, int x, int y, int color, int thi
v-((thickness>>1)<<editor->zoom)-3:
v-((thickness>>1)<<editor->zoom)-3+(thickness<<editor->zoom));
(*pixel) (ji_screen, xout, yout, color);
(*pixel)(ji_screen, xout, yout, color);
}
}
}
@ -320,13 +332,13 @@ static void editor_cursor_brush(Editor *editor, int x, int y, int color, void (*
static void savepixel(BITMAP *bmp, int x, int y, int color)
{
if (saved_pixel_n < MAX_SAVED && point_inside_region(x, y))
if (saved_pixel_n < MAX_SAVED && point_inside_region(x, y, clipping_region))
saved_pixel[saved_pixel_n++] = getpixel(bmp, x, y);
}
static void drawpixel(BITMAP *bmp, int x, int y, int color)
{
if (saved_pixel_n < MAX_SAVED && point_inside_region(x, y)) {
if (saved_pixel_n < MAX_SAVED && point_inside_region(x, y, clipping_region)) {
if (cursor_negative) {
int r, g, b, c = saved_pixel[saved_pixel_n++];
@ -344,12 +356,16 @@ static void drawpixel(BITMAP *bmp, int x, int y, int color)
static void cleanpixel(BITMAP *bmp, int x, int y, int color)
{
if (saved_pixel_n < MAX_SAVED && point_inside_region(x, y))
putpixel(bmp, x, y, saved_pixel[saved_pixel_n++]);
if (saved_pixel_n < MAX_SAVED) {
if (point_inside_region(x, y, clipping_region))
putpixel(bmp, x, y, saved_pixel[saved_pixel_n++]);
else if (point_inside_region(x, y, old_clipping_region))
saved_pixel[saved_pixel_n++];
}
}
static int point_inside_region(int x, int y)
static int point_inside_region(int x, int y, JRegion region)
{
struct jrect box;
return jregion_point_in(limit_region, x, y, &box);
return jregion_point_in(region, x, y, &box);
}

View File

@ -23,6 +23,7 @@
#ifndef USE_PRECOMPILED_HEADER
#include <stdio.h>
#include <allegro.h>
#include "jinete/jdraw.h"
@ -84,7 +85,7 @@ static bool editor_view_msg_proc (JWidget widget, JMessage msg);
static bool editor_msg_proc (JWidget widget, JMessage msg);
static void editor_request_size (JWidget widget, int *w, int *h);
JWidget editor_view_new (void)
JWidget editor_view_new(void)
{
JWidget widget = jview_new();
@ -103,6 +104,9 @@ JWidget editor_new(void)
editor->state = EDIT_STANDBY;
editor->mask_timer_id = jmanager_add_timer(widget, 100);
editor->cursor_thick = 0;
editor->old_cursor_thick = 0;
jwidget_add_hook(widget, editor_type(), editor_msg_proc, editor);
jwidget_focusrest(widget, TRUE);
@ -923,6 +927,7 @@ static bool editor_view_msg_proc(JWidget widget, JMessage msg)
jrect_free(pos);
}
return TRUE;
}
return FALSE;
}
@ -951,7 +956,16 @@ static bool editor_msg_proc(JWidget widget, JMessage msg)
jregion_free(editor->refresh_region);
break;
case JM_DRAW:
case JM_DRAW: {
if (editor->old_cursor_thick == 0) {
editor->old_cursor_thick = editor->cursor_thick;
editor->old_cursor_screen_x = editor->cursor_screen_x;
editor->old_cursor_screen_y = editor->cursor_screen_y;
}
if (editor->cursor_thick != 0)
editor_clean_cursor(widget);
/* without sprite */
if (!editor->sprite) {
JWidget view = jwidget_get_view(widget);
@ -979,7 +993,7 @@ static bool editor_msg_proc(JWidget widget, JMessage msg)
int x1, y1, x2, y2;
use_dither = get_config_bool("Options", "Dither", use_dither);
/* draw the background outside of image */
x1 = widget->rc->x1 + editor->offset_x;
y1 = widget->rc->y1 + editor->offset_y;
@ -1022,12 +1036,19 @@ static bool editor_msg_proc(JWidget widget, JMessage msg)
jmanager_stop_timer(editor->mask_timer_id);
}
if (editor->cursor_thick && !msg->draw.count) {
editor_draw_cursor(widget, editor->cursor_screen_x, editor->cursor_screen_y);
if (msg->draw.count == 0
&& editor->old_cursor_thick != 0) {
editor_draw_cursor(widget,
editor->old_cursor_screen_x,
editor->old_cursor_screen_y);
}
}
return TRUE;
if (msg->draw.count == 0)
editor->old_cursor_thick = 0;
return TRUE;
}
case JM_TIMER:
if (msg->timer.timer_id == editor->mask_timer_id &&
@ -1043,50 +1064,14 @@ static bool editor_msg_proc(JWidget widget, JMessage msg)
}
}
break;
#if 0
case JM_IDLE:
if (editor->sprite)
editor_draw_mask_safe(widget);
/* if (editor->sprite) { */
/* if (current_tool == &ase_tool_path) { */
/* if (editor->cursor_thick) { */
/* hide_drawing_cursor (widget); */
/* jmouse_set_cursor(JI_CURSOR_NORMAL); */
/* } */
/* } */
/* else { */
/* if (!editor->cursor_thick) { */
/* jmouse_set_cursor(JI_CURSOR_NULL); */
/* show_drawing_cursor (widget); */
/* } */
/* } */
/* } */
/* Redraw cursor when the user changes the brush size. */
if ((editor->cursor_thick) &&
(editor->cursor_thick != get_thickness_for_cursor())) {
editor_clean_cursor(widget);
editor_draw_cursor(widget, editor->cursor_screen_x, editor->cursor_screen_y);
}
/* if (editor->refresh_region) */
/* editor_refresh_region (widget); */
break;
#endif
case JM_MOUSEENTER:
if (jmanager_get_capture() &&
jmanager_get_capture() != widget) {
editor->lagged_mouseenter = TRUE;
break;
}
if (editor->state == EDIT_MOVING_SCROLL)
break;
if (editor->sprite)
if (editor->sprite) {
show_drawing_cursor(widget);
}
else {
hide_drawing_cursor(widget);
app_default_status_bar_message();
@ -1094,15 +1079,6 @@ static bool editor_msg_proc(JWidget widget, JMessage msg)
break;
case JM_MOUSELEAVE:
editor->lagged_mouseenter = FALSE;
if (jmanager_get_capture() &&
jmanager_get_capture() != widget)
break;
/* if (!editor->sprite) */
/* break; */
if (editor->state == EDIT_MOVING_SCROLL)
break;
@ -1116,12 +1092,6 @@ static bool editor_msg_proc(JWidget widget, JMessage msg)
if (!editor->sprite)
break;
/* lagged MOUSEENTER event */
if (editor->lagged_mouseenter) {
editor->lagged_mouseenter = FALSE;
show_drawing_cursor(widget);
}
/* move the scroll */
if ((msg->mouse.left && has_only_shifts(msg, KB_SHIFT_FLAG)) ||
(msg->mouse.middle && has_only_shifts(msg, 0))) {
@ -1156,12 +1126,6 @@ static bool editor_msg_proc(JWidget widget, JMessage msg)
if (!editor->sprite)
break;
/* lagged MOUSEENTER event */
if (editor->lagged_mouseenter) {
editor->lagged_mouseenter = FALSE;
show_drawing_cursor(widget);
}
/* move the scroll */
if (editor->state == EDIT_MOVING_SCROLL) {
JWidget view = jwidget_get_view(widget);
@ -1194,19 +1158,15 @@ static bool editor_msg_proc(JWidget widget, JMessage msg)
if (editor->cursor_thick) {
int x, y;
/* Get the pixel position corresponding to the mouse
position. */
/* screen_to_editor(widget, jmouse_x(0), jmouse_y(0), &x, &y); */
x = jmouse_x(0);
y = jmouse_y(0);
x = msg->mouse.x;
y = msg->mouse.y;
/* Redraw it only when the mouse change to other pixel (not
when the mouse moves only). */
/* if ((editor->cursor_x != x) || (editor->cursor_y != y)) { */
if ((editor->cursor_screen_x != x) || (editor->cursor_screen_y != y)) {
jmouse_hide();
editor_clean_cursor(widget);
editor_draw_cursor(widget, jmouse_x(0), jmouse_y(0));
editor_draw_cursor(widget, x, y);
jmouse_show();
}
}
@ -1225,7 +1185,7 @@ static bool editor_msg_proc(JWidget widget, JMessage msg)
return TRUE;
}
case JM_BUTTONRELEASED: {
case JM_BUTTONRELEASED:
if (!editor->sprite)
break;
@ -1235,11 +1195,12 @@ static bool editor_msg_proc(JWidget widget, JMessage msg)
/* change mouse cursor */
jmouse_set_cursor(JI_CURSOR_NORMAL);
}
editor->state = EDIT_STANDBY;
jwidget_release_mouse(widget);
show_drawing_cursor(widget);
return TRUE;
}
case JM_CHAR:
if (!editor_keys_toset_zoom(widget, msg->key.scancode) &&
@ -1326,6 +1287,7 @@ static bool editor_msg_proc(JWidget widget, JMessage msg)
}
}
break;
}
return FALSE;

View File

@ -67,6 +67,7 @@ int editor_keys_toset_zoom(JWidget widget, int scancode)
/* zoom */
if (zoom >= 0) {
hide_drawing_cursor(widget);
screen_to_editor(widget, jmouse_x(0), jmouse_y(0), &x, &y);
x = editor->offset_x - jrect_w(vp)/2 + ((1<<zoom)>>1) + (x << zoom);
@ -84,7 +85,9 @@ int editor_keys_toset_zoom(JWidget widget, int scancode)
jmouse_set_position((vp->x1+vp->x2)/2, (vp->y1+vp->y2)/2);
jrect_free(vp);
return TRUE;
show_drawing_cursor(widget);
return TRUE;
}
}