/* * 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 #include #include #include char **set_args(char *args) { char **ret; char *buf, *tmp; int argc=1; ret = malloc(sizeof(*ret) * (argc + 1)); ret[argc - 1] = strdup(config.global->term); if(args == NULL) { ret[argc] = NULL; return ret; } #ifdef DEBUG bad_debug(4, "Terminal arguments to split: %s\n", args); #endif buf = strdup(args); tmp = strtok(buf, " "); while(1) { if (!tmp) break; argc++; ret = realloc(ret, sizeof(*ret) * (argc + 1)); ret[argc - 1] = strdup(tmp); #ifdef DEBUG bad_debug(5, "New argument found for terminal: %s\n", tmp); #endif tmp = strtok(NULL, " "); } ret[argc] = NULL; return ret; } void initstr(void) { config.global = (struct ConfigGlobals *) calloc(1, sizeof(struct ConfigGlobals)); config.keys = (struct ConfigKeys *) calloc(1, sizeof(struct ConfigKeys)); config.theme = (struct ConfigTheme *) calloc(1, sizeof(struct ConfigTheme)); } void setconf(void) { /* setting defaults */ if (!config.global->debug) config.global->debug = 0; config.global->term = strdup("xterm"); config.global->term_args = NULL; config.global->max_vdesks = 10; config.global->snap_distance = 10; config.global->flip_resizelower = 0; config.global->solidwindows = 0; config.keys->next = strdup("Tab"); config.keys->term = strdup("Return"); config.keys->topleft = strdup("t"); config.keys->topright = strdup("y"); config.keys->bottomleft = strdup("g"); config.keys->bottomright = strdup("h"); config.keys->lower = strdup("Down"); config.keys->max = strdup("x"); config.keys->maxhoriz = strdup("c"); config.keys->maxvert = strdup("v"); config.keys->fix = strdup("f"); config.keys->kill = strdup("k"); config.keys->reload = strdup("r"); config.keys->vddown = strdup("Left"); config.keys->vdup = strdup("Right"); config.theme->bgcolor = strdup("gray50"); config.theme->fgcolor = strdup("goldenrod"); config.theme->fxcolor = strdup("blue"); #ifdef DEBUG bad_debug(1,"setting default global term = %s\n", config.global->term); bad_debug(1,"setting default global term_args = %s\n", config.global->term_args); bad_debug(1,"setting default global max_vdesks = %d\n", config.global->max_vdesks); bad_debug(1,"setting default global snap_distance = %d\n", config.global->snap_distance); bad_debug(1,"setting default global flip_resizelower = %d\n", config.global->flip_resizelower); bad_debug(1,"setting default global solidwindows = %d\n", config.global->solidwindows); bad_debug(1,"setting default key next = %s\n", config.keys->next); bad_debug(1,"setting default key term = %s\n", config.keys->term); bad_debug(1,"setting default key topleft = %s\n", config.keys->topleft); bad_debug(1,"setting default key topright = %s\n", config.keys->topright); bad_debug(1,"setting default key bottomleft = %s\n", config.keys->bottomleft); bad_debug(1,"setting default key bottomright = %s\n", config.keys->bottomright); bad_debug(1,"setting default key lower = %s\n", config.keys->lower); bad_debug(1,"setting default key max = %s\n", config.keys->max); bad_debug(1,"setting default key maxhoriz = %s\n", config.keys->maxhoriz); bad_debug(1,"setting default key maxvert = %s\n", config.keys->maxvert); bad_debug(1,"setting default key fix = %s\n", config.keys->fix); bad_debug(1,"setting default key kill = %s\n", config.keys->kill); bad_debug(1,"setting default key reload = %s\n", config.keys->reload); bad_debug(1,"setting default key vddown = %s\n", config.keys->vddown); bad_debug(1,"setting default key vdup = %s\n", config.keys->vdup); bad_debug(1,"setting default theme bgcolor = %s\n", config.theme->bgcolor); bad_debug(1,"setting default theme fgcolor = %s\n", config.theme->fgcolor); bad_debug(1,"setting default theme fxcolor = %s\n", config.theme->fxcolor); #endif getconf(); bad_debug(5,"using global debug = %d\n", config.global->debug); #ifdef DEBUG bad_debug(5,"using global max_vdesks = %d\n", config.global->max_vdesks); bad_debug(5,"using global term = %s\n", config.global->term); bad_debug(5,"using global snap_distance = %d\n", config.global->snap_distance); bad_debug(5,"using global flip_resizelower = %d\n", config.global->flip_resizelower); bad_debug(5,"using key next = %s\n", config.keys->next); bad_debug(5,"using key term = %s\n", config.keys->term); bad_debug(5,"using key topleft = %s\n", config.keys->topleft); bad_debug(5,"using key topright = %s\n", config.keys->topright); bad_debug(5,"using key bottomleft = %s\n", config.keys->bottomleft); bad_debug(5,"using key bottomright = %s\n", config.keys->bottomright); bad_debug(5,"using key lower = %s\n", config.keys->topright); bad_debug(5,"using key max = %s\n", config.keys->max); bad_debug(5,"using key maxhoriz = %s\n", config.keys->maxhoriz); bad_debug(5,"using key maxvert = %s\n", config.keys->maxvert); bad_debug(5,"using key fix = %s\n", config.keys->fix); bad_debug(5,"using key kill = %s\n", config.keys->kill); bad_debug(5,"using key reload = %s\n", config.keys->reload); bad_debug(5,"using theme bgcolor = %s\n", config.theme->bgcolor); bad_debug(5,"using theme fgcolor = %s\n", config.theme->fgcolor); bad_debug(5,"using theme fxcolor = %s\n", config.theme->fxcolor); #endif } void getconf(void) { FILE *fp; char buf[1024]; char *cp, *val; char config_file[1024]; enum {INVALID=0, GLOBAL, KEYS, THEME} section = 0; *buf=0; snprintf(config_file, 1024, "%s/.BadWMrc", getenv("HOME")); #ifdef DEBUG bad_debug(1,"%s\n", config_file); #endif fp = fopen(config_file, "r"); if(fp != NULL) { while(fgets(buf, sizeof(buf)-1, fp)) { cp = strchr(buf, '\n'); if(cp) *cp= '\0'; if(!*buf) continue; if(*buf == '#') continue; if(*buf == '[') { if(!strcmp(buf, "[global]")) section = GLOBAL; else if (!strcmp(buf, "[keys]")) section = KEYS; else if (!strcmp(buf, "[theme]")) section = THEME; continue; } if (section == GLOBAL) { cp = strchr(buf, '='); if (cp) { *cp++ = '\0'; while(*cp == ' ') cp++; val = cp; cp = strchr(buf, ' '); if(cp) *cp = '\0'; if(!strcmp(buf, "term")) config.global->term = strdup(val); if(!strcmp(buf, "term_args")) config.global->term_args = strdup(val); if(!strcmp(buf, "max_vdesks")) config.global->max_vdesks = atoi(val); if(!strcmp(buf, "snap_distance")) config.global->snap_distance = atoi(val); if(!strcmp(buf, "flip_resizelower")) config.global->flip_resizelower = atoi(val); if(!strcmp(buf, "solidwindows")) config.global->solidwindows = atoi(val); #ifdef DEBUG bad_debug(4,"setting from config term = %s\n", config.global->term); bad_debug(4,"setting from config max_vdesks = %d\n", config.global->max_vdesks); bad_debug(4,"setting from config snap_distance = %d\n", config.global->snap_distance); bad_debug(4,"setting from config term_args = %s\n", config.global->term_args); bad_debug(4,"setting from config flip_resizelower = %d\n", config.global->flip_resizelower); bad_debug(4,"setting from config solidwindows = %d\n", config.global->solidwindows); #endif } } if (section == KEYS) { cp = strchr(buf, '='); if (cp) { *cp++ = '\0'; while(*cp == ' ') cp++; val = cp; cp = strchr(buf, ' '); if(cp) *cp = '\0'; if(!strcmp(buf, "next")) config.keys->next = strdup(val); if(!strcmp(buf, "term")) config.keys->term = strdup(val); if(!strcmp(buf, "topleft")) config.keys->topleft = strdup(val); if(!strcmp(buf, "topright")) config.keys->topright = strdup(val); if(!strcmp(buf, "bottomleft")) config.keys->bottomleft = strdup(val); if(!strcmp(buf, "bottomright")) config.keys->bottomright = strdup(val); if(!strcmp(buf, "lower")) config.keys->lower = strdup(val); if(!strcmp(buf, "max")) config.keys->max = strdup(val); if(!strcmp(buf, "maxhoriz")) config.keys->maxhoriz = strdup(val); if(!strcmp(buf, "maxvert")) config.keys->maxvert = strdup(val); if(!strcmp(buf, "fix")) config.keys->fix = strdup(val); if(!strcmp(buf, "kill")) config.keys->kill = strdup(val); if(!strcmp(buf, "reload")) config.keys->reload = strdup(val); if(!strcmp(buf, "vdup")) config.keys->vdup = strdup(val); if(!strcmp(buf, "vddown")) config.keys->vddown = strdup(val); #ifdef DEBUG bad_debug(4,"setting from config term = %s\n", config.keys->term); bad_debug(4,"setting from config next = %s\n", config.keys->next); bad_debug(4,"setting from config topleft = %s\n", config.keys->topleft); bad_debug(4,"setting from config topright = %s\n", config.keys->topright); bad_debug(4,"setting from config bottomleft = %s\n", config.keys->bottomleft); bad_debug(4,"setting from config bottomright = %s\n", config.keys->bottomright); bad_debug(4,"setting from config lower = %s\n", config.keys->topright); bad_debug(4,"setting from config max = %s\n", config.keys->max); bad_debug(4,"setting from config maxhoriz = %s\n", config.keys->maxhoriz); bad_debug(4,"setting from config maxvert = %s\n", config.keys->maxvert); bad_debug(4,"setting from config fix = %s\n", config.keys->fix); bad_debug(4,"setting from config kill = %s\n", config.keys->kill); bad_debug(4,"setting from config reload = %s\n", config.keys->reload); bad_debug(4,"setting from config vdup = %s\n", config.keys->vdup); bad_debug(4,"setting from configvddown = %s\n", config.keys->vddown); #endif } } if (section == THEME) { cp = strchr(buf, '='); if (cp) { *cp++ = '\0'; while(*cp == ' ') cp++; val = cp; cp = strchr(buf, ' '); if(cp) *cp = '\0'; if(!strcmp(buf, "bgcolor")) config.theme->bgcolor = strdup(val); if(!strcmp(buf, "fgcolor")) config.theme->fgcolor = strdup(val); if(!strcmp(buf, "fxcolor")) config.theme->fxcolor = strdup(val); #ifdef DEBUG bad_debug(4,"setting from config bgcolor = %s\n", config.theme->bgcolor); bad_debug(4,"setting from config fgcolor = %s\n", config.theme->fgcolor); bad_debug(4,"setting from config fxcolor = %s\n", config.theme->fxcolor); #endif } } } } else { bad_debug(0,"Config file \"%s\" not found!\n", config_file); } /* set min_vdesk */ if ( config.global->max_vdesks == 10 ) { config.global->min_vdesk = 0; } else { config.global->min_vdesk = 1; } }