Merge pull request #11 from erikarn/main

[amiwm] lots of little fixes to amiwm over the last 6 months
This commit is contained in:
Adrian Chadd
2023-06-12 19:16:44 -07:00
committed by GitHub
15 changed files with 63 additions and 20 deletions

1
.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
*.o

View File

@@ -75,11 +75,11 @@ Currently the following are defined:
rotatescreens - Move the frontmost screen to the back rotatescreens - Move the frontmost screen to the back
raisewindow - Rotate the bottom window to the top of the screen raisewindow - Rotate the bottom window to the top of the screen
lowerwindow - Rotate the top window to the bottom of the screen lowerwindow - Rotate the top window to the bottom of the screen
rotatewindow - Move the current window to the next screen, rotate screen
front - Move the window in which the key is pressed to the front front - Move the window in which the key is pressed to the front
back - Move the window in which the key is pressed to the back back - Move the window in which the key is pressed to the back
iconify - Iconify the window in which the key is pressed iconify - Iconify the window in which the key is pressed
#### Example #### Example
Module "Keyboard" "\ Module "Keyboard" "\

View File

@@ -66,7 +66,7 @@ lib_clean:
menu.o: menu.c menu.o: menu.c
$(CC) -c $(CPPFLAGS) $(ALL_CFLAGS) -DAMIWM_HOME=\"$(AMIWM_HOME)\" $< $(CC) -c $(CPPFLAGS) $(ALL_CFLAGS) -DAMIWM_HOME=\"$(AMIWM_HOME)\" $<
rc.o: rc.c rc.o: rc.c gram.h
$(CC) -c $(CPPFLAGS) $(ALL_CFLAGS) -DAMIWM_HOME=\"$(AMIWM_HOME)\" $< $(CC) -c $(CPPFLAGS) $(ALL_CFLAGS) -DAMIWM_HOME=\"$(AMIWM_HOME)\" $<
diskobject.o: diskobject.c diskobject.o: diskobject.c

View File

@@ -379,3 +379,18 @@ void flushclients()
rmclient(c); rmclient(c);
} }
} }
/*
* Reparent the given client to the given screen.
*
* This moves the given client to the given screen.
*/
void
reparent_client(Scrn *s, Client *client)
{
client->scr = s;
if(client->parent != client->scr->root)
XReparentWindow(dpy, client->parent, s->back, client->x, client->y);
setstringprop(client->window, amiwm_screen, s->deftitle);
sendconfig(client);
}

View File

@@ -51,5 +51,7 @@ extern void getstate(Client *);
extern void grav_map_frame_to_win(Client *, int, int, int *, int *); extern void grav_map_frame_to_win(Client *, int, int, int *, int *);
extern void grav_map_win_to_frame(Client *, int, int, int *, int *); extern void grav_map_win_to_frame(Client *, int, int, int *, int *);
extern void setclientstate(Client *, int); extern void setclientstate(Client *, int);
extern void reparent_client(struct _Scrn *s, Client *client);
#endif #endif

View File

@@ -28,7 +28,7 @@ extern Display *dpy;
extern XContext client_context, screen_context; extern XContext client_context, screen_context;
extern Cursor wm_curs; extern Cursor wm_curs;
extern int shape_extn; extern int shape_extn;
extern void redrawmenubar(Window); extern void redrawmenubar(Scrn *, Window);
void reshape_frame(Client *c); void reshape_frame(Client *c);
Window creategadget(Client *c, Window p, int x, int y, int w, int h) Window creategadget(Client *c, Window p, int x, int y, int w, int h)
@@ -510,7 +510,7 @@ void clickenter()
{ {
if((scr=mbdscr)&& clickwindow == scr->menubardepth) { if((scr=mbdscr)&& clickwindow == scr->menubardepth) {
mbdclick = scr; mbdclick = scr;
redrawmenubar(scr->menubardepth); redrawmenubar(scr, scr->menubardepth);
} else { } else {
scr = clickclient->scr; scr = clickclient->scr;
redraw(clickclient, clickclient->clicked=clickwindow); redraw(clickclient, clickclient->clicked=clickwindow);
@@ -521,7 +521,7 @@ void clickleave()
{ {
if((scr=mbdscr)&& clickwindow == scr->menubardepth) { if((scr=mbdscr)&& clickwindow == scr->menubardepth) {
mbdclick = NULL; mbdclick = NULL;
redrawmenubar(scr->menubardepth); redrawmenubar(scr, scr->menubardepth);
} else { } else {
scr = clickclient->scr; scr = clickclient->scr;
clickclient->clicked=None; clickclient->clicked=None;

7
icon.c
View File

@@ -156,12 +156,7 @@ void reparenticon(Icon *i, Scrn *s, int x, int y)
i->next=s->icons; i->next=s->icons;
s->icons=i; s->icons=i;
if(i->client) { if(i->client) {
i->client->scr=s; reparent_client(s, i->client);
if(i->client->parent != i->client->scr->root)
XReparentWindow(dpy, i->client->parent, s->back,
i->client->x, i->client->y);
setstringprop(i->client->window, amiwm_screen, s->deftitle);
sendconfig(i->client);
} }
if(os) if(os)
selecticon(i); selecticon(i);

View File

@@ -44,6 +44,7 @@ int parse_keyword(char *str, YYSTYPE *val)
{ "lowerwindow", (mdfuncp)md_rotate_window_lower }, { "lowerwindow", (mdfuncp)md_rotate_window_lower },
{ "raisewindow", (mdfuncp)md_rotate_window_raise }, { "raisewindow", (mdfuncp)md_rotate_window_raise },
{ "rotatescreens", (mdfuncp)k_rotscreens }, { "rotatescreens", (mdfuncp)k_rotscreens },
{ "rotatewindow", (mdfuncp)md_rotate_window_desktop },
}; };
#define N_FUNC (sizeof(functab)/sizeof(functab[0])) #define N_FUNC (sizeof(functab)/sizeof(functab[0]))
struct { char *name; int token, num; } kwtab[] = { struct { char *name; int token, num; } kwtab[] = {

View File

@@ -370,6 +370,7 @@ extern int md_iconify(Window);
extern int md_errormsg(Window, char *); extern int md_errormsg(Window, char *);
extern int md_rotate_window_raise(Window); extern int md_rotate_window_raise(Window);
extern int md_rotate_window_lower(Window); extern int md_rotate_window_lower(Window);
extern int md_rotate_window_desktop(Window);
/* eventdispatcher.c */ /* eventdispatcher.c */
extern void cx_event_broker(int, unsigned long, int (*)(XEvent*)); extern void cx_event_broker(int, unsigned long, int (*)(XEvent*));

View File

@@ -32,6 +32,11 @@ int md_rotate_window_lower(XID id)
return md_command00(id, MCMD_ROTATE_WINDOW_LOWER); return md_command00(id, MCMD_ROTATE_WINDOW_LOWER);
} }
int md_rotate_window_desktop(XID id)
{
return md_command00(id, MCMD_WINDOW_MOVE_NEXT_DESKTOP);
}
int md_errormsg(Window id, char *str) int md_errormsg(Window id, char *str)
{ {
return md_command0(id, MCMD_ERRORMSG, str, strlen(str)); return md_command0(id, MCMD_ERRORMSG, str, strlen(str));

View File

@@ -81,6 +81,13 @@ md_wait_read_fd(void)
return (0); return (0);
} }
if (ret < 0) { if (ret < 0) {
/*
* Note: this happens during things like system suspend/resume
* on FreeBSD.
*/
if (errno == EINTR) {
return (0);
}
return (-1); return (-1);
} }
if (FD_ISSET(md_in_fd, &readfds)) { if (FD_ISSET(md_in_fd, &readfds)) {

16
main.c
View File

@@ -88,7 +88,7 @@ extern Scrn *mbdclick, *mbdscr;
extern void reparent(Client *); extern void reparent(Client *);
extern void redraw(Client *, Window); extern void redraw(Client *, Window);
extern void redrawclient(Client *); extern void redrawclient(Client *);
extern void redrawmenubar(Window); extern void redrawmenubar(Scrn *, Window);
extern void gadgetclicked(Client *c, Window w, XEvent *e); extern void gadgetclicked(Client *c, Window w, XEvent *e);
extern void gadgetunclicked(Client *c, XEvent *e); extern void gadgetunclicked(Client *c, XEvent *e);
extern void gadgetaborted(Client *c); extern void gadgetaborted(Client *c);
@@ -283,7 +283,7 @@ void restorescreentitle(Scrn *s)
{ {
(scr=s)->title=s->deftitle; (scr=s)->title=s->deftitle;
XClearWindow(dpy, s->menubar); XClearWindow(dpy, s->menubar);
redrawmenubar(s->menubar); redrawmenubar(s, s->menubar);
if(free_screentitle) { if(free_screentitle) {
free(free_screentitle); free(free_screentitle);
free_screentitle=NULL; free_screentitle=NULL;
@@ -295,7 +295,7 @@ void wberror(Scrn *s, char *message)
remove_call_out((void(*)(void *))restorescreentitle, s); remove_call_out((void(*)(void *))restorescreentitle, s);
(scr=s)->title=message; (scr=s)->title=message;
XClearWindow(dpy, s->menubar); XClearWindow(dpy, s->menubar);
redrawmenubar(s->menubar); redrawmenubar(s, s->menubar);
XBell(dpy, 100); XBell(dpy, 100);
call_out(2, 0, (void(*)(void *))restorescreentitle, s); call_out(2, 0, (void(*)(void *))restorescreentitle, s);
} }
@@ -828,7 +828,7 @@ static void update_clock(void *dontcare)
scr = get_front_scr(); scr = get_front_scr();
do { do {
redrawmenubar(scr->menubar); redrawmenubar(scr, scr->menubar);
scr=scr->behind; scr=scr->behind;
} while(scr != get_front_scr()); } while(scr != get_front_scr());
} }
@@ -1001,7 +1001,7 @@ int main(int argc, char *argv[])
else if(i) else if(i)
redrawicon(i, event.xexpose.window); redrawicon(i, event.xexpose.window);
else if(scr) else if(scr)
redrawmenubar(event.xexpose.window); redrawmenubar(scr, event.xexpose.window);
if((rubberclient || boundingscr)&&!prefs.opaquemove) drawrubber(); if((rubberclient || boundingscr)&&!prefs.opaquemove) drawrubber();
} }
break; break;
@@ -1337,7 +1337,7 @@ int main(int argc, char *argv[])
} else if(scr&&event.xbutton.window==scr->menubardepth) { } else if(scr&&event.xbutton.window==scr->menubardepth) {
clickwindow=scr->menubardepth; clickwindow=scr->menubardepth;
mbdclick=mbdscr=scr; mbdclick=mbdscr=scr;
redrawmenubar(scr->menubardepth); redrawmenubar(scr, scr->menubardepth);
} else if(scr&&event.xbutton.window==scr->menubar && } else if(scr&&event.xbutton.window==scr->menubar &&
scr->back!=scr->root) { scr->back!=scr->root) {
startscreendragging(scr, &event); startscreendragging(scr, &event);
@@ -1352,7 +1352,7 @@ int main(int argc, char *argv[])
else if(scr&&(scr==mbdscr)&&clickwindow==scr->menubardepth) { else if(scr&&(scr==mbdscr)&&clickwindow==scr->menubardepth) {
mbdclick=NULL; mbdclick=NULL;
clickwindow=None; clickwindow=None;
redrawmenubar(scr->menubardepth); redrawmenubar(scr, scr->menubardepth);
} else if(clickclient) } else if(clickclient)
gadgetaborted(clickclient); gadgetaborted(clickclient);
else if(dragiconlist) else if(dragiconlist)
@@ -1386,7 +1386,7 @@ int main(int argc, char *argv[])
else if((scr=mbdscr)&& clickwindow==scr->menubardepth) { else if((scr=mbdscr)&& clickwindow==scr->menubardepth) {
if(mbdclick) { if(mbdclick) {
mbdclick=NULL; mbdclick=NULL;
redrawmenubar(scr->menubardepth); redrawmenubar(scr, scr->menubardepth);
screentoback(); screentoback();
} }
clickwindow=None; clickwindow=None;

2
menu.c
View File

@@ -494,7 +494,7 @@ void createmenubar()
* This takes in the target window, which may be the basic menubar, * This takes in the target window, which may be the basic menubar,
* a clicked-on menu, or the depth widget. * a clicked-on menu, or the depth widget.
*/ */
void redrawmenubar(Window w) void redrawmenubar(Scrn *scr, Window w)
{ {
static const char defaultTimeFormat[] = "%c"; static const char defaultTimeFormat[] = "%c";
int widget_rhs; int widget_rhs;

View File

@@ -45,6 +45,7 @@ extern void remove_fd_from_set(int);
extern void screentoback(); extern void screentoback();
extern void raiselowerclient(Client *, int); extern void raiselowerclient(Client *, int);
extern void wberror(Scrn *, char *); extern void wberror(Scrn *, char *);
extern void reparent(Client *);
extern Icon *createappicon(struct module *, Window, char *, extern Icon *createappicon(struct module *, Window, char *,
Pixmap, Pixmap, Pixmap, int, int); Pixmap, Pixmap, Pixmap, int, int);
@@ -525,6 +526,20 @@ static void handle_module_cmd(struct module *m, char *data, int data_len)
reply_module(m, NULL, 0); reply_module(m, NULL, 0);
break; break;
} }
case MCMD_WINDOW_MOVE_NEXT_DESKTOP:
/* Move the current window, if any, to the next desktop */
c = NULL;
if(! XFindContext(dpy, id, client_context, (XPointer*)&c)) {
/* Get the current screen */
scr=getscreen(id);
/* Rotate screen, get the now front screen */
screentoback();
scr = get_front_scr();
/* Assign this client to next screen */
reparent_client(scr, c);
}
reply_module(m, NULL, 0);
break;
break; break;
default: default:
reply_module(m, NULL, -1); reply_module(m, NULL, -1);

View File

@@ -17,6 +17,7 @@
#define MCMD_ROTATE_WINDOW_RAISE 19 #define MCMD_ROTATE_WINDOW_RAISE 19
#define MCMD_ROTATE_WINDOW_LOWER 20 #define MCMD_ROTATE_WINDOW_LOWER 20
#define MCMD_UPDATE_BATTERY 21 #define MCMD_UPDATE_BATTERY 21
#define MCMD_WINDOW_MOVE_NEXT_DESKTOP 22
struct mcmd_header { struct mcmd_header {
XID id; XID id;