animation and event completion event handling

This commit is contained in:
Allen Webster 2016-05-03 15:33:22 -04:00
parent 653cc0bf23
commit 14e35d7eec
4 changed files with 33 additions and 27 deletions

View File

@ -3978,7 +3978,9 @@ App_Step_Sig(app_step){
if (panel == mouse_panel && !mouse->out_of_window){ if (panel == mouse_panel && !mouse->out_of_window){
input.mouse = mouse_state; input.mouse = mouse_state;
} }
do_input_file_view(system, exchange, view, panel->inner, active, &input); if (do_input_file_view(system, exchange, view, panel->inner, active, &input)){
app_result.animating = 1;
}
} }
} }

1
4ed.h
View File

@ -100,6 +100,7 @@ struct Application_Step_Result{
b32 lctrl_lalt_is_altgr; b32 lctrl_lalt_is_altgr;
b32 trying_to_kill; b32 trying_to_kill;
b32 perform_kill; b32 perform_kill;
b32 animating;
}; };
#define App_Step_Sig(name) void \ #define App_Step_Sig(name) void \

View File

@ -3457,9 +3457,9 @@ view_reinit_scrolling(View *view){
#define CursorMaxY(m,h) (CursorMaxY_(m,h) > 0)?(CursorMaxY_(m,h)):(0) #define CursorMaxY(m,h) (CursorMaxY_(m,h) > 0)?(CursorMaxY_(m,h)):(0)
#define CursorMinY(m,h) (CursorMinY_(m,h) > 0)?(CursorMinY_(m,h)):(0) #define CursorMinY(m,h) (CursorMinY_(m,h) > 0)?(CursorMinY_(m,h)):(0)
internal i32 internal b32
file_step(View *view, i32_Rect region, Input_Summary *user_input, b32 is_active){ file_step(View *view, i32_Rect region, Input_Summary *user_input, b32 is_active){
i32 result = 0; i32 is_animating = 0;
Editing_File *file = view->file; Editing_File *file = view->file;
if (file && !file->state.is_loading){ if (file && !file->state.is_loading){
// TODO(allen): rewrite with real scrolling system now. // TODO(allen): rewrite with real scrolling system now.
@ -3504,7 +3504,7 @@ file_step(View *view, i32_Rect region, Input_Summary *user_input, b32 is_active)
if (file->state.paste_effect.tick_down > 0){ if (file->state.paste_effect.tick_down > 0){
--file->state.paste_effect.tick_down; --file->state.paste_effect.tick_down;
result = 1; is_animating = 1;
} }
if (user_input->mouse.press_l && is_active){ if (user_input->mouse.press_l && is_active){
@ -3518,12 +3518,11 @@ file_step(View *view, i32_Rect region, Input_Summary *user_input, b32 is_active)
view->mode = {}; view->mode = {};
} }
} }
result = 1;
} }
if (!is_active) view_set_widget(view, FWIDG_NONE); if (!is_active) view_set_widget(view, FWIDG_NONE);
} }
return(result); return(is_animating);
} }
internal void internal void
@ -4270,11 +4269,11 @@ app_single_number_input_step(System_Functions *system, Key_Event_Data key, Strin
return result; return result;
} }
internal i32 internal b32
do_input_file_view(System_Functions *system, Exchange *exchange, do_input_file_view(System_Functions *system, Exchange *exchange,
View *view, i32_Rect rect, b32 is_active, Input_Summary *user_input){ View *view, i32_Rect rect, b32 is_active, Input_Summary *user_input){
i32 result = 0; b32 is_animating = 0;
b32 is_file_scroll = 0; b32 is_file_scroll = 0;
GUI_Session gui_session; GUI_Session gui_session;
@ -4304,7 +4303,7 @@ do_input_file_view(System_Functions *system, Exchange *exchange,
view_reinit_scrolling(view); view_reinit_scrolling(view);
} }
if (file_step(view, gui_session.rect, user_input, is_active)){ if (file_step(view, gui_session.rect, user_input, is_active)){
result = 1; is_animating = 1;
} }
is_file_scroll = 1; is_file_scroll = 1;
}break; }break;
@ -4325,7 +4324,6 @@ do_input_file_view(System_Functions *system, Exchange *exchange,
key = get_single_key(keys, i); key = get_single_key(keys, i);
step = app_single_line_input_step(system, key, string); step = app_single_line_input_step(system, key, string);
if ((step.hit_newline || step.hit_ctrl_newline) && !step.no_file_match){ if ((step.hit_newline || step.hit_ctrl_newline) && !step.no_file_match){
result = 1;
view->gui_target.active = e->id; view->gui_target.active = e->id;
} }
} }
@ -4348,7 +4346,6 @@ do_input_file_view(System_Functions *system, Exchange *exchange,
key = get_single_key(keys, i); key = get_single_key(keys, i);
step = app_single_file_input_step(system, working_set, key, &hdir->string, hdir, 1, 1, 0); step = app_single_file_input_step(system, working_set, key, &hdir->string, hdir, 1, 1, 0);
if ((step.hit_newline || step.hit_ctrl_newline) && !step.no_file_match){ if ((step.hit_newline || step.hit_ctrl_newline) && !step.no_file_match){
result = 1;
view->gui_target.active = e->id; view->gui_target.active = e->id;
} }
} }
@ -4540,7 +4537,7 @@ do_input_file_view(System_Functions *system, Exchange *exchange,
scroll_vars.target_x, scroll_vars.target_y, scroll_vars.target_x, scroll_vars.target_y,
&scroll_vars.scroll_x, &scroll_vars.scroll_y, &scroll_vars.scroll_x, &scroll_vars.scroll_y,
(view->id) + 1, is_new_target)){ (view->id) + 1, is_new_target)){
result = 1; is_animating = 1;
} }
scroll_vars.prev_target_x = scroll_vars.target_x; scroll_vars.prev_target_x = scroll_vars.target_x;
@ -4569,7 +4566,7 @@ do_input_file_view(System_Functions *system, Exchange *exchange,
} }
} }
return(result); return(is_animating);
} }
internal i32 internal i32

View File

@ -48,11 +48,12 @@
#define frame_useconds (1000000 / FPS) #define frame_useconds (1000000 / FPS)
// TODO(allen): Do we still need all of these? I've abandoned the // TODO(allen): Do we still need all of these? I've abandoned the
// main thread / update loop thread thing for a while at least. // main thread / update loop thread thing (at least for a while).
#define WM_4coder_LOAD_FONT (WM_USER + 1) #define WM_4coder_LOAD_FONT (WM_USER + 1)
#define WM_4coder_PAINT (WM_USER + 2) #define WM_4coder_PAINT (WM_USER + 2)
#define WM_4coder_SET_CURSOR (WM_USER + 3) #define WM_4coder_SET_CURSOR (WM_USER + 3)
#define WM_4coder_ANIMATE (WM_USER + 4) #define WM_4coder_ANIMATE (WM_USER + 4)
#define WM_4coder_EVENT_COMPLETE (WM_USER + 5)
struct Thread_Context{ struct Thread_Context{
u32 job_id; u32 job_id;
@ -649,7 +650,7 @@ Win32GenHandle(HANDLE h){
} }
internal DWORD WINAPI internal DWORD WINAPI
ThreadProc(LPVOID lpParameter){ JobThreadProc(LPVOID lpParameter){
Thread_Context *thread = (Thread_Context*)lpParameter; Thread_Context *thread = (Thread_Context*)lpParameter;
Work_Queue *queue = thread->queue; Work_Queue *queue = thread->queue;
@ -661,7 +662,7 @@ ThreadProc(LPVOID lpParameter){
u32 next_read_index = (read_index + 1) % JOB_ID_WRAP; u32 next_read_index = (read_index + 1) % JOB_ID_WRAP;
u32 safe_read_index = u32 safe_read_index =
InterlockedCompareExchange(&queue->read_position, InterlockedCompareExchange(&queue->read_position,
next_read_index, read_index); next_read_index, read_index);
if (safe_read_index == read_index){ if (safe_read_index == read_index){
Full_Job_Data *full_job = queue->jobs + (safe_read_index % QUEUE_WRAP); Full_Job_Data *full_job = queue->jobs + (safe_read_index % QUEUE_WRAP);
@ -671,7 +672,7 @@ ThreadProc(LPVOID lpParameter){
i32 safe_running_thread = i32 safe_running_thread =
InterlockedCompareExchange(&full_job->running_thread, InterlockedCompareExchange(&full_job->running_thread,
thread->id, THREAD_NOT_ASSIGNED); thread->id, THREAD_NOT_ASSIGNED);
if (safe_running_thread == THREAD_NOT_ASSIGNED){ if (safe_running_thread == THREAD_NOT_ASSIGNED){
thread->job_id = full_job->id; thread->job_id = full_job->id;
@ -691,7 +692,8 @@ ThreadProc(LPVOID lpParameter){
} }
} }
full_job->job.callback(win32vars.system, thread, thread_memory, full_job->job.callback(win32vars.system, thread, thread_memory,
&exchange_vars.thread, full_job->job.data); &exchange_vars.thread, full_job->job.data);
PostMessage(win32vars.window_handle, WM_4coder_EVENT_COMPLETE, 0, 0);
full_job->running_thread = 0; full_job->running_thread = 0;
thread->running = 0; thread->running = 0;
} }
@ -755,7 +757,7 @@ Sys_Cancel_Job_Sig(system_cancel_job){
thread = group->threads + thread_id - 1; thread = group->threads + thread_id - 1;
TerminateThread(thread->handle, 0); TerminateThread(thread->handle, 0);
u32 creation_flag = 0; u32 creation_flag = 0;
thread->handle = CreateThread(0, 0, ThreadProc, thread, creation_flag, (LPDWORD)&thread->windows_id); thread->handle = CreateThread(0, 0, JobThreadProc, thread, creation_flag, (LPDWORD)&thread->windows_id);
system_release_lock(CANCEL_LOCK0 + thread_id - 1); system_release_lock(CANCEL_LOCK0 + thread_id - 1);
thread->running = 0; thread->running = 0;
} }
@ -1597,6 +1599,7 @@ UpdateStep(){
else{ else{
file->flags |= FEx_Save_Failed; file->flags |= FEx_Save_Failed;
} }
PostMessage(0, WM_4coder_EVENT_COMPLETE, 0, 0);
} }
if (file->flags & FEx_Request){ if (file->flags & FEx_Request){
@ -1612,6 +1615,7 @@ UpdateStep(){
file->data = sysfile.data; file->data = sysfile.data;
file->size = sysfile.size; file->size = sysfile.size;
} }
PostMessage(0, WM_4coder_EVENT_COMPLETE, 0, 0);
} }
} }
@ -1648,7 +1652,9 @@ UpdateStep(){
system_acquire_lock(FRAME_LOCK); system_acquire_lock(FRAME_LOCK);
timer_start = system_time(); timer_start = system_time();
PostMessage(NULL, WM_4coder_ANIMATE, 0, 0); if (result.animating){
PostMessage(0, WM_4coder_ANIMATE, 0, 0);
}
} }
DWORD DWORD
@ -1841,7 +1847,7 @@ int main(int argc, char **argv){
memory->id = thread->id; memory->id = thread->id;
thread->queue = &exchange_vars.thread.queues[BACKGROUND_THREADS]; thread->queue = &exchange_vars.thread.queues[BACKGROUND_THREADS];
thread->handle = CreateThread(0, 0, ThreadProc, thread, creation_flag, (LPDWORD)&thread->windows_id); thread->handle = CreateThread(0, 0, JobThreadProc, thread, creation_flag, (LPDWORD)&thread->windows_id);
} }
Assert(win32vars.locks); Assert(win32vars.locks);