info.c revision 1a650d1e
18108eb18Smrg/* $Xorg: info.c,v 1.5 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/info.c,v 1.5 2001/01/17 23:46:28 dawes Exp $ */ 278108eb18Smrg 288108eb18Smrg#include "xsm.h" 298108eb18Smrg#include "restart.h" 308108eb18Smrg#include "popup.h" 318108eb18Smrg#include "info.h" 328108eb18Smrg#include "prop.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#include <X11/Xaw/SimpleMenu.h> 398108eb18Smrg#include <X11/Xaw/MenuButton.h> 408108eb18Smrg#include <X11/Xaw/SmeBSB.h> 418108eb18Smrg#include <X11/Xaw/AsciiText.h> 428108eb18Smrg 438108eb18Smrgstatic Pixmap checkBitmap; 448108eb18Smrg 458108eb18SmrgWidget clientInfoPopup; 461a650d1eSmrgstatic Widget clientInfoForm; 471a650d1eSmrgstatic Widget viewPropButton; 481a650d1eSmrgstatic Widget cloneButton; 491a650d1eSmrgstatic Widget killClientButton; 501a650d1eSmrgstatic Widget clientInfoDoneButton; 511a650d1eSmrgstatic Widget restartHintButton; 521a650d1eSmrgstatic Widget restartHintMenu; 531a650d1eSmrgstatic Widget restartIfRunning; 541a650d1eSmrgstatic Widget restartAnyway; 551a650d1eSmrgstatic Widget restartImmediately; 561a650d1eSmrgstatic Widget restartNever; 571a650d1eSmrgWidget clientListWidget; 581a650d1eSmrgstatic Widget noClientsLabel; 591a650d1eSmrgWidget manualRestartLabel; 601a650d1eSmrgWidget manualRestartCommands; 618108eb18Smrg 628108eb18SmrgWidget clientPropPopup; 631a650d1eSmrgstatic Widget clientPropForm; 641a650d1eSmrgstatic Widget clientPropDoneButton; 651a650d1eSmrgstatic Widget clientPropTextWidget; 668108eb18Smrg 678108eb18Smrg 688108eb18Smrg 698108eb18Smrgvoid 708108eb18SmrgShowHint(ClientRec *client) 718108eb18Smrg{ 728108eb18Smrg static Widget active = NULL; 738108eb18Smrg int hint = client->restartHint; 748108eb18Smrg 758108eb18Smrg if (active) 768108eb18Smrg XtVaSetValues (active, XtNleftBitmap, None, NULL); 778108eb18Smrg 788108eb18Smrg if (hint == SmRestartIfRunning) 798108eb18Smrg active = restartIfRunning; 808108eb18Smrg else if (hint == SmRestartAnyway) 818108eb18Smrg active = restartAnyway; 828108eb18Smrg else if (hint == SmRestartImmediately) 838108eb18Smrg active = restartImmediately; 848108eb18Smrg else if (hint == SmRestartNever) 858108eb18Smrg active = restartNever; 868108eb18Smrg 878108eb18Smrg XtVaSetValues (active, XtNleftBitmap, checkBitmap, NULL); 888108eb18Smrg} 898108eb18Smrg 908108eb18Smrg 918108eb18Smrg 928108eb18Smrgtypedef struct { 938108eb18Smrg char *bufStart; 948108eb18Smrg char *bufPtr; 958108eb18Smrg int bufSize; 968108eb18Smrg int bytesLeft; 978108eb18Smrg} Buffer; 988108eb18Smrg 998108eb18Smrg#define BUF_START_SIZE 1024 1008108eb18Smrg#define BUF_GROW_SIZE 256 1018108eb18Smrg 1028108eb18Smrg 1038108eb18Smrgstatic void 1048108eb18SmrgAppendStr(Buffer *buffer, char *str) 1058108eb18Smrg{ 1068108eb18Smrg int len = strlen (str); 1078108eb18Smrg 1088108eb18Smrg if ((buffer->bytesLeft - 1) < len) 1098108eb18Smrg { 1108108eb18Smrg int newBufSize = buffer->bufSize + len + BUF_GROW_SIZE; 1118108eb18Smrg int bytesUsed = buffer->bufPtr - buffer->bufStart; 1121a650d1eSmrg char *newbuf = realloc (buffer->bufStart, newBufSize); 1131a650d1eSmrg if (newbuf != NULL) { 1141a650d1eSmrg newbuf[bytesUsed] = '\0'; 1151a650d1eSmrg buffer->bufStart = newbuf; 1161a650d1eSmrg buffer->bufPtr = newbuf + bytesUsed; 1171a650d1eSmrg buffer->bufSize = newBufSize; 1181a650d1eSmrg buffer->bytesLeft = newBufSize - bytesUsed; 1191a650d1eSmrg } else { 1201a650d1eSmrg perror("realloc failed, aborting"); 1211a650d1eSmrg exit(1); 1221a650d1eSmrg } 1238108eb18Smrg } 1248108eb18Smrg 1258108eb18Smrg strcat (buffer->bufPtr, str); 1268108eb18Smrg buffer->bufPtr += len; 1278108eb18Smrg buffer->bytesLeft -= len; 1288108eb18Smrg} 1298108eb18Smrg 1308108eb18Smrg 1318108eb18Smrgvoid 1328108eb18SmrgDisplayProps(ClientRec *client) 1338108eb18Smrg{ 1348108eb18Smrg int index; 1358108eb18Smrg List *pl, *pj, *vl; 1368108eb18Smrg PropValue *pval; 1378108eb18Smrg Buffer buffer; 1388108eb18Smrg static int first_time = 1; 1398108eb18Smrg 1408108eb18Smrg for (index = 0; index < numClientListNames; index++) 1418108eb18Smrg if (clientListRecs[index] == client) 1428108eb18Smrg break; 1438108eb18Smrg 1448108eb18Smrg if (index >= numClientListNames) 1458108eb18Smrg return; 1468108eb18Smrg 1478108eb18Smrg buffer.bufStart = buffer.bufPtr = (char *) malloc (BUF_START_SIZE); 1488108eb18Smrg buffer.bufSize = buffer.bytesLeft = BUF_START_SIZE; 1498108eb18Smrg buffer.bufStart[0] = '\0'; 1508108eb18Smrg 1518108eb18Smrg if (ListCount (client->props) > 0) 1528108eb18Smrg { 1538108eb18Smrg char number[10]; 1548108eb18Smrg char *ptr; 1558108eb18Smrg 1568108eb18Smrg AppendStr (&buffer, "*** ID = "); 1578108eb18Smrg AppendStr (&buffer, client->clientId); 1588108eb18Smrg AppendStr (&buffer, " ***\n\n"); 1598108eb18Smrg 1608108eb18Smrg for (pl = ListFirst (client->props); pl; pl = ListNext (pl)) 1618108eb18Smrg { 1628108eb18Smrg Prop *pprop = (Prop *) pl->thing; 1638108eb18Smrg 1648108eb18Smrg AppendStr (&buffer, "Name: "); 1658108eb18Smrg AppendStr (&buffer, pprop->name); 1668108eb18Smrg AppendStr (&buffer, "\n"); 1678108eb18Smrg AppendStr (&buffer, "Type: "); 1688108eb18Smrg AppendStr (&buffer, pprop->type); 1698108eb18Smrg AppendStr (&buffer, "\n"); 1708108eb18Smrg AppendStr (&buffer, "Num values: "); 1711a650d1eSmrg snprintf (number, sizeof(number), "%d", ListCount (pprop->values)); 1728108eb18Smrg AppendStr (&buffer, number); 1738108eb18Smrg AppendStr (&buffer, "\n"); 1748108eb18Smrg 1758108eb18Smrg if (strcmp (pprop->type, SmCARD8) == 0) 1768108eb18Smrg { 1778108eb18Smrg char *card8; 1788108eb18Smrg int value; 1798108eb18Smrg 1808108eb18Smrg vl = ListFirst (pprop->values); 1818108eb18Smrg pval = (PropValue *) vl->thing; 1828108eb18Smrg 1838108eb18Smrg card8 = pval->value; 1848108eb18Smrg value = *card8; 1858108eb18Smrg 1868108eb18Smrg AppendStr (&buffer, "Value 1: "); 1871a650d1eSmrg snprintf (number, sizeof(number), "%d", value); 1888108eb18Smrg AppendStr (&buffer, number); 1898108eb18Smrg 1908108eb18Smrg if (strcmp (pprop->name, SmRestartStyleHint) == 0) 1918108eb18Smrg { 1928108eb18Smrg if (value == SmRestartAnyway) 1938108eb18Smrg AppendStr (&buffer, " (Restart Anyway)"); 1948108eb18Smrg else if (value == SmRestartImmediately) 1958108eb18Smrg AppendStr (&buffer, " (Restart Immediately)"); 1968108eb18Smrg else if (value == SmRestartNever) 1978108eb18Smrg AppendStr (&buffer, " (Restart Never)"); 1988108eb18Smrg else 1998108eb18Smrg AppendStr (&buffer, " (Restart If Running)"); 2008108eb18Smrg } 2018108eb18Smrg 2028108eb18Smrg AppendStr (&buffer, "\n"); 2038108eb18Smrg } 2048108eb18Smrg else 2058108eb18Smrg { 2068108eb18Smrg int propnum = 0; 2078108eb18Smrg 2088108eb18Smrg for (pj = ListFirst (pprop->values); pj; pj = ListNext (pj)) 2098108eb18Smrg { 2108108eb18Smrg propnum++; 2118108eb18Smrg 2128108eb18Smrg pval = (PropValue *) pj->thing; 2138108eb18Smrg AppendStr (&buffer, "Value "); 2141a650d1eSmrg snprintf (number, sizeof(number), "%d", propnum); 2158108eb18Smrg AppendStr (&buffer, number); 2168108eb18Smrg AppendStr (&buffer, ": "); 2178108eb18Smrg AppendStr (&buffer, (char *) pval->value); 2188108eb18Smrg AppendStr (&buffer, "\n"); 2198108eb18Smrg } 2208108eb18Smrg } 2218108eb18Smrg 2228108eb18Smrg AppendStr (&buffer, "\n"); 2238108eb18Smrg } 2248108eb18Smrg 2258108eb18Smrg XtVaSetValues (clientPropTextWidget, 2268108eb18Smrg XtNstring, buffer.bufStart, 2278108eb18Smrg NULL); 2288108eb18Smrg 2298108eb18Smrg sprintf (buffer.bufStart, 2308108eb18Smrg "SM Properties : %s", clientListNames[index]); 2318108eb18Smrg 2328108eb18Smrg ptr = Strstr (buffer.bufStart, ") Restart"); 2338108eb18Smrg if (ptr) *(ptr + 1) = '\0'; 2348108eb18Smrg 2358108eb18Smrg XtVaSetValues (clientPropPopup, 2368108eb18Smrg XtNtitle, buffer.bufStart, 2378108eb18Smrg XtNiconName, buffer.bufStart, 2388108eb18Smrg NULL); 2398108eb18Smrg 2408108eb18Smrg if (client_prop_visible) 2418108eb18Smrg { 2428108eb18Smrg /* Make sure it is visible */ 2438108eb18Smrg 2448108eb18Smrg XMapRaised (XtDisplay (topLevel), XtWindow (clientPropPopup)); 2458108eb18Smrg } 2468108eb18Smrg else 2478108eb18Smrg { 2488108eb18Smrg PopupPopup (mainWindow, clientPropPopup, 2498108eb18Smrg False, first_time, 50, 150, "DelPropWinAction()"); 2508108eb18Smrg 2518108eb18Smrg client_prop_visible = 1; 2528108eb18Smrg 2538108eb18Smrg if (first_time) 2548108eb18Smrg first_time = 0; 2558108eb18Smrg } 2568108eb18Smrg } 2578108eb18Smrg 2588108eb18Smrg free (buffer.bufStart); 2598108eb18Smrg} 2608108eb18Smrg 2618108eb18Smrg 2628108eb18Smrg 2638108eb18Smrgstatic void 2648108eb18SmrgClientListXtProc(Widget w, XtPointer client_data, XtPointer callData) 2658108eb18Smrg{ 2668108eb18Smrg XawListReturnStruct *current = (XawListReturnStruct *) callData; 2678108eb18Smrg ClientRec *client; 2688108eb18Smrg 2698108eb18Smrg if (!current || current->list_index < 0) 2708108eb18Smrg return; 2718108eb18Smrg 2728108eb18Smrg client = clientListRecs[current->list_index]; 2738108eb18Smrg ShowHint (client); 2748108eb18Smrg current_client_selected = current->list_index; 2758108eb18Smrg if (client_prop_visible) 2768108eb18Smrg DisplayProps (client); 2778108eb18Smrg} 2788108eb18Smrg 2798108eb18Smrg 2808108eb18Smrg 2818108eb18Smrg 2828108eb18Smrgstatic void 2838108eb18SmrgViewPropXtProc(Widget w, XtPointer client_data, XtPointer callData) 2848108eb18Smrg{ 2858108eb18Smrg ClientRec *client; 2868108eb18Smrg XawListReturnStruct *current; 2878108eb18Smrg 2888108eb18Smrg current = XawListShowCurrent (clientListWidget); 2898108eb18Smrg 2908108eb18Smrg if (!current || current->list_index < 0) 2918108eb18Smrg { 2928108eb18Smrg if (current) 2938108eb18Smrg XtFree ((char *) current); 2948108eb18Smrg return; 2958108eb18Smrg } 2968108eb18Smrg 2978108eb18Smrg client = clientListRecs[current->list_index]; 2988108eb18Smrg DisplayProps (client); 2998108eb18Smrg XtFree ((char *) current); 3008108eb18Smrg} 3018108eb18Smrg 3028108eb18Smrg 3038108eb18Smrg 3048108eb18Smrgstatic void 3058108eb18SmrgCloneXtProc(Widget w, XtPointer client_data, XtPointer callData) 3068108eb18Smrg{ 3078108eb18Smrg ClientRec *client; 3088108eb18Smrg XawListReturnStruct *current; 3098108eb18Smrg 3108108eb18Smrg current = XawListShowCurrent (clientListWidget); 3118108eb18Smrg 3128108eb18Smrg if (!current || current->list_index < 0) 3138108eb18Smrg { 3148108eb18Smrg if (current) 3158108eb18Smrg XtFree ((char *) current); 3168108eb18Smrg return; 3178108eb18Smrg } 3188108eb18Smrg 3198108eb18Smrg client = clientListRecs[current->list_index]; 3208108eb18Smrg 3218108eb18Smrg if (client) 3228108eb18Smrg Clone (client, False /* don't use saved state */); 3238108eb18Smrg 3248108eb18Smrg XtFree ((char *) current); 3258108eb18Smrg} 3268108eb18Smrg 3278108eb18Smrg 3288108eb18Smrg 3298108eb18Smrgstatic void 3308108eb18SmrgKillClientXtProc(Widget w, XtPointer client_data, XtPointer callData) 3318108eb18Smrg{ 3328108eb18Smrg ClientRec *client; 3338108eb18Smrg XawListReturnStruct *current; 3348108eb18Smrg 3358108eb18Smrg current = XawListShowCurrent (clientListWidget); 3368108eb18Smrg 3378108eb18Smrg if (!current || current->list_index < 0) 3388108eb18Smrg { 3398108eb18Smrg if (current) 3408108eb18Smrg XtFree ((char *) current); 3418108eb18Smrg return; 3428108eb18Smrg } 3438108eb18Smrg 3448108eb18Smrg client = clientListRecs[current->list_index]; 3458108eb18Smrg 3468108eb18Smrg SmsDie (client->smsConn); 3478108eb18Smrg 3488108eb18Smrg XtFree ((char *) current); 3498108eb18Smrg} 3508108eb18Smrg 3518108eb18Smrg 3528108eb18Smrg 3538108eb18Smrgstatic void 3548108eb18SmrglistDoneXtProc(Widget w, XtPointer client_data, XtPointer callData) 3558108eb18Smrg{ 3568108eb18Smrg XtPopdown (clientInfoPopup); 3578108eb18Smrg client_info_visible = 0; 3588108eb18Smrg} 3598108eb18Smrg 3608108eb18Smrg 3618108eb18Smrg 3628108eb18Smrgchar * 3638108eb18SmrgGetProgramName(char *fullname) 3648108eb18Smrg{ 3658108eb18Smrg char *lastSlash = NULL; 3668108eb18Smrg int i; 3678108eb18Smrg 3688108eb18Smrg for (i = 0; i < (int) strlen (fullname); i++) 3698108eb18Smrg if (fullname[i] == '/') 3708108eb18Smrg lastSlash = &fullname[i]; 3718108eb18Smrg 3728108eb18Smrg if (lastSlash) 3738108eb18Smrg return (lastSlash + 1); 3748108eb18Smrg else 3758108eb18Smrg return (fullname); 3768108eb18Smrg} 3778108eb18Smrg 3788108eb18Smrg 3798108eb18Smrg 3808108eb18Smrgvoid 3818108eb18SmrgUpdateClientList(void) 3828108eb18Smrg{ 3838108eb18Smrg ClientRec *client; 3848108eb18Smrg char *progName, *hostname, *tmp1, *tmp2; 3858108eb18Smrg String clientInfo; 3868108eb18Smrg int maxlen1, maxlen2; 3878108eb18Smrg char extraBuf1[80], extraBuf2[80]; 3888108eb18Smrg char *restart_service_prop; 3898108eb18Smrg List *cl, *pl; 3908108eb18Smrg int i, k; 3918108eb18Smrg static int reenable_asap = 0; 3928108eb18Smrg 3938108eb18Smrg if (clientListNames) 3948108eb18Smrg { 3958108eb18Smrg /* 3968108eb18Smrg * Free the previous list of names. Xaw doesn't make a copy of 3978108eb18Smrg * our list, so we need to keep it around. 3988108eb18Smrg */ 3998108eb18Smrg 4008108eb18Smrg for (i = 0; i < numClientListNames; i++) 4018108eb18Smrg XtFree (clientListNames[i]); 4028108eb18Smrg 4038108eb18Smrg XtFree ((char *) clientListNames); 4048108eb18Smrg 4058108eb18Smrg clientListNames = NULL; 4068108eb18Smrg } 4078108eb18Smrg 4088108eb18Smrg if (clientListRecs) 4098108eb18Smrg { 4108108eb18Smrg /* 4118108eb18Smrg * Free the mapping of client names to client records 4128108eb18Smrg */ 4138108eb18Smrg 4148108eb18Smrg XtFree ((char *) clientListRecs); 4158108eb18Smrg clientListRecs = NULL; 4168108eb18Smrg } 4178108eb18Smrg 4188108eb18Smrg maxlen1 = maxlen2 = 0; 4198108eb18Smrg numClientListNames = 0; 4208108eb18Smrg 4218108eb18Smrg for (cl = ListFirst (RunningList); cl; cl = ListNext (cl)) 4228108eb18Smrg { 4238108eb18Smrg client = (ClientRec *) cl->thing; 4248108eb18Smrg 4258108eb18Smrg progName = NULL; 4268108eb18Smrg restart_service_prop = NULL; 4278108eb18Smrg 4288108eb18Smrg for (pl = ListFirst (client->props); pl; pl = ListNext (pl)) 4298108eb18Smrg { 4308108eb18Smrg Prop *pprop = (Prop *) pl->thing; 4318108eb18Smrg List *vl = ListFirst (pprop->values); 4328108eb18Smrg if (vl != NULL) 4338108eb18Smrg { 4348108eb18Smrg PropValue *pval = (PropValue *) vl->thing; 4358108eb18Smrg 4368108eb18Smrg if (strcmp (pprop->name, SmProgram) == 0) 4378108eb18Smrg { 4388108eb18Smrg progName = GetProgramName ((char *) pval->value); 4398108eb18Smrg 4408108eb18Smrg if ((int) strlen (progName) > maxlen1) 4418108eb18Smrg maxlen1 = strlen (progName); 4428108eb18Smrg } 4438108eb18Smrg else if (strcmp (pprop->name, "_XC_RestartService") == 0) 4448108eb18Smrg { 4458108eb18Smrg restart_service_prop = (char *) pval->value; 4468108eb18Smrg } 4478108eb18Smrg } 4488108eb18Smrg } 4498108eb18Smrg 4508108eb18Smrg if (!progName) 4518108eb18Smrg continue; 4528108eb18Smrg 4538108eb18Smrg if (restart_service_prop) 4548108eb18Smrg tmp1 = restart_service_prop; 4558108eb18Smrg else if (client->clientHostname) 4568108eb18Smrg tmp1 = client->clientHostname; 4578108eb18Smrg else 4588108eb18Smrg continue; 4598108eb18Smrg 4608108eb18Smrg if ((tmp2 = (char *) strchr (tmp1, '/')) == NULL) 4618108eb18Smrg hostname = tmp1; 4628108eb18Smrg else 4638108eb18Smrg hostname = tmp2 + 1; 4648108eb18Smrg 4658108eb18Smrg if ((int) strlen (hostname) > maxlen2) 4668108eb18Smrg maxlen2 = strlen (hostname); 4678108eb18Smrg 4688108eb18Smrg numClientListNames++; 4698108eb18Smrg } 4708108eb18Smrg 4718108eb18Smrg if (numClientListNames == 0) 4728108eb18Smrg { 4738108eb18Smrg XtSetSensitive (viewPropButton, 0); 4748108eb18Smrg XtSetSensitive (cloneButton, 0); 4758108eb18Smrg XtSetSensitive (killClientButton, 0); 4768108eb18Smrg XtSetSensitive (restartHintButton, 0); 4778108eb18Smrg 4788108eb18Smrg XtUnmanageChild (clientListWidget); 4798108eb18Smrg XtManageChild (noClientsLabel); 4808108eb18Smrg 4818108eb18Smrg reenable_asap = 1; 4828108eb18Smrg 4838108eb18Smrg return; 4848108eb18Smrg } 4858108eb18Smrg 4868108eb18Smrg if (reenable_asap) 4878108eb18Smrg { 4888108eb18Smrg XtSetSensitive (viewPropButton, 1); 4898108eb18Smrg XtSetSensitive (cloneButton, 1); 4908108eb18Smrg XtSetSensitive (killClientButton, 1); 4918108eb18Smrg XtSetSensitive (restartHintButton, 1); 4928108eb18Smrg 4938108eb18Smrg XtUnmanageChild (noClientsLabel); 4948108eb18Smrg XtManageChild (clientListWidget); 4958108eb18Smrg 4968108eb18Smrg reenable_asap = 0; 4978108eb18Smrg } 4988108eb18Smrg 4998108eb18Smrg clientListNames = (String *) XtMalloc ( 5008108eb18Smrg numClientListNames * sizeof (String)); 5018108eb18Smrg clientListRecs = (ClientRec **) XtMalloc ( 5028108eb18Smrg numClientListNames * sizeof (ClientRec *)); 5038108eb18Smrg 5048108eb18Smrg i = 0; 5058108eb18Smrg for (cl = ListFirst (RunningList); cl; cl = ListNext (cl)) 5068108eb18Smrg { 5078108eb18Smrg ClientRec *client = (ClientRec *) cl->thing; 5088108eb18Smrg int extra1, extra2; 5098108eb18Smrg char *hint; 5108108eb18Smrg 5118108eb18Smrg progName = NULL; 5128108eb18Smrg restart_service_prop = NULL; 5138108eb18Smrg 5148108eb18Smrg for (pl = ListFirst (client->props); pl; pl = ListNext (pl)) 5158108eb18Smrg { 5168108eb18Smrg Prop *pprop = (Prop *) pl->thing; 5178108eb18Smrg List *vl = ListFirst (pprop->values); 5188108eb18Smrg 5198108eb18Smrg if (vl != NULL) 5208108eb18Smrg { 5218108eb18Smrg PropValue *pval = (PropValue *) vl->thing; 5228108eb18Smrg if (strcmp (pprop->name, SmProgram) == 0) 5238108eb18Smrg { 5248108eb18Smrg progName = GetProgramName ((char *) pval->value); 5258108eb18Smrg } 5268108eb18Smrg else if (strcmp (pprop->name, "_XC_RestartService") == 0) 5278108eb18Smrg { 5288108eb18Smrg restart_service_prop = (char *) pval->value; 5298108eb18Smrg } 5308108eb18Smrg } 5318108eb18Smrg } 5328108eb18Smrg 5338108eb18Smrg if (!progName) 5348108eb18Smrg continue; 5358108eb18Smrg 5368108eb18Smrg if (restart_service_prop) 5378108eb18Smrg tmp1 = restart_service_prop; 5388108eb18Smrg else if (client->clientHostname) 5398108eb18Smrg tmp1 = client->clientHostname; 5408108eb18Smrg else 5418108eb18Smrg continue; 5428108eb18Smrg 5438108eb18Smrg if ((tmp2 = (char *) strchr (tmp1, '/')) == NULL) 5448108eb18Smrg hostname = tmp1; 5458108eb18Smrg else 5468108eb18Smrg hostname = tmp2 + 1; 5478108eb18Smrg 5488108eb18Smrg extra1 = maxlen1 - strlen (progName) + 5; 5498108eb18Smrg extra2 = maxlen2 - strlen (hostname); 5508108eb18Smrg 5518108eb18Smrg if (client->restartHint == SmRestartIfRunning) 5528108eb18Smrg hint = "Restart If Running"; 5538108eb18Smrg else if (client->restartHint == SmRestartAnyway) 5548108eb18Smrg hint = "Restart Anyway"; 5558108eb18Smrg else if (client->restartHint == SmRestartImmediately) 5568108eb18Smrg hint = "Restart Immediately"; 5578108eb18Smrg else if (client->restartHint == SmRestartNever) 5588108eb18Smrg hint = "Restart Never"; 5598108eb18Smrg else 5608108eb18Smrg hint = ""; 5618108eb18Smrg 5628108eb18Smrg clientInfo = (String) XtMalloc (strlen (progName) + 5638108eb18Smrg extra1 + extra2 + 3 + strlen (hostname) + 3 + strlen (hint) + 1); 5648108eb18Smrg 5658108eb18Smrg for (k = 0; k < extra1; k++) 5668108eb18Smrg extraBuf1[k] = ' '; 5678108eb18Smrg extraBuf1[extra1] = '\0'; 5688108eb18Smrg 5698108eb18Smrg for (k = 0; k < extra2; k++) 5708108eb18Smrg extraBuf2[k] = ' '; 5718108eb18Smrg extraBuf2[extra2] = '\0'; 5728108eb18Smrg 5738108eb18Smrg sprintf (clientInfo, "%s%s (%s%s) %s", progName, extraBuf1, 5748108eb18Smrg hostname, extraBuf2, hint); 5758108eb18Smrg 5768108eb18Smrg clientListRecs[i] = client; 5778108eb18Smrg clientListNames[i++] = clientInfo; 5788108eb18Smrg } 5798108eb18Smrg 5808108eb18Smrg XawListChange (clientListWidget, 5818108eb18Smrg clientListNames, numClientListNames, 0, True); 5828108eb18Smrg} 5838108eb18Smrg 5848108eb18Smrg 5858108eb18Smrg 5868108eb18Smrgstatic void 5878108eb18SmrgRestartHintXtProc(Widget w, XtPointer client_data, XtPointer callData) 5888108eb18Smrg{ 5898108eb18Smrg XawListReturnStruct *current; 5908108eb18Smrg ClientRec *client; 5918108eb18Smrg Widget active; 5928108eb18Smrg int found = 0; 5938108eb18Smrg List *pl; 5948108eb18Smrg char hint; 5958108eb18Smrg 5968108eb18Smrg current = XawListShowCurrent (clientListWidget); 5978108eb18Smrg 5988108eb18Smrg if (!current || current->list_index < 0) 5998108eb18Smrg { 6008108eb18Smrg if (current) 6018108eb18Smrg XtFree ((char *) current); 6028108eb18Smrg return; 6038108eb18Smrg } 6048108eb18Smrg 6058108eb18Smrg client = clientListRecs[current->list_index]; 6068108eb18Smrg 6078108eb18Smrg active = XawSimpleMenuGetActiveEntry (restartHintMenu); 6088108eb18Smrg 6098108eb18Smrg if (active == restartIfRunning) 6108108eb18Smrg hint = SmRestartIfRunning; 6118108eb18Smrg else if (active == restartAnyway) 6128108eb18Smrg hint = SmRestartAnyway; 6138108eb18Smrg else if (active == restartImmediately) 6148108eb18Smrg hint = SmRestartImmediately; 6158108eb18Smrg else if (active == restartNever) 6168108eb18Smrg hint = SmRestartNever; 6178108eb18Smrg else 6188108eb18Smrg { 6198108eb18Smrg XtFree ((char *) current); 6208108eb18Smrg return; 6218108eb18Smrg } 6228108eb18Smrg 6238108eb18Smrg client->restartHint = hint; 6248108eb18Smrg 6258108eb18Smrg for (pl = ListFirst (client->props); pl; pl = ListNext (pl)) 6268108eb18Smrg { 6278108eb18Smrg Prop *pprop = (Prop *) pl->thing; 6288108eb18Smrg 6298108eb18Smrg if (strcmp (SmRestartStyleHint, pprop->name) == 0) 6308108eb18Smrg { 6318108eb18Smrg List *vl = ListFirst (pprop->values); 6328108eb18Smrg 6338108eb18Smrg PropValue *pval = (PropValue *) vl->thing; 6348108eb18Smrg 6358108eb18Smrg *((char *) (pval->value)) = hint; 6368108eb18Smrg found = 1; 6378108eb18Smrg break; 6388108eb18Smrg } 6398108eb18Smrg } 6408108eb18Smrg 6418108eb18Smrg if (!found) 6428108eb18Smrg { 6438108eb18Smrg SmProp prop; 6448108eb18Smrg SmPropValue propval; 6458108eb18Smrg 6468108eb18Smrg prop.name = SmRestartStyleHint; 6478108eb18Smrg prop.type = SmCARD8; 6488108eb18Smrg prop.num_vals = 1; 6498108eb18Smrg prop.vals = &propval; 6508108eb18Smrg propval.value = (SmPointer) &hint; 6518108eb18Smrg propval.length = 1; 6528108eb18Smrg 6538108eb18Smrg SetProperty (client, &prop, False /* don't free it */); 6548108eb18Smrg } 6558108eb18Smrg 6568108eb18Smrg UpdateClientList (); 6578108eb18Smrg XawListHighlight (clientListWidget, current_client_selected); 6588108eb18Smrg ShowHint (client); 6598108eb18Smrg 6608108eb18Smrg if (client_prop_visible && clientListRecs && 6618108eb18Smrg clientListRecs[current_client_selected] == client) 6628108eb18Smrg { 6638108eb18Smrg DisplayProps (client); 6648108eb18Smrg } 6658108eb18Smrg 6668108eb18Smrg XtFree ((char *) current); 6678108eb18Smrg} 6688108eb18Smrg 6698108eb18Smrg 6708108eb18Smrg 6718108eb18Smrgstatic void 6728108eb18SmrgclientPropDoneXtProc(Widget w, XtPointer client_data, XtPointer callData) 6738108eb18Smrg{ 6748108eb18Smrg XtPopdown (clientPropPopup); 6758108eb18Smrg client_prop_visible = 0; 6768108eb18Smrg} 6778108eb18Smrg 6788108eb18Smrg 6798108eb18Smrg 6808108eb18Smrgvoid 6818108eb18SmrgClientInfoStructureNotifyXtHandler(Widget w, XtPointer closure, 6828108eb18Smrg XEvent *event, 6838108eb18Smrg Boolean *continue_to_dispatch) 6848108eb18Smrg{ 6858108eb18Smrg if (event->type == MapNotify) 6868108eb18Smrg { 6878108eb18Smrg UpdateClientList (); 6888108eb18Smrg 6898108eb18Smrg if (current_client_selected >= 0) 6908108eb18Smrg XawListHighlight (clientListWidget, current_client_selected); 6918108eb18Smrg 6928108eb18Smrg XtRemoveEventHandler (clientInfoPopup, StructureNotifyMask, False, 6938108eb18Smrg ClientInfoStructureNotifyXtHandler, NULL); 6948108eb18Smrg } 6958108eb18Smrg} 6968108eb18Smrg 6978108eb18Smrg 6988108eb18Smrg 6998108eb18Smrgvoid 7008108eb18SmrgClientInfoXtProc(Widget w, XtPointer client_data, XtPointer callData) 7018108eb18Smrg{ 7028108eb18Smrg static int first_time = 1; 7038108eb18Smrg 7048108eb18Smrg if (client_info_visible) 7058108eb18Smrg { 7068108eb18Smrg /* Make sure it is visible */ 7078108eb18Smrg 7088108eb18Smrg XMapRaised (XtDisplay (topLevel), XtWindow (clientInfoPopup)); 7098108eb18Smrg } 7108108eb18Smrg else 7118108eb18Smrg { 7128108eb18Smrg UpdateClientList (); 7138108eb18Smrg 7148108eb18Smrg if (clientListRecs && clientListRecs[0]) 7158108eb18Smrg { 7168108eb18Smrg current_client_selected = 0; 7178108eb18Smrg XawListHighlight (clientListWidget, 0); 7188108eb18Smrg ShowHint (clientListRecs[0]); 7198108eb18Smrg if (client_prop_visible) 7208108eb18Smrg DisplayProps (clientListRecs[0]); 7218108eb18Smrg } 7228108eb18Smrg else 7238108eb18Smrg current_client_selected = -1; 7248108eb18Smrg 7258108eb18Smrg if (first_time && num_clients_in_last_session > 0 && 7268108eb18Smrg num_clients_in_last_session != numClientListNames) 7278108eb18Smrg { 7288108eb18Smrg XtAddEventHandler (clientInfoPopup, StructureNotifyMask, False, 7298108eb18Smrg ClientInfoStructureNotifyXtHandler, NULL); 7308108eb18Smrg } 7318108eb18Smrg 7328108eb18Smrg PopupPopup (mainWindow, clientInfoPopup, 7338108eb18Smrg False, first_time, 100, 50, "DelClientInfoWinAction()"); 7348108eb18Smrg 7358108eb18Smrg client_info_visible = 1; 7368108eb18Smrg 7378108eb18Smrg if (first_time) 7388108eb18Smrg first_time = 0; 7398108eb18Smrg } 7408108eb18Smrg} 7418108eb18Smrg 7428108eb18Smrg 7438108eb18Smrg#define CHECK_WIDTH 9 7448108eb18Smrg#define CHECK_HEIGHT 8 7458108eb18Smrg 7468108eb18Smrgstatic unsigned char check_bits[] = { 7478108eb18Smrg 0x00, 0x01, 0x80, 0x01, 0xc0, 0x00, 0x60, 0x00, 7488108eb18Smrg 0x31, 0x00, 0x1b, 0x00, 0x0e, 0x00, 0x04, 0x00 7498108eb18Smrg}; 7508108eb18Smrg 7518108eb18Smrg 7528108eb18Smrg 7538108eb18Smrgstatic void 7548108eb18SmrgDelClientInfoWinAction(Widget w, XEvent *event, String *params, 7558108eb18Smrg Cardinal *num_params) 7568108eb18Smrg{ 7578108eb18Smrg XtCallCallbacks (clientInfoDoneButton, XtNcallback, NULL); 7588108eb18Smrg} 7598108eb18Smrg 7608108eb18Smrg 7618108eb18Smrg 7628108eb18Smrgstatic void 7638108eb18SmrgDelPropWinAction(Widget w, XEvent *event, String *params, Cardinal *num_params) 7648108eb18Smrg{ 7658108eb18Smrg XtCallCallbacks (clientPropDoneButton, XtNcallback, NULL); 7668108eb18Smrg} 7678108eb18Smrg 7688108eb18Smrg 7698108eb18Smrg 7708108eb18Smrgvoid 7718108eb18Smrgcreate_client_info_popup(void) 7728108eb18Smrg 7738108eb18Smrg{ 7748108eb18Smrg /* 7758108eb18Smrg * Install actions for WM_DELETE_WINDOW 7768108eb18Smrg */ 7778108eb18Smrg 7788108eb18Smrg static XtActionsRec actions[] = { 7798108eb18Smrg {"DelClientInfoWinAction", DelClientInfoWinAction}, 7808108eb18Smrg {"DelPropWinAction", DelPropWinAction} 7818108eb18Smrg }; 7828108eb18Smrg 7838108eb18Smrg XtAppAddActions (appContext, actions, XtNumber (actions)); 7848108eb18Smrg 7858108eb18Smrg 7868108eb18Smrg /* 7878108eb18Smrg * Make checkmark bitmap 7888108eb18Smrg */ 7898108eb18Smrg 7908108eb18Smrg checkBitmap = XCreateBitmapFromData ( 7918108eb18Smrg XtDisplay (topLevel), RootWindowOfScreen (XtScreen (topLevel)), 7928108eb18Smrg (char *) check_bits, CHECK_WIDTH, CHECK_HEIGHT); 7938108eb18Smrg 7948108eb18Smrg 7958108eb18Smrg /* 7968108eb18Smrg * Pop up for List Clients button. 7978108eb18Smrg */ 7988108eb18Smrg 7998108eb18Smrg clientInfoPopup = XtVaCreatePopupShell ( 8008108eb18Smrg "clientInfoPopup", topLevelShellWidgetClass, topLevel, 8018108eb18Smrg XtNallowShellResize, True, 8028108eb18Smrg NULL); 8038108eb18Smrg 8048108eb18Smrg 8058108eb18Smrg clientInfoForm = XtVaCreateManagedWidget ( 8068108eb18Smrg "clientInfoForm", formWidgetClass, clientInfoPopup, 8078108eb18Smrg NULL); 8088108eb18Smrg 8098108eb18Smrg viewPropButton = XtVaCreateManagedWidget ( 8108108eb18Smrg "viewPropButton", commandWidgetClass, clientInfoForm, 8118108eb18Smrg XtNfromHoriz, NULL, 8128108eb18Smrg XtNfromVert, NULL, 8138108eb18Smrg XtNtop, XawChainTop, 8148108eb18Smrg XtNbottom, XawChainTop, 8158108eb18Smrg XtNleft, XawChainLeft, 8168108eb18Smrg XtNright, XawChainLeft, 8178108eb18Smrg NULL); 8181a650d1eSmrg 8191a650d1eSmrg XtAddCallback (viewPropButton, XtNcallback, ViewPropXtProc, NULL); 8208108eb18Smrg 8218108eb18Smrg 8228108eb18Smrg cloneButton = XtVaCreateManagedWidget ( 8238108eb18Smrg "cloneButton", commandWidgetClass, clientInfoForm, 8248108eb18Smrg XtNfromHoriz, viewPropButton, 8258108eb18Smrg XtNfromVert, NULL, 8268108eb18Smrg XtNtop, XawChainTop, 8278108eb18Smrg XtNbottom, XawChainTop, 8288108eb18Smrg XtNleft, XawChainLeft, 8298108eb18Smrg XtNright, XawChainLeft, 8308108eb18Smrg NULL); 8311a650d1eSmrg 8321a650d1eSmrg XtAddCallback (cloneButton, XtNcallback, CloneXtProc, NULL); 8338108eb18Smrg 8348108eb18Smrg 8358108eb18Smrg killClientButton = XtVaCreateManagedWidget ( 8368108eb18Smrg "killClientButton", commandWidgetClass, clientInfoForm, 8378108eb18Smrg XtNfromHoriz, cloneButton, 8388108eb18Smrg XtNfromVert, NULL, 8398108eb18Smrg XtNtop, XawChainTop, 8408108eb18Smrg XtNbottom, XawChainTop, 8418108eb18Smrg XtNleft, XawChainLeft, 8428108eb18Smrg XtNright, XawChainLeft, 8438108eb18Smrg NULL); 8441a650d1eSmrg 8451a650d1eSmrg XtAddCallback (killClientButton, XtNcallback, KillClientXtProc, NULL); 8468108eb18Smrg 8478108eb18Smrg 8488108eb18Smrg restartHintButton = XtVaCreateManagedWidget ( 8498108eb18Smrg "restartHintButton", menuButtonWidgetClass, clientInfoForm, 8508108eb18Smrg XtNmenuName, "restartHintMenu", 8518108eb18Smrg XtNfromHoriz, killClientButton, 8528108eb18Smrg XtNfromVert, NULL, 8538108eb18Smrg XtNtop, XawChainTop, 8548108eb18Smrg XtNbottom, XawChainTop, 8558108eb18Smrg XtNleft, XawChainLeft, 8568108eb18Smrg XtNright, XawChainLeft, 8578108eb18Smrg NULL); 8588108eb18Smrg 8598108eb18Smrg restartHintMenu = XtVaCreatePopupShell ( 8608108eb18Smrg "restartHintMenu", simpleMenuWidgetClass, clientInfoForm, 8618108eb18Smrg NULL); 8628108eb18Smrg 8638108eb18Smrg restartIfRunning = XtVaCreateManagedWidget ( 8648108eb18Smrg "restartIfRunning", smeBSBObjectClass, restartHintMenu, 8658108eb18Smrg XtNleftMargin, 18, 8668108eb18Smrg NULL); 8678108eb18Smrg 8688108eb18Smrg restartAnyway = XtVaCreateManagedWidget ( 8698108eb18Smrg "restartAnyway", smeBSBObjectClass, restartHintMenu, 8708108eb18Smrg XtNleftMargin, 18, 8718108eb18Smrg NULL); 8728108eb18Smrg 8738108eb18Smrg restartImmediately = XtVaCreateManagedWidget ( 8748108eb18Smrg "restartImmediately", smeBSBObjectClass, restartHintMenu, 8758108eb18Smrg XtNleftMargin, 18, 8768108eb18Smrg NULL); 8778108eb18Smrg 8788108eb18Smrg restartNever = XtVaCreateManagedWidget ( 8798108eb18Smrg "restartNever", smeBSBObjectClass, restartHintMenu, 8808108eb18Smrg XtNleftMargin, 18, 8818108eb18Smrg NULL); 8828108eb18Smrg 8831a650d1eSmrg XtAddCallback (restartIfRunning, XtNcallback, RestartHintXtProc, NULL); 8841a650d1eSmrg XtAddCallback (restartAnyway, XtNcallback, RestartHintXtProc, NULL); 8851a650d1eSmrg XtAddCallback (restartImmediately, XtNcallback, RestartHintXtProc, NULL); 8861a650d1eSmrg XtAddCallback (restartNever, XtNcallback, RestartHintXtProc, NULL); 8878108eb18Smrg 8888108eb18Smrg 8898108eb18Smrg clientInfoDoneButton = XtVaCreateManagedWidget ( 8908108eb18Smrg "clientInfoDoneButton", commandWidgetClass, clientInfoForm, 8918108eb18Smrg XtNfromHoriz, restartHintButton, 8928108eb18Smrg XtNfromVert, NULL, 8938108eb18Smrg XtNtop, XawChainTop, 8948108eb18Smrg XtNbottom, XawChainTop, 8958108eb18Smrg XtNleft, XawChainLeft, 8968108eb18Smrg XtNright, XawChainLeft, 8978108eb18Smrg NULL); 8988108eb18Smrg 8991a650d1eSmrg XtAddCallback (clientInfoDoneButton, XtNcallback, listDoneXtProc, NULL); 9008108eb18Smrg 9018108eb18Smrg 9028108eb18Smrg clientListWidget = XtVaCreateManagedWidget ( 9038108eb18Smrg "clientListWidget", listWidgetClass, clientInfoForm, 9048108eb18Smrg XtNdefaultColumns, 1, 9058108eb18Smrg XtNforceColumns, True, 9068108eb18Smrg XtNfromHoriz, NULL, 9078108eb18Smrg XtNfromVert, viewPropButton, 9088108eb18Smrg XtNresizable, True, 9098108eb18Smrg XtNtop, XawChainTop, 9108108eb18Smrg XtNbottom, XawChainTop, 9118108eb18Smrg NULL); 9128108eb18Smrg 9131a650d1eSmrg XtAddCallback (clientListWidget, XtNcallback, ClientListXtProc, NULL); 9148108eb18Smrg 9158108eb18Smrg noClientsLabel = XtVaCreateWidget ( 9168108eb18Smrg "noClientsLabel", labelWidgetClass, clientInfoForm, 9178108eb18Smrg XtNfromHoriz, NULL, 9188108eb18Smrg XtNfromVert, viewPropButton, 9198108eb18Smrg XtNborderWidth, 0, 9208108eb18Smrg XtNtop, XawChainTop, 9218108eb18Smrg XtNbottom, XawChainTop, 9228108eb18Smrg NULL); 9238108eb18Smrg 9248108eb18Smrg manualRestartLabel = XtVaCreateManagedWidget ( 9258108eb18Smrg "manualRestartLabel", labelWidgetClass, clientInfoForm, 9268108eb18Smrg XtNfromHoriz, NULL, 9278108eb18Smrg XtNfromVert, clientListWidget, 9288108eb18Smrg XtNborderWidth, 0, 9298108eb18Smrg XtNvertDistance, 20, 9308108eb18Smrg XtNtop, XawChainBottom, 9318108eb18Smrg XtNbottom, XawChainBottom, 9328108eb18Smrg XtNleft, XawChainLeft, 9338108eb18Smrg XtNright, XawChainLeft, 9348108eb18Smrg NULL); 9358108eb18Smrg 9368108eb18Smrg manualRestartCommands = XtVaCreateManagedWidget ( 9378108eb18Smrg "manualRestartCommands", asciiTextWidgetClass, clientInfoForm, 9388108eb18Smrg XtNfromHoriz, NULL, 9398108eb18Smrg XtNfromVert, manualRestartLabel, 9408108eb18Smrg XtNeditType, XawtextEdit, 9418108eb18Smrg XtNresizable, True, 9428108eb18Smrg XtNresize, XawtextResizeWidth, 9438108eb18Smrg XtNscrollVertical, XawtextScrollAlways, 9448108eb18Smrg XtNwidth, 350, 9458108eb18Smrg XtNheight, 100, 9468108eb18Smrg XtNtop, XawChainBottom, 9478108eb18Smrg XtNbottom, XawChainBottom, 9488108eb18Smrg NULL); 9498108eb18Smrg 9508108eb18Smrg /* 9518108eb18Smrg * Pop up for viewing client properties 9528108eb18Smrg */ 9538108eb18Smrg 9548108eb18Smrg clientPropPopup = XtVaCreatePopupShell ( 9558108eb18Smrg "clientPropPopup", topLevelShellWidgetClass, topLevel, 9568108eb18Smrg XtNallowShellResize, True, 9578108eb18Smrg NULL); 9588108eb18Smrg 9598108eb18Smrg 9608108eb18Smrg clientPropForm = XtVaCreateManagedWidget ( 9618108eb18Smrg "clientPropForm", formWidgetClass, clientPropPopup, 9628108eb18Smrg NULL); 9638108eb18Smrg 9648108eb18Smrg clientPropDoneButton = XtVaCreateManagedWidget ( 9658108eb18Smrg "clientPropDoneButton", commandWidgetClass, clientPropForm, 9668108eb18Smrg XtNfromHoriz, NULL, 9678108eb18Smrg XtNfromVert, NULL, 9688108eb18Smrg XtNtop, XawChainTop, 9698108eb18Smrg XtNbottom, XawChainTop, 9708108eb18Smrg XtNleft, XawChainLeft, 9718108eb18Smrg XtNright, XawChainLeft, 9728108eb18Smrg NULL); 9738108eb18Smrg 9741a650d1eSmrg XtAddCallback (clientPropDoneButton, XtNcallback, clientPropDoneXtProc, NULL); 9758108eb18Smrg 9768108eb18Smrg 9778108eb18Smrg clientPropTextWidget = XtVaCreateManagedWidget ( 9788108eb18Smrg "clientPropTextWidget", asciiTextWidgetClass, clientPropForm, 9798108eb18Smrg XtNfromHoriz, NULL, 9808108eb18Smrg XtNfromVert, clientPropDoneButton, 9818108eb18Smrg XtNeditType, XawtextRead, 9828108eb18Smrg XtNdisplayCaret, False, 9838108eb18Smrg XtNscrollVertical, XawtextScrollWhenNeeded, 9848108eb18Smrg XtNscrollHorizontal, XawtextScrollWhenNeeded, 9858108eb18Smrg XtNresizable, True, 9868108eb18Smrg XtNtop, XawChainTop, 9878108eb18Smrg XtNbottom, XawChainBottom, 9888108eb18Smrg NULL); 9898108eb18Smrg} 990