From a9c5bef61e3e3154f733da6114bc2b37419a3c28 Mon Sep 17 00:00:00 2001 From: Allen Webster Date: Fri, 8 Jul 2016 11:24:07 -0400 Subject: [PATCH] uhhh what? thought I didn't change anything weird --- 4coder_default_include.cpp | 3 - win32_4ed.cpp | 243 +++++++++++++++++++------------------ 2 files changed, 122 insertions(+), 124 deletions(-) diff --git a/4coder_default_include.cpp b/4coder_default_include.cpp index 4292b34b..7d494056 100644 --- a/4coder_default_include.cpp +++ b/4coder_default_include.cpp @@ -1591,9 +1591,6 @@ CUSTOM_COMMAND_SIG(toggle_line_wrap){ Buffer_Summary buffer = app->get_buffer(app, view.buffer_id, AccessProtected); bool32 unwrapped = view.unwrapped_lines; - if (buffer.exists){ - unwrapped = buffer.unwrapped_lines; - } app->view_set_setting(app, &view, ViewSetting_WrapLine, unwrapped); app->buffer_set_setting(app, &buffer, BufferSetting_WrapLine, unwrapped); diff --git a/win32_4ed.cpp b/win32_4ed.cpp index 88e06f18..4b9aad87 100644 --- a/win32_4ed.cpp +++ b/win32_4ed.cpp @@ -1426,132 +1426,133 @@ Win32Callback(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam){ }break; default: - b8 previous_state, current_state; - previous_state = ((lParam & Bit_30)?(1):(0)); - current_state = ((lParam & Bit_31)?(0):(1)); - - if (current_state){ - u8 key = keycode_lookup_table[(u8)wParam]; + { + b8 previous_state = ((lParam & Bit_30)?(1):(0)); + b8 current_state = ((lParam & Bit_31)?(0):(1)); - i32 *count = 0; - Key_Event_Data *data = 0; - b8 *control_keys = 0; - i32 control_keys_size = 0; - - if (!previous_state){ - count = &win32vars.input_chunk.trans.key_data.press_count; - data = win32vars.input_chunk.trans.key_data.press; - } - else{ - count = &win32vars.input_chunk.trans.key_data.hold_count; - data = win32vars.input_chunk.trans.key_data.hold; - } - control_keys = win32vars.input_chunk.pers.control_keys; - control_keys_size = sizeof(win32vars.input_chunk.pers.control_keys); - - if (*count < KEY_INPUT_BUFFER_SIZE){ - if (!key){ - UINT vk = (UINT)wParam; - UINT scan = (UINT)((lParam >> 16) & 0x7F); - BYTE state[256]; - BYTE control_state = 0; - WORD x1 = 0, x2 = 0, x = 0, junk_x; - int result1 = 0, result2 = 0, result = 0; - - GetKeyboardState(state); - x1 = 0; - result1 = ToAscii(vk, scan, state, &x1, 0); - if (result1 < 0){ - ToAscii(vk, scan, state, &junk_x, 0); - } - result1 = (result1 == 1); - if (!usable_ascii((char)x1)){ - result1 = 0; - } - - control_state = state[VK_CONTROL]; - state[VK_CONTROL] = 0; - x2 = 0; - result2 = ToAscii(vk, scan, state, &x2, 0); - if (result2 < 0){ - ToAscii(vk, scan, state, &junk_x, 0); - } - result2 = (result2 == 1); - if (!usable_ascii((char)x2)){ - result2 = 0; - } - - // TODO(allen): This is becoming a really major issue. - // Apparently control + i outputs a '\t' which is VALID ascii - // according to this system. So it reports the key as '\t'. - // This wasn't an issue before because we were ignoring control - // when computing character_no_caps_lock which is what is used - // for commands. But that is incorrect for some keyboard layouts - // where control+alt is used to signal AltGr for important keys. - if (result1 && result2){ - char c1 = char_to_upper((char)x1); - char cParam = char_to_upper((char)wParam); - - if ((c1 == '\n' || c1 == '\r') && cParam != VK_RETURN){ - result1 = 0; - } - if (c1 == '\t' && cParam != VK_TAB){ - result1 = 0; - } - } - - if (result1){ - x = x1; - state[VK_CONTROL] = control_state; - result = 1; - } - else if (result2){ - x = x2; - result = 1; - } - - if (result == 1 && x < 128){ - key = (u8)x; - if (key == '\r') key = '\n'; - data[*count].character = key; - - state[VK_CAPITAL] = 0; - x = 0; - result = ToAscii(vk, scan, state, &x, 0); - if (result < 0){ - ToAscii(vk, scan, state, &junk_x, 0); - } - result = (result == 1); - if (!usable_ascii((char)x)){ - result = 0; - } - - if (result){ - key = (u8)x; - if (key == '\r') key = '\n'; - data[*count].character_no_caps_lock = key; - data[*count].keycode = key; - } - } - if (result != 1 || x >= 128){ - data[*count].character = 0; - data[*count].character_no_caps_lock = 0; - data[*count].keycode = 0; - } + if (current_state){ + u8 key = keycode_lookup_table[(u8)wParam]; + + i32 *count = 0; + Key_Event_Data *data = 0; + b8 *control_keys = 0; + i32 control_keys_size = 0; + + if (!previous_state){ + count = &win32vars.input_chunk.trans.key_data.press_count; + data = win32vars.input_chunk.trans.key_data.press; } else{ - data[*count].character = 0; - data[*count].character_no_caps_lock = 0; - data[*count].keycode = key; + count = &win32vars.input_chunk.trans.key_data.hold_count; + data = win32vars.input_chunk.trans.key_data.hold; + } + control_keys = win32vars.input_chunk.pers.control_keys; + control_keys_size = sizeof(win32vars.input_chunk.pers.control_keys); + + if (*count < KEY_INPUT_BUFFER_SIZE){ + if (!key){ + UINT vk = (UINT)wParam; + UINT scan = (UINT)((lParam >> 16) & 0x7F); + BYTE state[256]; + BYTE control_state = 0; + WORD x1 = 0, x2 = 0, x = 0, junk_x; + i32 result1 = 0, result2 = 0, result = 0; + + GetKeyboardState(state); + x1 = 0; + result1 = ToAscii(vk, scan, state, &x1, 0); + if (result1 < 0){ + ToAscii(vk, scan, state, &junk_x, 0); + } + result1 = (result1 == 1); + if (!usable_ascii((char)x1)){ + result1 = 0; + } + + control_state = state[VK_CONTROL]; + state[VK_CONTROL] = 0; + x2 = 0; + result2 = ToAscii(vk, scan, state, &x2, 0); + if (result2 < 0){ + ToAscii(vk, scan, state, &junk_x, 0); + } + result2 = (result2 == 1); + if (!usable_ascii((char)x2)){ + result2 = 0; + } + + // TODO(allen): This is becoming a really major issue. + // Apparently control + i outputs a '\t' which is VALID ascii + // according to this system. So it reports the key as '\t'. + // This wasn't an issue before because we were ignoring control + // when computing character_no_caps_lock which is what is used + // for commands. But that is incorrect for some keyboard layouts + // where control+alt is used to signal AltGr for important keys. + if (result1 && result2){ + char c1 = char_to_upper((char)x1); + char cParam = char_to_upper((char)wParam); + + if ((c1 == '\n' || c1 == '\r') && cParam != VK_RETURN){ + result1 = 0; + } + if (c1 == '\t' && cParam != VK_TAB){ + result1 = 0; + } + } + + if (result1){ + x = x1; + state[VK_CONTROL] = control_state; + result = 1; + } + else if (result2){ + x = x2; + result = 1; + } + + if (result == 1 && x < 128){ + key = (u8)x; + if (key == '\r') key = '\n'; + data[*count].character = key; + + state[VK_CAPITAL] = 0; + x = 0; + result = ToAscii(vk, scan, state, &x, 0); + if (result < 0){ + ToAscii(vk, scan, state, &junk_x, 0); + } + result = (result == 1); + if (!usable_ascii((char)x)){ + result = 0; + } + + if (result){ + key = (u8)x; + if (key == '\r') key = '\n'; + data[*count].character_no_caps_lock = key; + data[*count].keycode = key; + } + } + if (result != 1 || x >= 128){ + data[*count].character = 0; + data[*count].character_no_caps_lock = 0; + data[*count].keycode = 0; + } + } + else{ + data[*count].character = 0; + data[*count].character_no_caps_lock = 0; + data[*count].keycode = key; + } + memcpy(data[*count].modifiers, control_keys, control_keys_size); + data[*count].modifiers[MDFR_HOLD_INDEX] = previous_state; + ++(*count); } - memcpy(data[*count].modifiers, control_keys, control_keys_size); - data[*count].modifiers[MDFR_HOLD_INDEX] = previous_state; - ++(*count); } - } - - result = DefWindowProc(hwnd, uMsg, wParam, lParam); - } + + result = DefWindowProc(hwnd, uMsg, wParam, lParam); + }break; + }/* switch */ }break; case WM_MOUSEMOVE: