fix incorrect listener socket creation on client-only win32 socket sessions; win32 window manager -> make robust to zero handles

This commit is contained in:
Ryan Fleury committed 2026-10-12 08:58:00 -07:00
1 parent 4a9b10bb7b
commit 5ec3156d8e
6 files changed
+93 -55

No files matched your search

+4 -4
View File
@@ -224,8 +224,8 @@ RD_VocabInfo rd_vocab_info_table[375] =
{str8_lit_comp("state"), str8_lit_comp(""), str8_lit_comp("State"), str8_lit_comp(""), RD_IconKind_Null},
{str8_lit_comp("eval"), str8_lit_comp(""), str8_lit_comp("Eval"), str8_lit_comp(""), RD_IconKind_Null},
{str8_lit_comp("line_from_vaddr"), str8_lit_comp(""), str8_lit_comp("Line From Virtual Address"), str8_lit_comp(""), RD_IconKind_Null},
{str8_lit_comp("enable_hidden_mode"), str8_lit_comp(""), str8_lit_comp("Enable Hidden Mode"), str8_lit_comp(""), RD_IconKind_Null},
{str8_lit_comp("disable_hidden_mode"), str8_lit_comp(""), str8_lit_comp("Disable Hidden Mode"), str8_lit_comp(""), RD_IconKind_Null},
{str8_lit_comp("hide_ui"), str8_lit_comp(""), str8_lit_comp("Hide UI"), str8_lit_comp(""), RD_IconKind_Null},
{str8_lit_comp("show_ui"), str8_lit_comp(""), str8_lit_comp("Show UI"), str8_lit_comp(""), RD_IconKind_Null},
{str8_lit_comp("wm_event"), str8_lit_comp(""), str8_lit_comp("OS Event"), str8_lit_comp(""), RD_IconKind_Null},
{str8_lit_comp("select_thread"), str8_lit_comp(""), str8_lit_comp("Select Thread"), str8_lit_comp(""), RD_IconKind_Thread},
{str8_lit_comp("select_unwind"), str8_lit_comp(""), str8_lit_comp("Select Unwind"), str8_lit_comp(""), RD_IconKind_Null},
@@ -652,8 +652,8 @@ RD_CmdKindInfo rd_cmd_kind_info_table[261] =
{ str8_lit_comp("state"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}},
{ str8_lit_comp("eval"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Expr, str8_lit_comp("")}},
{ str8_lit_comp("line_from_vaddr"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Vaddr, str8_lit_comp("")}},
{ str8_lit_comp("enable_hidden_mode"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}},
{ str8_lit_comp("disable_hidden_mode"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}},
{ str8_lit_comp("hide_ui"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}},
{ str8_lit_comp("show_ui"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}},
{ str8_lit_comp("wm_event"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}},
{ str8_lit_comp("select_thread"), str8_lit_comp("Selects a thread."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Thread, str8_lit_comp("query:threads")}},
{ str8_lit_comp("select_unwind"), str8_lit_comp("Selects an unwind frame number for the selected thread."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("query:call_stack")}},
+2 -2
View File
@@ -115,8 +115,8 @@ RD_CmdKind_RunExternalDriverTextCommand,
RD_CmdKind_State,
RD_CmdKind_Eval,
RD_CmdKind_LineFromVAddr,
RD_CmdKind_EnableHiddenMode,
RD_CmdKind_DisableHiddenMode,
RD_CmdKind_HideUI,
RD_CmdKind_ShowUI,
RD_CmdKind_WMEvent,
RD_CmdKind_SelectThread,
RD_CmdKind_SelectUnwind,
+2 -2
View File
@@ -1047,8 +1047,8 @@ RD_CmdTable: // | | | |
{State 0 0 1 "" Null 0 0 0 0 0 0 0 Null "state" "State" "" "" "" }
{Eval 0 0 1 "" Expr 0 0 0 0 0 0 0 Null "eval" "Eval" "" "" "" }
{LineFromVAddr 0 0 1 "" Vaddr 0 0 0 0 0 0 0 Null "line_from_vaddr" "Line From Virtual Address" "" "" "" }
{EnableHiddenMode 0 0 1 "" Null 0 0 0 0 0 0 0 Null "enable_hidden_mode" "Enable Hidden Mode" "" "" "" }
{DisableHiddenMode 0 0 1 "" Null 0 0 0 0 0 0 0 Null "disable_hidden_mode" "Disable Hidden Mode" "" "" "" }
{HideUI 0 0 1 "" Null 0 0 0 0 0 0 0 Null "hide_ui" "Hide UI" "" "" "" }
{ShowUI 0 0 1 "" Null 0 0 0 0 0 0 0 Null "show_ui" "Show UI" "" "" "" }
//- rjf: os event passthrough
{WMEvent 0 0 0 "" Null 0 0 0 0 0 0 0 Null "wm_event" "OS Event" "" "" "" }
+11 -8
View File
@@ -5509,7 +5509,7 @@ rd_push_window_title(Arena *arena)
prof_path = str8_chop_last_dot(prof_path);
project_name = str8_skip_last_slash(prof_path);
}
String8 result = push_str8f(arena, "%S%s%s", project_name, project_name.size != 0 ? " - " : "", BUILD_TITLE " (" BUILD_VERSION_STRING_LITERAL " " BUILD_RELEASE_PHASE_STRING_LITERAL ")");
String8 result = str8f(arena, "%S%s%s", project_name, project_name.size != 0 ? " - " : "", BUILD_TITLE " (" BUILD_VERSION_STRING_LITERAL " " BUILD_RELEASE_PHASE_STRING_LITERAL ")");
return result;
}
@@ -5519,7 +5519,7 @@ rd_window_from_cfg(CFG_Node *cfg)
CFG_Node *result = &cfg_nil_node;
for(CFG_Node *c = cfg; c != &cfg_nil_node; c = c->parent)
{
if(c->parent->parent == cfg_node_root() && str8_match(c->string, str8_lit("window"), 0))
if(c->parent->parent == cfg_node_root() && str8_match(c->string, s("window"), 0))
{
result = c;
break;
@@ -5569,10 +5569,10 @@ rd_window_state_from_cfg(CFG_Node *cfg)
Vec2F32 size = {0};
WM_Monitor preferred_monitor = {0};
{
CFG_Node *pos_cfg = cfg_node_child_from_string(window_cfg, str8_lit("pos"));
CFG_Node *pos_cfg = cfg_node_child_from_string(window_cfg, s("pos"));
has_pos = (pos_cfg != &cfg_nil_node);
CFG_Node *size_cfg = cfg_node_child_from_string(window_cfg, str8_lit("size"));
CFG_Node *monitor_cfg = cfg_node_child_from_string(window_cfg, str8_lit("monitor"));
CFG_Node *size_cfg = cfg_node_child_from_string(window_cfg, s("size"));
CFG_Node *monitor_cfg = cfg_node_child_from_string(window_cfg, s("monitor"));
pos.x = (F32)f64_from_str8(pos_cfg->first->string);
pos.y = (F32)f64_from_str8(pos_cfg->first->next->string);
size.x = (F32)f64_from_str8(size_cfg->first->string);
@@ -11311,9 +11311,10 @@ rd_init(CmdLine *cmdln)
Arena *arena = arena_alloc();
rd_state = push_array(arena, RD_State, 1);
rd_state->arena = arena;
rd_state->quit_after_success = (cmd_line_has_flag(cmdln, str8_lit("quit_after_success")) ||
cmd_line_has_flag(cmdln, str8_lit("q")));
rd_state->quit_after_success = (cmd_line_has_flag(cmdln, s("quit_after_success")) ||
cmd_line_has_flag(cmdln, s("q")));
rd_state->override_focus_on_stop = (cmd_line_has_flag(cmdln, s("no_focus_on_stop")));
rd_state->hidden_mode = cmd_line_has_flag(cmdln, s("hide_ui"));
rd_state->user_path_arena = arena_alloc();
rd_state->project_path_arena = arena_alloc();
rd_state->theme_path_arena = arena_alloc();
@@ -13975,6 +13976,8 @@ rd_frame(void)
}
str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, "}\n");
}break;
case RD_CmdKind_HideUI:{rd_state->hidden_mode = 1;}break;
case RD_CmdKind_ShowUI:{rd_state->hidden_mode = 0;}break;
//- rjf: exiting
case RD_CmdKind_Exit:
@@ -18709,7 +18712,7 @@ rd_frame(void)
//////////////////////////////
//- rjf: submit rendering to all windows
//
ProfScope("submit rendering to all windows")
ProfScope("submit rendering to all windows") if(!rd_state->hidden_mode)
{
r_begin_frame();
for(RD_WindowState *w = rd_state->first_window_state; w != &rd_nil_window_state; w = w->order_next)
+3
View File
@@ -392,16 +392,19 @@ sock_session_open(U16 listener_port, SOCK_WakeupFunctionType *wakeup_hook)
WSAIoctl(session->tcp_listen_socket, SIO_GET_EXTENSION_FUNCTION_POINTER, &AcceptEx_guid, sizeof(AcceptEx_guid), &session->lpfnAcceptEx, sizeof(session->lpfnAcceptEx), &dwBytes, 0, 0);
//- rjf: create accepting socket
if(listener_port != 0)
{
session->tcp_accept_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
}
//- rjf: associate accepting socket with IOCP
if(listener_port != 0)
{
CreateIoCompletionPort((HANDLE)session->tcp_accept_socket, session->iocp, 0, 0);
}
//- rjf: kick off accept
if(listener_port != 0)
{
session->lpfnAcceptEx(session->tcp_listen_socket, session->tcp_accept_socket, session->tcp_accept_buffer, 0, sizeof(struct sockaddr_storage) + 16, sizeof(struct sockaddr_storage) + 16, &session->tcp_accept_size_out, &session->tcp_accept_overlapped);
}
+71 -39
View File
@@ -1132,7 +1132,10 @@ internal void
wm_window_close(WM_Window handle)
{
W32_WM_Window *window = w32_wm_window_from_handle(handle);
w32_wm_window_release(window);
if(window != 0)
{
w32_wm_window_release(window);
}
}
internal void
@@ -1140,8 +1143,11 @@ wm_window_set_title(WM_Window handle, String8 title)
{
Temp scratch = scratch_begin(0, 0);
W32_WM_Window *window = w32_wm_window_from_handle(handle);
String16 title16 = str16_from_8(scratch.arena, title);
SetWindowTextW(window->hwnd, (WCHAR *)title16.str);
if(window != 0)
{
String16 title16 = str16_from_8(scratch.arena, title);
SetWindowTextW(window->hwnd, (WCHAR *)title16.str);
}
scratch_end(scratch);
}
@@ -1149,11 +1155,14 @@ internal void
wm_window_first_paint(WM_Window window_handle)
{
W32_WM_Window *window = w32_wm_window_from_handle(window_handle);
window->first_paint_done = 1;
ShowWindow(window->hwnd, SW_SHOW);
if(window->maximized)
if(window != 0)
{
ShowWindow(window->hwnd, SW_MAXIMIZE);
window->first_paint_done = 1;
ShowWindow(window->hwnd, SW_SHOW);
if(window->maximized)
{
ShowWindow(window->hwnd, SW_MAXIMIZE);
}
}
}
@@ -1161,58 +1170,74 @@ internal void
wm_window_focus(WM_Window handle)
{
W32_WM_Window *window = w32_wm_window_from_handle(handle);
SetForegroundWindow(window->hwnd);
SetFocus(window->hwnd);
if(window != 0)
{
SetForegroundWindow(window->hwnd);
SetFocus(window->hwnd);
}
}
internal B32
wm_window_is_focused(WM_Window handle)
{
B32 result = 0;
W32_WM_Window *window = w32_wm_window_from_handle(handle);
HWND active_hwnd = GetForegroundWindow();
return active_hwnd == window->hwnd;
if(window != 0)
{
HWND active_hwnd = GetForegroundWindow();
result = active_hwnd == window->hwnd;
}
return result;
}
internal B32
wm_window_is_fullscreen(WM_Window handle)
{
B32 result = 0;
W32_WM_Window *window = w32_wm_window_from_handle(handle);
DWORD window_style = GetWindowLong(window->hwnd, GWL_STYLE);
return !(window_style & WS_OVERLAPPEDWINDOW);
if(window != 0)
{
DWORD window_style = GetWindowLong(window->hwnd, GWL_STYLE);
result = !(window_style & WS_OVERLAPPEDWINDOW);
}
return result;
}
internal void
wm_window_set_fullscreen(WM_Window handle, B32 fullscreen)
{
W32_WM_Window *window = w32_wm_window_from_handle(handle);
DWORD window_style = GetWindowLong(window->hwnd, GWL_STYLE);
B32 is_fullscreen_already = wm_window_is_fullscreen(handle);
if(fullscreen)
if(window != 0)
{
if(!is_fullscreen_already)
DWORD window_style = GetWindowLong(window->hwnd, GWL_STYLE);
B32 is_fullscreen_already = wm_window_is_fullscreen(handle);
if(fullscreen)
{
GetWindowPlacement(window->hwnd, &window->last_window_placement);
if(!is_fullscreen_already)
{
GetWindowPlacement(window->hwnd, &window->last_window_placement);
}
MONITORINFO monitor_info = {sizeof(monitor_info)};
if(GetMonitorInfo(MonitorFromWindow(window->hwnd, MONITOR_DEFAULTTOPRIMARY), &monitor_info))
{
SetWindowLong(window->hwnd, GWL_STYLE, window_style & ~WS_OVERLAPPEDWINDOW);
SetWindowPos(window->hwnd, HWND_TOP,
monitor_info.rcMonitor.left,
monitor_info.rcMonitor.top,
monitor_info.rcMonitor.right - monitor_info.rcMonitor.left,
monitor_info.rcMonitor.bottom - monitor_info.rcMonitor.top,
SWP_NOOWNERZORDER | SWP_FRAMECHANGED);
}
}
MONITORINFO monitor_info = {sizeof(monitor_info)};
if(GetMonitorInfo(MonitorFromWindow(window->hwnd, MONITOR_DEFAULTTOPRIMARY), &monitor_info))
else
{
SetWindowLong(window->hwnd, GWL_STYLE, window_style & ~WS_OVERLAPPEDWINDOW);
SetWindowPos(window->hwnd, HWND_TOP,
monitor_info.rcMonitor.left,
monitor_info.rcMonitor.top,
monitor_info.rcMonitor.right - monitor_info.rcMonitor.left,
monitor_info.rcMonitor.bottom - monitor_info.rcMonitor.top,
SetWindowLong(window->hwnd, GWL_STYLE, window_style | WS_OVERLAPPEDWINDOW);
SetWindowPlacement(window->hwnd, &window->last_window_placement);
SetWindowPos(window->hwnd, 0, 0, 0, 0, 0,
SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER |
SWP_NOOWNERZORDER | SWP_FRAMECHANGED);
}
}
else
{
SetWindowLong(window->hwnd, GWL_STYLE, window_style | WS_OVERLAPPEDWINDOW);
SetWindowPlacement(window->hwnd, &window->last_window_placement);
SetWindowPos(window->hwnd, 0, 0, 0, 0, 0,
SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER |
SWP_NOOWNERZORDER | SWP_FRAMECHANGED);
}
}
internal B32
@@ -1290,8 +1315,9 @@ internal void
wm_window_set_monitor(WM_Window window_handle, WM_Monitor monitor)
{
W32_WM_Window *window = w32_wm_window_from_handle(window_handle);
HMONITOR hmonitor = (HMONITOR)monitor.u64[0];
if(window != 0)
{
HMONITOR hmonitor = (HMONITOR)monitor.u64[0];
MONITORINFOEXW info;
info.cbSize = sizeof(MONITORINFOEXW);
if(GetMonitorInfoW(hmonitor, (MONITORINFO *)&info))
@@ -1311,7 +1337,7 @@ internal void
wm_window_clear_custom_border_data(WM_Window handle)
{
W32_WM_Window *window = w32_wm_window_from_handle(handle);
if(window->custom_border)
if(window && window->custom_border)
{
arena_clear(window->paint_arena);
window->first_title_bar_client_area = window->last_title_bar_client_area = 0;
@@ -1324,21 +1350,27 @@ internal void
wm_window_push_custom_title_bar(WM_Window handle, F32 thickness)
{
W32_WM_Window *window = w32_wm_window_from_handle(handle);
window->custom_border_title_thickness = thickness;
if(window != 0)
{
window->custom_border_title_thickness = thickness;
}
}
internal void
wm_window_push_custom_edges(WM_Window handle, F32 thickness)
{
W32_WM_Window *window = w32_wm_window_from_handle(handle);
window->custom_border_edge_thickness = thickness;
if(window != 0)
{
window->custom_border_edge_thickness = thickness;
}
}
internal void
wm_window_push_custom_title_bar_client_area(WM_Window handle, Rng2F32 rect)
{
W32_WM_Window *window = w32_wm_window_from_handle(handle);
if(window->custom_border)
if(window && window->custom_border)
{
W32_WM_TitleBarClientArea *area = push_array(window->paint_arena, W32_WM_TitleBarClientArea, 1);
if(area != 0)