mothra: fix alt display resizing, filter control characters in panel entries, use uslstr() instead of selection->fullname as fullname gets truncated in selurl()

This commit is contained in:
cinap_lenrek 2011-10-20 11:29:27 +02:00
parent e2ed2a0b7e
commit b697e8655a
3 changed files with 40 additions and 34 deletions

View file

@ -19,6 +19,8 @@
#include <event.h> #include <event.h>
#include <panel.h> #include <panel.h>
#include "pldefs.h" #include "pldefs.h"
#include <keyboard.h>
typedef struct Edit Edit; typedef struct Edit Edit;
struct Edit{ struct Edit{
Point minsize; Point minsize;
@ -122,15 +124,15 @@ void pl_typeedit(Panel *p, Rune c){
t->b=p->b; t->b=p->b;
twhilite(t, ep->sel0, ep->sel1, 0); twhilite(t, ep->sel0, ep->sel1, 0);
switch(c){ switch(c){
case '\b': case Kbs: /* ^H: erase character */
if(ep->sel0!=0) --ep->sel0; if(ep->sel0!=0) --ep->sel0;
twreplace(t, ep->sel0, ep->sel1, 0, 0); twreplace(t, ep->sel0, ep->sel1, 0, 0);
break; break;
case '\025': /* ctrl-u */ case Knack: /* ^U: erase line */
while(ep->sel0!=0 && t->text[ep->sel0-1]!='\n') --ep->sel0; while(ep->sel0!=0 && t->text[ep->sel0-1]!='\n') --ep->sel0;
twreplace(t, ep->sel0, ep->sel1, 0, 0); twreplace(t, ep->sel0, ep->sel1, 0, 0);
break; break;
case '\027': /* ctrl-w */ case Ketb: /* ^W: erase word */
while(ep->sel0!=0 && !pl_idchar(t->text[ep->sel0-1])) --ep->sel0; while(ep->sel0!=0 && !pl_idchar(t->text[ep->sel0-1])) --ep->sel0;
while(ep->sel0!=0 && pl_idchar(t->text[ep->sel0-1])) --ep->sel0; while(ep->sel0!=0 && pl_idchar(t->text[ep->sel0-1])) --ep->sel0;
twreplace(t, ep->sel0, ep->sel1, 0, 0); twreplace(t, ep->sel0, ep->sel1, 0, 0);

View file

@ -4,6 +4,8 @@
#include <event.h> #include <event.h>
#include <panel.h> #include <panel.h>
#include "pldefs.h" #include "pldefs.h"
#include <keyboard.h>
typedef struct Entry Entry; typedef struct Entry Entry;
struct Entry{ struct Entry{
char *entry; char *entry;
@ -47,15 +49,15 @@ void pl_typeentry(Panel *p, Rune c){
*ep->entp='\0'; *ep->entp='\0';
if(ep->hit) ep->hit(p, ep->entry); if(ep->hit) ep->hit(p, ep->entry);
return; return;
case 025: /* ctrl-u */ case Knack: /* ^U: erase line */
ep->entp=ep->entry; ep->entp=ep->entry;
*ep->entp='\0'; *ep->entp='\0';
break; break;
case '\b': case Kbs: /* ^H: erase character */
while(ep->entp!=ep->entry && !pl_rune1st(ep->entp[-1])) *--ep->entp='\0'; while(ep->entp!=ep->entry && !pl_rune1st(ep->entp[-1])) *--ep->entp='\0';
if(ep->entp!=ep->entry) *--ep->entp='\0'; if(ep->entp!=ep->entry) *--ep->entp='\0';
break; break;
case 027: /* ctrl-w */ case Ketb: /* ^W: erase word */
while(ep->entp!=ep->entry && !pl_idchar(ep->entp[-1])) while(ep->entp!=ep->entry && !pl_idchar(ep->entp[-1]))
--ep->entp; --ep->entp;
while(ep->entp!=ep->entry && pl_idchar(ep->entp[-1])) while(ep->entp!=ep->entry && pl_idchar(ep->entp[-1]))
@ -63,6 +65,8 @@ void pl_typeentry(Panel *p, Rune c){
*ep->entp='\0'; *ep->entp='\0';
break; break;
default: default:
if(c < 0x20 || c == Kesc || c == Kdel || (c & 0xFF00) == KF || (c & 0xFF00) == Spec)
break;
ep->entp+=runetochar(ep->entp, &c); ep->entp+=runetochar(ep->entp, &c);
if(ep->entp>ep->eent){ if(ep->entp>ep->eent){
n=ep->entp-ep->entry; n=ep->entp-ep->entry;
@ -77,8 +81,6 @@ void pl_typeentry(Panel *p, Rune c){
break; break;
} }
memset(ep->entp, 0, SLACK); memset(ep->entp, 0, SLACK);
/* strcpy(ep->entp, "◀"); */
pldraw(p, p->b); pldraw(p, p->b);
} }
Point pl_getsizeentry(Panel *p, Point children){ Point pl_getsizeentry(Panel *p, Point children){

View file

@ -92,6 +92,7 @@ int logfile;
int mothmode; int mothmode;
void docmd(Panel *, char *); void docmd(Panel *, char *);
void doprev(Panel *, int, int); void doprev(Panel *, int, int);
char *urlstr(Url *);
void selurl(char *); void selurl(char *);
void setcurrent(int, char *); void setcurrent(int, char *);
char *genwww(Panel *, int); char *genwww(Panel *, int);
@ -449,6 +450,7 @@ void eresized(int new){
plinitlabel(curttl, PACKE|EXPAND, "---"); plinitlabel(curttl, PACKE|EXPAND, "---");
plinitlabel(cururl, PACKE|EXPAND, "---"); plinitlabel(cururl, PACKE|EXPAND, "---");
plpack(root, r); plpack(root, r);
plpack(alt, r);
if(current){ if(current){
plinitlabel(curttl, PACKE|EXPAND, current->title); plinitlabel(curttl, PACKE|EXPAND, current->title);
plinitlabel(cururl, PACKE|EXPAND, current->url->fullname); plinitlabel(cururl, PACKE|EXPAND, current->url->fullname);
@ -611,10 +613,8 @@ char *urltofile(Url *url){
char *name, *slash; char *name, *slash;
if(url == nil) if(url == nil)
return nil; return nil;
if(url->fullname[0]) if(url->fullname[0] || url->reltext[0])
name = url->fullname; name = urlstr(url);
else if(url->reltext[0])
name = url->reltext;
else else
name = "/"; name = "/";
if(slash = strrchr(name, '/')) if(slash = strrchr(name, '/'))
@ -647,12 +647,13 @@ void docmd(Panel *p, char *s){
case 'g': case 'g':
s = arg(s); s = arg(s);
if(*s=='\0'){ if(*s=='\0'){
case 'r':
if(selection) if(selection)
geturl(selection->fullname, GET, 0, 0, 0); s = urlstr(selection);
else else
message("no url selected"); message("no url selected");
} }
else geturl(s, GET, 0, 0, 0); geturl(s, GET, 0, 0, 0);
break; break;
case 'j': case 'j':
s = arg(s); s = arg(s);
@ -661,11 +662,6 @@ void docmd(Panel *p, char *s){
else else
message("Usage: j index"); message("Usage: j index");
break; break;
case 'r':
s = arg(s);
if(*s=='\0' && selection)
geturl(selection->fullname, GET, 0, 0, 0);
break;
case 'W': case 'W':
s = arg(s); s = arg(s);
if(s=='\0'){ if(s=='\0'){
@ -684,15 +680,17 @@ void docmd(Panel *p, char *s){
break; break;
case 's': case 's':
s = arg(s); s = arg(s);
if(selection){ if(!selection){
if(s==0 || *s=='\0') message("no url selected");
s = urltofile(selection); break;
if(s==0 || *s=='\0'){
message("Usage: s file");
break;
}
save(urlopen(selection, GET, 0), s);
} }
if(s==0 || *s=='\0')
s = urltofile(selection);
if(s==0 || *s=='\0'){
message("Usage: s file");
break;
}
save(urlopen(selection, GET, 0), s);
break; break;
case 'q': case 'q':
draw(screen, screen->r, display->white, 0, ZP); draw(screen, screen->r, display->white, 0, ZP);
@ -927,16 +925,21 @@ Err:
return pfd[1]; return pfd[1];
} }
/* char*
* select the file at the given url urlstr(Url *url){
*/ if(url->fullname[0])
return url->fullname;
if(url->reltext[0])
return url->reltext;
return nil;
}
void selurl(char *urlname){ void selurl(char *urlname){
static Url url; static Url url;
seturl(&url, urlname, current? seturl(&url, urlname, current?
current->url->fullname : current->url->fullname :
defurl.fullname); defurl.fullname);
selection=&url; selection=&url;
message("selected: %s", selection->fullname[0] ? selection->fullname : selection->reltext); message("selected: %s", urlstr(selection));
} }
void seturl(Url *url, char *urlname, char *base){ void seturl(Url *url, char *urlname, char *base){
strncpy(url->reltext, urlname, sizeof(url->reltext)); strncpy(url->reltext, urlname, sizeof(url->reltext));
@ -1126,7 +1129,7 @@ void snarf(Panel *p){
int fd; int fd;
fd=create("/dev/snarf", OWRITE, 0666); fd=create("/dev/snarf", OWRITE, 0666);
if(fd>=0){ if(fd>=0){
fprint(fd, "%s", selection->fullname[0] ? selection->fullname : selection->reltext); fprint(fd, "%s", urlstr(selection));
close(fd); close(fd);
} }
} }
@ -1187,8 +1190,7 @@ void hit3(int button, int item){
fprint(fd, "<body><h1>Hit list</h1>\n"); fprint(fd, "<body><h1>Hit list</h1>\n");
} }
seek(fd, 0, 2); seek(fd, 0, 2);
fprint(fd, "<p><a href=\"%s\">%s</a>\n", fprint(fd, "<p><a href=\"%s\">%s</a>\n", urlstr(selection), urlstr(selection));
selection->fullname, selection->fullname);
close(fd); close(fd);
break; break;
case 5: case 5: