diff --git a/awesome.c b/awesome.c index ea85dcdc..ff4ddf92 100644 --- a/awesome.c +++ b/awesome.c @@ -29,6 +29,7 @@ #include +#include "awesome.h" #include "client.h" #include "event.h" #include "window.h" @@ -48,6 +49,33 @@ typedef struct xcb_query_tree_cookie_t tree_cookie; } root_win_t; +/** Call before exiting. + */ +void +awesome_atexit(void) +{ + client_t *c; + xembed_window_t *em; + + a_dbus_cleanup(); + luaA_cs_cleanup(); + + /* reparent systray windows, otherwise they may die with their master */ + for(em = globalconf.embedded; em; em = em->next) + { + xcb_screen_t *s = xutil_screen_get(globalconf.connection, em->phys_screen); + xcb_reparent_window(globalconf.connection, em->win, s->root, 0, 0); + } + + /* remap all clients since some WM won't handle them otherwise */ + for(c = globalconf.clients; c; c = c->next) + client_unban(c); + + xcb_flush(globalconf.connection); + + xcb_disconnect(globalconf.connection); +} + /** Scan X to find windows to manage. */ static void @@ -199,13 +227,20 @@ exit_on_signal(EV_P_ ev_signal *w, int revents) ev_unloop(EV_A_ 1); } +void +awesome_restart(void) +{ + awesome_atexit(); + a_exec(globalconf.argv); +} + /** Function to restart aweome on some signals. * \param sig the signam received, unused */ static void restart_on_signal(EV_P_ ev_signal *w, int revents) { - ewmh_restart(); + awesome_restart(); } /** \brief awesome xerror function. @@ -280,7 +315,6 @@ main(int argc, char **argv) xcolor_init_request_t colors_reqs[2]; xcb_get_modifier_mapping_cookie_t xmapping_cookie; ssize_t cmdlen = 1; - client_t *c; static struct option long_options[] = { {"help", 0, NULL, 'h'}, @@ -486,16 +520,8 @@ main(int argc, char **argv) ev_check_stop(globalconf.loop, &xcheck); ev_ref(globalconf.loop); ev_io_stop(globalconf.loop, &xio); - a_dbus_cleanup(); - luaA_cs_cleanup(); - /* remap all clients since some WM won't handle them otherwise */ - for(c = globalconf.clients; c; c = c->next) - client_unban(c); - - xcb_flush(globalconf.connection); - - xcb_disconnect(globalconf.connection); + awesome_atexit(); return EXIT_SUCCESS; } diff --git a/awesome.h b/awesome.h new file mode 100644 index 00000000..9835aabe --- /dev/null +++ b/awesome.h @@ -0,0 +1,29 @@ +/* + * awesome.h - awesome main header + * + * Copyright © 2008 Julien Danjou + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * + */ + +#ifndef AWESOME_AWESOME_H +#define AWESOME_AWESOME_H + +void awesome_restart(void); +void awesome_atexit(void); + +#endif +// vim: filetype=c:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=80 diff --git a/event.c b/event.c index 4926903c..68871069 100644 --- a/event.c +++ b/event.c @@ -24,6 +24,7 @@ #include #include +#include "awesome.h" #include "event.h" #include "tag.h" #include "window.h" @@ -285,7 +286,7 @@ event_handle_configurenotify(void *data __attribute__ ((unused)), && (ev->width != screen->width_in_pixels || ev->height != screen->height_in_pixels)) /* it's not that we panic, but restart */ - ewmh_restart(); + awesome_restart(); return 0; } @@ -615,7 +616,7 @@ event_handle_randr_screen_change_notify(void *data __attribute__ ((unused)), * XRenderSetSubpixelOrder(dpy, snum, scevent->subpixel_order); */ - ewmh_restart(); + awesome_restart(); return 0; } diff --git a/ewmh.c b/ewmh.c index 68672de2..6a44f0ca 100644 --- a/ewmh.c +++ b/ewmh.c @@ -572,21 +572,4 @@ ewmh_window_icon_get_reply(xcb_get_property_cookie_t cookie) return icon; } -/** - * Restart awesome. - */ -void -ewmh_restart(void) -{ - client_t *c; - - for(c = globalconf.clients; c; c = c->next) - client_unban(c); - - xcb_flush(globalconf.connection); - xcb_disconnect(globalconf.connection); - - a_exec(globalconf.argv); -} - // vim: filetype=c:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=80 diff --git a/ewmh.h b/ewmh.h index c4c07af8..883c8024 100644 --- a/ewmh.h +++ b/ewmh.h @@ -46,7 +46,6 @@ void ewmh_check_client_hints(client_t *); void ewmh_update_workarea(int); xcb_get_property_cookie_t ewmh_window_icon_get_unchecked(xcb_window_t); netwm_icon_t *ewmh_window_icon_get_reply(xcb_get_property_cookie_t); -void ewmh_restart(void); #endif // vim: filetype=c:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=80 diff --git a/lua.c b/lua.c index 04257801..8fc6ab65 100644 --- a/lua.c +++ b/lua.c @@ -37,6 +37,7 @@ #include +#include "awesome.h" #include "awesome-version-internal.h" #include "ewmh.h" #include "config.h" @@ -108,14 +109,9 @@ luaA_quit(lua_State *L __attribute__ ((unused))) static int luaA_exec(lua_State *L) { - client_t *c; const char *cmd = luaL_checkstring(L, 1); - for(c = globalconf.clients; c; c = c->next) - client_unban(c); - - xcb_flush(globalconf.connection); - xcb_disconnect(globalconf.connection); + awesome_atexit(); a_exec(cmd); return 0; @@ -126,7 +122,7 @@ luaA_exec(lua_State *L) static int luaA_restart(lua_State *L __attribute__ ((unused))) { - ewmh_restart(); + awesome_restart(); return 0; }