1/*
2 *  SystemUI.c
3 *  QuickTimeTcl
4 *
5 *  Created by Mats Bengtsson on Wed May 12 2004.
6 *  Copyright (c) 2004 Mats Bengtsson. All rights reserved.
7 *
8 */
9
10#include "QuickTimeTcl.h"
11
12
13/*
14 * For dispatching commands.
15 */
16
17static char *allUIModeCmds[] = {
18    "normal", "contentsuppressed", "contenthidden", "allhidden",
19    (char *) NULL
20};
21
22enum {
23	kQTTclUIModeCmdNormal						= 0L,
24    kQTTclUIModeCmdContentSuppressed,
25    kQTTclUIModeCmdContentHidden,
26    kQTTclUIModeCmdAllHidden
27};
28
29static char *allUIModeOptions[] = {
30	"-autoshowmenubar", "-disableapplemenu", "-disableprocessswitch",
31    "-disableforcequit", "-disablesessionterminate",
32    (char *) NULL
33};
34
35enum {
36    kQTTclUIModeOptionAutoShowMenuBar			= 0L,
37    kQTTclUIModeOptionDisableAppleMenu,
38    kQTTclUIModeOptionDisableProcessSwitch,
39    kQTTclUIModeOptionDisableForceQuit,
40    kQTTclUIModeOptionDisableSessionTerminate
41};
42
43/*
44 *----------------------------------------------------------------------
45 *
46 * MacControlUICmd --
47 *
48 *		Gets or sets the system UI mode.
49 *
50 * Results:
51 *		Standard Tcl result
52 *
53 * Side effects:
54 *		None
55 *
56 *----------------------------------------------------------------------
57 */
58
59int MacControlUICmd( ClientData     clientData,
60        Tcl_Interp*   interp,
61        int           objc,
62        Tcl_Obj *CONST objv[])
63{
64    SystemUIMode      	mode;
65    SystemUIOptions   	options = 0L;
66    Tcl_Obj				*listObjPtr;
67    int             	cmdIndex;
68	int					iarg;
69	int					optIndex;
70    char              	errorCodeStr[20];
71    OSStatus          	osErr = noErr;
72
73    if (objc == 1) {
74
75        /*
76         * Get current mode & options.
77         */
78
79        GetSystemUIMode( &mode, &options );
80        listObjPtr = Tcl_NewListObj( 0, (Tcl_Obj **) NULL );
81
82        switch (mode) {
83            case kUIModeNormal:
84            Tcl_ListObjAppendElement( interp, listObjPtr, Tcl_NewStringObj("normal", -1) );
85            break;
86
87            case kUIModeContentSuppressed:
88            Tcl_ListObjAppendElement( interp, listObjPtr, Tcl_NewStringObj("contentsuppressed", -1) );
89            break;
90
91            case kUIModeContentHidden:
92            Tcl_ListObjAppendElement( interp, listObjPtr, Tcl_NewStringObj("contenthidden", -1) );
93            break;
94
95            case kUIModeAllHidden:
96            Tcl_ListObjAppendElement( interp, listObjPtr, Tcl_NewStringObj("allhidden", -1) );
97            break;
98
99            default:
100            Tcl_ListObjAppendElement( interp, listObjPtr, Tcl_NewStringObj("unknown", -1) );
101            break;
102        }
103
104        if (options & kUIOptionAutoShowMenuBar) {
105            Tcl_ListObjAppendElement( interp, listObjPtr, Tcl_NewStringObj("-autoshowmenubar", -1) );
106        }
107        if (options & kUIOptionDisableAppleMenu) {
108            Tcl_ListObjAppendElement( interp, listObjPtr, Tcl_NewStringObj("-disableapplemenu", -1) );
109        }
110        if (options & kUIOptionDisableProcessSwitch) {
111            Tcl_ListObjAppendElement( interp, listObjPtr, Tcl_NewStringObj("-disableprocessswitch", -1) );
112        }
113        if (options & kUIOptionDisableForceQuit) {
114            Tcl_ListObjAppendElement( interp, listObjPtr, Tcl_NewStringObj("-disableforcequit", -1) );
115        }
116        if (options & kUIOptionDisableSessionTerminate) {
117            Tcl_ListObjAppendElement( interp, listObjPtr, Tcl_NewStringObj("-disablesessionterminate", -1) );
118        }
119        Tcl_SetObjResult( interp, listObjPtr );
120        return TCL_OK;
121    }
122
123    /*
124     * Set current mode & options.
125     */
126
127	if (Tcl_GetIndexFromObj( interp, objv[1], allUIModeCmds, "command",
128			TCL_EXACT, &cmdIndex ) != TCL_OK ) {
129	    return TCL_ERROR;
130	}
131    switch(cmdIndex) {
132
133        case kQTTclUIModeCmdNormal: {
134    		mode = kUIModeNormal;
135			break;
136		}
137        case kQTTclUIModeCmdContentSuppressed: {
138    		mode = kUIModeContentSuppressed;
139			break;
140		}
141        case kQTTclUIModeCmdContentHidden: {
142    		mode = kUIModeContentHidden;
143			break;
144		}
145        case kQTTclUIModeCmdAllHidden: {
146    		mode = kUIModeAllHidden;
147			break;
148		}
149    }
150
151	/*
152	 * Process the configuration options if any.
153	 */
154
155	for (iarg = 2; iarg < objc; iarg++) {
156		if (Tcl_GetIndexFromObj( interp, objv[iarg], allUIModeOptions,
157				"option", TCL_EXACT, &optIndex ) != TCL_OK ) {
158			return TCL_ERROR;
159		}
160
161        switch(optIndex) {
162
163            case kQTTclUIModeOptionAutoShowMenuBar: {
164                options |= kUIOptionAutoShowMenuBar;
165                break;
166            }
167            case kQTTclUIModeOptionDisableAppleMenu: {
168                options |= kUIOptionDisableAppleMenu;
169                break;
170            }
171            case kQTTclUIModeOptionDisableProcessSwitch: {
172                options |= kUIOptionDisableProcessSwitch;
173                break;
174            }
175            case kQTTclUIModeOptionDisableForceQuit: {
176                options |= kUIOptionDisableForceQuit;
177                break;
178            }
179            case kQTTclUIModeOptionDisableSessionTerminate: {
180                options |= kUIOptionDisableSessionTerminate;
181                break;
182            }
183        }
184    }
185
186    osErr = SetSystemUIMode( mode, options );
187
188    if (osErr != noErr) {
189        sprintf( errorCodeStr, "%i", (int) osErr );
190        Tcl_AppendResult( interp, "system call \"SetSystemUIMode\" returned error code: ",
191                errorCodeStr, (char*) NULL );
192        return TCL_ERROR;
193    }
194
195    return TCL_OK;
196}
197
198
199