mirror of
https://github.com/leahneukirchen/cwm.git
synced 2023-08-10 21:13:12 +03:00
Rip out, burn, and dance around the grave of group-edit mode.
I've yet to speak to anyone who uses it, so just kill it. You can still add/remove from groups using the mouse binding. Groups may get a re-work sometime soon if i have a stroke of genius. knocks about 4k off the i386 binary for me. ok okan@, todd@.
This commit is contained in:
parent
cd46788d85
commit
36c1aac90f
1
calmwm.c
1
calmwm.c
@ -119,7 +119,6 @@ x_setup(char *display_name)
|
|||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
struct screen_ctx *sc;
|
struct screen_ctx *sc;
|
||||||
char *fontname;
|
|
||||||
|
|
||||||
TAILQ_INIT(&Screenq);
|
TAILQ_INIT(&Screenq);
|
||||||
|
|
||||||
|
13
calmwm.h
13
calmwm.h
@ -154,7 +154,6 @@ struct client_ctx {
|
|||||||
|
|
||||||
char *matchname;
|
char *matchname;
|
||||||
struct group_ctx *group;
|
struct group_ctx *group;
|
||||||
int groupcommit;
|
|
||||||
|
|
||||||
int stackingorder;
|
int stackingorder;
|
||||||
|
|
||||||
@ -424,7 +423,6 @@ void kbfunc_client_rcycle(struct client_ctx *cc, void *arg);
|
|||||||
void kbfunc_cmdexec(struct client_ctx *, void *);
|
void kbfunc_cmdexec(struct client_ctx *, void *);
|
||||||
void kbfunc_client_label(struct client_ctx *, void *);
|
void kbfunc_client_label(struct client_ctx *, void *);
|
||||||
void kbfunc_client_delete(struct client_ctx *, void *);
|
void kbfunc_client_delete(struct client_ctx *, void *);
|
||||||
void kbfunc_client_groupselect(struct client_ctx *, void *);
|
|
||||||
void kbfunc_client_group(struct client_ctx *, void *);
|
void kbfunc_client_group(struct client_ctx *, void *);
|
||||||
void kbfunc_client_nextgroup(struct client_ctx *, void *);
|
void kbfunc_client_nextgroup(struct client_ctx *, void *);
|
||||||
void kbfunc_client_prevgroup(struct client_ctx *, void *);
|
void kbfunc_client_prevgroup(struct client_ctx *, void *);
|
||||||
@ -451,22 +449,12 @@ void search_match_text(struct menu_q *, struct menu_q *, char *);
|
|||||||
void search_match_exec(struct menu_q *, struct menu_q *, char *);
|
void search_match_exec(struct menu_q *, struct menu_q *, char *);
|
||||||
|
|
||||||
void group_init(void);
|
void group_init(void);
|
||||||
void group_select(int);
|
|
||||||
void group_enter(void);
|
|
||||||
void group_exit(int);
|
|
||||||
void group_click(struct client_ctx *);
|
|
||||||
void group_display_init(struct screen_ctx *);
|
|
||||||
void group_display_draw(struct screen_ctx *);
|
|
||||||
void group_display_keypress(KeyCode);
|
|
||||||
void group_hidetoggle(int);
|
void group_hidetoggle(int);
|
||||||
void group_slide(int);
|
void group_slide(int);
|
||||||
void group_sticky(struct client_ctx *);
|
void group_sticky(struct client_ctx *);
|
||||||
void group_client_delete(struct client_ctx *);
|
void group_client_delete(struct client_ctx *);
|
||||||
void group_menu(XButtonEvent *);
|
void group_menu(XButtonEvent *);
|
||||||
void group_namemode(void);
|
|
||||||
void group_alltoggle(void);
|
void group_alltoggle(void);
|
||||||
void group_deletecurrent(void);
|
|
||||||
void group_done(void);
|
|
||||||
void group_sticky_toggle_enter(struct client_ctx *);
|
void group_sticky_toggle_enter(struct client_ctx *);
|
||||||
void group_sticky_toggle_exit(struct client_ctx *);
|
void group_sticky_toggle_exit(struct client_ctx *);
|
||||||
void group_autogroup(struct client_ctx *);
|
void group_autogroup(struct client_ctx *);
|
||||||
@ -503,7 +491,6 @@ extern struct client_ctx_q Clientq;
|
|||||||
extern int Doshape, Shape_ev;
|
extern int Doshape, Shape_ev;
|
||||||
extern struct conf Conf;
|
extern struct conf Conf;
|
||||||
|
|
||||||
extern int Groupmode;
|
|
||||||
extern struct fontdesc *DefaultFont;
|
extern struct fontdesc *DefaultFont;
|
||||||
|
|
||||||
|
|
||||||
|
5
client.c
5
client.c
@ -191,10 +191,7 @@ client_new(Window win, struct screen_ctx *sc, int mapped)
|
|||||||
client_update(cc);
|
client_update(cc);
|
||||||
|
|
||||||
if (mapped) {
|
if (mapped) {
|
||||||
if (Conf.flags & CONF_STICKY_GROUPS)
|
group_autogroup(cc);
|
||||||
group_sticky(cc);
|
|
||||||
else
|
|
||||||
group_autogroup(cc);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return (cc);
|
return (cc);
|
||||||
|
4
conf.c
4
conf.c
@ -54,8 +54,6 @@ struct winmatch_q ignoreq;
|
|||||||
TAILQ_INSERT_TAIL(queue, wm, entry); \
|
TAILQ_INSERT_TAIL(queue, wm, entry); \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
/* #define SYSTR_PRE "systrace -C -g /usr/local/bin/notification -d /usr/home/marius/policy/X11 " */
|
|
||||||
|
|
||||||
/* Initializes the command menu */
|
/* Initializes the command menu */
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -207,7 +205,6 @@ conf_setup(struct conf *c)
|
|||||||
conf_bindname(c, "MS-Tab", "rcycle");
|
conf_bindname(c, "MS-Tab", "rcycle");
|
||||||
conf_bindname(c, "CM-n", "label");
|
conf_bindname(c, "CM-n", "label");
|
||||||
conf_bindname(c, "CM-x", "delete");
|
conf_bindname(c, "CM-x", "delete");
|
||||||
conf_bindname(c, "CM-Escape", "groupselect");
|
|
||||||
conf_bindname(c, "CM-0", "nogroup");
|
conf_bindname(c, "CM-0", "nogroup");
|
||||||
conf_bindname(c, "CM-1", "group1");
|
conf_bindname(c, "CM-1", "group1");
|
||||||
conf_bindname(c, "CM-2", "group2");
|
conf_bindname(c, "CM-2", "group2");
|
||||||
@ -357,7 +354,6 @@ struct {
|
|||||||
{ "bigptrmovedown", kbfunc_ptrmove, 0, (void *)(CWM_DOWN|CWM_BIGMOVE) },
|
{ "bigptrmovedown", kbfunc_ptrmove, 0, (void *)(CWM_DOWN|CWM_BIGMOVE) },
|
||||||
{ "bigptrmoveleft", kbfunc_ptrmove, 0, (void *)(CWM_LEFT|CWM_BIGMOVE) },
|
{ "bigptrmoveleft", kbfunc_ptrmove, 0, (void *)(CWM_LEFT|CWM_BIGMOVE) },
|
||||||
{ "bigptrmoveright", kbfunc_ptrmove, 0, (void *)(CWM_RIGHT|CWM_BIGMOVE) },
|
{ "bigptrmoveright", kbfunc_ptrmove, 0, (void *)(CWM_RIGHT|CWM_BIGMOVE) },
|
||||||
{ "groupselect", kbfunc_client_groupselect, 0, 0 },
|
|
||||||
{ "group1", kbfunc_client_group, 0, (void *)1 },
|
{ "group1", kbfunc_client_group, 0, (void *)1 },
|
||||||
{ "group2", kbfunc_client_group, 0, (void *)2 },
|
{ "group2", kbfunc_client_group, 0, (void *)2 },
|
||||||
{ "group3", kbfunc_client_group, 0, (void *)3 },
|
{ "group3", kbfunc_client_group, 0, (void *)3 },
|
||||||
|
13
cwm.1
13
cwm.1
@ -80,8 +80,6 @@ Cycle through currently visible windows.
|
|||||||
Reverse cycle through currently visible windows.
|
Reverse cycle through currently visible windows.
|
||||||
.It Ic C-M-x
|
.It Ic C-M-x
|
||||||
Delete current window.
|
Delete current window.
|
||||||
.It Ic C-M-Escape
|
|
||||||
Enter group edit mode.
|
|
||||||
.It Ic C-M-[n]
|
.It Ic C-M-[n]
|
||||||
Select group n, where n is 1-9.
|
Select group n, where n is 1-9.
|
||||||
.It Ic C-M-0
|
.It Ic C-M-0
|
||||||
@ -122,8 +120,6 @@ The mouse bindings are also important, they are:
|
|||||||
Move a window.
|
Move a window.
|
||||||
.It C-M-M1
|
.It C-M-M1
|
||||||
Toggle a window's membership in the current group.
|
Toggle a window's membership in the current group.
|
||||||
A blue highlight indicates the window has been added to the group;
|
|
||||||
a red highlight indicates it has been removed.
|
|
||||||
.It M-M2
|
.It M-M2
|
||||||
Resize a window/select a window.
|
Resize a window/select a window.
|
||||||
.It M-M3
|
.It M-M3
|
||||||
@ -212,11 +208,10 @@ Together with the
|
|||||||
.Fl s
|
.Fl s
|
||||||
option, this can be used to emulate virtual desktops.
|
option, this can be used to emulate virtual desktops.
|
||||||
.Pp
|
.Pp
|
||||||
To edit groups, enter the group edit mode, and select/unselect the
|
To edit groups, use the group selection commands to toggle membership
|
||||||
groups with the group selection mouse click.
|
of a group.
|
||||||
A blue border will be shown on the currently selected windows.
|
A blue border will be shown briefly on windows added to the current group,
|
||||||
The group selection keyboard shortcuts can also be used to change
|
and a red border will be shown on those just removed.
|
||||||
which group to edit.
|
|
||||||
.Sh MENUS
|
.Sh MENUS
|
||||||
Menus are recalled by clicking the mouse on the root window:
|
Menus are recalled by clicking the mouse on the root window:
|
||||||
.Pp
|
.Pp
|
||||||
|
275
group.c
275
group.c
@ -24,20 +24,13 @@
|
|||||||
|
|
||||||
#define CALMWM_NGROUPS 9
|
#define CALMWM_NGROUPS 9
|
||||||
|
|
||||||
int Groupmode = 0;
|
|
||||||
int Groupnamemode = 0;
|
int Groupnamemode = 0;
|
||||||
struct group_ctx *Group_active = NULL;
|
struct group_ctx *Group_active = NULL;
|
||||||
struct group_ctx *Group_current = NULL;
|
|
||||||
struct group_ctx Groups[CALMWM_NGROUPS];
|
struct group_ctx Groups[CALMWM_NGROUPS];
|
||||||
char Group_name[256];
|
char Group_name[256];
|
||||||
int Groupfocusset = 0;
|
|
||||||
Window Groupfocuswin;
|
|
||||||
int Groupfocusrevert;
|
|
||||||
int Grouphideall = 0;
|
int Grouphideall = 0;
|
||||||
struct group_ctx_q Groupq;
|
struct group_ctx_q Groupq;
|
||||||
|
|
||||||
#define GroupMask (KeyPressMask|ExposureMask)
|
|
||||||
|
|
||||||
static char *shortcut_to_name[] = {
|
static char *shortcut_to_name[] = {
|
||||||
"XXX", "one", "two", "three",
|
"XXX", "one", "two", "three",
|
||||||
"four", "five", "six", "seven",
|
"four", "five", "six", "seven",
|
||||||
@ -58,7 +51,6 @@ _group_add(struct group_ctx *gc, struct client_ctx *cc)
|
|||||||
|
|
||||||
TAILQ_INSERT_TAIL(&gc->clients, cc, group_entry);
|
TAILQ_INSERT_TAIL(&gc->clients, cc, group_entry);
|
||||||
cc->group = gc;
|
cc->group = gc;
|
||||||
cc->groupcommit = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -69,37 +61,10 @@ _group_remove(struct client_ctx *cc)
|
|||||||
|
|
||||||
TAILQ_REMOVE(&cc->group->clients, cc, group_entry);
|
TAILQ_REMOVE(&cc->group->clients, cc, group_entry);
|
||||||
cc->group = NULL;
|
cc->group = NULL;
|
||||||
cc->groupcommit = 0;
|
|
||||||
cc->highlight = 0;
|
cc->highlight = 0;
|
||||||
client_draw_border(cc);
|
client_draw_border(cc);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
_group_commit(struct group_ctx *gc)
|
|
||||||
{
|
|
||||||
struct client_ctx *cc;
|
|
||||||
|
|
||||||
if (gc == NULL)
|
|
||||||
errx(1, "_group_commit: ctx is null");
|
|
||||||
|
|
||||||
TAILQ_FOREACH(cc, &gc->clients, group_entry)
|
|
||||||
cc->groupcommit = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
_group_purge(struct group_ctx *gc)
|
|
||||||
{
|
|
||||||
struct client_ctx *cc;
|
|
||||||
|
|
||||||
if (gc == NULL)
|
|
||||||
errx(1, "_group_purge: ctx is null");
|
|
||||||
|
|
||||||
TAILQ_FOREACH(cc, &gc->clients, group_entry)
|
|
||||||
if (cc->groupcommit == 0)
|
|
||||||
_group_remove(cc);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
_group_hide(struct group_ctx *gc)
|
_group_hide(struct group_ctx *gc)
|
||||||
{
|
{
|
||||||
@ -155,27 +120,6 @@ _group_show(struct group_ctx *gc)
|
|||||||
Group_active = gc;
|
Group_active = gc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static void
|
|
||||||
_group_destroy(struct group_ctx *gc)
|
|
||||||
{
|
|
||||||
struct client_ctx *cc;
|
|
||||||
|
|
||||||
if (gc->name != NULL) {
|
|
||||||
xfree(gc->name);
|
|
||||||
gc->name = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
while ((cc = TAILQ_FIRST(&gc->clients)) != NULL) {
|
|
||||||
TAILQ_REMOVE(&gc->clients, cc, group_entry);
|
|
||||||
cc->group = NULL;
|
|
||||||
cc->groupcommit = 0;
|
|
||||||
cc->highlight = 0;
|
|
||||||
client_draw_border(cc);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
group_init(void)
|
group_init(void)
|
||||||
{
|
{
|
||||||
@ -190,110 +134,12 @@ group_init(void)
|
|||||||
TAILQ_INSERT_TAIL(&Groupq, &Groups[i], entry);
|
TAILQ_INSERT_TAIL(&Groupq, &Groups[i], entry);
|
||||||
}
|
}
|
||||||
|
|
||||||
Group_current = Group_active = &Groups[0];
|
Group_active = &Groups[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* manipulate the 'current group'
|
* Colouring for groups upon add/remove.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* change the current group */
|
|
||||||
void
|
|
||||||
group_select(int idx)
|
|
||||||
{
|
|
||||||
struct group_ctx *gc = Group_current;
|
|
||||||
struct client_ctx *cc;
|
|
||||||
|
|
||||||
if (idx < 0 || idx >= CALMWM_NGROUPS)
|
|
||||||
return;
|
|
||||||
|
|
||||||
TAILQ_FOREACH(cc, &gc->clients, group_entry) {
|
|
||||||
cc->highlight = 0;
|
|
||||||
client_draw_border(cc);
|
|
||||||
}
|
|
||||||
|
|
||||||
_group_commit(gc);
|
|
||||||
Group_current = &Groups[idx];
|
|
||||||
|
|
||||||
group_display_draw(screen_current());
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* enter group mode */
|
|
||||||
void
|
|
||||||
group_enter(void)
|
|
||||||
{
|
|
||||||
if (Groupmode != 0)
|
|
||||||
errx(1, "group_enter called twice");
|
|
||||||
|
|
||||||
if (Group_current == NULL)
|
|
||||||
Group_current = &Groups[0];
|
|
||||||
|
|
||||||
/* setup input buffer */
|
|
||||||
Group_name[0] = '\0';
|
|
||||||
|
|
||||||
Groupmode = 1;
|
|
||||||
|
|
||||||
group_display_init(screen_current());
|
|
||||||
group_display_draw(screen_current());
|
|
||||||
}
|
|
||||||
|
|
||||||
/* exit group mode */
|
|
||||||
void
|
|
||||||
group_exit(int commit)
|
|
||||||
{
|
|
||||||
struct group_ctx *gc = Group_current;
|
|
||||||
struct client_ctx *cc;
|
|
||||||
|
|
||||||
if (Groupmode != 1)
|
|
||||||
errx(1, "group_exit called twice");
|
|
||||||
|
|
||||||
TAILQ_FOREACH(cc, &gc->clients, group_entry) {
|
|
||||||
cc->highlight = 0;
|
|
||||||
client_draw_border(cc);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (commit) {
|
|
||||||
_group_commit(gc);
|
|
||||||
} else {
|
|
||||||
/* abort */
|
|
||||||
_group_purge(gc);
|
|
||||||
if (!TAILQ_EMPTY(&gc->clients))
|
|
||||||
_group_destroy(gc);
|
|
||||||
}
|
|
||||||
|
|
||||||
XUnmapWindow(X_Dpy, screen_current()->groupwin);
|
|
||||||
|
|
||||||
if (Groupnamemode) {
|
|
||||||
XSetInputFocus(X_Dpy, Groupfocuswin, Groupfocusrevert,
|
|
||||||
CurrentTime);
|
|
||||||
Groupfocusset = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
Groupmode = Groupnamemode = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
group_click(struct client_ctx *cc)
|
|
||||||
{
|
|
||||||
struct group_ctx *gc = Group_current;
|
|
||||||
|
|
||||||
if (gc == cc->group)
|
|
||||||
_group_remove(cc);
|
|
||||||
else
|
|
||||||
_group_add(gc, cc);
|
|
||||||
group_display_draw(screen_current());
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* Used to add a newly mapped window to the active group */
|
|
||||||
|
|
||||||
void
|
|
||||||
group_sticky(struct client_ctx *cc)
|
|
||||||
{
|
|
||||||
_group_add(Group_active, cc);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
group_sticky_toggle_enter(struct client_ctx *cc)
|
group_sticky_toggle_enter(struct client_ctx *cc)
|
||||||
{
|
{
|
||||||
@ -321,85 +167,6 @@ group_sticky_toggle_exit(struct client_ctx *cc)
|
|||||||
* selection list display
|
* selection list display
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void
|
|
||||||
group_display_init(struct screen_ctx *sc)
|
|
||||||
{
|
|
||||||
sc->groupwin = XCreateSimpleWindow(X_Dpy, sc->rootwin, 0, 0,
|
|
||||||
1, 1, 1, sc->blackpixl, sc->whitepixl);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
group_display_draw(struct screen_ctx *sc)
|
|
||||||
{
|
|
||||||
struct group_ctx *gc = Group_current;
|
|
||||||
int x, y, dx, dy, fontheight;
|
|
||||||
struct client_ctx *cc;
|
|
||||||
char titlebuf[1024];
|
|
||||||
struct fontdesc *font = DefaultFont;
|
|
||||||
|
|
||||||
snprintf(titlebuf, sizeof(titlebuf), "Editing group %d", gc->shortcut);
|
|
||||||
|
|
||||||
x = y = 0;
|
|
||||||
|
|
||||||
fontheight = font_ascent(font) + font_descent(font) + 1;
|
|
||||||
dx = font_width(font, titlebuf, strlen(titlebuf));
|
|
||||||
dy = fontheight;
|
|
||||||
|
|
||||||
TAILQ_FOREACH(cc, &gc->clients, group_entry) {
|
|
||||||
cc->highlight = CLIENT_HIGHLIGHT_BLUE;
|
|
||||||
client_draw_border(cc);
|
|
||||||
}
|
|
||||||
|
|
||||||
XMoveResizeWindow(X_Dpy, sc->groupwin, x, y, dx, dy);
|
|
||||||
|
|
||||||
/* XXX */
|
|
||||||
XSelectInput(X_Dpy, sc->groupwin, GroupMask);
|
|
||||||
|
|
||||||
XMapRaised(X_Dpy, sc->groupwin);
|
|
||||||
XClearWindow(X_Dpy, sc->groupwin);
|
|
||||||
font_draw(font, titlebuf, strlen(titlebuf), sc->groupwin,
|
|
||||||
0, font_ascent(font) + 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
group_display_keypress(KeyCode k)
|
|
||||||
{
|
|
||||||
struct group_ctx * gc = Group_current;
|
|
||||||
char chr;
|
|
||||||
enum ctltype ctl;
|
|
||||||
int len;
|
|
||||||
|
|
||||||
if (!Groupnamemode)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (input_keycodetrans(k, 0, &ctl, &chr, 1) < 0)
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
switch (ctl) {
|
|
||||||
case CTL_ERASEONE:
|
|
||||||
if ((len = strlen(Group_name)) > 0)
|
|
||||||
Group_name[len - 1] = '\0';
|
|
||||||
break;
|
|
||||||
case CTL_RETURN:
|
|
||||||
if (gc->name != NULL)
|
|
||||||
xfree(gc->name);
|
|
||||||
|
|
||||||
gc->name = xstrdup(Group_name);
|
|
||||||
|
|
||||||
group_exit(1);
|
|
||||||
return;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (chr != '\0')
|
|
||||||
snprintf(Group_name, sizeof(Group_name), "%s%c",
|
|
||||||
Group_name, chr);
|
|
||||||
|
|
||||||
out:
|
|
||||||
group_display_draw(screen_current());
|
|
||||||
}
|
|
||||||
|
|
||||||
/* if group_hidetoggle would produce no effect, toggle the group's hidden state
|
/* if group_hidetoggle would produce no effect, toggle the group's hidden state
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
@ -495,7 +262,6 @@ group_client_delete(struct client_ctx *cc)
|
|||||||
|
|
||||||
TAILQ_REMOVE(&cc->group->clients, cc, group_entry);
|
TAILQ_REMOVE(&cc->group->clients, cc, group_entry);
|
||||||
cc->group = NULL; /* he he */
|
cc->group = NULL; /* he he */
|
||||||
cc->groupcommit = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -550,14 +316,6 @@ group_menu(XButtonEvent *e)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
group_namemode(void)
|
|
||||||
{
|
|
||||||
Groupnamemode = 1;
|
|
||||||
|
|
||||||
group_display_draw(screen_current());
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
group_alltoggle(void)
|
group_alltoggle(void)
|
||||||
{
|
{
|
||||||
@ -576,28 +334,6 @@ group_alltoggle(void)
|
|||||||
Grouphideall = 1;
|
Grouphideall = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
group_deletecurrent(void)
|
|
||||||
{
|
|
||||||
_group_destroy(Group_current);
|
|
||||||
XUnmapWindow(X_Dpy, screen_current()->groupwin);
|
|
||||||
|
|
||||||
Groupmode = Groupnamemode = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
group_done(void)
|
|
||||||
{
|
|
||||||
struct group_ctx *gc = Group_current;
|
|
||||||
|
|
||||||
if (gc->name != NULL)
|
|
||||||
xfree(gc->name);
|
|
||||||
|
|
||||||
gc->name = xstrdup(shortcut_to_name[gc->shortcut]);
|
|
||||||
|
|
||||||
group_exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
group_autogroup(struct client_ctx *cc)
|
group_autogroup(struct client_ctx *cc)
|
||||||
{
|
{
|
||||||
@ -605,6 +341,11 @@ group_autogroup(struct client_ctx *cc)
|
|||||||
struct group_ctx *gc;
|
struct group_ctx *gc;
|
||||||
char group[CALMWM_MAXNAMELEN];
|
char group[CALMWM_MAXNAMELEN];
|
||||||
|
|
||||||
|
if (Conf.flags & CONF_STICKY_GROUPS) {
|
||||||
|
_group_add(Group_active, cc);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (cc->app_class == NULL || cc->app_name == NULL)
|
if (cc->app_class == NULL || cc->app_name == NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
28
kbfunc.c
28
kbfunc.c
@ -320,17 +320,20 @@ kbfunc_exec(struct client_ctx *scratch, void *arg)
|
|||||||
if (stat(tpath, &sb) == -1)
|
if (stat(tpath, &sb) == -1)
|
||||||
continue;
|
continue;
|
||||||
/* may we execute this file? */
|
/* may we execute this file? */
|
||||||
if (euid == sb.st_uid)
|
if (euid == sb.st_uid) {
|
||||||
if (sb.st_mode & S_IXUSR)
|
if (sb.st_mode & S_IXUSR)
|
||||||
goto executable;
|
goto executable;
|
||||||
else
|
else
|
||||||
continue;
|
continue;
|
||||||
for (j = 0; j < ngroups; j++)
|
}
|
||||||
if (mygroups[j] == sb.st_gid)
|
for (j = 0; j < ngroups; j++) {
|
||||||
|
if (mygroups[j] == sb.st_gid) {
|
||||||
if (sb.st_mode & S_IXGRP)
|
if (sb.st_mode & S_IXGRP)
|
||||||
goto executable;
|
goto executable;
|
||||||
else
|
else
|
||||||
continue;
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
if (sb.st_mode & S_IXOTH)
|
if (sb.st_mode & S_IXOTH)
|
||||||
goto executable;
|
goto executable;
|
||||||
continue;
|
continue;
|
||||||
@ -447,22 +450,10 @@ kbfunc_client_delete(struct client_ctx *cc, void *arg)
|
|||||||
client_send_delete(cc);
|
client_send_delete(cc);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
kbfunc_client_groupselect(struct client_ctx *cc, void *arg)
|
|
||||||
{
|
|
||||||
if (Groupmode)
|
|
||||||
group_done();
|
|
||||||
else
|
|
||||||
group_enter();
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
kbfunc_client_group(struct client_ctx *cc, void *arg)
|
kbfunc_client_group(struct client_ctx *cc, void *arg)
|
||||||
{
|
{
|
||||||
if (Groupmode)
|
group_hidetoggle(KBTOGROUP((int)arg));
|
||||||
group_select(KBTOGROUP((int)arg));
|
|
||||||
else
|
|
||||||
group_hidetoggle(KBTOGROUP((int)arg));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -480,10 +471,7 @@ kbfunc_client_prevgroup(struct client_ctx *cc, void *arg)
|
|||||||
void
|
void
|
||||||
kbfunc_client_nogroup(struct client_ctx *cc, void *arg)
|
kbfunc_client_nogroup(struct client_ctx *cc, void *arg)
|
||||||
{
|
{
|
||||||
if (Groupmode)
|
group_alltoggle();
|
||||||
group_deletecurrent();
|
|
||||||
else
|
|
||||||
group_alltoggle();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
20
xevents.c
20
xevents.c
@ -330,7 +330,7 @@ xev_handle_buttonpress(struct xevent *xev, XEvent *ee)
|
|||||||
|
|
||||||
switch (e->button) {
|
switch (e->button) {
|
||||||
case Button1:
|
case Button1:
|
||||||
if (altcontrol && !Groupmode)
|
if (altcontrol)
|
||||||
group_sticky_toggle_enter(cc);
|
group_sticky_toggle_enter(cc);
|
||||||
else {
|
else {
|
||||||
grab_drag(cc);
|
grab_drag(cc);
|
||||||
@ -338,13 +338,8 @@ xev_handle_buttonpress(struct xevent *xev, XEvent *ee)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case Button2:
|
case Button2:
|
||||||
/* XXXSIGH!!! */
|
grab_sweep(cc);
|
||||||
if (Groupmode)
|
client_resize(cc);
|
||||||
group_click(cc);
|
|
||||||
else {
|
|
||||||
grab_sweep(cc);
|
|
||||||
client_resize(cc);
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case Button3:
|
case Button3:
|
||||||
client_ptrsave(cc);
|
client_ptrsave(cc);
|
||||||
@ -360,7 +355,7 @@ xev_handle_buttonrelease(struct xevent *xev, XEvent *ee)
|
|||||||
{
|
{
|
||||||
struct client_ctx *cc = client_current();
|
struct client_ctx *cc = client_current();
|
||||||
|
|
||||||
if (cc != NULL && !Groupmode)
|
if (cc != NULL)
|
||||||
group_sticky_toggle_exit(cc);
|
group_sticky_toggle_exit(cc);
|
||||||
|
|
||||||
xev_register(xev);
|
xev_register(xev);
|
||||||
@ -394,9 +389,6 @@ xev_handle_keypress(struct xevent *xev, XEvent *ee)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (kb == NULL && e->window == screen_current()->groupwin)
|
|
||||||
group_display_keypress(e->keycode);
|
|
||||||
|
|
||||||
if (kb == NULL)
|
if (kb == NULL)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
@ -510,15 +502,11 @@ void
|
|||||||
xev_handle_expose(struct xevent *xev, XEvent *ee)
|
xev_handle_expose(struct xevent *xev, XEvent *ee)
|
||||||
{
|
{
|
||||||
XExposeEvent *e = &ee->xexpose;
|
XExposeEvent *e = &ee->xexpose;
|
||||||
struct screen_ctx *sc = screen_current();
|
|
||||||
struct client_ctx *cc;
|
struct client_ctx *cc;
|
||||||
|
|
||||||
if ((cc = client_find(e->window)) != NULL)
|
if ((cc = client_find(e->window)) != NULL)
|
||||||
client_draw_border(cc);
|
client_draw_border(cc);
|
||||||
|
|
||||||
if (sc->groupwin == e->window)
|
|
||||||
group_display_draw(sc);
|
|
||||||
|
|
||||||
xev_register(xev);
|
xev_register(xev);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user