diff --git a/ncurses_diff_viewer.c b/ncurses_diff_viewer.c index eff48cf..99a4bba 100644 --- a/ncurses_diff_viewer.c +++ b/ncurses_diff_viewer.c @@ -14,6 +14,65 @@ #include #include #include +#include + +static volatile int terminal_resized = 0; + +void handle_sigwinch(int sig) { + (void)sig; + terminal_resized = 1; +} + +/** + * Handle terminal resize by recreating all windows + */ +void handle_terminal_resize(NCursesDiffViewer *viewer) { + if (!viewer) return; + + // Clean up old windows + if (viewer->file_list_win) delwin(viewer->file_list_win); + if (viewer->branch_list_win) delwin(viewer->branch_list_win); + if (viewer->commit_list_win) delwin(viewer->commit_list_win); + if (viewer->stash_list_win) delwin(viewer->stash_list_win); + if (viewer->file_content_win) delwin(viewer->file_content_win); + if (viewer->status_bar_win) delwin(viewer->status_bar_win); + + // Reinitialize ncurses with new terminal size + endwin(); + refresh(); + clear(); + + // Get new terminal dimensions + getmaxyx(stdscr, viewer->terminal_height, viewer->terminal_width); + viewer->file_panel_width = viewer->terminal_width * 0.4; + viewer->status_bar_height = viewer->terminal_height * 0.05; + if (viewer->status_bar_height < 1) viewer->status_bar_height = 1; + + int available_height = viewer->terminal_height - 1 - viewer->status_bar_height; + viewer->file_panel_height = available_height * 0.3; + viewer->commit_panel_height = available_height * 0.3; + viewer->branch_panel_height = available_height * 0.2; + viewer->stash_panel_height = available_height - viewer->file_panel_height - + viewer->commit_panel_height - viewer->branch_panel_height - 3; + + int status_bar_y = 1 + available_height; + + // Recreate all windows with new dimensions + viewer->file_list_win = newwin(viewer->file_panel_height, viewer->file_panel_width, 1, 0); + viewer->branch_list_win = newwin(viewer->branch_panel_height, viewer->file_panel_width, + 1 + viewer->file_panel_height + 1, 0); + viewer->commit_list_win = newwin(viewer->commit_panel_height, viewer->file_panel_width, + 1 + viewer->file_panel_height + 1 + viewer->branch_panel_height + 1, 0); + viewer->stash_list_win = newwin(viewer->stash_panel_height, viewer->file_panel_width, + 1 + viewer->file_panel_height + 1 + viewer->branch_panel_height + 1 + + viewer->commit_panel_height + 1, 0); + viewer->file_content_win = newwin(available_height, viewer->terminal_width - viewer->file_panel_width - 1, + 1, viewer->file_panel_width + 1); + viewer->status_bar_win = newwin(viewer->status_bar_height, viewer->terminal_width, status_bar_y, 0); + + // Force complete redraw + terminal_resized = 0; +} /** * Initialize the ncurses diff viewer @@ -3524,6 +3583,7 @@ int run_ncurses_diff_viewer(void) { printf("Failed to initialize ncurses diff viewer\n"); return 1; } + signal(SIGWINCH, handle_sigwinch); // Get changed files (can be 0, that's okay) get_ncurses_changed_files(&viewer); @@ -3577,6 +3637,10 @@ int run_ncurses_diff_viewer(void) { while (running) { + if (terminal_resized) { + handle_terminal_resize(&viewer); + } + // Only update title if mode changed if (viewer.current_mode != last_mode) { // Clear just the title line diff --git a/ncurses_diff_viewer.o b/ncurses_diff_viewer.o index b25ce21..189493a 100644 Binary files a/ncurses_diff_viewer.o and b/ncurses_diff_viewer.o differ diff --git a/shell b/shell index 0582603..e356cfe 100755 Binary files a/shell and b/shell differ