fix clang-format, no sort includes!

This commit is contained in:
Iris Lightshard 2021-02-26 13:01:22 -05:00
parent 2281498ceb
commit 1af2175f2e
Signed by: Iris Lightshard
GPG key ID: 3B7FBC22144E6398
20 changed files with 4586 additions and 5023 deletions

18
.clang-format Normal file
View file

@ -0,0 +1,18 @@
TabWidth: 2
IndentWidth: 2
ContinuationIndentWidth: 2
UseTab: Never
AllowShortBlocksOnASingleLine: Always
AllowShortCaseLabelsOnASingleLine: true
AllowShortEnumsOnASingleLine: true
AllowShortIfStatementsOnASingleLine: true
AllowShortLoopsOnASingleLine: true
AlwaysBreakAfterDefinitionReturnType: TopLevel
IndentCaseLabels: true
SpaceBeforeParens: ControlStatements
AlignAfterOpenBracket: AlwaysBreak
BinPackArguments: false
BinPackArguments: false
PointerAlignment: Left
BreakBeforeBraces: Attach
SortIncludes: false

266
client.c Executable file → Normal file
View file

@ -10,101 +10,105 @@
#include "fns.h"
#include "config.h"
Client *clients;
Client *current;
Client* clients;
Client* current;
void
setactive(Client *c, int on)
{
/* dbg("setactive client %x %d", c->window, c->on); */
setactive(Client* c, int on) {
/* dbg("setactive client %x %d", c->window, c->on); */
if(c->parent == c->screen->root)
return;
if (c->parent == c->screen->root) return;
if(on){
if (on) {
XUngrabButton(dpy, AnyButton, AnyModifier, c->parent);
XSetInputFocus(dpy, c->window, RevertToPointerRoot, timestamp());
if(c->proto & Ptakefocus)
if (c->proto & Ptakefocus)
sendcmessage(c->window, wm_protocols, wm_take_focus, 0, 1);
cmapfocus(c);
}else{
if(c->proto & Plosefocus)
} else {
if (c->proto & Plosefocus)
sendcmessage(c->window, wm_protocols, wm_lose_focus, 0, 1);
XGrabButton(dpy, AnyButton, AnyModifier, c->parent, False,
ButtonMask, GrabModeAsync, GrabModeSync, None, None);
XGrabButton(
dpy,
AnyButton,
AnyModifier,
c->parent,
False,
ButtonMask,
GrabModeAsync,
GrabModeSync,
None,
None);
}
draw_border(c, on);
}
void
draw_border(Client *c, int active)
{
draw_border(Client* c, int active) {
unsigned long pixel;
if(active){
if(c->hold)
if (active) {
if (c->hold)
pixel = c->screen->activeholdborder;
else
pixel = c->screen->activeborder;
}else{
if(c->hold)
} else {
if (c->hold)
pixel = c->screen->inactiveholdborder;
else
pixel = c->screen->inactiveborder;
}
if(debug) fprintf(stderr, "draw_border %p pixel %ld active %d hold %d\n", (void*)c, pixel, active, c->hold);
if (debug)
fprintf(
stderr,
"draw_border %p pixel %ld active %d hold %d\n",
(void*)c,
pixel,
active,
c->hold);
XSetWindowBackground(dpy, c->parent, pixel);
XClearWindow(dpy, c->parent);
}
void
active(Client *c)
{
Client *cc;
active(Client* c) {
Client* cc;
if(c == 0){
if (c == 0) {
fprintf(stderr, "ryudo: active(c==0)\n");
return;
}
if(c == current)
return;
if (c == current) return;
#ifdef AUTOSTICK
if (isautostick(c))
return;
if (isautostick(c)) return;
#endif
if(current){
if (current) {
setactive(current, 0);
if(current->screen != c->screen)
cmapnofocus(current->screen);
if (current->screen != c->screen) cmapnofocus(current->screen);
}
setactive(c, 1);
for(cc = clients; cc; cc = cc->next)
if(cc->revert == c)
cc->revert = c->revert;
for (cc = clients; cc; cc = cc->next)
if (cc->revert == c) cc->revert = c->revert;
c->revert = current;
while(c->revert && !normal(c->revert))
c->revert = c->revert->revert;
while (c->revert && !normal(c->revert)) c->revert = c->revert->revert;
current = c;
#ifdef DEBUG
if(debug)
dump_revert();
if (debug) dump_revert();
#endif
}
void
nofocus(void)
{
nofocus(void) {
static Window w = 0;
int mask;
XSetWindowAttributes attr;
Client *c;
Client* c;
if(current){
if (current) {
setactive(current, 0);
for(c = current->revert; c; c = c->revert)
if(normal(c)){
for (c = current->revert; c; c = c->revert)
if (normal(c)) {
active(c);
return;
}
@ -112,25 +116,35 @@ nofocus(void)
/* if no candidates to revert to, fall through */
}
current = 0;
if(w == 0){
mask = CWOverrideRedirect/*|CWColormap*/;
if (w == 0) {
mask = CWOverrideRedirect /*|CWColormap*/;
attr.override_redirect = 1;
/* attr.colormap = screens[0].def_cmap;*/
w = XCreateWindow(dpy, screens[0].root, 0, 0, 1, 1, 0,
0 /*screens[0].depth*/, InputOnly, screens[0].vis, mask, &attr);
w = XCreateWindow(
dpy,
screens[0].root,
0,
0,
1,
1,
0,
0 /*screens[0].depth*/,
InputOnly,
screens[0].vis,
mask,
&attr);
XMapWindow(dpy, w);
}
XSetInputFocus(dpy, w, RevertToPointerRoot, timestamp());
}
void
top(Client *c)
{
top(Client* c) {
Client **l, *cc;
l = &clients;
for(cc = *l; cc; cc = *l){
if(cc == c){
for (cc = *l; cc; cc = *l) {
if (cc == c) {
*l = c->next;
c->next = clients;
clients = c;
@ -141,22 +155,18 @@ top(Client *c)
fprintf(stderr, "rio: %p not on client list in top()\n", (void*)c);
}
Client *
getclient(Window w, int create)
{
Client *c;
Client*
getclient(Window w, int create) {
Client* c;
if(w == 0 || getscreen(w))
return 0;
if (w == 0 || getscreen(w)) return 0;
for(c = clients; c; c = c->next)
if(c->window == w || c->parent == w)
return c;
for (c = clients; c; c = c->next)
if (c->window == w || c->parent == w) return c;
if(!create)
return 0;
if (!create) return 0;
c = (Client *)malloc(sizeof(Client));
c = (Client*)malloc(sizeof(Client));
memset(c, 0, sizeof(Client));
c->window = w;
/* c->parent will be set by the caller */
@ -179,135 +189,117 @@ getclient(Window w, int create)
}
void
rmclient(Client *c)
{
Client *cc;
rmclient(Client* c) {
Client* cc;
for(cc = current; cc && cc->revert; cc = cc->revert)
if(cc->revert == c)
cc->revert = cc->revert->revert;
for (cc = current; cc && cc->revert; cc = cc->revert)
if (cc->revert == c) cc->revert = cc->revert->revert;
if(c == clients)
clients = c->next;
for(cc = clients; cc && cc->next; cc = cc->next)
if(cc->next == c)
cc->next = cc->next->next;
if (c == clients) clients = c->next;
for (cc = clients; cc && cc->next; cc = cc->next)
if (cc->next == c) cc->next = cc->next->next;
if(hidden(c))
unhidec(c, 0);
if (hidden(c)) unhidec(c, 0);
if(c->parent != c->screen->root)
XDestroyWindow(dpy, c->parent);
if (c->parent != c->screen->root) XDestroyWindow(dpy, c->parent);
c->parent = c->window = None; /* paranoia */
if(current == c){
if (current == c) {
current = c->revert;
if(current == 0)
if (current == 0)
nofocus();
else {
if(current->screen != c->screen)
cmapnofocus(c->screen);
if (current->screen != c->screen) cmapnofocus(c->screen);
setactive(current, 1);
}
}
if(c->ncmapwins != 0){
XFree((char *)c->cmapwins);
free((char *)c->wmcmaps);
if (c->ncmapwins != 0) {
XFree((char*)c->cmapwins);
free((char*)c->wmcmaps);
}
if(c->iconname != 0)
XFree((char*) c->iconname);
if(c->name != 0)
XFree((char*) c->name);
if(c->instance != 0)
XFree((char*) c->instance);
if(c->class != 0)
XFree((char*) c->class);
if (c->iconname != 0) XFree((char*)c->iconname);
if (c->name != 0) XFree((char*)c->name);
if (c->instance != 0) XFree((char*)c->instance);
if (c->class != 0) XFree((char*)c->class);
memset(c, 0, sizeof(Client)); /* paranoia */
free(c);
}
#ifdef DEBUG
void
dump_revert(void)
{
Client *c;
dump_revert(void) {
Client* c;
int i;
i = 0;
for(c = current; c; c = c->revert){
fprintf(stderr, "%s(%x:%d)", c->label ? c->label : "?", (int)c->window, c->state);
if(i++ > 100)
break;
if(c->revert)
fprintf(stderr, " -> ");
for (c = current; c; c = c->revert) {
fprintf(
stderr, "%s(%x:%d)", c->label ? c->label : "?", (int)c->window, c->state);
if (i++ > 100) break;
if (c->revert) fprintf(stderr, " -> ");
}
if(current == 0)
fprintf(stderr, "empty");
if (current == 0) fprintf(stderr, "empty");
fprintf(stderr, "\n");
}
void
dump_clients(void)
{
Client *c;
dump_clients(void) {
Client* c;
for(c = clients; c; c = c->next)
fprintf(stderr, "w 0x%x parent 0x%x @ (%d, %d)\n", (int)c->window, (int)c->parent, c->x, c->y);
for (c = clients; c; c = c->next)
fprintf(
stderr,
"w 0x%x parent 0x%x @ (%d, %d)\n",
(int)c->window,
(int)c->parent,
c->x,
c->y);
}
#endif
void
shuffle(int up)
{
shuffle(int up) {
Client **l, *c;
if(clients == 0 || clients->next == 0)
return;
if(!up){
if (clients == 0 || clients->next == 0) return;
if (!up) {
c = 0;
/*for(c=clients; c->next; c=c->next) */
/* ; */
for(l=&clients; (*l)->next; l=&(*l)->next)
for (l = &clients; (*l)->next; l = &(*l)->next)
#ifdef AUTOSTICK
if ((*l)->state == 1 && !isautostick(*l))
c = *l;
if ((*l)->state == 1 && !isautostick(*l)) c = *l;
#else
if ((*l)->state == 1)
c = *l;
if ((*l)->state == 1) c = *l;
#endif
if (c == 0)
return;
if (c == 0) return;
XMapRaised(dpy, c->parent);
top(c);
active(c);
}else{
} else {
c = clients;
for(l=&clients; *l; l=&(*l)->next)
for (l = &clients; *l; l = &(*l)->next)
;
clients = c->next;
*l = c;
c->next = 0;
XLowerWindow(dpy, c->window);
}
/* XMapRaised(dpy, clients->parent); */
/* top(clients); */
/* active(clients); */
/* XMapRaised(dpy, clients->parent); */
/* top(clients); */
/* active(clients); */
}
#ifdef AUTOSTICK
int
isautostick(Client *c)
{
static char *autostick[] = AUTOSTICK;
char **a = autostick;
isautostick(Client* c) {
static char* autostick[] = AUTOSTICK;
char** a = autostick;
while(*a){
if(c && c->class && strstr(c->class, *a)) {
return 1;
}
while (*a) {
if (c && c->class && strstr(c->class, *a)) { return 1; }
++a;
}
return 0;
}
#endif

22
color.c Executable file → Normal file
View file

@ -8,15 +8,16 @@
#include "fns.h"
unsigned long
colorpixel(Display *dpy, ScreenInfo *s, int depth, unsigned long rgb, unsigned long def)
{
colorpixel(
Display* dpy, ScreenInfo* s, int depth, unsigned long rgb,
unsigned long def) {
int r, g, b;
r = rgb>>16;
g = (rgb>>8)&0xFF;
b = rgb&0xFF;
r = rgb >> 16;
g = (rgb >> 8) & 0xFF;
b = rgb & 0xFF;
switch(depth){
switch (depth) {
case 1:
case 2:
case 4:
@ -28,18 +29,17 @@ colorpixel(Display *dpy, ScreenInfo *s, int depth, unsigned long rgb, unsigned l
r >>= 3;
g >>= 3;
b >>= 3;
return (r<<10) | (g<<5) | b;
return (r << 10) | (g << 5) | b;
case 16:
r >>= 3;
g >>= 2;
b >>= 3;
return (r<<11) | (g<<5) | b;
return (r << 11) | (g << 5) | b;
case 24:
case 32:
/* try to find byte order */
if(s->vis->red_mask & 0xff)
return (r) | (g<<8) | (b<<16); /* OK on Sun */
if (s->vis->red_mask & 0xff)
return (r) | (g << 8) | (b << 16); /* OK on Sun */
return rgb;
}
}

24
config.h Executable file → Normal file
View file

@ -48,7 +48,7 @@
* Mod5 = (1<<7)
*/
#define SHORTCUTMOD Mod4Mask
#define MODBITS (1<<6)
#define MODBITS (1 << 6)
/* Shortcut keys */
@ -86,23 +86,15 @@
* Remember the backslash at the end of non-terminating lines!
*/
#define AUTOSTICK {\
"XOsview",\
"XClock",\
0\
}
#define AUTOSTICK \
{ "XOsview", "XClock", 0 }
/* List of fonts to try, in order, for rendering the menus.
* Remember the backslash at the end of non-terminating lines!
*/
#define FONTLIST {\
"*-lucidatypewriter-medium-*-12-*-75-*",\
"lucm.latin1.9",\
"blit",\
"*-lucidatypewriter-bold-*-14-*-75-*",\
"9x15bold",\
"fixed",\
"*",\
0\
}
#define FONTLIST \
{ \
"*-lucidatypewriter-medium-*-12-*-75-*", "lucm.latin1.9", "blit", \
"*-lucidatypewriter-bold-*-14-*-75-*", "9x15bold", "fixed", "*", 0 \
}

226
cursor.c Executable file → Normal file
View file

@ -16,133 +16,120 @@ typedef struct {
Cursordata bigarrow = {
16,
{0, 0},
{ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 0x3F,
0xFF, 0x0F, 0xFF, 0x0F, 0xFF, 0x1F, 0xFF, 0x3F,
0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 0x3F,
0xCF, 0x1F, 0x8F, 0x0F, 0x07, 0x07, 0x03, 0x02,
{
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 0x3F, 0xFF, 0x0F, 0xFF,
0x0F, 0xFF, 0x1F, 0xFF, 0x3F, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0x7F,
0xFF, 0x3F, 0xCF, 0x1F, 0x8F, 0x0F, 0x07, 0x07, 0x03, 0x02,
},
{ 0x00, 0x00, 0xFE, 0x7F, 0xFE, 0x3F, 0xFE, 0x0F,
0xFE, 0x07, 0xFE, 0x07, 0xFE, 0x0F, 0xFE, 0x1F,
0xFE, 0x3F, 0xFE, 0x7F, 0xFE, 0x3F, 0xCE, 0x1F,
0x86, 0x0F, 0x06, 0x07, 0x02, 0x02, 0x00, 0x00,
}
};
{
0x00, 0x00, 0xFE, 0x7F, 0xFE, 0x3F, 0xFE, 0x0F, 0xFE, 0x07, 0xFE,
0x07, 0xFE, 0x0F, 0xFE, 0x1F, 0xFE, 0x3F, 0xFE, 0x7F, 0xFE, 0x3F,
0xCE, 0x1F, 0x86, 0x0F, 0x06, 0x07, 0x02, 0x02, 0x00, 0x00,
}};
Cursordata sweep0data = {
16,
{7, 7},
{0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03,
0xC0, 0x03, 0xC0, 0x03, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x03, 0xC0, 0x03,
0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03},
{0x00, 0x00, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01,
0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0xFE, 0x7F,
0xFE, 0x7F, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01,
0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x00, 0x00}
};
{0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0,
0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x03,
0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03},
{0x00, 0x00, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80,
0x01, 0x80, 0x01, 0xFE, 0x7F, 0xFE, 0x7F, 0x80, 0x01, 0x80, 0x01,
0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x00, 0x00}};
Cursordata boxcursdata = {
16,
{7, 7},
{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0x1F, 0xF8, 0x1F, 0xF8, 0x1F, 0xF8,
0x1F, 0xF8, 0x1F, 0xF8, 0x1F, 0xF8, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
{0x00, 0x00, 0xFE, 0x7F, 0xFE, 0x7F, 0xFE, 0x7F,
0x0E, 0x70, 0x0E, 0x70, 0x0E, 0x70, 0x0E, 0x70,
0x0E, 0x70, 0x0E, 0x70, 0x0E, 0x70, 0x0E, 0x70,
0xFE, 0x7F, 0xFE, 0x7F, 0xFE, 0x7F, 0x00, 0x00}
};
{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F,
0xF8, 0x1F, 0xF8, 0x1F, 0xF8, 0x1F, 0xF8, 0x1F, 0xF8, 0x1F, 0xF8,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
{0x00, 0x00, 0xFE, 0x7F, 0xFE, 0x7F, 0xFE, 0x7F, 0x0E, 0x70, 0x0E,
0x70, 0x0E, 0x70, 0x0E, 0x70, 0x0E, 0x70, 0x0E, 0x70, 0x0E, 0x70,
0x0E, 0x70, 0xFE, 0x7F, 0xFE, 0x7F, 0xFE, 0x7F, 0x00, 0x00}};
Cursordata sightdata = {
16,
{7, 7},
{0xF8, 0x1F, 0xFC, 0x3F, 0xFE, 0x7F, 0xDF, 0xFB,
0xCF, 0xF3, 0xC7, 0xE3, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0xE3, 0xCF, 0xF3,
0xDF, 0x7B, 0xFE, 0x7F, 0xFC, 0x3F, 0xF8, 0x1F,},
{0x00, 0x00, 0xF0, 0x0F, 0x8C, 0x31, 0x84, 0x21,
0x82, 0x41, 0x82, 0x41, 0x82, 0x41, 0xFE, 0x7F,
0xFE, 0x7F, 0x82, 0x41, 0x82, 0x41, 0x82, 0x41,
0x84, 0x21, 0x8C, 0x31, 0xF0, 0x0F, 0x00, 0x00,}
};
{
0xF8, 0x1F, 0xFC, 0x3F, 0xFE, 0x7F, 0xDF, 0xFB, 0xCF, 0xF3, 0xC7,
0xE3, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0xE3,
0xCF, 0xF3, 0xDF, 0x7B, 0xFE, 0x7F, 0xFC, 0x3F, 0xF8, 0x1F,
},
{
0x00, 0x00, 0xF0, 0x0F, 0x8C, 0x31, 0x84, 0x21, 0x82, 0x41, 0x82,
0x41, 0x82, 0x41, 0xFE, 0x7F, 0xFE, 0x7F, 0x82, 0x41, 0x82, 0x41,
0x82, 0x41, 0x84, 0x21, 0x8C, 0x31, 0xF0, 0x0F, 0x00, 0x00,
}};
Cursordata arrowdata = {
16,
{1, 1},
{0xFF, 0x07, 0xFF, 0x07, 0xFF, 0x03, 0xFF, 0x00,
0xFF, 0x00, 0xFF, 0x01, 0xFF, 0x03, 0xFF, 0x07,
0xE7, 0x0F, 0xC7, 0x1F, 0x83, 0x3F, 0x00, 0x7F,
0x00, 0xFE, 0x00, 0x7C, 0x00, 0x38, 0x00, 0x10,},
{0x00, 0x00, 0xFE, 0x03, 0xFE, 0x00, 0x3E, 0x00,
0x7E, 0x00, 0xFE, 0x00, 0xF6, 0x01, 0xE6, 0x03,
0xC2, 0x07, 0x82, 0x0F, 0x00, 0x1F, 0x00, 0x3E,
0x00, 0x7C, 0x00, 0x38, 0x00, 0x10, 0x00, 0x00,}
};
{
0xFF, 0x07, 0xFF, 0x07, 0xFF, 0x03, 0xFF, 0x00, 0xFF, 0x00, 0xFF,
0x01, 0xFF, 0x03, 0xFF, 0x07, 0xE7, 0x0F, 0xC7, 0x1F, 0x83, 0x3F,
0x00, 0x7F, 0x00, 0xFE, 0x00, 0x7C, 0x00, 0x38, 0x00, 0x10,
},
{
0x00, 0x00, 0xFE, 0x03, 0xFE, 0x00, 0x3E, 0x00, 0x7E, 0x00, 0xFE,
0x00, 0xF6, 0x01, 0xE6, 0x03, 0xC2, 0x07, 0x82, 0x0F, 0x00, 0x1F,
0x00, 0x3E, 0x00, 0x7C, 0x00, 0x38, 0x00, 0x10, 0x00, 0x00,
}};
Cursordata whitearrow = {
16,
{0, 0},
{0xFF, 0x07, 0xFF, 0x07, 0xFF, 0x03, 0xFF, 0x00,
0xFF, 0x00, 0xFF, 0x01, 0xFF, 0x03, 0xFF, 0x07,
0xE7, 0x0F, 0xC7, 0x1F, 0x83, 0x3F, 0x00, 0x7F,
0x00, 0xFE, 0x00, 0x7C, 0x00, 0x38, 0x00, 0x10,},
{0xFF, 0x07, 0xFF, 0x07, 0x83, 0x03, 0xC3, 0x00,
0xC3, 0x00, 0x83, 0x01, 0x1B, 0x03, 0x3F, 0x06,
0x67, 0x0C, 0xC7, 0x18, 0x83, 0x31, 0x00, 0x63,
0x00, 0xC6, 0x00, 0x6C, 0x00, 0x38, 0x00, 0x10,}
};
{
0xFF, 0x07, 0xFF, 0x07, 0xFF, 0x03, 0xFF, 0x00, 0xFF, 0x00, 0xFF,
0x01, 0xFF, 0x03, 0xFF, 0x07, 0xE7, 0x0F, 0xC7, 0x1F, 0x83, 0x3F,
0x00, 0x7F, 0x00, 0xFE, 0x00, 0x7C, 0x00, 0x38, 0x00, 0x10,
},
{
0xFF, 0x07, 0xFF, 0x07, 0x83, 0x03, 0xC3, 0x00, 0xC3, 0x00, 0x83,
0x01, 0x1B, 0x03, 0x3F, 0x06, 0x67, 0x0C, 0xC7, 0x18, 0x83, 0x31,
0x00, 0x63, 0x00, 0xC6, 0x00, 0x6C, 0x00, 0x38, 0x00, 0x10,
}};
Cursordata blittarget = {
18,
{8, 8},
{0xe0, 0x1f, 0x00, 0xf0, 0x3f, 0x00, 0xf8, 0x7f, 0x00,
0xfc, 0xff, 0x00, 0xfe, 0xff, 0x01, 0xff, 0xff, 0x03,
0xff, 0xff, 0x03, 0xff, 0xff, 0x03, 0xff, 0xff, 0x03,
0xff, 0xff, 0x03, 0xff, 0xff, 0x03, 0xff, 0xff, 0x03,
0xff, 0xff, 0x03, 0xfe, 0xff, 0x01, 0xfc, 0xff, 0x00,
0xf8, 0x7f, 0x00, 0xf0, 0x3f, 0x00, 0xe0, 0x1f, 0x00},
{0x00, 0x00, 0x00, 0xc0, 0x0f, 0x00, 0xf0, 0x3f, 0x00,
0x38, 0x73, 0x00, 0x8c, 0xc7, 0x00, 0xec, 0xdf, 0x00,
0x66, 0x9b, 0x01, 0x36, 0xb3, 0x01, 0xfe, 0xff, 0x01,
0xfe, 0xff, 0x01, 0x36, 0xb3, 0x01, 0x66, 0x9b, 0x01,
0xec, 0xdf, 0x00, 0x8c, 0xc7, 0x00, 0x38, 0x73, 0x00,
0xf0, 0x3f, 0x00, 0xc0, 0x0f, 0x00, 0x00, 0x00, 0x00}
};
{0xe0, 0x1f, 0x00, 0xf0, 0x3f, 0x00, 0xf8, 0x7f, 0x00, 0xfc, 0xff,
0x00, 0xfe, 0xff, 0x01, 0xff, 0xff, 0x03, 0xff, 0xff, 0x03, 0xff,
0xff, 0x03, 0xff, 0xff, 0x03, 0xff, 0xff, 0x03, 0xff, 0xff, 0x03,
0xff, 0xff, 0x03, 0xff, 0xff, 0x03, 0xfe, 0xff, 0x01, 0xfc, 0xff,
0x00, 0xf8, 0x7f, 0x00, 0xf0, 0x3f, 0x00, 0xe0, 0x1f, 0x00},
{0x00, 0x00, 0x00, 0xc0, 0x0f, 0x00, 0xf0, 0x3f, 0x00, 0x38, 0x73,
0x00, 0x8c, 0xc7, 0x00, 0xec, 0xdf, 0x00, 0x66, 0x9b, 0x01, 0x36,
0xb3, 0x01, 0xfe, 0xff, 0x01, 0xfe, 0xff, 0x01, 0x36, 0xb3, 0x01,
0x66, 0x9b, 0x01, 0xec, 0xdf, 0x00, 0x8c, 0xc7, 0x00, 0x38, 0x73,
0x00, 0xf0, 0x3f, 0x00, 0xc0, 0x0f, 0x00, 0x00, 0x00, 0x00}};
Cursordata blitarrow = {
18,
{1, 1},
{0xff, 0x0f, 0x00, 0xff, 0x07, 0x00, 0xff, 0x03, 0x00,
0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x01, 0x00,
0xff, 0x03, 0x00, 0xff, 0x07, 0x00, 0xe7, 0x0f, 0x00,
0xc7, 0x1f, 0x00, 0x87, 0x3f, 0x00, 0x03, 0x7f, 0x00,
0x01, 0xfe, 0x00, 0x00, 0xfc, 0x01, 0x00, 0xf8, 0x03,
0x00, 0xf0, 0x01, 0x00, 0xe0, 0x00, 0x00, 0x40, 0x00},
{0x00, 0x00, 0x00, 0xfe, 0x03, 0x00, 0xfe, 0x00, 0x00,
0x3e, 0x00, 0x00, 0x7e, 0x00, 0x00, 0xfe, 0x00, 0x00,
0xf6, 0x01, 0x00, 0xe6, 0x03, 0x00, 0xc2, 0x07, 0x00,
0x82, 0x0f, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x3e, 0x00,
0x00, 0x7c, 0x00, 0x00, 0xf8, 0x00, 0x00, 0xf0, 0x01,
0x00, 0xe0, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00}
};
{0xff, 0x0f, 0x00, 0xff, 0x07, 0x00, 0xff, 0x03, 0x00, 0xff, 0x00,
0x00, 0xff, 0x00, 0x00, 0xff, 0x01, 0x00, 0xff, 0x03, 0x00, 0xff,
0x07, 0x00, 0xe7, 0x0f, 0x00, 0xc7, 0x1f, 0x00, 0x87, 0x3f, 0x00,
0x03, 0x7f, 0x00, 0x01, 0xfe, 0x00, 0x00, 0xfc, 0x01, 0x00, 0xf8,
0x03, 0x00, 0xf0, 0x01, 0x00, 0xe0, 0x00, 0x00, 0x40, 0x00},
{0x00, 0x00, 0x00, 0xfe, 0x03, 0x00, 0xfe, 0x00, 0x00, 0x3e, 0x00,
0x00, 0x7e, 0x00, 0x00, 0xfe, 0x00, 0x00, 0xf6, 0x01, 0x00, 0xe6,
0x03, 0x00, 0xc2, 0x07, 0x00, 0x82, 0x0f, 0x00, 0x00, 0x1f, 0x00,
0x00, 0x3e, 0x00, 0x00, 0x7c, 0x00, 0x00, 0xf8, 0x00, 0x00, 0xf0,
0x01, 0x00, 0xe0, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00}};
Cursordata blitsweep = {
18,
{8, 8},
{0xc4, 0xff, 0x03, 0xce, 0xff, 0x03, 0xdf, 0xff, 0x03,
0x3e, 0x80, 0x03, 0x7c, 0x83, 0x03, 0xf8, 0x83, 0x03,
0xf7, 0x83, 0x03, 0xe7, 0x83, 0x03, 0xf7, 0x83, 0x03,
0xf7, 0x83, 0x03, 0x07, 0x80, 0x03, 0x07, 0x80, 0x03,
0x07, 0x80, 0x03, 0x07, 0x80, 0x03, 0x07, 0x80, 0x03,
0xff, 0xff, 0x03, 0xff, 0xff, 0x03, 0xff, 0xff, 0x03},
{0x00, 0x00, 0x00, 0x84, 0xff, 0x01, 0x0e, 0x00, 0x01,
0x1c, 0x00, 0x01, 0x38, 0x00, 0x01, 0x70, 0x01, 0x01,
0xe0, 0x01, 0x01, 0xc2, 0x01, 0x01, 0xe2, 0x01, 0x01,
0x02, 0x00, 0x01, 0x02, 0x00, 0x01, 0x02, 0x00, 0x01,
0x02, 0x00, 0x01, 0x02, 0x00, 0x01, 0x02, 0x00, 0x01,
0x02, 0x00, 0x01, 0xfe, 0xff, 0x01, 0x00, 0x00, 0x00}
};
{0xc4, 0xff, 0x03, 0xce, 0xff, 0x03, 0xdf, 0xff, 0x03, 0x3e, 0x80,
0x03, 0x7c, 0x83, 0x03, 0xf8, 0x83, 0x03, 0xf7, 0x83, 0x03, 0xe7,
0x83, 0x03, 0xf7, 0x83, 0x03, 0xf7, 0x83, 0x03, 0x07, 0x80, 0x03,
0x07, 0x80, 0x03, 0x07, 0x80, 0x03, 0x07, 0x80, 0x03, 0x07, 0x80,
0x03, 0xff, 0xff, 0x03, 0xff, 0xff, 0x03, 0xff, 0xff, 0x03},
{0x00, 0x00, 0x00, 0x84, 0xff, 0x01, 0x0e, 0x00, 0x01, 0x1c, 0x00,
0x01, 0x38, 0x00, 0x01, 0x70, 0x01, 0x01, 0xe0, 0x01, 0x01, 0xc2,
0x01, 0x01, 0xe2, 0x01, 0x01, 0x02, 0x00, 0x01, 0x02, 0x00, 0x01,
0x02, 0x00, 0x01, 0x02, 0x00, 0x01, 0x02, 0x00, 0x01, 0x02, 0x00,
0x01, 0x02, 0x00, 0x01, 0xfe, 0xff, 0x01, 0x00, 0x00, 0x00}};
/*
* Grey tile pattern for root background
@ -150,58 +137,54 @@ Cursordata blitsweep = {
#define grey_width 4
#define grey_height 2
static char grey_bits[] = {
0x01, 0x04
};
static char grey_bits[] = {0x01, 0x04};
static XColor bl, wh;
Cursor
getcursor(c, s)
Cursordata *c;
ScreenInfo *s;
Cursor getcursor(c, s) Cursordata* c;
ScreenInfo* s;
{
Pixmap f, m;
f = XCreatePixmapFromBitmapData(dpy, s->root, (char *)c->fore,
c->width, c->width, 1, 0, 1);
m = XCreatePixmapFromBitmapData(dpy, s->root, (char *)c->mask,
c->width, c->width, 1, 0, 1);
return XCreatePixmapCursor(dpy, f, m, &bl, &wh,
c->hot[0], c->hot[1]);
f = XCreatePixmapFromBitmapData(
dpy, s->root, (char*)c->fore, c->width, c->width, 1, 0, 1);
m = XCreatePixmapFromBitmapData(
dpy, s->root, (char*)c->mask, c->width, c->width, 1, 0, 1);
return XCreatePixmapCursor(dpy, f, m, &bl, &wh, c->hot[0], c->hot[1]);
}
void
initcurs(s)
ScreenInfo *s;
void initcurs(s) ScreenInfo* s;
{
XColor dummy;
XAllocNamedColor(dpy, DefaultColormap(dpy, s->num),
"black", &bl, &dummy);
XAllocNamedColor(dpy, DefaultColormap(dpy, s->num),
"white", &wh, &dummy);
XAllocNamedColor(dpy, DefaultColormap(dpy, s->num), "black", &bl, &dummy);
XAllocNamedColor(dpy, DefaultColormap(dpy, s->num), "white", &wh, &dummy);
if(nostalgia){
if (nostalgia) {
s->arrow = getcursor(&blitarrow, s);
s->target = getcursor(&blittarget, s);
s->sweep0 = getcursor(&blitsweep, s);
s->boxcurs = getcursor(&blitsweep, s);
}
else {
} else {
s->arrow = getcursor(&bigarrow, s);
s->target = getcursor(&sightdata, s);
s->sweep0 = getcursor(&sweep0data, s);
s->boxcurs = getcursor(&boxcursdata, s);
}
s->root_pixmap = XCreatePixmapFromBitmapData(dpy,
s->root, grey_bits, grey_width, grey_height,
s->black, s->white, s->depth);
s->root_pixmap = XCreatePixmapFromBitmapData(
dpy,
s->root,
grey_bits,
grey_width,
grey_height,
s->black,
s->white,
s->depth);
s->bordcurs[BorderN] = XCreateFontCursor(dpy, 138);
s->bordcurs[BorderNNE] = XCreateFontCursor(dpy, 136);
s->bordcurs[BorderENE] = s->bordcurs[BorderNNE] ;
s->bordcurs[BorderENE] = s->bordcurs[BorderNNE];
s->bordcurs[BorderE] = XCreateFontCursor(dpy, 96);
s->bordcurs[BorderESE] = XCreateFontCursor(dpy, 14);
s->bordcurs[BorderSSE] = s->bordcurs[BorderESE];
@ -213,7 +196,6 @@ ScreenInfo *s;
s->bordcurs[BorderNNW] = s->bordcurs[BorderWNW];
}
/* RIO
Cursor crosscursor = {

62
dat.h Executable file → Normal file
View file

@ -13,11 +13,11 @@
#endif
#define NUMVIRTUALS 12
#define AllButtonMask (Button1Mask|Button2Mask|Button3Mask \
|Button4Mask|Button5Mask)
#define ButtonMask (ButtonPressMask|ButtonReleaseMask)
#define MenuMask (ButtonMask|ButtonMotionMask|ExposureMask)
#define MenuGrabMask (ButtonMask|ButtonMotionMask|StructureNotifyMask)
#define AllButtonMask \
(Button1Mask | Button2Mask | Button3Mask | Button4Mask | Button5Mask)
#define ButtonMask (ButtonPressMask | ButtonReleaseMask)
#define MenuMask (ButtonMask | ButtonMotionMask | ExposureMask)
#define MenuGrabMask (ButtonMask | ButtonMotionMask | StructureNotifyMask)
#ifdef Plan9
#define DEFSHELL "/bin/rc"
@ -33,8 +33,8 @@ struct Client {
Window window;
Window parent;
Window trans;
Client *next;
Client *revert;
Client* next;
Client* revert;
int x;
int y;
@ -54,17 +54,17 @@ struct Client {
int proto;
int virt;
char *label;
char *instance;
char *class;
char *name;
char *iconname;
char* label;
char* instance;
char* class;
char* name;
char* iconname;
Colormap cmap;
int ncmapwins;
Window *cmapwins;
Colormap *wmcmaps;
ScreenInfo *screen;
Window* cmapwins;
Colormap* wmcmaps;
ScreenInfo* screen;
};
#define hidden(c) ((c)->state == IconicState)
@ -77,8 +77,8 @@ struct Client {
#define Plosefocus 4
struct Menu {
char **item;
char *(*gen)();
char** item;
char* (*gen)();
int lasthit;
};
@ -103,7 +103,7 @@ typedef enum BorderOrient BorderOrient;
struct ScreenInfo {
int num;
int depth;
Visual *vis;
Visual* vis;
int width;
int height;
Window root;
@ -137,17 +137,17 @@ struct ScreenInfo {
};
/* main.c */
extern Display *dpy;
extern ScreenInfo *screens;
extern Display* dpy;
extern ScreenInfo* screens;
extern int num_screens;
extern int initting;
extern XFontStruct *font;
extern XFontStruct* font;
extern int nostalgia;
extern char **myargv;
extern char** myargv;
extern Bool shape;
extern char *termprog;
extern char *shell;
extern char *version[];
extern char* termprog;
extern char* shell;
extern char* version[];
extern int _border;
extern int _corner;
extern int _inset;
@ -171,16 +171,16 @@ extern Atom wm_colormaps;
extern Atom wm_state_fullscreen;
extern Atom wm_state;
/* client.c */
extern Client *clients;
extern Client *current;
extern Client *currents[];
extern Client* clients;
extern Client* current;
extern Client* currents[];
/* menu.c */
extern Client *hiddenc[];
extern Client* hiddenc[];
extern int numhidden;
extern char *b2items[];
extern char* b2items[];
extern Menu b2menu;
extern char *b3items[];
extern char* b3items[];
extern Menu b3menu;
extern int virt;

76
error.c Executable file → Normal file
View file

@ -11,8 +11,7 @@
int ignore_badwindow;
void
fatal(char *s)
{
fatal(char* s) {
fprintf(stderr, "ryudo: ");
perror(s);
fprintf(stderr, "\n");
@ -20,27 +19,32 @@ fatal(char *s)
}
int
handler(Display *d, XErrorEvent *e)
{
handler(Display* d, XErrorEvent* e) {
char msg[80], req[80], number[80];
if(initting && (e->request_code == X_ChangeWindowAttributes) && (e->error_code == BadAccess)){
fprintf(stderr, "ryudo: it looks like there's already a window manager running; ryudo not started\n");
if (
initting && (e->request_code == X_ChangeWindowAttributes) &&
(e->error_code == BadAccess)) {
fprintf(
stderr,
"ryudo: it looks like there's already a window manager running; ryudo "
"not started\n");
exit(1);
}
if(ignore_badwindow && (e->error_code == BadWindow || e->error_code == BadColor))
if (
ignore_badwindow &&
(e->error_code == BadWindow || e->error_code == BadColor))
return 0;
XGetErrorText(d, e->error_code, msg, sizeof(msg));
sprintf(number, "%d", e->request_code);
XGetErrorDatabaseText(d, "XRequest", number, "", req, sizeof(req));
if(req[0] == '\0')
sprintf(req, "<request-code-%d>", (int)e->request_code);
if (req[0] == '\0') sprintf(req, "<request-code-%d>", (int)e->request_code);
fprintf(stderr, "ryudo: %s(0x%x): %s\n", req, (int)e->resourceid, msg);
if(initting){
if (initting) {
fprintf(stderr, "ryudo: failure during initialisation; aborting\n");
exit(1);
}
@ -48,29 +52,17 @@ handler(Display *d, XErrorEvent *e)
}
void
graberror(char *f, int err)
{
graberror(char* f, int err) {
#ifdef DEBUG /* sick of "bug" reports; grab errors "just happen" */
char *s;
char* s;
switch (err){
case GrabNotViewable:
s = "not viewable";
break;
case AlreadyGrabbed:
s = "already grabbed";
break;
case GrabFrozen:
s = "grab frozen";
break;
case GrabInvalidTime:
s = "invalid time";
break;
case GrabSuccess:
return;
default:
fprintf(stderr, "ryudo: %s: grab error: %d\n", f, err);
return;
switch (err) {
case GrabNotViewable: s = "not viewable"; break;
case AlreadyGrabbed: s = "already grabbed"; break;
case GrabFrozen: s = "grab frozen"; break;
case GrabInvalidTime: s = "invalid time"; break;
case GrabSuccess: return;
default: fprintf(stderr, "ryudo: %s: grab error: %d\n", f, err); return;
}
fprintf(stderr, "ryudo: %s: grab error: %s\n", f, s);
#endif
@ -83,16 +75,22 @@ graberror(char *f, int err)
#ifdef DEBUG
void
dotrace(char *s, Client *c, XEvent *e)
{
if(debug == 0)
return;
setbuf(stdout, 0);
dotrace(char* s, Client* c, XEvent* e) {
if (debug == 0) return;
setbuf(stdout, 0);
fprintf(stderr, "ryudo: %s: c=%p", s, (void*)c);
if(c)
fprintf(stderr, " x %d y %d dx %d dy %d w 0x%x parent 0x%x", c->x, c->y, c->dx, c->dy, (int)c->window, (int)c->parent);
if (c)
fprintf(
stderr,
" x %d y %d dx %d dy %d w 0x%x parent 0x%x",
c->x,
c->y,
c->dx,
c->dy,
(int)c->window,
(int)c->parent);
#ifdef DEBUG_EV
if(e){
if (e) {
fprintf(stderr, "\n\t");
ShowEvent(e);
}

476
event.c Executable file → Normal file
View file

@ -18,65 +18,39 @@
#include "config.h"
void
mainloop(int shape_event)
{
mainloop(int shape_event) {
XEvent ev;
for(;;){
for (;;) {
getevent(&ev);
#ifdef DEBUG_EV
if(debug){
if (debug) {
ShowEvent(&ev);
printf("\n");
}
#endif
switch (ev.type){
switch (ev.type) {
default:
#ifdef SHAPE
if(shape && ev.type == shape_event)
shapenotify((XShapeEvent *)&ev);
if (shape && ev.type == shape_event)
shapenotify((XShapeEvent*)&ev);
else
#endif
fprintf(stderr, "ryudo: unknown ev.type %d\n", ev.type);
break;
case KeyPress:
keypress(&ev.xkey);
break;
case KeyRelease:
keyrelease(&ev.xkey);
break;
case ButtonPress:
button(&ev.xbutton);
break;
case ButtonRelease:
break;
case MapRequest:
mapreq(&ev.xmaprequest);
break;
case ConfigureRequest:
configurereq(&ev.xconfigurerequest);
break;
case CirculateRequest:
circulatereq(&ev.xcirculaterequest);
break;
case UnmapNotify:
unmap(&ev.xunmap);
break;
case CreateNotify:
newwindow(&ev.xcreatewindow);
break;
case DestroyNotify:
destroy(ev.xdestroywindow.window);
break;
case ClientMessage:
clientmesg(&ev.xclient);
break;
case ColormapNotify:
cmap(&ev.xcolormap);
break;
case PropertyNotify:
property(&ev.xproperty);
break;
case KeyPress: keypress(&ev.xkey); break;
case KeyRelease: keyrelease(&ev.xkey); break;
case ButtonPress: button(&ev.xbutton); break;
case ButtonRelease: break;
case MapRequest: mapreq(&ev.xmaprequest); break;
case ConfigureRequest: configurereq(&ev.xconfigurerequest); break;
case CirculateRequest: circulatereq(&ev.xcirculaterequest); break;
case UnmapNotify: unmap(&ev.xunmap); break;
case CreateNotify: newwindow(&ev.xcreatewindow); break;
case DestroyNotify: destroy(ev.xdestroywindow.window); break;
case ClientMessage: clientmesg(&ev.xclient); break;
case ColormapNotify: cmap(&ev.xcolormap); break;
case PropertyNotify: property(&ev.xproperty); break;
case SelectionClear:
fprintf(stderr, "ryudo: SelectionClear (this should not happen)\n");
break;
@ -86,21 +60,11 @@ mainloop(int shape_event)
case SelectionRequest:
fprintf(stderr, "ryudo: SelectionRequest (this should not happen)\n");
break;
case EnterNotify:
enter(&ev.xcrossing);
break;
case LeaveNotify:
leave(&ev.xcrossing);
break;
case ReparentNotify:
reparent(&ev.xreparent);
break;
case FocusIn:
focusin(&ev.xfocus);
break;
case MotionNotify:
motionnotify(&ev.xmotion);
break;
case EnterNotify: enter(&ev.xcrossing); break;
case LeaveNotify: leave(&ev.xcrossing); break;
case ReparentNotify: reparent(&ev.xreparent); break;
case FocusIn: focusin(&ev.xfocus); break;
case MotionNotify: motionnotify(&ev.xmotion); break;
case Expose:
case NoExpose:
case FocusOut:
@ -115,12 +79,10 @@ mainloop(int shape_event)
}
}
void
configurereq(XConfigureRequestEvent *e)
{
configurereq(XConfigureRequestEvent* e) {
XWindowChanges wc;
Client *c;
Client* c;
/* we don't set curtime as nothing here uses it */
c = getclient(e->window, 0);
@ -128,52 +90,47 @@ configurereq(XConfigureRequestEvent *e)
e->value_mask &= ~CWSibling;
if(c){
if(e->value_mask & CWX)
c->x = e->x;
if(e->value_mask & CWY)
c->y = e->y;
if(e->value_mask & CWWidth)
c->dx = e->width;
if(e->value_mask & CWHeight)
c->dy = e->height;
if(e->value_mask & CWBorderWidth)
c->border = e->border_width;
if (c) {
if (e->value_mask & CWX) c->x = e->x;
if (e->value_mask & CWY) c->y = e->y;
if (e->value_mask & CWWidth) c->dx = e->width;
if (e->value_mask & CWHeight) c->dy = e->height;
if (e->value_mask & CWBorderWidth) c->border = e->border_width;
if(c->dx >= c->screen->width && c->dy >= c->screen->height)
if (c->dx >= c->screen->width && c->dy >= c->screen->height)
c->border = 0;
else
c->border = BORDER;
if(e->value_mask & CWStackMode){
if(e->detail == Above)
if (e->value_mask & CWStackMode) {
if (e->detail == Above)
top(c);
else
e->value_mask &= ~CWStackMode;
}
e->value_mask |= CWX|CWY|CWHeight|CWWidth;
e->value_mask |= CWX | CWY | CWHeight | CWWidth;
if(c->parent != c->screen->root && c->window == e->window){
if (c->parent != c->screen->root && c->window == e->window) {
wc.x = c->x - c->border;
wc.y = c->y - c->border;
wc.width = c->dx+c->border+c->border;
wc.height = c->dy+c->border+c->border;
wc.width = c->dx + c->border + c->border;
wc.height = c->dy + c->border + c->border;
wc.border_width = 1;
wc.sibling = None;
wc.stack_mode = e->detail;
XConfigureWindow(dpy, c->parent, e->value_mask, &wc);
if(e->value_mask & CWStackMode){
if (e->value_mask & CWStackMode) {
top(c);
active(c);
}
}
}
if(c && c->parent != c->screen->root){
if (c && c->parent != c->screen->root) {
wc.x = c->border;
wc.y = c->border;
}else {
} else {
wc.x = c->x;
wc.y = c->y;
}
@ -188,36 +145,36 @@ configurereq(XConfigureRequestEvent *e)
}
void
mapreq(XMapRequestEvent *e)
{
Client *c;
mapreq(XMapRequestEvent* e) {
Client* c;
int i;
curtime = CurrentTime;
c = getclient(e->window, 0);
trace("mapreq", c, e);
if(c == 0 || c->window != e->window){
if (c == 0 || c->window != e->window) {
/* workaround for stupid NCDware */
fprintf(stderr, "ryudo: bad mapreq c %p w %x, rescanning\n",
(void*)c, (int)e->window);
for(i = 0; i < num_screens; i++)
scanwins(&screens[i]);
fprintf(
stderr,
"ryudo: bad mapreq c %p w %x, rescanning\n",
(void*)c,
(int)e->window);
for (i = 0; i < num_screens; i++) scanwins(&screens[i]);
c = getclient(e->window, 0);
if(c == 0 || c->window != e->window){
if (c == 0 || c->window != e->window) {
fprintf(stderr, "ryudo: window not found after rescan\n");
return;
}
}
switch (c->state){
switch (c->state) {
case WithdrawnState:
if(c->parent == c->screen->root){
if(!manage(c, 0))
return;
if (c->parent == c->screen->root) {
if (!manage(c, 0)) return;
break;
}
XReparentWindow(dpy, c->window, c->parent, BORDER-1, BORDER-1);
XReparentWindow(dpy, c->window, c->parent, BORDER - 1, BORDER - 1);
XAddToSaveSet(dpy, c->window);
/* fall through... */
case NormalState:
@ -225,35 +182,29 @@ mapreq(XMapRequestEvent *e)
XMapRaised(dpy, c->parent);
top(c);
setstate(c, NormalState);
if(c->trans != None && current && c->trans == current->window)
active(c);
break;
case IconicState:
unhidec(c, 1);
if (c->trans != None && current && c->trans == current->window) active(c);
break;
case IconicState: unhidec(c, 1); break;
}
}
void
unmap(XUnmapEvent *e)
{
Client *c;
unmap(XUnmapEvent* e) {
Client* c;
curtime = CurrentTime;
c = getclient(e->window, 0);
if(c){
switch (c->state){
if (c) {
switch (c->state) {
case IconicState:
if(e->send_event){
if (e->send_event) {
unhidec(c, 0);
withdraw(c);
}
break;
case NormalState:
if(c == current)
nofocus();
if(!c->reparenting)
withdraw(c);
if (c == current) nofocus();
if (!c->reparenting) withdraw(c);
break;
}
c->reparenting = 0;
@ -261,57 +212,49 @@ unmap(XUnmapEvent *e)
}
void
circulatereq(XCirculateRequestEvent *e)
{
circulatereq(XCirculateRequestEvent* e) {
fprintf(stderr, "It must be the warlock Krill!\n"); /* ☺ */
}
void
newwindow(XCreateWindowEvent *e)
{
Client *c;
ScreenInfo *s;
newwindow(XCreateWindowEvent* e) {
Client* c;
ScreenInfo* s;
static XWindowAttributes ra;
XGetWindowAttributes(dpy, DefaultRootWindow(dpy), &ra);
/* we don't set curtime as nothing here uses it */
if(e->override_redirect)
return;
if (e->override_redirect) return;
c = getclient(e->window, 1);
if(c && c->window == e->window && (s = getscreen(e->parent))){
if (c && c->window == e->window && (s = getscreen(e->parent))) {
c->x = e->x;
c->y = e->y;
c->dx = e->width;
c->dy = e->height;
c->border = e->border_width;
c->screen = s;
if(c->parent == None)
c->parent = c->screen->root;
if (c->parent == None) c->parent = c->screen->root;
}
if (kbLaunch)
{
if (kbLaunch) {
usleep(100000);
quickreshape(c, ra.width/6, GAPSZ, 2*ra.width/3, ra.height - 2*GAPSZ);
quickreshape(
c, ra.width / 6, GAPSZ, 2 * ra.width / 3, ra.height - 2 * GAPSZ);
kbLaunch = 0;
}
}
void
destroy(Window w)
{
destroy(Window w) {
int i;
Client *c;
Client* c;
curtime = CurrentTime;
c = getclient(w, 0);
if(c == 0)
return;
if (c == 0) return;
if(numvirtuals > 1)
for(i=0; i<numvirtuals; i++)
if(currents[i] == c)
currents[i] = 0;
if (numvirtuals > 1)
for (i = 0; i < numvirtuals; i++)
if (currents[i] == c) currents[i] = 0;
rmclient(c);
@ -322,69 +265,72 @@ destroy(Window w)
}
void
clientmesg(XClientMessageEvent *e)
{
Client *c;
clientmesg(XClientMessageEvent* e) {
Client* c;
curtime = CurrentTime;
if(e->message_type == exit_rio){
if (e->message_type == exit_rio) {
cleanup();
exit(0);
}
if(e->message_type == restart_rio){
if (e->message_type == restart_rio) {
fprintf(stderr, "*** rio restarting ***\n");
cleanup();
execvp(myargv[0], myargv);
perror("ryudo: exec failed");
exit(1);
}
if(e->message_type == wm_protocols)
return;
if(e->message_type == wm_change_state){
if (e->message_type == wm_protocols) return;
if (e->message_type == wm_change_state) {
c = getclient(e->window, 0);
if(e->format == 32 && e->data.l[0] == IconicState && c != 0){
if(normal(c))
hide(c);
}
else
fprintf(stderr, "ryudo: WM_CHANGE_STATE: format %d data %d w 0x%x\n",
(int)e->format, (int)e->data.l[0], (int)e->window);
return;
}
if(e->message_type == wm_state){
// c = getclient(e->window, 0);
// if(e->format == 32 && e->data.l[1] == wm_state_fullscreen){
// }else
fprintf(stderr, "ryudo: WM_STATE: format %d data %d %d w 0x%x\n",
(int)e->format, (int)e->data.l[0], (int)e->data.l[1],
if (e->format == 32 && e->data.l[0] == IconicState && c != 0) {
if (normal(c)) hide(c);
} else
fprintf(
stderr,
"ryudo: WM_CHANGE_STATE: format %d data %d w 0x%x\n",
(int)e->format,
(int)e->data.l[0],
(int)e->window);
return;
}
fprintf(stderr, "ryudo: strange ClientMessage, type 0x%x window 0x%x\n",
(int)e->message_type, (int)e->window);
if (e->message_type == wm_state) {
// c = getclient(e->window, 0);
// if(e->format == 32 && e->data.l[1] == wm_state_fullscreen){
// }else
fprintf(
stderr,
"ryudo: WM_STATE: format %d data %d %d w 0x%x\n",
(int)e->format,
(int)e->data.l[0],
(int)e->data.l[1],
(int)e->window);
return;
}
fprintf(
stderr,
"ryudo: strange ClientMessage, type 0x%x window 0x%x\n",
(int)e->message_type,
(int)e->window);
}
void
cmap(XColormapEvent *e)
{
Client *c;
cmap(XColormapEvent* e) {
Client* c;
int i;
/* we don't set curtime as nothing here uses it */
if(e->new){
if (e->new) {
c = getclient(e->window, 0);
if(c){
if (c) {
c->cmap = e->colormap;
if(c == current)
cmapfocus(c);
}
else
for(c = clients; c; c = c->next){
for(i = 0; i < c->ncmapwins; i++)
if(c->cmapwins[i] == e->window){
if (c == current) cmapfocus(c);
} else
for (c = clients; c; c = c->next) {
for (i = 0; i < c->ncmapwins; i++)
if (c->cmapwins[i] == e->window) {
c->wmcmaps[i] = e->colormap;
if(c == current)
cmapfocus(c);
if (c == current) cmapfocus(c);
return;
}
}
@ -392,73 +338,64 @@ cmap(XColormapEvent *e)
}
void
property(XPropertyEvent *e)
{
property(XPropertyEvent* e) {
Atom a;
int delete;
Client *c;
Client* c;
long msize;
/* we don't set curtime as nothing here uses it */
a = e->atom;
delete = (e->state == PropertyDelete);
c = getclient(e->window, 0);
if(c == 0)
return;
if (c == 0) return;
switch (a){
switch (a) {
case XA_WM_ICON_NAME:
if(c->iconname != 0)
XFree((char*) c->iconname);
if (c->iconname != 0) XFree((char*)c->iconname);
c->iconname = delete ? 0 : getprop(c->window, a);
setlabel(c);
renamec(c, c->label);
return;
case XA_WM_NAME:
if(c->name != 0)
XFree((char*) c->name);
if (c->name != 0) XFree((char*)c->name);
c->name = delete ? 0 : getprop(c->window, a);
setlabel(c);
renamec(c, c->label);
return;
case XA_WM_TRANSIENT_FOR:
gettrans(c);
return;
case XA_WM_TRANSIENT_FOR: gettrans(c); return;
case XA_WM_HINTS:
case XA_WM_SIZE_HINTS:
case XA_WM_ZOOM_HINTS:
/* placeholders to not forget. ignore for now. -Axel */
return;
case XA_WM_NORMAL_HINTS:
if(XGetWMNormalHints(dpy, c->window, &c->size, &msize) == 0 || c->size.flags == 0)
if (
XGetWMNormalHints(dpy, c->window, &c->size, &msize) == 0 ||
c->size.flags == 0)
c->size.flags = PSize; /* not specified - punt */
return;
}
if(a == _rio_hold_mode){
if (a == _rio_hold_mode) {
c->hold = getiprop(c->window, _rio_hold_mode);
if(c == current)
draw_border(c, 1);
}
else if(a == wm_colormaps){
if (c == current) draw_border(c, 1);
} else if (a == wm_colormaps) {
getcmaps(c);
if(c == current)
cmapfocus(c);
if (c == current) cmapfocus(c);
}
}
void
reparent(XReparentEvent *e)
{
Client *c;
reparent(XReparentEvent* e) {
Client* c;
XWindowAttributes attr;
ScreenInfo *s;
ScreenInfo* s;
/* we don't set curtime as nothing here uses it */
if(!getscreen(e->event) || e->override_redirect)
return;
if((s = getscreen(e->parent)) != 0){
if (!getscreen(e->event) || e->override_redirect) return;
if ((s = getscreen(e->parent)) != 0) {
c = getclient(e->window, 1);
if(c != 0 && (c->dx == 0 || c->dy == 0)){
if (c != 0 && (c->dx == 0 || c->dy == 0)) {
/* flush any errors */
ignore_badwindow = 1;
XGetWindowAttributes(dpy, c->window, &attr);
@ -471,74 +408,62 @@ reparent(XReparentEvent *e)
c->dy = attr.height;
c->border = attr.border_width;
c->screen = s;
if(c->parent == None)
c->parent = c->screen->root;
if (c->parent == None) c->parent = c->screen->root;
}
}
else {
} else {
c = getclient(e->window, 0);
if(c != 0 && (c->parent == c->screen->root || withdrawn(c)))
rmclient(c);
if (c != 0 && (c->parent == c->screen->root || withdrawn(c))) rmclient(c);
}
}
#ifdef SHAPE
void
shapenotify(XShapeEvent *e)
{
Client *c;
shapenotify(XShapeEvent* e) {
Client* c;
/* we don't set curtime as nothing here uses it */
c = getclient(e->window, 0);
if(c == 0)
return;
if (c == 0) return;
setshape(c);
}
#endif
void
enter(XCrossingEvent *e)
{
Client *c;
enter(XCrossingEvent* e) {
Client* c;
curtime = e->time;
if(!ffm)
if(e->mode != NotifyGrab || e->detail != NotifyNonlinearVirtual)
return;
if (!ffm)
if (e->mode != NotifyGrab || e->detail != NotifyNonlinearVirtual) return;
c = getclient(e->window, 0);
if(c != 0 && c != current){
if (c != 0 && c != current) {
/* someone grabbed the pointer; make them current */
if(!ffm)
XMapRaised(dpy, c->parent);
if (!ffm) XMapRaised(dpy, c->parent);
top(c);
active(c);
}
}
void
leave(XCrossingEvent *e)
{
Client *c;
leave(XCrossingEvent* e) {
Client* c;
c = getclient(e->window, 0);
if(c)
XUndefineCursor(dpy, c->parent);
/* XDefineCursor(dpy, c->parent, c->screen->arrow); */
if (c) XUndefineCursor(dpy, c->parent);
/* XDefineCursor(dpy, c->parent, c->screen->arrow); */
}
void
focusin(XFocusChangeEvent *e)
{
Client *c;
focusin(XFocusChangeEvent* e) {
Client* c;
curtime = CurrentTime;
if(e->detail != NotifyNonlinearVirtual)
return;
if (e->detail != NotifyNonlinearVirtual) return;
c = getclient(e->window, 0);
if(c != 0 && c->window == e->window && c != current){
if (c != 0 && c->window == e->window && c != current) {
#ifdef AUTOSTICK
if (isautostick(c)){
if (isautostick(c)) {
#endif
/* someone grabbed keyboard or seized focus; make them current */
XMapRaised(dpy, c->parent);
@ -551,62 +476,58 @@ focusin(XFocusChangeEvent *e)
}
BorderOrient
borderorient(Client *c, int x, int y)
{
if(x <= BORDER){
if(y <= CORNER){
if(debug) fprintf(stderr, "topleft\n");
borderorient(Client* c, int x, int y) {
if (x <= BORDER) {
if (y <= CORNER) {
if (debug) fprintf(stderr, "topleft\n");
return BorderWNW;
}
if(y >= (c->dy + 2*BORDER) - CORNER){
if(debug) fprintf(stderr, "botleft\n");
if (y >= (c->dy + 2 * BORDER) - CORNER) {
if (debug) fprintf(stderr, "botleft\n");
return BorderWSW;
}
if(y > CORNER &&
y < (c->dy + 2*BORDER) - CORNER){
if(debug) fprintf(stderr, "left\n");
if (y > CORNER && y < (c->dy + 2 * BORDER) - CORNER) {
if (debug) fprintf(stderr, "left\n");
return BorderW;
}
} else if(x <= CORNER){
if(y <= BORDER){
if(debug) fprintf(stderr, "topleft\n");
} else if (x <= CORNER) {
if (y <= BORDER) {
if (debug) fprintf(stderr, "topleft\n");
return BorderNNW;
}
if (y >= (c->dy + BORDER)){
if(debug) fprintf(stderr, "botleft\n");
if (y >= (c->dy + BORDER)) {
if (debug) fprintf(stderr, "botleft\n");
return BorderSSW;
}
} else if(x >= (c->dx + BORDER)){
if(y <= CORNER){
if(debug) fprintf(stderr, "topright\n");
} else if (x >= (c->dx + BORDER)) {
if (y <= CORNER) {
if (debug) fprintf(stderr, "topright\n");
return BorderENE;
}
if(y >= (c->dy + 2*BORDER) - CORNER){
if(debug) fprintf(stderr, "botright\n");
if (y >= (c->dy + 2 * BORDER) - CORNER) {
if (debug) fprintf(stderr, "botright\n");
return BorderESE;
}
if(y > CORNER &&
y < (c->dy + 2*BORDER) - CORNER){
if(debug) fprintf(stderr, "right\n");
if (y > CORNER && y < (c->dy + 2 * BORDER) - CORNER) {
if (debug) fprintf(stderr, "right\n");
return BorderE;
}
} else if(x >= (c->dx + 2*BORDER) - CORNER){
if(y <= BORDER){
if(debug) fprintf(stderr, "topright\n");
} else if (x >= (c->dx + 2 * BORDER) - CORNER) {
if (y <= BORDER) {
if (debug) fprintf(stderr, "topright\n");
return BorderNNE;
}
if (y >= (c->dy + BORDER)){
if(debug) fprintf(stderr, "botright\n");
if (y >= (c->dy + BORDER)) {
if (debug) fprintf(stderr, "botright\n");
return BorderSSE;
}
} else if(x > CORNER &&
x < (c->dx + 2*BORDER) - CORNER){
if(y <= BORDER){
if(debug) fprintf(stderr, "top\n");
} else if (x > CORNER && x < (c->dx + 2 * BORDER) - CORNER) {
if (y <= BORDER) {
if (debug) fprintf(stderr, "top\n");
return BorderN;
}
if(y >= (c->dy + BORDER)){
if(debug) fprintf(stderr, "bot\n");
if (y >= (c->dy + BORDER)) {
if (debug) fprintf(stderr, "bot\n");
return BorderS;
}
}
@ -614,15 +535,14 @@ borderorient(Client *c, int x, int y)
}
void
motionnotify(XMotionEvent *e)
{
Client *c;
motionnotify(XMotionEvent* e) {
Client* c;
BorderOrient bl;
c = getclient(e->window, 0);
if(c){
if (c) {
bl = borderorient(c, e->x, e->y);
if(bl == BorderUnknown)
if (bl == BorderUnknown)
XUndefineCursor(dpy, c->parent);
else
XDefineCursor(dpy, c->parent, c->screen->bordcurs[bl]);

17
fns.h Executable file → Normal file
View file

@ -8,14 +8,14 @@
#define setstate setstaterio
/* color.c */
unsigned long colorpixel(Display*, ScreenInfo*, int, unsigned long, unsigned long);
unsigned long
colorpixel(Display*, ScreenInfo*, int, unsigned long, unsigned long);
/* main.c */
void usage();
void initscreen();
ScreenInfo *getscreen();
ScreenInfo* getscreen();
Time timestamp();
void sendcmessage();
void sendconfig();
@ -52,7 +52,7 @@ void cmapfocus();
void cmapnofocus();
void getcmaps();
int _getprop();
char *getprop();
char* getprop();
Window getwprop();
int getiprop();
int getstate();
@ -65,7 +65,7 @@ void gettrans();
void keypress();
void keyrelease();
void keysetup();
void quickreshape(Client *c, int x, int y, int dx, int dy);
void quickreshape(Client* c, int x, int y, int dx, int dy);
void stickystack(int);
void centercurrent(XWindowAttributes ra);
@ -74,7 +74,7 @@ void button();
void spawn();
void reshape();
void move();
void delete();
void delete ();
void hide();
void unhide();
void unhidec();
@ -85,14 +85,13 @@ void switch_to();
void switch_to_c();
void stick();
/* client.c */
void setactive();
void draw_border();
void active();
void nofocus();
void top();
Client *getclient();
Client* getclient();
void rmclient();
void dump_revert();
void dump_clients();
@ -101,7 +100,7 @@ int isautostick(Client* c);
/* grab.c */
int menuhit();
Client *selectwin();
Client* selectwin();
int sweep();
int drag();
int pull();

454
grab.c Executable file → Normal file
View file

@ -8,7 +8,7 @@
#include "fns.h"
int
nobuttons(XButtonEvent *e) /* Einstuerzende */
nobuttons(XButtonEvent* e) /* Einstuerzende */
{
int state;
@ -17,260 +17,246 @@ nobuttons(XButtonEvent *e) /* Einstuerzende */
}
int
grab(Window w, Window constrain, int mask, Cursor curs, int t)
{
grab(Window w, Window constrain, int mask, Cursor curs, int t) {
int status;
if(t == 0)
t = timestamp();
status = XGrabPointer(dpy, w, False, mask,
GrabModeAsync, GrabModeAsync, constrain, curs, t);
if (t == 0) t = timestamp();
status = XGrabPointer(
dpy, w, False, mask, GrabModeAsync, GrabModeAsync, constrain, curs, t);
return status;
}
void
ungrab(XButtonEvent *e)
{
ungrab(XButtonEvent* e) {
XEvent ev;
if(!nobuttons(e))
for(;;){
if (!nobuttons(e))
for (;;) {
XMaskEvent(dpy, ButtonMask | ButtonMotionMask, &ev);
if(ev.type == MotionNotify)
continue;
if (ev.type == MotionNotify) continue;
e = &ev.xbutton;
if(nobuttons(e))
break;
if (nobuttons(e)) break;
}
XUngrabPointer(dpy, e->time);
curtime = e->time;
}
static void
drawstring(Display *dpy, ScreenInfo *s, Menu *m, int wide, int high, int i, int selected)
{
drawstring(
Display* dpy, ScreenInfo* s, Menu* m, int wide, int high, int i,
int selected) {
int tx, ty;
tx = (wide - XTextWidth(font, m->item[i], strlen(m->item[i])))/2;
ty = i*high + font->ascent + 1;
XFillRectangle(dpy, s->menuwin, selected ? s->gcmenubgs : s->gcmenubg, 0, i*high, wide, high);
XDrawString(dpy, s->menuwin, selected ? s->gcmenufgs : s->gcmenufg, tx, ty, m->item[i], strlen(m->item[i]));
tx = (wide - XTextWidth(font, m->item[i], strlen(m->item[i]))) / 2;
ty = i * high + font->ascent + 1;
XFillRectangle(
dpy,
s->menuwin,
selected ? s->gcmenubgs : s->gcmenubg,
0,
i * high,
wide,
high);
XDrawString(
dpy,
s->menuwin,
selected ? s->gcmenufgs : s->gcmenufg,
tx,
ty,
m->item[i],
strlen(m->item[i]));
}
int
menuhit(XButtonEvent *e, Menu *m)
{
menuhit(XButtonEvent* e, Menu* m) {
XEvent ev;
int i, n, cur, old, wide, high, status, drawn, warp;
int x, y, dx, dy, xmax, ymax;
ScreenInfo *s;
ScreenInfo* s;
if(font == 0)
return -1;
if (font == 0) return -1;
s = getscreen(e->root);
if(s == 0 || e->window == s->menuwin) /* ugly event mangling */
if (s == 0 || e->window == s->menuwin) /* ugly event mangling */
return -1;
dx = 0;
for(n = 0; m->item[n]; n++){
for (n = 0; m->item[n]; n++) {
wide = XTextWidth(font, m->item[n], strlen(m->item[n])) + 4;
if(wide > dx)
dx = wide;
if (wide > dx) dx = wide;
}
wide = dx;
cur = m->lasthit;
if(cur >= n)
cur = n - 1;
if (cur >= n) cur = n - 1;
high = font->ascent + font->descent + 1;
dy = n*high;
x = e->x - wide/2;
y = e->y - cur*high - high/2;
dy = n * high;
x = e->x - wide / 2;
y = e->y - cur * high - high / 2;
warp = 0;
xmax = DisplayWidth(dpy, s->num);
ymax = DisplayHeight(dpy, s->num);
if(x < 0){
if (x < 0) {
e->x -= x;
x = 0;
warp++;
}
if(x+wide >= xmax){
e->x -= x+wide-xmax;
x = xmax-wide;
if (x + wide >= xmax) {
e->x -= x + wide - xmax;
x = xmax - wide;
warp++;
}
if(y < 0){
if (y < 0) {
e->y -= y;
y = 0;
warp++;
}
if(y+dy >= ymax){
e->y -= y+dy-ymax;
y = ymax-dy;
if (y + dy >= ymax) {
e->y -= y + dy - ymax;
y = ymax - dy;
warp++;
}
if(warp)
setmouse(e->x, e->y, s);
if (warp) setmouse(e->x, e->y, s);
XMoveResizeWindow(dpy, s->menuwin, x, y, dx, dy);
XSelectInput(dpy, s->menuwin, MenuMask);
XMapRaised(dpy, s->menuwin);
status = grab(s->menuwin, None, MenuGrabMask, None, e->time);
if(status != GrabSuccess){
if (status != GrabSuccess) {
/* graberror("menuhit", status); */
XUnmapWindow(dpy, s->menuwin);
return -1;
}
drawn = 0;
for(;;){
for (;;) {
XMaskEvent(dpy, MenuMask, &ev);
switch (ev.type){
switch (ev.type) {
default:
fprintf(stderr, "ryudo: menuhit: unknown ev.type %d\n", ev.type);
break;
case ButtonPress:
break;
case ButtonPress: break;
case ButtonRelease:
if(ev.xbutton.button != e->button)
break;
if (ev.xbutton.button != e->button) break;
x = ev.xbutton.x;
y = ev.xbutton.y;
i = y/high;
if(cur >= 0 && y >= cur*high-3 && y < (cur+1)*high+3)
i = y / high;
if (cur >= 0 && y >= cur * high - 3 && y < (cur + 1) * high + 3)
i = cur;
if(x < 0 || x > wide || y < -3)
if (x < 0 || x > wide || y < -3)
i = -1;
else if(i < 0 || i >= n)
else if (i < 0 || i >= n)
i = -1;
else
m->lasthit = i;
if(!nobuttons(&ev.xbutton))
i = -1;
if (!nobuttons(&ev.xbutton)) i = -1;
ungrab(&ev.xbutton);
XUnmapWindow(dpy, s->menuwin);
return i;
case MotionNotify:
if(!drawn)
break;
if (!drawn) break;
x = ev.xbutton.x;
y = ev.xbutton.y;
old = cur;
cur = y/high;
if(old >= 0 && y >= old*high-3 && y < (old+1)*high+3)
cur = y / high;
if (old >= 0 && y >= old * high - 3 && y < (old + 1) * high + 3)
cur = old;
if(x < 0 || x > wide || y < -3)
if (x < 0 || x > wide || y < -3)
cur = -1;
else if(cur < 0 || cur >= n)
else if (cur < 0 || cur >= n)
cur = -1;
if(cur == old)
break;
if(old >= 0 && old < n)
drawstring(dpy, s, m, wide, high, old, 0);
if(cur >= 0 && cur < n)
drawstring(dpy, s, m, wide, high, cur, 1);
if (cur == old) break;
if (old >= 0 && old < n) drawstring(dpy, s, m, wide, high, old, 0);
if (cur >= 0 && cur < n) drawstring(dpy, s, m, wide, high, cur, 1);
break;
case Expose:
XClearWindow(dpy, s->menuwin);
for(i = 0; i < n; i++)
drawstring(dpy, s, m, wide, high, i, cur==i);
for (i = 0; i < n; i++) drawstring(dpy, s, m, wide, high, i, cur == i);
drawn = 1;
}
}
}
Client *
selectwin(int release, int *shift, ScreenInfo *s)
{
Client*
selectwin(int release, int* shift, ScreenInfo* s) {
XEvent ev;
XButtonEvent *e;
XButtonEvent* e;
int status;
Window w;
Client *c;
Client* c;
status = grab(s->root, s->root, ButtonMask, s->target, 0);
if(status != GrabSuccess){
if (status != GrabSuccess) {
graberror("selectwin", status); /* */
return 0;
}
w = None;
for(;;){
for (;;) {
XMaskEvent(dpy, ButtonMask, &ev);
e = &ev.xbutton;
switch (ev.type){
switch (ev.type) {
case ButtonPress:
if(e->button != Button3){
if (e->button != Button3) {
ungrab(e);
return 0;
}
w = e->subwindow;
if(!release){
if (!release) {
c = getclient(w, 0);
if(c == 0)
ungrab(e);
if(shift != 0)
*shift = (e->state&ShiftMask) != 0;
if (c == 0) ungrab(e);
if (shift != 0) *shift = (e->state & ShiftMask) != 0;
return c;
}
break;
case ButtonRelease:
ungrab(e);
if(e->button != Button3 || e->subwindow != w)
return 0;
if(shift != 0)
*shift = (e->state&ShiftMask) != 0;
if (e->button != Button3 || e->subwindow != w) return 0;
if (shift != 0) *shift = (e->state & ShiftMask) != 0;
return getclient(w, 0);
}
}
}
int
sweepcalc(Client *c, int x, int y, BorderOrient bl, int ignored)
{
sweepcalc(Client* c, int x, int y, BorderOrient bl, int ignored) {
int dx, dy, sx, sy;
dx = x - c->x;
dy = y - c->y;
sx = sy = 1;
x += dx;
if(dx < 0){
if (dx < 0) {
dx = -dx;
sx = -1;
}
y += dy;
if(dy < 0){
if (dy < 0) {
dy = -dy;
sy = -1;
}
dx -= 2*BORDER;
dy -= 2*BORDER;
dx -= 2 * BORDER;
dy -= 2 * BORDER;
if(!c->is9term){
if(dx < c->min_dx)
dx = c->min_dx;
if(dy < c->min_dy)
dy = c->min_dy;
if (!c->is9term) {
if (dx < c->min_dx) dx = c->min_dx;
if (dy < c->min_dy) dy = c->min_dy;
}
if(c->size.flags & PResizeInc){
dx = c->min_dx + (dx-c->min_dx)/c->size.width_inc*c->size.width_inc;
dy = c->min_dy + (dy-c->min_dy)/c->size.height_inc*c->size.height_inc;
if (c->size.flags & PResizeInc) {
dx = c->min_dx + (dx - c->min_dx) / c->size.width_inc * c->size.width_inc;
dy = c->min_dy + (dy - c->min_dy) / c->size.height_inc * c->size.height_inc;
}
if(c->size.flags & PMaxSize){
if(dx > c->size.max_width)
dx = c->size.max_width;
if(dy > c->size.max_height)
dy = c->size.max_height;
if (c->size.flags & PMaxSize) {
if (dx > c->size.max_width) dx = c->size.max_width;
if (dy > c->size.max_height) dy = c->size.max_height;
}
c->dx = sx*(dx + 2*BORDER);
c->dy = sy*(dy + 2*BORDER);
c->dx = sx * (dx + 2 * BORDER);
c->dy = sy * (dy + 2 * BORDER);
return ignored;
}
int
dragcalc(Client *c, int x, int y, BorderOrient bl, int ignored)
{
dragcalc(Client* c, int x, int y, BorderOrient bl, int ignored) {
c->x += x;
c->y += y;
@ -278,8 +264,7 @@ dragcalc(Client *c, int x, int y, BorderOrient bl, int ignored)
}
int
pullcalc(Client *c, int x, int y, BorderOrient bl, int init)
{
pullcalc(Client* c, int x, int y, BorderOrient bl, int init) {
int dx, dy, sx, sy, px, py, spx, spy, rdx, rdy, xoff, yoff, xcorn, ycorn;
px = c->x;
@ -291,7 +276,7 @@ pullcalc(Client *c, int x, int y, BorderOrient bl, int init)
xoff = yoff = 0;
xcorn = ycorn = 0;
switch(bl){
switch (bl) {
case BorderN:
py = y;
dy = (c->y + c->dy) - y;
@ -348,38 +333,49 @@ pullcalc(Client *c, int x, int y, BorderOrient bl, int init)
xoff = x - c->x;
yoff = (c->y + c->dy) - y;
break;
default:
break;
default: break;
}
switch(bl){
switch (bl) {
case BorderNNW:
case BorderNNE:
case BorderSSW:
case BorderSSE:
xcorn = 1;
break;
case BorderSSE: xcorn = 1; break;
case BorderWNW:
case BorderENE:
case BorderWSW:
case BorderESE:
ycorn = 1;
break;
case BorderESE: ycorn = 1; break;
}
if(!init
|| xoff < 0 || (xcorn && xoff > CORNER) || (!xcorn && xoff > BORDER)
|| yoff < 0 || (ycorn && yoff > CORNER) || (!ycorn && yoff > BORDER)){
if (
!init || xoff < 0 || (xcorn && xoff > CORNER) ||
(!xcorn && xoff > BORDER) || yoff < 0 || (ycorn && yoff > CORNER) ||
(!ycorn && yoff > BORDER)) {
xoff = 0;
yoff = 0;
init = 0;
}
if(debug) fprintf(stderr, "c %dx%d+%d+%d m +%d+%d r %dx%d+%d+%d sp (%d,%d) bl %d\n",
c->dx, c->dy, c->x, c->y, x, y, dx, dy, px, py, spx, spy, bl);
if(dx < 0){
if (debug)
fprintf(
stderr,
"c %dx%d+%d+%d m +%d+%d r %dx%d+%d+%d sp (%d,%d) bl %d\n",
c->dx,
c->dy,
c->x,
c->y,
x,
y,
dx,
dy,
px,
py,
spx,
spy,
bl);
if (dx < 0) {
dx = -dx;
sx = -1;
}
if(dy < 0){
if (dy < 0) {
dy = -dy;
sy = -1;
}
@ -387,92 +383,87 @@ pullcalc(Client *c, int x, int y, BorderOrient bl, int init)
/* remember requested size;
* after applying size hints we may have to correct position
*/
rdx = sx*dx;
rdy = sy*dy;
rdx = sx * dx;
rdy = sy * dy;
/* apply size hints */
dx -= (2*BORDER - xoff);
dy -= (2*BORDER - yoff);
dx -= (2 * BORDER - xoff);
dy -= (2 * BORDER - yoff);
if(!c->is9term){
if(dx < c->min_dx)
dx = c->min_dx;
if(dy < c->min_dy)
dy = c->min_dy;
if (!c->is9term) {
if (dx < c->min_dx) dx = c->min_dx;
if (dy < c->min_dy) dy = c->min_dy;
}
if(c->size.flags & PResizeInc){
dx = c->min_dx + (dx-c->min_dx)/c->size.width_inc*c->size.width_inc;
dy = c->min_dy + (dy-c->min_dy)/c->size.height_inc*c->size.height_inc;
if (c->size.flags & PResizeInc) {
dx = c->min_dx + (dx - c->min_dx) / c->size.width_inc * c->size.width_inc;
dy = c->min_dy + (dy - c->min_dy) / c->size.height_inc * c->size.height_inc;
}
if(c->size.flags & PMaxSize){
if(dx > c->size.max_width)
dx = c->size.max_width;
if(dy > c->size.max_height)
dy = c->size.max_height;
if (c->size.flags & PMaxSize) {
if (dx > c->size.max_width) dx = c->size.max_width;
if (dy > c->size.max_height) dy = c->size.max_height;
}
/* set size and position */
c->dx = sx*(dx + 2*BORDER );
c->dy = sy*(dy + 2*BORDER );
c->dx = sx * (dx + 2 * BORDER);
c->dy = sy * (dy + 2 * BORDER);
c->x = px;
c->y = py;
/* compensate position for size changed due to size hints */
if(spx)
c->x -= c->dx - rdx;
if(spy)
c->y -= c->dy - rdy;
if (spx) c->x -= c->dx - rdx;
if (spy) c->y -= c->dy - rdy;
return init;
}
static void
xcopy(int fwd, Display *dpy, Drawable src, Drawable dst, GC gc, int x, int y, int dx, int dy, int x1, int y1)
{
if(fwd)
xcopy(
int fwd, Display* dpy, Drawable src, Drawable dst, GC gc, int x, int y,
int dx, int dy, int x1, int y1) {
if (fwd)
XCopyArea(dpy, src, dst, gc, x, y, dx, dy, x1, y1);
else
XCopyArea(dpy, dst, src, gc, x1, y1, dx, dy, x, y);
}
void
drawbound(Client *c, int drawing)
{
drawbound(Client* c, int drawing) {
int x, y, dx, dy;
ScreenInfo *s;
ScreenInfo* s;
if(debug) fprintf(stderr, "drawbound %d %dx%d+%d+%d\n", drawing, c->dx, c->dy, c->x, c->y);
if (debug)
fprintf(
stderr, "drawbound %d %dx%d+%d+%d\n", drawing, c->dx, c->dy, c->x, c->y);
s = c->screen;
x = c->x;
y = c->y;
dx = c->dx;
dy = c->dy;
if(dx < 0){
if (dx < 0) {
x += dx;
dx = -dx;
}
if(dy < 0){
if (dy < 0) {
y += dy;
dy = -dy;
}
if(dx <= 2 || dy <= 2)
return;
if (dx <= 2 || dy <= 2) return;
if(solidsweep){
if(drawing == -1){
if (solidsweep) {
if (drawing == -1) {
XUnmapWindow(dpy, s->sweepwin);
return;
}
x += BORDER;
y += BORDER;
dx -= 2*BORDER;
dy -= 2*BORDER;
dx -= 2 * BORDER;
dy -= 2 * BORDER;
if(drawing){
if (drawing) {
XMoveResizeWindow(dpy, s->sweepwin, x, y, dx, dy);
XSelectInput(dpy, s->sweepwin, MenuMask);
XMapRaised(dpy, s->sweepwin);
@ -480,40 +471,61 @@ drawbound(Client *c, int drawing)
return;
}
if(drawing == -1)
return;
if (drawing == -1) return;
xcopy(drawing, dpy, s->root, s->bkup[0], s->gccopy, x, y, dx, BORDER, 0, 0);
xcopy(drawing, dpy, s->root, s->bkup[0], s->gccopy, x, y+dy-BORDER, dx, BORDER, dx, 0);
xcopy(
drawing,
dpy,
s->root,
s->bkup[0],
s->gccopy,
x,
y + dy - BORDER,
dx,
BORDER,
dx,
0);
xcopy(drawing, dpy, s->root, s->bkup[1], s->gccopy, x, y, BORDER, dy, 0, 0);
xcopy(drawing, dpy, s->root, s->bkup[1], s->gccopy, x+dx-BORDER, y, BORDER, dy, 0, dy);
xcopy(
drawing,
dpy,
s->root,
s->bkup[1],
s->gccopy,
x + dx - BORDER,
y,
BORDER,
dy,
0,
dy);
if(drawing){
if (drawing) {
XFillRectangle(dpy, s->root, s->gcred, x, y, dx, BORDER);
XFillRectangle(dpy, s->root, s->gcred, x, y+dy-BORDER, dx, BORDER);
XFillRectangle(dpy, s->root, s->gcred, x, y + dy - BORDER, dx, BORDER);
XFillRectangle(dpy, s->root, s->gcred, x, y, BORDER, dy);
XFillRectangle(dpy, s->root, s->gcred, x+dx-BORDER, y, BORDER, dy);
XFillRectangle(dpy, s->root, s->gcred, x + dx - BORDER, y, BORDER, dy);
}
}
void
misleep(int msec)
{
misleep(int msec) {
struct timeval t;
t.tv_sec = msec/1000;
t.tv_usec = (msec%1000)*1000;
t.tv_sec = msec / 1000;
t.tv_usec = (msec % 1000) * 1000;
select(0, 0, 0, 0, &t);
}
int
sweepdrag(Client *c, int but, XButtonEvent *e0, BorderOrient bl, int (*recalc)(Client*, int, int, BorderOrient, int))
{
sweepdrag(
Client* c, int but, XButtonEvent* e0, BorderOrient bl,
int (*recalc)(Client*, int, int, BorderOrient, int)) {
XEvent ev;
int idle;
int cx, cy, rx, ry;
int ox, oy, odx, ody;
XButtonEvent *e;
XButtonEvent* e;
int notmoved;
notmoved = 1;
@ -523,34 +535,32 @@ sweepdrag(Client *c, int but, XButtonEvent *e0, BorderOrient bl, int (*recalc)(C
ody = c->dy;
c->x -= BORDER;
c->y -= BORDER;
c->dx += 2*BORDER;
c->dy += 2*BORDER;
if(bl != BorderUnknown || e0 == 0)
c->dx += 2 * BORDER;
c->dy += 2 * BORDER;
if (bl != BorderUnknown || e0 == 0)
getmouse(&cx, &cy, c->screen);
else
getmouse(&c->x, &c->y, c->screen);
XGrabServer(dpy);
if(bl != BorderUnknown){
notmoved = recalc(c, cx, cy, bl, notmoved);
}
if (bl != BorderUnknown) { notmoved = recalc(c, cx, cy, bl, notmoved); }
drawbound(c, 1);
idle = 0;
for(;;){
if(XCheckMaskEvent(dpy, ButtonMask, &ev) == 0){
for (;;) {
if (XCheckMaskEvent(dpy, ButtonMask, &ev) == 0) {
getmouse(&rx, &ry, c->screen);
if(rx != cx || ry != cy || ++idle > 300){
if (rx != cx || ry != cy || ++idle > 300) {
drawbound(c, 0);
if(rx == cx && ry == cy){
if (rx == cx && ry == cy) {
XUngrabServer(dpy);
XFlush(dpy);
misleep(500);
XGrabServer(dpy);
idle = 0;
}
if(e0 || bl != BorderUnknown)
if (e0 || bl != BorderUnknown)
notmoved = recalc(c, rx, ry, bl, notmoved);
else
notmoved = recalc(c, rx-cx, ry-cy, bl, notmoved);
notmoved = recalc(c, rx - cx, ry - cy, bl, notmoved);
cx = rx;
cy = ry;
drawbound(c, 1);
@ -560,33 +570,32 @@ sweepdrag(Client *c, int but, XButtonEvent *e0, BorderOrient bl, int (*recalc)(C
continue;
}
e = &ev.xbutton;
switch (ev.type){
switch (ev.type) {
case ButtonPress:
case ButtonRelease:
drawbound(c, 0);
ungrab(e);
XUngrabServer(dpy);
if(e->button != but && c->init)
goto bad;
if(c->dx < 0){
if (e->button != but && c->init) goto bad;
if (c->dx < 0) {
c->x += c->dx;
c->dx = -c->dx;
}
if(c->dy < 0){
if (c->dy < 0) {
c->y += c->dy;
c->dy = -c->dy;
}
c->x += BORDER;
c->y += BORDER;
c->dx -= 2*BORDER;
c->dy -= 2*BORDER;
if(c->dx < 4 || c->dy < 4 || c->dx < c->min_dx || c->dy < c->min_dy)
c->dx -= 2 * BORDER;
c->dy -= 2 * BORDER;
if (c->dx < 4 || c->dy < 4 || c->dx < c->min_dx || c->dy < c->min_dy)
goto bad;
return 1;
}
}
bad:
if(debug) fprintf(stderr, "sweepdrag bad\n");
if (debug) fprintf(stderr, "sweepdrag bad\n");
c->x = ox;
c->y = oy;
c->dx = odx;
@ -596,25 +605,24 @@ bad:
}
int
sweep(Client *c, int but, XButtonEvent *ignored)
{
sweep(Client* c, int but, XButtonEvent* ignored) {
XEvent ev;
int status;
XButtonEvent *e;
ScreenInfo *s;
XButtonEvent* e;
ScreenInfo* s;
s = c->screen;
c->dx = 0;
c->dy = 0;
status = grab(s->root, s->root, ButtonMask, s->sweep0, 0);
if(status != GrabSuccess){
if (status != GrabSuccess) {
graberror("sweep", status); /* */
return 0;
}
XMaskEvent(dpy, ButtonMask, &ev);
e = &ev.xbutton;
if(e->button != but){
if (e->button != but) {
ungrab(e);
return 0;
}
@ -623,10 +631,9 @@ sweep(Client *c, int but, XButtonEvent *ignored)
}
int
pull(Client *c, int but, XButtonEvent *e)
{
pull(Client* c, int but, XButtonEvent* e) {
int status;
ScreenInfo *s;
ScreenInfo* s;
BorderOrient bl;
bl = borderorient(c, e->x, e->y);
@ -634,7 +641,7 @@ pull(Client *c, int but, XButtonEvent *e)
s = c->screen;
status = grab(s->root, s->root, ButtonMask, s->bordcurs[bl], 0);
if(status != GrabSuccess){
if (status != GrabSuccess) {
graberror("pull", status); /* */
return 0;
}
@ -643,14 +650,13 @@ pull(Client *c, int but, XButtonEvent *e)
}
int
drag(Client *c, int but)
{
drag(Client* c, int but) {
int status;
ScreenInfo *s;
ScreenInfo* s;
s = c->screen;
status = grab(s->root, s->root, ButtonMask, s->boxcurs, 0);
if(status != GrabSuccess){
if (status != GrabSuccess) {
graberror("drag", status); /* */
return 0;
}
@ -658,18 +664,16 @@ drag(Client *c, int but)
}
void
getmouse(int *x, int *y, ScreenInfo *s)
{
getmouse(int* x, int* y, ScreenInfo* s) {
Window dw1, dw2;
int t1, t2;
unsigned int t3;
XQueryPointer(dpy, s->root, &dw1, &dw2, x, y, &t1, &t2, &t3);
if(debug) fprintf(stderr, "getmouse: %d %d\n", *x, *y);
if (debug) fprintf(stderr, "getmouse: %d %d\n", *x, *y);
}
void
setmouse(int x, int y, ScreenInfo *s)
{
setmouse(int x, int y, ScreenInfo* s) {
XWarpPointer(dpy, None, s->root, None, None, None, None, x, y);
}

313
key.c Executable file → Normal file
View file

@ -18,11 +18,7 @@
#include "fns.h"
#include "patchlevel.h"
enum
{
GrabAltTab,
GrabAltAny
};
enum { GrabAltTab, GrabAltAny };
/*static int tabcode = 0x17; */
/*static int altcode = 0x40; */
@ -32,8 +28,7 @@ enum
static void alttab(int shift);
void
keysetup(void)
{
keysetup(void) {
int i;
int tabcode = XKeysymToKeycode(dpy, XK_Tab);
int dcode = XKeysymToKeycode(dpy, DESTROY_KEY);
@ -60,41 +55,90 @@ keysetup(void)
int bcode = XKeysymToKeycode(dpy, STICKYTOBACK_KEY);
#endif
for(i=0; i<num_screens; i++){
XGrabKey(dpy, tabcode, Mod1Mask, screens[i].root, 0, GrabModeSync, GrabModeAsync);
XGrabKey(dpy, dcode, SHORTCUTMOD, screens[i].root, 0, GrabModeSync, GrabModeAsync);
XGrabKey(dpy, icode, SHORTCUTMOD, screens[i].root, 0, GrabModeSync, GrabModeAsync);
XGrabKey(dpy, ucode, SHORTCUTMOD, screens[i].root, 0, GrabModeSync, GrabModeAsync);
XGrabKey(dpy, rcode, SHORTCUTMOD, screens[i].root, 0, GrabModeSync, GrabModeAsync);
XGrabKey(dpy, vcode, SHORTCUTMOD, screens[i].root, 0, GrabModeSync, GrabModeAsync);
XGrabKey(dpy, mcode, SHORTCUTMOD, screens[i].root, 0, GrabModeSync, GrabModeAsync);
XGrabKey(dpy, scode, SHORTCUTMOD, screens[i].root, 0, GrabModeSync, GrabModeAsync);
XGrabKey(dpy, hcode, SHORTCUTMOD, screens[i].root, 0, GrabModeSync, GrabModeAsync);
XGrabKey(dpy, lcode, SHORTCUTMOD, screens[i].root, 0, GrabModeSync, GrabModeAsync);
XGrabKey(dpy, jcode, SHORTCUTMOD, screens[i].root, 0, GrabModeSync, GrabModeAsync);
XGrabKey(dpy, kcode, SHORTCUTMOD, screens[i].root, 0, GrabModeSync, GrabModeAsync);
XGrabKey(dpy, qcode, SHORTCUTMOD, screens[i].root, 0, GrabModeSync, GrabModeAsync);
XGrabKey(dpy, wcode, SHORTCUTMOD, screens[i].root, 0, GrabModeSync, GrabModeAsync);
XGrabKey(dpy, ocode, SHORTCUTMOD, screens[i].root, 0, GrabModeSync, GrabModeAsync);
XGrabKey(dpy, pcode, SHORTCUTMOD, screens[i].root, 0, GrabModeSync, GrabModeAsync);
XGrabKey(dpy, ccode, SHORTCUTMOD, screens[i].root, 0, GrabModeSync, GrabModeAsync);
XGrabKey(dpy, leftcode, SHORTCUTMOD, screens[i].root, 0, GrabModeSync, GrabModeAsync);
XGrabKey(dpy, rightcode, SHORTCUTMOD, screens[i].root, 0, GrabModeSync, GrabModeAsync);
XGrabKey(dpy, slcode, SHORTCUTMOD, screens[i].root, 0, GrabModeSync, GrabModeAsync);
XGrabKey(dpy, tabcode, Mod1Mask|ShiftMask, screens[i].root, 0, GrabModeSync, GrabModeAsync);
for (i = 0; i < num_screens; i++) {
XGrabKey(
dpy, tabcode, Mod1Mask, screens[i].root, 0, GrabModeSync, GrabModeAsync);
XGrabKey(
dpy, dcode, SHORTCUTMOD, screens[i].root, 0, GrabModeSync, GrabModeAsync);
XGrabKey(
dpy, icode, SHORTCUTMOD, screens[i].root, 0, GrabModeSync, GrabModeAsync);
XGrabKey(
dpy, ucode, SHORTCUTMOD, screens[i].root, 0, GrabModeSync, GrabModeAsync);
XGrabKey(
dpy, rcode, SHORTCUTMOD, screens[i].root, 0, GrabModeSync, GrabModeAsync);
XGrabKey(
dpy, vcode, SHORTCUTMOD, screens[i].root, 0, GrabModeSync, GrabModeAsync);
XGrabKey(
dpy, mcode, SHORTCUTMOD, screens[i].root, 0, GrabModeSync, GrabModeAsync);
XGrabKey(
dpy, scode, SHORTCUTMOD, screens[i].root, 0, GrabModeSync, GrabModeAsync);
XGrabKey(
dpy, hcode, SHORTCUTMOD, screens[i].root, 0, GrabModeSync, GrabModeAsync);
XGrabKey(
dpy, lcode, SHORTCUTMOD, screens[i].root, 0, GrabModeSync, GrabModeAsync);
XGrabKey(
dpy, jcode, SHORTCUTMOD, screens[i].root, 0, GrabModeSync, GrabModeAsync);
XGrabKey(
dpy, kcode, SHORTCUTMOD, screens[i].root, 0, GrabModeSync, GrabModeAsync);
XGrabKey(
dpy, qcode, SHORTCUTMOD, screens[i].root, 0, GrabModeSync, GrabModeAsync);
XGrabKey(
dpy, wcode, SHORTCUTMOD, screens[i].root, 0, GrabModeSync, GrabModeAsync);
XGrabKey(
dpy, ocode, SHORTCUTMOD, screens[i].root, 0, GrabModeSync, GrabModeAsync);
XGrabKey(
dpy, pcode, SHORTCUTMOD, screens[i].root, 0, GrabModeSync, GrabModeAsync);
XGrabKey(
dpy, ccode, SHORTCUTMOD, screens[i].root, 0, GrabModeSync, GrabModeAsync);
XGrabKey(
dpy,
leftcode,
SHORTCUTMOD,
screens[i].root,
0,
GrabModeSync,
GrabModeAsync);
XGrabKey(
dpy,
rightcode,
SHORTCUTMOD,
screens[i].root,
0,
GrabModeSync,
GrabModeAsync);
XGrabKey(
dpy,
slcode,
SHORTCUTMOD,
screens[i].root,
0,
GrabModeSync,
GrabModeAsync);
XGrabKey(
dpy,
tabcode,
Mod1Mask | ShiftMask,
screens[i].root,
0,
GrabModeSync,
GrabModeAsync);
#ifdef DEVEL
XGrabKey(dpy, tcode, SHORTCUTMOD, screens[i].root, 0, GrabModeSync, GrabModeAsync);
XGrabKey(dpy, bcode, SHORTCUTMOD, screens[i].root, 0, GrabModeSync, GrabModeAsync);
XGrabKey(
dpy, tcode, SHORTCUTMOD, screens[i].root, 0, GrabModeSync, GrabModeAsync);
XGrabKey(
dpy, bcode, SHORTCUTMOD, screens[i].root, 0, GrabModeSync, GrabModeAsync);
#endif
/* XGrabKey(dpy, pgupcode, Mod1Mask, screens[i].root, 0, GrabModeSync, GrabModeAsync); */
/* XGrabKey(dpy, pgdowncode, Mod1Mask, screens[i].root, 0, GrabModeSync, GrabModeAsync); */
/* XGrabKey(dpy, altcode, 0, screens[i].root, 0, GrabModeSync, GrabModeAsync); */
/* XGrabKey(dpy, pgupcode, Mod1Mask, screens[i].root, 0, GrabModeSync,
* GrabModeAsync); */
/* XGrabKey(dpy, pgdowncode, Mod1Mask, screens[i].root, 0, GrabModeSync,
* GrabModeAsync); */
/* XGrabKey(dpy, altcode, 0, screens[i].root, 0, GrabModeSync,
* GrabModeAsync); */
}
}
void
keypress(XKeyEvent *e)
{
keypress(XKeyEvent* e) {
/*
* process key press here
*/
@ -126,70 +170,100 @@ keypress(XKeyEvent *e)
static XWindowAttributes ra;
XGetWindowAttributes(dpy, DefaultRootWindow(dpy), &ra);
/* basic wm functionality */
if(e->keycode == tabcode && (e->state&Mod1Mask) == (1<<3))
alttab(e->state&ShiftMask);
else if(e->keycode == dcode && (e->state&SHORTCUTMOD) == (MODBITS))
delete(current, 0);
else if (e->keycode == icode && (e->state&SHORTCUTMOD) == (MODBITS))
/* basic wm functionality */
if (e->keycode == tabcode && (e->state & Mod1Mask) == (1 << 3))
alttab(e->state & ShiftMask);
else if (e->keycode == dcode && (e->state & SHORTCUTMOD) == (MODBITS))
delete (current, 0);
else if (e->keycode == icode && (e->state & SHORTCUTMOD) == (MODBITS))
hide(current);
else if (e->keycode == ucode && (e->state&SHORTCUTMOD) == (MODBITS))
else if (e->keycode == ucode && (e->state & SHORTCUTMOD) == (MODBITS))
unhide(0, 1);
else if (e->keycode == vcode && (e->state&SHORTCUTMOD) == (MODBITS))
else if (e->keycode == vcode && (e->state & SHORTCUTMOD) == (MODBITS))
move(current, Button3);
else if (e->keycode == rcode && (e->state&SHORTCUTMOD) == (MODBITS))
else if (e->keycode == rcode && (e->state & SHORTCUTMOD) == (MODBITS))
reshape(current, Button3, sweep, 0);
else if (e->keycode == mcode && (e->state&SHORTCUTMOD) == (MODBITS))
quickreshape(current, -BORDER, -BORDER, ra.width + 2*BORDER, ra.height + 2*BORDER);
else if (e->keycode == scode && (e->state&SHORTCUTMOD) == (MODBITS))
else if (e->keycode == mcode && (e->state & SHORTCUTMOD) == (MODBITS))
quickreshape(
current, -BORDER, -BORDER, ra.width + 2 * BORDER, ra.height + 2 * BORDER);
else if (e->keycode == scode && (e->state & SHORTCUTMOD) == (MODBITS))
stick(current);
/* half snap */
else if (e->keycode == hcode && (e->state&SHORTCUTMOD) == (MODBITS))
quickreshape(current, GAPSZ, GAPSZ, ra.width/2 - 1.5*GAPSZ, ra.height - 2*GAPSZ);
else if (e->keycode == lcode && (e->state&SHORTCUTMOD) == (MODBITS))
quickreshape(current, ra.width/2 + 0.5*GAPSZ, GAPSZ, ra.width/2 - 1.5*GAPSZ, ra.height - 2*GAPSZ);
else if (e->keycode == jcode && (e->state&SHORTCUTMOD) == (MODBITS))
quickreshape(current, GAPSZ, ra.height/2 + 0.5*GAPSZ, ra.width - 2*GAPSZ, ra.height/2 - 1.5*GAPSZ);
else if (e->keycode == kcode && (e->state&SHORTCUTMOD) == (MODBITS))
quickreshape(current, GAPSZ, GAPSZ, ra.width - 2*GAPSZ, ra.height/2 - 1.5*GAPSZ);
/* half snap */
else if (e->keycode == hcode && (e->state & SHORTCUTMOD) == (MODBITS))
quickreshape(
current, GAPSZ, GAPSZ, ra.width / 2 - 1.5 * GAPSZ, ra.height - 2 * GAPSZ);
else if (e->keycode == lcode && (e->state & SHORTCUTMOD) == (MODBITS))
quickreshape(
current,
ra.width / 2 + 0.5 * GAPSZ,
GAPSZ,
ra.width / 2 - 1.5 * GAPSZ,
ra.height - 2 * GAPSZ);
else if (e->keycode == jcode && (e->state & SHORTCUTMOD) == (MODBITS))
quickreshape(
current,
GAPSZ,
ra.height / 2 + 0.5 * GAPSZ,
ra.width - 2 * GAPSZ,
ra.height / 2 - 1.5 * GAPSZ);
else if (e->keycode == kcode && (e->state & SHORTCUTMOD) == (MODBITS))
quickreshape(
current, GAPSZ, GAPSZ, ra.width - 2 * GAPSZ, ra.height / 2 - 1.5 * GAPSZ);
/* quarter snap */
else if (e->keycode == qcode && (e->state&SHORTCUTMOD) == (MODBITS))
quickreshape(current, GAPSZ, GAPSZ, ra.width/2 - 1.5*GAPSZ, ra.height/2 - 1.5*GAPSZ);
else if (e->keycode == wcode && (e->state&SHORTCUTMOD) == (MODBITS))
quickreshape(current, GAPSZ, ra.height/2 + 0.5*GAPSZ, ra.width/2 - 1.5*GAPSZ, ra.height/2 - 1.5*GAPSZ);
else if (e->keycode == ocode && (e->state&SHORTCUTMOD) == (MODBITS))
quickreshape(current, ra.width/2 + 0.5*GAPSZ, ra.height/2 + 0.5*GAPSZ, ra.width/2 - 1.5*GAPSZ, ra.height/2 - 1.5*GAPSZ);
else if (e->keycode == pcode && (e->state&SHORTCUTMOD) == (MODBITS))
quickreshape(current, ra.width/2 + 0.5*GAPSZ, GAPSZ, ra.width/2 - 1.5*GAPSZ, ra.height/2 - 1.5*GAPSZ);
/* quarter snap */
else if (e->keycode == qcode && (e->state & SHORTCUTMOD) == (MODBITS))
quickreshape(
current,
GAPSZ,
GAPSZ,
ra.width / 2 - 1.5 * GAPSZ,
ra.height / 2 - 1.5 * GAPSZ);
else if (e->keycode == wcode && (e->state & SHORTCUTMOD) == (MODBITS))
quickreshape(
current,
GAPSZ,
ra.height / 2 + 0.5 * GAPSZ,
ra.width / 2 - 1.5 * GAPSZ,
ra.height / 2 - 1.5 * GAPSZ);
else if (e->keycode == ocode && (e->state & SHORTCUTMOD) == (MODBITS))
quickreshape(
current,
ra.width / 2 + 0.5 * GAPSZ,
ra.height / 2 + 0.5 * GAPSZ,
ra.width / 2 - 1.5 * GAPSZ,
ra.height / 2 - 1.5 * GAPSZ);
else if (e->keycode == pcode && (e->state & SHORTCUTMOD) == (MODBITS))
quickreshape(
current,
ra.width / 2 + 0.5 * GAPSZ,
GAPSZ,
ra.width / 2 - 1.5 * GAPSZ,
ra.height / 2 - 1.5 * GAPSZ);
/* center snap */
else if (e->keycode == ccode && (e->state&SHORTCUTMOD) == (MODBITS)){
/* center snap */
else if (e->keycode == ccode && (e->state & SHORTCUTMOD) == (MODBITS)) {
centercurrent(ra);
}
}
#ifdef DEVEL
/* manage autostuck windows */
if (e->keycode == tcode && (e->state&SHORTCUTMOD) == (MODBITS))
/* manage autostuck windows */
if (e->keycode == tcode && (e->state & SHORTCUTMOD) == (MODBITS))
stickystack(1);
if (e->keycode == bcode && (e->state&SHORTCUTMOD) == (MODBITS))
if (e->keycode == bcode && (e->state & SHORTCUTMOD) == (MODBITS))
stickystack(0);
#endif
/* launch */
if (e->keycode == slcode && (e->state&SHORTCUTMOD) == (MODBITS)){
/* launch */
if (e->keycode == slcode && (e->state & SHORTCUTMOD) == (MODBITS)) {
kbLaunch = 1;
if(fork() == 0){
if (fork() == 0) {
close(ConnectionNumber(dpy));
if(dpy != '\0')
putenv(dpy);
if (dpy != '\0') putenv(dpy);
signal(SIGINT, SIG_DFL);
signal(SIGTERM, SIG_DFL);
signal(SIGHUP, SIG_DFL);
if(termprog != NULL){
if (termprog != NULL) {
execl(shell, shell, "-c", termprog, (char*)0);
fprintf(stderr, "ryudo: exec %s", shell);
perror(" failed");
@ -201,16 +275,16 @@ keypress(XKeyEvent *e)
}
}
/* switch virts */
if (e->keycode == rightcode && (e->state&SHORTCUTMOD) == (MODBITS))
/* switch virts */
if (e->keycode == rightcode && (e->state & SHORTCUTMOD) == (MODBITS))
if (numvirtuals > 1)
if (virt < numvirtuals - 1)
switch_to(virt + 1);
else
switch_to(0);
if (e->keycode == leftcode && (e->state&SHORTCUTMOD) == (MODBITS))
if (numvirtuals >1)
if (e->keycode == leftcode && (e->state & SHORTCUTMOD) == (MODBITS))
if (numvirtuals > 1)
if (virt > 0)
switch_to(virt - 1);
else
@ -220,64 +294,63 @@ keypress(XKeyEvent *e)
}
void
keyrelease(XKeyEvent *e)
{
keyrelease(XKeyEvent* e) {
XAllowEvents(dpy, SyncKeyboard, e->time);
}
void
quickreshape(Client *c, int x, int y, int dx, int dy)
{
if (c == 0)
return;
XMoveResizeWindow(dpy, c->parent, x,y, dx, dy);
quickreshape(Client* c, int x, int y, int dx, int dy) {
if (c == 0) return;
XMoveResizeWindow(dpy, c->parent, x, y, dx, dy);
c->x = x + BORDER;
c->y = y + BORDER;
c->dx = dx-2*BORDER;
c->dy = dy-2*BORDER;
c->dx = dx - 2 * BORDER;
c->dy = dy - 2 * BORDER;
XMoveResizeWindow(dpy, c->window, BORDER, BORDER, c->dx, c->dy);
sendconfig(c);
}
void
centercurrent(XWindowAttributes ra)
{
static int centeroffsetnum = CENTERNUM%2 == 0 ?
CENTERDEN - CENTERNUM :
(CENTERDEN - CENTERNUM)/2;
centercurrent(XWindowAttributes ra) {
static int centeroffsetnum =
CENTERNUM % 2 == 0 ? CENTERDEN - CENTERNUM : (CENTERDEN - CENTERNUM) / 2;
static int centeroffsetden = CENTERNUM%2 == 0 ?
CENTERDEN*2 :
CENTERDEN;
static int centeroffsetden = CENTERNUM % 2 == 0 ? CENTERDEN * 2 : CENTERDEN;
#ifdef CENTERVMAX
quickreshape(current, centeroffsetnum*ra.width/centeroffsetden, GAPSZ, CENTERNUM*ra.width/CENTERDEN, ra.height - 2*GAPSZ);
#else
quickreshape(current, centeroffsetnum*ra.width/centerofsetden, centeroffsetnum*ra.height/centeroffsetden, CENTERNUM*ra.width/CENTERDEN, CENTERNUM*ra.height/CENTERDEN);
#endif
#ifdef CENTERVMAX
quickreshape(
current,
centeroffsetnum * ra.width / centeroffsetden,
GAPSZ,
CENTERNUM * ra.width / CENTERDEN,
ra.height - 2 * GAPSZ);
#else
quickreshape(
current,
centeroffsetnum * ra.width / centerofsetden,
centeroffsetnum * ra.height / centeroffsetden,
CENTERNUM * ra.width / CENTERDEN,
CENTERNUM * ra.height / CENTERDEN);
#endif
}
static void
alttab(int shift)
{
alttab(int shift) {
shuffle(shift);
/* fprintf(stderr, "%sTab\n", shift ? "Back" : ""); */
/* fprintf(stderr, "%sTab\n", shift ? "Back" : ""); */
}
#ifdef DEVEL
void
stickystack(int toTop)
{
Client *c;
if(toTop){
for(c = clients; c->next; c = c->next){
if(c && isautostick(c))
top(c);
stickystack(int toTop) {
Client* c;
if (toTop) {
for (c = clients; c->next; c = c->next) {
if (c && isautostick(c)) top(c);
}
}else{
for(c = clients; c->next; c = c->next){
if(c && !isautostick(c))
top(c);
} else {
for (c = clients; c->next; c = c->next) {
if (c && !isautostick(c)) top(c);
}
}
}

283
main.c Executable file → Normal file
View file

@ -17,19 +17,19 @@
#include "fns.h"
#include "patchlevel.h"
char *version[] =
{
"ryudo version 0.4\nCopyright (c) 1994-1996 David Hogan,\n(c) 2004 Russ Cox,\n(c) 2019-2021 Derek Stevens", 0
};
char* version[] = {
"ryudo version 0.4\nCopyright (c) 1994-1996 David Hogan,\n(c) 2004 Russ "
"Cox,\n(c) 2019-2021 Derek Stevens",
0};
Display *dpy;
ScreenInfo *screens;
Display* dpy;
ScreenInfo* screens;
int initting;
XFontStruct *font;
XFontStruct* font;
int nostalgia;
char **myargv;
char *termprog;
char *shell;
char** myargv;
char* termprog;
char* shell;
Bool shape;
int _border = 4;
int _corner = 25;
@ -58,20 +58,21 @@ Atom _rio_hold_mode;
Atom wm_state_fullscreen;
Atom wm_state;
char *fontlist[] = FONTLIST;
char* fontlist[] = FONTLIST;
void
usage(void)
{
fprintf(stderr, "usage: ryudo [-ffm] [-font fname] [-s] [-term prog] [-version] [-virtuals num] [exit|restart]\n");
usage(void) {
fprintf(
stderr,
"usage: ryudo [-ffm] [-font fname] [-s] [-term prog] [-version] [-virtuals "
"num] [exit|restart]\n");
exit(1);
}
int
main(int argc, char *argv[])
{
main(int argc, char* argv[]) {
int i, do_exit, do_restart;
char *fname;
char* fname;
int shape_event;
#ifdef SHAPE
int dummy;
@ -83,85 +84,76 @@ main(int argc, char *argv[])
do_exit = do_restart = 0;
font = 0;
fname = 0;
for(i = 1; i < argc; i++)
if(strcmp(argv[i], "-nostalgia") == 0)
for (i = 1; i < argc; i++)
if (strcmp(argv[i], "-nostalgia") == 0)
nostalgia++;
else if(strcmp(argv[i], "-debug") == 0)
else if (strcmp(argv[i], "-debug") == 0)
debug++;
else if(strcmp(argv[i], "-ffm") == 0)
else if (strcmp(argv[i], "-ffm") == 0)
ffm++;
else if(strcmp(argv[i], "-font") == 0 && i+1<argc){
else if (strcmp(argv[i], "-font") == 0 && i + 1 < argc) {
i++;
fname = argv[i];
}
else if(strcmp(argv[i], "-term") == 0 && i+1<argc)
} else if (strcmp(argv[i], "-term") == 0 && i + 1 < argc)
termprog = argv[++i];
else if(strcmp(argv[i], "-virtuals") == 0 && i+1<argc){
else if (strcmp(argv[i], "-virtuals") == 0 && i + 1 < argc) {
numvirtuals = atoi(argv[++i]);
if(numvirtuals < 0 || numvirtuals > 12){
fprintf(stderr, "ryudo: wrong number of virtual displays, defaulting to 4\n");
if (numvirtuals < 0 || numvirtuals > 12) {
fprintf(
stderr, "ryudo: wrong number of virtual displays, defaulting to 4\n");
numvirtuals = 4;
}
} else if(strcmp(argv[i], "-version") == 0){
} else if (strcmp(argv[i], "-version") == 0) {
fprintf(stderr, "%s", version[0]);
if(PATCHLEVEL > 0)
fprintf(stderr, "; patch level %d", PATCHLEVEL);
if (PATCHLEVEL > 0) fprintf(stderr, "; patch level %d", PATCHLEVEL);
fprintf(stderr, "\n");
exit(0);
}
else if(strcmp(argv[i], "-s") == 0){
} else if (strcmp(argv[i], "-s") == 0) {
scrolling = 1;
}
else if(argv[i][0] == '-')
} else if (argv[i][0] == '-')
usage();
else
break;
for(; i < argc; i++)
if(strcmp(argv[i], "exit") == 0)
for (; i < argc; i++)
if (strcmp(argv[i], "exit") == 0)
do_exit++;
else if(strcmp(argv[i], "restart") == 0)
else if (strcmp(argv[i], "restart") == 0)
do_restart++;
else
usage();
if(do_exit && do_restart)
usage();
if (do_exit && do_restart) usage();
shell = (char *)getenv("SHELL");
if(shell == NULL)
shell = DEFSHELL;
shell = (char*)getenv("SHELL");
if (shell == NULL) shell = DEFSHELL;
dpy = XOpenDisplay("");
if(dpy == 0)
fatal("can't open display");
if (dpy == 0) fatal("can't open display");
initting = 1;
XSetErrorHandler(handler);
if(signal(SIGTERM, sighandler) == SIG_IGN)
signal(SIGTERM, SIG_IGN);
if(signal(SIGINT, sighandler) == SIG_IGN)
signal(SIGINT, SIG_IGN);
if(signal(SIGHUP, sighandler) == SIG_IGN)
signal(SIGHUP, SIG_IGN);
if (signal(SIGTERM, sighandler) == SIG_IGN) signal(SIGTERM, SIG_IGN);
if (signal(SIGINT, sighandler) == SIG_IGN) signal(SIGINT, SIG_IGN);
if (signal(SIGHUP, sighandler) == SIG_IGN) signal(SIGHUP, SIG_IGN);
exit_rio = XInternAtom(dpy, "9WM_EXIT", False);
restart_rio = XInternAtom(dpy, "9WM_RESTART", False);
curtime = -1; /* don't care */
if(do_exit){
if (do_exit) {
sendcmessage(DefaultRootWindow(dpy), exit_rio, 0L, 1, 1);
XSync(dpy, False);
exit(0);
}
if(do_restart){
if (do_restart) {
sendcmessage(DefaultRootWindow(dpy), restart_rio, 0L, 1, 1);
XSync(dpy, False);
exit(0);
}
if(0) XSynchronize(dpy, True);
if (0) XSynchronize(dpy, True);
wm_state = XInternAtom(dpy, "WM_STATE", False);
wm_change_state = XInternAtom(dpy, "WM_CHANGE_STATE", False);
@ -175,24 +167,23 @@ main(int argc, char *argv[])
wm_state = XInternAtom(dpy, "_NET_WM_STATE", False);
wm_state_fullscreen = XInternAtom(dpy, "_NET_WM_STATE_FULLSCREEN", False);
if(fname != 0)
if((font = XLoadQueryFont(dpy, fname)) == 0)
if (fname != 0)
if ((font = XLoadQueryFont(dpy, fname)) == 0)
fprintf(stderr, "ryudo: warning: can't load font %s\n", fname);
if(font == 0){
if (font == 0) {
i = 0;
for(;;){
for (;;) {
fname = fontlist[i++];
if(fname == 0){
if (fname == 0) {
fprintf(stderr, "ryudo: warning: can't find a font\n");
break;
}
font = XLoadQueryFont(dpy, fname);
if(font != 0)
break;
if (font != 0) break;
}
}
if(nostalgia){
if (nostalgia) {
_border--;
_inset--;
}
@ -202,10 +193,9 @@ main(int argc, char *argv[])
#endif
num_screens = ScreenCount(dpy);
screens = (ScreenInfo *)malloc(sizeof(ScreenInfo) * num_screens);
screens = (ScreenInfo*)malloc(sizeof(ScreenInfo) * num_screens);
for(i = 0; i < num_screens; i++)
initscreen(&screens[i], i, 0);
for (i = 0; i < num_screens; i++) initscreen(&screens[i], i, 0);
initb2menu(numvirtuals);
@ -218,8 +208,7 @@ main(int argc, char *argv[])
nofocus();
for(i = 0; i < num_screens; i++)
scanwins(&screens[i]);
for (i = 0; i < num_screens; i++) scanwins(&screens[i]);
keysetup();
mainloop(shape_event);
@ -227,8 +216,7 @@ main(int argc, char *argv[])
}
void
initscreen(ScreenInfo *s, int i, int background)
{
initscreen(ScreenInfo* s, int i, int background) {
char *ds, *colon, *dot1;
unsigned long mask;
unsigned long gmask;
@ -246,53 +234,48 @@ initscreen(ScreenInfo *s, int i, int background)
/*
* Figure out underlying screen format.
*/
if(XMatchVisualInfo(dpy, i, 16, TrueColor, &xvi)
|| XMatchVisualInfo(dpy, i, 16, DirectColor, &xvi)){
if (
XMatchVisualInfo(dpy, i, 16, TrueColor, &xvi) ||
XMatchVisualInfo(dpy, i, 16, DirectColor, &xvi)) {
s->vis = xvi.visual;
s->depth = 16;
}
else
if(XMatchVisualInfo(dpy, i, 15, TrueColor, &xvi)
|| XMatchVisualInfo(dpy, i, 15, DirectColor, &xvi)){
} else if (
XMatchVisualInfo(dpy, i, 15, TrueColor, &xvi) ||
XMatchVisualInfo(dpy, i, 15, DirectColor, &xvi)) {
s->vis = xvi.visual;
s->depth = 15;
}
else
if(XMatchVisualInfo(dpy, i, 24, TrueColor, &xvi)
|| XMatchVisualInfo(dpy, i, 24, DirectColor, &xvi)){
} else if (
XMatchVisualInfo(dpy, i, 24, TrueColor, &xvi) ||
XMatchVisualInfo(dpy, i, 24, DirectColor, &xvi)) {
s->vis = xvi.visual;
s->depth = 24;
}
else
if(XMatchVisualInfo(dpy, i, 8, PseudoColor, &xvi)
|| XMatchVisualInfo(dpy, i, 8, StaticColor, &xvi)){
} else if (
XMatchVisualInfo(dpy, i, 8, PseudoColor, &xvi) ||
XMatchVisualInfo(dpy, i, 8, StaticColor, &xvi)) {
s->vis = xvi.visual;
s->depth = 8;
}
else{
} else {
s->depth = DefaultDepth(dpy, i);
if(s->depth != 8){
if (s->depth != 8) {
fprintf(stderr, "can't understand depth %d screen", s->depth);
exit(1);
}
s->vis = DefaultVisual(dpy, i);
}
if(DefaultDepth(dpy, i) != s->depth){
if (DefaultDepth(dpy, i) != s->depth) {
s->def_cmap = XCreateColormap(dpy, s->root, s->vis, AllocNone);
}
ds = DisplayString(dpy);
colon = rindex(ds, ':');
if(colon && num_screens > 1){
if (colon && num_screens > 1) {
strcpy(s->display, "DISPLAY=");
strcat(s->display, ds);
colon = s->display + 8 + (colon - ds); /* use version in buf */
dot1 = index(colon, '.'); /* first period after colon */
if(!dot1)
dot1 = colon + strlen(colon); /* if not there, append */
if (!dot1) dot1 = colon + strlen(colon); /* if not there, append */
sprintf(dot1, ".%d", i);
}
else
} else
s->display[0] = '\0';
s->black = BlackPixel(dpy, i);
@ -304,17 +287,19 @@ initscreen(ScreenInfo *s, int i, int background)
s->red = colorpixel(dpy, s, s->depth, GHOSTCOL, s->white);
s->width = WidthOfScreen(ScreenOfDisplay(dpy, i));
s->height = HeightOfScreen(ScreenOfDisplay(dpy, i));
s->bkup[0] = XCreatePixmap(dpy, s->root, 2*s->width, BORDER, DefaultDepth(dpy, i));
s->bkup[1] = XCreatePixmap(dpy, s->root, BORDER, 2*s->height, DefaultDepth(dpy, i));
s->bkup[0] =
XCreatePixmap(dpy, s->root, 2 * s->width, BORDER, DefaultDepth(dpy, i));
s->bkup[1] =
XCreatePixmap(dpy, s->root, BORDER, 2 * s->height, DefaultDepth(dpy, i));
gv.foreground = s->black^s->white;
gv.foreground = s->black ^ s->white;
gv.background = s->white;
gv.function = GXxor;
gv.line_width = 0;
gv.subwindow_mode = IncludeInferiors;
gmask = GCForeground | GCBackground | GCFunction | GCLineWidth
| GCSubwindowMode;
if(font != 0){
gmask =
GCForeground | GCBackground | GCFunction | GCLineWidth | GCSubwindowMode;
if (font != 0) {
gv.font = font->fid;
gmask |= GCFont;
}
@ -332,11 +317,10 @@ initscreen(ScreenInfo *s, int i, int background)
initcurs(s);
attr.cursor = s->arrow;
attr.event_mask = SubstructureRedirectMask
| SubstructureNotifyMask | ColormapChangeMask
| ButtonPressMask | ButtonReleaseMask | PropertyChangeMask
| KeyPressMask | EnterWindowMask;
mask = CWCursor|CWEventMask;
attr.event_mask = SubstructureRedirectMask | SubstructureNotifyMask |
ColormapChangeMask | ButtonPressMask | ButtonReleaseMask |
PropertyChangeMask | KeyPressMask | EnterWindowMask;
mask = CWCursor | CWEventMask;
XChangeWindowAttributes(dpy, s->root, mask, &attr);
XSync(dpy, False);
@ -344,14 +328,19 @@ initscreen(ScreenInfo *s, int i, int background)
attrs.background_pixel = colorpixel(dpy, s, s->depth, MENUBGCOL, s->white);
attrs.colormap = s->def_cmap;
s->menuwin = XCreateWindow(dpy, s->root, 0, 0, 1, 1, MENUBORDER,
s->menuwin = XCreateWindow(
dpy,
s->root,
0,
0,
1,
1,
MENUBORDER,
s->depth,
CopyFromParent,
s->vis,
CWBackPixel | CWBorderPixel | CWColormap,
&attrs
);
&attrs);
gv.foreground = colorpixel(dpy, s, s->depth, MENUBGCOL, s->black);
s->gcmenubg = XCreateGC(dpy, s->menuwin, gmask, &gv);
@ -370,35 +359,45 @@ initscreen(ScreenInfo *s, int i, int background)
attrs.border_pixel = s->red;
attrs.background_pixel = colorpixel(dpy, s, s->depth, 0xEEEEEE, s->black);
attrs.colormap = s->def_cmap;
s->sweepwin = XCreateWindow(dpy, s->root, 0, 0, 1, 1, 4,
s->sweepwin = XCreateWindow(
dpy,
s->root,
0,
0,
1,
1,
4,
s->depth,
CopyFromParent,
s->vis,
CWBackPixel | CWBorderPixel | CWColormap,
&attrs
);
&attrs);
}
ScreenInfo*
getscreen(Window w)
{
getscreen(Window w) {
int i;
for(i = 0; i < num_screens; i++)
if(screens[i].root == w)
return &screens[i];
for (i = 0; i < num_screens; i++)
if (screens[i].root == w) return &screens[i];
return 0;
}
Time
timestamp(void)
{
timestamp(void) {
XEvent ev;
if(curtime == CurrentTime){
XChangeProperty(dpy, screens[0].root, _rio_running, _rio_running, 8,
PropModeAppend, (unsigned char *)"", 0);
if (curtime == CurrentTime) {
XChangeProperty(
dpy,
screens[0].root,
_rio_running,
_rio_running,
8,
PropModeAppend,
(unsigned char*)"",
0);
XMaskEvent(dpy, PropertyChangeMask, &ev);
curtime = ev.xproperty.time;
}
@ -406,8 +405,7 @@ timestamp(void)
}
void
sendcmessage(Window w, Atom a, long x, int isroot, int usemask)
{
sendcmessage(Window w, Atom a, long x, int isroot, int usemask) {
XEvent ev;
int status;
long mask;
@ -420,21 +418,19 @@ sendcmessage(Window w, Atom a, long x, int isroot, int usemask)
ev.xclient.data.l[0] = x;
ev.xclient.data.l[1] = timestamp();
mask = 0;
if(usemask){
if (usemask) {
mask |= KeyPressMask; /* seems to be necessary */
if(isroot)
if (isroot)
mask |= SubstructureRedirectMask; /* magic! */
else
mask |= ExposureMask; /* not really correct but so be it */
}
status = XSendEvent(dpy, w, False, mask, &ev);
if(status == 0)
fprintf(stderr, "ryudo: sendcmessage failed\n");
if (status == 0) fprintf(stderr, "ryudo: sendcmessage failed\n");
}
void
sendconfig(Client *c)
{
sendconfig(Client* c) {
XConfigureEvent ce;
ce.type = ConfigureNotify;
@ -451,20 +447,18 @@ sendconfig(Client *c)
}
void
sighandler(void)
{
sighandler(void) {
signalled = 1;
}
void
getevent(XEvent *e)
{
getevent(XEvent* e) {
int fd;
fd_set rfds;
struct timeval t;
if(!signalled){
if(QLength(dpy) > 0){
if (!signalled) {
if (QLength(dpy) > 0) {
XNextEvent(dpy, e);
return;
}
@ -472,17 +466,17 @@ getevent(XEvent *e)
FD_ZERO(&rfds);
FD_SET(fd, &rfds);
t.tv_sec = t.tv_usec = 0;
if(select(fd+1, &rfds, NULL, NULL, &t) == 1){
if (select(fd + 1, &rfds, NULL, NULL, &t) == 1) {
XNextEvent(dpy, e);
return;
}
XFlush(dpy);
FD_SET(fd, &rfds);
if(select(fd+1, &rfds, NULL, NULL, NULL) == 1){
if (select(fd + 1, &rfds, NULL, NULL, NULL) == 1) {
XNextEvent(dpy, e);
return;
}
if(errno != EINTR || !signalled){
if (errno != EINTR || !signalled) {
perror("ryudo: select failed");
exit(1);
}
@ -493,26 +487,24 @@ getevent(XEvent *e)
}
void
cleanup(void)
{
cleanup(void) {
Client *c, *cc[2], *next;
XWindowChanges wc;
int i;
/* order of un-reparenting determines final stacking order... */
cc[0] = cc[1] = 0;
for(c = clients; c; c = next){
for (c = clients; c; c = next) {
next = c->next;
i = normal(c);
c->next = cc[i];
cc[i] = c;
}
for(i = 0; i < 2; i++){
for(c = cc[i]; c; c = c->next){
if(!withdrawn(c)){
XReparentWindow(dpy, c->window, c->screen->root,
c->x, c->y);
for (i = 0; i < 2; i++) {
for (c = cc[i]; c; c = c->next) {
if (!withdrawn(c)) {
XReparentWindow(dpy, c->window, c->screen->root, c->x, c->y);
}
wc.border_width = c->border;
XConfigureWindow(dpy, c->window, CWBorderWidth, &wc);
@ -520,7 +512,6 @@ cleanup(void)
}
XSetInputFocus(dpy, PointerRoot, RevertToPointerRoot, timestamp());
for(i = 0; i < num_screens; i++)
cmapnofocus(&screens[i]);
for (i = 0; i < num_screens; i++) cmapnofocus(&screens[i]);
XCloseDisplay(dpy);
}

371
manage.c Executable file → Normal file
View file

@ -23,36 +23,37 @@
int isNew;
int
manage(Client *c, int mapped)
{
manage(Client* c, int mapped) {
int fixsize, dohide, doreshape, state;
long msize;
XClassHint class;
XWMHints *hints;
XWMHints* hints;
XSetWindowAttributes attrs;
static XWindowAttributes ra;
XGetWindowAttributes(dpy, DefaultRootWindow(dpy), &ra);
trace("manage", c, 0);
XSelectInput(dpy, c->window, ColormapChangeMask | EnterWindowMask | PropertyChangeMask | FocusChangeMask | KeyPressMask);
XSelectInput(
dpy,
c->window,
ColormapChangeMask | EnterWindowMask | PropertyChangeMask |
FocusChangeMask | KeyPressMask);
/* Get loads of hints */
if(XGetClassHint(dpy, c->window, &class) != 0){ /* ``Success'' */
if (XGetClassHint(dpy, c->window, &class) != 0) { /* ``Success'' */
c->instance = class.res_name;
c->class = class.res_class;
c->is9term = 0;
if(isNew){
c->is9term = strstr(c->class, "term") || strstr(c->class, "Term")
|| strstr(c->class, "urxvt") || strstr(c->class, "URxvt")
|| strstr(c->class, "onsole") || strstr(c->class, "Alacritty");
if (isNew) {
c->is9term = strstr(c->class, "term") || strstr(c->class, "Term") ||
strstr(c->class, "urxvt") || strstr(c->class, "URxvt") ||
strstr(c->class, "onsole") || strstr(c->class, "Alacritty");
isNew = 0;
}
printf("%s: is9term = %d", c->class, c->is9term);
}
else {
} else {
c->instance = 0;
c->class = 0;
c->is9term = 0;
@ -62,76 +63,80 @@ manage(Client *c, int mapped)
setlabel(c);
hints = XGetWMHints(dpy, c->window);
if(XGetWMNormalHints(dpy, c->window, &c->size, &msize) == 0 || c->size.flags == 0)
if (
XGetWMNormalHints(dpy, c->window, &c->size, &msize) == 0 ||
c->size.flags == 0)
c->size.flags = PSize; /* not specified - punt */
getcmaps(c);
getproto(c);
gettrans(c);
if(c->is9term)
c->hold = getiprop(c->window, _rio_hold_mode);
if (c->is9term) c->hold = getiprop(c->window, _rio_hold_mode);
/* Figure out what to do with the window from hints */
if(!getstate(c->window, &state))
if (!getstate(c->window, &state))
state = hints ? hints->initial_state : NormalState;
dohide = (state == IconicState);
fixsize = 0;
if((c->size.flags & (USSize|PSize)))
fixsize = 1;
if((c->size.flags & (PMinSize|PMaxSize)) == (PMinSize|PMaxSize) && c->size.min_width == c->size.max_width && c->size.min_height == c->size.max_height)
if ((c->size.flags & (USSize | PSize))) fixsize = 1;
if (
(c->size.flags & (PMinSize | PMaxSize)) == (PMinSize | PMaxSize) &&
c->size.min_width == c->size.max_width &&
c->size.min_height == c->size.max_height)
fixsize = 1;
doreshape = !mapped;
if(fixsize){
if(c->size.flags & USPosition)
doreshape = 0;
if(dohide && (c->size.flags & PPosition))
doreshape = 0;
if(c->trans != None)
doreshape = 0;
if (fixsize) {
if (c->size.flags & USPosition) doreshape = 0;
if (dohide && (c->size.flags & PPosition)) doreshape = 0;
if (c->trans != None) doreshape = 0;
}
if(c->is9term)
fixsize = 0;
if(c->size.flags & PBaseSize){
if (c->is9term) fixsize = 0;
if (c->size.flags & PBaseSize) {
c->min_dx = c->size.base_width;
c->min_dy = c->size.base_height;
}
else if(c->size.flags & PMinSize){
} else if (c->size.flags & PMinSize) {
c->min_dx = c->size.min_width;
c->min_dy = c->size.min_height;
}
else if(c->is9term){
} else if (c->is9term) {
c->min_dx = 100;
c->min_dy = 50;
}
else
} else
c->min_dx = c->min_dy = 0;
if(hints)
XFree(hints);
if (hints) XFree(hints);
/* Now do it!!! */
if(doreshape){
if(0) fprintf(stderr, "in doreshape is9term=%d fixsize=%d, x=%d, y=%d, min_dx=%d, min_dy=%d, dx=%d, dy=%d\n",
c->is9term, fixsize, c->x, c->y, c->min_dx, c->min_dy, c->dx, c->dy);
if(current && current->screen == c->screen)
cmapnofocus(c->screen);
if(!c->is9term && c->x==0 && c->y==0){
if (doreshape) {
if (0)
fprintf(
stderr,
"in doreshape is9term=%d fixsize=%d, x=%d, y=%d, min_dx=%d, min_dy=%d, "
"dx=%d, dy=%d\n",
c->is9term,
fixsize,
c->x,
c->y,
c->min_dx,
c->min_dy,
c->dx,
c->dy);
if (current && current->screen == c->screen) cmapnofocus(c->screen);
if (!c->is9term && c->x == 0 && c->y == 0) {
static int nwin;
c->x = 20*nwin+BORDER;
c->y = 20*nwin+BORDER;
c->x = 20 * nwin + BORDER;
c->y = 20 * nwin + BORDER;
nwin++;
nwin %= 10;
}
if(c->is9term && !(fixsize ? drag(c, Button3) : sweep(c, Button3))){
if (c->is9term && !(fixsize ? drag(c, Button3) : sweep(c, Button3))) {
XKillClient(dpy, c->window);
rmclient(c);
if(current && current->screen == c->screen)
cmapfocus(current);
if (current && current->screen == c->screen) cmapfocus(current);
return 0;
}
}
@ -139,9 +144,13 @@ manage(Client *c, int mapped)
attrs.border_pixel = c->screen->black;
attrs.background_pixel = c->screen->white;
attrs.colormap = c->screen->def_cmap;
c->parent = XCreateWindow(dpy, c->screen->root,
c->x - BORDER, c->y - BORDER,
c->dx + 2*BORDER, c->dy + 2*BORDER,
c->parent = XCreateWindow(
dpy,
c->screen->root,
c->x - BORDER,
c->y - BORDER,
c->dx + 2 * BORDER,
c->dy + 2 * BORDER,
0,
c->screen->depth,
CopyFromParent,
@ -149,11 +158,13 @@ manage(Client *c, int mapped)
CWBackPixel | CWBorderPixel | CWColormap,
&attrs);
XSelectInput(dpy, c->parent, SubstructureRedirectMask | SubstructureNotifyMask|ButtonPressMask| PointerMotionMask|LeaveWindowMask|KeyPressMask);
if(mapped)
c->reparenting = 1;
if(doreshape && !fixsize)
XResizeWindow(dpy, c->window, c->dx, c->dy);
XSelectInput(
dpy,
c->parent,
SubstructureRedirectMask | SubstructureNotifyMask | ButtonPressMask |
PointerMotionMask | LeaveWindowMask | KeyPressMask);
if (mapped) c->reparenting = 1;
if (doreshape && !fixsize) XResizeWindow(dpy, c->window, c->dx, c->dy);
XSetWindowBorderWidth(dpy, c->window, 0);
/*
@ -164,13 +175,11 @@ manage(Client *c, int mapped)
* (black (or white) border around black (or white) window
* is not very helpful.
*/
if(c->screen->depth <= 8){
XSetWindowBorderWidth(dpy, c->parent, 1);
}
if (c->screen->depth <= 8) { XSetWindowBorderWidth(dpy, c->parent, 1); }
XReparentWindow(dpy, c->window, c->parent, BORDER, BORDER);
#ifdef SHAPE
if(shape){
if (shape) {
XShapeSelectInput(dpy, c->window, ShapeNotifyMask);
ignore_badwindow = 1; /* magic */
setshape(c);
@ -178,14 +187,14 @@ manage(Client *c, int mapped)
}
#endif
XAddToSaveSet(dpy, c->window);
if(dohide)
if (dohide)
hide(c);
else {
XMapWindow(dpy, c->window);
XMapWindow(dpy, c->parent);
XUnmapWindow(dpy, c->screen->sweepwin);
#ifdef AUTOSTICK
if(!isautostick(c))
if (!isautostick(c))
#endif
active(c);
/*else if(c->trans != None && current && current->window == c->trans)
@ -194,32 +203,43 @@ manage(Client *c, int mapped)
setactive(c, 0);
setstate(c, NormalState);
}
if(current && (current != c))
cmapfocus(current);
if (current && (current != c)) cmapfocus(current);
c->init = 1;
/* If the window is out of bounds of the screen, try to wrangle it */
/* If it's bigger than the screen, try to set it maximized */
if (c->dx >= ra.width || c->dy >= ra.width){
if (c->dx >= ra.width || c->dy >= ra.width) {
if (c->dx >= ra.width)
quickreshape(c, -BORDER, c->y - BORDER, ra.width + 2*BORDER, c->dy + 2*BORDER);
quickreshape(
c, -BORDER, c->y - BORDER, ra.width + 2 * BORDER, c->dy + 2 * BORDER);
if (c->dy >= ra.height)
quickreshape(c, c->x - BORDER, -BORDER, c->dx + 2*BORDER, ra.height + 2*BORDER);
quickreshape(
c, c->x - BORDER, -BORDER, c->dx + 2 * BORDER, ra.height + 2 * BORDER);
/* and if it's got an edge out of bounds, nudge it into bounds */
} else {
if (c->x < BORDER){
quickreshape(c, 0, c->y - BORDER, c->dx + 2*BORDER, c->dy + 2*BORDER);
if (c->x < BORDER) {
quickreshape(c, 0, c->y - BORDER, c->dx + 2 * BORDER, c->dy + 2 * BORDER);
}
if (c->y < BORDER){
quickreshape(c, c->x - BORDER, 0, c->dx + 2*BORDER, c->dy + 2*BORDER);
if (c->y < BORDER) {
quickreshape(c, c->x - BORDER, 0, c->dx + 2 * BORDER, c->dy + 2 * BORDER);
}
if (c->x + c->dx + BORDER > ra.width){
quickreshape(c, ra.width - (c->dx + 2*BORDER), c->y - BORDER, c->dx + 2*BORDER, c->dy + 2*BORDER);
if (c->x + c->dx + BORDER > ra.width) {
quickreshape(
c,
ra.width - (c->dx + 2 * BORDER),
c->y - BORDER,
c->dx + 2 * BORDER,
c->dy + 2 * BORDER);
}
if (c->y + c->dy + BORDER > ra.height){
quickreshape(c, c->x - BORDER, ra.height - (c->dy + 2*BORDER), c->dx + 2*BORDER, c->dy + 2*BORDER);
if (c->y + c->dy + BORDER > ra.height) {
quickreshape(
c,
c->x - BORDER,
ra.height - (c->dy + 2 * BORDER),
c->dx + 2 * BORDER,
c->dy + 2 * BORDER);
}
}
@ -230,26 +250,23 @@ manage(Client *c, int mapped)
* I can't find a way to have them notice during initdraw, so
* I solve the problem this way instead. -rsc
*/
if(c->is9term)
sendconfig(c);
if (c->is9term) sendconfig(c);
return 1;
}
void
scanwins(ScreenInfo *s)
{
scanwins(ScreenInfo* s) {
unsigned int i, nwins;
Client *c;
Client* c;
Window dw1, dw2, *wins;
XWindowAttributes attr;
XQueryTree(dpy, s->root, &dw1, &dw2, &wins, &nwins);
for(i = 0; i < nwins; i++){
for (i = 0; i < nwins; i++) {
XGetWindowAttributes(dpy, wins[i], &attr);
if(attr.override_redirect || wins[i] == s->menuwin)
continue;
if (attr.override_redirect || wins[i] == s->menuwin) continue;
c = getclient(wins[i], 1);
if(c != 0 && c->window == wins[i] && !c->init){
if (c != 0 && c->window == wins[i] && !c->init) {
c->x = attr.x;
c->y = attr.y;
c->dx = attr.width;
@ -257,28 +274,25 @@ scanwins(ScreenInfo *s)
c->border = attr.border_width;
c->screen = s;
c->parent = s->root;
if(attr.map_state == IsViewable)
manage(c, 1);
if (attr.map_state == IsViewable) manage(c, 1);
}
}
XFree((void *) wins); /* cast is to shut stoopid compiler up */
XFree((void*)wins); /* cast is to shut stoopid compiler up */
}
void
gettrans(Client *c)
{
gettrans(Client* c) {
Window trans;
trans = None;
if(XGetTransientForHint(dpy, c->window, &trans) != 0)
if (XGetTransientForHint(dpy, c->window, &trans) != 0)
c->trans = trans;
else
c->trans = None;
}
void
withdraw(Client *c)
{
withdraw(Client* c) {
XUnmapWindow(dpy, c->parent);
XReparentWindow(dpy, c->window, c->screen->root, c->x, c->y);
XRemoveFromSaveSet(dpy, c->window);
@ -291,52 +305,47 @@ withdraw(Client *c)
}
static void
installcmap(ScreenInfo *s, Colormap cmap)
{
if(cmap == None)
installcmap(ScreenInfo* s, Colormap cmap) {
if (cmap == None)
XInstallColormap(dpy, s->def_cmap);
else
XInstallColormap(dpy, cmap);
}
void
cmapfocus(Client *c)
{
cmapfocus(Client* c) {
int i, found;
Client *cc;
Client* cc;
if(c == 0)
if (c == 0)
return;
else if(c->ncmapwins != 0){
else if (c->ncmapwins != 0) {
found = 0;
for(i = c->ncmapwins-1; i >= 0; i--){
for (i = c->ncmapwins - 1; i >= 0; i--) {
installcmap(c->screen, c->wmcmaps[i]);
if(c->cmapwins[i] == c->window)
found++;
if (c->cmapwins[i] == c->window) found++;
}
if(!found)
installcmap(c->screen, c->cmap);
}
else if(c->trans != None && (cc = getclient(c->trans, 0)) != 0 && cc->ncmapwins != 0)
if (!found) installcmap(c->screen, c->cmap);
} else if (
c->trans != None && (cc = getclient(c->trans, 0)) != 0 &&
cc->ncmapwins != 0)
cmapfocus(cc);
else
installcmap(c->screen, c->cmap);
}
void
cmapnofocus(ScreenInfo *s)
{
cmapnofocus(ScreenInfo* s) {
installcmap(s, None);
}
void
getcmaps(Client *c)
{
getcmaps(Client* c) {
int n, i;
Window *cw;
Window* cw;
XWindowAttributes attr;
if(!c->init){
if (!c->init) {
ignore_badwindow = 1;
XGetWindowAttributes(dpy, c->window, &attr);
c->cmap = attr.colormap;
@ -345,11 +354,11 @@ getcmaps(Client *c)
}
n = _getprop(c->window, wm_colormaps, XA_WINDOW, 100L, (void*)&cw);
if(c->ncmapwins != 0){
XFree((char *)c->cmapwins);
free((char *)c->wmcmaps);
if (c->ncmapwins != 0) {
XFree((char*)c->cmapwins);
free((char*)c->wmcmaps);
}
if(n <= 0){
if (n <= 0) {
c->ncmapwins = 0;
return;
}
@ -357,9 +366,9 @@ getcmaps(Client *c)
c->ncmapwins = n;
c->cmapwins = cw;
c->wmcmaps = (Colormap*)malloc(n*sizeof(Colormap));
for(i = 0; i < n; i++){
if(cw[i] == c->window)
c->wmcmaps = (Colormap*)malloc(n * sizeof(Colormap));
for (i = 0; i < n; i++) {
if (cw[i] == c->window)
c->wmcmaps[i] = c->cmap;
else {
/* flush any errors (e.g., caused by mozilla tabs) */
@ -374,25 +383,23 @@ getcmaps(Client *c)
}
void
setlabel(Client *c)
{
setlabel(Client* c) {
char *label, *p, *lc;
int i;
if(c->iconname != 0)
if (c->iconname != 0)
label = c->iconname;
else if(c->name != 0)
else if (c->name != 0)
label = c->name;
else if(c->instance != 0)
else if (c->instance != 0)
label = c->instance;
else if(c->class != 0)
else if (c->class != 0)
label = c->class;
else
label = "no label";
if((p = index(label, ':')) != 0)
*p = '\0';
for (i = 0, lc = label; *lc != '\0'; lc++, i++){
if (i >= 23){
if ((p = index(label, ':')) != 0) *p = '\0';
for (i = 0, lc = label; *lc != '\0'; lc++, i++) {
if (i >= 23) {
label[22] = '~';
label[23] = '\0';
}
@ -403,117 +410,117 @@ setlabel(Client *c)
#ifdef SHAPE
void
setshape(Client *c)
{
setshape(Client* c) {
int n, order;
XRectangle *rect;
XRectangle* rect;
/* don't try to add a border if the window is non-rectangular */
rect = XShapeGetRectangles(dpy, c->window, ShapeBounding, &n, &order);
if(n > 1)
XShapeCombineShape(dpy, c->parent, ShapeBounding, BORDER, BORDER,
c->window, ShapeBounding, ShapeSet);
if (n > 1)
XShapeCombineShape(
dpy,
c->parent,
ShapeBounding,
BORDER,
BORDER,
c->window,
ShapeBounding,
ShapeSet);
XFree((void*)rect);
}
#endif
int
_getprop(Window w, Atom a, Atom type, long len, unsigned char **p)
{
_getprop(Window w, Atom a, Atom type, long len, unsigned char** p) {
Atom real_type;
int format;
unsigned long n, extra;
int status;
status = XGetWindowProperty(dpy, w, a, 0L, len, False, type, &real_type, &format, &n, &extra, p);
if(status != Success || *p == 0)
return -1;
if(n == 0)
XFree((void*) *p);
status = XGetWindowProperty(
dpy, w, a, 0L, len, False, type, &real_type, &format, &n, &extra, p);
if (status != Success || *p == 0) return -1;
if (n == 0) XFree((void*)*p);
/* could check real_type, format, extra here... */
return n;
}
char *
getprop(Window w, Atom a)
{
unsigned char *p;
char*
getprop(Window w, Atom a) {
unsigned char* p;
if(_getprop(w, a, XA_STRING, 100L, &p) <= 0)
return 0;
return (char *)p;
if (_getprop(w, a, XA_STRING, 100L, &p) <= 0) return 0;
return (char*)p;
}
int
get1prop(Window w, Atom a, Atom type)
{
get1prop(Window w, Atom a, Atom type) {
char **p, *x;
if(_getprop(w, a, type, 1L, (void*)&p) <= 0)
return 0;
if (_getprop(w, a, type, 1L, (void*)&p) <= 0) return 0;
x = *p;
XFree((void*) p);
XFree((void*)p);
return (int)(uintptr_t)x;
}
Window
getwprop(Window w, Atom a)
{
getwprop(Window w, Atom a) {
return get1prop(w, a, XA_WINDOW);
}
int
getiprop(Window w, Atom a)
{
getiprop(Window w, Atom a) {
return get1prop(w, a, XA_INTEGER);
}
void
setstate(Client *c, int state)
{
setstate(Client* c, int state) {
long data[2];
data[0] = (long) state;
data[1] = (long) None;
data[0] = (long)state;
data[1] = (long)None;
c->state = state;
XChangeProperty(dpy, c->window, wm_state, wm_state, 32,
PropModeReplace, (unsigned char *)data, 2);
XChangeProperty(
dpy,
c->window,
wm_state,
wm_state,
32,
PropModeReplace,
(unsigned char*)data,
2);
}
int
getstate(Window w, int *state)
{
long *p = 0;
getstate(Window w, int* state) {
long* p = 0;
if(_getprop(w, wm_state, wm_state, 2L, (void*)&p) <= 0)
return 0;
if (_getprop(w, wm_state, wm_state, 2L, (void*)&p) <= 0) return 0;
*state = (int) *p;
XFree((char *) p);
*state = (int)*p;
XFree((char*)p);
return 1;
}
void
getproto(Client *c)
{
Atom *p;
getproto(Client* c) {
Atom* p;
int i;
long n;
Window w;
w = c->window;
c->proto = 0;
if((n = _getprop(w, wm_protocols, XA_ATOM, 20L, (void*)&p)) <= 0)
return;
if ((n = _getprop(w, wm_protocols, XA_ATOM, 20L, (void*)&p)) <= 0) return;
for(i = 0; i < n; i++)
if(p[i] == wm_delete)
for (i = 0; i < n; i++)
if (p[i] == wm_delete)
c->proto |= Pdelete;
else if(p[i] == wm_take_focus)
else if (p[i] == wm_take_focus)
c->proto |= Ptakefocus;
else if(p[i] == wm_lose_focus)
else if (p[i] == wm_lose_focus)
c->proto |= Plosefocus;
XFree((char *) p);
XFree((char*)p);
}

358
menu.c Executable file → Normal file
View file

@ -18,20 +18,16 @@
#include "dat.h"
#include "fns.h"
Client *hiddenc[MAXHIDDEN];
Client* hiddenc[MAXHIDDEN];
int numhidden;
int virt;
int reversehide = 1;
Client * currents[NUMVIRTUALS] =
{
NULL, NULL, NULL, NULL
};
Client* currents[NUMVIRTUALS] = {NULL, NULL, NULL, NULL};
char *b2items[NUMVIRTUALS+1] =
{
char* b2items[NUMVIRTUALS + 1] = {
"One",
"Two",
"Three",
@ -44,16 +40,11 @@ char *b2items[NUMVIRTUALS+1] =
"Ten",
"Eleven",
"Twelve",
0
};
0};
Menu b2menu =
{
b2items
};
Menu b2menu = {b2items};
char *b3items[B3FIXED+MAXHIDDEN+1] =
{
char* b3items[B3FIXED + MAXHIDDEN + 1] = {
"New",
"Reshape",
"Move",
@ -62,11 +53,9 @@ char *b3items[B3FIXED+MAXHIDDEN+1] =
#ifdef SHOWSTICK
"Stick",
#endif
0
};
0};
enum
{
enum {
New,
Reshape,
Move,
@ -79,130 +68,105 @@ enum
#endif
};
Menu b3menu =
{
b3items
};
Menu b3menu = {b3items};
Menu egg =
{
version
};
Menu egg = {version};
void
button(XButtonEvent *e)
{
button(XButtonEvent* e) {
int n, shift;
Client *c;
Client* c;
Window dw;
ScreenInfo *s;
ScreenInfo* s;
curtime = e->time;
s = getscreen(e->root);
if(s == 0)
return;
if (s == 0) return;
c = getclient(e->window, 0);
if(c){
if(debug) fprintf(stderr, "but: e x=%d y=%d c x=%d y=%d dx=%d dy=%d BORDR %d\n",
e->x, e->y, c->x, c->y, c->dx, c->dy, BORDER);
if(borderorient(c, e->x, e->y) != BorderUnknown){
switch (e->button){
if (c) {
if (debug)
fprintf(
stderr,
"but: e x=%d y=%d c x=%d y=%d dx=%d dy=%d BORDR %d\n",
e->x,
e->y,
c->x,
c->y,
c->dx,
c->dy,
BORDER);
if (borderorient(c, e->x, e->y) != BorderUnknown) {
switch (e->button) {
case Button1:
case Button2:
reshape(c, e->button, pull, e);
return;
case Button3:
move(c, Button3);
return;
default:
return;
case Button2: reshape(c, e->button, pull, e); return;
case Button3: move(c, Button3); return;
default: return;
}
}
e->x += c->x - BORDER;
e->y += c->y - BORDER;
} else if(e->window != e->root){
if(debug) fprintf(stderr, "but no client: e x=%d y=%d\n",
e->x, e->y);
XTranslateCoordinates(dpy, e->window, s->root, e->x, e->y,
&e->x, &e->y, &dw);
} else if (e->window != e->root) {
if (debug) fprintf(stderr, "but no client: e x=%d y=%d\n", e->x, e->y);
XTranslateCoordinates(
dpy, e->window, s->root, e->x, e->y, &e->x, &e->y, &dw);
}
switch (e->button){
switch (e->button) {
case Button1:
fflush(stdout);
if(c){
if (ffm)
XRaiseWindow(dpy, c->window);
if (c) {
if (ffm) XRaiseWindow(dpy, c->window);
XMapRaised(dpy, c->parent);
top(c);
active(c);
}
return;
case Button2:
if(c){
if (c) {
XMapRaised(dpy, c->parent);
active(c);
XAllowEvents (dpy, ReplayPointer, curtime);
} else if((e->state&(ShiftMask|ControlMask))==(ShiftMask|ControlMask)){
XAllowEvents(dpy, ReplayPointer, curtime);
} else if (
(e->state & (ShiftMask | ControlMask)) == (ShiftMask | ControlMask)) {
menuhit(e, &egg);
} else if(numvirtuals > 1 && (n = menuhit(e, &b2menu)) > -1)
} else if (numvirtuals > 1 && (n = menuhit(e, &b2menu)) > -1)
button2(n);
return;
case Button3:
break;
case Button3: break;
case Button4:
/* scroll up changes to previous virtual screen */
if(!c && e->type == ButtonPress)
if(numvirtuals > 1 && virt > 0)
switch_to(virt - 1);
if (!c && e->type == ButtonPress)
if (numvirtuals > 1 && virt > 0) switch_to(virt - 1);
return;
case Button5:
/* scroll down changes to next virtual screen */
if(!c && e->type == ButtonPress)
if(numvirtuals > 1 && virt < numvirtuals - 1)
switch_to(virt + 1);
return;
default:
if (!c && e->type == ButtonPress)
if (numvirtuals > 1 && virt < numvirtuals - 1) switch_to(virt + 1);
return;
default: return;
}
if(current && current->screen == s)
cmapnofocus(s);
switch (n = menuhit(e, &b3menu)){
case New:
spawn(s);
break;
case Reshape:
reshape(selectwin(1, 0, s), Button3, sweep, 0);
break;
case Move:
move(selectwin(0, 0, s), Button3);
break;
if (current && current->screen == s) cmapnofocus(s);
switch (n = menuhit(e, &b3menu)) {
case New: spawn(s); break;
case Reshape: reshape(selectwin(1, 0, s), Button3, sweep, 0); break;
case Move: move(selectwin(0, 0, s), Button3); break;
case Delete:
shift = 0;
c = selectwin(1, &shift, s);
delete(c, shift);
break;
case Hide:
hide(selectwin(1, 0, s));
delete (c, shift);
break;
case Hide: hide(selectwin(1, 0, s)); break;
#ifdef SHOWSTICK
case Stick:
stick(selectwin(1, 0, s));
break;
case Stick: stick(selectwin(1, 0, s)); break;
#endif
default: /* unhide window */
unhide(n - B3FIXED, 1);
break;
case -1: /* nothing */
break;
default: /* unhide window */ unhide(n - B3FIXED, 1); break;
case -1: /* nothing */ break;
}
if(current && current->screen == s)
cmapfocus(current);
if (current && current->screen == s) cmapfocus(current);
}
void
spawn(ScreenInfo *s)
{
spawn(ScreenInfo* s) {
/*
* ugly dance to cause sweeping for terminals.
* the very next window created will require sweeping.
@ -214,15 +178,14 @@ spawn(ScreenInfo *s)
* ugly dance to avoid leaving zombies. Could use SIGCHLD,
* but it's not very portable.
*/
if(fork() == 0){
if(fork() == 0){
if (fork() == 0) {
if (fork() == 0) {
close(ConnectionNumber(dpy));
if(s->display[0] != '\0')
putenv(s->display);
if (s->display[0] != '\0') putenv(s->display);
signal(SIGINT, SIG_DFL);
signal(SIGTERM, SIG_DFL);
signal(SIGHUP, SIG_DFL);
if(termprog != NULL){
if (termprog != NULL) {
execl(shell, shell, "-c", termprog, (char*)0);
fprintf(stderr, "ryudo: exec %s", shell);
perror(" failed");
@ -235,102 +198,99 @@ spawn(ScreenInfo *s)
}
exit(0);
}
wait((int *) 0);
wait((int*)0);
}
void
reshape(Client *c, int but, int (*fn)(Client*, int, XButtonEvent *), XButtonEvent *e)
{
reshape(
Client* c, int but, int (*fn)(Client*, int, XButtonEvent*), XButtonEvent* e) {
int odx, ody;
if(c == 0)
return;
if (c == 0) return;
odx = c->dx;
ody = c->dy;
if(fn(c, but, e) == 0)
return;
if (fn(c, but, e) == 0) return;
active(c);
top(c);
XRaiseWindow(dpy, c->parent);
XMoveResizeWindow(dpy, c->parent, c->x-BORDER, c->y-BORDER,
c->dx+2*BORDER, c->dy+2*BORDER);
if(c->dx == odx && c->dy == ody)
XMoveResizeWindow(
dpy,
c->parent,
c->x - BORDER,
c->y - BORDER,
c->dx + 2 * BORDER,
c->dy + 2 * BORDER);
if (c->dx == odx && c->dy == ody)
sendconfig(c);
else
XMoveResizeWindow(dpy, c->window, BORDER, BORDER, c->dx, c->dy);
}
void
move(Client *c, int but)
{
if(c == 0)
return;
if(drag(c, but) == 0)
return;
move(Client* c, int but) {
if (c == 0) return;
if (drag(c, but) == 0) return;
active(c);
top(c);
XRaiseWindow(dpy, c->parent);
XMoveWindow(dpy, c->parent, c->x-BORDER, c->y-BORDER);
XMoveWindow(dpy, c->parent, c->x - BORDER, c->y - BORDER);
sendconfig(c);
}
void
delete(Client *c, int shift)
{
if(c == 0)
return;
if((c->proto & Pdelete) && !shift)
void delete (Client* c, int shift) {
if (c == 0) return;
if ((c->proto & Pdelete) && !shift)
sendcmessage(c->window, wm_protocols, wm_delete, 0, 0);
else
XKillClient(dpy, c->window); /* let event clean up */
}
void
hide(Client *c)
{
if(c == 0 || numhidden == MAXHIDDEN)
return;
if(hidden(c)){
hide(Client* c) {
if (c == 0 || numhidden == MAXHIDDEN) return;
if (hidden(c)) {
fprintf(stderr, "ryudo: already hidden: %s\n", c->label);
return;
}
XUnmapWindow(dpy, c->parent);
XUnmapWindow(dpy, c->window);
setstate(c, IconicState);
if(c == current)
nofocus();
if(reversehide){
memmove(hiddenc+1, hiddenc, numhidden*sizeof hiddenc[0]);
memmove(b3items+B3FIXED+1, b3items+B3FIXED, numhidden*sizeof b3items[0]);
if (c == current) nofocus();
if (reversehide) {
memmove(hiddenc + 1, hiddenc, numhidden * sizeof hiddenc[0]);
memmove(
b3items + B3FIXED + 1, b3items + B3FIXED, numhidden * sizeof b3items[0]);
hiddenc[0] = c;
b3items[B3FIXED] = c->label;
}else{
} else {
hiddenc[numhidden] = c;
b3items[B3FIXED+numhidden] = c->label;
b3items[B3FIXED + numhidden] = c->label;
}
numhidden++;
b3items[B3FIXED+numhidden] = 0;
b3items[B3FIXED + numhidden] = 0;
}
void
unhide(int n, int map)
{
Client *c;
unhide(int n, int map) {
Client* c;
int i;
if(n >= numhidden){
if (n >= numhidden) {
fprintf(stderr, "ryudo: unhide: n %d numhidden %d\n", n, numhidden);
return;
}
c = hiddenc[n];
if(!hidden(c)){
fprintf(stderr, "ryudo: unhide: not hidden: %s(0x%x)\n",
c->label, (int)c->window);
if (!hidden(c)) {
fprintf(
stderr,
"ryudo: unhide: not hidden: %s(0x%x)\n",
c->label,
(int)c->window);
return;
}
c->virt = virt;
if(map){
if (map) {
XMapWindow(dpy, c->window);
XMapRaised(dpy, c->parent);
setstate(c, NormalState);
@ -339,110 +299,92 @@ unhide(int n, int map)
}
numhidden--;
for(i = n; i < numhidden; i++){
hiddenc[i] = hiddenc[i+1];
b3items[B3FIXED+i] = b3items[B3FIXED+i+1];
for (i = n; i < numhidden; i++) {
hiddenc[i] = hiddenc[i + 1];
b3items[B3FIXED + i] = b3items[B3FIXED + i + 1];
}
b3items[B3FIXED+numhidden] = 0;
b3items[B3FIXED + numhidden] = 0;
}
void
unhidec(Client *c, int map)
{
unhidec(Client* c, int map) {
int i;
for(i = 0; i < numhidden; i++)
if(c == hiddenc[i]){
for (i = 0; i < numhidden; i++)
if (c == hiddenc[i]) {
unhide(i, map);
return;
}
fprintf(stderr, "ryudo: unhidec: not hidden: %s(0x%x)\n",
c->label, (int)c->window);
fprintf(
stderr, "ryudo: unhidec: not hidden: %s(0x%x)\n", c->label, (int)c->window);
}
void
stick(Client *c)
{
if (numvirtuals > 1 && c->virt >= 0 )
stick(Client* c) {
if (numvirtuals > 1 && c->virt >= 0)
c->virt = -1;
else c->virt = virt;
else
c->virt = virt;
}
void
renamec(Client *c, char *name)
{
renamec(Client* c, char* name) {
int i;
if(name == 0)
name = "???";
if (name == 0) name = "???";
c->label = name;
if(!hidden(c))
return;
for(i = 0; i < numhidden; i++)
if(c == hiddenc[i]){
b3items[B3FIXED+i] = name;
if (!hidden(c)) return;
for (i = 0; i < numhidden; i++)
if (c == hiddenc[i]) {
b3items[B3FIXED + i] = name;
return;
}
}
void
button2(int n)
{
button2(int n) {
switch_to(n);
if(current)
cmapfocus(current);
if (current) cmapfocus(current);
}
void
switch_to_c(int n, Client *c)
{
if(c == 0)
return;
switch_to_c(int n, Client* c) {
if (c == 0) return;
if(c->next)
switch_to_c(n, c->next);
if (c->next) switch_to_c(n, c->next);
if(c->parent == DefaultRootWindow(dpy))
return;
if (c->parent == DefaultRootWindow(dpy)) return;
#ifdef AUTOSTICK
if(c->virt >= 0 && isautostick(c)){
stick(c);
}
if (c->virt >= 0 && isautostick(c)) { stick(c); }
#endif
if(c->virt != virt && c->state == NormalState && c->virt >= 0){
if (c->virt != virt && c->state == NormalState && c->virt >= 0) {
XUnmapWindow(dpy, c->parent);
XUnmapWindow(dpy, c->window);
setstate(c, IconicState);
if(c == current)
nofocus();
} else if(c->virt == virt && c->state == IconicState){
if (c == current) nofocus();
} else if (c->virt == virt && c->state == IconicState) {
int i;
for(i = 0; i < numhidden; i++)
if(c == hiddenc[i])
break;
for (i = 0; i < numhidden; i++)
if (c == hiddenc[i]) break;
if(i == numhidden){
if (i == numhidden) {
XMapWindow(dpy, c->window);
XMapWindow(dpy, c->parent);
setstate(c, NormalState);
if(currents[virt] == c)
active(c);
if (currents[virt] == c) active(c);
}
}
}
void
switch_to(int n)
{
switch_to(int n) {
#ifdef VIRTNOTIFY
static char virtmsg[32];
#endif
if(n == virt)
return;
if (n == virt) return;
currents[virt] = current;
virt = n;
@ -454,23 +396,27 @@ switch_to(int n)
switch_to_c(n, clients);
current = currents[virt];
top(current);
if(fork() == 0)
{
if (fork() == 0) {
close(ConnectionNumber(dpy));
if(dpy != '\0')
putenv(dpy);
if (dpy != '\0') putenv(dpy);
signal(SIGINT, SIG_DFL);
signal(SIGTERM, SIG_DFL);
signal(SIGHUP, SIG_DFL);
#ifdef VIRTNOTIFY
sprintf(virtmsg, VIRTMSG, b2items[virt]);
execlp("notify-send", "notify-send", "-c", "virtual", VIRTHEADER, virtmsg, (char*)0);
execlp(
"notify-send",
"notify-send",
"-c",
"virtual",
VIRTHEADER,
virtmsg,
(char*)0);
#endif
}
}
void
initb2menu(int n)
{
initb2menu(int n) {
b2items[n] = 0;
}

577
printevent.c Executable file → Normal file
View file

@ -56,59 +56,45 @@ static char* sep = " ";
/* Returns the string equivalent of a boolean parameter */
static char*
TorF(int bool)
{
TorF(int bool) {
switch (bool) {
case True:
return ("True");
case True: return ("True");
case False:
return ("False");
case False: return ("False");
default:
return ("?");
default: return ("?");
}
}
/* Returns the string equivalent of a property notify state */
static char*
PropertyState(int state)
{
PropertyState(int state) {
switch (state) {
case PropertyNewValue:
return ("PropertyNewValue");
case PropertyNewValue: return ("PropertyNewValue");
case PropertyDelete:
return ("PropertyDelete");
case PropertyDelete: return ("PropertyDelete");
default:
return ("?");
default: return ("?");
}
}
/* Returns the string equivalent of a visibility notify state */
static char*
VisibilityState(int state)
{
VisibilityState(int state) {
switch (state) {
case VisibilityUnobscured:
return ("VisibilityUnobscured");
case VisibilityUnobscured: return ("VisibilityUnobscured");
case VisibilityPartiallyObscured:
return ("VisibilityPartiallyObscured");
case VisibilityPartiallyObscured: return ("VisibilityPartiallyObscured");
case VisibilityFullyObscured:
return ("VisibilityFullyObscured");
case VisibilityFullyObscured: return ("VisibilityFullyObscured");
default:
return ("?");
default: return ("?");
}
}
/* Returns the string equivalent of a timestamp */
static char*
ServerTime(Time time)
{
ServerTime(Time time) {
unsigned long msec;
unsigned long sec;
unsigned long min;
@ -126,9 +112,16 @@ ServerTime(Time time)
time /= 24;
day = time;
if(0)
sprintf(buffer, "%lu day%s %02lu:%02lu:%02lu.%03lu",
day, day == 1 ? "" : "(s)", hr, min, sec, msec);
if (0)
sprintf(
buffer,
"%lu day%s %02lu:%02lu:%02lu.%03lu",
day,
day == 1 ? "" : "(s)",
hr,
min,
sec,
msec);
sprintf(buffer, "%lud%luh%lum%lu.%03lds", day, hr, min, sec, msec);
return (buffer);
@ -136,16 +129,14 @@ if(0)
/* Simple structure to ease the interpretation of masks */
typedef struct MaskType MaskType;
struct MaskType
{
struct MaskType {
unsigned int value;
char *string;
char* string;
};
/* Returns the string equivalent of a mask of buttons and/or modifier keys */
static char*
ButtonAndOrModifierState(unsigned int state)
{
ButtonAndOrModifierState(unsigned int state) {
static char buffer[256];
static MaskType masks[] = {
{Button1Mask, "Button1Mask"},
@ -182,8 +173,7 @@ ButtonAndOrModifierState(unsigned int state)
/* Returns the string equivalent of a mask of configure window values */
static char*
ConfigureValueMask(unsigned int valuemask)
{
ConfigureValueMask(unsigned int valuemask) {
static char buffer[256];
static MaskType masks[] = {
{CWX, "CWX"},
@ -215,24 +205,19 @@ ConfigureValueMask(unsigned int valuemask)
/* Returns the string equivalent of a motion hint */
static char*
IsHint(char is_hint)
{
IsHint(char is_hint) {
switch (is_hint) {
case NotifyNormal:
return ("NotifyNormal");
case NotifyNormal: return ("NotifyNormal");
case NotifyHint:
return ("NotifyHint");
case NotifyHint: return ("NotifyHint");
default:
return ("?");
default: return ("?");
}
}
/* Returns the string equivalent of an id or the value "None" */
static char*
MaybeNone(int value)
{
MaybeNone(int value) {
static char buffer[16];
if (value == None)
@ -245,187 +230,138 @@ MaybeNone(int value)
/* Returns the string equivalent of a colormap state */
static char*
ColormapState(int state)
{
ColormapState(int state) {
switch (state) {
case ColormapInstalled:
return ("ColormapInstalled");
case ColormapInstalled: return ("ColormapInstalled");
case ColormapUninstalled:
return ("ColormapUninstalled");
case ColormapUninstalled: return ("ColormapUninstalled");
default:
return ("?");
default: return ("?");
}
}
/* Returns the string equivalent of a crossing detail */
static char*
CrossingDetail(int detail)
{
CrossingDetail(int detail) {
switch (detail) {
case NotifyAncestor:
return ("NotifyAncestor");
case NotifyAncestor: return ("NotifyAncestor");
case NotifyInferior:
return ("NotifyInferior");
case NotifyInferior: return ("NotifyInferior");
case NotifyVirtual:
return ("NotifyVirtual");
case NotifyVirtual: return ("NotifyVirtual");
case NotifyNonlinear:
return ("NotifyNonlinear");
case NotifyNonlinear: return ("NotifyNonlinear");
case NotifyNonlinearVirtual:
return ("NotifyNonlinearVirtual");
case NotifyNonlinearVirtual: return ("NotifyNonlinearVirtual");
default:
return ("?");
default: return ("?");
}
}
/* Returns the string equivalent of a focus change detail */
static char*
FocusChangeDetail(int detail)
{
FocusChangeDetail(int detail) {
switch (detail) {
case NotifyAncestor:
return ("NotifyAncestor");
case NotifyAncestor: return ("NotifyAncestor");
case NotifyInferior:
return ("NotifyInferior");
case NotifyInferior: return ("NotifyInferior");
case NotifyVirtual:
return ("NotifyVirtual");
case NotifyVirtual: return ("NotifyVirtual");
case NotifyNonlinear:
return ("NotifyNonlinear");
case NotifyNonlinear: return ("NotifyNonlinear");
case NotifyNonlinearVirtual:
return ("NotifyNonlinearVirtual");
case NotifyNonlinearVirtual: return ("NotifyNonlinearVirtual");
case NotifyPointer:
return ("NotifyPointer");
case NotifyPointer: return ("NotifyPointer");
case NotifyPointerRoot:
return ("NotifyPointerRoot");
case NotifyPointerRoot: return ("NotifyPointerRoot");
case NotifyDetailNone:
return ("NotifyDetailNone");
case NotifyDetailNone: return ("NotifyDetailNone");
default:
return ("?");
default: return ("?");
}
}
/* Returns the string equivalent of a configure detail */
static char*
ConfigureDetail(int detail)
{
ConfigureDetail(int detail) {
switch (detail) {
case Above:
return ("Above");
case Above: return ("Above");
case Below:
return ("Below");
case Below: return ("Below");
case TopIf:
return ("TopIf");
case TopIf: return ("TopIf");
case BottomIf:
return ("BottomIf");
case BottomIf: return ("BottomIf");
case Opposite:
return ("Opposite");
case Opposite: return ("Opposite");
default:
return ("?");
default: return ("?");
}
}
/* Returns the string equivalent of a grab mode */
static char*
GrabMode(int mode)
{
GrabMode(int mode) {
switch (mode) {
case NotifyNormal:
return ("NotifyNormal");
case NotifyNormal: return ("NotifyNormal");
case NotifyGrab:
return ("NotifyGrab");
case NotifyGrab: return ("NotifyGrab");
case NotifyUngrab:
return ("NotifyUngrab");
case NotifyUngrab: return ("NotifyUngrab");
case NotifyWhileGrabbed:
return ("NotifyWhileGrabbed");
case NotifyWhileGrabbed: return ("NotifyWhileGrabbed");
default:
return ("?");
default: return ("?");
}
}
/* Returns the string equivalent of a mapping request */
static char*
MappingRequest(int request)
{
MappingRequest(int request) {
switch (request) {
case MappingModifier:
return ("MappingModifier");
case MappingModifier: return ("MappingModifier");
case MappingKeyboard:
return ("MappingKeyboard");
case MappingKeyboard: return ("MappingKeyboard");
case MappingPointer:
return ("MappingPointer");
case MappingPointer: return ("MappingPointer");
default:
return ("?");
default: return ("?");
}
}
/* Returns the string equivalent of a stacking order place */
static char*
Place(int place)
{
Place(int place) {
switch (place) {
case PlaceOnTop:
return ("PlaceOnTop");
case PlaceOnTop: return ("PlaceOnTop");
case PlaceOnBottom:
return ("PlaceOnBottom");
case PlaceOnBottom: return ("PlaceOnBottom");
default:
return ("?");
default: return ("?");
}
}
/* Returns the string equivalent of a major code */
static char*
MajorCode(int code)
{
MajorCode(int code) {
static char buffer[32];
switch (code) {
case X_CopyArea:
return ("X_CopyArea");
case X_CopyArea: return ("X_CopyArea");
case X_CopyPlane:
return ("X_CopyPlane");
case X_CopyPlane: return ("X_CopyPlane");
default:
sprintf(buffer, "0x%x", code);
return (buffer);
default: sprintf(buffer, "0x%x", code); return (buffer);
}
}
/* Returns the string equivalent the keycode contained in the key event */
static char*
Keycode(XKeyEvent *ev)
{
Keycode(XKeyEvent* ev) {
static char buffer[256];
KeySym keysym_str;
char *keysym_name;
char* keysym_name;
char string[256];
XLookupString(ev, string, 64, &keysym_str, NULL);
@ -434,20 +370,22 @@ Keycode(XKeyEvent *ev)
keysym_name = "NoSymbol";
else if (!(keysym_name = XKeysymToString(keysym_str)))
keysym_name = "(no name)";
sprintf(buffer, "%u (keysym 0x%x \"%s\")",
(int)ev->keycode, (int)keysym_str, keysym_name);
sprintf(
buffer,
"%u (keysym 0x%x \"%s\")",
(int)ev->keycode,
(int)keysym_str,
keysym_name);
return (buffer);
}
/* Returns the string equivalent of an atom or "None"*/
static char*
AtomName(Display *dpy, Atom atom)
{
AtomName(Display* dpy, Atom atom) {
static char buffer[256];
char *atom_name;
char* atom_name;
if (atom == None)
return ("None");
if (atom == None) return ("None");
atom_name = XGetAtomName(dpy, atom);
strncpy(buffer, atom_name, 256);
@ -460,8 +398,7 @@ AtomName(Display *dpy, Atom atom)
/******************************************************************************/
static void
VerbMotion(XMotionEvent *ev)
{
VerbMotion(XMotionEvent* ev) {
printf("window=0x%x%s", (int)ev->window, sep);
printf("root=0x%x%s", (int)ev->root, sep);
printf("subwindow=0x%x%s", (int)ev->subwindow, sep);
@ -474,8 +411,7 @@ VerbMotion(XMotionEvent *ev)
}
static void
VerbButton(XButtonEvent *ev)
{
VerbButton(XButtonEvent* ev) {
printf("window=0x%x%s", (int)ev->window, sep);
printf("root=0x%x%s", (int)ev->root, sep);
printf("subwindow=0x%x%s", (int)ev->subwindow, sep);
@ -488,8 +424,7 @@ VerbButton(XButtonEvent *ev)
}
static void
VerbColormap(XColormapEvent *ev)
{
VerbColormap(XColormapEvent* ev) {
printf("window=0x%x%s", (int)ev->window, sep);
printf("colormap=%s%s", MaybeNone(ev->colormap), sep);
printf("new=%s%s", TorF(ev->new), sep);
@ -497,8 +432,7 @@ VerbColormap(XColormapEvent *ev)
}
static void
VerbCrossing(XCrossingEvent *ev)
{
VerbCrossing(XCrossingEvent* ev) {
printf("window=0x%x%s", (int)ev->window, sep);
printf("root=0x%x%s", (int)ev->root, sep);
printf("subwindow=0x%x%s", (int)ev->subwindow, sep);
@ -513,8 +447,7 @@ VerbCrossing(XCrossingEvent *ev)
}
static void
VerbExpose(XExposeEvent *ev)
{
VerbExpose(XExposeEvent* ev) {
printf("window=0x%x%s", (int)ev->window, sep);
printf("x=%d y=%d%s", ev->x, ev->y, sep);
printf("width=%d height=%d%s", ev->width, ev->height, sep);
@ -522,8 +455,7 @@ VerbExpose(XExposeEvent *ev)
}
static void
VerbGraphicsExpose(XGraphicsExposeEvent *ev)
{
VerbGraphicsExpose(XGraphicsExposeEvent* ev) {
printf("drawable=0x%x%s", (int)ev->drawable, sep);
printf("x=%d y=%d%s", ev->x, ev->y, sep);
printf("width=%d height=%d%s", ev->width, ev->height, sep);
@ -532,48 +464,40 @@ VerbGraphicsExpose(XGraphicsExposeEvent *ev)
}
static void
VerbNoExpose(XNoExposeEvent *ev)
{
VerbNoExpose(XNoExposeEvent* ev) {
printf("drawable=0x%x%s", (int)ev->drawable, sep);
printf("major_code=%s%s", MajorCode(ev->major_code), sep);
printf("minor_code=%d\n", ev->minor_code);
}
static void
VerbFocus(XFocusChangeEvent *ev)
{
VerbFocus(XFocusChangeEvent* ev) {
printf("window=0x%x%s", (int)ev->window, sep);
printf("mode=%s%s", GrabMode(ev->mode), sep);
printf("detail=%s\n", FocusChangeDetail(ev->detail));
}
static void
VerbKeymap(XKeymapEvent *ev)
{
VerbKeymap(XKeymapEvent* ev) {
int i;
printf("window=0x%x%s", (int)ev->window, sep);
printf("key_vector=");
for (i = 0; i < 32; i++)
printf("%02x", ev->key_vector[i]);
for (i = 0; i < 32; i++) printf("%02x", ev->key_vector[i]);
printf("\n");
}
static void
VerbKey(XKeyEvent *ev)
{
VerbKey(XKeyEvent* ev) {
printf("window=0x%x%s", (int)ev->window, sep);
printf("root=0x%x%s", (int)ev->root, sep);
if(ev->subwindow)
printf("subwindow=0x%x%s", (int)ev->subwindow, sep);
if (ev->subwindow) printf("subwindow=0x%x%s", (int)ev->subwindow, sep);
printf("time=%s%s", ServerTime(ev->time), sep);
printf("[%d,%d]%s", ev->x, ev->y, sep);
printf("root=[%d,%d]%s", ev->x_root, ev->y_root, sep);
if(ev->state)
printf("state=%s%s", ButtonAndOrModifierState(ev->state), sep);
if (ev->state) printf("state=%s%s", ButtonAndOrModifierState(ev->state), sep);
printf("keycode=%s%s", Keycode(ev), sep);
if(!ev->same_screen)
printf("!same_screen", TorF(ev->same_screen));
if (!ev->same_screen) printf("!same_screen", TorF(ev->same_screen));
printf("\n");
return;
@ -589,8 +513,7 @@ VerbKey(XKeyEvent *ev)
}
static void
VerbProperty(XPropertyEvent *ev)
{
VerbProperty(XPropertyEvent* ev) {
printf("window=0x%x%s", (int)ev->window, sep);
printf("atom=%s%s", AtomName(ev->display, ev->atom), sep);
printf("time=%s%s", ServerTime(ev->time), sep);
@ -598,23 +521,20 @@ VerbProperty(XPropertyEvent *ev)
}
static void
VerbResizeRequest(XResizeRequestEvent *ev)
{
VerbResizeRequest(XResizeRequestEvent* ev) {
printf("window=0x%x%s", (int)ev->window, sep);
printf("width=%d height=%d\n", ev->width, ev->height);
}
static void
VerbCirculate(XCirculateEvent *ev)
{
VerbCirculate(XCirculateEvent* ev) {
printf("event=0x%x%s", (int)ev->event, sep);
printf("window=0x%x%s", (int)ev->window, sep);
printf("place=%s\n", Place(ev->place));
}
static void
VerbConfigure(XConfigureEvent *ev)
{
VerbConfigure(XConfigureEvent* ev) {
printf("event=0x%x%s", (int)ev->event, sep);
printf("window=0x%x%s", (int)ev->window, sep);
printf("x=%d y=%d%s", ev->x, ev->y, sep);
@ -625,8 +545,7 @@ VerbConfigure(XConfigureEvent *ev)
}
static void
VerbCreateWindow(XCreateWindowEvent *ev)
{
VerbCreateWindow(XCreateWindowEvent* ev) {
printf("parent=0x%x%s", (int)ev->parent, sep);
printf("window=0x%x%s", (int)ev->window, sep);
printf("x=%d y=%d%s", ev->x, ev->y, sep);
@ -636,31 +555,27 @@ VerbCreateWindow(XCreateWindowEvent *ev)
}
static void
VerbDestroyWindow(XDestroyWindowEvent *ev)
{
VerbDestroyWindow(XDestroyWindowEvent* ev) {
printf("event=0x%x%s", (int)ev->event, sep);
printf("window=0x%x\n", (int)ev->window);
}
static void
VerbGravity(XGravityEvent *ev)
{
VerbGravity(XGravityEvent* ev) {
printf("event=0x%x%s", (int)ev->event, sep);
printf("window=0x%x%s", (int)ev->window, sep);
printf("x=%d y=%d\n", ev->x, ev->y);
}
static void
VerbMap(XMapEvent *ev)
{
VerbMap(XMapEvent* ev) {
printf("event=0x%x%s", (int)ev->event, sep);
printf("window=0x%x%s", (int)ev->window, sep);
printf("override_redirect=%s\n", TorF(ev->override_redirect));
}
static void
VerbReparent(XReparentEvent *ev)
{
VerbReparent(XReparentEvent* ev) {
printf("event=0x%x%s", (int)ev->event, sep);
printf("window=0x%x%s", (int)ev->window, sep);
printf("parent=0x%x%s", (int)ev->parent, sep);
@ -669,24 +584,21 @@ VerbReparent(XReparentEvent *ev)
}
static void
VerbUnmap(XUnmapEvent *ev)
{
VerbUnmap(XUnmapEvent* ev) {
printf("event=0x%x%s", (int)ev->event, sep);
printf("window=0x%x%s", (int)ev->window, sep);
printf("from_configure=%s\n", TorF(ev->from_configure));
}
static void
VerbCirculateRequest(XCirculateRequestEvent *ev)
{
VerbCirculateRequest(XCirculateRequestEvent* ev) {
printf("parent=0x%x%s", (int)ev->parent, sep);
printf("window=0x%x%s", (int)ev->window, sep);
printf("place=%s\n", Place(ev->place));
}
static void
VerbConfigureRequest(XConfigureRequestEvent *ev)
{
VerbConfigureRequest(XConfigureRequestEvent* ev) {
printf("parent=0x%x%s", (int)ev->parent, sep);
printf("window=0x%x%s", (int)ev->window, sep);
printf("x=%d y=%d%s", ev->x, ev->y, sep);
@ -698,29 +610,25 @@ VerbConfigureRequest(XConfigureRequestEvent *ev)
}
static void
VerbMapRequest(XMapRequestEvent *ev)
{
VerbMapRequest(XMapRequestEvent* ev) {
printf("parent=0x%x%s", (int)ev->parent, sep);
printf("window=0x%x\n", (int)ev->window);
}
static void
VerbClient(XClientMessageEvent *ev)
{
VerbClient(XClientMessageEvent* ev) {
int i;
printf("window=0x%x%s", (int)ev->window, sep);
printf("message_type=%s%s", AtomName(ev->display, ev->message_type), sep);
printf("format=%d\n", ev->format);
printf("data (shown as longs)=");
for (i = 0; i < 5; i++)
printf(" 0x%08lx", ev->data.l[i]);
for (i = 0; i < 5; i++) printf(" 0x%08lx", ev->data.l[i]);
printf("\n");
}
static void
VerbMapping(XMappingEvent *ev)
{
VerbMapping(XMappingEvent* ev) {
printf("window=0x%x%s", (int)ev->window, sep);
printf("request=%s%s", MappingRequest(ev->request), sep);
printf("first_keycode=0x%x%s", ev->first_keycode, sep);
@ -728,16 +636,14 @@ VerbMapping(XMappingEvent *ev)
}
static void
VerbSelectionClear(XSelectionClearEvent *ev)
{
VerbSelectionClear(XSelectionClearEvent* ev) {
printf("window=0x%x%s", (int)ev->window, sep);
printf("selection=%s%s", AtomName(ev->display, ev->selection), sep);
printf("time=%s\n", ServerTime(ev->time));
}
static void
VerbSelection(XSelectionEvent *ev)
{
VerbSelection(XSelectionEvent* ev) {
printf("requestor=0x%x%s", (int)ev->requestor, sep);
printf("selection=%s%s", AtomName(ev->display, ev->selection), sep);
printf("target=%s%s", AtomName(ev->display, ev->target), sep);
@ -746,8 +652,7 @@ VerbSelection(XSelectionEvent *ev)
}
static void
VerbSelectionRequest(XSelectionRequestEvent *ev)
{
VerbSelectionRequest(XSelectionRequestEvent* ev) {
printf("owner=0x%x%s", (int)ev->owner, sep);
printf("requestor=0x%x%s", (int)ev->requestor, sep);
printf("selection=%s%s", AtomName(ev->display, ev->selection), sep);
@ -757,8 +662,7 @@ VerbSelectionRequest(XSelectionRequestEvent *ev)
}
static void
VerbVisibility(XVisibilityEvent *ev)
{
VerbVisibility(XVisibilityEvent* ev) {
printf("window=0x%x%s", (int)ev->window, sep);
printf("state=%s\n", VisibilityState(ev->state));
}
@ -767,77 +671,44 @@ VerbVisibility(XVisibilityEvent *ev)
/************ Return the string representation for type of an event ***********/
/******************************************************************************/
char *eventtype(XEvent *ev)
{
char*
eventtype(XEvent* ev) {
static char buffer[20];
switch (ev->type) {
case KeyPress:
return ("KeyPress");
case KeyRelease:
return ("KeyRelease");
case ButtonPress:
return ("ButtonPress");
case ButtonRelease:
return ("ButtonRelease");
case MotionNotify:
return ("MotionNotify");
case EnterNotify:
return ("EnterNotify");
case LeaveNotify:
return ("LeaveNotify");
case FocusIn:
return ("FocusIn");
case FocusOut:
return ("FocusOut");
case KeymapNotify:
return ("KeymapNotify");
case Expose:
return ("Expose");
case GraphicsExpose:
return ("GraphicsExpose");
case NoExpose:
return ("NoExpose");
case VisibilityNotify:
return ("VisibilityNotify");
case CreateNotify:
return ("CreateNotify");
case DestroyNotify:
return ("DestroyNotify");
case UnmapNotify:
return ("UnmapNotify");
case MapNotify:
return ("MapNotify");
case MapRequest:
return ("MapRequest");
case ReparentNotify:
return ("ReparentNotify");
case ConfigureNotify:
return ("ConfigureNotify");
case ConfigureRequest:
return ("ConfigureRequest");
case GravityNotify:
return ("GravityNotify");
case ResizeRequest:
return ("ResizeRequest");
case CirculateNotify:
return ("CirculateNotify");
case CirculateRequest:
return ("CirculateRequest");
case PropertyNotify:
return ("PropertyNotify");
case SelectionClear:
return ("SelectionClear");
case SelectionRequest:
return ("SelectionRequest");
case SelectionNotify:
return ("SelectionNotify");
case ColormapNotify:
return ("ColormapNotify");
case ClientMessage:
return ("ClientMessage");
case MappingNotify:
return ("MappingNotify");
case KeyPress: return ("KeyPress");
case KeyRelease: return ("KeyRelease");
case ButtonPress: return ("ButtonPress");
case ButtonRelease: return ("ButtonRelease");
case MotionNotify: return ("MotionNotify");
case EnterNotify: return ("EnterNotify");
case LeaveNotify: return ("LeaveNotify");
case FocusIn: return ("FocusIn");
case FocusOut: return ("FocusOut");
case KeymapNotify: return ("KeymapNotify");
case Expose: return ("Expose");
case GraphicsExpose: return ("GraphicsExpose");
case NoExpose: return ("NoExpose");
case VisibilityNotify: return ("VisibilityNotify");
case CreateNotify: return ("CreateNotify");
case DestroyNotify: return ("DestroyNotify");
case UnmapNotify: return ("UnmapNotify");
case MapNotify: return ("MapNotify");
case MapRequest: return ("MapRequest");
case ReparentNotify: return ("ReparentNotify");
case ConfigureNotify: return ("ConfigureNotify");
case ConfigureRequest: return ("ConfigureRequest");
case GravityNotify: return ("GravityNotify");
case ResizeRequest: return ("ResizeRequest");
case CirculateNotify: return ("CirculateNotify");
case CirculateRequest: return ("CirculateRequest");
case PropertyNotify: return ("PropertyNotify");
case SelectionClear: return ("SelectionClear");
case SelectionRequest: return ("SelectionRequest");
case SelectionNotify: return ("SelectionNotify");
case ColormapNotify: return ("ColormapNotify");
case ClientMessage: return ("ClientMessage");
case MappingNotify: return ("MappingNotify");
}
sprintf(buffer, "%d", ev->type);
return buffer;
@ -847,14 +718,13 @@ char *eventtype(XEvent *ev)
/**************** Print the values of all fields for any event ****************/
/******************************************************************************/
void printevent(XEvent *e)
{
XAnyEvent *ev = (void*)e;
void
printevent(XEvent* e) {
XAnyEvent* ev = (void*)e;
printf("%3ld %-20s ", ev->serial, eventtype(e));
if(ev->send_event)
printf("(sendevent) ");
if(0){
if (ev->send_event) printf("(sendevent) ");
if (0) {
printf("type=%s%s", eventtype(e), sep);
printf("serial=%lu%s", ev->serial, sep);
printf("send_event=%s%s", TorF(ev->send_event), sep);
@ -862,125 +732,66 @@ void printevent(XEvent *e)
}
switch (ev->type) {
case MotionNotify:
VerbMotion((void*)ev);
break;
case MotionNotify: VerbMotion((void*)ev); break;
case ButtonPress:
case ButtonRelease:
VerbButton((void*)ev);
break;
case ButtonRelease: VerbButton((void*)ev); break;
case ColormapNotify:
VerbColormap((void*)ev);
break;
case ColormapNotify: VerbColormap((void*)ev); break;
case EnterNotify:
case LeaveNotify:
VerbCrossing((void*)ev);
break;
case LeaveNotify: VerbCrossing((void*)ev); break;
case Expose:
VerbExpose((void*)ev);
break;
case Expose: VerbExpose((void*)ev); break;
case GraphicsExpose:
VerbGraphicsExpose((void*)ev);
break;
case GraphicsExpose: VerbGraphicsExpose((void*)ev); break;
case NoExpose:
VerbNoExpose((void*)ev);
break;
case NoExpose: VerbNoExpose((void*)ev); break;
case FocusIn:
case FocusOut:
VerbFocus((void*)ev);
break;
case FocusOut: VerbFocus((void*)ev); break;
case KeymapNotify:
VerbKeymap((void*)ev);
break;
case KeymapNotify: VerbKeymap((void*)ev); break;
case KeyPress:
case KeyRelease:
VerbKey((void*)ev);
break;
case KeyRelease: VerbKey((void*)ev); break;
case PropertyNotify:
VerbProperty((void*)ev);
break;
case PropertyNotify: VerbProperty((void*)ev); break;
case ResizeRequest:
VerbResizeRequest((void*)ev);
break;
case ResizeRequest: VerbResizeRequest((void*)ev); break;
case CirculateNotify:
VerbCirculate((void*)ev);
break;
case CirculateNotify: VerbCirculate((void*)ev); break;
case ConfigureNotify:
VerbConfigure((void*)ev);
break;
case ConfigureNotify: VerbConfigure((void*)ev); break;
case CreateNotify:
VerbCreateWindow((void*)ev);
break;
case CreateNotify: VerbCreateWindow((void*)ev); break;
case DestroyNotify:
VerbDestroyWindow((void*)ev);
break;
case DestroyNotify: VerbDestroyWindow((void*)ev); break;
case GravityNotify:
VerbGravity((void*)ev);
break;
case GravityNotify: VerbGravity((void*)ev); break;
case MapNotify:
VerbMap((void*)ev);
break;
case MapNotify: VerbMap((void*)ev); break;
case ReparentNotify:
VerbReparent((void*)ev);
break;
case ReparentNotify: VerbReparent((void*)ev); break;
case UnmapNotify:
VerbUnmap((void*)ev);
break;
case UnmapNotify: VerbUnmap((void*)ev); break;
case CirculateRequest:
VerbCirculateRequest((void*)ev);
break;
case CirculateRequest: VerbCirculateRequest((void*)ev); break;
case ConfigureRequest:
VerbConfigureRequest((void*)ev);
break;
case ConfigureRequest: VerbConfigureRequest((void*)ev); break;
case MapRequest:
VerbMapRequest((void*)ev);
break;
case MapRequest: VerbMapRequest((void*)ev); break;
case ClientMessage:
VerbClient((void*)ev);
break;
case ClientMessage: VerbClient((void*)ev); break;
case MappingNotify:
VerbMapping((void*)ev);
break;
case MappingNotify: VerbMapping((void*)ev); break;
case SelectionClear:
VerbSelectionClear((void*)ev);
break;
case SelectionClear: VerbSelectionClear((void*)ev); break;
case SelectionNotify:
VerbSelection((void*)ev);
break;
case SelectionNotify: VerbSelection((void*)ev); break;
case SelectionRequest:
VerbSelectionRequest((void*)ev);
break;
case SelectionRequest: VerbSelectionRequest((void*)ev); break;
case VisibilityNotify:
VerbVisibility((void*)ev);
break;
case VisibilityNotify: VerbVisibility((void*)ev); break;
}
}

2
printevent.h Executable file → Normal file
View file

@ -1,2 +1,2 @@
char *eventtype(XEvent*);
char* eventtype(XEvent*);
void printevent(XEvent*);

589
showevent/ShowEvent.c Executable file → Normal file
View file

@ -2,66 +2,52 @@
#include <X11/Xproto.h>
Boolean use_separate_lines = True;
static char *sep;
static char* sep;
/******************************************************************************/
/**** Miscellaneous routines to convert values to their string equivalents ****/
/******************************************************************************/
/* Returns the string equivalent of a boolean parameter */
static char *TorF(bool)
int bool;
static char* TorF(bool) int bool;
{
switch (bool) {
case True:
return ("True");
case True: return ("True");
case False:
return ("False");
case False: return ("False");
default:
return ("?");
default: return ("?");
}
}
/* Returns the string equivalent of a property notify state */
static char *PropertyState(state)
int state;
static char* PropertyState(state) int state;
{
switch (state) {
case PropertyNewValue:
return ("PropertyNewValue");
case PropertyNewValue: return ("PropertyNewValue");
case PropertyDelete:
return ("PropertyDelete");
case PropertyDelete: return ("PropertyDelete");
default:
return ("?");
default: return ("?");
}
}
/* Returns the string equivalent of a visibility notify state */
static char *VisibilityState(state)
int state;
static char* VisibilityState(state) int state;
{
switch (state) {
case VisibilityUnobscured:
return ("VisibilityUnobscured");
case VisibilityUnobscured: return ("VisibilityUnobscured");
case VisibilityPartiallyObscured:
return ("VisibilityPartiallyObscured");
case VisibilityPartiallyObscured: return ("VisibilityPartiallyObscured");
case VisibilityFullyObscured:
return ("VisibilityFullyObscured");
case VisibilityFullyObscured: return ("VisibilityFullyObscured");
default:
return ("?");
default: return ("?");
}
}
/* Returns the string equivalent of a timestamp */
static char *ServerTime(time)
Time time;
static char* ServerTime(time) Time time;
{
unsigned long msec;
unsigned long sec;
@ -80,20 +66,26 @@ Time time;
time /= 24;
day = time;
sprintf(buffer, "%ld day%s %02ld:%02ld:%02ld.%03ld",
day, day == 1 ? "" : "(s)", hr, min, sec, msec);
sprintf(
buffer,
"%ld day%s %02ld:%02ld:%02ld.%03ld",
day,
day == 1 ? "" : "(s)",
hr,
min,
sec,
msec);
return (buffer);
}
/* Simple structure to ease the interpretation of masks */
typedef struct _MaskType {
unsigned int value;
char *string;
char* string;
} MaskType;
/* Returns the string equivalent of a mask of buttons and/or modifier keys */
static char *ButtonAndOrModifierState(state)
unsigned int state;
static char* ButtonAndOrModifierState(state) unsigned int state;
{
static char buffer[256];
static MaskType masks[] = {
@ -130,8 +122,7 @@ unsigned int state;
}
/* Returns the string equivalent of a mask of configure window values */
static char *ConfigureValueMask(valuemask)
unsigned int valuemask;
static char* ConfigureValueMask(valuemask) unsigned int valuemask;
{
static char buffer[256];
static MaskType masks[] = {
@ -163,24 +154,19 @@ unsigned int valuemask;
}
/* Returns the string equivalent of a motion hint */
static char *IsHint(is_hint)
char is_hint;
static char* IsHint(is_hint) char is_hint;
{
switch (is_hint) {
case NotifyNormal:
return ("NotifyNormal");
case NotifyNormal: return ("NotifyNormal");
case NotifyHint:
return ("NotifyHint");
case NotifyHint: return ("NotifyHint");
default:
return ("?");
default: return ("?");
}
}
/* Returns the string equivalent of an id or the value "None" */
static char *MaybeNone(value)
int value;
static char* MaybeNone(value) int value;
{
static char buffer[16];
@ -193,188 +179,139 @@ int value;
}
/* Returns the string equivalent of a colormap state */
static char *ColormapState(state)
int state;
static char* ColormapState(state) int state;
{
switch (state) {
case ColormapInstalled:
return ("ColormapInstalled");
case ColormapInstalled: return ("ColormapInstalled");
case ColormapUninstalled:
return ("ColormapUninstalled");
case ColormapUninstalled: return ("ColormapUninstalled");
default:
return ("?");
default: return ("?");
}
}
/* Returns the string equivalent of a crossing detail */
static char *CrossingDetail(detail)
int detail;
static char* CrossingDetail(detail) int detail;
{
switch (detail) {
case NotifyAncestor:
return ("NotifyAncestor");
case NotifyAncestor: return ("NotifyAncestor");
case NotifyInferior:
return ("NotifyInferior");
case NotifyInferior: return ("NotifyInferior");
case NotifyVirtual:
return ("NotifyVirtual");
case NotifyVirtual: return ("NotifyVirtual");
case NotifyNonlinear:
return ("NotifyNonlinear");
case NotifyNonlinear: return ("NotifyNonlinear");
case NotifyNonlinearVirtual:
return ("NotifyNonlinearVirtual");
case NotifyNonlinearVirtual: return ("NotifyNonlinearVirtual");
default:
return ("?");
default: return ("?");
}
}
/* Returns the string equivalent of a focus change detail */
static char *FocusChangeDetail(detail)
int detail;
static char* FocusChangeDetail(detail) int detail;
{
switch (detail) {
case NotifyAncestor:
return ("NotifyAncestor");
case NotifyAncestor: return ("NotifyAncestor");
case NotifyInferior:
return ("NotifyInferior");
case NotifyInferior: return ("NotifyInferior");
case NotifyVirtual:
return ("NotifyVirtual");
case NotifyVirtual: return ("NotifyVirtual");
case NotifyNonlinear:
return ("NotifyNonlinear");
case NotifyNonlinear: return ("NotifyNonlinear");
case NotifyNonlinearVirtual:
return ("NotifyNonlinearVirtual");
case NotifyNonlinearVirtual: return ("NotifyNonlinearVirtual");
case NotifyPointer:
return ("NotifyPointer");
case NotifyPointer: return ("NotifyPointer");
case NotifyPointerRoot:
return ("NotifyPointerRoot");
case NotifyPointerRoot: return ("NotifyPointerRoot");
case NotifyDetailNone:
return ("NotifyDetailNone");
case NotifyDetailNone: return ("NotifyDetailNone");
default:
return ("?");
default: return ("?");
}
}
/* Returns the string equivalent of a configure detail */
static char *ConfigureDetail(detail)
int detail;
static char* ConfigureDetail(detail) int detail;
{
switch (detail) {
case Above:
return ("Above");
case Above: return ("Above");
case Below:
return ("Below");
case Below: return ("Below");
case TopIf:
return ("TopIf");
case TopIf: return ("TopIf");
case BottomIf:
return ("BottomIf");
case BottomIf: return ("BottomIf");
case Opposite:
return ("Opposite");
case Opposite: return ("Opposite");
default:
return ("?");
default: return ("?");
}
}
/* Returns the string equivalent of a grab mode */
static char *GrabMode(mode)
int mode;
static char* GrabMode(mode) int mode;
{
switch (mode) {
case NotifyNormal:
return ("NotifyNormal");
case NotifyNormal: return ("NotifyNormal");
case NotifyGrab:
return ("NotifyGrab");
case NotifyGrab: return ("NotifyGrab");
case NotifyUngrab:
return ("NotifyUngrab");
case NotifyUngrab: return ("NotifyUngrab");
case NotifyWhileGrabbed:
return ("NotifyWhileGrabbed");
case NotifyWhileGrabbed: return ("NotifyWhileGrabbed");
default:
return ("?");
default: return ("?");
}
}
/* Returns the string equivalent of a mapping request */
static char *MappingRequest(request)
int request;
static char* MappingRequest(request) int request;
{
switch (request) {
case MappingModifier:
return ("MappingModifier");
case MappingModifier: return ("MappingModifier");
case MappingKeyboard:
return ("MappingKeyboard");
case MappingKeyboard: return ("MappingKeyboard");
case MappingPointer:
return ("MappingPointer");
case MappingPointer: return ("MappingPointer");
default:
return ("?");
default: return ("?");
}
}
/* Returns the string equivalent of a stacking order place */
static char *Place(place)
int place;
static char* Place(place) int place;
{
switch (place) {
case PlaceOnTop:
return ("PlaceOnTop");
case PlaceOnTop: return ("PlaceOnTop");
case PlaceOnBottom:
return ("PlaceOnBottom");
case PlaceOnBottom: return ("PlaceOnBottom");
default:
return ("?");
default: return ("?");
}
}
/* Returns the string equivalent of a major code */
static char *MajorCode(code)
int code;
static char* MajorCode(code) int code;
{
static char buffer[32];
switch (code) {
case X_CopyArea:
return ("X_CopyArea");
case X_CopyArea: return ("X_CopyArea");
case X_CopyPlane:
return ("X_CopyPlane");
case X_CopyPlane: return ("X_CopyPlane");
default:
sprintf(buffer, "0x%x", code);
return (buffer);
default: sprintf(buffer, "0x%x", code); return (buffer);
}
}
/* Returns the string equivalent the keycode contained in the key event */
static char *Keycode(ev)
XKeyEvent *ev;
static char* Keycode(ev) XKeyEvent* ev;
{
static char buffer[256];
KeySym keysym_str;
char *keysym_name;
char* keysym_name;
char string[256];
XLookupString(ev, string, 64, &keysym_str, NULL);
@ -383,19 +320,22 @@ XKeyEvent *ev;
keysym_name = "NoSymbol";
else if (!(keysym_name = XKeysymToString(keysym_str)))
keysym_name = "(no name)";
sprintf(buffer, "%u (keysym 0x%x \"%s\")",
ev->keycode, (unsigned)keysym_str, keysym_name);
sprintf(
buffer,
"%u (keysym 0x%x \"%s\")",
ev->keycode,
(unsigned)keysym_str,
keysym_name);
return (buffer);
}
/* Returns the string equivalent of an atom or "None"*/
static char *AtomName(Display *dpy, Atom atom)
{
static char*
AtomName(Display* dpy, Atom atom) {
static char buffer[256];
char *atom_name;
char* atom_name;
if (atom == None)
return ("None");
if (atom == None) return ("None");
atom_name = XGetAtomName(dpy, atom);
strncpy(buffer, atom_name, 256);
@ -407,8 +347,8 @@ static char *AtomName(Display *dpy, Atom atom)
/**** Routines to print out readable values for the field of various events ***/
/******************************************************************************/
static void VerbMotion(XMotionEvent *ev)
{
static void
VerbMotion(XMotionEvent* ev) {
printf("window=0x%x%s", (unsigned)ev->window, sep);
printf("root=0x%x%s", (unsigned)ev->root, sep);
printf("subwindow=0x%x%s", (unsigned)ev->subwindow, sep);
@ -420,8 +360,8 @@ static void VerbMotion(XMotionEvent *ev)
printf("same_screen=%s\n", TorF(ev->same_screen));
}
static void VerbButton(XButtonEvent *ev)
{
static void
VerbButton(XButtonEvent* ev) {
printf("window=0x%x%s", (unsigned)ev->window, sep);
printf("root=0x%x%s", (unsigned)ev->root, sep);
printf("subwindow=0x%x%s", (unsigned)ev->subwindow, sep);
@ -433,16 +373,16 @@ static void VerbButton(XButtonEvent *ev)
printf("same_screen=%s\n", TorF(ev->same_screen));
}
static void VerbColormap(XColormapEvent *ev)
{
static void
VerbColormap(XColormapEvent* ev) {
printf("window=0x%x%s", (unsigned)ev->window, sep);
printf("colormap=%s%s", MaybeNone(ev->colormap), sep);
printf("new=%s%s", TorF(ev->new), sep);
printf("state=%s\n", ColormapState(ev->state));
}
static void VerbCrossing(XCrossingEvent *ev)
{
static void
VerbCrossing(XCrossingEvent* ev) {
printf("window=0x%x%s", (unsigned)ev->window, sep);
printf("root=0x%x%s", (unsigned)ev->root, sep);
printf("subwindow=0x%x%s", (unsigned)ev->subwindow, sep);
@ -456,16 +396,16 @@ static void VerbCrossing(XCrossingEvent *ev)
printf("state=%s\n", ButtonAndOrModifierState(ev->state));
}
static void VerbExpose(XExposeEvent *ev)
{
static void
VerbExpose(XExposeEvent* ev) {
printf("window=0x%x%s", (unsigned)ev->window, sep);
printf("x=%d y=%d%s", ev->x, ev->y, sep);
printf("width=%d height=%d%s", ev->width, ev->height, sep);
printf("count=%d\n", ev->count);
}
static void VerbGraphicsExpose(XGraphicsExposeEvent *ev)
{
static void
VerbGraphicsExpose(XGraphicsExposeEvent* ev) {
printf("drawable=0x%x%s", (unsigned)ev->drawable, sep);
printf("x=%d y=%d%s", ev->x, ev->y, sep);
printf("width=%d height=%d%s", ev->width, ev->height, sep);
@ -473,33 +413,32 @@ static void VerbGraphicsExpose(XGraphicsExposeEvent *ev)
printf("minor_code=%d\n", ev->minor_code);
}
static void VerbNoExpose(XNoExposeEvent *ev)
{
static void
VerbNoExpose(XNoExposeEvent* ev) {
printf("drawable=0x%x%s", (unsigned)ev->drawable, sep);
printf("major_code=%s%s", MajorCode(ev->major_code), sep);
printf("minor_code=%d\n", ev->minor_code);
}
static void VerbFocus(XFocusChangeEvent *ev)
{
static void
VerbFocus(XFocusChangeEvent* ev) {
printf("window=0x%x%s", (unsigned)ev->window, sep);
printf("mode=%s%s", GrabMode(ev->mode), sep);
printf("detail=%s\n", FocusChangeDetail(ev->detail));
}
static void VerbKeymap(XKeymapEvent *ev)
{
static void
VerbKeymap(XKeymapEvent* ev) {
int i;
printf("window=0x%x%s", (unsigned)ev->window, sep);
printf("key_vector=");
for (i = 0; i < 32; i++)
printf("%02x", ev->key_vector[i]);
for (i = 0; i < 32; i++) printf("%02x", ev->key_vector[i]);
printf("\n");
}
static void VerbKey(XKeyEvent *ev)
{
static void
VerbKey(XKeyEvent* ev) {
printf("window=0x%x%s", (unsigned)ev->window, sep);
printf("root=0x%x%s", (unsigned)ev->root, sep);
printf("subwindow=0x%x%s", (unsigned)ev->subwindow, sep);
@ -511,29 +450,29 @@ static void VerbKey(XKeyEvent *ev)
printf("same_screen=%s\n", TorF(ev->same_screen));
}
static void VerbProperty(XPropertyEvent *ev)
{
static void
VerbProperty(XPropertyEvent* ev) {
printf("window=0x%x%s", (unsigned)ev->window, sep);
printf("atom=%s%s", AtomName(ev->display, ev->atom), sep);
printf("time=%s%s", ServerTime(ev->time), sep);
printf("state=%s\n", PropertyState(ev->state));
}
static void VerbResizeRequest(XResizeRequestEvent *ev)
{
static void
VerbResizeRequest(XResizeRequestEvent* ev) {
printf("window=0x%x%s", (unsigned)ev->window, sep);
printf("width=%d height=%d\n", ev->width, ev->height);
}
static void VerbCirculate(XCirculateEvent *ev)
{
static void
VerbCirculate(XCirculateEvent* ev) {
printf("event=0x%x%s", (unsigned)ev->event, sep);
printf("window=0x%x%s", (unsigned)ev->window, sep);
printf("place=%s\n", Place(ev->place));
}
static void VerbConfigure(XConfigureEvent *ev)
{
static void
VerbConfigure(XConfigureEvent* ev) {
printf("event=0x%x%s", (unsigned)ev->event, sep);
printf("window=0x%x%s", (unsigned)ev->window, sep);
printf("x=%d y=%d%s", ev->x, ev->y, sep);
@ -543,8 +482,8 @@ static void VerbConfigure(XConfigureEvent *ev)
printf("override_redirect=%s\n", TorF(ev->override_redirect));
}
static void VerbCreateWindow(XCreateWindowEvent *ev)
{
static void
VerbCreateWindow(XCreateWindowEvent* ev) {
printf("parent=0x%x%s", (unsigned)ev->parent, sep);
printf("window=0x%x%s", (unsigned)ev->window, sep);
printf("x=%d y=%d%s", ev->x, ev->y, sep);
@ -553,28 +492,28 @@ static void VerbCreateWindow(XCreateWindowEvent *ev)
printf("override_redirect=%s\n", TorF(ev->override_redirect));
}
static void VerbDestroyWindow(XDestroyWindowEvent *ev)
{
static void
VerbDestroyWindow(XDestroyWindowEvent* ev) {
printf("event=0x%x%s", (unsigned)ev->event, sep);
printf("window=0x%x\n", (unsigned)ev->window);
}
static void VerbGravity(XGravityEvent *ev)
{
static void
VerbGravity(XGravityEvent* ev) {
printf("event=0x%x%s", (unsigned)ev->event, sep);
printf("window=0x%x%s", (unsigned)ev->window, sep);
printf("x=%d y=%d\n", ev->x, ev->y);
}
static void VerbMap(XMapEvent *ev)
{
static void
VerbMap(XMapEvent* ev) {
printf("event=0x%x%s", (unsigned)ev->event, sep);
printf("window=0x%x%s", (unsigned)ev->window, sep);
printf("override_redirect=%s\n", TorF(ev->override_redirect));
}
static void VerbReparent(XReparentEvent *ev)
{
static void
VerbReparent(XReparentEvent* ev) {
printf("event=0x%x%s", (unsigned)ev->event, sep);
printf("window=0x%x%s", (unsigned)ev->window, sep);
printf("parent=0x%x%s", (unsigned)ev->parent, sep);
@ -582,22 +521,22 @@ static void VerbReparent(XReparentEvent *ev)
printf("override_redirect=%s\n", TorF(ev->override_redirect));
}
static void VerbUnmap(XUnmapEvent *ev)
{
static void
VerbUnmap(XUnmapEvent* ev) {
printf("event=0x%x%s", (unsigned)ev->event, sep);
printf("window=0x%x%s", (unsigned)ev->window, sep);
printf("from_configure=%s\n", TorF(ev->from_configure));
}
static void VerbCirculateRequest(XCirculateRequestEvent *ev)
{
static void
VerbCirculateRequest(XCirculateRequestEvent* ev) {
printf("parent=0x%x%s", (unsigned)ev->parent, sep);
printf("window=0x%x%s", (unsigned)ev->window, sep);
printf("place=%s\n", Place(ev->place));
}
static void VerbConfigureRequest(XConfigureRequestEvent *ev)
{
static void
VerbConfigureRequest(XConfigureRequestEvent* ev) {
printf("parent=0x%x%s", (unsigned)ev->parent, sep);
printf("window=0x%x%s", (unsigned)ev->window, sep);
printf("x=%d y=%d%s", ev->x, ev->y, sep);
@ -608,42 +547,41 @@ static void VerbConfigureRequest(XConfigureRequestEvent *ev)
printf("value_mask=%s\n", ConfigureValueMask(ev->value_mask));
}
static void VerbMapRequest(XMapRequestEvent *ev)
{
static void
VerbMapRequest(XMapRequestEvent* ev) {
printf("parent=0x%x%s", (unsigned)ev->parent, sep);
printf("window=0x%x\n", (unsigned)ev->window);
}
static void VerbClient(XClientMessageEvent *ev)
{
static void
VerbClient(XClientMessageEvent* ev) {
int i;
printf("window=0x%x%s", (unsigned)ev->window, sep);
printf("message_type=%s%s", AtomName(ev->display, ev->message_type), sep);
printf("format=%d\n", ev->format);
printf("data (shown as longs)=");
for (i = 0; i < 5; i++)
printf(" 0x%08lx", ev->data.l[i]);
for (i = 0; i < 5; i++) printf(" 0x%08lx", ev->data.l[i]);
printf("\n");
}
static void VerbMapping(XMappingEvent *ev)
{
static void
VerbMapping(XMappingEvent* ev) {
printf("window=0x%x%s", (unsigned)ev->window, sep);
printf("request=%s%s", MappingRequest(ev->request), sep);
printf("first_keycode=0x%x%s", ev->first_keycode, sep);
printf("count=0x%x\n", ev->count);
}
static void VerbSelectionClear(XSelectionClearEvent *ev)
{
static void
VerbSelectionClear(XSelectionClearEvent* ev) {
printf("window=0x%x%s", (unsigned)ev->window, sep);
printf("selection=%s%s", AtomName(ev->display, ev->selection), sep);
printf("time=%s\n", ServerTime(ev->time));
}
static void VerbSelection(XSelectionEvent *ev)
{
static void
VerbSelection(XSelectionEvent* ev) {
printf("requestor=0x%x%s", (unsigned)ev->requestor, sep);
printf("selection=%s%s", AtomName(ev->display, ev->selection), sep);
printf("target=%s%s", AtomName(ev->display, ev->target), sep);
@ -651,8 +589,8 @@ static void VerbSelection(XSelectionEvent *ev)
printf("time=%s\n", ServerTime(ev->time));
}
static void VerbSelectionRequest(XSelectionRequestEvent *ev)
{
static void
VerbSelectionRequest(XSelectionRequestEvent* ev) {
printf("owner=0x%x%s", (unsigned)ev->owner, sep);
printf("requestor=0x%x%s", (unsigned)ev->requestor, sep);
printf("selection=%s%s", AtomName(ev->display, ev->selection), sep);
@ -661,8 +599,8 @@ static void VerbSelectionRequest(XSelectionRequestEvent *ev)
printf("time=%s\n", ServerTime(ev->time));
}
static void VerbVisibility(XVisibilityEvent *ev)
{
static void
VerbVisibility(XVisibilityEvent* ev) {
printf("window=0x%x%s", (unsigned)ev->window, sep);
printf("state=%s\n", VisibilityState(ev->state));
}
@ -671,76 +609,42 @@ static void VerbVisibility(XVisibilityEvent *ev)
/************ Return the string representation for type of an event ***********/
/******************************************************************************/
char *GetType(ev)
XEvent *ev;
char* GetType(ev) XEvent* ev;
{
switch (ev->type) {
case KeyPress:
return ("KeyPress");
case KeyRelease:
return ("KeyRelease");
case ButtonPress:
return ("ButtonPress");
case ButtonRelease:
return ("ButtonRelease");
case MotionNotify:
return ("MotionNotify");
case EnterNotify:
return ("EnterNotify");
case LeaveNotify:
return ("LeaveNotify");
case FocusIn:
return ("FocusIn");
case FocusOut:
return ("FocusOut");
case KeymapNotify:
return ("KeymapNotify");
case Expose:
return ("Expose");
case GraphicsExpose:
return ("GraphicsExpose");
case NoExpose:
return ("NoExpose");
case VisibilityNotify:
return ("VisibilityNotify");
case CreateNotify:
return ("CreateNotify");
case DestroyNotify:
return ("DestroyNotify");
case UnmapNotify:
return ("UnmapNotify");
case MapNotify:
return ("MapNotify");
case MapRequest:
return ("MapRequest");
case ReparentNotify:
return ("ReparentNotify");
case ConfigureNotify:
return ("ConfigureNotify");
case ConfigureRequest:
return ("ConfigureRequest");
case GravityNotify:
return ("GravityNotify");
case ResizeRequest:
return ("ResizeRequest");
case CirculateNotify:
return ("CirculateNotify");
case CirculateRequest:
return ("CirculateRequest");
case PropertyNotify:
return ("PropertyNotify");
case SelectionClear:
return ("SelectionClear");
case SelectionRequest:
return ("SelectionRequest");
case SelectionNotify:
return ("SelectionNotify");
case ColormapNotify:
return ("ColormapNotify");
case ClientMessage:
return ("ClientMessage");
case MappingNotify:
return ("MappingNotify");
case KeyPress: return ("KeyPress");
case KeyRelease: return ("KeyRelease");
case ButtonPress: return ("ButtonPress");
case ButtonRelease: return ("ButtonRelease");
case MotionNotify: return ("MotionNotify");
case EnterNotify: return ("EnterNotify");
case LeaveNotify: return ("LeaveNotify");
case FocusIn: return ("FocusIn");
case FocusOut: return ("FocusOut");
case KeymapNotify: return ("KeymapNotify");
case Expose: return ("Expose");
case GraphicsExpose: return ("GraphicsExpose");
case NoExpose: return ("NoExpose");
case VisibilityNotify: return ("VisibilityNotify");
case CreateNotify: return ("CreateNotify");
case DestroyNotify: return ("DestroyNotify");
case UnmapNotify: return ("UnmapNotify");
case MapNotify: return ("MapNotify");
case MapRequest: return ("MapRequest");
case ReparentNotify: return ("ReparentNotify");
case ConfigureNotify: return ("ConfigureNotify");
case ConfigureRequest: return ("ConfigureRequest");
case GravityNotify: return ("GravityNotify");
case ResizeRequest: return ("ResizeRequest");
case CirculateNotify: return ("CirculateNotify");
case CirculateRequest: return ("CirculateRequest");
case PropertyNotify: return ("PropertyNotify");
case SelectionClear: return ("SelectionClear");
case SelectionRequest: return ("SelectionRequest");
case SelectionNotify: return ("SelectionNotify");
case ColormapNotify: return ("ColormapNotify");
case ClientMessage: return ("ClientMessage");
case MappingNotify: return ("MappingNotify");
}
return "???";
}
@ -749,9 +653,9 @@ XEvent *ev;
/**************** Print the values of all fields for any event ****************/
/******************************************************************************/
void ShowEvent(XEvent *eev)
{
XAnyEvent *ev = (XAnyEvent*)eev;
void
ShowEvent(XEvent* eev) {
XAnyEvent* ev = (XAnyEvent*)eev;
/* determine which field separator to use */
if (use_separate_lines)
sep = "\n";
@ -764,125 +668,66 @@ void ShowEvent(XEvent *eev)
printf("display=0x%p%s", ev->display, sep);
switch (ev->type) {
case MotionNotify:
VerbMotion((void*)ev);
break;
case MotionNotify: VerbMotion((void*)ev); break;
case ButtonPress:
case ButtonRelease:
VerbButton((void*)ev);
break;
case ButtonRelease: VerbButton((void*)ev); break;
case ColormapNotify:
VerbColormap((void*)ev);
break;
case ColormapNotify: VerbColormap((void*)ev); break;
case EnterNotify:
case LeaveNotify:
VerbCrossing((void*)ev);
break;
case LeaveNotify: VerbCrossing((void*)ev); break;
case Expose:
VerbExpose((void*)ev);
break;
case Expose: VerbExpose((void*)ev); break;
case GraphicsExpose:
VerbGraphicsExpose((void*)ev);
break;
case GraphicsExpose: VerbGraphicsExpose((void*)ev); break;
case NoExpose:
VerbNoExpose((void*)ev);
break;
case NoExpose: VerbNoExpose((void*)ev); break;
case FocusIn:
case FocusOut:
VerbFocus((void*)ev);
break;
case FocusOut: VerbFocus((void*)ev); break;
case KeymapNotify:
VerbKeymap((void*)ev);
break;
case KeymapNotify: VerbKeymap((void*)ev); break;
case KeyPress:
case KeyRelease:
VerbKey((void*)ev);
break;
case KeyRelease: VerbKey((void*)ev); break;
case PropertyNotify:
VerbProperty((void*)ev);
break;
case PropertyNotify: VerbProperty((void*)ev); break;
case ResizeRequest:
VerbResizeRequest((void*)ev);
break;
case ResizeRequest: VerbResizeRequest((void*)ev); break;
case CirculateNotify:
VerbCirculate((void*)ev);
break;
case CirculateNotify: VerbCirculate((void*)ev); break;
case ConfigureNotify:
VerbConfigure((void*)ev);
break;
case ConfigureNotify: VerbConfigure((void*)ev); break;
case CreateNotify:
VerbCreateWindow((void*)ev);
break;
case CreateNotify: VerbCreateWindow((void*)ev); break;
case DestroyNotify:
VerbDestroyWindow((void*)ev);
break;
case DestroyNotify: VerbDestroyWindow((void*)ev); break;
case GravityNotify:
VerbGravity((void*)ev);
break;
case GravityNotify: VerbGravity((void*)ev); break;
case MapNotify:
VerbMap((void*)ev);
break;
case MapNotify: VerbMap((void*)ev); break;
case ReparentNotify:
VerbReparent((void*)ev);
break;
case ReparentNotify: VerbReparent((void*)ev); break;
case UnmapNotify:
VerbUnmap((void*)ev);
break;
case UnmapNotify: VerbUnmap((void*)ev); break;
case CirculateRequest:
VerbCirculateRequest((void*)ev);
break;
case CirculateRequest: VerbCirculateRequest((void*)ev); break;
case ConfigureRequest:
VerbConfigureRequest((void*)ev);
break;
case ConfigureRequest: VerbConfigureRequest((void*)ev); break;
case MapRequest:
VerbMapRequest((void*)ev);
break;
case MapRequest: VerbMapRequest((void*)ev); break;
case ClientMessage:
VerbClient((void*)ev);
break;
case ClientMessage: VerbClient((void*)ev); break;
case MappingNotify:
VerbMapping((void*)ev);
break;
case MappingNotify: VerbMapping((void*)ev); break;
case SelectionClear:
VerbSelectionClear((void*)ev);
break;
case SelectionClear: VerbSelectionClear((void*)ev); break;
case SelectionNotify:
VerbSelection((void*)ev);
break;
case SelectionNotify: VerbSelection((void*)ev); break;
case SelectionRequest:
VerbSelectionRequest((void*)ev);
break;
case VisibilityNotify:
VerbVisibility((void*)ev);
break;
case SelectionRequest: VerbSelectionRequest((void*)ev); break;
case VisibilityNotify: VerbVisibility((void*)ev); break;
}
}

39
showevent/sample.c Executable file → Normal file
View file

@ -5,11 +5,10 @@
* "Quick-n-Dirty", plain, vanilla, "No ups, No extras" piece of code.
*/
main(argc, argv)
int argc;
char **argv;
main(argc, argv) int argc;
char** argv;
{
Display *dpy;
Display* dpy;
int screen;
Window window;
XEvent event;
@ -21,17 +20,28 @@ char **argv;
}
screen = DefaultScreen(dpy);
window = XCreateSimpleWindow(dpy, RootWindow(dpy, screen), 100, 100,
300, 200, 2, BlackPixel(dpy, screen), WhitePixel(dpy, screen));
window = XCreateSimpleWindow(
dpy,
RootWindow(dpy, screen),
100,
100,
300,
200,
2,
BlackPixel(dpy, screen),
WhitePixel(dpy, screen));
XSelectInput(dpy, window, KeyPressMask | KeyReleaseMask | ButtonPressMask |
ButtonReleaseMask | EnterWindowMask | LeaveWindowMask |
PointerMotionMask | PointerMotionHintMask | Button1MotionMask |
Button2MotionMask | Button3MotionMask | Button4MotionMask |
Button5MotionMask | ButtonMotionMask | KeymapStateMask |
ExposureMask | VisibilityChangeMask | StructureNotifyMask |
SubstructureNotifyMask | SubstructureRedirectMask | FocusChangeMask |
PropertyChangeMask | ColormapChangeMask | OwnerGrabButtonMask);
XSelectInput(
dpy,
window,
KeyPressMask | KeyReleaseMask | ButtonPressMask | ButtonReleaseMask |
EnterWindowMask | LeaveWindowMask | PointerMotionMask |
PointerMotionHintMask | Button1MotionMask | Button2MotionMask |
Button3MotionMask | Button4MotionMask | Button5MotionMask |
ButtonMotionMask | KeymapStateMask | ExposureMask | VisibilityChangeMask |
StructureNotifyMask | SubstructureNotifyMask | SubstructureRedirectMask |
FocusChangeMask | PropertyChangeMask | ColormapChangeMask |
OwnerGrabButtonMask);
XMapWindow(dpy, window);
@ -45,4 +55,3 @@ char **argv;
printf("\n\n");
}
}

39
xevents.c Executable file → Normal file
View file

@ -9,10 +9,9 @@
#include "printevent.h"
int
main(int argc, char **argv)
{
main(int argc, char** argv) {
int screen;
Display *dpy;
Display* dpy;
Window window;
XEvent event;
@ -23,23 +22,33 @@ main(int argc, char **argv)
screen = DefaultScreen(dpy);
window = XCreateSimpleWindow(dpy, RootWindow(dpy, screen), 100, 100,
300, 200, 2, BlackPixel(dpy, screen), WhitePixel(dpy, screen));
window = XCreateSimpleWindow(
dpy,
RootWindow(dpy, screen),
100,
100,
300,
200,
2,
BlackPixel(dpy, screen),
WhitePixel(dpy, screen));
XSelectInput(dpy, window, KeyPressMask | KeyReleaseMask | ButtonPressMask |
ButtonReleaseMask | EnterWindowMask | LeaveWindowMask |
PointerMotionMask | PointerMotionHintMask | Button1MotionMask |
Button2MotionMask | Button3MotionMask | Button4MotionMask |
Button5MotionMask | ButtonMotionMask | KeymapStateMask |
ExposureMask | VisibilityChangeMask | StructureNotifyMask |
SubstructureNotifyMask | SubstructureRedirectMask | FocusChangeMask |
PropertyChangeMask | ColormapChangeMask | OwnerGrabButtonMask);
XSelectInput(
dpy,
window,
KeyPressMask | KeyReleaseMask | ButtonPressMask | ButtonReleaseMask |
EnterWindowMask | LeaveWindowMask | PointerMotionMask |
PointerMotionHintMask | Button1MotionMask | Button2MotionMask |
Button3MotionMask | Button4MotionMask | Button5MotionMask |
ButtonMotionMask | KeymapStateMask | ExposureMask | VisibilityChangeMask |
StructureNotifyMask | SubstructureNotifyMask | SubstructureRedirectMask |
FocusChangeMask | PropertyChangeMask | ColormapChangeMask |
OwnerGrabButtonMask);
XMapWindow(dpy, window);
for(;;){
for (;;) {
XNextEvent(dpy, &event);
printevent(&event);
}
}

205
xshove.c Executable file → Normal file
View file

@ -9,8 +9,7 @@
AUTOLIB(X11);
typedef struct Rectangle Rectangle;
struct Rectangle
{
struct Rectangle {
struct {
int x;
int y;
@ -20,23 +19,22 @@ struct Rectangle
#define Dy(r) ((r).max.y - (r).min.y)
typedef struct Win Win;
struct Win
{
struct Win {
Window xw;
int x;
int y;
int dx;
int dy;
char *class;
char *instance;
char *name;
char *iconname;
char* class;
char* instance;
char* name;
char* iconname;
};
Display *dpy;
Display* dpy;
Window root;
Win *w;
Win* w;
int nw;
void getinfo(void);
@ -45,102 +43,85 @@ int parsewinsize(char*, Rectangle*, int*, int*, int*);
void shove(char*, char*);
void
usage(void)
{
usage(void) {
fprint(2, "usage: xshove [window rectangle]\n");
exits("usage");
}
void
main(int argc, char **argv)
{
main(int argc, char** argv) {
int screen;
screen = 0;
ARGBEGIN{
case 's':
screen = atoi(EARGF(usage()));
break;
default:
usage();
break;
}ARGEND
ARGBEGIN {
case 's': screen = atoi(EARGF(usage())); break;
default: usage(); break;
}
ARGEND
dpy = XOpenDisplay("");
if(dpy == nil)
sysfatal("open display: %r");
if (dpy == nil) sysfatal("open display: %r");
root = RootWindow(dpy, screen);
getinfo();
if(argc == 0){
if (argc == 0) {
listwindows();
exits(0);
}
if(argc != 2)
usage();
if (argc != 2) usage();
shove(argv[0], argv[1]);
exits(0);
}
char*
getproperty(Window w, Atom a)
{
uchar *p;
getproperty(Window w, Atom a) {
uchar* p;
int fmt;
Atom type;
ulong n, dummy;
n = 100;
p = nil;
XGetWindowProperty(dpy, w, a, 0, 100L, 0,
AnyPropertyType, &type, &fmt,
&n, &dummy, &p);
if(p == nil || *p == 0)
return nil;
XGetWindowProperty(
dpy, w, a, 0, 100L, 0, AnyPropertyType, &type, &fmt, &n, &dummy, &p);
if (p == nil || *p == 0) return nil;
return strdup((char*)p);
}
Window
findname(Window w)
{
findname(Window w) {
int i;
uint nxwin;
Window dw1, dw2, *xwin;
if(getproperty(w, XA_WM_NAME))
return w;
if(!XQueryTree(dpy, w, &dw1, &dw2, &xwin, &nxwin))
return 0;
for(i=0; i<nxwin; i++)
if((w = findname(xwin[i])) != 0)
return w;
if (getproperty(w, XA_WM_NAME)) return w;
if (!XQueryTree(dpy, w, &dw1, &dw2, &xwin, &nxwin)) return 0;
for (i = 0; i < nxwin; i++)
if ((w = findname(xwin[i])) != 0) return w;
return 0;
}
void
getinfo(void)
{
getinfo(void) {
int i;
uint nxwin;
Window dw1, dw2, *xwin;
XClassHint class;
XWindowAttributes attr;
if(!XQueryTree(dpy, root, &dw1, &dw2, &xwin, &nxwin))
return;
w = mallocz(nxwin*sizeof w[0], 1);
if(w == 0)
sysfatal("malloc: %r");
if (!XQueryTree(dpy, root, &dw1, &dw2, &xwin, &nxwin)) return;
w = mallocz(nxwin * sizeof w[0], 1);
if (w == 0) sysfatal("malloc: %r");
Win *ww = w;
for(i=0; i<nxwin; i++){
Win* ww = w;
for (i = 0; i < nxwin; i++) {
memset(&attr, 0, sizeof attr);
xwin[i] = findname(xwin[i]);
if(xwin[i] == 0)
continue;
if (xwin[i] == 0) continue;
XGetWindowAttributes(dpy, xwin[i], &attr);
if(attr.width <= 0 || attr.override_redirect || attr.map_state != IsViewable)
if (
attr.width <= 0 || attr.override_redirect || attr.map_state != IsViewable)
continue;
ww->xw = xwin[i];
ww->x = attr.x;
@ -148,7 +129,7 @@ getinfo(void)
ww->dx = attr.width;
ww->dy = attr.height;
XTranslateCoordinates(dpy, ww->xw, root, 0, 0, &ww->x, &ww->y, &dw1);
if(XGetClassHint(dpy, ww->xw, &class)){
if (XGetClassHint(dpy, ww->xw, &class)) {
ww->class = strdup(class.res_class);
ww->instance = strdup(class.res_name);
}
@ -160,58 +141,60 @@ getinfo(void)
}
void
listwindows(void)
{
listwindows(void) {
int i;
for(i=0; i<nw; i++){
Win *ww = &w[i];
for (i = 0; i < nw; i++) {
Win* ww = &w[i];
char rect[50];
snprint(rect, sizeof rect, "%d,%d,%d,%d", ww->x, ww->y, ww->x+ww->dx, ww->y+ww->dy);
print("%08x %-20s %-10s %s\n",
(uint)ww->xw,
snprint(
rect,
ww->instance,
ww->class);
sizeof rect,
"%d,%d,%d,%d",
ww->x,
ww->y,
ww->x + ww->dx,
ww->y + ww->dy);
print("%08x %-20s %-10s %s\n", (uint)ww->xw, rect, ww->instance, ww->class);
}
}
void
shove(char *name, char *geom)
{
shove(char* name, char* geom) {
int i;
int isdelta, havemin, havesize;
int old, new;
Rectangle r;
if(parsewinsize(geom, &r, &isdelta, &havemin, &havesize) < 0)
if (parsewinsize(geom, &r, &isdelta, &havemin, &havesize) < 0)
sysfatal("bad window spec: %s", name);
old = 0;
new = 1;
if(isdelta){
if (isdelta) {
old = 1;
new = isdelta;
}
for(i=0; i<nw; i++){
Win *ww = &w[i];
if(ww->instance && strstr(ww->instance, name)
|| ww->class && strstr(ww->class, name)){
for (i = 0; i < nw; i++) {
Win* ww = &w[i];
if (
ww->instance && strstr(ww->instance, name) ||
ww->class && strstr(ww->class, name)) {
int value_mask;
XWindowChanges e;
memset(&e, 0, sizeof e);
if(havemin){
e.x = old*ww->x + new*r.min.x;
e.y = old*ww->y + new*r.min.y;
}else{
if (havemin) {
e.x = old * ww->x + new* r.min.x;
e.y = old * ww->y + new* r.min.y;
} else {
e.x = ww->x;
e.y = ww->y;
}
if(havesize){
e.width = old*ww->dx + new*Dx(r);
e.height = old*ww->dy + new*Dy(r);
}else{
if (havesize) {
e.width = old * ww->dx + new* Dx(r);
e.height = old * ww->dy + new* Dy(r);
} else {
e.width = ww->dx;
e.height = ww->dy;
}
@ -223,51 +206,42 @@ shove(char *name, char *geom)
}
int
parsewinsize(char *s, Rectangle *r, int *isdelta, int *havemin, int *havesize)
{
parsewinsize(char* s, Rectangle* r, int* isdelta, int* havemin, int* havesize) {
char c, *os;
int i, j, k, l;
os = s;
if(*s == '-'){
if (*s == '-') {
s++;
*isdelta = -1;
}else if(*s == '+'){
} else if (*s == '+') {
s++;
*isdelta = 1;
}else
} else
*isdelta = 0;
*havemin = 0;
*havesize = 0;
memset(r, 0, sizeof *r);
if(!isdigit((uchar)*s))
goto oops;
if (!isdigit((uchar)*s)) goto oops;
i = strtol(s, &s, 0);
if(*s == 'x'){
if (*s == 'x') {
s++;
if(!isdigit((uchar)*s))
goto oops;
if (!isdigit((uchar)*s)) goto oops;
j = strtol(s, &s, 0);
r->max.x = i;
r->max.y = j;
*havesize = 1;
if(*s == 0)
return 0;
if(*s != '@')
goto oops;
if (*s == 0) return 0;
if (*s != '@') goto oops;
s++;
if(!isdigit((uchar)*s))
goto oops;
if (!isdigit((uchar)*s)) goto oops;
i = strtol(s, &s, 0);
if(*s != ',' && *s != ' ')
goto oops;
if (*s != ',' && *s != ' ') goto oops;
s++;
if(!isdigit((uchar)*s))
goto oops;
if (!isdigit((uchar)*s)) goto oops;
j = strtol(s, &s, 0);
if(*s != 0)
goto oops;
if (*s != 0) goto oops;
r->min.x += i;
r->max.x += i;
r->min.y += j;
@ -278,32 +252,25 @@ parsewinsize(char *s, Rectangle *r, int *isdelta, int *havemin, int *havesize)
}
c = *s;
if(c != ' ' && c != ',')
goto oops;
if (c != ' ' && c != ',') goto oops;
s++;
if(!isdigit((uchar)*s))
goto oops;
if (!isdigit((uchar)*s)) goto oops;
j = strtol(s, &s, 0);
if(*s == 0){
if (*s == 0) {
r->min.x = i;
r->min.y = j;
*havemin = 1;
return 0;
}
if(*s != c)
goto oops;
if (*s != c) goto oops;
s++;
if(!isdigit((uchar)*s))
goto oops;
if (!isdigit((uchar)*s)) goto oops;
k = strtol(s, &s, 0);
if(*s != c)
goto oops;
if (*s != c) goto oops;
s++;
if(!isdigit((uchar)*s))
goto oops;
if (!isdigit((uchar)*s)) goto oops;
l = strtol(s, &s, 0);
if(*s != 0)
goto oops;
if (*s != 0) goto oops;
r->min.x = i;
r->min.y = j;
r->max.x = k;