2 * CDE - Common Desktop Environment
4 * Copyright (c) 1993-2012, The Open Group. All rights reserved.
6 * These libraries and programs are free software; you can
7 * redistribute them and/or modify them under the terms of the GNU
8 * Lesser General Public License as published by the Free Software
9 * Foundation; either version 2 of the License, or (at your option)
12 * These libraries and programs are distributed in the hope that
13 * they will be useful, but WITHOUT ANY WARRANTY; without even the
14 * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15 * PURPOSE. See the GNU Lesser General Public License for more
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with these librararies and programs; if not, write
20 * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
21 * Floor, Boston, MA 02110-1301 USA
23 /* $TOG: Find.c /main/10 1999/12/09 13:06:33 mgreess $ */
24 /************************************<+>*************************************
25 ****************************************************************************
29 * COMPONENT_NAME: Desktop File Manager (dtfile)
31 * Description: Source file for the find file dialog.
33 * FUNCTIONS: AlternateInputHandler
34 * AlternateInputHandler
35 * AlternateInputHandler
68 * (c) Copyright 1993, 1994, 1995 Hewlett-Packard Company
69 * (c) Copyright 1993, 1994, 1995 International Business Machines Corp.
70 * (c) Copyright 1993, 1994, 1995 Sun Microsystems, Inc.
71 * (c) Copyright 1993, 1994, 1995 Novell, Inc.
73 ****************************************************************************
74 ************************************<+>*************************************/
81 #include <sys/types.h>
88 #include <sys/getaccess.h>
95 #include <Xm/DialogS.h>
97 #include <Xm/LabelG.h>
100 #include <Xm/MessageB.h>
101 #include <Xm/PushBG.h>
102 #include <Xm/PushB.h>
103 #include <Xm/RowColumn.h>
104 #include <Xm/ScrolledW.h>
105 #include <Xm/TextF.h>
106 #include <Xm/ToggleBG.h>
107 #include <Xm/SeparatoG.h>
108 #include <Xm/VendorSEP.h>
109 #include <Xm/MwmUtil.h>
110 #include <Xm/Protocols.h>
112 #include <Dt/TitleBox.h>
114 #include <X11/ShellP.h>
115 #include <X11/Xatom.h>
117 #include <Dt/Connect.h>
118 #include <Dt/DtNlUtils.h>
119 #include <Dt/HourGlass.h>
121 #include <Dt/SharedProcs.h>
125 #include <Xm/XmPrivate.h> /* _XmStringUngenerate */
128 #include "SharedProcs.h"
135 #include "SharedMsgs.h"
138 typedef struct _Dummy {
149 /* Error message defines */
151 #define BAD_DIR_NAME 0
152 #define NO_DIR_ACCESS 1
153 #define NO_EXISTANCE 2
154 #define NO_FILE_OR_FOLDER_ARG 3
157 /* More string defines */
158 static char * PRINT_OPTION = " -print ";
159 static char * FIND_COMMAND = "find ";
160 static char * GREP_COMMAND = "grep -i -l ";
161 static char * NAME_OPTION = " -name ";
162 #if defined(__hpux) || defined(sun)
163 static char * FOLLOW_OPTION = " -follow";
165 static char * REDIRECTOR = " 2>&-";
166 static char * TYPEDIR = " -type d";
167 static char * FIND_FILE = "FindFile";
170 #define CURRENT_VIEW 1
174 /* Resource definitions for the find file dialog */
176 static DialogResource resources[] =
178 { "folders", XmRString, sizeof(String),
179 XtOffset(FindDataPtr, directories),
180 (XtPointer) NULL, _DtStringToString },
182 { "name", XmRString, sizeof(String),
183 XtOffset(FindDataPtr, filter),
184 (XtPointer) NULL, _DtStringToString },
186 { "selectedItem", XmRInt, sizeof(int),
187 XtOffset(FindDataPtr, selected_item),
188 (XtPointer) -1, _DtIntToString },
190 { "content", XmRString, sizeof(String),
191 XtOffset(FindDataPtr, content),
192 (XtPointer) NULL, _DtStringToString },
196 static DialogResource match_resources[] =
198 { "matchData", XmRString, sizeof(String),
199 XtOffset(DummyPtr, string),
200 (XtPointer) NULL, _DtStringToString },
203 /******** Static Function Declarations ********/
208 Widget *return_widget,
210 static void InstallChange(
212 XtCallbackProc callback,
213 XtPointer client_data) ;
214 static void InstallClose(
216 XtCallbackProc callback,
217 XtPointer client_data) ;
220 static XtPointer GetValues(
222 static XtPointer GetDefaultValues( void ) ;
223 static XtPointer GetResourceValues(
224 XrmDatabase data_base,
226 static void SetValues(
228 FindData *find_data) ;
229 static void WriteResourceValues(
233 static void FreeValues(
234 FindData *find_data) ;
235 static Boolean GetFindValues(
239 static void InvalidFindMessage(
242 String extra_string) ;
243 static void FreeMatchInfo(
246 static void LeaveStopBttn(
250 static void EnterStopBttn(
254 static void StopSearch(
257 static void StartSearch(
260 static void StartCallback(
262 XtPointer client_data,
263 XtPointer call_data) ;
264 static void StopCallback(
266 XtPointer client_data,
267 XtPointer call_data) ;
268 static String GrowBuffer(
272 static String MakeAbsolute(
273 String current_directory,
275 static Boolean FindProcessStarted(
277 FindData *find_data) ;
278 static Boolean ExecuteFind(
281 FileMgrData *file_mgr_data) ;
282 static Boolean ExecuteGrep(
283 FindRec * find_rec) ;
284 static void AlternateInputHandler(
285 XtPointer client_data,
288 static void AlternateInputHandler2(
289 XtPointer client_data,
292 static void AlternateInputHandler3(
293 XtPointer client_data,
296 static void GetFileName(
301 FileMgrData *file_mgr_data) ;
302 static Boolean ExtractDirectory(
308 XtPointer client_data,
309 XtPointer call_data) ;
310 static void FindPutOnDesktop(
312 XtPointer client_data,
313 XtPointer call_data) ;
314 static void SetActiveItem(
316 XtPointer client_data,
317 XtPointer call_data) ;
318 static void SetFocus(
320 FindData *find_data ) ;
321 FILE *findpopen(char *,char *,int *);
323 /******** End Static Function Declarations ********/
327 * The Dialog Class structure.
330 static DialogClass findClassRec =
335 (DialogInstallChangeProc) InstallChange,
336 (DialogInstallCloseProc) InstallClose,
337 (DialogDestroyProc) Destroy,
338 (DialogGetValuesProc) GetValues,
341 (DialogSetValuesProc) SetValues,
343 (DialogFreeValuesProc) FreeValues,
344 (DialogMapWindowProc) _DtGenericMapWindow,
345 (DialogSetFocusProc) SetFocus,
348 DialogClass * findClass = (DialogClass *) &findClassRec;
353 /************************************************************************
357 ************************************************************************/
363 Widget *return_widget,
367 Widget shell, form, form1, form2;
368 Widget newFM, outputSeparator;
369 Widget headLabel, contentLabel, contentText;
370 Widget filterText, filterLabel, listLabel, scrolledList, dirName, dirLabel;
371 #if defined(__hpux) || defined(sun)
372 Widget followLink, followLinkPD;
374 Widget putOnDT, separator;
375 Widget start, stop, close, help;
376 XmString label_string;
380 XtTranslations trans_table;
383 /* Initialize some global varibles */
387 /* Allocate the find file dialog instance record. */
389 find_rec = (FindRec *) XtMalloc (sizeof (FindRec));
391 /* Create the shell and form used for the dialog. */
394 XtSetArg (args[n], XmNmwmFunctions, MWM_FUNC_MOVE |
395 MWM_FUNC_CLOSE ); ++n;
396 XtSetArg (args[n], XmNmwmDecorations, MWM_DECOR_BORDER |
397 MWM_DECOR_TITLE); ++n;
398 XtSetArg (args[n], XmNallowShellResize, False); ++n;
399 shell = XmCreateDialogShell (parent, "find_files", args, n);
401 /* Set the useAsyncGeo on the shell */
402 XtSetArg (args[0], XmNuseAsyncGeometry, True);
403 XtSetValues (XtParent(shell), args, 1);
405 trans_table = XtParseTranslationTable(translations_space);
408 XtSetArg (args[n], XmNmarginWidth, 1); n++;
409 XtSetArg (args[n], XmNmarginHeight, 1); n++;
410 XtSetArg (args[n], XmNshadowThickness, 1); n++;
411 XtSetArg (args[n], XmNshadowType, XmSHADOW_OUT); n++;
412 XtSetArg (args[n], XmNautoUnmanage, False); n++;
413 form = XmCreateForm (shell, "form", args, n);
414 XtAddCallback(form, XmNhelpCallback, (XtCallbackProc)HelpRequestCB,
415 HELP_FIND_DIALOG_STR);
417 label_string = XmStringCreateLocalized ((GETMESSAGE(15,47, "Fill in one or more fields to specify which items to find:")));
419 XtSetArg (args[n], XmNlabelString, label_string); n++;
420 XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
421 XtSetArg (args[n], XmNleftOffset, 5); n++;
422 XtSetArg (args[n], XmNtopAttachment, XmATTACH_FORM); n++;
423 XtSetArg (args[n], XmNtopOffset, 14); n++;
424 XtSetArg (args[n], XmNtraversalOn, False); n++;
425 headLabel = XmCreateLabelGadget (form, "hdlb", args, n);
426 XtManageChild (headLabel);
427 XmStringFree (label_string);
429 label_string = XmStringCreateLocalized ((GETMESSAGE(15,31, "File or Folder Name: ")));
431 XtSetArg (args[n], XmNlabelString, label_string); n++;
432 XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
433 XtSetArg (args[n], XmNleftOffset, 5); n++;
434 XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
435 XtSetArg (args[n], XmNtopWidget, headLabel); n++;
436 XtSetArg (args[n], XmNtopOffset, 15); n++;
437 XtSetArg (args[n], XmNtraversalOn, False); n++;
438 filterLabel = XmCreateLabelGadget (form, "file_name_label", args, n);
439 XtManageChild (filterLabel);
440 XmStringFree (label_string);
441 XtAddCallback(filterLabel, XmNhelpCallback, (XtCallbackProc)HelpRequestCB,
442 HELP_FIND_DIALOG_STR);
445 XtSetArg (args[n], XmNleftAttachment, XmATTACH_WIDGET); n++;
446 XtSetArg (args[n], XmNleftWidget, filterLabel); n++;
447 XtSetArg (args[n], XmNleftOffset, 0); n++;
448 XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
449 XtSetArg (args[n], XmNtopWidget, headLabel); n++;
450 XtSetArg (args[n], XmNtopOffset, 10); n++;
451 XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n++;
452 XtSetArg (args[n], XmNrightOffset, 10); n++;
453 filterText = XmCreateTextField (form, "file_name_text", args, n);
454 XtManageChild (filterText);
455 XtAddCallback(filterText, XmNhelpCallback, (XtCallbackProc)HelpRequestCB,
456 HELP_FIND_DIALOG_STR);
458 /* set up translations in the filter text edit widget */
459 XtOverrideTranslations(filterText, trans_table);
461 label_string = XmStringCreateLocalized ((GETMESSAGE(15,32, "File Contents:")));
463 XtSetArg (args[n], XmNlabelString, label_string); n++;
464 XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
465 XtSetArg (args[n], XmNleftOffset, 5); n++;
466 XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
467 XtSetArg (args[n], XmNtopWidget, filterText); n++;
468 XtSetArg (args[n], XmNtopOffset, 15); n++;
469 XtSetArg (args[n], XmNtraversalOn, False); n++;
470 contentLabel = XmCreateLabelGadget (form, "content_label", args, n);
471 XtManageChild (contentLabel);
472 XmStringFree (label_string);
473 XtAddCallback(contentLabel, XmNhelpCallback, (XtCallbackProc)HelpRequestCB,
474 HELP_FIND_DIALOG_STR);
477 XtSetArg (args[n], XmNleftAttachment, XmATTACH_WIDGET); n++;
478 XtSetArg (args[n], XmNleftWidget, contentLabel); n++;
479 XtSetArg (args[n], XmNleftOffset, 0); n++;
480 XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
481 XtSetArg (args[n], XmNtopWidget, filterText); n++;
482 XtSetArg (args[n], XmNtopOffset, 10); n++;
483 XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n++;
484 XtSetArg (args[n], XmNrightOffset, 10); n++;
485 contentText = XmCreateTextField (form, "content_text", args, n);
486 XtManageChild (contentText);
487 XtAddCallback(contentText, XmNhelpCallback, (XtCallbackProc)HelpRequestCB,
488 HELP_FIND_DIALOG_STR);
490 #if defined(__hpux) || defined(sun)
492 XtSetArg (args[n], XmNmarginWidth, 1); n++;
493 XtSetArg (args[n], XmNmarginHeight, 1); n++;
494 XtSetArg (args[n], XmNshadowThickness, 0); n++;
495 XtSetArg (args[n], XmNautoUnmanage, False); n++;
496 XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
497 XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n++;
498 XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
499 XtSetArg (args[n], XmNtopWidget, contentText); n++;
500 XtSetArg (args[n], XmNtopOffset, 5); n++;
501 form1 = XmCreateForm (form, "form1", args, n);
502 XtManageChild (form1);
504 /* Create a Pulldown MenuPane that will contain the font sizes */
505 followLinkPD = XmCreatePulldownMenu(form1, "fLinkPD", args, 0);
507 label_string = XmStringCreateLocalized ((GETMESSAGE(15,33, "On")));
508 XtSetArg(args[0], XmNmarginHeight, 2);
509 XtSetArg(args[1], XmNmarginWidth, 12);
510 XtSetArg(args[2], XmNlabelString, label_string); n++;
511 find_rec->widgArry[0] =
512 XmCreatePushButtonGadget(followLinkPD, "On", args, 3);
513 XmStringFree(label_string);
515 label_string = XmStringCreateLocalized ((GETMESSAGE(15,34, "Off")));
516 XtSetArg(args[2], XmNlabelString, label_string);
517 find_rec->widgArry[1] =
518 XmCreatePushButtonGadget(followLinkPD, "Off", args, 3);
519 XmStringFree(label_string);
521 XtManageChildren(find_rec->widgArry, 2);
523 label_string = XmStringCreateLocalized ((GETMESSAGE(15,35, "Follow Links: ")));
524 /* create the Option Menu and attach it to the Pulldown MenuPane */
526 XtSetArg (args[n], XmNlabelString, label_string); n++;
527 XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
528 XtSetArg (args[n], XmNleftOffset, 30); n++;
529 XtSetArg (args[n], XmNtopAttachment, XmATTACH_FORM); n++;
530 XtSetArg (args[n], XmNtopOffset, 5); n++;
531 XtSetArg (args[n], XmNbottomAttachment, XmATTACH_FORM); n++;
532 XtSetArg (args[n], XmNbottomOffset, 5); n++;
533 XtSetArg(args[n], XmNsubMenuId, followLinkPD); n++;
534 XtSetArg(args[n], XmNmenuHistory, find_rec->widgArry[OFF]); n++;
535 followLink = XmCreateOptionMenu(form1, "fLink", args, n);
536 XtManageChild (followLink);
537 XtAddCallback(followLink, XmNhelpCallback, (XtCallbackProc)HelpRequestCB,
538 HELP_FIND_DIALOG_STR);
543 XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
544 XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n++;
545 XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
546 #if defined(__hpux) || defined(sun)
547 XtSetArg (args[n], XmNtopWidget, form1); n++;
549 XtSetArg (args[n], XmNtopWidget, contentText); n++;
551 XtSetArg (args[n], XmNtopOffset, 5); n++;
552 outputSeparator = XmCreateSeparatorGadget (form, "opSeparator", args, n);
553 XtManageChild (outputSeparator);
555 /* Create the field for collecting the directory names to search */
557 label_string = XmStringCreateLocalized (((char *)GETMESSAGE(15, 42, "Search Folder: ")));
559 XtSetArg (args[n], XmNlabelString, label_string); n++;
560 XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
561 XtSetArg (args[n], XmNleftOffset, 5); n++;
562 XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
563 XtSetArg (args[n], XmNtopWidget, outputSeparator); n++;
564 XtSetArg (args[n], XmNtopOffset, 15); n++;
565 XtSetArg (args[n], XmNtraversalOn, False); n++;
566 dirLabel = XmCreateLabelGadget (form, "folder_name_label", args, n);
567 XtManageChild (dirLabel);
568 XmStringFree (label_string);
569 XtAddCallback(dirLabel, XmNhelpCallback, (XtCallbackProc)HelpRequestCB,
570 HELP_FIND_DIALOG_STR);
573 XtSetArg (args[n], XmNleftAttachment, XmATTACH_WIDGET); n++;
574 XtSetArg (args[n], XmNleftWidget, dirLabel); n++;
575 XtSetArg (args[n], XmNleftOffset, 0); n++;
576 XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n++;
577 XtSetArg (args[n], XmNrightOffset, 10); n++;
578 XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
579 XtSetArg (args[n], XmNtopWidget, outputSeparator); n++;
580 XtSetArg (args[n], XmNtopOffset, 10); n++;
581 dirName = XmCreateTextField (form, "folder_name_text", args, n);
582 XtManageChild (dirName);
583 XtAddCallback(dirName, XmNhelpCallback, (XtCallbackProc)HelpRequestCB,
584 HELP_FIND_DIALOG_STR);
586 /* set up translations in the search directory text edit widget */
587 XtOverrideTranslations(dirName, trans_table);
589 /* Create the widgets showing the matching files */
592 XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
593 XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n++;
594 XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
595 XtSetArg (args[n], XmNtopWidget, dirLabel); n++;
596 XtSetArg (args[n], XmNtopOffset, 15); n++;
597 outputSeparator = XmCreateSeparatorGadget (form, "outputSeparator", args, n);
598 XtManageChild (outputSeparator);
600 label_string = XmStringCreateLocalized (GetSharedMessage(FILES_FOUND_LABEL));
602 XtSetArg (args[n], XmNlabelString, label_string); n++;
603 XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
604 XtSetArg (args[n], XmNleftOffset, 5); n++;
605 XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
606 XtSetArg (args[n], XmNtopWidget, outputSeparator); n++;
607 XtSetArg (args[n], XmNtopOffset, 10); n++;
608 XtSetArg (args[n], XmNtraversalOn, False); n++;
609 listLabel = XmCreateLabelGadget (form, "files_found", args, n);
610 XtManageChild (listLabel);
611 XmStringFree (label_string);
612 XtAddCallback(listLabel, XmNhelpCallback, (XtCallbackProc)HelpRequestCB,
613 HELP_FIND_DIALOG_STR);
616 XtSetArg (args[n], XmNlistSizePolicy, XmCONSTANT); n++;
617 XtSetArg (args[n], XmNscrollBarDisplayPolicy, XmSTATIC); n++;
618 XtSetArg (args[n], XmNvisibleItemCount, 5); n++;
619 scrolledList = XmCreateScrolledList (form, "file_list", args, n);
620 XtManageChild (scrolledList);
622 XtAddCallback (scrolledList, XmNbrowseSelectionCallback,
623 SetActiveItem, (XtPointer) find_rec);
624 XtAddCallback (scrolledList, XmNdefaultActionCallback,
625 NewView, (XtPointer) find_rec);
626 XtAddCallback(XtParent(scrolledList), XmNhelpCallback,
627 (XtCallbackProc)HelpRequestCB,
628 HELP_FIND_DIALOG_STR);
632 XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
633 XtSetArg (args[n], XmNtopWidget, listLabel); n++;
634 XtSetArg (args[n], XmNtopOffset, 5); n++;
635 XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
636 XtSetArg (args[n], XmNleftOffset, 10); n++;
637 XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n++;
638 XtSetArg (args[n], XmNrightPosition, 10); n++;
639 XtSetValues (XtParent (scrolledList), args, n);
642 XtSetArg (args[n], XmNmarginWidth, 1); n++;
643 XtSetArg (args[n], XmNmarginHeight, 1); n++;
644 XtSetArg (args[n], XmNshadowThickness, 0); n++;
645 XtSetArg (args[n], XmNautoUnmanage, False); n++;
646 XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
647 XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n++;
648 XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
649 XtSetArg (args[n], XmNtopWidget, scrolledList); n++;
650 XtSetArg (args[n], XmNtopOffset, 10); n++;
651 form2 = XmCreateForm (form, "form2", args, n);
652 XtManageChild (form2);
654 XtAddCallback(form2, XmNhelpCallback, (XtCallbackProc)HelpRequestCB,
655 HELP_FIND_DIALOG_STR);
658 label_string = XmStringCreateLocalized ((GETMESSAGE(15,48, "Open Folder")));
661 XtSetArg (args[n], XmNlabelString, label_string); n++;
662 XtSetArg (args[n], XmNleftAttachment, XmATTACH_POSITION); n++;
663 XtSetArg (args[n], XmNleftPosition, 10); n++;
664 XtSetArg (args[n], XmNtopAttachment, XmATTACH_FORM); n++;
665 XtSetArg (args[n], XmNtopOffset, 5); n++;
666 XtSetArg (args[n], XmNbottomAttachment, XmATTACH_FORM); n++;
667 XtSetArg (args[n], XmNbottomOffset, 5); n++;
668 XtSetArg (args[n], XmNmarginHeight, 4); n++;
669 XtSetArg (args[n], XmNmarginWidth, 10); n++;
670 newFM = XmCreatePushButtonGadget (form2, "new_view", args, n);
671 XtManageChild (newFM);
672 XtAddCallback (newFM, XmNactivateCallback, NewView, (XtPointer) find_rec);
673 XtAddCallback(newFM, XmNhelpCallback, (XtCallbackProc)HelpRequestCB,
674 HELP_FIND_DIALOG_STR);
675 XmStringFree (label_string);
677 XtSetArg (args[0], XmNdefaultButton, newFM);
678 XtSetValues (form2, args, 1);
680 label_string = XmStringCreateLocalized ((GETMESSAGE(15,37, "Put In Workspace")));
682 XtSetArg (args[n], XmNlabelString, label_string); n++;
683 XtSetArg (args[n], XmNleftAttachment, XmATTACH_POSITION); n++;
684 XtSetArg (args[n], XmNleftPosition, 55); n++;
685 XtSetArg (args[n], XmNtopAttachment, XmATTACH_FORM); n++;
686 XtSetArg (args[n], XmNtopOffset, 5); n++;
687 XtSetArg (args[n], XmNbottomAttachment, XmATTACH_FORM); n++;
688 XtSetArg (args[n], XmNbottomOffset, 5); n++;
689 XtSetArg (args[n], XmNmarginHeight, 4); n++;
690 XtSetArg (args[n], XmNmarginHeight, 4); n++;
691 XtSetArg (args[n], XmNmarginWidth, 10); n++;
692 putOnDT = XmCreatePushButtonGadget (form2, "putInWorkspace", args, n);
693 XtManageChild (putOnDT);
694 XtAddCallback (putOnDT, XmNactivateCallback, FindPutOnDesktop,
695 (XtPointer) find_rec);
696 XtAddCallback(putOnDT, XmNhelpCallback, (XtCallbackProc)HelpRequestCB,
697 HELP_FIND_DIALOG_STR);
698 XmStringFree (label_string);
700 /* Create a separator between the buttons */
703 XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
704 XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n++;
705 XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
706 XtSetArg (args[n], XmNtopWidget, form2); n++;
707 XtSetArg (args[n], XmNtopOffset, 10); n++;
708 separator = XmCreateSeparatorGadget (form, "separator", args, n);
709 XtManageChild (separator);
712 /* Create the action buttons */
714 label_string = XmStringCreateLocalized (((char *)GETMESSAGE(15, 14, "Start")));
716 XtSetArg (args[n], XmNlabelString, label_string); n++;
717 XtSetArg (args[n], XmNleftAttachment, XmATTACH_POSITION); n++;
718 XtSetArg (args[n], XmNleftPosition, 1); n++;
719 XtSetArg (args[n], XmNrightAttachment, XmATTACH_POSITION); n++;
720 XtSetArg (args[n], XmNrightPosition, 24); n++;
721 XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
722 XtSetArg (args[n], XmNtopWidget, separator); n++;
723 XtSetArg (args[n], XmNtopOffset, 5); n++;
724 XtSetArg (args[n], XmNbottomAttachment, XmATTACH_FORM); n++;
725 XtSetArg (args[n], XmNbottomOffset, 5); n++;
726 XtSetArg (args[n], XmNmarginHeight, 4); n++;
727 start = XmCreatePushButtonGadget (form, "start", args, n);
728 XtAddCallback (start, XmNactivateCallback, StartCallback,
729 (XtPointer) find_rec);
730 XtAddCallback(start, XmNhelpCallback, (XtCallbackProc)HelpRequestCB,
731 HELP_FIND_DIALOG_STR);
732 XtManageChild (start);
733 XmStringFree (label_string);
735 label_string = XmStringCreateLocalized (((char *)GETMESSAGE(15, 15, "Stop")));
737 XtSetArg (args[n], XmNlabelString, label_string); n++;
738 XtSetArg (args[n], XmNleftAttachment, XmATTACH_POSITION); n++;
739 XtSetArg (args[n], XmNleftPosition, 26); n++;
740 XtSetArg (args[n], XmNrightAttachment, XmATTACH_POSITION); n++;
741 XtSetArg (args[n], XmNrightPosition, 49); n++;
742 XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
743 XtSetArg (args[n], XmNtopWidget, separator); n++;
744 XtSetArg (args[n], XmNtopOffset, 5); n++;
745 XtSetArg (args[n], XmNmarginHeight, 4); n++;
746 stop = XmCreatePushButton (form, "stop", args, n);
747 XtAddCallback (stop, XmNactivateCallback, StopCallback,
748 (XtPointer) find_rec);
749 XtAddCallback(stop, XmNhelpCallback, (XtCallbackProc)HelpRequestCB,
750 HELP_FIND_DIALOG_STR);
751 XtManageChild (stop);
752 XtSetSensitive (stop, False);
753 XmStringFree (label_string);
756 XtSetArg (args[n], XmNlabelString, cancelXmString); n++;
757 XtSetArg (args[n], XmNleftAttachment, XmATTACH_POSITION); n++;
758 XtSetArg (args[n], XmNleftPosition, 51); n++;
759 XtSetArg (args[n], XmNrightAttachment, XmATTACH_POSITION); n++;
760 XtSetArg (args[n], XmNrightPosition, 74); n++;
761 XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
762 XtSetArg (args[n], XmNtopWidget, separator); n++;
763 XtSetArg (args[n], XmNtopOffset, 5); n++;
764 XtSetArg (args[n], XmNmarginHeight, 4); n++;
765 close = XmCreatePushButtonGadget (form, "close", args, n);
766 XtManageChild (close);
767 XtAddCallback(close, XmNhelpCallback, (XtCallbackProc)HelpRequestCB,
768 HELP_FIND_DIALOG_STR);
772 XtSetArg (args[n], XmNlabelString, helpXmString); n++;
773 XtSetArg (args[n], XmNleftAttachment, XmATTACH_POSITION); n++;
774 XtSetArg (args[n], XmNleftPosition, 76); n++;
775 XtSetArg (args[n], XmNrightAttachment, XmATTACH_POSITION); n++;
776 XtSetArg (args[n], XmNrightPosition, 99); n++;
777 XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
778 XtSetArg (args[n], XmNtopWidget, separator); n++;
779 XtSetArg (args[n], XmNtopOffset, 5); n++;
780 XtSetArg (args[n], XmNmarginHeight, 4); n++;
781 help = XmCreatePushButton (form, "help", args, n);
782 XtManageChild (help);
783 XtAddCallback(help, XmNactivateCallback, (XtCallbackProc)HelpRequestCB,
784 HELP_FIND_DIALOG_STR);
785 XtAddCallback(help, XmNhelpCallback, (XtCallbackProc)HelpRequestCB,
786 HELP_FIND_DIALOG_STR);
790 XtSetArg (args[0], XmNdefaultButton, start);
791 XtSetArg (args[1], XmNcancelButton, close);
792 XtSetValues (form, args, 2);
794 /* Fill in our instance structure */
796 find_rec->shell = shell;
797 find_rec->form = form;
798 find_rec->fileNameFilter = filterText;
799 find_rec->content = contentText;
800 #if defined(__hpux) || defined(sun)
801 find_rec->followLink = followLink;
803 find_rec->followLink = NULL;
805 find_rec->listLabel = listLabel;
806 find_rec->matchList = scrolledList;
807 find_rec->searchDirectory = dirName;
808 find_rec->newFM = newFM;
809 find_rec->putOnDT = putOnDT;
810 find_rec->start = start;
811 find_rec->stop = stop;
812 find_rec->close = close;
813 find_rec->help = help;
815 find_rec->selectedItem = -1;
816 find_rec->popenId = NULL;
817 find_rec->childpid = -1;
818 find_rec->alternateInputId = 0;
819 find_rec->searchInProgress = False;
820 find_rec->fileMgrRec = NULL;
823 /* Set the return values for the dialog widget and dialog instance. */
825 *return_widget = form;
826 *dialog = (XtPointer) find_rec;
831 /************************************************************************
835 ************************************************************************/
840 XtCallbackProc callback,
841 XtPointer client_data )
843 FindApply * apply_data;
846 /* Setup the callback data to be sent to the most of our */
847 /* actions callbacks. */
849 apply_data = (FindApply *) XtMalloc (sizeof (FindApply));
850 apply_data->callback = callback;
851 apply_data->client_data = client_data;
852 apply_data->find_rec = (XtPointer) find_rec;
853 find_rec->apply_data = apply_data;
859 /************************************************************************
863 ************************************************************************/
868 XtCallbackProc callback,
869 XtPointer client_data )
871 Atom delete_window_atom;
873 XtAddCallback (find_rec->close, XmNactivateCallback, callback, client_data);
875 delete_window_atom = XmInternAtom (XtDisplay(find_rec->shell), "WM_DELETE_WINDOW", True);
876 XmRemoveWMProtocols( find_rec->shell, &delete_window_atom, 1 );
877 XmAddWMProtocolCallback( find_rec->shell, delete_window_atom, callback,
878 (XtPointer) client_data );
884 /************************************************************************
888 ************************************************************************/
894 XtDestroyWidget (find_rec->shell);
895 XtFree ((char *) find_rec->apply_data);
896 XtFree ((char *) find_rec);
902 /************************************************************************
906 ************************************************************************/
912 FindData * find_data;
916 /* Allocate and initialize the find file dialog data. */
918 find_data = (FindData *) XtMalloc (sizeof (FindData));
920 find_data->displayed = True;
922 XtSetArg (args[0], XmNx, &find_data->x);
923 XtSetArg (args[1], XmNy, &find_data->y);
924 XtSetArg (args[2], XmNwidth, &find_data->width);
925 XtSetArg (args[3], XmNheight, &find_data->height);
926 XtGetValues (find_rec->shell, args, 4);
928 (void) GetFindValues (find_rec, find_data, False);
930 return ((XtPointer) find_data);
936 /************************************************************************
940 ************************************************************************/
943 GetDefaultValues( void )
946 char dirbuf[MAX_DIR_PATH_LEN];
948 /* Allocate and initialize the default find file dialog data. */
950 find_data = (FindData *) XtMalloc (sizeof (FindData));
952 find_data->displayed = False;
955 find_data->height = 0;
956 find_data->width = 0;
958 (void)getcwd((char *)dirbuf, (unsigned int)MAX_DIR_PATH_LEN);
960 strncmp(users_home_dir, dirbuf, strlen(users_home_dir)) != 0)
962 find_data->directories = (char *)XtMalloc(strlen(users_home_dir) + 1);
963 strcpy(find_data->directories, users_home_dir);
967 find_data->directories = (char *)XtMalloc(strlen(dirbuf) + 1);
968 strcpy(find_data->directories, dirbuf);
971 find_data->filter = NULL;
972 find_data->content = NULL;
973 find_data->matches = NULL;
974 find_data->num_matches = 0;
975 find_data->selected_item = -1;
976 #if defined(__hpux) || defined(sun)
977 find_data->follow_links = follow_links;
980 return ((XtPointer) find_data);
986 /************************************************************************
990 ************************************************************************/
994 XrmDatabase data_base,
997 FindData * find_data;
999 static Boolean convertersAdded = False;
1002 /* Allocate and get the resources for find file dialog data. */
1004 find_data = (FindData *) XtCalloc (1, sizeof (FindData));
1006 _DtDialogGetResources (data_base, name_list, FIND_FILE, (char *) find_data,
1007 resources, findClass->resource_count);
1009 /* Create new strings for any string value we read in from our
1012 find_data->directories = XtNewString(find_data->directories);
1013 find_data->filter = XtNewString(find_data->filter);
1014 find_data->content = XtNewString(find_data->content);
1016 /* Do a special read to get the list of matches. */
1017 /* The information is read in as a single string, and then must */
1018 /* be converted into the internal array format. */
1020 _DtDialogGetResources (data_base, name_list, FIND_FILE, (char *) (&dummy),
1021 match_resources, XtNumber(match_resources));
1023 CvtStringToStringList (dummy.string, &find_data->matches,
1024 &find_data->num_matches);
1026 return ((XtPointer) find_data);
1032 /************************************************************************
1036 ************************************************************************/
1041 FindData *find_data )
1047 XmTextFieldSetString (find_rec->fileNameFilter, find_data->filter);
1048 XmTextFieldSetInsertionPosition(find_rec->fileNameFilter,
1049 XmTextFieldGetLastPosition(find_rec->fileNameFilter));
1050 XmTextFieldSetString(find_rec->content, find_data->content);
1051 XmTextFieldSetInsertionPosition(find_rec->content,
1052 XmTextFieldGetLastPosition(find_rec->content));
1054 if(find_data->directories)
1055 XtFree(find_data->directories);
1056 find_data->directories =
1057 XtNewString(find_data->file_mgr_data->current_directory );
1059 XmTextFieldSetString(find_rec->searchDirectory, find_data->directories);
1060 XmTextFieldSetInsertionPosition(find_rec->searchDirectory,
1061 XmTextFieldGetLastPosition(find_rec->searchDirectory));
1062 if( find_data->file_mgr_data->restricted_directory )
1064 XtAddCallback (find_rec->searchDirectory, XmNmodifyVerifyCallback,
1065 (XtCallbackProc)TextChange,
1066 (XtPointer)find_data->file_mgr_data );
1067 XtAddCallback (find_rec->searchDirectory, XmNmotionVerifyCallback,
1068 (XtCallbackProc)TextChange,
1069 (XtPointer)find_data->file_mgr_data );
1072 /* Update the list of matches */
1074 if (find_data->num_matches > 0)
1076 XtSetArg (args[0], XmNitemCount, find_data->num_matches);
1078 (XmString *) XtMalloc (sizeof (XmString) * find_data->num_matches);
1080 for (i = 0; i < find_data->num_matches; i++)
1082 matches[i] = XmStringCreateLocalized (find_data->matches[i]);
1085 XtSetArg (args[1], XmNitems, matches);
1086 XtSetValues (find_rec->matchList, args, 2);
1088 for (i = 0; i < find_data->num_matches; i++)
1089 XmStringFree (matches[i]);
1091 XtFree ((char *) matches);
1093 if (find_data->selected_item != -1)
1095 XmListSelectPos (find_rec->matchList,
1096 find_data->selected_item + 1,False);
1101 XtSetArg (args[0], XmNitemCount, 0);
1102 XtSetValues (find_rec->matchList, args, 1);
1105 #if defined(__hpux) || defined(sun)
1106 /* Set up the Follow links option menu */
1107 if(find_data->follow_links)
1108 XtSetArg(args[0], XmNmenuHistory, find_rec->widgArry[ON]);
1110 XtSetArg(args[0], XmNmenuHistory, find_rec->widgArry[OFF]);
1111 XtSetValues (find_rec->followLink, args, 1);
1114 /* Update button sensitivity, if one of the matches is selected */
1116 if (find_data->selected_item != -1)
1118 XtSetSensitive (find_rec->newFM, True);
1119 XtSetSensitive (find_rec->putOnDT, True);
1123 XtSetSensitive (find_rec->newFM, False);
1124 XtSetSensitive (find_rec->putOnDT, False);
1127 find_rec->selectedItem = find_data->selected_item;
1134 /************************************************************************
1136 * WriteResourceValues
1138 ************************************************************************/
1141 WriteResourceValues(
1146 FindData * find_data = (FindData *) values->data;
1152 /* If the dialog is currently displayed, update the geometry */
1153 /* fields to their current values. */
1155 if (find_data->displayed == True)
1157 _DtGenericUpdateWindowPosition(values);
1158 find_rec = (FindRec *) _DtGetDialogInstance (values);
1159 (void) GetFindValues (find_rec, find_data, False);
1162 _DtDialogPutResources (fd, name_list, FIND_FILE, (char *) values->data,
1163 resources, findClass->resource_count);
1166 /* Special case for writing the array of matching files. */
1167 /* Write all of the information out as a single string, which */
1168 /* we'll parse when we read it back in at a later point in time. */
1169 /* The format for this string is: */
1171 /* <match string1>, <match string2>, <match string3>, ... */
1173 if (find_data->num_matches > 0)
1175 dummy.displayed = False;
1176 dummy.string = CvtStringListToString (find_data->matches,
1177 find_data->num_matches);
1179 _DtDialogPutResources (fd, name_list, FIND_FILE, (char *) &dummy,
1180 match_resources, XtNumber (match_resources));
1182 XtFree ((char *) dummy.string);
1183 dummy.string = NULL;
1190 /************************************************************************
1194 ************************************************************************/
1198 FindData *find_data )
1202 if( find_data->filter )
1203 XtFree ((char *) find_data->filter);
1204 if( find_data->directories )
1205 XtFree ((char *) find_data->directories);
1206 FreeMatchInfo (find_data->matches, find_data->num_matches);
1207 XtFree ((char *) find_data);
1212 /************************************************************************
1215 * Update the current find file values within the data structure
1216 * from the current values.
1218 ************************************************************************/
1223 FindData *find_data,
1228 XmString * stringTable;
1231 /* Get the filename to search for (e.g. Filter) */
1233 find_data->displayed = True;
1234 find_data->content = XmTextFieldGetString (find_rec->content);
1235 find_data->filter = (char *)_DtStripSpaces (
1236 XmTextFieldGetString (find_rec->fileNameFilter));
1239 if ((strlen (find_data->filter) == 0) &&
1240 (strcmp(find_data->content, "") == 0))
1242 XtFree ((char *) find_data->filter);
1243 find_data->filter = NULL;
1247 /* Get the list of directories to search */
1248 if(find_data->directories)
1249 XtFree(find_data->directories);
1250 find_data->directories = XmTextFieldGetString (find_rec->searchDirectory);
1254 find_data->directories = (char *)_DtStripSpaces (find_data->directories);
1256 if (strlen (find_data->directories) == 0)
1258 /* A directory must be supplied */
1260 InvalidFindMessage (find_rec, BAD_DIR_NAME, NULL);
1261 XtFree ((char *) find_data->filter);
1262 find_data->filter = NULL;
1263 XtFree ((char *) find_data->directories);
1264 find_data->directories = NULL;
1269 /* Make a copy of the array of matching strings */
1271 find_data->selected_item = find_rec->selectedItem;
1272 XtSetArg (args[0], XmNitemCount, &find_data->num_matches);
1273 XtSetArg (args[1], XmNitems, &stringTable);
1274 XtGetValues (find_rec->matchList, args, 2);
1275 if (find_data->num_matches == 0)
1277 find_data->matches = NULL;
1281 find_data->matches =
1282 (String *) XtMalloc (sizeof(String) * find_data->num_matches);
1284 for (i = 0; i < find_data->num_matches; i++)
1286 find_data->matches[i] = (char *) _XmStringUngenerate(stringTable[i],
1287 XmFONTLIST_DEFAULT_TAG,
1288 XmCHARSET_TEXT, XmCHARSET_TEXT);
1292 #if defined(__hpux) || defined(sun)
1296 XtSetArg (args[0], XmNmenuHistory, &menuHistory);
1297 XtGetValues (find_rec->followLink, args, 1);
1299 if(menuHistory == find_rec->widgArry[ON])
1300 find_data->follow_links = True;
1302 find_data->follow_links = False;
1312 /************************************************************************
1314 * InvalidFindMessage
1315 * Display an error message.
1317 ************************************************************************/
1323 String extra_string )
1328 static String badDirectoryNameMessage = NULL;
1329 static String noDirectoryAccessMessage = NULL;
1330 static String noSearchArgumentMessage = NULL;
1331 static String noExistanceMessage = NULL;
1334 if (noExistanceMessage == NULL)
1336 tmpStr = GETMESSAGE(15,44, "Search Folder name argument is missing.\nType in the name of the folder where you want the search to begin.");
1337 badDirectoryNameMessage = XtNewString(tmpStr);
1339 tmpStr = GetSharedMessage(NO_DIR_ACCESS_ERROR);
1340 noDirectoryAccessMessage = XtNewString(tmpStr);
1342 tmpStr = GETMESSAGE(15, 50, "Search Folder name or File Content argument is missing\nType in the name of the folder where you want the search to begin.\nOr type in the string that you want to search.");
1343 noSearchArgumentMessage = XtNewString(tmpStr);
1345 tmpStr = GETMESSAGE(15,45, "The selected file no longer exists.\n\nSomeone deleted the file after the search process completed.");
1346 noExistanceMessage = XtNewString(tmpStr);
1350 switch (messageIndex)
1353 string = badDirectoryNameMessage;
1356 string = noDirectoryAccessMessage;
1359 string = noExistanceMessage;
1361 case NO_FILE_OR_FOLDER_ARG:
1362 string = noSearchArgumentMessage;
1368 new_string = XtMalloc (strlen(string) + strlen(extra_string) + 1);
1369 (void) sprintf(new_string, string, extra_string);
1370 tmpStr = GetSharedMessage(FIND_ERROR_TITLE);
1371 title = XtNewString(tmpStr);
1372 _DtMessage (find_rec->shell, title, new_string, NULL, HelpRequestCB);
1373 XtFree ((char *) new_string);
1378 tmpStr = GetSharedMessage(FIND_ERROR_TITLE);
1379 title = XtNewString(tmpStr);
1380 _DtMessage (find_rec->shell, title, string, NULL, HelpRequestCB);
1384 _DtTurnOffHourGlass (find_rec->shell);
1390 /************************************************************************
1393 * Free up the space occupied by the array containing the match
1396 ************************************************************************/
1405 if (matches == NULL)
1408 for (i = 0; i < numMatches; i++)
1409 XtFree ((char *) matches[i]);
1412 XtFree ((char *) matches);
1417 /************************************************************************
1420 * Abort an active search operation.
1422 ************************************************************************/
1432 /* To avoid a race condition where the input processing routine */
1433 /* detected the end of the find operation and cleaned things up, */
1434 /* just as the user hit the 'stop' key, we need to check to see */
1435 /* if the operation is still active. */
1437 if (find_rec->popenId != NULL)
1439 /* Abort the find process, and remove the alternate input handler */
1440 (void) fclose (find_rec->popenId);
1441 if(find_rec->childpid > 1) /* trying to be safe */
1442 kill(find_rec->childpid,SIGTERM); /* Ignore errors */
1443 find_rec->popenId = NULL;
1444 find_rec->childpid = -1;
1445 XtRemoveInput (find_rec->alternateInputId);
1446 find_rec->alternateInputId = 0;
1447 find_rec->searchInProgress = False;
1451 /* Change button sensitivities */
1453 XtSetSensitive (find_rec->start, True);
1454 XtSetSensitive (find_rec->close, True);
1455 XtSetSensitive (find_rec->stop, False);
1457 XtSetArg (args[0], XmNdefaultButton, find_rec->start);
1458 XtSetValues (find_rec->form, args, 1);
1463 XtRemoveEventHandler (find_rec->stop, LeaveWindowMask, FALSE, (XtEventHandler)LeaveStopBttn, find_rec);
1464 XtRemoveEventHandler (find_rec->stop, EnterWindowMask, FALSE, (XtEventHandler)EnterStopBttn, find_rec);
1466 _DtTurnOffHourGlass (find_rec->shell);
1467 XmUpdateDisplay (w);
1476 /************************************************************************
1479 * Start an active search operation.
1481 ************************************************************************/
1488 FindData * find_data;
1491 _DtTurnOnHourGlass (find_rec->shell);
1493 /* Extract current dialog values; continue only if data is valid */
1495 find_data = (FindData *) XtMalloc (sizeof (FindData));
1497 if (!GetFindValues (find_rec, find_data, True))
1499 /* Dialog contained bogus values; abort request */
1501 XtFree ((char *) find_data);
1506 /* Desensitize buttons we don't want working during a search */
1508 XtSetSensitive (find_rec->stop, True);
1509 XtSetSensitive (find_rec->start, False);
1510 XtSetSensitive (find_rec->close, False);
1511 XtSetSensitive (find_rec->newFM, False);
1512 XtSetSensitive (find_rec->putOnDT, False);
1514 XtSetArg (args[0], XmNdefaultButton, find_rec->stop);
1515 XtSetArg (args[1], XmNcancelButton, find_rec->close);
1516 XtSetValues (find_rec->form, args, 2);
1518 /* Clean out the match list */
1520 find_rec->selectedItem = -1;
1521 XtSetArg (args[0], XmNitemCount, 0);
1522 XtSetValues (find_rec->matchList, args, 1);
1524 XmUpdateDisplay (w);
1527 /* Start the find process; not much we can say if it fails! */
1529 if (!FindProcessStarted (find_rec, find_data))
1531 XtSetSensitive (find_rec->close, True);
1532 XtSetSensitive (find_rec->newFM, False);
1533 XtSetSensitive (find_rec->putOnDT, False);
1534 XtSetSensitive (find_rec->start, True);
1535 XtSetSensitive (find_rec->stop, False);
1537 XtSetArg (args[0], XmNdefaultButton, find_rec->start);
1538 XtSetArg (args[1], XmNcancelButton, find_rec->close);
1539 XtSetValues (find_rec->form, args, 2);
1541 XmUpdateDisplay (w);
1545 find_rec->searchInProgress = True;
1547 /* This event handlers will be called when user is moving his mouse
1548 over the Find dialog's stop button.
1550 XtAddEventHandler( find_rec->stop, LeaveWindowMask, FALSE, (XtEventHandler)LeaveStopBttn, find_rec );
1551 XtAddEventHandler( find_rec->stop, EnterWindowMask, FALSE, (XtEventHandler)EnterStopBttn, find_rec );
1554 /* Free up the dialog values we allocated */
1556 FreeValues (find_data);
1560 /************************************************************************
1564 ************************************************************************/
1572 _DtTurnOffHourGlass (find_rec->shell);
1576 /************************************************************************
1580 ************************************************************************/
1588 _DtTurnOnHourGlass (find_rec->shell);
1592 /************************************************************************
1595 * Start a search operation.
1597 ************************************************************************/
1602 XtPointer client_data,
1603 XtPointer call_data )
1605 StartSearch (w, (FindRec *) client_data);
1611 /************************************************************************
1614 * Stop an active search operation.
1616 ************************************************************************/
1621 XtPointer client_data,
1622 XtPointer call_data )
1624 StopSearch (w, (FindRec *) client_data);
1630 /************************************************************************
1634 ************************************************************************/
1642 if (strlen (buf) + 1 + extra >= *size)
1644 *size = strlen(buf) + extra + 1025;
1645 buf = XtRealloc (buf, *size);
1654 /************************************************************************
1657 * Change relative path to absolute one.
1659 ************************************************************************/
1663 String current_directory,
1668 absPath = XtMalloc (strlen (path) + strlen (current_directory) + 2);
1669 (void) strcpy (absPath, current_directory);
1670 (void) strcat (absPath, "/");
1671 (void) strcat (absPath, path);
1679 /************************************************************************
1681 * FindProcessStarted()
1682 * Determine whether to do a 'find' or a 'grep'.
1684 ************************************************************************/
1689 FindData *find_data )
1691 FileMgrData * file_mgr_data;
1692 DialogData * dialog_data;
1694 dialog_data = _DtGetInstanceData ((XtPointer) (find_rec->fileMgrRec));
1695 file_mgr_data = (FileMgrData *) dialog_data->data;
1697 return(ExecuteFind(find_rec, find_data, file_mgr_data));
1701 /************************************************************************
1704 * Create the command string for invoking the 'find' process,
1705 * and then execute it.
1707 ************************************************************************/
1712 FindData * find_data,
1713 FileMgrData *file_mgr_data)
1721 XmString label_string;
1724 #if defined (SVR4) || defined(_AIX) || defined(sco)
1725 /* needed for getaccess () call */
1731 Tt_status tt_status;
1733 extern void sigchld_handler(int);
1734 #endif /* __osf__ */
1736 if(strcmp(find_data->content, "") == 0)
1738 label_string = XmStringCreateLocalized (GetSharedMessage(FILES_FOUND_LABEL));
1740 else if(strcmp(find_data->filter, "") == 0)
1742 tmpStr = GETMESSAGE(15,38, "Files Found (by Contents):");
1743 label_string = XmStringCreateLocalized (tmpStr);
1747 tmpStr = (GETMESSAGE(15,39, "Files Found (by Name and Contents):"));
1748 label_string = XmStringCreateLocalized (tmpStr);
1750 XtSetArg (args[0], XmNlabelString, label_string);
1751 XtSetValues (find_rec->listLabel, args, 1);
1752 XmStringFree(label_string);
1754 if(find_data->filter == NULL )
1756 InvalidFindMessage (find_rec, NO_FILE_OR_FOLDER_ARG, NULL);
1761 /* Construct the 'find' command */
1764 command = XtMalloc (commandLen);
1765 (void) strcpy (command, FIND_COMMAND);
1768 /* Convert directory names from external to internal (nfs) format */
1770 findptr = find_data->directories;
1773 /* Search for the end of the directory component */
1775 _DtPathFromInput(findptr, file_mgr_data->current_directory, &host, &path);
1779 InvalidFindMessage (find_rec, NO_DIR_ACCESS, findptr);
1783 link_path = _DtFollowLink(path);
1785 path = XtNewString(link_path);
1792 /* Verify that the path exists and is accessible */
1793 #if defined (SVR4) || defined(_AIX) || defined(sco)
1794 /* needed for getaccess () call */
1795 save_ruid = getuid();
1796 #if !defined(SVR4) && ! defined(sco)
1797 setreuid(geteuid(),-1);
1801 save_rgid = getgid();
1802 #if !defined(SVR4) && !defined(sco)
1803 setregid(getegid(),-1);
1807 access_priv = access (path, R_OK);
1808 #if !defined(SVR4) && !defined(sco)
1809 setreuid(save_ruid,-1);
1810 setregid(save_rgid,-1);
1815 if (access_priv == -1 && geteuid() != root_user)
1818 # if defined(__hp_osf) || defined(__ultrix) || defined(__osf__) || defined(linux) || defined(CSRG_BASED)
1819 setreuid(geteuid(),-1);
1820 if (access ((char *) path, R_OK) == -1)
1824 setresuid(geteuid(),-1,-1);
1825 if (access ((char *) path, R_OK) == -1)
1828 if ((((access_priv = getaccess (path, UID_EUID, NGROUPS_EGID_SUPP,
1829 0, (void *) 0, (void *) 0)) == -1) ||
1830 !(access_priv & R_OK)) && (geteuid () != root_user))
1833 # endif /* Apollo & OSF */
1835 /* Post an error dialog, and then terminate the request */
1837 InvalidFindMessage (find_rec, NO_DIR_ACCESS, findptr);
1838 XtFree ((char *) path);
1839 XtFree ((char *) command);
1844 /* See if the buffer needs to grow */
1846 command = GrowBuffer (command, &commandLen, (int) strlen (path));
1849 /* Add path to the command string */
1851 (void) strcat (command, path);
1852 (void) strcat (command, " ");
1853 XtFree ((char *) path);
1855 /* Add on the rest of the search constraints */
1857 if(strcmp(find_data->content, "") != 0)
1859 command = GrowBuffer (command, &commandLen, (int) strlen (TYPEDIR));
1860 (void) strcat (command, TYPEDIR);
1864 /* File name regular expression */
1865 if (find_data->filter)
1868 GrowBuffer (command, &commandLen, (int)strlen (find_data->filter) +
1869 (int) strlen (NAME_OPTION) + 2);
1871 /* The string needs to be quoted */
1872 (void) strcat (command, NAME_OPTION);
1873 (void) strcat (command, "\"");
1874 (void) strcat (command, find_data->filter);
1875 (void) strcat (command, "\" ");
1880 #if defined(__hpux) || defined(sun)
1884 XtSetArg (args[0], XmNmenuHistory, &menuHistory);
1885 XtGetValues (find_rec->followLink, args, 1);
1887 if(menuHistory == find_rec->widgArry[ON])
1889 /* Add the option to follow a link */
1891 command = GrowBuffer (command, &commandLen,
1892 (int) strlen (FOLLOW_OPTION));
1893 (void) strcat (command, FOLLOW_OPTION);
1898 /* Add the -print to get the results of the find */
1900 command = GrowBuffer (command, &commandLen, (int) strlen (PRINT_OPTION));
1901 (void) strcat (command, PRINT_OPTION);
1904 /* Add the redirector for stderr, so it is disabled */
1906 command = GrowBuffer (command, &commandLen, (int) strlen (REDIRECTOR));
1907 (void) strcat (command, REDIRECTOR);
1910 /* Start the 'find' process */
1913 oldSig = signal(SIGCHLD, sigchld_handler);
1915 oldSig = signal(SIGCHLD, SIG_DFL);
1916 #endif /* __osf__ */
1917 find_rec->popenId = findpopen(command, "r",&(find_rec->childpid));
1918 signal (SIGCHLD, oldSig);
1920 if (find_rec->popenId == NULL)
1922 XtFree ((char *) command);
1927 /* Set up the alternate input source handler */
1929 if(strcmp(find_data->content, "") != 0)
1931 find_rec->alternateInputId =
1932 XtAddInput (fileno (find_rec->popenId), (XtPointer)XtInputReadMask,
1933 (XtInputCallbackProc)AlternateInputHandler2, find_rec);
1937 find_rec->alternateInputId =
1938 XtAddInput (fileno (find_rec->popenId), (XtPointer)XtInputReadMask,
1939 (XtInputCallbackProc)AlternateInputHandler, find_rec);
1942 /* printf ("%s\n", command); */
1944 XtFree ((char *) command);
1950 /************************************************************************
1953 * Create the command string for invoking the 'grep' process,
1954 * and then execute it.
1956 ************************************************************************/
1958 ExecuteGrep( FindRec * find_rec)
1969 /* Construct the 'grep' command */
1971 command = XtMalloc (commandLen);
1972 (void) strcpy (command, GREP_COMMAND);
1974 contents = XmTextFieldGetString (find_rec->content);
1976 command = GrowBuffer (command, &commandLen, strlen(contents) + 4);
1978 (void) strcat (command, "\"");
1979 (void) strcat (command, contents);
1980 (void) strcat (command, "\"");
1981 (void) strcat (command, " ");
1986 ptr2 = DtStrchr(ptr, ',');
1989 XtFree ((char *) command);
1993 if(find_rec->popenId != NULL)
1994 (void) fclose (find_rec->popenId);
1995 find_rec->popenId = NULL;
1996 find_rec->alternateInputId = 0;
1998 find_rec->searchInProgress = False;
2000 /* Reset button sensitivity */
2002 XtSetSensitive (find_rec->close, True);
2003 XtSetSensitive (find_rec->start, True);
2004 XtSetSensitive (find_rec->stop, False);
2006 XtSetArg (args[0], XmNitemCount, &item_count);
2007 XtGetValues (find_rec->matchList, args, 1);
2009 XtSetArg (args[0], XmNdefaultButton, find_rec->start);
2010 XtSetValues (find_rec->form, args, 1);
2012 if (item_count == 0)
2016 tmpStr = GetSharedMessage(FIND_ERROR_TITLE);
2017 title = XtNewString(tmpStr);
2018 tmpStr = GetSharedMessage(NO_FILES_FOUND_ERROR);
2019 msg = XtNewString(tmpStr);
2020 _DtMessage (find_rec->shell, title, msg, NULL, HelpRequestCB);
2026 XmListSelectPos(find_rec->matchList, 1, True);
2027 XmProcessTraversal(find_rec->matchList, XmTRAVERSE_CURRENT);
2030 _DtTurnOffHourGlass (find_rec->shell);
2036 command = GrowBuffer (command, &commandLen, (int) strlen (ptr) + 3);
2038 /* Add buffer to the command string */
2040 (void) strcat (command, ptr);
2041 (void) strcat (command, " ");
2047 /* Add the redirector for stderr, so it is disabled */
2049 command = GrowBuffer (command, &commandLen, (int) strlen (REDIRECTOR));
2050 (void) strcat (command, REDIRECTOR);
2053 /* Start the 'grep' process */
2055 if ((find_rec->popenId = popen (command, "r")) == NULL)
2057 XtFree ((char *) command);
2062 /* Set up the alternate input source handler */
2064 find_rec->alternateInputId =
2065 XtAddInput (fileno (find_rec->popenId), (XtPointer)XtInputReadMask,
2066 (XtInputCallbackProc)AlternateInputHandler3, find_rec);
2068 /* printf ("%s\n", command); */
2070 XtFree ((char *) command);
2083 /************************************************************************
2085 * AlternateInputHandler()
2086 * When a 'find' operation is taking place, this function will be
2087 * invoked whenever the 'find' process has some data to send to us.
2088 * The function will extract a single line from the pipe, and then
2089 * add it to the list of matches, if it matches the selected file
2092 ************************************************************************/
2095 AlternateInputHandler(
2096 XtPointer client_data,
2100 static int bufSize = 0;
2101 static char * buf = NULL;
2102 FindRec * find_rec = (FindRec *) client_data;
2103 FileMgrData *file_mgr_data;
2104 DialogData * dialog_data;
2112 struct stat stat_data;
2118 /* Abort if the pipe has already been closed */
2120 if (find_rec->popenId == NULL) {
2121 XtSetArg (args[0], XmNdefaultButton, find_rec->start);
2122 XtSetValues (find_rec->form, args, 1);
2123 _DtTurnOffHourGlass (find_rec->shell);
2128 /* Allocate some buffer, if this is the first time here */
2133 buf = XtMalloc (bufSize);
2136 dialog_data=_DtGetInstanceData((XtPointer)find_rec->fileMgrRec);
2137 file_mgr_data = (FileMgrData *) dialog_data->data;
2139 /* Extract the next line, upto a NewLine or EOF */
2143 while ((offset < bufSize - 1) &&
2144 ((count = fread (&next, sizeof (char), 1, find_rec->popenId)) == 1) &&
2147 buf[offset++] = next;
2151 /* See if we broke out because the buffer needs to grow */
2153 if (offset >= bufSize)
2156 buf = XtRealloc (buf, bufSize);
2161 /* Save the string we just extracted */
2166 buf = (String) DtEliminateDots (buf);
2168 if ((stat (buf, &stat_data) == 0) ||
2169 (lstat (buf, &stat_data) == 0))
2173 /* Strip out any invisible files */
2176 file_type = (char *) DtDtsDataToDataType(findptr, NULL, 0, NULL,
2178 if (_DtCheckForDataTypeProperty(file_type, "invisible"))
2182 /* Add string to the scrolled list of matches */
2183 /* Add to the scrolled list of matches */
2186 strncmp(desktop_dir, findptr, strlen(desktop_dir)) != 0)
2188 if(file_mgr_data->restricted_directory != NULL)
2189 string = XmStringCreateLocalized (findptr +
2190 strlen(file_mgr_data->restricted_directory));
2193 XmStringCreateLocalized (findptr);
2194 XmListAddItemUnselected (find_rec->matchList, string, 0);
2195 XmStringFree (string);
2202 /* EOF; command is complete */
2205 (void) fclose (find_rec->popenId);
2206 find_rec->popenId = NULL;
2207 XtRemoveInput (find_rec->alternateInputId);
2208 XtRemoveEventHandler (find_rec->stop, LeaveWindowMask, FALSE, (XtEventHandler)LeaveStopBttn, find_rec);
2209 XtRemoveEventHandler (find_rec->stop, EnterWindowMask, FALSE, (XtEventHandler)EnterStopBttn, find_rec);
2210 find_rec->alternateInputId = 0;
2212 find_rec->searchInProgress = False;
2214 /* Reset button sensitivity */
2216 XtSetSensitive (find_rec->close, True);
2217 XtSetSensitive (find_rec->start, True);
2218 XtSetSensitive (find_rec->stop, False);
2220 XtSetArg (args[0], XmNitemCount, &item_count);
2221 XtGetValues (find_rec->matchList, args, 1);
2223 XtSetArg (args[0], XmNdefaultButton, find_rec->start);
2224 XtSetValues (find_rec->form, args, 1);
2226 if (item_count == 0)
2230 tmpStr = GetSharedMessage(FIND_ERROR_TITLE);
2231 title = XtNewString(tmpStr);
2232 tmpStr = GetSharedMessage(NO_FILES_FOUND_ERROR);
2233 msg = XtNewString(tmpStr);
2234 _DtMessage (find_rec->shell, title, msg, NULL, HelpRequestCB);
2240 XmListSelectPos(find_rec->matchList, 1, True);
2241 XmProcessTraversal(find_rec->matchList, XmTRAVERSE_CURRENT);
2244 _DtTurnOffHourGlass (find_rec->shell);
2251 AlternateInputHandler2(
2252 XtPointer client_data,
2256 static int bufSize = 0;
2257 static char * buf = NULL;
2258 FindRec * find_rec = (FindRec *) client_data;
2263 struct stat stat_data;
2266 content = XmTextFieldGetString (find_rec->fileNameFilter);
2267 if(strcmp(content, "") == 0)
2268 content = XtNewString("*");
2270 /* Abort if the pipe has already been closed */
2272 if (find_rec->popenId == NULL) {
2275 _DtTurnOffHourGlass (find_rec->shell);
2276 XtSetArg (args[0], XmNdefaultButton, find_rec->start);
2277 XtSetValues (find_rec->form, args, 1);
2282 /* Allocate some buffer, if this is the first time here */
2287 buf = XtMalloc (bufSize);
2291 /* Extract the next line, upto a NewLine or EOF */
2295 while ((offset < bufSize - 1) &&
2296 ((count = fread (&next, sizeof (char), 1, find_rec->popenId)) == 1) &&
2299 buf[offset++] = next;
2303 /* See if we broke out because the buffer needs to grow */
2305 if (offset >= bufSize)
2308 buf = XtRealloc (buf, bufSize);
2313 /* Save the string we just extracted */
2318 buf = (String) DtEliminateDots (buf);
2320 if ((stat (buf, &stat_data) == 0) ||
2321 (lstat (buf, &stat_data) == 0))
2327 /* save it with the content, */
2330 buffer = (char *)XtMalloc(strlen(findptr) + strlen(content) + 3);
2331 strcpy(buffer, findptr);
2336 size = strlen(findptr) + strlen(buffer) + strlen(content) +4;
2337 buffer = (char *)XtRealloc(buffer, size);
2338 strcat(buffer, findptr);
2340 strcat(buffer, "/");
2341 strcat(buffer, content);
2342 strcat(buffer, ",");
2349 /* EOF; command is complete */
2352 (void) fclose (find_rec->popenId);
2353 find_rec->popenId = NULL;
2354 XtRemoveInput (find_rec->alternateInputId);
2355 XtRemoveEventHandler (find_rec->stop, LeaveWindowMask, FALSE, (XtEventHandler)LeaveStopBttn, find_rec);
2356 XtRemoveEventHandler (find_rec->stop, EnterWindowMask, FALSE, (XtEventHandler)EnterStopBttn, find_rec);
2357 find_rec->alternateInputId = 0;
2359 ExecuteGrep(find_rec);
2369 AlternateInputHandler3(
2370 XtPointer client_data,
2374 static int bufSize = 0;
2375 static char * buf = NULL;
2376 FindRec * find_rec = (FindRec *) client_data;
2377 FileMgrData *file_mgr_data;
2378 DialogData * dialog_data;
2385 struct stat stat_data;
2390 /* Abort if the pipe has already been closed */
2392 if (find_rec->popenId == NULL) {
2393 _DtTurnOffHourGlass (find_rec->shell);
2395 XtSetArg (args[0], XmNdefaultButton, find_rec->start);
2396 XtSetValues (find_rec->form, args, 1);
2400 /* Allocate some buffer, if this is the first time here */
2405 buf = XtMalloc (bufSize);
2408 dialog_data=_DtGetInstanceData((XtPointer)find_rec->fileMgrRec);
2409 file_mgr_data = (FileMgrData *) dialog_data->data;
2411 /* Extract the next line, upto a NewLine or EOF */
2414 while ((offset < bufSize - 1) &&
2415 ((count = fread (&next, sizeof (char), 1, find_rec->popenId)) == 1) &&
2418 buf[offset++] = next;
2422 /* See if we broke out because the buffer needs to grow */
2424 if (offset >= bufSize)
2427 buf = XtRealloc (buf, bufSize);
2432 /* Save the string we just extracted */
2437 buf = (String) DtEliminateDots (buf);
2439 if ((stat (buf, &stat_data) == 0) ||
2440 (lstat (buf, &stat_data) == 0))
2446 /* Make sure its nots a directory */
2447 if(!((stat_data.st_mode & S_IFMT) == S_IFDIR) &&
2448 strncmp(desktop_dir, findptr, strlen(desktop_dir)) != 0)
2450 if(file_mgr_data->restricted_directory != NULL)
2451 string = XmStringCreateLocalized (findptr +
2452 strlen(file_mgr_data->restricted_directory));
2455 XmStringCreateLocalized (findptr);
2456 XmListAddItemUnselected (find_rec->matchList, string, 0);
2457 XmStringFree (string);
2465 /* EOF; command is complete */
2468 (void) fclose (find_rec->popenId);
2469 find_rec->popenId = NULL;
2470 XtRemoveInput (find_rec->alternateInputId);
2471 XtRemoveEventHandler (find_rec->stop, LeaveWindowMask, FALSE, (XtEventHandler)LeaveStopBttn, find_rec);
2472 XtRemoveEventHandler (find_rec->stop, EnterWindowMask, FALSE, (XtEventHandler)EnterStopBttn, find_rec);
2473 find_rec->alternateInputId = 0;
2476 ExecuteGrep(find_rec);
2479 find_rec->searchInProgress = False;
2481 /* Reset button sensitivity */
2483 XtSetSensitive (find_rec->close, True);
2484 XtSetSensitive (find_rec->start, True);
2485 XtSetSensitive (find_rec->stop, False);
2487 XtSetArg (args[0], XmNitemCount, &item_count);
2488 XtGetValues (find_rec->matchList, args, 1);
2489 XtSetArg (args[0], XmNdefaultButton, find_rec->start);
2490 XtSetValues (find_rec->form, args, 1);
2492 if (item_count == 0)
2496 tmpStr = GetSharedMessage(FIND_ERROR_TITLE);
2497 title = XtNewString(tmpStr);
2498 tmpStr = GetSharedMessage(NO_FILES_FOUND_ERROR);
2499 msg = XtNewString(tmpStr);
2500 _DtMessage (find_rec->shell, title, msg, NULL, HelpRequestCB);
2506 XmListSelectPos(find_rec->matchList, 1, True);
2507 XmProcessTraversal(find_rec->matchList, XmTRAVERSE_CURRENT);
2510 _DtTurnOffHourGlass (find_rec->shell);
2518 /************************************************************************
2521 * Get host/dir for selected match item
2523 ************************************************************************/
2531 FileMgrData *file_mgr_data)
2539 XtSetArg (args[0], XmNitemCount, &count);
2540 XtSetArg (args[1], XmNitems, &items);
2541 XtGetValues (list, args, 2);
2543 temp = (char *) _XmStringUngenerate(items[selectedItem],
2544 XmFONTLIST_DEFAULT_TAG,
2545 XmCHARSET_TEXT, XmCHARSET_TEXT);
2548 if(file_mgr_data->restricted_directory != NULL)
2550 tmpptr = (char *)XtMalloc(
2551 strlen(file_mgr_data->restricted_directory) +
2553 strcpy(tmpptr, file_mgr_data->restricted_directory);
2554 strcat(tmpptr, *path);
2557 *path = (String)tmpptr;
2559 else if (*host != NULL)
2561 *path = XtNewString(*path);
2568 /************************************************************************
2571 * Check if the path specifies a directory or a file. If its a
2572 * file, then extract out the directory portion, since thats all
2575 ************************************************************************/
2585 Tt_status tt_status;
2586 struct stat statData;
2588 realPath = (String) ResolveLocalPathName (host, path, NULL, home_host_name, &tt_status);
2589 if( TT_OK != tt_status )
2593 if( stat (realPath, &statData ) != 0 )
2595 if( lstat (realPath, &statData) != 0 )
2604 /* Path already is a directory */
2606 if ((statData.st_mode & S_IFMT) == S_IFDIR)
2612 if(findptr = strrchr (path, '/'))
2616 *file_name = findptr;
2629 /************************************************************************
2632 * Do the real work of viewing a directory.
2634 ************************************************************************/
2639 XtPointer client_data,
2640 XtPointer call_data )
2643 FileMgrData *file_mgr_data;
2644 DialogData *file_mgr_dialog_data;
2645 DialogData *dialog_data;
2646 DirectorySet *directory_data;
2647 FileViewData *file_view_data;
2652 find_rec = (FindRec *)client_data;
2653 file_mgr_dialog_data =
2654 (DialogData *) _DtGetInstanceData ((XtPointer) find_rec->fileMgrRec);
2655 file_mgr_data = (FileMgrData *) (file_mgr_dialog_data->data);
2657 GetFileName (find_rec->matchList, find_rec->selectedItem, &host, &path,
2663 /* No host specified, use the one associated with the view */
2665 if (ExtractDirectory (file_mgr_data->host, path, &file_name))
2667 initiating_view = (XtPointer) file_mgr_data;
2668 if(file_mgr_data->restricted_directory == NULL)
2669 dialog_data = GetNewView (file_mgr_data->host, path, NULL, NULL, 0);
2672 special_view = True;
2673 special_treeType = file_mgr_data->show_type;
2674 special_viewType = file_mgr_data->view;
2675 special_orderType = file_mgr_data->order;
2676 special_directionType = file_mgr_data->direction;
2677 special_randomType = file_mgr_data->positionEnabled;
2678 special_restricted =
2679 XtNewString(file_mgr_data->restricted_directory);
2680 if(file_mgr_data->title == NULL)
2681 special_title = NULL;
2683 special_title = XtNewString(file_mgr_data->title);
2684 special_helpVol = XtNewString(file_mgr_data->helpVol);
2685 if(file_mgr_data->toolbox)
2686 dialog_data = GetNewView (file_mgr_data->host, path,
2687 file_mgr_data->restricted_directory, NULL, 0);
2689 dialog_data = GetNewView (file_mgr_data->host,
2690 path, NULL, NULL, 0);
2694 InvalidFindMessage (find_rec, NO_EXISTANCE, NULL);
2698 if (ExtractDirectory (host, path, &file_name))
2700 initiating_view = (XtPointer) file_mgr_data;
2701 if(file_mgr_data->restricted_directory == NULL)
2702 dialog_data = GetNewView (host, path, NULL, NULL, 0);
2705 special_view = True;
2706 special_treeType = file_mgr_data->show_type;
2707 special_viewType = file_mgr_data->view;
2708 special_orderType = file_mgr_data->order;
2709 special_directionType = file_mgr_data->direction;
2710 special_randomType = file_mgr_data->positionEnabled;
2711 special_restricted =
2712 XtNewString(file_mgr_data->restricted_directory);
2713 if(file_mgr_data->title == NULL)
2714 special_title = NULL;
2716 special_title = XtNewString(file_mgr_data->title);
2717 special_helpVol = XtNewString(file_mgr_data->helpVol);
2718 if(file_mgr_data->toolbox)
2719 dialog_data = GetNewView (file_mgr_data->host, path,
2720 file_mgr_data->restricted_directory, NULL, 0);
2722 dialog_data = GetNewView (file_mgr_data->host,
2723 path, NULL, NULL, 0);
2727 InvalidFindMessage (find_rec, NO_EXISTANCE, NULL);
2730 if(dialog_data != NULL)
2732 file_mgr_data = (FileMgrData *) dialog_data->data;
2733 directory_data = file_mgr_data->directory_set[0];
2735 for (j = 0; j < directory_data->file_count; j++)
2737 file_view_data = directory_data->file_view_data[j];
2739 if (file_view_data->filtered != True &&
2740 strcmp(file_name, file_view_data->file_data->file_name) == 0)
2742 SelectFile (file_mgr_data, file_view_data);
2743 PositionFileView(file_view_data, file_mgr_data);
2747 if (!directory_data->file_count)
2748 file_mgr_data->desktop_file = XtNewString(file_name);
2750 file_mgr_data->desktop_file = NULL;
2752 if(file_mgr_data->selection_list[0] != NULL)
2753 ActivateSingleSelect ((FileMgrRec *) file_mgr_data->file_mgr_rec,
2754 file_mgr_data->selection_list[0]->file_data->logical_type);
2756 XtFree ((char *) host);
2757 XtFree ((char *) path);
2762 /************************************************************************
2765 * Put the found file/directory on the Desktop
2767 ************************************************************************/
2772 XtPointer client_data,
2773 XtPointer call_data )
2775 FindRec *find_rec = (FindRec *)client_data;
2776 FileMgrData *file_mgr_data;
2777 DialogData *file_mgr_dialog_data;
2782 int EndIndex = desktop_data->numIconsUsed;
2784 file_mgr_dialog_data =
2785 (DialogData *) _DtGetInstanceData ((XtPointer) find_rec->fileMgrRec);
2786 file_mgr_data = (FileMgrData *) (file_mgr_dialog_data->data);
2788 GetFileName (find_rec->matchList, find_rec->selectedItem, &host, &path,
2791 if (file_mgr_data->toolbox)
2792 path = _DtResolveAppManPath(path, file_mgr_data->restricted_directory);
2795 result = ExtractDirectory (file_mgr_data->host, path, &file_name);
2797 result = ExtractDirectory (host, path, &file_name);
2801 InvalidFindMessage (find_rec, NO_EXISTANCE, NULL);
2802 XtFree((char *)path);
2803 XtFree((char *)host);
2807 if(file_name == NULL)
2809 fileptr = strrchr (path, '/');
2811 file_name = fileptr + 1;
2816 SetupDesktopWindow (XtDisplay(widget), NULL,
2817 (FileMgrRec *)file_mgr_data->file_mgr_rec,
2818 file_name, file_mgr_data->host, path, -1, -1,
2819 file_mgr_data->restricted_directory,EndIndex);
2823 SetupDesktopWindow (XtDisplay(widget), NULL,
2824 (FileMgrRec *)file_mgr_data->file_mgr_rec,
2825 file_name, host, path, -1, -1,
2826 file_mgr_data->restricted_directory,EndIndex);
2828 XtFree((char *)path);
2829 XtFree((char *)host);
2832 /************************************************************************
2835 * Saves the index of the selected item
2837 ************************************************************************/
2842 XtPointer client_data,
2843 XtPointer call_data )
2845 FindRec * find_rec = (FindRec *) client_data;
2846 XmListCallbackStruct * cb = (XmListCallbackStruct *) call_data;
2848 find_rec->selectedItem = cb->item_position - 1;
2850 XtSetSensitive (find_rec->newFM, True);
2851 XtSetSensitive (find_rec->putOnDT, True);
2858 FindData *find_data )
2860 /* Force the focus to the text field */
2861 XmProcessTraversal(find_rec->fileNameFilter, XmTRAVERSE_CURRENT);
2865 findpopen(cmd,mode,childpid)
2870 static char *pname = "findpopen";
2872 register int parentside, childside;
2876 parentside = (mode[0] == 'r')? fd[0]:fd[1];
2877 childside = (mode[0] == 'r')? fd[1]:fd[0];
2878 if((*childpid = fork()) == 0)
2882 DBGFORK(("%s: child forked, pipe %d\n", pname, childside));
2884 /* Child has to select the stdin or stdout based on the mode */
2885 read_or_write = (mode[0] == 'r')? 1:0;
2886 (void) close(parentside);
2887 /* Dup the stdin or stdout based on the mode */
2888 if ( read_or_write != childside ) /* If what we got is already stdin */
2889 { /* or stdout then no need to close */
2890 (void) close(read_or_write);
2891 (void) fcntl(childside, F_DUPFD, read_or_write);
2892 (void) close(childside); /* Save a file descriptor */
2894 (void) execl(KORNSHELL, "ksh", "-c", cmd, (char *)0);
2895 /* Need to process the error return */
2897 DBGFORK(("%s: child exiting\n", pname));
2904 DBGFORK(("%s: forked child<%d>, pipe %d\n", pname, childpid, parentside));
2906 (void) close(childside); /* We don't need child side, so close it */
2907 return(fdopen(parentside, mode));