Drag and drop files: more stable. Unfinished
git-svn-id: svn://pulkomandy.tk/GrafX2/trunk@1570 416bcca6-2ee7-4201-b75f-2eb2f807beb1
This commit is contained in:
parent
cd39485232
commit
c83cd8c339
45
src/engine.c
45
src/engine.c
@ -41,6 +41,7 @@
|
||||
#include "pages.h"
|
||||
#include "layers.h"
|
||||
#include "factory.h"
|
||||
#include "loadsave.h"
|
||||
|
||||
|
||||
// we need this as global
|
||||
@ -658,6 +659,39 @@ void Main_handler(void)
|
||||
Display_all_screen();
|
||||
Display_cursor();
|
||||
}
|
||||
else if (Drop_file_name)
|
||||
{
|
||||
// A file was dragged into Grafx2's window
|
||||
Upload_infos_page_main(Main_backups->Pages);
|
||||
|
||||
if ( (!Main_image_is_modified) || Confirmation_box("Discard unsaved changes ?") )
|
||||
{
|
||||
T_IO_Context context;
|
||||
char* flimit;
|
||||
byte old_cursor_shape;
|
||||
|
||||
flimit = Find_last_slash(Drop_file_name);
|
||||
*(flimit++) = '\0';
|
||||
|
||||
Hide_cursor();
|
||||
old_cursor_shape=Cursor_shape;
|
||||
Cursor_shape=CURSOR_SHAPE_HOURGLASS;
|
||||
Display_cursor();
|
||||
|
||||
Init_context_layered_image(&context, flimit, Drop_file_name);
|
||||
Load_image(&context);
|
||||
Destroy_context(&context);
|
||||
Redraw_layered_image();
|
||||
Hide_cursor();
|
||||
Cursor_shape=old_cursor_shape;
|
||||
Display_cursor();
|
||||
End_of_modification();
|
||||
Display_all_screen();
|
||||
|
||||
free(Drop_file_name);
|
||||
Drop_file_name=NULL;
|
||||
}
|
||||
}
|
||||
|
||||
if(Get_input())
|
||||
{
|
||||
@ -2750,6 +2784,7 @@ short Window_get_clicked_button(void)
|
||||
Display_cursor();
|
||||
Delay_with_active_mouse((Mouse_K==1)? Config.Delay_left_click_on_slider : Config.Delay_right_click_on_slider);
|
||||
Hide_cursor();
|
||||
Need_timer_for_tool=1;
|
||||
Window_unselect_normal_button(temp1->Pos_X,temp1->Pos_Y,temp1->Width,temp1->Height);
|
||||
Display_cursor();
|
||||
return temp1->Number;
|
||||
@ -3296,15 +3331,13 @@ void Delay_with_active_mouse(int speed)
|
||||
Uint32 end;
|
||||
end = SDL_GetTicks()+speed*10;
|
||||
|
||||
//Need_Timer_events=1;
|
||||
//Activate_timer(10);
|
||||
Need_timer_for_tool=1;
|
||||
do
|
||||
{
|
||||
Get_input();
|
||||
now = SDL_GetTicks();
|
||||
} while (now<end);
|
||||
//Need_Timer_events=0;
|
||||
//Disable_timer();
|
||||
Need_timer_for_tool=0;
|
||||
}
|
||||
|
||||
// ======== Timer stuff =========
|
||||
@ -3320,9 +3353,9 @@ static SDL_TimerID Current_timer=NULL;
|
||||
/// It is designed especially to "wake" grafx2 in some situations where
|
||||
/// an animation or something is running, even if the mouse and keyboard
|
||||
/// are untouched.
|
||||
Uint32 Push_timer_event(Uint32 i, void* p)
|
||||
Uint32 Push_timer_event(Uint32 i, __attribute__((unused)) void* p)
|
||||
{
|
||||
//if (Need_Timer_events)
|
||||
if (Need_timer_for_tool || Need_timer_for_cursor)
|
||||
{
|
||||
SDL_Event event;
|
||||
SDL_UserEvent user_event;
|
||||
|
||||
65
src/input.c
65
src/input.c
@ -51,7 +51,10 @@ int Snap_axis = 0;
|
||||
int Snap_axis_origin_X;
|
||||
int Snap_axis_origin_Y;
|
||||
|
||||
volatile int Need_Timer_events;
|
||||
volatile int Need_timer_for_tool;
|
||||
volatile int Need_timer_for_cursor;
|
||||
|
||||
char * Drop_file_name = NULL;
|
||||
|
||||
// --
|
||||
|
||||
@ -229,7 +232,11 @@ int Move_cursor_with_constraints()
|
||||
feedback=1;
|
||||
|
||||
if (Input_new_mouse_K == 0)
|
||||
{
|
||||
Input_sticky_control = 0;
|
||||
Need_timer_for_tool=0;
|
||||
Need_timer_for_cursor=0;
|
||||
}
|
||||
}
|
||||
// Hide cursor, because even just a click change needs it
|
||||
if (!Mouse_moved)
|
||||
@ -753,26 +760,43 @@ int Get_input(void)
|
||||
|
||||
case SDL_SYSWMEVENT:
|
||||
#ifdef __WIN32__
|
||||
if(event.syswm.msg->msg == WM_DROPFILES) {
|
||||
int fileCount;
|
||||
if(event.syswm.msg->msg == WM_DROPFILES)
|
||||
{
|
||||
int file_count;
|
||||
HDROP hdrop = (HDROP)(event.syswm.msg->wParam);
|
||||
if((fileCount = DragQueryFile(hdrop,(UINT)-1,(LPTSTR) NULL ,(UINT) 0)) > 0) {
|
||||
char buf[MAX_PATH];
|
||||
T_IO_Context context;
|
||||
char* flimit;
|
||||
|
||||
DragQueryFile(hdrop,0 ,(LPTSTR) buf ,(UINT) MAX_PATH);
|
||||
flimit = Find_last_slash(buf);
|
||||
*(flimit++) = '\0';
|
||||
|
||||
// TODO : check if there are unsaved changes first !
|
||||
|
||||
Init_context_layered_image(&context, flimit, buf);
|
||||
Load_image(&context);
|
||||
Destroy_context(&context);
|
||||
Redraw_layered_image();
|
||||
End_of_modification();
|
||||
Display_all_screen();
|
||||
if((file_count = DragQueryFile(hdrop,(UINT)-1,(LPTSTR) NULL ,(UINT) 0)) > 0)
|
||||
{
|
||||
long len;
|
||||
// Query filename length
|
||||
len = DragQueryFile(hdrop,0 ,NULL ,0);
|
||||
if (len)
|
||||
{
|
||||
Drop_file_name=calloc(len+1,1);
|
||||
if (Drop_file_name)
|
||||
{
|
||||
if (DragQueryFile(hdrop,0 ,(LPTSTR) Drop_file_name ,(UINT) MAX_PATH))
|
||||
{
|
||||
// Success
|
||||
}
|
||||
else
|
||||
{
|
||||
free(Drop_file_name);
|
||||
// Don't report name copy error
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// Don't report alloc error (for a file name? :/ )
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// Don't report weird Windows error
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// Drop of zero files. Thanks for the information, Bill.
|
||||
}
|
||||
}
|
||||
#endif
|
||||
@ -798,6 +822,7 @@ int Get_input(void)
|
||||
Directional_left||Directional_up_left))
|
||||
{
|
||||
Directional_delay=-1;
|
||||
Need_timer_for_cursor=1;
|
||||
Directional_last_move=SDL_GetTicks();
|
||||
}
|
||||
else
|
||||
|
||||
16
src/input.h
16
src/input.h
@ -60,5 +60,17 @@ extern int Snap_axis_origin_X;
|
||||
/// For the :Snap_axis mode, sets the origin's point (in image coordinates)
|
||||
extern int Snap_axis_origin_Y;
|
||||
|
||||
/// Boolean, true if Push_timer_event() should put "ticks" in the SDL queue
|
||||
extern volatile int Need_Timer_events;
|
||||
///
|
||||
/// Boolean, true if the timer should put "ticks" in the SDL queue.
|
||||
/// This one flag is for tools (airbrush) or windows (repeatable button) that require it.
|
||||
extern volatile int Need_timer_for_tool;
|
||||
///
|
||||
/// Boolean, true if the timer should put "ticks" in the SDL queue.
|
||||
/// This one flag is for the mouse emulation, by keyboard/joystick.
|
||||
extern volatile int Need_timer_for_cursor;
|
||||
|
||||
///
|
||||
/// This malloced string is set when a drag-and-drop event
|
||||
/// brings a file to Grafx2's window.
|
||||
extern char * Drop_file_name;
|
||||
|
||||
@ -1908,8 +1908,7 @@ void Airbrush_1_0(void)
|
||||
Backup();
|
||||
Shade_table=Shade_table_left;
|
||||
|
||||
//Need_Timer_events=1;
|
||||
//Activate_timer(10);
|
||||
Need_timer_for_tool=1;
|
||||
if (SDL_GetTicks()>Airbrush_next_time)
|
||||
{
|
||||
Airbrush(LEFT_SIDE);
|
||||
@ -1935,8 +1934,7 @@ void Airbrush_2_0(void)
|
||||
Init_start_operation();
|
||||
Backup();
|
||||
Shade_table=Shade_table_right;
|
||||
//Need_Timer_events=1;
|
||||
//Activate_timer(10);
|
||||
Need_timer_for_tool=1;
|
||||
if (SDL_GetTicks()>Airbrush_next_time)
|
||||
{
|
||||
Airbrush(RIGHT_SIDE);
|
||||
@ -1993,8 +1991,7 @@ void Airbrush_0_2(void)
|
||||
//
|
||||
{
|
||||
Operation_stack_size-=2;
|
||||
//Need_Timer_events=0;
|
||||
//Disable_timer();
|
||||
//Need_timer_for_tool=0; // Not needed, mouse release did it in Get_input()
|
||||
End_of_modification();
|
||||
}
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user