static void Resize_term(AngbandWidget wnew) { int cols, rows, wid, hgt; int ox = wnew->angband.internal_border; int oy = wnew->angband.internal_border; int i; term_data *old_td = (term_data*)(Term->data); term_data *td = &data[0]; /* Hack - Find the term to activate */ for (i = 0; i < num_term; i++) { td = &data[i]; /* Have we found it? */ if (td->widget == wnew) break; /* Paranoia: none of the widgets matched */ if (!td) return; } /* Activate the proper Term */ Term_activate(&td->t); /* Determine "proper" number of rows/cols */ cols = ((wnew->core.width - (ox + ox)) / wnew->angband.fontwidth); rows = ((wnew->core.height - (oy + oy)) / wnew->angband.fontheight); /* Hack -- minimal size */ if (cols < 1) cols = 1; if (rows < 1) rows = 1; if (i == 0) { /* Hack the main window must be at least 80x24 */ if (cols < 80) cols = 80; if (rows < 24) rows = 24; } /* Desired size of window */ wid = cols * wnew->angband.fontwidth + (ox + ox); hgt = rows * wnew->angband.fontheight + (oy + oy); /* Resize the Term (if needed) */ (void) Term_resize(cols, rows); /* Activate the old term */ Term_activate(&old_td->t); }
/* プレイホストのマップが大きいときクライアントのマップもリサイズする */ static void update_term_size(int x, int y, int len) { int ox, oy; int nx, ny; Term_get_size(&ox, &oy); nx = ox; ny = oy; /* 横方向のチェック */ if (x + len > ox) nx = x + len; /* 縦方向のチェック */ if (y + 1 > oy) ny = y + 1; if (nx != ox || ny != oy) Term_resize(nx, ny); }
/** * Query ncurses for new screen size and try to resize the GCU terms. */ static void do_gcu_resize(void) { int i, rows, cols, y, x; term *old_t = Term; for (i = 0; i < term_count; i++) { /* Activate the current Term */ Term_activate(&data[i].t); /* If we can resize the curses window, then resize the Term */ get_gcu_term_size(i, &rows, &cols, &y, &x); if (wresize(data[i].win, rows, cols) == OK) Term_resize(cols, rows); /* Activate the old term */ Term_activate(old_t); } do_cmd_redraw(); }
/* * Query ncurses for new screen size and try to resize the GCU terms. */ static void do_gcu_resize(void) { int i, rows, cols, y, x; term *old_t = Term; for (i = 0; i < MAX_TERM_DATA; i++) { /* If we're using a big screen, we only care about Term-0 */ if (use_big_screen && i > 0) break; /* Activate the current Term */ Term_activate(&data[i].t); /* If we can resize the curses window, then resize the Term */ get_gcu_term_size(i, &rows, &cols, &y, &x); if (wresize(data[i].win, rows, cols) == OK) Term_resize(cols, rows); /* Activate the old term */ Term_activate(old_t); } do_cmd_redraw(); }
/* * Process events */ static errr CheckEvent(bool wait) { term_data *old_td = (term_data*)(Term->data); XEvent xev_body, *xev = &xev_body; term_data *td = NULL; infowin *iwin = NULL; int i, x, y; int window = 0; /* Do not wait unless requested */ if (!wait && !XPending(Metadpy->dpy)) return (1); /* Load the Event */ XNextEvent(Metadpy->dpy, xev); /* Notice new keymaps */ if (xev->type == MappingNotify) { XRefreshKeyboardMapping(&xev->xmapping); return 0; } /* Scan the windows */ for (i = 0; i < MAX_TERM_DATA; i++) { if (xev->xany.window == data[i].win->win) { td = &data[i]; iwin = td->win; window = i; break; } } /* Unknown window */ if (!td || !iwin) return (0); /* Hack -- activate the Term */ Term_activate(&td->t); /* Hack -- activate the window */ Infowin_set(iwin); /* Switch on the Type */ switch (xev->type) { #if 0 case ButtonPress: case ButtonRelease: { int z = 0; /* Which button is involved */ if (xev->xbutton.button == Button1) z = 1; else if (xev->xbutton.button == Button2) z = 2; else if (xev->xbutton.button == Button3) z = 3; else if (xev->xbutton.button == Button4) z = 4; else if (xev->xbutton.button == Button5) z = 5; /* Where is the mouse */ x = xev->xbutton.x; y = xev->xbutton.y; /* XXX Handle */ break; } case EnterNotify: case LeaveNotify: { /* Where is the mouse */ x = xev->xcrossing.x; y = xev->xcrossing.y; /* XXX Handle */ break; } case MotionNotify: { /* Where is the mouse */ x = xev->xmotion.x; y = xev->xmotion.y; /* XXX Handle */ break; } case KeyRelease: { /* Nothing */ break; } #endif case KeyPress: { /* Save the mouse location */ x = xev->xkey.x; y = xev->xkey.y; /* Hack -- use "old" term */ Term_activate(&old_td->t); /* Process the key */ react_keypress(&(xev->xkey)); break; } case Expose: { int x1, x2, y1, y2; /* Ignore "extra" exposes */ /*if (xev->xexpose.count) break;*/ /* Clear the window */ /*Infowin_wipe();*/ x1 = (xev->xexpose.x - Infowin->ox)/Infofnt->wid; x2 = (xev->xexpose.x + xev->xexpose.width - Infowin->ox)/Infofnt->wid; y1 = (xev->xexpose.y - Infowin->oy)/Infofnt->hgt; y2 = (xev->xexpose.y + xev->xexpose.height - Infowin->oy)/Infofnt->hgt; Term_redraw_section(x1, y1, x2, y2); /* Redraw */ /*Term_redraw();*/ break; } case MapNotify: { Infowin->mapped = 1; Term->mapped_flag = TRUE; break; } case UnmapNotify: { Infowin->mapped = 0; Term->mapped_flag = FALSE; break; } /* Move and/or Resize */ case ConfigureNotify: { int cols, rows, wid, hgt; int ox = Infowin->ox; int oy = Infowin->oy; /* Save the new Window Parms */ Infowin->x = xev->xconfigure.x; Infowin->y = xev->xconfigure.y; Infowin->w = xev->xconfigure.width; Infowin->h = xev->xconfigure.height; /* Determine "proper" number of rows/cols */ cols = ((Infowin->w - (ox + ox)) / td->fnt->wid); rows = ((Infowin->h - (oy + oy)) / td->fnt->hgt); /* Hack -- minimal size */ if (cols < 1) cols = 1; if (rows < 1) rows = 1; if (window == 0) { /* Hack the main window must be at least 80x24 */ if (cols < 80) cols = 80; if (rows < 24) rows = 24; } /* Desired size of window */ wid = cols * td->fnt->wid + (ox + ox); hgt = rows * td->fnt->hgt + (oy + oy); /* Resize the Term (if needed) */ (void)Term_resize(cols, rows); /* Resize the windows if any "change" is needed */ if ((Infowin->w != wid) || (Infowin->h != hgt)) { /* Resize window */ Infowin_set(td->win); Infowin_resize(wid, hgt); } break; } } /* Hack -- Activate the old term */ Term_activate(&old_td->t); /* Hack -- Activate the proper window */ Infowin_set(old_td->win); /* Success */ return (0); }