tags are trimmed from " \t" now, added $MODKEY-Shift-{j,k} and $MODKEY-Button2 for swapping (mouse-based)

This commit is contained in:
Anselm R. Garbe 2006-05-04 14:34:44 +02:00
parent 7afc36f949
commit dd782be04f
10 changed files with 110 additions and 15 deletions

View File

@ -108,6 +108,7 @@ update_client_grab(Client *c, Bool is_sel)
if(is_sel) { if(is_sel) {
ungrab_mouse(c->framewin, AnyModifier, AnyButton); ungrab_mouse(c->framewin, AnyModifier, AnyButton);
grab_mouse(c->framewin, def.mod, Button1); grab_mouse(c->framewin, def.mod, Button1);
grab_mouse(c->framewin, def.mod, Button2);
grab_mouse(c->framewin, def.mod, Button3); grab_mouse(c->framewin, def.mod, Button3);
} }
else else
@ -540,6 +541,41 @@ select_client(Client *c, char *arg)
flush_masked_events(EnterWindowMask); flush_masked_events(EnterWindowMask);
} }
void
swap_clients(Client *c, XPoint *pt)
{
unsigned int i, j;
Frame *f1 = c->frame.data[c->sel], *f2 = nil;
for(i = 1; i < view.data[sel]->area.size; i++) {
Area *a = view.data[sel]->area.data[i];
if(blitz_ispointinrect(pt->x, pt->y, &a->rect)) {
for(j = 0; j < a->frame.size; j++) {
if(blitz_ispointinrect(pt->x, pt->y, &a->frame.data[j]->rect)) {
f2 = a->frame.data[j];
break;
}
}
break;
}
}
if(!f2 || f1 == f2 || !idx_of_area(f1->area))
return;
f1->client = f2->client;
f2->client = c;
f1->client->frame.data[f1->client->sel] = f1;
f2->client->frame.data[f2->client->sel] = f2;
arrange_column(f1->area, False);
if(f1->area != f2->area)
arrange_column(f2->area, False);
focus_client(c, True);
flush_masked_events(EnterWindowMask);
}
void void
swap_client(Client *c, char *arg) swap_client(Client *c, char *arg)
{ {

View File

@ -99,14 +99,24 @@ handle_buttonpress(XEvent *e)
if(ev->state & def.mod) { if(ev->state & def.mod) {
if((ev->button == Button1 || ev->button == Button3)) if((ev->button == Button1 || ev->button == Button3))
focus(c, True); focus(c, True);
if(ev->button == Button1) switch(ev->button) {
do_mouse_move(c, ev); case Button1:
else if (ev->button == Button3) { do_mouse_move(c, ev, False);
BlitzAlign align = blitz_align_of_rect(&c->rect, ev->x, ev->y); break;
if(align != CENTER) case Button2:
do_mouse_resize(c, ev, align); if(idx_of_area(c->frame.data[c->sel]->area))
else do_mouse_move(c, ev, True);
do_mouse_move(c, ev); break;
case Button3:
{
BlitzAlign align = blitz_align_of_rect(&c->rect, ev->x, ev->y);
if(align != CENTER)
do_mouse_resize(c, ev, align);
else
do_mouse_move(c, ev, False);
}
default:
break;
} }
} }
else if(ev->button == Button1) else if(ev->button == Button1)

View File

@ -1369,6 +1369,7 @@ xwrite(IXPConn *c, Fcall *fcall)
else else
cl = client.data[i1]; cl = client.data[i1];
cext_strlcpy(cl->tags, buf, sizeof(cl->tags)); cext_strlcpy(cl->tags, buf, sizeof(cl->tags));
cext_trim(cl->tags, " \t");
update_views(); update_views();
draw_client(cl); draw_client(cl);
break; break;

View File

@ -199,7 +199,7 @@ draw_pseudo_border(XRectangle * r)
} }
void void
do_mouse_move(Client *c, XButtonPressedEvent *e) do_mouse_move(Client *c, XButtonPressedEvent *e, Bool swap)
{ {
int px = 0, py = 0, wex, wey, ex, ey, first = 1, i; int px = 0, py = 0, wex, wey, ex, ey, first = 1, i;
Window dummy; Window dummy;
@ -236,8 +236,12 @@ do_mouse_move(Client *c, XButtonPressedEvent *e)
case ButtonRelease: case ButtonRelease:
if(!first) { if(!first) {
draw_pseudo_border(&frect); draw_pseudo_border(&frect);
if(idx_of_area(f->area)) if(idx_of_area(f->area)) {
resize_column(c, &frect, &pt); if(swap)
swap_clients(c, &pt);
else
resize_column(c, &frect, &pt);
}
else else
resize_client(c, &frect, False); resize_client(c, &frect, False);
} }

View File

@ -114,6 +114,7 @@ update_rules()
Rule *rul = cext_emallocz(sizeof(Rule)); Rule *rul = cext_emallocz(sizeof(Rule));
rul->is_valid = !regcomp(&rul->regex, regex, 0); rul->is_valid = !regcomp(&rul->regex, regex, 0);
cext_strlcpy(rul->tags, tags, sizeof(rul->tags)); cext_strlcpy(rul->tags, tags, sizeof(rul->tags));
cext_trim(rul->tags, " \t");
cext_vattach(vector_of_rules(&rule), rul); cext_vattach(vector_of_rules(&rule), rul);
} }
else else
@ -122,8 +123,6 @@ update_rules()
mode = IGNORE; mode = IGNORE;
} }
else { else {
if(*p == ' ' || *p == '\t')
continue; /* skip whitespaces */
*t = *p; *t = *p;
t++; t++;
} }

View File

@ -229,6 +229,7 @@ void select_client(Client *c, char *arg);
void send_client_to(Client *c, char *arg); void send_client_to(Client *c, char *arg);
void resize_all_clients(); void resize_all_clients();
void swap_client(Client *c, char *arg); void swap_client(Client *c, char *arg);
void swap_clients(Client *c, XPoint *pt);
Client *sel_client(); Client *sel_client();
int idx_of_client_id(unsigned short id); int idx_of_client_id(unsigned short id);
Client *client_of_win(Window w); Client *client_of_win(Window w);
@ -270,7 +271,7 @@ unsigned long mod_key_of_str(char *val);
/* mouse.c */ /* mouse.c */
void do_mouse_resize(Client *c, XButtonPressedEvent *e, BlitzAlign align); void do_mouse_resize(Client *c, XButtonPressedEvent *e, BlitzAlign align);
void do_mouse_move(Client *c, XButtonPressedEvent *e); void do_mouse_move(Client *c, XButtonPressedEvent *e, Bool swap);
void grab_mouse(Window w, unsigned long mod, unsigned int button); void grab_mouse(Window w, unsigned long mod, unsigned int button);
void ungrab_mouse(Window w, unsigned long mod, unsigned int button); void ungrab_mouse(Window w, unsigned long mod, unsigned int button);

View File

@ -3,7 +3,7 @@
include ../config.mk include ../config.mk
SRC = emallocz.c estrdup.c strlcat.c strlcpy.c strtonum.c tokenize.c vector.c SRC = emallocz.c estrdup.c strlcat.c strlcpy.c strtonum.c tokenize.c trim.c vector.c
OBJ = ${SRC:.c=.o} OBJ = ${SRC:.c=.o}

View File

@ -28,6 +28,9 @@ long long cext_strtonum(const char *numstr, long long minval,
/* tokenize.c */ /* tokenize.c */
unsigned int cext_tokenize(char **result, unsigned int reslen, char *str, char delim); unsigned int cext_tokenize(char **result, unsigned int reslen, char *str, char delim);
/* trim.c */
void cext_trim(char *str, const char *chars);
/* vector.c */ /* vector.c */
#define VECTOR(name, type) \ #define VECTOR(name, type) \
typedef struct { \ typedef struct { \

35
libcext/trim.c Normal file
View File

@ -0,0 +1,35 @@
/*
* Copyright (c) MMVI Anselm R. Garbe <garbeam@wmii.de>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#include "cext.h"
/*
* Removes all characters in chars from str.
*/
void
cext_trim(char *str, const char *chars)
{
const char *cp;
char *sp, *sn;
for(cp = chars; *cp; cp++) {
for(sp = sn = str; *sn; sn++) {
if(*sn != *cp)
*(sp++) = *sn;
}
*sp = 0;
}
}

View File

@ -82,6 +82,8 @@ $MODKEY-9
$MODKEY-Return $MODKEY-Return
$MODKEY-Shift-$LEFT $MODKEY-Shift-$LEFT
$MODKEY-Shift-$RIGHT $MODKEY-Shift-$RIGHT
$MODKEY-Shift-$UP
$MODKEY-Shift-$DOWN
$MODKEY-Shift-space $MODKEY-Shift-space
$MODKEY-Shift-c $MODKEY-Shift-c
$MODKEY-Shift-t $MODKEY-Shift-t
@ -149,6 +151,10 @@ do
xwrite /view/sel/sel/ctl sendto prev;; xwrite /view/sel/sel/ctl sendto prev;;
$MODKEY-Shift-$RIGHT) $MODKEY-Shift-$RIGHT)
xwrite /view/sel/sel/ctl sendto next;; xwrite /view/sel/sel/ctl sendto next;;
$MODKEY-Shift-$DOWN)
xwrite /view/sel/sel/ctl swap down;;
$MODKEY-Shift-$UP)
xwrite /view/sel/sel/ctl swap up;;
$MODKEY-Shift-space) $MODKEY-Shift-space)
xwrite /view/sel/sel/ctl sendto toggle;; xwrite /view/sel/sel/ctl sendto toggle;;
$MODKEY-Shift-c) $MODKEY-Shift-c)