diff options
author | cinap_lenrek <cinap_lenrek@gmx.de> | 2012-09-23 20:14:47 +0200 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@gmx.de> | 2012-09-23 20:14:47 +0200 |
commit | 948d0a1180a57f61285abd4a59c7351b6197d3d5 (patch) | |
tree | 338b8581ca00c49a58f3c31dc1522fc9f538692a /sys/src/cmd/mothra/libpanel | |
parent | f68d096fb77889f8cf74ecc383632b105c3da21d (diff) |
mothra: snarf and paste
Diffstat (limited to 'sys/src/cmd/mothra/libpanel')
-rw-r--r-- | sys/src/cmd/mothra/libpanel/draw.c | 1 | ||||
-rw-r--r-- | sys/src/cmd/mothra/libpanel/edit.c | 71 | ||||
-rw-r--r-- | sys/src/cmd/mothra/libpanel/entry.c | 74 | ||||
-rw-r--r-- | sys/src/cmd/mothra/libpanel/event.c | 9 | ||||
-rw-r--r-- | sys/src/cmd/mothra/libpanel/mem.c | 4 | ||||
-rw-r--r-- | sys/src/cmd/mothra/libpanel/mkfile | 3 | ||||
-rw-r--r-- | sys/src/cmd/mothra/libpanel/panel.h | 14 | ||||
-rw-r--r-- | sys/src/cmd/mothra/libpanel/popup.c | 2 | ||||
-rw-r--r-- | sys/src/cmd/mothra/libpanel/rtext.c | 30 | ||||
-rw-r--r-- | sys/src/cmd/mothra/libpanel/textview.c | 15 |
10 files changed, 124 insertions, 99 deletions
diff --git a/sys/src/cmd/mothra/libpanel/draw.c b/sys/src/cmd/mothra/libpanel/draw.c index 733039a4c..fb51a0983 100644 --- a/sys/src/cmd/mothra/libpanel/draw.c +++ b/sys/src/cmd/mothra/libpanel/draw.c @@ -139,6 +139,7 @@ void pl_interior(int state, Point *ul, Point *size){ *size=subpt(*size, Pt(4*FWID+2*SPACE, 4*FWID+2*SPACE)); } } + void pl_drawicon(Image *b, Rectangle r, int stick, int flags, Icon *s){ Rectangle save; Point ul, offs; diff --git a/sys/src/cmd/mothra/libpanel/edit.c b/sys/src/cmd/mothra/libpanel/edit.c index 27bbf435f..f089f3b8e 100644 --- a/sys/src/cmd/mothra/libpanel/edit.c +++ b/sys/src/cmd/mothra/libpanel/edit.c @@ -48,46 +48,25 @@ void pl_drawedit(Panel *p){ if(sb && sb->setscrollbar) sb->setscrollbar(sb, ep->t->top, ep->t->bot, ep->t->etext-ep->t->text); } -void pl_snarfedit(Panel *p, int cut){ - int fd, n, r, s0, s1; - char *s, *x; + +char *pl_snarfedit(Panel *p){ + int s0, s1; Rune *t; - if((fd=open("/dev/snarf", cut ? OWRITE|OTRUNC : OREAD))<0) - return; - if(cut){ - t=pleget(p); - plegetsel(p, &s0, &s1); - if(t==0 || s0>=s1){ - close(fd); - return; - } - s = smprint("%.*S", s1-s0, t+s0); - if((n = strlen(s))>0) - write(fd, s, n); - free(s); - plepaste(p, 0, 0); - }else{ - n=0; - s=nil; - for(;;){ - if((x=realloc(s, n+1024)) == nil){ - free(s); - close(fd); - return; - } - s=x; - if((r = read(fd, s+n, 1024)) <= 0) - break; - n += r; - } - t=runesmprint("%.*s", n, s); + t=pleget(p); + plegetsel(p, &s0, &s1); + if(t==0 || s0>=s1) + return nil; + return smprint("%.*S", s1-s0, t+s0); +} +void pl_pasteedit(Panel *p, char *s){ + Rune *t; + if(t=runesmprint("%s", s)){ plepaste(p, t, runestrlen(t)); - free(s); free(t); } - close(fd); } + /* * Should do double-clicks: * If ep->sel0==ep->sel1 on entry and the @@ -106,18 +85,20 @@ void pl_snarfedit(Panel *p, int cut){ */ int pl_hitedit(Panel *p, Mouse *m){ Edit *ep; - if((m->buttons&7)==1){ + if(m->buttons&1){ + plgrabkb(p); ep=p->data; ep->t->b=p->b; twhilite(ep->t, ep->sel0, ep->sel1, 0); twselect(ep->t, m); ep->sel0=ep->t->sel0; ep->sel1=ep->t->sel1; - plgrabkb(p); - if((m->buttons&7)==3) - pl_snarfedit(p, 1); + if((m->buttons&7)==3){ + plsnarf(p); + plepaste(p, 0, 0); /* cut */ + } else if((m->buttons&7)==5) - pl_snarfedit(p, 0); + plpaste(p); else if(ep->hit) (*ep->hit)(p); } @@ -171,7 +152,13 @@ void pl_typeedit(Panel *p, Rune c){ twhilite(t, ep->sel0, ep->sel1, 0); switch(c){ case Kesc: - pl_snarfedit(p, 1); + plsnarf(p); + plepaste(p, 0, 0); /* cut */ + break; + case Kdel: /* clear */ + ep->sel0=0; + ep->sel1=plelen(p); + plepaste(p, 0, 0); /* cut */ break; case Kbs: /* ^H: erase character */ if(ep->sel0!=0) --ep->sel0; @@ -187,6 +174,8 @@ void pl_typeedit(Panel *p, Rune c){ twreplace(t, ep->sel0, ep->sel1, 0, 0); break; default: + if((c & 0xFF00) == KF || (c & 0xFF00) == Spec) + break; twreplace(t, ep->sel0, ep->sel1, &c, 1); ++ep->sel0; break; @@ -233,6 +222,8 @@ void plinitedit(Panel *v, int flags, Point minsize, Rune *text, int ntext, void v->getsize=pl_getsizeedit; v->childspace=pl_childspaceedit; v->free=pl_freeedit; + v->snarf=pl_snarfedit; + v->paste=pl_pasteedit; v->kind="edit"; ep->hit=hit; ep->minsize=minsize; diff --git a/sys/src/cmd/mothra/libpanel/entry.c b/sys/src/cmd/mothra/libpanel/entry.c index a335706d0..d915e2044 100644 --- a/sys/src/cmd/mothra/libpanel/entry.c +++ b/sys/src/cmd/mothra/libpanel/entry.c @@ -15,35 +15,31 @@ struct Entry{ Point minsize; }; #define SLACK 7 /* enough for one extra rune and ◀ and a nul */ -void pl_snarfentry(Panel *p, int cut){ +char *pl_snarfentry(Panel *p){ Entry *ep; - int fd, n; - char *s; + int n; ep=p->data; - if((fd=open("/dev/snarf", cut ? OWRITE|OTRUNC : OREAD))<0) + n=ep->entp-ep->entry; + if(n<=0) return nil; + return smprint("%.*s", n, ep->entry); +} +void pl_pasteentry(Panel *p, char *s){ + Entry *ep; + char *e; + int n, m; + + ep=p->data; + n=ep->entp-ep->entry; + m=strlen(s); + if((e=realloc(ep->entry,n+m+SLACK))==0) return; - if(cut){ - if((n=ep->entp-ep->entry)>0) - write(fd, ep->entry, n); - ep->entp=ep->entry; - }else{ - n=1024; - s=malloc(n+SLACK); - if(s==0){ - close(fd); - return; - } - if((n=readn(fd, s, n))<0) - n=0; - free(ep->entry); - s=realloc(s, n+SLACK); - ep->entry=s; - ep->eent=s+n; - ep->entp=s+n; - } - close(fd); - *ep->entp='\0'; + ep->entry=e; + e+=n; + strncpy(e, s, m); + e+=m; + *e='\0'; + ep->entp=ep->eent=e; pldraw(p, p->b); } void pl_drawentry(Panel *p){ @@ -68,20 +64,29 @@ void pl_drawentry(Panel *p){ free(s); } int pl_hitentry(Panel *p, Mouse *m){ - if((m->buttons&OUT)==0 && (m->buttons&7)){ + if((m->buttons&7)==1){ plgrabkb(p); p->state=DOWN; pldraw(p, p->b); - while(m->buttons&7){ + while(m->buttons&1){ int old; old=m->buttons; *m=emouse(); if((old&7)==1){ - if((m->buttons&7)==3) - pl_snarfentry(p, 1); + if((m->buttons&7)==3){ + Entry *ep; + + plsnarf(p); + + /* cut */ + ep=p->data; + ep->entp=ep->entry; + *ep->entp='\0'; + pldraw(p, p->b); + } if((m->buttons&7)==5) - pl_snarfentry(p, 0); + plpaste(p); } } p->state=UP; @@ -100,8 +105,9 @@ void pl_typeentry(Panel *p, Rune c){ if(ep->hit) ep->hit(p, ep->entry); return; case Kesc: - pl_snarfentry(p, 1); - return; + plsnarf(p); + /* no break */ + case Kdel: /* clear */ case Knack: /* ^U: erase line */ ep->entp=ep->entry; *ep->entp='\0'; @@ -118,7 +124,7 @@ void pl_typeentry(Panel *p, Rune c){ *ep->entp='\0'; break; default: - if(c < 0x20 || c == Kdel || (c & 0xFF00) == KF || (c & 0xFF00) == Spec) + if(c < 0x20 || (c & 0xFF00) == KF || (c & 0xFF00) == Spec) break; ep->entp+=runetochar(ep->entp, &c); if(ep->entp>ep->eent){ @@ -162,6 +168,8 @@ void plinitentry(Panel *v, int flags, int wid, char *str, void (*hit)(Panel *, c v->childspace=pl_childspaceentry; ep->minsize=Pt(wid, font->height); v->free=pl_freeentry; + v->snarf=pl_snarfentry; + v->paste=pl_pasteentry; elen=100; if(str) elen+=strlen(str); if(ep->entry==nil) diff --git a/sys/src/cmd/mothra/libpanel/event.c b/sys/src/cmd/mothra/libpanel/event.c index 8634c1f5d..08dbf6bd1 100644 --- a/sys/src/cmd/mothra/libpanel/event.c +++ b/sys/src/cmd/mothra/libpanel/event.c @@ -4,16 +4,17 @@ #include <event.h> #include <panel.h> #include "pldefs.h" -Panel *pl_kbfocus; + void plgrabkb(Panel *g){ - pl_kbfocus=g; + plkbfocus=g; } void plkeyboard(Rune c){ - if(pl_kbfocus){ - pl_kbfocus->type(pl_kbfocus, c); + if(plkbfocus){ + plkbfocus->type(plkbfocus, c); flushimage(display, 1); } } + /* * Return the most leafward, highest priority panel containing p */ diff --git a/sys/src/cmd/mothra/libpanel/mem.c b/sys/src/cmd/mothra/libpanel/mem.c index 5ad1371c1..91b08cd1f 100644 --- a/sys/src/cmd/mothra/libpanel/mem.c +++ b/sys/src/cmd/mothra/libpanel/mem.c @@ -89,6 +89,8 @@ Panel *pl_newpanel(Panel *parent, int ndata){ v->scroll=pl_scrollerror; v->setscrollbar=pl_setscrollbarerror; v->free=0; + v->snarf=0; + v->paste=0; if(ndata) v->data=pl_emalloc(ndata); else @@ -99,6 +101,8 @@ void plfree(Panel *p){ Panel *cp, *ncp; if(p==0) return; + if(p==plkbfocus) + plkbfocus=0; for(cp=p->child;cp;cp=ncp){ ncp=cp->next; plfree(cp); diff --git a/sys/src/cmd/mothra/libpanel/mkfile b/sys/src/cmd/mothra/libpanel/mkfile index 9fbbe59b0..5939cb6a6 100644 --- a/sys/src/cmd/mothra/libpanel/mkfile +++ b/sys/src/cmd/mothra/libpanel/mkfile @@ -26,7 +26,8 @@ OFILES=\ slider.$O\ textview.$O\ textwin.$O\ - utf.$O + utf.$O\ + snarf.$O HFILES=panel.h pldefs.h rtext.h diff --git a/sys/src/cmd/mothra/libpanel/panel.h b/sys/src/cmd/mothra/libpanel/panel.h index 4d30f9dba..11351ac6f 100644 --- a/sys/src/cmd/mothra/libpanel/panel.h +++ b/sys/src/cmd/mothra/libpanel/panel.h @@ -55,6 +55,8 @@ struct Panel{ void (*scroll)(Panel *, int, int, int, int); /* scroll bar to scrollee */ void (*setscrollbar)(Panel *, int, int, int); /* scrollee to scroll bar */ void (*free)(Panel *); /* free fields of data when done */ + char* (*snarf)(Panel *); /* snarf text from panel */ + void (*paste)(Panel *, char *); /* paste text into panel */ }; /* * Panel flags @@ -101,6 +103,8 @@ struct Panel{ #define PL_HOT 1 #define PL_SEL 2 +Panel *plkbfocus; /* the panel in keyboard focus */ + int plinit(int); /* initialization */ void plpack(Panel *, Rectangle); /* figure out where to put the Panel & children */ void plmove(Panel *, Point); /* move an already-packed panel to a new location */ @@ -122,6 +126,7 @@ void plescroll(Panel *, int); /* scroll an edit window */ Scroll plgetscroll(Panel *); /* get scrolling information from panel */ void plsetscroll(Panel *, Scroll); /* set scrolling information */ void plplacelabel(Panel *, int); /* label placement */ + /* * Panel creation & reinitialization functions */ @@ -174,7 +179,6 @@ char *plrtsnarftext(Rtext *); int plgetpostextview(Panel *); void plsetpostextview(Panel *, int); -char *plsnarftext(Panel *); /* * Idols @@ -183,3 +187,11 @@ Idol *plmkidol(Idol**, Image*, Image*, char*, void*); void plfreeidol(Idol*); Point plidolsize(Idol*, Font*, int); void *plidollistgetsel(Panel*); + +/* + * Snarf + */ +void plputsnarf(char *); +char *plgetsnarf(void); +void plsnarf(Panel *); /* snarf a panel */ +void plpaste(Panel *); /* paste a panel */ diff --git a/sys/src/cmd/mothra/libpanel/popup.c b/sys/src/cmd/mothra/libpanel/popup.c index 5409f24e4..a3007bbb8 100644 --- a/sys/src/cmd/mothra/libpanel/popup.c +++ b/sys/src/cmd/mothra/libpanel/popup.c @@ -75,6 +75,8 @@ int pl_hitpopup(Panel *g, Mouse *m){ } } plmouse(p, m); + if((m->buttons&7)==0) + g->state=UP; return (m->buttons&7)!=0; } void pl_typepopup(Panel *g, Rune c){ diff --git a/sys/src/cmd/mothra/libpanel/rtext.c b/sys/src/cmd/mothra/libpanel/rtext.c index a3debb55b..1a289c50c 100644 --- a/sys/src/cmd/mothra/libpanel/rtext.c +++ b/sys/src/cmd/mothra/libpanel/rtext.c @@ -291,26 +291,30 @@ void plrtseltext(Rtext *t, Rtext *s, Rtext *e){ } char *plrtsnarftext(Rtext *w){ - char *b, *p, *e; + char *b, *p, *e, *t; int n; - p = e = 0; + b=p=e=0; for(; w; w = w->next){ - if((w->flags&PL_SEL)==0 || w->b!=0 || w->p!=0 || w->text==0) + if((w->flags&PL_SEL)==0 || w->text==0) continue; - n = strlen(w->text)+4; - if((b = realloc(p, (e+n) - p)) == nil) - break; - e = (e - p) + b; - p = b; + n = strlen(w->text)+64; + if(p+n >= e){ + n = (p+n+64)-b; + if((t = realloc(b, n))==0) + break; + p = t+(p-b); + e = t+n; + b = t; + } if(w->space == 0) - e += sprint(e, "%s", w->text); + p += sprint(p, "%s", w->text); else if(w->space > 0) - e += sprint(e, " %s", w->text); + p += sprint(p, " %s", w->text); else if(PL_OP(w->space) == PL_TAB) - e += sprint(e, "\t%s", w->text); + p += sprint(p, "\t%s", w->text); if(w->nextline == w->next) - e += sprint(e, "\n"); + p += sprint(p, "\n"); } - return p; + return b; } diff --git a/sys/src/cmd/mothra/libpanel/textview.c b/sys/src/cmd/mothra/libpanel/textview.c index da38003f9..d50d1a330 100644 --- a/sys/src/cmd/mothra/libpanel/textview.c +++ b/sys/src/cmd/mothra/libpanel/textview.c @@ -52,7 +52,8 @@ void pl_drawtextview(Panel *p){ * If t is a panel word, pass the mouse event on to it */ void pl_passon(Rtext *t, Mouse *m){ - if(t && t->b==0 && t->p!=0) plmouse(t->p, m); + if(t && t->b==0 && t->p!=0) + plmouse(t->p, m); } int pl_hittextview(Panel *p, Mouse *m){ Rtext *oldhitword, *oldhitfirst; @@ -166,6 +167,11 @@ int pl_pritextview(Panel *p, Point xy){ } return PRI_NORMAL; } + +char* pl_snarftextview(Panel *p){ + return plrtsnarftext(((Textview *)p->data)->text); +} + void plinittextview(Panel *v, int flags, Point minsize, Rtext *t, void (*hit)(Panel *, int, Rtext *)){ Textview *tp; tp=v->data; @@ -185,6 +191,7 @@ void plinittextview(Panel *v, int flags, Point minsize, Rtext *t, void (*hit)(Pa tp->hitfirst=0; tp->hitword=0; v->scroll=pl_scrolltextview; + v->snarf=pl_snarftextview; tp->twid=-1; v->scr.pos=Pt(0,0); v->scr.size=Pt(0,1); @@ -202,9 +209,3 @@ void plsetpostextview(Panel *p, int yoffs){ ((Textview *)p->data)->yoffs=yoffs; pldraw(p, p->b); } -char* plsnarftext(Panel *p){ - static char *b = nil; - free(b); - b = plrtsnarftext(((Textview *)p->data)->text); - return b; -} |