Mercurial > ~mikael > mcabber > hg
diff mcabber/src/screen.c @ 151:b69c0b7a23e3
[/trunk] Changeset 163 by mikael
* Window resize handling 8-)
author | mikael |
---|---|
date | Sun, 01 May 2005 03:14:19 +0000 |
parents | 9f74832eb4f8 |
children | ae0844311710 |
line wrap: on
line diff
--- a/mcabber/src/screen.c Sun May 01 03:09:40 2005 +0000 +++ b/mcabber/src/screen.c Sun May 01 03:14:19 2005 +0000 @@ -18,6 +18,8 @@ #define window_entry(n) list_entry(n, window_entry_t, list) +inline void check_offset(int); + LIST_HEAD(window_list); typedef struct _window_entry_t { @@ -176,11 +178,20 @@ } -window_entry_t *scr_CreatePanel(const char *title, int x, int y, - int lines, int cols, int dont_show) +window_entry_t *scr_CreateBuddyPanel(const char *title, int dont_show) { + int x; + int y; + int lines; + int cols; window_entry_t *tmp = calloc(1, sizeof(window_entry_t)); + // Dimensions + x = ROSTER_WIDTH; + y = 0; + lines = CHAT_WIN_HEIGHT; + cols = maxX - ROSTER_WIDTH; + tmp->win = newwin(lines, cols, y, x); tmp->panel = new_panel(tmp->win); tmp->name = (char *) calloc(1, 1024); @@ -365,8 +376,7 @@ // If the window entry doesn't exist yet, let's create it. if (win_entry == NULL) { - win_entry = scr_CreatePanel(winId, ROSTER_WIDTH, 0, CHAT_WIN_HEIGHT, - maxX - ROSTER_WIDTH, dont_show); + win_entry = scr_CreateBuddyPanel(winId, dont_show); } hbuf_add_line(&win_entry->hbuf, text, fullprefix, @@ -419,41 +429,130 @@ return; } -void scr_DrawMainWindow(void) +// scr_DrawMainWindow() +// Set fullinit to TRUE to also create panels +// +// I think it could be improved a _lot_ but I'm really not an ncurses +// expert... :-\ Mikael. +// +void scr_DrawMainWindow(unsigned int fullinit) { int l; - /* Draw main panels */ + /* Create windows */ rosterWnd = newwin(CHAT_WIN_HEIGHT, ROSTER_WIDTH, 0, 0); - rosterPanel = new_panel(rosterWnd); + chatWnd = newwin(CHAT_WIN_HEIGHT, maxX - ROSTER_WIDTH, 0, ROSTER_WIDTH); + logWnd_border = newwin(LOG_WIN_HEIGHT, maxX, CHAT_WIN_HEIGHT, 0); + logWnd = derwin(logWnd_border, LOG_WIN_HEIGHT-2, maxX-2, 1, 1); + inputWnd = newwin(1, maxX, maxY-1, 0); + + /* Draw/init windows */ + + // - Clear roster and draw vertical line scr_clear_box(rosterWnd, 0, 0, CHAT_WIN_HEIGHT, ROSTER_WIDTH, COLOR_GENERAL); for (l=0 ; l < CHAT_WIN_HEIGHT ; l++) mvwaddch(rosterWnd, l, ROSTER_WIDTH-1, ACS_VLINE); - chatWnd = newwin(CHAT_WIN_HEIGHT, maxX - ROSTER_WIDTH, 0, ROSTER_WIDTH); - chatPanel = new_panel(chatWnd); + // - Clear chat window scr_clear_box(chatWnd, 0, 0, CHAT_WIN_HEIGHT, maxX - ROSTER_WIDTH, COLOR_GENERAL); - scrollok(chatWnd, TRUE); mvwprintw(chatWnd, 0, 0, "This is the status window"); - logWnd_border = newwin(LOG_WIN_HEIGHT, maxX, CHAT_WIN_HEIGHT, 0); - logPanel_border = new_panel(logWnd_border); + // - Draw/clear the log window scr_draw_box(logWnd_border, 0, 0, LOG_WIN_HEIGHT, maxX, COLOR_GENERAL, 0, 0); - logWnd = derwin(logWnd_border, LOG_WIN_HEIGHT-2, maxX-2, 1, 1); - logPanel = new_panel(logWnd); wbkgd(logWnd, COLOR_PAIR(COLOR_GENERAL)); - scrollok(logWnd, TRUE); - inputWnd = newwin(1, maxX, maxY-1, 0); - inputPanel = new_panel(inputWnd); + // Enable keypad (+ special keys) + keypad(inputWnd, TRUE); + if (fullinit) { + // Create panels + rosterPanel = new_panel(rosterWnd); + chatPanel = new_panel(chatWnd); + logPanel_border = new_panel(logWnd_border); + logPanel = new_panel(logWnd); + inputPanel = new_panel(inputWnd); + } + + // We'll need to redraw the roster update_roster = TRUE; return; } +// scr_Resize() +// Function called when the window is resized. +// - Recreate windows +// - Update panels +// - Rewrap lines in each buddy buffer +void scr_Resize() +{ + WINDOW *w_roster, *w_chat, *w_log, *w_log_bord, *w_input; + + struct list_head *pos, *n; + window_entry_t *search_entry; + int x, y, lines, cols; + + // First, update the global variables + getmaxyx(stdscr, maxY, maxX); + // Make sure the cursor stays inside the window + check_offset(0); + + // Backup pointers + w_roster = rosterWnd; + w_chat = chatWnd; + w_log = logWnd; + w_log_bord = logWnd_border; + w_input = inputWnd; + + // Recreate windows + scr_DrawMainWindow(FALSE); + + // Replace windows for panels + replace_panel(rosterPanel, rosterWnd); + replace_panel(chatPanel, chatWnd); + replace_panel(logPanel, logWnd); + replace_panel(logPanel_border, logWnd_border); + replace_panel(inputPanel, inputWnd); + + // Destroy old windows + delwin(w_roster); + delwin(w_chat); + delwin(w_log); + delwin(w_log_bord); + delwin(w_input); + + // Resize all buddy windows + x = ROSTER_WIDTH; + y = 0; + lines = CHAT_WIN_HEIGHT; + cols = maxX - ROSTER_WIDTH; + + list_for_each_safe(pos, n, &window_list) { + search_entry = window_entry(pos); + if (search_entry->win) { + WINDOW *w_buddy = search_entry->win; + // Create new window + search_entry->win = newwin(lines, cols, y, x); + scr_clear_box(search_entry->win, 0, 0, lines, cols, COLOR_GENERAL); + // If a panel exists, replace the old window with the new + if (search_entry->panel) { + replace_panel(search_entry->panel, search_entry->win); + } + // Redo line wrapping + hbuf_rebuild(&search_entry->hbuf, + maxX - scr_WindowWidth(rosterWnd) - 14); + // Delete old buddy window + delwin(w_buddy); + } + } + + // Refresh current buddy window + if (chatmode) + scr_ShowBuddyWindow(); +} + // scr_DrawRoster() // Actually, display the buddylist on the screen. void scr_DrawRoster(void) @@ -1104,6 +1203,10 @@ top_panel(chatPanel); top_panel(inputPanel); break; + case 12: // Ctrl-l + case KEY_RESIZE: + scr_Resize(); + break; default: scr_LogPrint("Unkown key=%d", key); }