bool target_set_closest(int mode) { int y, x, m_idx; monster_type *m_ptr; char m_name[80]; bool visibility; struct point_set *targets; /* Cancel old target */ target_set_monster(0); /* Get ready to do targetting */ targets = target_set_interactive_prepare(mode); /* If nothing was prepared, then return */ if (point_set_size(targets) < 1) { msg("No Available Target."); point_set_dispose(targets); return FALSE; } /* Find the first monster in the queue */ y = targets->pts[0].y; x = targets->pts[0].x; m_idx = cave->m_idx[y][x]; /* Target the monster, if possible */ if ((m_idx <= 0) || !target_able(m_idx)) { msg("No Available Target."); point_set_dispose(targets); return FALSE; } /* Target the monster */ m_ptr = cave_monster(cave, m_idx); monster_desc(m_name, sizeof(m_name), m_ptr, 0x00); if (!(mode & TARGET_QUIET)) msg("%^s is targeted.", m_name); Term_fresh(); /* Set up target information */ monster_race_track(m_ptr->r_idx); health_track(p_ptr, cave->m_idx[y][x]); target_set_monster(m_idx); /* Visual cue */ Term_get_cursor(&visibility); (void)Term_set_cursor(TRUE); move_cursor_relative(y, x); Term_redraw_section(x, y, x, y); /* TODO: what's an appropriate amount of time to spend highlighting */ Term_xtra(TERM_XTRA_DELAY, 150); (void)Term_set_cursor(visibility); point_set_dispose(targets); return TRUE; }
/* * Procedure Redisplay() is called as the result of an Expose event. * Use the redraw callback to do a full redraw */ static void Redisplay(AngbandWidget wnew, XEvent *xev, Region region) { int x1, x2, y1, y2; int i; term_data *old_td = (term_data*)(Term->data); term_data *td = &data[0]; /* Ignore parameter */ (void) region; /* 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); /* Find the bounds of the exposed region */ /* * This probably could be obtained from the Region parameter - * but I don't know anything about XAW. */ x1 = (xev->xexpose.x - wnew->angband.internal_border) /wnew->angband.fontwidth; x2 = (xev->xexpose.x + xev->xexpose.width - wnew->angband.internal_border)/wnew->angband.fontwidth; y1 = (xev->xexpose.y - wnew->angband.internal_border) /wnew->angband.fontheight; y2 = (xev->xexpose.y + xev->xexpose.height - wnew->angband.internal_border)/wnew->angband.fontheight; Term_redraw_section(x1, y1, x2, y2); /* Activate the old term */ Term_activate(&old_td->t); #if 0 if (XtHasCallbacks((Widget)widget, XtNredrawCallback) == XtCallbackHasSome) { XtCallCallbacks((Widget)widget, XtNredrawCallback, NULL); } #endif /* 0 */ }
/** * Target closest monster. * * XXX: Move to using CMD_TARGET_CLOSEST at some point instead of invoking * target_set_closest() directly. */ void textui_target_closest(void) { if (target_set_closest(TARGET_KILL)) { bool visibility; int x, y; target_get(&x, &y); /* Visual cue */ Term_fresh(); Term_get_cursor(&visibility); (void)Term_set_cursor(TRUE); move_cursor_relative(y, x); Term_redraw_section(x, y, x, y); /* TODO: what's an appropriate amount of time to spend highlighting */ Term_xtra(TERM_XTRA_DELAY, 150); (void)Term_set_cursor(visibility); } }
/* * 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); }