This is pw.c in view mode; [Download] [Up]
/* Prompt windows Copyright (C) 1992 Joseph H. Allen This file is part of JOE (Joe's Own Editor) JOE is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 1, or (at your option) any later version. JOE is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with JOE; see the file COPYING. If not, write to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "config.h" #include "w.h" #include "tw.h" #include "vfile.h" #include "termcap.h" #include "b.h" #include "kbd.h" #include "scrn.h" #include "bw.h" #include "zstr.h" #include "help.h" #include "tab.h" #include "undo.h" #include "uedit.h" #include "pw.h" static void disppw(bw,flg) BW *bw; { W *w=bw->parent; PW *pw=(PW *)bw->object; if(!flg) return; /* Scroll buffer and position prompt */ if(pw->promptlen>w->w/2+w->w/4) { pw->promptofst=pw->promptlen-w->w/2; if(piscol(bw->cursor)<w->w-(pw->promptlen-pw->promptofst)) bw->offset=0; else bw->offset=piscol(bw->cursor)-(w->w-(pw->promptlen-pw->promptofst)-1); } else { if(piscol(bw->cursor)<w->w-pw->promptlen) pw->promptofst=0, bw->offset=0; else if(piscol(bw->cursor)>=w->w) pw->promptofst=pw->promptlen, bw->offset=piscol(bw->cursor)-(w->w-1); else pw->promptofst=pw->promptlen-(w->w-piscol(bw->cursor)-1), bw->offset=piscol(bw->cursor)-(w->w-(pw->promptlen-pw->promptofst)-1); } /* Set cursor position */ w->curx=piscol(bw->cursor)-bw->offset+pw->promptlen-pw->promptofst; w->cury=0; /* Generate prompt */ w->t->t->updtab[w->y]=1; genfmt(w->t->t,w->x,w->y,pw->promptofst,pw->prompt,0); /* Position and size buffer */ bwmove(bw,w->x+pw->promptlen-pw->promptofst,w->y); bwresz(bw,w->w-(pw->promptlen-pw->promptofst),1); /* Generate buffer */ bwgen(bw,0); } /* When user hits return in a prompt window */ extern int dostaupd; int rtnpw(bw) BW *bw; { W *w=bw->parent; PW *pw=(PW *)bw->object; char *s; W *win; int *notify; int (*pfunc)(); void *object; long byte; peol(bw->cursor); byte=bw->cursor->byte; pbol(bw->cursor); s=brvs(bw->cursor,(int)(byte-bw->cursor->byte)); if(pw->hist) if(bw->b->changed) { P *q=pdup(pw->hist->eof); binsm(q,s,(int)(byte-bw->cursor->byte)); peof(q); binsc(q,'\n'); prm(q); } else { P *q=pdup(pw->hist->bof); P *r; P *t; pline(q,bw->cursor->line); r=pdup(q); pnextl(r); t=pdup(pw->hist->eof); binsb(t,bcpy(q,r)); bdel(q,r); prm(q); prm(r); prm(t); } win=w->win; pfunc=pw->pfunc; object=pw->object; bwrm(bw); free(pw->prompt); free(pw); w->object=0; notify=w->notify; w->notify=0; wabort(w); dostaupd=1; if(pfunc) return pfunc(win->object,s,object,notify); else return -1; } int ucmplt(bw,k) BW *bw; { PW *pw=(PW *)bw->object; if(pw->tab) return pw->tab(bw,k); else return -1; } static void inspw(bw,b,l,n,flg) BW *bw; B *b; long l,n; int flg; { if(b==bw->b) bwins(bw,l,n,flg); } static void delpw(bw,b,l,n,flg) BW *bw; B *b; long l,n; int flg; { if(b==bw->b) bwdel(bw,l,n,flg); } static int abortpw(b) BW *b; { PW *pw=b->object; void *object=pw->object; int (*abrt)()=pw->abrt; W *win=b->parent->win; bwrm(b); free(pw->prompt); free(pw); if(abrt) return abrt(win->object,object); else return -1; } static WATOM watompw= { "prompt", disppw, bwfllw, abortpw, rtnpw, utypebw, 0, 0, inspw, delpw, TYPEPW }; /* Create a prompt window */ BW *wmkpw(obw,prompt,history,func,huh,abrt,tab,object,notify) BASE *obw; char *prompt; B **history; int (*func)(); char *huh; int (*abrt)(); int (*tab)(); void *object; int *notify; { W *new; PW *pw; BW *bw; W *w=obw->parent; new=wcreate(w->t,&watompw,w,w,w->main,1,huh,notify); if(!new) { if(notify) *notify=1; return 0; } wfit(new->t); new->object=(void *)(bw=bwmk(new,bmk(NULL),1)); bw->object=(void *)(pw=(PW *)malloc(sizeof(PW))); pw->abrt=abrt; pw->tab=tab; pw->object=object; pw->prompt=zdup(prompt); pw->promptlen=fmtlen(prompt); pw->promptofst=0; pw->pfunc=func; if(history) { if(!*history) *history=bmk(NULL); pw->hist= *history; binsb(bw->cursor,bcpy(pw->hist->bof,pw->hist->eof)); bw->b->changed=0; peof(bw->cursor); peof(bw->top); pbol(bw->top); } else pw->hist=0; w->t->curwin=new; return bw; }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.