All pastes #1455026 Raw Edit

desktop.c

public c v1 · immutable
#1455026 ·published 2009-06-10 08:06 UTC
rendered paste body
#include <windows.h>#include <stdio.h>/* ================ getopt.c *//* * Copyright (c) 1987 Regents of the University of California. * 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. All advertising materials mentioning features or use of this software *    must display the following acknowledgement: *	This product includes software developed by the University of *	California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors *    may be used to endorse or promote products derived from this software *    without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS 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 REGENTS 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. */#if defined(LIBC_SCCS) && !defined(lint)static char sccsid[] = "@(#)getopt.c	4.13 (Berkeley) 2/23/91";#endif /* LIBC_SCCS and not lint */#include <stdio.h>#include <string.h>/* * get option letter from argument vector */int	opterr = 1,		/* if error message should be printed */	optind = 1,		/* index into parent argv vector */	optopt;			/* character checked for validity */char	*optarg;		/* argument associated with option */#define	BADCH	(int)'?'#define	EMSG	""intgetopt(int nargc, char** nargv, char* ostr){	static char *place = EMSG;		/* option letter processing */	register char *oli;			/* option letter list index */	char *p;	if (!*place) {				/* update scanning pointer */		if (optind >= nargc || *(place = nargv[optind]) != '-') {			place = EMSG;			return(EOF);		}		if (place[1] && *++place == '-') {	/* found "--" */			++optind;			place = EMSG;			return(EOF);		}	}					/* option letter okay? */	if ((optopt = (int)*place++) == (int)':' ||	    !(oli = strchr(ostr, optopt))) {		/*		 * if the user didn't specify '-' as an option,		 * assume it means EOF.		 */		if (optopt == (int)'-')			return(EOF);		if (!*place)			++optind;		if (opterr) {			if (!(p = strrchr(*nargv, '/')))				p = *nargv;			else				++p;			(void)fprintf(stderr, "%s: illegal option -- %c\n",			    p, optopt);		}		return(BADCH);	}	if (*++oli != ':') {			/* don't need argument */		optarg = NULL;		if (!*place)			++optind;	}	else {					/* need an argument */		if (*place)			/* no white space */			optarg = place;		else if (nargc <= ++optind) {	/* no arg */			place = EMSG;			if (!(p = strrchr(*nargv, '/')))				p = *nargv;			else				++p;			if (opterr)				(void)fprintf(stderr,				    "%s: option requires an argument -- %c\n",				    p, optopt);			return(BADCH);		}	 	else				/* white space */			optarg = nargv[optind];		place = EMSG;		++optind;	}	return(optopt);				/* dump back option letter */}/* ================ end of getopt.c */static void usage (const char *progname){    fprintf (stderr, "\Usage: %s [options] [name]\n\  options are: -c          create desktop if not existing,\n\                           start Explorer on it\n\               -l          list desktops\n\               -p progname program to start instead of Explorer\n\               -s          don't switch to the desktop\n\               -w          wait for program to exit, then switch back\n,\  name is name of desktop to switch to or create\n",	     progname);}static BOOL CALLBACKenum_desktop (LPTSTR name,	      LPARAM user_data){  printf ("%s\n", name);  return TRUE;}intmain (int argc, char **argv){  HDESK old_desk, new_desk;  int do_create = 0, do_list = 0, dont_switch = 0, do_wait = 0;  char *new_name, *program = NULL;  int opt;  while ((opt = getopt (argc, argv, "clp:sw")) != EOF)    {      switch (opt)	{	case 'c':	  do_create = 1;	  break;	case 'l':	  do_list = 1;	  break;	case 'p':	  program = optarg;	  break;	case 's':	  dont_switch = 1;	  break;	case 'w':	  do_wait = 1;	  break;	case '?':	  usage (argv[0]);	  exit (1);	}    }    if (do_list && (do_create || program || do_wait || optind != argc))    fprintf (stderr, "Cannot use -l with other options\n"),      exit (1);  if (do_list)    {      HWINSTA hwinsta = OpenWindowStation ("WinSta0", FALSE, WINSTA_ENUMDESKTOPS);      if (hwinsta == NULL)	fprintf (stderr, "OpenWindowStation of WinSta0 failed: %d\n", GetLastError ()),	  exit (1);      EnumDesktops (hwinsta, enum_desktop, 0);      CloseWindowStation (hwinsta);      exit (0);    }  old_desk = GetThreadDesktop (GetCurrentThreadId ());  new_desk = OpenDesktop (argv[optind], 0, TRUE, GENERIC_ALL);  if (new_desk == NULL)    if (do_create)      {	SECURITY_ATTRIBUTES sa;	sa.nLength = sizeof (sa);	sa.lpSecurityDescriptor = NULL;	sa.bInheritHandle = TRUE;	new_desk = CreateDesktop (argv[optind], NULL, NULL, 0, GENERIC_ALL, &sa);	if (new_desk == NULL)	  fprintf (stderr, "CreateDesktop failed: %d\n", GetLastError ()),	    exit (1);      }    else      fprintf (stderr, "OpenDesktop failed: %d\n", GetLastError ()),	exit (1);  if (!dont_switch)    {      if (!SwitchDesktop (new_desk))	fprintf (stderr, "SwitchDesktop failed: %d\n", GetLastError ()),	  exit (1);    }  if (do_create)    {      PROCESS_INFORMATION process_info = {0};      STARTUPINFO startup_info = {0};      if (program == NULL)	program = "explorer.exe";            startup_info.cb = sizeof(startup_info);      startup_info.lpDesktop = argv[optind];            if (CreateProcess (NULL, program, NULL, NULL, TRUE,			 CREATE_NEW_CONSOLE, NULL, NULL,			 &startup_info, &process_info))	{	  if (do_wait)	    {	      WaitForSingleObject (process_info.hProcess, INFINITE);	      if (!SwitchDesktop (old_desk))		fprintf (stderr, "SwitchDesktop back to old_desk failed: %d\n", GetLastError ());	    }	      	  CloseHandle(process_info.hProcess);	  CloseHandle(process_info.hThread);	}      else	fprintf (stderr, "CreateProcess failed: %d\n", GetLastError ());    }    if (!CloseDesktop (new_desk))    fprintf (stderr, "CloseDesktop of new_desk failed: %d\n", GetLastError ()),      exit (1);  return 0;}