/* * BadWM - minimalistic window manager for the X Window System * Copyright (C) Robert Annessi * * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "include/BadWM.h" #include #include #include #include #include #include #include #include #include #include #include "include/config.h" /* Now do this by fork()ing twice so we don't have to worry about SIGCHLDs */ void spawn(char *cmd, char *args) { pid_t pid; char **new_args; new_args = set_args(args); if (current_screen && current_screen->display) putenv(current_screen->display); if (!(pid = fork())) { setsid(); switch (fork()) { case 0: execvp(cmd, new_args); bad_debug(0, "Couldn't respawn new shell: %s\n", cmd); bad_debug(0, "Reason -> %s: %s\n", cmd, strerror(errno)); break; default: _exit(0); } } if (pid > 0) wait(NULL); } void handle_signal(int signo) { int i; /* SIGCHLD check no longer necessary */ /* Quit Nicely */ quitting = 1; while(head_client) remove_client(head_client); XSetInputFocus(dpy, PointerRoot, RevertToPointerRoot, CurrentTime); if (font) XFreeFont(dpy, font); for (i = 0; i < num_screens; i++) { XFreeGC(dpy, screens[i].invert_gc); XInstallColormap(dpy, DefaultColormap(dpy, screens[i].screen)); } free(screens); XCloseDisplay(dpy); exit(0); } int handle_xerror(Display *dsply, XErrorEvent *e) { Client *c = find_client(e->resourceid); /* If this error actually occurred while setting up the new * window, best let make_new_client() know not to bother */ if (initialising != None && e->resourceid == initialising) { #ifdef DEBUG bad_debug(1,"**SAVED?** handle_xerror() caught error %d while initialising\n", e->error_code); #endif initialising = None; return 0; } #ifdef DEBUG bad_debug(1,"**ERK** handle_xerror() caught an XErrorEvent: %d\n", e->error_code); #endif /* if (e->error_code == BadAccess && e->resourceid == root) { */ if (e->error_code == BadAccess && e->request_code == X_ChangeWindowAttributes) { exit(1); } #ifdef DEBUG bad_debug(1,"XError %x\n", e->error_code); #endif /* Kludge aroung IE misbehaviour */ if (e->error_code == 0x8 && e->request_code == 0x0c && e->minor_code == 0x00) { #ifdef DEBUG bad_debug(1,"IE kludge - ignoring XError\n"); #endif return 0; } if (c) { #ifdef DEBUG bad_debug(1,"calling remove_client()\n"); #endif remove_client(c); } return 0; } int ignore_xerror(Display *dsply, XErrorEvent *e) { #ifdef DEBUG bad_debug(1,"XErrorEvent: %d\n", e->error_code); #endif return 0; } int is_int(char *string) { int i; for(i=0; i < strlen(string); i++) { if(!isdigit(string[i])) { #ifdef DEBUG bad_debug(5, "%s is an invalid integer!\n", string); #endif return -1; } } return atoi(string); }