choose.c revision 5977a007
18108eb18Smrg/* $Xorg: choose.c,v 1.4 2001/02/09 02:05:59 xorgcvs Exp $ */ 28108eb18Smrg/****************************************************************************** 38108eb18Smrg 48108eb18SmrgCopyright 1993, 1998 The Open Group 58108eb18Smrg 68108eb18SmrgPermission to use, copy, modify, distribute, and sell this software and its 78108eb18Smrgdocumentation for any purpose is hereby granted without fee, provided that 88108eb18Smrgthe above copyright notice appear in all copies and that both that 98108eb18Smrgcopyright notice and this permission notice appear in supporting 108108eb18Smrgdocumentation. 118108eb18Smrg 128108eb18SmrgThe above copyright notice and this permission notice shall be included in 138108eb18Smrgall copies or substantial portions of the Software. 148108eb18Smrg 158108eb18SmrgTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 168108eb18SmrgIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 178108eb18SmrgFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 188108eb18SmrgOPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 198108eb18SmrgAN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 208108eb18SmrgCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 218108eb18Smrg 228108eb18SmrgExcept as contained in this notice, the name of The Open Group shall not be 238108eb18Smrgused in advertising or otherwise to promote the sale, use or other dealings 248108eb18Smrgin this Software without prior written authorization from The Open Group. 258108eb18Smrg******************************************************************************/ 268108eb18Smrg/* $XFree86: xc/programs/xsm/choose.c,v 1.6tsi Exp $ */ 278108eb18Smrg 288108eb18Smrg#include "xsm.h" 298108eb18Smrg#include "saveutil.h" 308108eb18Smrg#include "lock.h" 318108eb18Smrg#include "choose.h" 328108eb18Smrg#include <sys/types.h> 338108eb18Smrg 348108eb18Smrg#include <X11/Shell.h> 358108eb18Smrg#include <X11/Xaw/Form.h> 368108eb18Smrg#include <X11/Xaw/List.h> 378108eb18Smrg#include <X11/Xaw/Command.h> 388108eb18Smrg 398108eb18Smrg#ifndef X_NOT_POSIX 408108eb18Smrg#include <dirent.h> 418108eb18Smrg#else 428108eb18Smrg#ifdef SYSV 438108eb18Smrg#include <dirent.h> 448108eb18Smrg#else 458108eb18Smrg#ifdef USG 468108eb18Smrg#include <dirent.h> 478108eb18Smrg#else 488108eb18Smrg#include <sys/dir.h> 498108eb18Smrg#ifndef dirent 508108eb18Smrg#define dirent direct 518108eb18Smrg#endif 528108eb18Smrg#endif 538108eb18Smrg#endif 548108eb18Smrg#endif 558108eb18Smrg 568108eb18Smrgstatic Pixel save_message_foreground; 578108eb18Smrgstatic Pixel save_message_background; 588108eb18Smrg 598108eb18Smrgstatic int delete_session_phase = 0; 608108eb18Smrgstatic int break_lock_phase = 0; 618108eb18Smrg 621a650d1eSmrgstatic Widget chooseSessionPopup; 631a650d1eSmrgstatic Widget chooseSessionForm; 641a650d1eSmrgstatic Widget chooseSessionLabel; 651a650d1eSmrgstatic Widget chooseSessionListWidget; 661a650d1eSmrgstatic Widget chooseSessionMessageLabel; 671a650d1eSmrgstatic Widget chooseSessionLoadButton; 681a650d1eSmrgstatic Widget chooseSessionDeleteButton; 691a650d1eSmrgstatic Widget chooseSessionBreakLockButton; 701a650d1eSmrgstatic Widget chooseSessionFailSafeButton; 711a650d1eSmrgstatic Widget chooseSessionCancelButton; 728108eb18Smrg 738108eb18Smrg 748108eb18Smrg 758108eb18Smrgint 768108eb18SmrgGetSessionNames(int *count_ret, String **short_names_ret, 778108eb18Smrg String **long_names_ret, Bool **locked_ret) 788108eb18Smrg{ 798108eb18Smrg DIR *dir; 808108eb18Smrg struct dirent *entry; 815977a007Smrg const char *path; 828108eb18Smrg int count; 838108eb18Smrg 845977a007Smrg path = getenv ("SM_SAVE_DIR"); 858108eb18Smrg if (!path) 868108eb18Smrg { 875977a007Smrg path = getenv ("HOME"); 888108eb18Smrg if (!path) 898108eb18Smrg path = "."; 908108eb18Smrg } 918108eb18Smrg 928108eb18Smrg *count_ret = 0; 938108eb18Smrg *short_names_ret = NULL; 948108eb18Smrg *locked_ret = NULL; 958108eb18Smrg if (long_names_ret) 968108eb18Smrg *long_names_ret = NULL; 978108eb18Smrg 988108eb18Smrg if ((dir = opendir (path)) == NULL) 998108eb18Smrg return 0; 1008108eb18Smrg 1018108eb18Smrg count = 0; 1028108eb18Smrg 1038108eb18Smrg while ((entry = readdir (dir)) != NULL) 1048108eb18Smrg { 1058108eb18Smrg if (strncmp (entry->d_name, ".XSM-", 5) == 0) 1068108eb18Smrg count++; 1078108eb18Smrg } 1088108eb18Smrg 1098108eb18Smrg if (count == 0 || 1108108eb18Smrg ((*short_names_ret = (String *) XtMalloc ( 1118108eb18Smrg count * sizeof (String))) == NULL) || 1128108eb18Smrg (long_names_ret && (*long_names_ret = 1138108eb18Smrg (String *) XtMalloc (count * sizeof (String))) == NULL) || 1148108eb18Smrg ((*locked_ret = (Bool *) XtMalloc (count * sizeof (Bool))) == NULL)) 1158108eb18Smrg { 1168108eb18Smrg closedir (dir); 1178108eb18Smrg if (*short_names_ret) 1188108eb18Smrg XtFree ((char *) *short_names_ret); 1198108eb18Smrg if (long_names_ret && *long_names_ret) 1208108eb18Smrg XtFree ((char *) *long_names_ret); 1218108eb18Smrg return 0; 1228108eb18Smrg } 1238108eb18Smrg 1248108eb18Smrg rewinddir (dir); 1258108eb18Smrg 1268108eb18Smrg while ((entry = readdir (dir)) != NULL && *count_ret < count) 1278108eb18Smrg { 1288108eb18Smrg if (strncmp (entry->d_name, ".XSM-", 5) == 0) 1298108eb18Smrg { 1308108eb18Smrg char *name = (char *) entry->d_name + 5; 1318108eb18Smrg char *id = NULL; 1328108eb18Smrg Bool locked = CheckSessionLocked (name, long_names_ret!=NULL, &id); 1338108eb18Smrg 1348108eb18Smrg (*short_names_ret)[*count_ret] = XtNewString (name); 1358108eb18Smrg (*locked_ret)[*count_ret] = locked; 1368108eb18Smrg 1378108eb18Smrg if (long_names_ret) 1388108eb18Smrg { 1398108eb18Smrg if (!locked) 1408108eb18Smrg { 1418108eb18Smrg (*long_names_ret)[*count_ret] = 1428108eb18Smrg (*short_names_ret)[*count_ret]; 1438108eb18Smrg } 1448108eb18Smrg else 1458108eb18Smrg { 1468108eb18Smrg char *host = ((char *) strchr (id, '/')) + 1; 1478108eb18Smrg char *colon = (char *) strrchr (host, ':'); 1485977a007Smrg char *lockmsg; 1498108eb18Smrg 1508108eb18Smrg /* backtrack over previous colon if there are 2 (DECnet), 1518108eb18Smrg but not three (IPv6) */ 1528108eb18Smrg if ((*(colon - 1) == ':') && (*(colon - 2) != ':')) 1538108eb18Smrg colon--; 1548108eb18Smrg 1558108eb18Smrg *colon = '\0'; 1568108eb18Smrg 1575977a007Smrg XtAsprintf (&lockmsg, "%s (locked at %s)", name, host); 1585977a007Smrg (*long_names_ret)[*count_ret] = lockmsg; 1598108eb18Smrg *colon = ':'; 1608108eb18Smrg 1618108eb18Smrg XtFree (id); 1628108eb18Smrg } 1638108eb18Smrg } 1648108eb18Smrg 1658108eb18Smrg (*count_ret)++; 1668108eb18Smrg } 1678108eb18Smrg } 1688108eb18Smrg 1698108eb18Smrg closedir (dir); 1708108eb18Smrg 1718108eb18Smrg return 1; 1728108eb18Smrg} 1738108eb18Smrg 1748108eb18Smrg 1758108eb18Smrg 1768108eb18Smrgvoid 1778108eb18SmrgFreeSessionNames(int count, String *namesShort, String *namesLong, 1788108eb18Smrg Bool *lockFlags) 1798108eb18Smrg{ 1808108eb18Smrg int i; 1818108eb18Smrg 1828108eb18Smrg for (i = 0; i < count; i++) 1838108eb18Smrg XtFree ((char *) namesShort[i]); 1848108eb18Smrg XtFree ((char *) namesShort); 1858108eb18Smrg 1868108eb18Smrg if (namesLong) 1878108eb18Smrg { 1888108eb18Smrg for (i = 0; i < count; i++) 1898108eb18Smrg if (lockFlags[i]) 1908108eb18Smrg XtFree ((char *) namesLong[i]); 1918108eb18Smrg XtFree ((char *) namesLong); 1928108eb18Smrg } 1938108eb18Smrg 1948108eb18Smrg XtFree ((char *) lockFlags); 1958108eb18Smrg} 1968108eb18Smrg 1978108eb18Smrg 1988108eb18Smrg 1998108eb18Smrgstatic void 2008108eb18SmrgSessionSelected(int number, Bool highlight) 2018108eb18Smrg{ 2028108eb18Smrg if (number >= 0) 2038108eb18Smrg { 2048108eb18Smrg Bool locked = sessionsLocked[number]; 2058108eb18Smrg 2068108eb18Smrg if (highlight) 2078108eb18Smrg XawListHighlight (chooseSessionListWidget, number); 2088108eb18Smrg 2098108eb18Smrg XtSetSensitive (chooseSessionLoadButton, !locked); 2108108eb18Smrg XtSetSensitive (chooseSessionDeleteButton, !locked); 2118108eb18Smrg XtSetSensitive (chooseSessionBreakLockButton, locked); 2128108eb18Smrg } 2138108eb18Smrg else 2148108eb18Smrg { 2158108eb18Smrg XtSetSensitive (chooseSessionLoadButton, False); 2168108eb18Smrg XtSetSensitive (chooseSessionDeleteButton, False); 2178108eb18Smrg XtSetSensitive (chooseSessionBreakLockButton, False); 2188108eb18Smrg } 2198108eb18Smrg} 2208108eb18Smrg 2218108eb18Smrg 2228108eb18Smrg 2238108eb18Smrgstatic void 2248108eb18SmrgAddSessionNames(int count, String *names) 2258108eb18Smrg{ 2268108eb18Smrg int i; 2278108eb18Smrg 2288108eb18Smrg XawListChange (chooseSessionListWidget, names, count, 0, True); 2298108eb18Smrg 2308108eb18Smrg /* 2318108eb18Smrg * Highlight the first unlocked session, if any. 2328108eb18Smrg */ 2338108eb18Smrg 2348108eb18Smrg for (i = 0; i < sessionNameCount; i++) 2358108eb18Smrg if (!sessionsLocked[i]) 2368108eb18Smrg break; 2378108eb18Smrg 2388108eb18Smrg SessionSelected (i < sessionNameCount ? i : -1, True); 2398108eb18Smrg} 2408108eb18Smrg 2418108eb18Smrg 2428108eb18Smrg 2438108eb18Smrgvoid 2448108eb18SmrgChooseWindowStructureNotifyXtHandler(Widget w, XtPointer closure, 2458108eb18Smrg XEvent *event, 2468108eb18Smrg Boolean *continue_to_dispatch) 2478108eb18Smrg{ 2488108eb18Smrg if (event->type == MapNotify) 2498108eb18Smrg { 2508108eb18Smrg /* 2518108eb18Smrg * Set the input focus to the choose window and direct all keyboard 2528108eb18Smrg * events to the list widget. This way, the user can make selections 2538108eb18Smrg * using the keyboard. 2548108eb18Smrg */ 2558108eb18Smrg 2568108eb18Smrg XtSetKeyboardFocus (chooseSessionPopup, chooseSessionListWidget); 2578108eb18Smrg 2588108eb18Smrg XSetInputFocus (XtDisplay (topLevel), XtWindow (chooseSessionPopup), 2598108eb18Smrg RevertToPointerRoot, CurrentTime); 2608108eb18Smrg 2618108eb18Smrg XSync (XtDisplay (topLevel), 0); 2628108eb18Smrg 2638108eb18Smrg XtRemoveEventHandler (chooseSessionPopup, StructureNotifyMask, False, 2648108eb18Smrg ChooseWindowStructureNotifyXtHandler, NULL); 2658108eb18Smrg } 2668108eb18Smrg} 2678108eb18Smrg 2688108eb18Smrg 2698108eb18Smrgvoid 2708108eb18SmrgChooseSession(void) 2718108eb18Smrg{ 2728108eb18Smrg Dimension width, height; 2738108eb18Smrg Position x, y; 2748108eb18Smrg 2758108eb18Smrg 2768108eb18Smrg /* 2778108eb18Smrg * Add the session names to the list 2788108eb18Smrg */ 2798108eb18Smrg 2808108eb18Smrg AddSessionNames (sessionNameCount, sessionNamesLong); 2818108eb18Smrg 2828108eb18Smrg 2838108eb18Smrg /* 2848108eb18Smrg * Center popup containing choice of sessions 2858108eb18Smrg */ 2868108eb18Smrg 2878108eb18Smrg XtRealizeWidget (chooseSessionPopup); 2888108eb18Smrg 2898108eb18Smrg XtVaGetValues (chooseSessionPopup, 2908108eb18Smrg XtNwidth, &width, 2918108eb18Smrg XtNheight, &height, 2928108eb18Smrg NULL); 2938108eb18Smrg 2948108eb18Smrg x = (Position)(WidthOfScreen (XtScreen (topLevel)) - width) / 2; 2958108eb18Smrg y = (Position)(HeightOfScreen (XtScreen (topLevel)) - height) / 3; 2968108eb18Smrg 2978108eb18Smrg XtVaSetValues (chooseSessionPopup, 2988108eb18Smrg XtNx, x, 2998108eb18Smrg XtNy, y, 3008108eb18Smrg NULL); 3018108eb18Smrg 3028108eb18Smrg XtVaSetValues (chooseSessionListWidget, 3038108eb18Smrg XtNlongest, width, 3048108eb18Smrg NULL); 3058108eb18Smrg 3068108eb18Smrg XtVaSetValues (chooseSessionLabel, 3078108eb18Smrg XtNwidth, width, 3088108eb18Smrg NULL); 3098108eb18Smrg 3108108eb18Smrg XtVaGetValues (chooseSessionMessageLabel, 3118108eb18Smrg XtNforeground, &save_message_foreground, 3128108eb18Smrg XtNbackground, &save_message_background, 3138108eb18Smrg NULL); 3148108eb18Smrg 3158108eb18Smrg XtVaSetValues (chooseSessionMessageLabel, 3168108eb18Smrg XtNwidth, width, 3178108eb18Smrg XtNforeground, save_message_background, 3188108eb18Smrg NULL); 3198108eb18Smrg 3208108eb18Smrg /* 3218108eb18Smrg * Wait for a map notify on the popup, then set input focus. 3228108eb18Smrg */ 3238108eb18Smrg 3248108eb18Smrg XtAddEventHandler (chooseSessionPopup, StructureNotifyMask, False, 3258108eb18Smrg ChooseWindowStructureNotifyXtHandler, NULL); 3268108eb18Smrg 3278108eb18Smrg XtPopup (chooseSessionPopup, XtGrabNone); 3288108eb18Smrg} 3298108eb18Smrg 3308108eb18Smrg 3318108eb18Smrg 3328108eb18Smrgstatic void 3338108eb18SmrgCheckDeleteCancel (void) 3348108eb18Smrg{ 3358108eb18Smrg if (delete_session_phase > 0) 3368108eb18Smrg { 3378108eb18Smrg XtVaSetValues (chooseSessionMessageLabel, 3388108eb18Smrg XtNforeground, save_message_background, 3398108eb18Smrg NULL); 3408108eb18Smrg 3418108eb18Smrg delete_session_phase = 0; 3428108eb18Smrg } 3438108eb18Smrg} 3448108eb18Smrg 3458108eb18Smrg 3468108eb18Smrgstatic void 3478108eb18SmrgCheckBreakLockCancel(void) 3488108eb18Smrg{ 3498108eb18Smrg if (break_lock_phase > 0) 3508108eb18Smrg { 3518108eb18Smrg XtVaSetValues (chooseSessionMessageLabel, 3528108eb18Smrg XtNforeground, save_message_background, 3538108eb18Smrg NULL); 3548108eb18Smrg 3558108eb18Smrg break_lock_phase = 0; 3568108eb18Smrg } 3578108eb18Smrg} 3588108eb18Smrg 3598108eb18Smrg 3608108eb18Smrg 3618108eb18Smrgstatic void 3628108eb18SmrgChooseSessionUp(Widget w, XEvent *event, String *params, Cardinal *numParams) 3638108eb18Smrg{ 3648108eb18Smrg XawListReturnStruct *current; 3658108eb18Smrg 3668108eb18Smrg CheckDeleteCancel (); 3678108eb18Smrg CheckBreakLockCancel (); 3688108eb18Smrg 3698108eb18Smrg current = XawListShowCurrent (chooseSessionListWidget); 3708108eb18Smrg if (current->list_index > 0) 3718108eb18Smrg SessionSelected (current->list_index - 1, True); 3728108eb18Smrg XtFree ((char *) current); 3738108eb18Smrg} 3748108eb18Smrg 3758108eb18Smrg 3768108eb18Smrgstatic void 3778108eb18SmrgChooseSessionDown(Widget w, XEvent *event, String *params, Cardinal *numParams) 3788108eb18Smrg{ 3798108eb18Smrg XawListReturnStruct *current; 3808108eb18Smrg 3818108eb18Smrg CheckDeleteCancel (); 3828108eb18Smrg CheckBreakLockCancel (); 3838108eb18Smrg 3848108eb18Smrg current = XawListShowCurrent (chooseSessionListWidget); 3858108eb18Smrg if (current->list_index < sessionNameCount - 1) 3868108eb18Smrg SessionSelected (current->list_index + 1, True); 3878108eb18Smrg XtFree ((char *) current); 3888108eb18Smrg} 3898108eb18Smrg 3908108eb18Smrg 3918108eb18Smrg 3928108eb18Smrgstatic void 3938108eb18SmrgChooseSessionBtn1Down(Widget w, XEvent *event, String *params, 3948108eb18Smrg Cardinal *numParams) 3958108eb18Smrg{ 3968108eb18Smrg XawListReturnStruct *current; 3978108eb18Smrg 3988108eb18Smrg CheckDeleteCancel (); 3998108eb18Smrg CheckBreakLockCancel (); 4008108eb18Smrg 4018108eb18Smrg current = XawListShowCurrent (chooseSessionListWidget); 4028108eb18Smrg SessionSelected (current->list_index, False /* already highlighted */); 4038108eb18Smrg XtFree ((char *) current); 4048108eb18Smrg} 4058108eb18Smrg 4068108eb18Smrg 4078108eb18Smrg 4088108eb18Smrgstatic void 4098108eb18SmrgChooseSessionLoadXtProc(Widget w, XtPointer client_data, XtPointer callData) 4108108eb18Smrg{ 4118108eb18Smrg XawListReturnStruct *current; 4128108eb18Smrg 4138108eb18Smrg CheckDeleteCancel (); 4148108eb18Smrg CheckBreakLockCancel (); 4158108eb18Smrg 4168108eb18Smrg current = XawListShowCurrent (chooseSessionListWidget); 4178108eb18Smrg 4188108eb18Smrg if (!current || !current->string || *(current->string) == '\0') 4198108eb18Smrg { 4208108eb18Smrg if (current) 4218108eb18Smrg XtFree ((char *) current); 4228108eb18Smrg#ifdef XKB 4238108eb18Smrg XkbStdBell(XtDisplay(topLevel),XtWindow(topLevel),0,XkbBI_BadValue); 4248108eb18Smrg#else 4258108eb18Smrg XBell (XtDisplay (topLevel), 0); 4268108eb18Smrg#endif 4278108eb18Smrg return; 4288108eb18Smrg } 4298108eb18Smrg 4308108eb18Smrg /* 4318108eb18Smrg * Pop down choice of sessions and start the specified session. 4328108eb18Smrg */ 4338108eb18Smrg 4348108eb18Smrg XtPopdown (chooseSessionPopup); 4358108eb18Smrg 4368108eb18Smrg if (session_name) 4378108eb18Smrg XtFree (session_name); 4388108eb18Smrg 4398108eb18Smrg session_name = XtNewString (current->string); 4408108eb18Smrg 4418108eb18Smrg XtFree ((char *) current); 4428108eb18Smrg 4438108eb18Smrg FreeSessionNames (sessionNameCount, 4448108eb18Smrg sessionNamesShort, sessionNamesLong, sessionsLocked); 4458108eb18Smrg 4468108eb18Smrg 4478108eb18Smrg /* 4488108eb18Smrg * Start the session, looking for .XSM-<session name> startup file. 4498108eb18Smrg */ 4508108eb18Smrg 4518108eb18Smrg if (!StartSession (session_name, False)) 4528108eb18Smrg UnableToLockSession (session_name); 4538108eb18Smrg} 4548108eb18Smrg 4558108eb18Smrg 4568108eb18Smrg 4578108eb18Smrgstatic void 4588108eb18SmrgChooseSessionDeleteXtProc(Widget w, XtPointer client_data, XtPointer callData) 4598108eb18Smrg{ 4608108eb18Smrg XawListReturnStruct *current; 4618108eb18Smrg int longest; 4628108eb18Smrg char *name; 4638108eb18Smrg 4648108eb18Smrg CheckBreakLockCancel (); 4658108eb18Smrg 4668108eb18Smrg current = XawListShowCurrent (chooseSessionListWidget); 4678108eb18Smrg 4688108eb18Smrg if (!current || !(name = current->string) || *name == '\0') 4698108eb18Smrg { 4708108eb18Smrg if (current) 4718108eb18Smrg XtFree ((char *) current); 4728108eb18Smrg#ifdef XKB 4738108eb18Smrg XkbStdBell(XtDisplay(w),XtWindow(w),0,XkbBI_BadValue); 4748108eb18Smrg#else 4758108eb18Smrg XBell (XtDisplay (topLevel), 0); 4768108eb18Smrg#endif 4778108eb18Smrg return; 4788108eb18Smrg } 4798108eb18Smrg 4808108eb18Smrg delete_session_phase++; 4818108eb18Smrg 4828108eb18Smrg if (delete_session_phase == 1) 4838108eb18Smrg { 4848108eb18Smrg XtVaSetValues (chooseSessionMessageLabel, 4858108eb18Smrg XtNforeground, save_message_foreground, 4868108eb18Smrg NULL); 4878108eb18Smrg 4888108eb18Smrg#ifdef XKB 4898108eb18Smrg XkbStdBell(XtDisplay(w),XtWindow(w),0,XkbBI_BadValue); 4908108eb18Smrg#else 4918108eb18Smrg XBell (XtDisplay (topLevel), 0); 4928108eb18Smrg#endif 4938108eb18Smrg } 4948108eb18Smrg else 4958108eb18Smrg { 4968108eb18Smrg XtVaSetValues (chooseSessionMessageLabel, 4978108eb18Smrg XtNforeground, save_message_background, 4988108eb18Smrg NULL); 4998108eb18Smrg 5008108eb18Smrg if (DeleteSession (name)) 5018108eb18Smrg { 5028108eb18Smrg int i, j; 5038108eb18Smrg 5048108eb18Smrg for (i = 0; i < sessionNameCount; i++) 5058108eb18Smrg { 5068108eb18Smrg if (strcmp (sessionNamesLong[i], name) == 0) 5078108eb18Smrg { 5088108eb18Smrg XtFree ((char *) sessionNamesShort[i]); 5098108eb18Smrg 5108108eb18Smrg if (sessionsLocked[i]) 5118108eb18Smrg XtFree ((char *) sessionNamesLong[i]); 5128108eb18Smrg 5138108eb18Smrg for (j = i; j < sessionNameCount - 1; j++) 5148108eb18Smrg { 5158108eb18Smrg sessionNamesLong[j] = sessionNamesLong[j + 1]; 5168108eb18Smrg sessionNamesShort[j] = sessionNamesShort[j + 1]; 5178108eb18Smrg sessionsLocked[j] = sessionsLocked[j + 1]; 5188108eb18Smrg } 5198108eb18Smrg sessionNameCount--; 5208108eb18Smrg break; 5218108eb18Smrg } 5228108eb18Smrg } 5238108eb18Smrg 5248108eb18Smrg if (sessionNameCount == 0) 5258108eb18Smrg { 5268108eb18Smrg XtSetSensitive (chooseSessionLoadButton, 0); 5278108eb18Smrg XtSetSensitive (chooseSessionDeleteButton, 0); 5288108eb18Smrg XtUnmanageChild (chooseSessionListWidget); 5298108eb18Smrg } 5308108eb18Smrg else 5318108eb18Smrg { 5328108eb18Smrg XtVaGetValues (chooseSessionListWidget, 5338108eb18Smrg XtNlongest, &longest, 5348108eb18Smrg NULL); 5358108eb18Smrg 5368108eb18Smrg XawListChange (chooseSessionListWidget, 5378108eb18Smrg sessionNamesLong, sessionNameCount, longest, True); 5388108eb18Smrg 5398108eb18Smrg SessionSelected (-1, False); 5408108eb18Smrg } 5418108eb18Smrg } 5428108eb18Smrg 5438108eb18Smrg delete_session_phase = 0; 5448108eb18Smrg } 5458108eb18Smrg 5468108eb18Smrg XtFree ((char *) current); 5478108eb18Smrg} 5488108eb18Smrg 5498108eb18Smrg 5508108eb18Smrg 5518108eb18Smrgstatic void 5528108eb18SmrgChooseSessionBreakLockXtProc(Widget w, XtPointer client_data, 5538108eb18Smrg XtPointer callData) 5548108eb18Smrg{ 5558108eb18Smrg XawListReturnStruct *current; 5568108eb18Smrg char *name; 5578108eb18Smrg 5588108eb18Smrg CheckDeleteCancel (); 5598108eb18Smrg 5608108eb18Smrg current = XawListShowCurrent (chooseSessionListWidget); 5618108eb18Smrg 5628108eb18Smrg if (!current || !(name = current->string) || *name == '\0') 5638108eb18Smrg { 5648108eb18Smrg if (current) 5658108eb18Smrg XtFree ((char *) current); 5668108eb18Smrg#ifdef XKB 5678108eb18Smrg XkbStdBell(XtDisplay(topLevel),XtWindow(topLevel),0,XkbBI_BadValue); 5688108eb18Smrg#else 5698108eb18Smrg XBell (XtDisplay (topLevel), 0); 5708108eb18Smrg#endif 5718108eb18Smrg return; 5728108eb18Smrg } 5738108eb18Smrg 5748108eb18Smrg break_lock_phase++; 5758108eb18Smrg 5768108eb18Smrg if (break_lock_phase == 1) 5778108eb18Smrg { 5788108eb18Smrg XtVaSetValues (chooseSessionMessageLabel, 5798108eb18Smrg XtNforeground, save_message_foreground, 5808108eb18Smrg NULL); 5818108eb18Smrg 5828108eb18Smrg#ifdef XKB 5838108eb18Smrg XkbStdBell(XtDisplay(topLevel),XtWindow(topLevel),0,XkbBI_BadValue); 5848108eb18Smrg#else 5858108eb18Smrg XBell (XtDisplay (topLevel), 0); 5868108eb18Smrg#endif 5878108eb18Smrg } 5888108eb18Smrg else 5898108eb18Smrg { 5908108eb18Smrg int longest; 5918108eb18Smrg 5928108eb18Smrg XtVaSetValues (chooseSessionMessageLabel, 5938108eb18Smrg XtNforeground, save_message_background, 5948108eb18Smrg NULL); 5958108eb18Smrg 5968108eb18Smrg name = sessionNamesShort[current->list_index]; 5978108eb18Smrg 5988108eb18Smrg (void) GetLockId (name); 5998108eb18Smrg 6008108eb18Smrg UnlockSession (name); 6018108eb18Smrg 6028108eb18Smrg sessionsLocked[current->list_index] = False; 6038108eb18Smrg XtFree ((char *) sessionNamesLong[current->list_index]); 6048108eb18Smrg sessionNamesLong[current->list_index] = 6058108eb18Smrg sessionNamesShort[current->list_index]; 6068108eb18Smrg 6078108eb18Smrg XtVaGetValues (chooseSessionListWidget, 6088108eb18Smrg XtNlongest, &longest, 6098108eb18Smrg NULL); 6108108eb18Smrg 6118108eb18Smrg XawListChange (chooseSessionListWidget, 6128108eb18Smrg sessionNamesLong, sessionNameCount, longest, True); 6138108eb18Smrg 6148108eb18Smrg SessionSelected (current->list_index, True); 6158108eb18Smrg 6168108eb18Smrg break_lock_phase = 0; 6178108eb18Smrg } 6188108eb18Smrg 6198108eb18Smrg XtFree ((char *) current); 6208108eb18Smrg} 6218108eb18Smrg 6228108eb18Smrg 6238108eb18Smrg 6248108eb18Smrgstatic void 6258108eb18SmrgChooseSessionFailSafeXtProc(Widget w, XtPointer client_data, 6268108eb18Smrg XtPointer callData) 6278108eb18Smrg{ 6288108eb18Smrg /* 6298108eb18Smrg * Pop down choice of sessions, and start the fail safe session. 6308108eb18Smrg */ 6318108eb18Smrg 6328108eb18Smrg CheckDeleteCancel (); 6338108eb18Smrg CheckBreakLockCancel (); 6348108eb18Smrg 6358108eb18Smrg XtPopdown (chooseSessionPopup); 6368108eb18Smrg 6378108eb18Smrg if (session_name) 6388108eb18Smrg XtFree (session_name); 6398108eb18Smrg 6408108eb18Smrg session_name = XtNewString (FAILSAFE_SESSION_NAME); 6418108eb18Smrg 6428108eb18Smrg FreeSessionNames (sessionNameCount, 6438108eb18Smrg sessionNamesShort, sessionNamesLong, sessionsLocked); 6448108eb18Smrg 6458108eb18Smrg 6468108eb18Smrg /* 6478108eb18Smrg * We don't need to check return value of StartSession in this case, 6488108eb18Smrg * because we are using the default session, and StartSession will 6498108eb18Smrg * not try to lock the session at this time. It will try to lock 6508108eb18Smrg * it as soon as the user gives the session a name. 6518108eb18Smrg */ 6528108eb18Smrg 6538108eb18Smrg StartSession (session_name, 6548108eb18Smrg True /* Use ~/.xsmstartup if found, else system.xsm */); 6558108eb18Smrg} 6568108eb18Smrg 6578108eb18Smrg 6588108eb18Smrg 6598108eb18Smrgstatic void 6608108eb18SmrgChooseSessionCancelXtProc(Widget w, XtPointer client_data, XtPointer callData) 6618108eb18Smrg{ 6628108eb18Smrg if (delete_session_phase > 0 || break_lock_phase > 0) 6638108eb18Smrg { 6648108eb18Smrg XtVaSetValues (chooseSessionMessageLabel, 6658108eb18Smrg XtNforeground, save_message_background, 6668108eb18Smrg NULL); 6678108eb18Smrg 6688108eb18Smrg delete_session_phase = 0; 6698108eb18Smrg break_lock_phase = 0; 6708108eb18Smrg } 6718108eb18Smrg else 6728108eb18Smrg EndSession (2); 6738108eb18Smrg} 6748108eb18Smrg 6758108eb18Smrg 6768108eb18Smrg 6778108eb18Smrgvoid 6788108eb18Smrgcreate_choose_session_popup(void) 6798108eb18Smrg 6808108eb18Smrg{ 6818108eb18Smrg static XtActionsRec choose_actions[] = { 6828108eb18Smrg {"ChooseSessionUp", ChooseSessionUp}, 6838108eb18Smrg {"ChooseSessionDown", ChooseSessionDown}, 6848108eb18Smrg {"ChooseSessionBtn1Down", ChooseSessionBtn1Down} 6858108eb18Smrg }; 6868108eb18Smrg 6878108eb18Smrg /* 6888108eb18Smrg * Pop up for choosing session at startup 6898108eb18Smrg */ 6908108eb18Smrg 6918108eb18Smrg chooseSessionPopup = XtVaCreatePopupShell ( 6928108eb18Smrg "chooseSessionPopup", transientShellWidgetClass, topLevel, 6938108eb18Smrg XtNallowShellResize, True, 6948108eb18Smrg NULL); 6958108eb18Smrg 6968108eb18Smrg 6978108eb18Smrg chooseSessionForm = XtVaCreateManagedWidget ( 6988108eb18Smrg "chooseSessionForm", formWidgetClass, chooseSessionPopup, 6998108eb18Smrg NULL); 7008108eb18Smrg 7018108eb18Smrg 7028108eb18Smrg chooseSessionLabel = XtVaCreateManagedWidget ( 7038108eb18Smrg "chooseSessionLabel", labelWidgetClass, chooseSessionForm, 7048108eb18Smrg XtNfromHoriz, NULL, 7058108eb18Smrg XtNfromVert, NULL, 7068108eb18Smrg XtNborderWidth, 0, 7078108eb18Smrg XtNresizable, True, 7088108eb18Smrg XtNjustify, XtJustifyCenter, 7098108eb18Smrg NULL); 7108108eb18Smrg 7118108eb18Smrg chooseSessionListWidget = XtVaCreateManagedWidget ( 7128108eb18Smrg "chooseSessionListWidget", listWidgetClass, chooseSessionForm, 7138108eb18Smrg XtNresizable, True, 7148108eb18Smrg XtNdefaultColumns, 1, 7158108eb18Smrg XtNforceColumns, True, 7168108eb18Smrg XtNfromHoriz, NULL, 7178108eb18Smrg XtNfromVert, chooseSessionLabel, 7188108eb18Smrg XtNvertDistance, 25, 7198108eb18Smrg NULL); 7208108eb18Smrg 7218108eb18Smrg chooseSessionMessageLabel = XtVaCreateManagedWidget ( 7228108eb18Smrg "chooseSessionMessageLabel", labelWidgetClass, chooseSessionForm, 7238108eb18Smrg XtNfromHoriz, NULL, 7248108eb18Smrg XtNfromVert, chooseSessionListWidget, 7258108eb18Smrg XtNborderWidth, 0, 7268108eb18Smrg XtNresizable, True, 7278108eb18Smrg XtNjustify, XtJustifyCenter, 7288108eb18Smrg NULL); 7298108eb18Smrg 7308108eb18Smrg chooseSessionLoadButton = XtVaCreateManagedWidget ( 7318108eb18Smrg "chooseSessionLoadButton", commandWidgetClass, chooseSessionForm, 7328108eb18Smrg XtNfromHoriz, NULL, 7338108eb18Smrg XtNfromVert, chooseSessionMessageLabel, 7348108eb18Smrg NULL); 7358108eb18Smrg 7368108eb18Smrg XtAddCallback (chooseSessionLoadButton, XtNcallback, 7371a650d1eSmrg ChooseSessionLoadXtProc, NULL); 7388108eb18Smrg 7398108eb18Smrg chooseSessionDeleteButton = XtVaCreateManagedWidget ( 7408108eb18Smrg "chooseSessionDeleteButton", commandWidgetClass, chooseSessionForm, 7418108eb18Smrg XtNfromHoriz, chooseSessionLoadButton, 7428108eb18Smrg XtNfromVert, chooseSessionMessageLabel, 7438108eb18Smrg NULL); 7448108eb18Smrg 7458108eb18Smrg XtAddCallback (chooseSessionDeleteButton, XtNcallback, 7461a650d1eSmrg ChooseSessionDeleteXtProc, NULL); 7478108eb18Smrg 7488108eb18Smrg chooseSessionBreakLockButton = XtVaCreateManagedWidget ( 7498108eb18Smrg "chooseSessionBreakLockButton", 7508108eb18Smrg commandWidgetClass, chooseSessionForm, 7518108eb18Smrg XtNfromHoriz, chooseSessionDeleteButton, 7528108eb18Smrg XtNfromVert, chooseSessionMessageLabel, 7538108eb18Smrg NULL); 7548108eb18Smrg 7558108eb18Smrg XtAddCallback (chooseSessionBreakLockButton, XtNcallback, 7561a650d1eSmrg ChooseSessionBreakLockXtProc, NULL); 7578108eb18Smrg 7588108eb18Smrg chooseSessionFailSafeButton = XtVaCreateManagedWidget ( 7598108eb18Smrg "chooseSessionFailSafeButton", commandWidgetClass, chooseSessionForm, 7608108eb18Smrg XtNfromHoriz, chooseSessionBreakLockButton, 7618108eb18Smrg XtNfromVert, chooseSessionMessageLabel, 7628108eb18Smrg NULL); 7638108eb18Smrg 7648108eb18Smrg XtAddCallback (chooseSessionFailSafeButton, XtNcallback, 7651a650d1eSmrg ChooseSessionFailSafeXtProc, NULL); 7668108eb18Smrg 7678108eb18Smrg 7688108eb18Smrg chooseSessionCancelButton = XtVaCreateManagedWidget ( 7698108eb18Smrg "chooseSessionCancelButton", commandWidgetClass, chooseSessionForm, 7708108eb18Smrg XtNfromHoriz, chooseSessionFailSafeButton, 7718108eb18Smrg XtNfromVert, chooseSessionMessageLabel, 7728108eb18Smrg NULL); 7738108eb18Smrg 7748108eb18Smrg XtAddCallback (chooseSessionCancelButton, XtNcallback, 7751a650d1eSmrg ChooseSessionCancelXtProc, NULL); 7768108eb18Smrg 7778108eb18Smrg XtAppAddActions (appContext, choose_actions, XtNumber (choose_actions)); 7788108eb18Smrg 7798108eb18Smrg XtInstallAllAccelerators (chooseSessionListWidget, chooseSessionPopup); 7808108eb18Smrg} 781