adding cl parameters

This commit is contained in:
Allen Webster 2016-01-21 12:48:09 -05:00
parent 7009115967
commit c395f8a735
14 changed files with 247 additions and 113 deletions

View File

@ -8,15 +8,6 @@
#include "4coder_custom.h" #include "4coder_custom.h"
#include "4coder_helper.h" #include "4coder_helper.h"
#define exec_command_keep_stack app->exec_command_keep_stack
#define clear_parameters app->clear_parameters
#define get_active_buffer app->get_active_buffer
#define exec_command(cmd_context, id) \
exec_command_keep_stack(cmd_context, id); \
clear_parameters(cmd_context)
#define push_memory(cmd_context, len) app->push_memory(cmd_context, len)
#ifndef literal #ifndef literal
#define literal(s) s, (sizeof(s)-1) #define literal(s) s, (sizeof(s)-1)
#endif #endif
@ -219,7 +210,7 @@ extern "C" GET_BINDING_DATA(get_bindings){
// //
// If this is not set, it defaults to mapid_global. // If this is not set, it defaults to mapid_global.
inherit_map(context, mapid_file); inherit_map(context, mapid_file);
// NOTE(allen|a3.1): Children can override parent's bindings. // NOTE(allen|a3.1): Children can override parent's bindings.
bind(context, codes->right, MDFR_CTRL, cmdid_seek_alphanumeric_or_camel_right); bind(context, codes->right, MDFR_CTRL, cmdid_seek_alphanumeric_or_camel_right);
bind(context, codes->left, MDFR_CTRL, cmdid_seek_alphanumeric_or_camel_left); bind(context, codes->left, MDFR_CTRL, cmdid_seek_alphanumeric_or_camel_left);
@ -232,10 +223,12 @@ extern "C" GET_BINDING_DATA(get_bindings){
bind_me(context, ')', MDFR_NONE, write_and_auto_tab); bind_me(context, ')', MDFR_NONE, write_and_auto_tab);
bind_me(context, ']', MDFR_NONE, write_and_auto_tab); bind_me(context, ']', MDFR_NONE, write_and_auto_tab);
bind_me(context, ';', MDFR_NONE, write_and_auto_tab); bind_me(context, ';', MDFR_NONE, write_and_auto_tab);
#if 0
bind(context, '\t', MDFR_NONE, cmdid_auto_tab_line_at_cursor); bind(context, '\t', MDFR_NONE, cmdid_auto_tab_line_at_cursor);
bind(context, '\t', MDFR_CTRL, cmdid_auto_tab_range); bind(context, '\t', MDFR_CTRL, cmdid_auto_tab_range);
bind(context, '\t', MDFR_CTRL | MDFR_SHIFT, cmdid_write_character); bind(context, '\t', MDFR_CTRL | MDFR_SHIFT, cmdid_write_character);
#endif
end_map(context); end_map(context);

View File

@ -242,3 +242,11 @@ push_directory(Application_Links *app, void *cmd_context){
#define dir_string(d) ((d).str), ((d).size) #define dir_string(d) ((d).str), ((d).size)
#define exec_command_keep_stack app->exec_command_keep_stack
#define clear_parameters app->clear_parameters
#define get_active_buffer app->get_active_buffer
#define exec_command(cmd_context, id) \
exec_command_keep_stack(cmd_context, id); \
clear_parameters(cmd_context)

53
4ed.cpp
View File

@ -393,8 +393,7 @@ COMMAND_DECL(seek_alphanumeric_or_camel_right){
REQ_FILE_VIEW(view); REQ_FILE_VIEW(view);
REQ_FILE(file, view); REQ_FILE(file, view);
i32 an_pos = buffer_seek_alphanumeric_right(&file->state.buffer, view->cursor.pos); i32 pos = buffer_seek_alphanumeric_or_camel_right(&file->state.buffer, view->cursor.pos);
i32 pos = buffer_seek_alphanumeric_or_camel_right(&file->state.buffer, view->cursor.pos, an_pos);
view_cursor_move(view, pos); view_cursor_move(view, pos);
#endif #endif
} }
@ -405,8 +404,7 @@ COMMAND_DECL(seek_alphanumeric_or_camel_left){
REQ_FILE_VIEW(view); REQ_FILE_VIEW(view);
REQ_FILE(file, view); REQ_FILE(file, view);
i32 an_pos = buffer_seek_alphanumeric_left(&file->state.buffer, view->cursor.pos); i32 pos = buffer_seek_alphanumeric_or_camel_left(&file->state.buffer, view->cursor.pos);
i32 pos = buffer_seek_alphanumeric_or_camel_left(&file->state.buffer, view->cursor.pos, an_pos);
view_cursor_move(view, pos); view_cursor_move(view, pos);
#endif #endif
} }
@ -794,9 +792,9 @@ app_open_file(System_Functions *system, App_Vars *vars, Exchange *exchange,
created_file = 1; created_file = 1;
target_file = file.file; target_file = file.file;
file_get_loading(target_file); file_get_loading(target_file);
table_add(&working_set->table, filename_str, file.index);
file_init_strings(target_file); file_init_strings(target_file);
file_set_name(target_file, filename); file_set_name(target_file, filename);
table_add(&working_set->table, target_file->state.source_path, file.index);
app_push_file_binding(vars, file_id, file.index); app_push_file_binding(vars, file_id, file.index);
} }
@ -1722,8 +1720,9 @@ build(System_Functions *system, Mem_Options *mem,
if (file){ if (file){
file_create_super_locked(system, mem, file, buffer_name, font_set, style->font_id); file_create_super_locked(system, mem, file, buffer_name, font_set, style->font_id);
file->settings.unimportant = 1;
table_add(&working_set->table, file->state.live_name, index); table_add(&working_set->table, file->state.live_name, index);
if (bind_to_new_view){ if (bind_to_new_view){
View *new_view = live_set_alloc_view(live_set, mem); View *new_view = live_set_alloc_view(live_set, mem);
view_replace_major(system, exchange, new_view, panel, live_set); view_replace_major(system, exchange, new_view, panel, live_set);
@ -2930,6 +2929,24 @@ App_Step_Sig(app_step){
if (system->cli_end_update(&proc->cli)){ if (system->cli_end_update(&proc->cli)){
*proc = vars->cli_processes.procs[--count]; *proc = vars->cli_processes.procs[--count];
--i; --i;
char str_space[256];
String str = make_fixed_width_string(str_space);
append(&str, "exited with code ");
append_int_to_str(proc->cli.exit, &str);
Edit_Spec spec = {};
spec.step.type = ED_NORMAL;
spec.step.edit.start = buffer_size(&out_file->state.buffer);
spec.step.edit.end = spec.step.edit.start;
spec.step.edit.len = str.size;
spec.step.pre_pos = new_cursor;
spec.step.post_pos = spec.step.edit.start + str.size;
spec.str = (u8*)str.str;
file_do_single_edit(system, &vars->mem, out_file,
&vars->layout, spec, hist_normal);
app_result.redraw = 1;
new_cursor = spec.step.post_pos;
} }
Panel *panel = vars->layout.panels; Panel *panel = vars->layout.panels;
@ -2938,7 +2955,7 @@ App_Step_Sig(app_step){
View *view = panel->view; View *view = panel->view;
if (view && view->is_minor) view = view->major; if (view && view->is_minor) view = view->major;
File_View *fview = view_to_file_view(view); File_View *fview = view_to_file_view(view);
if (fview){ if (fview && fview->file == out_file){
view_cursor_move(fview, new_cursor); view_cursor_move(fview, new_cursor);
} }
} }
@ -3419,20 +3436,10 @@ App_Step_Sig(app_step){
{ {
Editing_File *file = working_set_lookup_file(working_set, *string); Editing_File *file = working_set_lookup_file(working_set, *string);
if (file){ if (file){
switch (buffer_get_sync(file)){ if (buffer_needs_save(file)){
case SYNC_BEHIND_OS:
case SYNC_GOOD:
{
table_remove(&working_set->table, file->state.source_path);
kill_file(system, exchange, general, file, live_set, &vars->layout);
view_remove_minor(system, exchange, panel, live_set);
}break;
case SYNC_UNSAVED:
{
View *new_view = live_set_alloc_view(live_set, mem); View *new_view = live_set_alloc_view(live_set, mem);
view_replace_minor(system, exchange, new_view, panel, live_set); view_replace_minor(system, exchange, new_view, panel, live_set);
new_view->map = &vars->map_ui; new_view->map = &vars->map_ui;
Interactive_View *int_view = Interactive_View *int_view =
interactive_view_init(system, new_view, &vars->hot_directory, style, interactive_view_init(system, new_view, &vars->hot_directory, style,
@ -3441,9 +3448,11 @@ App_Step_Sig(app_step){
int_view->action = INTV_SURE_TO_KILL; int_view->action = INTV_SURE_TO_KILL;
copy(&int_view->query, "Are you sure?"); copy(&int_view->query, "Are you sure?");
copy(&int_view->dest, file->state.live_name); copy(&int_view->dest, file->state.live_name);
}break; }
else{
default: Assert(!"invalid path"); table_remove(&working_set->table, file->state.source_path);
kill_file(system, exchange, general, file, live_set, &vars->layout);
view_remove_minor(system, exchange, panel, live_set);
} }
} }
}break; }break;

View File

@ -1458,6 +1458,7 @@ do_file_list_box(System_Functions *system, UI_State *state,
append(&full_path, filename); append(&full_path, filename);
terminate_with_null(&full_path); terminate_with_null(&full_path);
Editing_File *file = working_set_contains(state->working_set, full_path); Editing_File *file = working_set_contains(state->working_set, full_path);
full_path.size = restore_size; full_path.size = restore_size;

View File

@ -102,8 +102,8 @@ map_drop(Command_Map *map, u16 event_code, u8 modifiers){
} }
internal void internal void
map_init(Command_Map *commands, Partition *part, i32 max, map_init(Command_Map *commands, Partition *part, i32 max, Command_Map *parent){
Command_Map *parent){ max = ((max < 6)?(6):(max));
commands->parent = parent; commands->parent = parent;
commands->commands = push_array(part, Command_Binding, max); commands->commands = push_array(part, Command_Binding, max);
memset(commands->commands, 0, max*sizeof(*commands->commands)); memset(commands->commands, 0, max*sizeof(*commands->commands));

View File

@ -93,9 +93,10 @@ struct Editing_File_Settings{
Font_Set *set; Font_Set *set;
i32 base_map_id; i32 base_map_id;
i32 dos_write_mode; i32 dos_write_mode;
b32 tokens_exist; b8 tokens_exist;
b32 super_locked; b8 super_locked;
b32 is_initialized; b8 is_initialized;
b8 unimportant;
}; };
// NOTE(allen): This part of the Editing_File is cleared whenever // NOTE(allen): This part of the Editing_File is cleared whenever
@ -4017,6 +4018,15 @@ buffer_get_sync(Editing_File *file){
return result; return result;
} }
inline b32
buffer_needs_save(Editing_File *file){
b32 result = 0;
if (file->settings.unimportant == 0)
if (buffer_get_sync(file) == SYNC_UNSAVED)
result = 1;
return(result);
}
internal i32 internal i32
draw_file_loaded(View *view_, i32_Rect rect, b32 is_active, Render_Target *target){ draw_file_loaded(View *view_, i32_Rect rect, b32 is_active, Render_Target *target){
File_View *view = (File_View*)view_; File_View *view = (File_View*)view_;
@ -4072,11 +4082,12 @@ draw_file_loaded(View *view_, i32_Rect rect, b32 is_active, Render_Target *targe
Render_Font *font = get_font_info(view->font_set, font_id)->font; Render_Font *font = get_font_info(view->font_set, font_id)->font;
float *advance_data = 0; float *advance_data = 0;
if (font) advance_data = font->advance_data; if (font) advance_data = font->advance_data;
i32 count; i32 count;
Buffer_Render_Options opts = {};
buffer_get_render_data(&file->state.buffer, view->line_wrap_y, items, max, &count, buffer_get_render_data(&file->state.buffer, view->line_wrap_y, items, max, &count,
(f32)rect.x0, (f32)rect.y0, view->scroll_x, view->scroll_y, !view->unwrapped_lines, (f32)rect.x0, (f32)rect.y0, view->scroll_x, view->scroll_y, !view->unwrapped_lines,
(f32)max_x, (f32)max_y, advance_data, (f32)line_height); (f32)max_x, (f32)max_y, advance_data, (f32)line_height, opts);
Assert(count > 0); Assert(count > 0);
@ -4098,6 +4109,7 @@ draw_file_loaded(View *view_, i32_Rect rect, b32 is_active, Render_Target *targe
i32 token_i = 0; i32 token_i = 0;
i32 link_i = 0; i32 link_i = 0;
u32 main_color = style->main.default_color; u32 main_color = style->main.default_color;
u32 special_color = style->main.special_character_color;
u32 link_color = 0; u32 link_color = 0;
if (tokens_use){ if (tokens_use){
Cpp_Get_Token_Result result = cpp_get_token(&token_stack, items->index); Cpp_Get_Token_Result result = cpp_get_token(&token_stack, items->index);
@ -4141,10 +4153,14 @@ draw_file_loaded(View *view_, i32_Rect rect, b32 is_active, Render_Target *targe
} }
u32 char_color = main_color; u32 char_color = main_color;
if (item->flags & BRFlag_Special_Character) char_color = special_color;
if (cursor_begin <= ind && ind < cursor_end && (ind != prev_ind || cursor_begin < ind)){ if (cursor_begin <= ind && ind < cursor_end && (ind != prev_ind || cursor_begin < ind)){
if (is_active) draw_rectangle(target, f32R(item->x0, item->y0, item->x1, item->y1), cursor_color); if (is_active){
draw_rectangle(target, f32R(item->x0, item->y0, item->x1, item->y1), cursor_color);
char_color = at_cursor_color;
}
else draw_rectangle_outline(target, f32R(item->x0, item->y0, item->x1, item->y1), cursor_color); else draw_rectangle_outline(target, f32R(item->x0, item->y0, item->x1, item->y1), cursor_color);
char_color = at_cursor_color;
} }
else if (highlight_color){ else if (highlight_color){
draw_rectangle(target, f32R(item->x0, item->y0, item->x1, item->y1), highlight_color); draw_rectangle(target, f32R(item->x0, item->y0, item->x1, item->y1), highlight_color);

View File

@ -34,22 +34,6 @@ draw_set_color(Render_Target *target, u32 color){
} }
} }
internal void
draw_push_clip(Render_Target *target, i32_Rect clip_box){
Assert(target->clip_top == -1 ||
fits_inside(clip_box, target->clip_boxes[target->clip_top]));
Assert(target->clip_top+1 < ArrayCount(target->clip_boxes));
target->clip_boxes[++target->clip_top] = clip_box;
draw_set_clip(target, clip_box);
}
internal void
draw_pop_clip(Render_Target *target){
Assert(target->clip_top > 0);
--target->clip_top;
draw_set_clip(target, target->clip_boxes[target->clip_top]);
}
#define PutStruct(s,x) *(s*)(target->push_buffer + target->size) = x; target->size += sizeof(s) #define PutStruct(s,x) *(s*)(target->push_buffer + target->size) = x; target->size += sizeof(s)
internal void internal void
@ -79,6 +63,39 @@ draw_push_piece(Render_Target *target, Render_Piece_Combined piece){
Assert(target->size <= target->max); Assert(target->size <= target->max);
} }
internal void
draw_push_piece_clip(Render_Target *target, i32_Rect clip_box){
// TODO(allen): optimize out if there are two clip box changes in a row
Render_Piece_Change_Clip clip;
Render_Piece_Header header;
header.type = piece_type_change_clip;
clip.box = clip_box;
PutStruct(Render_Piece_Header, header);
PutStruct(Render_Piece_Change_Clip, clip);
}
internal void
draw_push_clip(Render_Target *target, i32_Rect clip_box){
Assert(target->clip_top == -1 ||
fits_inside(clip_box, target->clip_boxes[target->clip_top]));
Assert(target->clip_top+1 < ArrayCount(target->clip_boxes));
target->clip_boxes[++target->clip_top] = clip_box;
draw_push_piece_clip(target, clip_box);
}
internal void
draw_pop_clip(Render_Target *target){
i32_Rect clip_box;
Assert(target->clip_top > 0);
--target->clip_top;
clip_box = target->clip_boxes[target->clip_top];
draw_push_piece_clip(target, clip_box);
}
#define ExtractStruct(s) ((s*)cursor); cursor += sizeof(s) #define ExtractStruct(s) ((s*)cursor); cursor += sizeof(s)
inline void inline void
@ -148,7 +165,7 @@ private_draw_glyph(Render_Target *target, Render_Font *font,
stbtt_aligned_quad q; stbtt_aligned_quad q;
stbtt_GetPackedQuad(font->chardata, font->tex_width, font->tex_height, stbtt_GetPackedQuad(font->chardata, font->tex_width, font->tex_height,
character, &x, &y, &q, 1); character, &x, &y, &q, 0);
draw_set_color(target, color); draw_set_color(target, color);
draw_bind_texture(target, font->tex); draw_bind_texture(target, font->tex);
@ -177,7 +194,7 @@ private_draw_glyph_mono(Render_Target *target, Render_Font *font, u8 character,
stbtt_aligned_quad q; stbtt_aligned_quad q;
stbtt_GetPackedQuad(font->chardata, font->tex_width, font->tex_height, stbtt_GetPackedQuad(font->chardata, font->tex_width, font->tex_height,
character, &x, &y, &q, 1); character, &x, &y, &q, 0);
draw_set_color(target, color); draw_set_color(target, color);
draw_bind_texture(target, font->tex); draw_bind_texture(target, font->tex);
@ -263,6 +280,13 @@ launch_rendering(Render_Target *target){
glyph->pos.x, glyph->pos.y, glyph->pos.x, glyph->pos.y,
glyph->advance, glyph->color); glyph->advance, glyph->color);
}break; }break;
case piece_type_change_clip:
{
Render_Piece_Change_Clip *clip =
ExtractStruct(Render_Piece_Change_Clip);
draw_set_clip(target, clip->box);
}break;
} }
} }
} }

View File

@ -61,7 +61,8 @@ enum Render_Piece_Type{
piece_type_gradient, piece_type_gradient,
piece_type_glyph, piece_type_glyph,
piece_type_mono_glyph, piece_type_mono_glyph,
piece_type_mono_glyph_advance piece_type_mono_glyph_advance,
piece_type_change_clip
}; };
struct Render_Piece_Header{ struct Render_Piece_Header{
@ -93,6 +94,10 @@ struct Render_Piece_Glyph_Advance{
u8 character; u8 character;
}; };
struct Render_Piece_Change_Clip{
i32_Rect box;
};
struct Render_Piece_Combined{ struct Render_Piece_Combined{
Render_Piece_Header header; Render_Piece_Header header;
union{ union{

View File

@ -22,15 +22,23 @@ draw_pop_clip(Render_Target *target){
internal void internal void
begin_render_section(Render_Target *target, System_Functions *system){ begin_render_section(Render_Target *target, System_Functions *system){
Font_Set *font_set = &target->font_set; Font_Set *font_set = &target->font_set;
system->acquire_lock(RENDER_LOCK);
font_set->used_this_frame = 0; font_set->used_this_frame = 0;
memset(font_set->font_used_flags, 0, font_set->max); memset(font_set->font_used_flags, 0, font_set->max);
target->size = 0; target->size = 0;
system->acquire_lock(RENDER_LOCK); target->clip_top = -1;
i32_Rect clip;
clip.x0 = 0;
clip.y0 = 0;
clip.x1 = target->width;
clip.y1 = target->height;
draw_push_clip(target, clip);
} }
internal void internal void
end_render_section(Render_Target *target, System_Functions *system){ end_render_section(Render_Target *target, System_Functions *system){
//Font_Set *font_set = &target->font_set; Assert(target->clip_top == 0);
system->release_lock(RENDER_LOCK); system->release_lock(RENDER_LOCK);
} }

View File

@ -42,6 +42,7 @@ struct CLI_Handles{
Plat_Handle out_read; Plat_Handle out_read;
Plat_Handle out_write; Plat_Handle out_write;
u32 scratch_space[4]; u32 scratch_space[4];
i32 exit;
}; };
#define Sys_CLI_Call_Sig(name) b32 name(char *path, char *script_name, CLI_Handles *cli_out) #define Sys_CLI_Call_Sig(name) b32 name(char *path, char *script_name, CLI_Handles *cli_out)

View File

@ -253,7 +253,7 @@ buffer_seek_alphanumeric_right(Buffer_Type *buffer, int pos){
end = loop.size + loop.absolute_pos; end = loop.size + loop.absolute_pos;
data = loop.data - loop.absolute_pos; data = loop.data - loop.absolute_pos;
for (; pos < end; ++pos){ for (; pos < end; ++pos){
if (!is_alphanumeric_true(data[pos])) goto buffer_seek_alphanumeric_right_mid; if (is_alphanumeric_true(data[pos])) goto buffer_seek_alphanumeric_right_mid;
} }
} }
@ -263,7 +263,7 @@ buffer_seek_alphanumeric_right_mid:
end = loop.size + loop.absolute_pos; end = loop.size + loop.absolute_pos;
data = loop.data - loop.absolute_pos; data = loop.data - loop.absolute_pos;
for (; pos < end; ++pos){ for (; pos < end; ++pos){
if (is_alphanumeric_true(data[pos])) goto buffer_seek_alphanumeric_right_end; if (!is_alphanumeric_true(data[pos])) goto buffer_seek_alphanumeric_right_end;
} }
} }
@ -298,11 +298,12 @@ buffer_seek_alphanumeric_left_mid:
end = loop.absolute_pos; end = loop.absolute_pos;
data = loop.data - end; data = loop.data - end;
for (; pos >= end; --pos){ for (; pos >= end; --pos){
if (!is_alphanumeric_true(data[pos])) goto buffer_seek_alphanumeric_left_end; if (!is_alphanumeric_true(data[pos])){
++pos;
goto buffer_seek_alphanumeric_left_end;
}
} }
} }
++pos;
} }
else{ else{
pos = 0; pos = 0;
@ -313,7 +314,7 @@ buffer_seek_alphanumeric_left_end:
} }
internal_4tech int internal_4tech int
buffer_seek_alphanumeric_or_camel_right(Buffer_Type *buffer, int pos, int an_pos){ buffer_seek_range_camel_right(Buffer_Type *buffer, int pos, int an_pos){
Buffer_Stringify_Type loop; Buffer_Stringify_Type loop;
char *data; char *data;
int end, size; int end, size;
@ -351,7 +352,7 @@ buffer_seek_alphanumeric_or_camel_right_end:
} }
internal_4tech int internal_4tech int
buffer_seek_alphanumeric_or_camel_left(Buffer_Type *buffer, int pos, int an_pos){ buffer_seek_range_camel_left(Buffer_Type *buffer, int pos, int an_pos){
Buffer_Backify_Type loop; Buffer_Backify_Type loop;
char *data; char *data;
int end, size; int end, size;
@ -382,6 +383,22 @@ buffer_seek_alphanumeric_or_camel_left_end:
return(pos); return(pos);
} }
internal_4tech int
buffer_seek_alphanumeric_or_camel_right(Buffer_Type *buffer, int pos){
int an_pos, result;
an_pos = buffer_seek_alphanumeric_right(buffer, pos);
result = buffer_seek_range_camel_right(buffer, pos, an_pos);
return(result);
}
internal_4tech int
buffer_seek_alphanumeric_or_camel_left(Buffer_Type *buffer, int pos){
int an_pos, result;
an_pos = buffer_seek_alphanumeric_left(buffer, pos);
result = buffer_seek_range_camel_left(buffer, pos, an_pos);
return(result);
}
internal_4tech int internal_4tech int
buffer_find_hard_start(Buffer_Type *buffer, int line_start, int *all_whitespace, buffer_find_hard_start(Buffer_Type *buffer, int line_start, int *all_whitespace,
int *all_space, int *preferred_indent, int tab_width){ int *all_space, int *preferred_indent, int tab_width){
@ -1124,10 +1141,15 @@ buffer_invert_batch(Buffer_Invert_Batch *state, Buffer_Type *buffer, Buffer_Edit
return(result); return(result);
} }
struct Buffer_Render_Options{
b8 show_slash_t;
};
internal_4tech void internal_4tech void
buffer_get_render_data(Buffer_Type *buffer, float *wraps, Buffer_Render_Item *items, int max, int *count, buffer_get_render_data(Buffer_Type *buffer, float *wraps, Buffer_Render_Item *items, int max, int *count,
float port_x, float port_y, float scroll_x, float scroll_y, int wrapped, float port_x, float port_y, float scroll_x, float scroll_y, int wrapped,
float width, float height, float *advance_data, float font_height){ float width, float height, float *advance_data, float font_height,
Buffer_Render_Options opts){
Buffer_Stringify_Type loop; Buffer_Stringify_Type loop;
Full_Cursor start_cursor; Full_Cursor start_cursor;
Buffer_Render_Item *item; Buffer_Render_Item *item;
@ -1180,6 +1202,7 @@ buffer_get_render_data(Buffer_Type *buffer, float *wraps, Buffer_Render_Item *it
switch (ch){ switch (ch){
case '\n': case '\n':
write_render_item_inline(item, i, ' ', x, y, advance_data, font_height); write_render_item_inline(item, i, ' ', x, y, advance_data, font_height);
item->flags = 0;
++item_i; ++item_i;
++item; ++item;
@ -1189,11 +1212,13 @@ buffer_get_render_data(Buffer_Type *buffer, float *wraps, Buffer_Render_Item *it
case 0: case 0:
ch_width = write_render_item_inline(item, i, '\\', x, y, advance_data, font_height); ch_width = write_render_item_inline(item, i, '\\', x, y, advance_data, font_height);
item->flags = BRFlag_Special_Character;
++item_i; ++item_i;
++item; ++item;
x += ch_width; x += ch_width;
ch_width = write_render_item_inline(item, i, '0', x, y, advance_data, font_height); ch_width = write_render_item_inline(item, i, '0', x, y, advance_data, font_height);
item->flags = BRFlag_Special_Character;
++item_i; ++item_i;
++item; ++item;
x += ch_width; x += ch_width;
@ -1201,29 +1226,42 @@ buffer_get_render_data(Buffer_Type *buffer, float *wraps, Buffer_Render_Item *it
case '\r': case '\r':
ch_width = write_render_item_inline(item, i, '\\', x, y, advance_data, font_height); ch_width = write_render_item_inline(item, i, '\\', x, y, advance_data, font_height);
item->flags = BRFlag_Special_Character;
++item_i; ++item_i;
++item; ++item;
x += ch_width; x += ch_width;
ch_width = write_render_item_inline(item, i, 'r', x, y, advance_data, font_height); ch_width = write_render_item_inline(item, i, 'r', x, y, advance_data, font_height);
item->flags = BRFlag_Special_Character;
++item_i; ++item_i;
++item; ++item;
x += ch_width; x += ch_width;
break; break;
case '\t': case '\t':
ch_width_sub = write_render_item_inline(item, i, '\\', x, y, advance_data, font_height); if (opts.show_slash_t){
++item_i; ch_width_sub = write_render_item_inline(item, i, '\\', x, y, advance_data, font_height);
++item; item->flags = BRFlag_Special_Character;
++item_i;
write_render_item_inline(item, i, 't', x + ch_width_sub, y, advance_data, font_height); ++item;
++item_i;
++item; write_render_item_inline(item, i, 't', x + ch_width_sub, y, advance_data, font_height);
item->flags = BRFlag_Special_Character;
++item_i;
++item;
}
else{
write_render_item_inline(item, i, ' ', x, y, advance_data, font_height);
item->flags = 0;
++item_i;
++item;
}
x += ch_width; x += ch_width;
break; break;
default: default:
write_render_item(item, i, ch, x, y, ch_width, font_height); write_render_item(item, i, ch, x, y, ch_width, font_height);
item->flags = 0;
++item_i; ++item_i;
++item; ++item;
x += ch_width; x += ch_width;

View File

@ -146,15 +146,18 @@ typedef struct Full_Cursor{
float wrapped_x, wrapped_y; float wrapped_x, wrapped_y;
} Full_Cursor; } Full_Cursor;
#define BRFlag_Special_Character (1 << 0)
typedef struct Buffer_Render_Item{ typedef struct Buffer_Render_Item{
int index; int index;
int glyphid; unsigned short glyphid;
unsigned short flags;
float x0, y0; float x0, y0;
float x1, y1; float x1, y1;
} Buffer_Render_Item; } Buffer_Render_Item;
inline_4tech void inline_4tech void
write_render_item(Buffer_Render_Item *item, int index, int glyphid, write_render_item(Buffer_Render_Item *item, int index, unsigned short glyphid,
float x, float y, float w, float h){ float x, float y, float w, float h){
item->index = index; item->index = index;
item->glyphid = glyphid; item->glyphid = glyphid;
@ -165,7 +168,7 @@ write_render_item(Buffer_Render_Item *item, int index, int glyphid,
} }
inline_4tech float inline_4tech float
write_render_item_inline(Buffer_Render_Item *item, int index, int glyphid, write_render_item_inline(Buffer_Render_Item *item, int index, unsigned short glyphid,
float x, float y, float *advance_data, float h){ float x, float y, float *advance_data, float h){
float ch_width; float ch_width;
ch_width = measure_character(advance_data, (char)glyphid); ch_width = measure_character(advance_data, (char)glyphid);

BIN
vc120.pdb

Binary file not shown.

View File

@ -40,6 +40,7 @@
#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)
struct Thread_Context{ struct Thread_Context{
u32 job_id; u32 job_id;
@ -154,6 +155,9 @@ struct Win32_Vars{
Win32_Font_Load_Parameters used_font_param; Win32_Font_Load_Parameters used_font_param;
Win32_Font_Load_Parameters free_font_param; Win32_Font_Load_Parameters free_font_param;
Partition fnt_part; Partition fnt_part;
char **argv;
i32 argc;
}; };
globalvar Win32_Vars win32vars; globalvar Win32_Vars win32vars;
@ -506,11 +510,23 @@ Sys_Post_Clipboard_Sig(system_post_clipboard){
} }
} }
internal
Sys_Acquire_Lock_Sig(system_acquire_lock){
WaitForSingleObject(win32vars.locks[id], INFINITE);
}
internal
Sys_Release_Lock_Sig(system_release_lock){
ReleaseSemaphore(win32vars.locks[id], 1, 0);
}
internal void internal void
Win32RedrawScreen(HDC hdc){ Win32RedrawScreen(HDC hdc){
system_acquire_lock(RENDER_LOCK);
launch_rendering(&win32vars.target); launch_rendering(&win32vars.target);
system_release_lock(RENDER_LOCK);
glFlush(); glFlush();
//SwapBuffers(hdc); SwapBuffers(hdc);
} }
internal void internal void
@ -521,6 +537,14 @@ Win32RedrawFromUpdate(){
0, 0); 0, 0);
} }
internal void
Win32SetCursorFromUpdate(Application_Mouse_Cursor cursor){
SendMessage(
win32vars.window_handle,
WM_4coder_SET_CURSOR,
cursor, 0);
}
internal void internal void
Win32Resize(i32 width, i32 height){ Win32Resize(i32 width, i32 height){
if (width > 0 && height > 0){ if (width > 0 && height > 0){
@ -639,16 +663,6 @@ Sys_Post_Job_Sig(system_post_job){
return result; return result;
} }
internal
Sys_Acquire_Lock_Sig(system_acquire_lock){
WaitForSingleObject(win32vars.locks[id], INFINITE);
}
internal
Sys_Release_Lock_Sig(system_release_lock){
ReleaseSemaphore(win32vars.locks[id], 1, 0);
}
internal internal
Sys_Cancel_Job_Sig(system_cancel_job){ Sys_Cancel_Job_Sig(system_cancel_job){
Work_Queue *queue = exchange_vars.thread.queues + group_id; Work_Queue *queue = exchange_vars.thread.queues + group_id;
@ -826,7 +840,15 @@ Sys_CLI_Update_Step_Sig(system_cli_update_step){
internal internal
Sys_CLI_End_Update_Sig(system_cli_end_update){ Sys_CLI_End_Update_Sig(system_cli_end_update){
b32 close_me = 0; b32 close_me = 0;
if (WaitForSingleObject(*(HANDLE*)&cli->proc, 0) == WAIT_OBJECT_0){ HANDLE proc = *(HANDLE*)&cli->proc;
DWORD result = 0;
if (WaitForSingleObject(proc, 0) == WAIT_OBJECT_0){
if (GetExitCodeProcess(proc, &result) == 0)
cli->exit = -1;
else
cli->exit = (i32)result;
close_me = 1; close_me = 1;
CloseHandle(*(HANDLE*)&cli->proc); CloseHandle(*(HANDLE*)&cli->proc);
CloseHandle(*(HANDLE*)&cli->out_read); CloseHandle(*(HANDLE*)&cli->out_read);
@ -1219,9 +1241,7 @@ Win32Callback(HWND hwnd, UINT uMsg,
{ {
PAINTSTRUCT ps; PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps); HDC hdc = BeginPaint(hwnd, &ps);
system_acquire_lock(RENDER_LOCK);
Win32RedrawScreen(hdc); Win32RedrawScreen(hdc);
system_release_lock(RENDER_LOCK);
EndPaint(hwnd, &ps); EndPaint(hwnd, &ps);
}break; }break;
@ -1230,12 +1250,27 @@ Win32Callback(HWND hwnd, UINT uMsg,
{ {
PAINTSTRUCT ps; PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps); HDC hdc = BeginPaint(hwnd, &ps);
system_acquire_lock(RENDER_LOCK);
Win32RedrawScreen(hdc); Win32RedrawScreen(hdc);
system_release_lock(RENDER_LOCK);
EndPaint(hwnd, &ps); EndPaint(hwnd, &ps);
}break; }break;
case WM_4coder_SET_CURSOR:
{
switch (wParam){
case APP_MOUSE_CURSOR_ARROW:
SetCursor(win32vars.cursor_arrow); break;
case APP_MOUSE_CURSOR_IBEAM:
SetCursor(win32vars.cursor_ibeam); break;
case APP_MOUSE_CURSOR_LEFTRIGHT:
SetCursor(win32vars.cursor_leftright); break;
case APP_MOUSE_CURSOR_UPDOWN:
SetCursor(win32vars.cursor_updown); break;
}
}break;
case WM_CLOSE: // NOTE(allen): I expect WM_CLOSE not WM_DESTROY case WM_CLOSE: // NOTE(allen): I expect WM_CLOSE not WM_DESTROY
case WM_DESTROY: case WM_DESTROY:
{ {
@ -1363,21 +1398,12 @@ UpdateLoop(LPVOID param){
1, win32vars.first, redraw); 1, win32vars.first, redraw);
ProfileStart(OS_frame_out); ProfileStart(OS_frame_out);
Win32SetCursorFromUpdate(result.mouse_cursor_type);
if (result.redraw) Win32RedrawFromUpdate();
win32vars.first = 0; win32vars.first = 0;
switch (result.mouse_cursor_type){
case APP_MOUSE_CURSOR_ARROW:
SetCursor(win32vars.cursor_arrow); break;
case APP_MOUSE_CURSOR_IBEAM:
SetCursor(win32vars.cursor_ibeam); break;
case APP_MOUSE_CURSOR_LEFTRIGHT:
SetCursor(win32vars.cursor_leftright); break;
case APP_MOUSE_CURSOR_UPDOWN:
SetCursor(win32vars.cursor_updown); break;
}
if (result.redraw){
Win32RedrawFromUpdate();
}
ProfileEnd(OS_frame_out); ProfileEnd(OS_frame_out);
@ -1457,8 +1483,10 @@ WinMain(HINSTANCE hInstance,
LPSTR lpCmdLine, LPSTR lpCmdLine,
int nCmdShow){ int nCmdShow){
win32vars = {}; win32vars = {};
exchange_vars = {}; exchange_vars = {};
win32vars.argv = __argv;
win32vars.argc = __argc;
#if FRED_INTERNAL #if FRED_INTERNAL
win32vars.internal_bubble.next = &win32vars.internal_bubble; win32vars.internal_bubble.next = &win32vars.internal_bubble;
@ -1594,7 +1622,7 @@ WinMain(HINSTANCE hInstance,
static PIXELFORMATDESCRIPTOR pfd = { static PIXELFORMATDESCRIPTOR pfd = {
sizeof(PIXELFORMATDESCRIPTOR), sizeof(PIXELFORMATDESCRIPTOR),
1, 1,
PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL, PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER,
PFD_TYPE_RGBA, PFD_TYPE_RGBA,
32, 32,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,