/*- * Copyright (c) 2001 Jordan DeLong * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the author nor the names of contributors may be * used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #include "plugutil.h" /* the external program to run for root setting */ static char *rootset_bin = NULL; /* flag used to tell it to tile the image */ static char *rootset_tileflag = NULL; /* flag used to tell it to scale the image */ static char *rootset_scaleflag = NULL; /* scale or tile: default to tile */ static int scaleimg = 0; /* the file containing the image */ static char *imagefn = NULL; /* get parameters */ int init() { /* params for the program to use to set the root */ REQUIRED_PARAM(&plugin_this->params, "rootset_bin", string, rootset_bin); OPTIONAL_PARAM(&plugin_this->params, "rootset_tileflag", string, rootset_tileflag, NULL); OPTIONAL_PARAM(&plugin_this->params, "rootset_scaleflag", string, rootset_scaleflag, NULL); /* the name of the file to tell rootset_bin to use */ REQUIRED_PARAM(&plugin_this->params, "imagefn", string, imagefn); OPTIONAL_PARAM(&plugin_this->params, "scaleimg", bool, scaleimg, 0); return PLUGIN_OK; } /* free up used memory and then die */ void shutdown() { if (rootset_bin) free(rootset_bin); if (rootset_tileflag) free(rootset_tileflag); if (rootset_scaleflag) free(rootset_scaleflag); if (imagefn) free(imagefn); } /* perform our operation (set the root bg) and unload ourselves */ int start() { char *cmd; pid_t pid; int screen, len; /* find how much space we need for the 'exec', and the cmd string */ len = 5 + strlen(rootset_bin) + 1; if (scaleimg && rootset_scaleflag) len += strlen(rootset_scaleflag) + 1; else if (rootset_tileflag) len += strlen(rootset_tileflag) + 1; len += strlen(imagefn) + 1; /* get memory for the cmd string */ cmd = malloc(len); if (!cmd) return PLUGIN_UNLOAD; /* set up the cmd string */ strcpy(cmd, "exec "); strcat(cmd, rootset_bin); strcat(cmd, " "); if (scaleimg && rootset_scaleflag) { strcat(cmd, rootset_scaleflag); strcat(cmd, " "); } else if (rootset_tileflag) { strcat(cmd, rootset_tileflag); strcat(cmd, " "); } strcat(cmd, imagefn); /* set it for each screen */ for (screen = 0; screen < screen_count; screen++) pid = action_exec(screen, cmd); free(cmd); return PLUGIN_UNLOAD; }