diff --git a/4coder_API.html b/4coder_API.html
index a4c1fb81..30cc577d 100644
--- a/4coder_API.html
+++ b/4coder_API.html
@@ -91,6 +91,7 @@ Coming Soon
void app->toggle_fullscreen(
Application_Links *app
)
+No documentation generated for this function, assume it is non-public.
§3.3.59: is_fullscreen
bool32 app->is_fullscreen(
Application_Links *app
)
+No documentation generated for this function, assume it is non-public.
+
+
+
§3.3.60: send_exit_signal
+
void app->send_exit_signal(
+
Application_Links *app
)
+
+No documentation generated for this function, assume it is non-public.
§3.4 Type Descriptions
§4 String Library
diff --git a/4coder_custom_api.h b/4coder_custom_api.h
index 24395718..b5a51bea 100644
--- a/4coder_custom_api.h
+++ b/4coder_custom_api.h
@@ -57,6 +57,7 @@
#define SHOW_MOUSE_CURSOR_SIG(n) void n(Application_Links *app, Mouse_Cursor_Show_Type show)
#define TOGGLE_FULLSCREEN_SIG(n) void n(Application_Links *app)
#define IS_FULLSCREEN_SIG(n) bool32 n(Application_Links *app)
+#define SEND_EXIT_SIGNAL_SIG(n) void n(Application_Links *app)
typedef EXEC_COMMAND_SIG(Exec_Command_Function);
typedef EXEC_SYSTEM_COMMAND_SIG(Exec_System_Command_Function);
typedef CLIPBOARD_POST_SIG(Clipboard_Post_Function);
@@ -116,6 +117,7 @@ typedef GET_4ED_PATH_SIG(Get_4ed_Path_Function);
typedef SHOW_MOUSE_CURSOR_SIG(Show_Mouse_Cursor_Function);
typedef TOGGLE_FULLSCREEN_SIG(Toggle_Fullscreen_Function);
typedef IS_FULLSCREEN_SIG(Is_Fullscreen_Function);
+typedef SEND_EXIT_SIGNAL_SIG(Send_Exit_Signal_Function);
struct Application_Links{
void *memory;
int32_t memory_size;
@@ -178,6 +180,7 @@ struct Application_Links{
Show_Mouse_Cursor_Function *show_mouse_cursor;
Toggle_Fullscreen_Function *toggle_fullscreen;
Is_Fullscreen_Function *is_fullscreen;
+ Send_Exit_Signal_Function *send_exit_signal;
void *cmd_context;
void *system_links;
void *current_coroutine;
@@ -242,4 +245,5 @@ app_links->directory_cd = Directory_CD;\
app_links->get_4ed_path = Get_4ed_Path;\
app_links->show_mouse_cursor = Show_Mouse_Cursor;\
app_links->toggle_fullscreen = Toggle_Fullscreen;\
-app_links->is_fullscreen = Is_Fullscreen; } while(false)
+app_links->is_fullscreen = Is_Fullscreen;\
+app_links->send_exit_signal = Send_Exit_Signal; } while(false)
diff --git a/4coder_default_bindings.cpp b/4coder_default_bindings.cpp
index c051daaf..ba64d32f 100644
--- a/4coder_default_bindings.cpp
+++ b/4coder_default_bindings.cpp
@@ -277,6 +277,7 @@ default_keys(Bind_Helper *context){
bind(context, key_f2, MDFR_NONE, toggle_mouse);
bind(context, key_page_up, MDFR_CTRL, toggle_fullscreen);
+ bind(context, key_f4, MDFR_ALT, exit_4coder);
end_map(context);
diff --git a/4coder_default_include.cpp b/4coder_default_include.cpp
index 583ec128..dff873d4 100644
--- a/4coder_default_include.cpp
+++ b/4coder_default_include.cpp
@@ -2108,6 +2108,10 @@ CUSTOM_COMMAND_SIG(eol_nixify){
app->buffer_set_setting(app, &buffer, BufferSetting_Eol, false);
}
+CUSTOM_COMMAND_SIG(exit_4coder){
+ app->send_exit_signal(app);
+}
+
//
// "Full Search" Based Commands
diff --git a/4coder_jump_parsing.cpp b/4coder_jump_parsing.cpp
index efed7c8a..3be9f794 100644
--- a/4coder_jump_parsing.cpp
+++ b/4coder_jump_parsing.cpp
@@ -399,35 +399,35 @@ seek_error(Application_Links *app,
}
-CUSTOM_COMMAND_SIG(goto_next_error){
+CUSTOM_COMMAND_SIG(goto_next_jump){
int32_t skip_repeats = true;
int32_t skip_sub_errors = true;
int32_t dir = 1;
seek_error(app, &global_part, skip_repeats, skip_sub_errors, dir);
}
-CUSTOM_COMMAND_SIG(goto_prev_error){
+CUSTOM_COMMAND_SIG(goto_prev_jump){
int32_t skip_repeats = true;
int32_t skip_sub_errors = true;
int32_t dir = -1;
seek_error(app, &global_part, skip_repeats, skip_sub_errors, dir);
}
-CUSTOM_COMMAND_SIG(goto_next_error_no_skips){
+CUSTOM_COMMAND_SIG(goto_next_jump_no_skips){
int32_t skip_repeats = false;
int32_t skip_sub_errors = true;
int32_t dir = 1;
seek_error(app, &global_part, skip_repeats, skip_sub_errors, dir);
}
-CUSTOM_COMMAND_SIG(goto_prev_error_no_skips){
+CUSTOM_COMMAND_SIG(goto_prev_jump_no_skips){
int32_t skip_repeats = false;
int32_t skip_sub_errors = true;
int32_t dir = -1;
seek_error(app, &global_part, skip_repeats, skip_sub_errors, dir);
}
-CUSTOM_COMMAND_SIG(goto_first_error){
+CUSTOM_COMMAND_SIG(goto_first_jump){
Temp_Memory temp = begin_temp_memory(&global_part);
View_Summary view = get_view_for_locked_jump_buffer(app);
@@ -440,5 +440,10 @@ CUSTOM_COMMAND_SIG(goto_first_error){
end_temp_memory(temp);
}
+#define goto_next_error goto_next_jump
+#define goto_prev_error goto_prev_jump
+#define goto_next_error_no_skips goto_next_jump_no_skips
+#define goto_first_error goto_first_jump
+
#endif
diff --git a/4ed_api_implementation.cpp b/4ed_api_implementation.cpp
index 2a6aef4c..244d6f73 100644
--- a/4ed_api_implementation.cpp
+++ b/4ed_api_implementation.cpp
@@ -2053,6 +2053,7 @@ directories controlled on the custom side.
#define Toggle_Fullscreen system->toggle_fullscreen
#define Is_Fullscreen system->is_fullscreen
+#define Send_Exit_Signal system->send_exit_signal
API_EXPORT File_List
Get_File_List(Application_Links *app, char *dir, int32_t len)/*
diff --git a/4ed_os_custom_api.h b/4ed_os_custom_api.h
index 3020ee3d..ff8ef555 100644
--- a/4ed_os_custom_api.h
+++ b/4ed_os_custom_api.h
@@ -7,6 +7,7 @@
#define SHOW_MOUSE_CURSOR_SIG(n) void n(Application_Links *app, Mouse_Cursor_Show_Type show)
#define TOGGLE_FULLSCREEN_SIG(n) void n(Application_Links *app)
#define IS_FULLSCREEN_SIG(n) bool32 n(Application_Links *app)
+#define SEND_EXIT_SIGNAL_SIG(n) void n(Application_Links *app)
typedef MEMORY_ALLOCATE_SIG(Memory_Allocate_Function);
typedef MEMORY_SET_PROTECTION_SIG(Memory_Set_Protection_Function);
typedef MEMORY_FREE_SIG(Memory_Free_Function);
@@ -16,3 +17,4 @@ typedef GET_4ED_PATH_SIG(Get_4ed_Path_Function);
typedef SHOW_MOUSE_CURSOR_SIG(Show_Mouse_Cursor_Function);
typedef TOGGLE_FULLSCREEN_SIG(Toggle_Fullscreen_Function);
typedef IS_FULLSCREEN_SIG(Is_Fullscreen_Function);
+typedef SEND_EXIT_SIGNAL_SIG(Send_Exit_Signal_Function);
diff --git a/4ed_system.h b/4ed_system.h
index 70c9cf3e..9602f22b 100644
--- a/4ed_system.h
+++ b/4ed_system.h
@@ -237,6 +237,7 @@ struct System_Functions{
Show_Mouse_Cursor_Function *show_mouse_cursor;
Toggle_Fullscreen_Function *toggle_fullscreen;
Is_Fullscreen_Function *is_fullscreen;
+ Send_Exit_Signal_Function *send_exit_signal;
// clipboard: 1
System_Post_Clipboard *post_clipboard;
diff --git a/TODO.txt b/TODO.txt
index d1fd15bf..aa4940a8 100644
--- a/TODO.txt
+++ b/TODO.txt
@@ -86,6 +86,7 @@
; [X] flag in create buffer to prevent making new files
; [X] locking to a view for next position jumping
; [X] break down the build system and get away from the preproc hack
+; [X] exit command
; [X] full screen option
; [X] add to APIs
; [] try to make win32 version better
@@ -101,7 +102,6 @@
; [] user file bar string
; [] mouse down/up distinction
; [] hook on exit
-; [] exit command
; [] read only files
;
diff --git a/build.c b/build.c
index 4594ccec..ab7c51e9 100644
--- a/build.c
+++ b/build.c
@@ -305,7 +305,7 @@ standard_build(char *cdir, uint32_t flags){
}
#endif
-#if 0
+#if 1
{
BEGIN_TIME_SECTION();
build(OPTS | INCLUDES | SHARED_CODE | flags, cdir, "4ed_app_target.cpp",
diff --git a/win32_4ed.cpp b/win32_4ed.cpp
index beacb76a..7e788e45 100644
--- a/win32_4ed.cpp
+++ b/win32_4ed.cpp
@@ -125,11 +125,7 @@ struct Win32_Input_Chunk_Transient{
i8 mouse_wheel;
b8 trying_to_kill;
};
-inline Win32_Input_Chunk_Transient
-win32_input_chunk_transient_zero(){
- Win32_Input_Chunk_Transient result = {0};
- return(result);
-}
+static Win32_Input_Chunk_Transient null_input_chunk_transient = {0};
struct Win32_Input_Chunk_Persistent{
i32 mouse_x, mouse_y;
@@ -197,6 +193,10 @@ typedef struct Win32_Vars{
b32 lctrl_lalt_is_altgr;
b32 got_useful_event;
+ b32 full_screen;
+ b32 do_toggle;
+ WINDOWPLACEMENT GlobalWindowPosition;
+ b32 send_exit_signal;
HCURSOR cursor_ibeam;
HCURSOR cursor_arrow;
@@ -907,7 +907,7 @@ win32_init_drive_strings(Drive_Strings *dstrings){
// a little ground on always recognizing files as equivalent in exchange
// for the ability to handle them very quickly when nothing strange is
// going on.
-static int32_t
+internal int32_t
win32_canonical_ansi_name(Drive_Strings *dstrings, char *src, i32 len, char *dst, i32 max){
char *wrt = dst;
char *wrt_stop = dst + max;
@@ -1113,18 +1113,13 @@ for fullscreen toggling, see:
http://blogs.msdn.com/b/oldnewthing/archive/2010/04/12/9994016.aspx
*/
-// TODO(allen): Move these into win32vars
-static b32 full_screen = 0;
-static b32 do_toggle = 0;
-static WINDOWPLACEMENT GlobalWindowPosition = {sizeof(GlobalWindowPosition)};
-
internal void
Win32ToggleFullscreen(void){
HWND Window = win32vars.window_handle;
LONG_PTR Style = GetWindowLongPtr(Window, GWL_STYLE);
if (Style & WS_OVERLAPPEDWINDOW){
MONITORINFO MonitorInfo = {sizeof(MonitorInfo)};
- if(GetWindowPlacement(Window, &GlobalWindowPosition) &&
+ if(GetWindowPlacement(Window, &win32vars.GlobalWindowPosition) &&
GetMonitorInfo(MonitorFromWindow(Window, MONITOR_DEFAULTTOPRIMARY), &MonitorInfo))
{
SetWindowLongPtr(Window, GWL_STYLE, Style & ~WS_OVERLAPPEDWINDOW);
@@ -1133,16 +1128,16 @@ Win32ToggleFullscreen(void){
MonitorInfo.rcMonitor.right - MonitorInfo.rcMonitor.left,
MonitorInfo.rcMonitor.bottom - MonitorInfo.rcMonitor.top,
SWP_NOOWNERZORDER | SWP_FRAMECHANGED);
- full_screen = 1;
+ win32vars.full_screen = 1;
}
}
else{
SetWindowLongPtr(Window, GWL_STYLE, Style | WS_OVERLAPPEDWINDOW);
- SetWindowPlacement(Window, &GlobalWindowPosition);
+ SetWindowPlacement(Window, &win32vars.GlobalWindowPosition);
SetWindowPos(Window, 0, 0, 0, 0, 0,
SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER |
SWP_NOOWNERZORDER | SWP_FRAMECHANGED);
- full_screen = 0;
+ win32vars.full_screen = 0;
}
}
@@ -1156,7 +1151,7 @@ focus it is automatically refullscreened.
internal void
Win32FixFullscreenLoseFocus(b32 lose_focus){
- if (full_screen){
+ if (win32vars.full_screen){
HWND Window = win32vars.window_handle;
LONG_PTR Style = GetWindowLongPtr(Window, GWL_STYLE);
@@ -1491,6 +1486,7 @@ Win32LoadSystemCode(){
win32vars.system.toggle_fullscreen = Toggle_Fullscreen;
win32vars.system.is_fullscreen = Is_Fullscreen;
+ win32vars.system.send_exit_signal = Send_Exit_Signal;
win32vars.system.post_clipboard = system_post_clipboard;
@@ -1953,6 +1949,8 @@ WinMain(HINSTANCE hInstance,
memset(&win32vars, 0, sizeof(win32vars));
+ win32vars.GlobalWindowPosition.length = sizeof(win32vars.GlobalWindowPosition);
+
//
// Threads and Coroutines
//
@@ -2404,7 +2402,7 @@ WinMain(HINSTANCE hInstance,
}
Win32_Input_Chunk input_chunk = win32vars.input_chunk;
- win32vars.input_chunk.trans = win32_input_chunk_transient_zero();
+ win32vars.input_chunk.trans = null_input_chunk_transient;
input_chunk.pers.control_keys[MDFR_CAPS_INDEX] = GetKeyState(VK_CAPITAL) & 0x1;
@@ -2455,6 +2453,11 @@ WinMain(HINSTANCE hInstance,
result.trying_to_kill = input_chunk.trans.trying_to_kill;
result.perform_kill = 0;
+ if (win32vars.send_exit_signal){
+ result.trying_to_kill = 1;
+ win32vars.send_exit_signal = 0;
+ }
+
win32vars.app.step(&win32vars.system,
&win32vars.target,
&memory_vars,
@@ -2465,9 +2468,9 @@ WinMain(HINSTANCE hInstance,
keep_playing = 0;
}
- if (do_toggle){
+ if (win32vars.do_toggle){
Win32ToggleFullscreen();
- do_toggle = 0;
+ win32vars.do_toggle = 0;
}
Win32SetCursorFromUpdate(result.mouse_cursor_type);
diff --git a/win32_api_impl.cpp b/win32_api_impl.cpp
index 72d39af1..631f54d1 100644
--- a/win32_api_impl.cpp
+++ b/win32_api_impl.cpp
@@ -177,25 +177,28 @@ DOC_SEE(Mouse_Cursor_Show_Type)
}
API_EXPORT void
-Toggle_Fullscreen(Application_Links *app)/*
-*/{
+Toggle_Fullscreen(Application_Links *app){
/* NOTE(allen): Don't actually change window size now!
Tell the platform layer to do the toggle (or to cancel the toggle)
later when the app.step function isn't running. If the size changes
mid step, it messes up the rendering rules and stuff. */
- do_toggle = !do_toggle;
+ win32vars.do_toggle = !win32vars.do_toggle;
}
API_EXPORT bool32
-Is_Fullscreen(Application_Links *app)/*
-*/{
+Is_Fullscreen(Application_Links *app){
/* NOTE(allen): This is a fancy way of say 'full_screen XOR do_toggle'
This way this function can always report the state the fullscreen
will have when the next frame runs, given the number of toggles
that have occurred this frame and the original value. */
- bool32 result = (full_screen + do_toggle) & 1;
+ bool32 result = (win32vars.full_screen + win32vars.do_toggle) & 1;
return(result);
}
+API_EXPORT void
+Send_Exit_Signal(Application_Links *app){
+ win32vars.send_exit_signal = 1;
+}
+
// BOTTOM