mirror of
https://github.com/0intro/wmii
synced 2025-01-11 12:49:38 +03:00
Merge, it seems
This commit is contained in:
commit
5db9954834
30
TODO.wmii-4
30
TODO.wmii-4
@ -1,14 +1,16 @@
|
||||
- fs2.c refactorings
|
||||
- implement /lbar/ and /rbar/ (first label of /rbar/ should take up the rest available space)
|
||||
- make frames view-specific, do not destroy them during send_to_area's within a view (allows faster checks for client_of_view etc).
|
||||
- idea for column mode: add collapsing to each Frame, add revert Xrectangle, remove column modes, add max flag to each Frame (maximizes to area until next navigation action within this area)
|
||||
- do better relaxation (remove /def/border and calculate borders dynamically)
|
||||
- re-introduce mouse based resizals (titlebar and border)
|
||||
- liblitz: window abstraction (creation, events), can be reused in menu and bar
|
||||
and frames
|
||||
- tagbars and grab-boxes (like in acme)
|
||||
- screen dimension rescaling if screen resolution changes (even with Xrandr)
|
||||
- Xinerama support
|
||||
- partial EWMH support
|
||||
- libixp: idea from PoP: implement a va_args method similiar to printf for
|
||||
marshalling 9P messages, might reduce LOC drastically
|
||||
- Make frames view-specific, do not destroy them during send_to_area's within a view (allows faster checks for client_of_view etc).
|
||||
- Add collapsing to each Frame, add revert Xrectangle, remove column modes, add max flag to each Frame (maximizes to area until next navigation action within this area)
|
||||
- Editable tag bars
|
||||
- Grab boxes
|
||||
- Enable border based resizals (think about removal of /def/grabmode then)
|
||||
- New events file system interface
|
||||
- "Sticky" floating windows (scratchpad layer)
|
||||
- Do better relaxation (remove /def/border and calculate borders dynamically)
|
||||
- Resizable managed area
|
||||
- Proper managed mode resizing and movement (ie., col based based rather than arbitrary)
|
||||
- Xinerama support(?)
|
||||
- Screen dimension rescaling if screen resolution changes (even with Xrandr)
|
||||
- Partial EWMH support
|
||||
- Workaround for apps that miss resize events
|
||||
- wmiisystray
|
||||
- Plumbing for tag bar
|
||||
|
@ -777,7 +777,7 @@ apply_tags(Client *c, const char *tags)
|
||||
update_client_views(c, toks);
|
||||
|
||||
XChangeProperty(blz.display, c->win, tags_atom, XA_STRING, 8,
|
||||
PropModeReplace, c->tags, strlen(c->tags));
|
||||
PropModeReplace, (unsigned char *)c->tags, strlen(c->tags));
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -79,7 +79,7 @@ handle_buttonrelease(XEvent *e)
|
||||
}
|
||||
else if((f = frame_of_win(ev->window))) {
|
||||
if(blitz_brelease_input(&f->tagbar, ev->x, ev->y))
|
||||
map_frame(f, &f->tagbar.rect);
|
||||
draw_frame(f);
|
||||
write_event("ClientClick %d %d\n", idx_of_client(f->client), ev->button);
|
||||
}
|
||||
}
|
||||
@ -92,7 +92,7 @@ handle_motionnotify(XEvent *e)
|
||||
|
||||
if((f = frame_of_win(ev->window))) {
|
||||
if(blitz_bmotion_input(&f->tagbar, ev->x, ev->y))
|
||||
map_frame(f, &f->tagbar.rect);
|
||||
draw_frame(f);
|
||||
}
|
||||
}
|
||||
|
||||
@ -105,7 +105,7 @@ handle_buttonpress(XEvent *e)
|
||||
if((f = frame_of_win(ev->window))) {
|
||||
ev->state &= valid_mask;
|
||||
if(blitz_bpress_input(&f->tagbar, ev->x, ev->y))
|
||||
map_frame(f, &f->tagbar.rect);
|
||||
draw_frame(f);
|
||||
if((ev->state & def.mod) == def.mod) {
|
||||
focus(f->client, True);
|
||||
switch(ev->button) {
|
||||
|
@ -43,6 +43,8 @@ create_frame(Client *c, View *v)
|
||||
f->tagbar.gc = c->gc;
|
||||
f->tagbar.font = &def.font;
|
||||
f->tagbar.color = def.normcolor;
|
||||
f->tagbar.text = c->tags;
|
||||
f->tagbar.size = sizeof(c->tags);
|
||||
|
||||
return f;
|
||||
}
|
||||
@ -86,20 +88,11 @@ update_frame_widget_colors(Frame *f)
|
||||
f->posbar.color = def.normcolor;
|
||||
}
|
||||
|
||||
void
|
||||
map_frame(Frame *f, XRectangle *r)
|
||||
{
|
||||
XCopyArea(blz.display, pmap, f->client->framewin, f->client->gc,
|
||||
r->x, r->y, r->width, r->height, r->x, r->y);
|
||||
XSync(blz.display, False);
|
||||
}
|
||||
|
||||
void
|
||||
draw_frame(Frame *f)
|
||||
{
|
||||
Frame *p;
|
||||
unsigned int fidx, size, w;
|
||||
XRectangle r = f->rect;
|
||||
|
||||
for(fidx=0, p=f->area->frame; p && p != f; p=p->anext, fidx++);
|
||||
for(size=fidx; p; p=p->anext, size++);
|
||||
@ -123,9 +116,7 @@ draw_frame(Frame *f)
|
||||
/* tag bar */
|
||||
f->tagbar.rect = f->posbar.rect;
|
||||
f->tagbar.rect.x = 0;
|
||||
f->tagbar.rect.width = def.testtags ?
|
||||
f->tagbar.rect.height + blitz_textwidth(&def.font, def.testtags) :
|
||||
f->tagbar.rect.height + blitz_textwidth(&def.font, f->client->tags);
|
||||
f->tagbar.rect.width = f->tagbar.rect.height + blitz_textwidth(&def.font, f->tagbar.text);
|
||||
|
||||
if(f->tagbar.rect.width > f->rect.width / 3)
|
||||
f->tagbar.rect.width = f->rect.width / 3;
|
||||
@ -135,12 +126,12 @@ draw_frame(Frame *f)
|
||||
f->titlebar.rect.width = f->rect.width - (f->tagbar.rect.width + f->posbar.rect.width);
|
||||
|
||||
blitz_draw_tile(&f->tile);
|
||||
f->tagbar.text = def.testtags ? def.testtags : f->client->tags;
|
||||
blitz_draw_input(&f->tagbar);
|
||||
blitz_draw_label(&f->titlebar, f->client->name);
|
||||
blitz_draw_label(&f->posbar, buffer);
|
||||
r.x = r.y = 0;
|
||||
map_frame(f, &r);
|
||||
XCopyArea(blz.display, pmap, f->client->framewin, f->client->gc,
|
||||
0, 0, f->rect.width, f->rect.height, 0, 0);
|
||||
XSync(blz.display, False);
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -288,11 +288,6 @@ message_root(char *message)
|
||||
def.mod = mod;
|
||||
if(view)
|
||||
restack_view(sel);
|
||||
}else if(!strncmp(message, "testtags ", 9)) {
|
||||
message += 9;
|
||||
free(def.testtags);
|
||||
def.testtags = strlen(message) ? strdup(message) : nil;
|
||||
draw_frames();
|
||||
}else
|
||||
return Ebadcmd;
|
||||
|
||||
@ -310,8 +305,6 @@ read_root_ctl()
|
||||
i += snprintf(&buffer[i], (BUFFER_SIZE - i), "font %s\n", def.font.fontstr);
|
||||
i += snprintf(&buffer[i], (BUFFER_SIZE - i), "grabmod %s\n", def.grabmod);
|
||||
i += snprintf(&buffer[i], (BUFFER_SIZE - i), "border %d\n", def.border);
|
||||
if(def.testtags)
|
||||
i += snprintf(&buffer[i], (BUFFER_SIZE - i), "testtags %s\n", def.testtags);
|
||||
return buffer;
|
||||
}
|
||||
|
||||
|
@ -156,7 +156,6 @@ typedef struct {
|
||||
unsigned int border;
|
||||
unsigned int snap;
|
||||
char *keys;
|
||||
char *testtags;
|
||||
unsigned int keyssz;
|
||||
Rules tagrules;
|
||||
Rules colrules;
|
||||
@ -265,7 +264,6 @@ void insert_frame(Frame *pos, Frame *f, Bool before);
|
||||
void draw_frame(Frame *f);
|
||||
void draw_frames();
|
||||
void update_frame_widget_colors(Frame *f);
|
||||
void map_frame(Frame *f, XRectangle *r);
|
||||
|
||||
/* fs.c */
|
||||
void fs_attach(P9Req *r);
|
||||
|
@ -47,8 +47,6 @@ struct BlitzFont {
|
||||
XFontSet set;
|
||||
int ascent;
|
||||
int descent;
|
||||
int rbearing;
|
||||
int lbearing;
|
||||
char *fontstr;
|
||||
};
|
||||
|
||||
@ -90,6 +88,7 @@ void blitz_drawbg(Display *dpy, Drawable drawable, GC gc,
|
||||
|
||||
/* font.c */
|
||||
unsigned int blitz_textwidth(BlitzFont *font, char *text);
|
||||
unsigned int blitz_textwidth_l(BlitzFont *font, char *text, unsigned int len);
|
||||
void blitz_loadfont(Blitz *blitz, BlitzFont *font);
|
||||
|
||||
/* input.c */
|
||||
|
@ -12,14 +12,20 @@
|
||||
#include "blitz.h"
|
||||
|
||||
unsigned int
|
||||
blitz_textwidth(BlitzFont *font, char *text)
|
||||
blitz_textwidth_l(BlitzFont *font, char *text, unsigned int len)
|
||||
{
|
||||
if(font->set) {
|
||||
XRectangle r;
|
||||
XmbTextExtents(font->set, text, strlen(text), nil, &r);
|
||||
XmbTextExtents(font->set, text, len, nil, &r);
|
||||
return r.width;
|
||||
}
|
||||
return XTextWidth(font->xfont, text, strlen(text));
|
||||
return XTextWidth(font->xfont, text, len);
|
||||
}
|
||||
|
||||
unsigned int
|
||||
blitz_textwidth(BlitzFont *font, char *text)
|
||||
{
|
||||
return blitz_textwidth_l(font, text, strlen(text));
|
||||
}
|
||||
|
||||
void
|
||||
@ -56,10 +62,6 @@ blitz_loadfont(Blitz *blitz, BlitzFont *font)
|
||||
font->ascent = (*xfonts)->ascent;
|
||||
if(font->descent < (*xfonts)->descent)
|
||||
font->descent = (*xfonts)->descent;
|
||||
if(font->rbearing < (*xfonts)->max_bounds.rbearing)
|
||||
font->rbearing = (*xfonts)->max_bounds.rbearing;
|
||||
if(font->lbearing < (*xfonts)->min_bounds.lbearing)
|
||||
font->lbearing = (*xfonts)->min_bounds.lbearing;
|
||||
xfonts++;
|
||||
}
|
||||
}
|
||||
@ -78,7 +80,5 @@ blitz_loadfont(Blitz *blitz, BlitzFont *font)
|
||||
}
|
||||
font->ascent = font->xfont->ascent;
|
||||
font->descent = font->xfont->descent;
|
||||
font->rbearing = font->xfont->max_bounds.rbearing;
|
||||
font->lbearing = font->xfont->min_bounds.lbearing;
|
||||
}
|
||||
}
|
||||
|
145
liblitz/input.c
145
liblitz/input.c
@ -32,77 +32,65 @@ xchangegc(BlitzInput *i, BlitzColor *c, Bool invert)
|
||||
|
||||
static void
|
||||
xdrawtextpart(BlitzInput *i, char *start, char *end,
|
||||
int *xoff, int yoff, unsigned int boxw)
|
||||
unsigned int *xoff, unsigned int yoff)
|
||||
{
|
||||
char *p, buf[2];
|
||||
char c;
|
||||
|
||||
buf[1] = 0;
|
||||
for(p = start; p && *p && p != end; p++) {
|
||||
*buf = *p;
|
||||
if(i->font->set)
|
||||
XmbDrawImageString(i->blitz->display, i->drawable, i->font->set, i->gc,
|
||||
*xoff, yoff, buf, 1);
|
||||
else
|
||||
XDrawImageString(i->blitz->display, i->drawable, i->gc, *xoff, yoff,
|
||||
buf, 1);
|
||||
*xoff += boxw;
|
||||
if(!start)
|
||||
return;
|
||||
if(end) {
|
||||
c = *end;
|
||||
*end = 0;
|
||||
}
|
||||
if(i->font->set)
|
||||
XmbDrawImageString(i->blitz->display, i->drawable, i->font->set, i->gc,
|
||||
*xoff, yoff, start, strlen(start));
|
||||
else
|
||||
XDrawImageString(i->blitz->display, i->drawable, i->gc, *xoff, yoff,
|
||||
start, strlen(start));
|
||||
|
||||
*xoff += blitz_textwidth(i->font, start);
|
||||
if(end)
|
||||
*end = c;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
xget_fontmetric(BlitzInput *i, int *x, int *y, unsigned int *w, unsigned int *h)
|
||||
{
|
||||
*w = i->font->rbearing - i->font->lbearing;
|
||||
*h = i->font->ascent + i->font->descent;
|
||||
/* XXX: This is a temporary hack */
|
||||
*x = i->rect.x + (i->rect.height - *h) / 2 + i->font->rbearing;
|
||||
*y = i->rect.y + (i->rect.height - *h) / 2 + i->font->ascent;
|
||||
}
|
||||
|
||||
void
|
||||
blitz_draw_input(BlitzInput *i)
|
||||
{
|
||||
int xoff, yoff;
|
||||
unsigned int boxw, boxh, nbox;
|
||||
unsigned int xoff, yoff;
|
||||
char *start, *end;
|
||||
|
||||
if (!i)
|
||||
return;
|
||||
|
||||
blitz_drawbg(i->blitz->display, i->drawable, i->gc, i->rect, i->color, True);
|
||||
xget_fontmetric(i, &xoff, &yoff, &boxw, &boxh);
|
||||
nbox = i->rect.width / boxw;
|
||||
|
||||
yoff = i->rect.y + (i->rect.height - (i->font->ascent + i->font->descent))
|
||||
/ 2 + i->font->ascent;
|
||||
xoff = i->rect.x + i->rect.height / 2;
|
||||
|
||||
start = end = nil;
|
||||
if(i->curstart && i->curend && i->curstart < i->curend) {
|
||||
start = i->curstart;
|
||||
end = i->curend;
|
||||
}
|
||||
else {
|
||||
start = i->curend;
|
||||
end = i->curstart;
|
||||
}
|
||||
if(end)
|
||||
end++;
|
||||
|
||||
/* draw normal text */
|
||||
xchangegc(i, &i->color, False);
|
||||
xdrawtextpart(i, i->text, i->curstart, &xoff, yoff, boxw);
|
||||
xdrawtextpart(i, i->text, start, &xoff, yoff);
|
||||
/* draw sel text */
|
||||
xchangegc(i, &i->color, True);
|
||||
xdrawtextpart(i, i->curstart, i->curend, &xoff, yoff, boxw);
|
||||
xdrawtextpart(i, start, end, &xoff, yoff);
|
||||
/* draw remaining normal text */
|
||||
xchangegc(i, &i->color, False);
|
||||
xdrawtextpart(i, i->curend, nil, &xoff, yoff, boxw);
|
||||
}
|
||||
|
||||
static char *
|
||||
charof(BlitzInput *i, int x, int y)
|
||||
{
|
||||
int xoff, yoff;
|
||||
unsigned int boxw, boxh, nbox, cbox, l;
|
||||
|
||||
if(!i->text || (y < i->rect.y) || (y > i->rect.y + i->rect.height))
|
||||
return nil;
|
||||
xget_fontmetric(i, &xoff, &yoff, &boxw, &boxh);
|
||||
nbox = i->rect.width / boxw;
|
||||
cbox = (x - i->rect.x) / boxw;
|
||||
|
||||
if(cbox > nbox)
|
||||
return nil;
|
||||
|
||||
if((l = strlen(i->text)) > cbox)
|
||||
return i->text + cbox;
|
||||
else
|
||||
return i->text + l;
|
||||
xdrawtextpart(i, end, nil, &xoff, yoff);
|
||||
}
|
||||
|
||||
Bool
|
||||
@ -112,21 +100,46 @@ blitz_ispointinrect(int x, int y, XRectangle * r)
|
||||
&& (y >= r->y) && (y <= r->y + r->height);
|
||||
}
|
||||
|
||||
static char *
|
||||
xcharof(BlitzInput *i, int x, char *start, unsigned int len)
|
||||
{
|
||||
unsigned int piv, tw;
|
||||
|
||||
if(!(piv = len / 2))
|
||||
return start; /* found */
|
||||
|
||||
tw = blitz_textwidth_l(i->font, start, piv);
|
||||
|
||||
if(x < tw)
|
||||
return xcharof(i, x, start, piv);
|
||||
else
|
||||
return xcharof(i, x - tw, start + piv, strlen(start + piv));
|
||||
}
|
||||
|
||||
static char *
|
||||
charof(BlitzInput *i, int x, int y)
|
||||
{
|
||||
if(!i->text || !blitz_ispointinrect(x, y, &i->rect))
|
||||
return nil;
|
||||
|
||||
/* normalize x */
|
||||
if((x -= (i->rect.x + i->rect.height / 2)) < 0)
|
||||
return nil;
|
||||
|
||||
return xcharof(i, x, i->text, strlen(i->text));
|
||||
}
|
||||
|
||||
Bool
|
||||
blitz_bpress_input(BlitzInput *i, int x, int y)
|
||||
{
|
||||
char *ostart, *oend;
|
||||
|
||||
if(!blitz_ispointinrect(x, y, &i->rect))
|
||||
if(!(i->drag = blitz_ispointinrect(x, y, &i->rect)))
|
||||
return False;
|
||||
ostart = i->curstart;
|
||||
oend = i->curend;
|
||||
i->curstart = i->curend = charof(i, x, y);
|
||||
i->drag = True;
|
||||
if((i->curstart == ostart) && (i->curend == oend))
|
||||
return False;
|
||||
blitz_draw_input(i);
|
||||
return True;
|
||||
return (i->curstart == ostart) && (i->curend == oend);
|
||||
}
|
||||
|
||||
Bool
|
||||
@ -134,15 +147,13 @@ blitz_brelease_input(BlitzInput *i, int x, int y)
|
||||
{
|
||||
char *oend;
|
||||
|
||||
if(!blitz_ispointinrect(x, y, &i->rect))
|
||||
if(!(i->drag = blitz_ispointinrect(x, y, &i->rect)) ||
|
||||
!i->curstart)
|
||||
return False;
|
||||
oend = i->curend;
|
||||
i->curend = charof(i, x, y);
|
||||
i->drag = False;
|
||||
if(i->curend == oend)
|
||||
return False;
|
||||
blitz_draw_input(i);
|
||||
return True;
|
||||
return i->curend == oend;
|
||||
}
|
||||
|
||||
Bool
|
||||
@ -150,17 +161,11 @@ blitz_bmotion_input(BlitzInput *i, int x, int y)
|
||||
{
|
||||
char *oend;
|
||||
|
||||
if(!i->drag || !blitz_ispointinrect(x, y, &i->rect))
|
||||
if(!i->drag || !(i->drag = blitz_ispointinrect(x, y, &i->rect))
|
||||
|| !i->curstart)
|
||||
return False;
|
||||
|
||||
oend = i->curend;
|
||||
i->curend = charof(i, x, y);
|
||||
if(i->curend == oend)
|
||||
return False;
|
||||
if(i->curstart > i->curend) {
|
||||
char *tmp = i->curend;
|
||||
i->curend = i->curstart;
|
||||
i->curstart = tmp;
|
||||
}
|
||||
return True;
|
||||
return i->curend == oend;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user