dsimple.c revision 8fff3f40
1e6232409Smrg/* $Xorg: dsimple.c,v 1.4 2001/02/09 02:05:54 xorgcvs Exp $ */ 2e6232409Smrg/* 3e6232409Smrg 4e6232409SmrgCopyright 1993, 1998 The Open Group 5e6232409Smrg 6e6232409SmrgPermission to use, copy, modify, distribute, and sell this software and its 7e6232409Smrgdocumentation for any purpose is hereby granted without fee, provided that 8e6232409Smrgthe above copyright notice appear in all copies and that both that 9e6232409Smrgcopyright notice and this permission notice appear in supporting 10e6232409Smrgdocumentation. 11e6232409Smrg 12e6232409SmrgThe above copyright notice and this permission notice shall be included 13e6232409Smrgin all copies or substantial portions of the Software. 14e6232409Smrg 15e6232409SmrgTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 16e6232409SmrgOR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 17e6232409SmrgMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 18e6232409SmrgIN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR 19e6232409SmrgOTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 20e6232409SmrgARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 21e6232409SmrgOTHER DEALINGS IN THE SOFTWARE. 22e6232409Smrg 23e6232409SmrgExcept as contained in this notice, the name of The Open Group shall 24e6232409Smrgnot be used in advertising or otherwise to promote the sale, use or 25e6232409Smrgother dealings in this Software without prior written authorization 26e6232409Smrgfrom The Open Group. 27e6232409Smrg 28e6232409Smrg*/ 29e6232409Smrg/* $XFree86: xc/programs/xlsfonts/dsimple.c,v 3.6 2001/12/14 20:02:09 dawes Exp $ */ 30e6232409Smrg 31e6232409Smrg#include <X11/Xos.h> 32e6232409Smrg#include <X11/Xlib.h> 33e6232409Smrg#include <X11/Xutil.h> 34e6232409Smrg#include <X11/cursorfont.h> 35e6232409Smrg#include <stdio.h> 36e6232409Smrg#include <stdlib.h> 37e6232409Smrg#include <stdarg.h> 38e6232409Smrg/* 39e6232409Smrg * Other_stuff.h: Definitions of routines in other_stuff. 40e6232409Smrg * 41e6232409Smrg * Written by Mark Lillibridge. Last updated 7/1/87 42e6232409Smrg */ 43e6232409Smrg 44e6232409Smrg#include "dsimple.h" 45e6232409Smrg 46e6232409Smrg/* 47e6232409Smrg * Just_display: A group of routines designed to make the writting of simple 48e6232409Smrg * X11 applications which open a display but do not open 49e6232409Smrg * any windows much faster and easier. Unless a routine says 50e6232409Smrg * otherwise, it may be assumed to require program_name, dpy, 51e6232409Smrg * and screen already defined on entry. 52e6232409Smrg * 53e6232409Smrg * Written by Mark Lillibridge. Last updated 7/1/87 54e6232409Smrg */ 55e6232409Smrg 56e6232409Smrg 57e6232409Smrg/* This stuff is defined in the calling program by just_display.h */ 58e6232409Smrgchar *program_name = "unknown_program"; 59e6232409SmrgDisplay *dpy = NULL; 60e6232409Smrgint screen = 0; 61e6232409Smrg 62e6232409Smrg/* 63e6232409Smrg * Malloc: like malloc but handles out of memory using Fatal_Error. 64e6232409Smrg */ 658fff3f40Smrgchar * 668fff3f40SmrgMalloc(unsigned size) 67e6232409Smrg{ 68e6232409Smrg char *data; 69e6232409Smrg 70e6232409Smrg if (!(data = malloc(size))) 71e6232409Smrg Fatal_Error("Out of memory!"); 72e6232409Smrg 73e6232409Smrg return(data); 74e6232409Smrg} 75e6232409Smrg 76e6232409Smrg 77e6232409Smrg/* 78e6232409Smrg * Realloc: like Malloc except for realloc, handles NULL using Malloc. 79e6232409Smrg */ 808fff3f40Smrgchar * 818fff3f40SmrgRealloc(char *ptr, int size) 82e6232409Smrg{ 83e6232409Smrg char *new_ptr; 84e6232409Smrg 85e6232409Smrg if (!ptr) 86e6232409Smrg return(Malloc(size)); 87e6232409Smrg 88e6232409Smrg if (!(new_ptr = realloc(ptr, size))) 89e6232409Smrg Fatal_Error("Out of memory!"); 90e6232409Smrg 91e6232409Smrg return(new_ptr); 92e6232409Smrg} 93e6232409Smrg 94e6232409Smrg 95e6232409Smrg/* 96e6232409Smrg * Get_Display_Name (argc, argv) Look for -display, -d, or host:dpy (obselete) 97e6232409Smrg * If found, remove it from command line. Don't go past a lone -. 98e6232409Smrg */ 998fff3f40Smrgstatic char * 1008fff3f40SmrgGet_Display_Name(int *pargc/* MODIFIED */, char **argv/* MODIFIED */) 101e6232409Smrg{ 102e6232409Smrg int argc = *pargc; 103e6232409Smrg char **pargv = argv+1; 104e6232409Smrg char *displayname = NULL; 105e6232409Smrg int i; 106e6232409Smrg 107e6232409Smrg for (i = 1; i < argc; i++) { 108e6232409Smrg char *arg = argv[i]; 109e6232409Smrg 110e6232409Smrg if (!strcmp (arg, "-display") || !strcmp (arg, "-d")) { 111e6232409Smrg if (++i >= argc) usage (); 112e6232409Smrg 113e6232409Smrg displayname = argv[i]; 114e6232409Smrg *pargc -= 2; 115e6232409Smrg continue; 116e6232409Smrg } 117e6232409Smrg if (!strcmp(arg,"-")) { 118e6232409Smrg while (i<argc) 119e6232409Smrg *pargv++ = argv[i++]; 120e6232409Smrg break; 121e6232409Smrg } 122e6232409Smrg *pargv++ = arg; 123e6232409Smrg } 124e6232409Smrg 125e6232409Smrg *pargv = NULL; 126e6232409Smrg return (displayname); 127e6232409Smrg} 128e6232409Smrg 129e6232409Smrg 130e6232409Smrg/* 131e6232409Smrg * Open_Display: Routine to open a display with correct error handling. 132e6232409Smrg * Does not require dpy or screen defined on entry. 133e6232409Smrg */ 1348fff3f40Smrgstatic Display * 1358fff3f40SmrgOpen_Display(char *display_name) 136e6232409Smrg{ 137e6232409Smrg Display *d; 138e6232409Smrg 139e6232409Smrg d = XOpenDisplay(display_name); 140e6232409Smrg if (d == NULL) { 141e6232409Smrg fprintf (stderr, "%s: unable to open display '%s'\n", 142e6232409Smrg program_name, XDisplayName (display_name)); 1438fff3f40Smrg exit(1); 144e6232409Smrg } 145e6232409Smrg 146e6232409Smrg return(d); 147e6232409Smrg} 148e6232409Smrg 149e6232409Smrg 150e6232409Smrg/* 151e6232409Smrg * Setup_Display_And_Screen: This routine opens up the correct display (i.e., 152e6232409Smrg * it calls Get_Display_Name) and then stores a 153e6232409Smrg * pointer to it in dpy. The default screen 154e6232409Smrg * for this display is then stored in screen. 155e6232409Smrg * Does not require dpy or screen defined. 156e6232409Smrg */ 1578fff3f40Smrgvoid 1588fff3f40SmrgSetup_Display_And_Screen(int *argc/* MODIFIED */, char **argv/* MODIFIED */) 159e6232409Smrg{ 1608fff3f40Smrg char *displayname = Get_Display_Name(argc, argv); 1618fff3f40Smrg 1628fff3f40Smrg dpy = Open_Display (displayname); 1638fff3f40Smrg screen = XDefaultScreen(dpy); 164e6232409Smrg} 165e6232409Smrg 166e6232409Smrg/* 167e6232409Smrg * Close_Display: Close display 168e6232409Smrg */ 169e6232409Smrgvoid Close_Display(void) 170e6232409Smrg{ 171e6232409Smrg if (dpy == NULL) 172e6232409Smrg return; 173e6232409Smrg 1748fff3f40Smrg XCloseDisplay(dpy); 1758fff3f40Smrg dpy = NULL; 176e6232409Smrg} 177e6232409Smrg 178e6232409Smrg 179e6232409Smrg/* 180e6232409Smrg * Standard fatal error routine - call like printf but maximum of 7 arguments. 181e6232409Smrg * Does not require dpy or screen defined. 182e6232409Smrg */ 183e6232409Smrgvoid Fatal_Error(char *msg, ...) 184e6232409Smrg{ 185e6232409Smrg va_list args; 186e6232409Smrg fflush(stdout); 187e6232409Smrg fflush(stderr); 188e6232409Smrg fprintf(stderr, "%s: error: ", program_name); 189e6232409Smrg va_start(args, msg); 190e6232409Smrg vfprintf(stderr, msg, args); 191e6232409Smrg va_end(args); 192e6232409Smrg fprintf(stderr, "\n"); 193e6232409Smrg Close_Display(); 194e6232409Smrg exit(EXIT_FAILURE); 195e6232409Smrg} 196