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>
124 #include "SharedProcs.h"
131 #include "SharedMsgs.h"
134 typedef struct _Dummy {
145 /* Error message defines */
147 #define BAD_DIR_NAME 0
148 #define NO_DIR_ACCESS 1
149 #define NO_EXISTANCE 2
150 #define NO_FILE_OR_FOLDER_ARG 3
153 /* More string defines */
154 static char * PRINT_OPTION = " -print ";
155 static char * FIND_COMMAND = "find ";
156 static char * GREP_COMMAND = "grep -i -l ";
157 static char * NAME_OPTION = " -name ";
158 #if defined(__hpux) || defined(sun)
159 static char * FOLLOW_OPTION = " -follow";
161 static char * REDIRECTOR = " 2>&-";
162 static char * TYPEDIR = " -type d";
163 static char * FIND_FILE = "FindFile";
166 #define CURRENT_VIEW 1
170 /* Resource definitions for the find file dialog */
172 static DialogResource resources[] =
174 { "folders", XmRString, sizeof(String),
175 XtOffset(FindDataPtr, directories),
176 (XtPointer) NULL, _DtStringToString },
178 { "name", XmRString, sizeof(String),
179 XtOffset(FindDataPtr, filter),
180 (XtPointer) NULL, _DtStringToString },
182 { "selectedItem", XmRInt, sizeof(int),
183 XtOffset(FindDataPtr, selected_item),
184 (XtPointer) -1, _DtIntToString },
186 { "content", XmRString, sizeof(String),
187 XtOffset(FindDataPtr, content),
188 (XtPointer) NULL, _DtStringToString },
192 static DialogResource match_resources[] =
194 { "matchData", XmRString, sizeof(String),
195 XtOffset(DummyPtr, string),
196 (XtPointer) NULL, _DtStringToString },
199 /******** Static Function Declarations ********/
204 Widget *return_widget,
206 static void InstallChange(
208 XtCallbackProc callback,
209 XtPointer client_data) ;
210 static void InstallClose(
212 XtCallbackProc callback,
213 XtPointer client_data) ;
216 static XtPointer GetValues(
218 static XtPointer GetDefaultValues( void ) ;
219 static XtPointer GetResourceValues(
220 XrmDatabase data_base,
222 static void SetValues(
224 FindData *find_data) ;
225 static void WriteResourceValues(
229 static void FreeValues(
230 FindData *find_data) ;
231 static Boolean GetFindValues(
235 static void InvalidFindMessage(
238 String extra_string) ;
239 static int FreeMatchInfo(
242 static void LeaveStopBttn(
246 static void EnterStopBttn(
250 static void StopSearch(
253 static void StartSearch(
256 static void StartCallback(
258 XtPointer client_data,
259 XtPointer call_data) ;
260 static void StopCallback(
262 XtPointer client_data,
263 XtPointer call_data) ;
264 static String GrowBuffer(
268 static String MakeAbsolute(
269 String current_directory,
271 static Boolean FindProcessStarted(
273 FindData *find_data) ;
274 static Boolean ExecuteFind(
277 FileMgrData *file_mgr_data) ;
278 static Boolean ExecuteGrep(
279 FindRec * find_rec) ;
280 static void AlternateInputHandler(
281 XtPointer client_data,
284 static void AlternateInputHandler2(
285 XtPointer client_data,
288 static void AlternateInputHandler3(
289 XtPointer client_data,
292 static void GetFileName(
297 FileMgrData *file_mgr_data) ;
298 static Boolean ExtractDirectory(
304 XtPointer client_data,
305 XtPointer call_data) ;
306 static void FindPutOnDesktop(
308 XtPointer client_data,
309 XtPointer call_data) ;
310 static void SetActiveItem(
312 XtPointer client_data,
313 XtPointer call_data) ;
314 static void SetFocus(
316 FindData *find_data ) ;
317 FILE *findpopen(char *,char *,int *);
319 /******** End Static Function Declarations ********/
323 * The Dialog Class structure.
326 static DialogClass findClassRec =
331 (DialogInstallChangeProc) InstallChange,
332 (DialogInstallCloseProc) InstallClose,
333 (DialogDestroyProc) Destroy,
334 (DialogGetValuesProc) GetValues,
337 (DialogSetValuesProc) SetValues,
339 (DialogFreeValuesProc) FreeValues,
340 (DialogMapWindowProc) _DtGenericMapWindow,
341 (DialogSetFocusProc) SetFocus,
344 DialogClass * findClass = (DialogClass *) &findClassRec;
349 /************************************************************************
353 ************************************************************************/
359 Widget *return_widget,
363 Widget shell, form, form1, form2;
364 Widget newFM, outputSeparator;
365 Widget headLabel, contentLabel, contentText;
366 Widget filterText, filterLabel, listLabel, scrolledList, dirName, dirLabel;
367 #if defined(__hpux) || defined(sun)
368 Widget followLink, followLinkPD;
370 Widget putOnDT, separator;
371 Widget start, stop, close, help;
372 XmString label_string;
376 XtTranslations trans_table;
379 /* Initialize some global varibles */
383 /* Allocate the find file dialog instance record. */
385 find_rec = (FindRec *) XtMalloc (sizeof (FindRec));
387 /* Create the shell and form used for the dialog. */
390 XtSetArg (args[n], XmNmwmFunctions, MWM_FUNC_MOVE |
391 MWM_FUNC_CLOSE ); ++n;
392 XtSetArg (args[n], XmNmwmDecorations, MWM_DECOR_BORDER |
393 MWM_DECOR_TITLE); ++n;
394 XtSetArg (args[n], XmNallowShellResize, False); ++n;
395 shell = XmCreateDialogShell (parent, "find_files", args, n);
397 /* Set the useAsyncGeo on the shell */
398 XtSetArg (args[0], XmNuseAsyncGeometry, True);
399 XtSetValues (XtParent(shell), args, 1);
401 trans_table = XtParseTranslationTable(translations_space);
404 XtSetArg (args[n], XmNmarginWidth, 1); n++;
405 XtSetArg (args[n], XmNmarginHeight, 1); n++;
406 XtSetArg (args[n], XmNshadowThickness, 1); n++;
407 XtSetArg (args[n], XmNshadowType, XmSHADOW_OUT); n++;
408 XtSetArg (args[n], XmNautoUnmanage, False); n++;
409 form = XmCreateForm (shell, "form", args, n);
410 XtAddCallback(form, XmNhelpCallback, (XtCallbackProc)HelpRequestCB,
411 HELP_FIND_DIALOG_STR);
413 label_string = XmStringCreateLocalized ((GETMESSAGE(15,47, "Fill in one or more fields to specify which items to find:")));
415 XtSetArg (args[n], XmNlabelString, label_string); n++;
416 XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
417 XtSetArg (args[n], XmNleftOffset, 5); n++;
418 XtSetArg (args[n], XmNtopAttachment, XmATTACH_FORM); n++;
419 XtSetArg (args[n], XmNtopOffset, 14); n++;
420 XtSetArg (args[n], XmNtraversalOn, False); n++;
421 headLabel = XmCreateLabelGadget (form, "hdlb", args, n);
422 XtManageChild (headLabel);
423 XmStringFree (label_string);
425 label_string = XmStringCreateLocalized ((GETMESSAGE(15,31, "File or Folder Name: ")));
427 XtSetArg (args[n], XmNlabelString, label_string); n++;
428 XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
429 XtSetArg (args[n], XmNleftOffset, 5); n++;
430 XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
431 XtSetArg (args[n], XmNtopWidget, headLabel); n++;
432 XtSetArg (args[n], XmNtopOffset, 15); n++;
433 XtSetArg (args[n], XmNtraversalOn, False); n++;
434 filterLabel = XmCreateLabelGadget (form, "file_name_label", args, n);
435 XtManageChild (filterLabel);
436 XmStringFree (label_string);
437 XtAddCallback(filterLabel, XmNhelpCallback, (XtCallbackProc)HelpRequestCB,
438 HELP_FIND_DIALOG_STR);
441 XtSetArg (args[n], XmNleftAttachment, XmATTACH_WIDGET); n++;
442 XtSetArg (args[n], XmNleftWidget, filterLabel); n++;
443 XtSetArg (args[n], XmNleftOffset, 0); n++;
444 XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
445 XtSetArg (args[n], XmNtopWidget, headLabel); n++;
446 XtSetArg (args[n], XmNtopOffset, 10); n++;
447 XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n++;
448 XtSetArg (args[n], XmNrightOffset, 10); n++;
449 filterText = XmCreateTextField (form, "file_name_text", args, n);
450 XtManageChild (filterText);
451 XtAddCallback(filterText, XmNhelpCallback, (XtCallbackProc)HelpRequestCB,
452 HELP_FIND_DIALOG_STR);
454 /* set up translations in the filter text edit widget */
455 XtOverrideTranslations(filterText, trans_table);
457 label_string = XmStringCreateLocalized ((GETMESSAGE(15,32, "File Contents:")));
459 XtSetArg (args[n], XmNlabelString, label_string); n++;
460 XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
461 XtSetArg (args[n], XmNleftOffset, 5); n++;
462 XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
463 XtSetArg (args[n], XmNtopWidget, filterText); n++;
464 XtSetArg (args[n], XmNtopOffset, 15); n++;
465 XtSetArg (args[n], XmNtraversalOn, False); n++;
466 contentLabel = XmCreateLabelGadget (form, "content_label", args, n);
467 XtManageChild (contentLabel);
468 XmStringFree (label_string);
469 XtAddCallback(contentLabel, XmNhelpCallback, (XtCallbackProc)HelpRequestCB,
470 HELP_FIND_DIALOG_STR);
473 XtSetArg (args[n], XmNleftAttachment, XmATTACH_WIDGET); n++;
474 XtSetArg (args[n], XmNleftWidget, contentLabel); n++;
475 XtSetArg (args[n], XmNleftOffset, 0); n++;
476 XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
477 XtSetArg (args[n], XmNtopWidget, filterText); n++;
478 XtSetArg (args[n], XmNtopOffset, 10); n++;
479 XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n++;
480 XtSetArg (args[n], XmNrightOffset, 10); n++;
481 contentText = XmCreateTextField (form, "content_text", args, n);
482 XtManageChild (contentText);
483 XtAddCallback(contentText, XmNhelpCallback, (XtCallbackProc)HelpRequestCB,
484 HELP_FIND_DIALOG_STR);
486 #if defined(__hpux) || defined(sun)
488 XtSetArg (args[n], XmNmarginWidth, 1); n++;
489 XtSetArg (args[n], XmNmarginHeight, 1); n++;
490 XtSetArg (args[n], XmNshadowThickness, 0); n++;
491 XtSetArg (args[n], XmNautoUnmanage, False); n++;
492 XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
493 XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n++;
494 XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
495 XtSetArg (args[n], XmNtopWidget, contentText); n++;
496 XtSetArg (args[n], XmNtopOffset, 5); n++;
497 form1 = XmCreateForm (form, "form1", args, n);
498 XtManageChild (form1);
500 /* Create a Pulldown MenuPane that will contain the font sizes */
501 followLinkPD = XmCreatePulldownMenu(form1, "fLinkPD", args, 0);
503 label_string = XmStringCreateLocalized ((GETMESSAGE(15,33, "On")));
504 XtSetArg(args[0], XmNmarginHeight, 2);
505 XtSetArg(args[1], XmNmarginWidth, 12);
506 XtSetArg(args[2], XmNlabelString, label_string); n++;
507 find_rec->widgArry[0] =
508 XmCreatePushButtonGadget(followLinkPD, "On", args, 3);
509 XmStringFree(label_string);
511 label_string = XmStringCreateLocalized ((GETMESSAGE(15,34, "Off")));
512 XtSetArg(args[2], XmNlabelString, label_string);
513 find_rec->widgArry[1] =
514 XmCreatePushButtonGadget(followLinkPD, "Off", args, 3);
515 XmStringFree(label_string);
517 XtManageChildren(find_rec->widgArry, 2);
519 label_string = XmStringCreateLocalized ((GETMESSAGE(15,35, "Follow Links: ")));
520 /* create the Option Menu and attach it to the Pulldown MenuPane */
522 XtSetArg (args[n], XmNlabelString, label_string); n++;
523 XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
524 XtSetArg (args[n], XmNleftOffset, 30); n++;
525 XtSetArg (args[n], XmNtopAttachment, XmATTACH_FORM); n++;
526 XtSetArg (args[n], XmNtopOffset, 5); n++;
527 XtSetArg (args[n], XmNbottomAttachment, XmATTACH_FORM); n++;
528 XtSetArg (args[n], XmNbottomOffset, 5); n++;
529 XtSetArg(args[n], XmNsubMenuId, followLinkPD); n++;
530 XtSetArg(args[n], XmNmenuHistory, find_rec->widgArry[OFF]); n++;
531 followLink = XmCreateOptionMenu(form1, "fLink", args, n);
532 XtManageChild (followLink);
533 XtAddCallback(followLink, XmNhelpCallback, (XtCallbackProc)HelpRequestCB,
534 HELP_FIND_DIALOG_STR);
539 XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
540 XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n++;
541 XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
542 #if defined(__hpux) || defined(sun)
543 XtSetArg (args[n], XmNtopWidget, form1); n++;
545 XtSetArg (args[n], XmNtopWidget, contentText); n++;
547 XtSetArg (args[n], XmNtopOffset, 5); n++;
548 outputSeparator = XmCreateSeparatorGadget (form, "opSeparator", args, n);
549 XtManageChild (outputSeparator);
551 /* Create the field for collecting the directory names to search */
553 label_string = XmStringCreateLocalized (((char *)GETMESSAGE(15, 42, "Search Folder: ")));
555 XtSetArg (args[n], XmNlabelString, label_string); n++;
556 XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
557 XtSetArg (args[n], XmNleftOffset, 5); n++;
558 XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
559 XtSetArg (args[n], XmNtopWidget, outputSeparator); n++;
560 XtSetArg (args[n], XmNtopOffset, 15); n++;
561 XtSetArg (args[n], XmNtraversalOn, False); n++;
562 dirLabel = XmCreateLabelGadget (form, "folder_name_label", args, n);
563 XtManageChild (dirLabel);
564 XmStringFree (label_string);
565 XtAddCallback(dirLabel, XmNhelpCallback, (XtCallbackProc)HelpRequestCB,
566 HELP_FIND_DIALOG_STR);
569 XtSetArg (args[n], XmNleftAttachment, XmATTACH_WIDGET); n++;
570 XtSetArg (args[n], XmNleftWidget, dirLabel); n++;
571 XtSetArg (args[n], XmNleftOffset, 0); n++;
572 XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n++;
573 XtSetArg (args[n], XmNrightOffset, 10); n++;
574 XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
575 XtSetArg (args[n], XmNtopWidget, outputSeparator); n++;
576 XtSetArg (args[n], XmNtopOffset, 10); n++;
577 dirName = XmCreateTextField (form, "folder_name_text", args, n);
578 XtManageChild (dirName);
579 XtAddCallback(dirName, XmNhelpCallback, (XtCallbackProc)HelpRequestCB,
580 HELP_FIND_DIALOG_STR);
582 /* set up translations in the search directory text edit widget */
583 XtOverrideTranslations(dirName, trans_table);
585 /* Create the widgets showing the matching files */
588 XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
589 XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n++;
590 XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
591 XtSetArg (args[n], XmNtopWidget, dirLabel); n++;
592 XtSetArg (args[n], XmNtopOffset, 15); n++;
593 outputSeparator = XmCreateSeparatorGadget (form, "outputSeparator", args, n);
594 XtManageChild (outputSeparator);
596 label_string = XmStringCreateLocalized (GetSharedMessage(FILES_FOUND_LABEL));
598 XtSetArg (args[n], XmNlabelString, label_string); n++;
599 XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
600 XtSetArg (args[n], XmNleftOffset, 5); n++;
601 XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
602 XtSetArg (args[n], XmNtopWidget, outputSeparator); n++;
603 XtSetArg (args[n], XmNtopOffset, 10); n++;
604 XtSetArg (args[n], XmNtraversalOn, False); n++;
605 listLabel = XmCreateLabelGadget (form, "files_found", args, n);
606 XtManageChild (listLabel);
607 XmStringFree (label_string);
608 XtAddCallback(listLabel, XmNhelpCallback, (XtCallbackProc)HelpRequestCB,
609 HELP_FIND_DIALOG_STR);
612 XtSetArg (args[n], XmNlistSizePolicy, XmCONSTANT); n++;
613 XtSetArg (args[n], XmNscrollBarDisplayPolicy, XmSTATIC); n++;
614 XtSetArg (args[n], XmNvisibleItemCount, 5); n++;
615 scrolledList = XmCreateScrolledList (form, "file_list", args, n);
616 XtManageChild (scrolledList);
618 XtAddCallback (scrolledList, XmNbrowseSelectionCallback,
619 SetActiveItem, (XtPointer) find_rec);
620 XtAddCallback (scrolledList, XmNdefaultActionCallback,
621 NewView, (XtPointer) find_rec);
622 XtAddCallback(XtParent(scrolledList), XmNhelpCallback,
623 (XtCallbackProc)HelpRequestCB,
624 HELP_FIND_DIALOG_STR);
628 XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
629 XtSetArg (args[n], XmNtopWidget, listLabel); n++;
630 XtSetArg (args[n], XmNtopOffset, 5); n++;
631 XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
632 XtSetArg (args[n], XmNleftOffset, 10); n++;
633 XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n++;
634 XtSetArg (args[n], XmNrightPosition, 10); n++;
635 XtSetValues (XtParent (scrolledList), args, n);
638 XtSetArg (args[n], XmNmarginWidth, 1); n++;
639 XtSetArg (args[n], XmNmarginHeight, 1); n++;
640 XtSetArg (args[n], XmNshadowThickness, 0); n++;
641 XtSetArg (args[n], XmNautoUnmanage, False); n++;
642 XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
643 XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n++;
644 XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
645 XtSetArg (args[n], XmNtopWidget, scrolledList); n++;
646 XtSetArg (args[n], XmNtopOffset, 10); n++;
647 form2 = XmCreateForm (form, "form2", args, n);
648 XtManageChild (form2);
650 XtAddCallback(form2, XmNhelpCallback, (XtCallbackProc)HelpRequestCB,
651 HELP_FIND_DIALOG_STR);
654 label_string = XmStringCreateLocalized ((GETMESSAGE(15,48, "Open Folder")));
657 XtSetArg (args[n], XmNlabelString, label_string); n++;
658 XtSetArg (args[n], XmNleftAttachment, XmATTACH_POSITION); n++;
659 XtSetArg (args[n], XmNleftPosition, 10); n++;
660 XtSetArg (args[n], XmNtopAttachment, XmATTACH_FORM); n++;
661 XtSetArg (args[n], XmNtopOffset, 5); n++;
662 XtSetArg (args[n], XmNbottomAttachment, XmATTACH_FORM); n++;
663 XtSetArg (args[n], XmNbottomOffset, 5); n++;
664 XtSetArg (args[n], XmNmarginHeight, 4); n++;
665 XtSetArg (args[n], XmNmarginWidth, 10); n++;
666 newFM = XmCreatePushButtonGadget (form2, "new_view", args, n);
667 XtManageChild (newFM);
668 XtAddCallback (newFM, XmNactivateCallback, NewView, (XtPointer) find_rec);
669 XtAddCallback(newFM, XmNhelpCallback, (XtCallbackProc)HelpRequestCB,
670 HELP_FIND_DIALOG_STR);
671 XmStringFree (label_string);
673 XtSetArg (args[0], XmNdefaultButton, newFM);
674 XtSetValues (form2, args, 1);
676 label_string = XmStringCreateLocalized ((GETMESSAGE(15,37, "Put In Workspace")));
678 XtSetArg (args[n], XmNlabelString, label_string); n++;
679 XtSetArg (args[n], XmNleftAttachment, XmATTACH_POSITION); n++;
680 XtSetArg (args[n], XmNleftPosition, 55); n++;
681 XtSetArg (args[n], XmNtopAttachment, XmATTACH_FORM); n++;
682 XtSetArg (args[n], XmNtopOffset, 5); n++;
683 XtSetArg (args[n], XmNbottomAttachment, XmATTACH_FORM); n++;
684 XtSetArg (args[n], XmNbottomOffset, 5); n++;
685 XtSetArg (args[n], XmNmarginHeight, 4); n++;
686 XtSetArg (args[n], XmNmarginHeight, 4); n++;
687 XtSetArg (args[n], XmNmarginWidth, 10); n++;
688 putOnDT = XmCreatePushButtonGadget (form2, "putInWorkspace", args, n);
689 XtManageChild (putOnDT);
690 XtAddCallback (putOnDT, XmNactivateCallback, FindPutOnDesktop,
691 (XtPointer) find_rec);
692 XtAddCallback(putOnDT, XmNhelpCallback, (XtCallbackProc)HelpRequestCB,
693 HELP_FIND_DIALOG_STR);
694 XmStringFree (label_string);
696 /* Create a separator between the buttons */
699 XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
700 XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n++;
701 XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
702 XtSetArg (args[n], XmNtopWidget, form2); n++;
703 XtSetArg (args[n], XmNtopOffset, 10); n++;
704 separator = XmCreateSeparatorGadget (form, "separator", args, n);
705 XtManageChild (separator);
708 /* Create the action buttons */
710 label_string = XmStringCreateLocalized (((char *)GETMESSAGE(15, 14, "Start")));
712 XtSetArg (args[n], XmNlabelString, label_string); n++;
713 XtSetArg (args[n], XmNleftAttachment, XmATTACH_POSITION); n++;
714 XtSetArg (args[n], XmNleftPosition, 1); n++;
715 XtSetArg (args[n], XmNrightAttachment, XmATTACH_POSITION); n++;
716 XtSetArg (args[n], XmNrightPosition, 24); n++;
717 XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
718 XtSetArg (args[n], XmNtopWidget, separator); n++;
719 XtSetArg (args[n], XmNtopOffset, 5); n++;
720 XtSetArg (args[n], XmNbottomAttachment, XmATTACH_FORM); n++;
721 XtSetArg (args[n], XmNbottomOffset, 5); n++;
722 XtSetArg (args[n], XmNmarginHeight, 4); n++;
723 start = XmCreatePushButtonGadget (form, "start", args, n);
724 XtAddCallback (start, XmNactivateCallback, StartCallback,
725 (XtPointer) find_rec);
726 XtAddCallback(start, XmNhelpCallback, (XtCallbackProc)HelpRequestCB,
727 HELP_FIND_DIALOG_STR);
728 XtManageChild (start);
729 XmStringFree (label_string);
731 label_string = XmStringCreateLocalized (((char *)GETMESSAGE(15, 15, "Stop")));
733 XtSetArg (args[n], XmNlabelString, label_string); n++;
734 XtSetArg (args[n], XmNleftAttachment, XmATTACH_POSITION); n++;
735 XtSetArg (args[n], XmNleftPosition, 26); n++;
736 XtSetArg (args[n], XmNrightAttachment, XmATTACH_POSITION); n++;
737 XtSetArg (args[n], XmNrightPosition, 49); n++;
738 XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
739 XtSetArg (args[n], XmNtopWidget, separator); n++;
740 XtSetArg (args[n], XmNtopOffset, 5); n++;
741 XtSetArg (args[n], XmNmarginHeight, 4); n++;
742 stop = XmCreatePushButton (form, "stop", args, n);
743 XtAddCallback (stop, XmNactivateCallback, StopCallback,
744 (XtPointer) find_rec);
745 XtAddCallback(stop, XmNhelpCallback, (XtCallbackProc)HelpRequestCB,
746 HELP_FIND_DIALOG_STR);
747 XtManageChild (stop);
748 XtSetSensitive (stop, False);
749 XmStringFree (label_string);
752 XtSetArg (args[n], XmNlabelString, cancelXmString); n++;
753 XtSetArg (args[n], XmNleftAttachment, XmATTACH_POSITION); n++;
754 XtSetArg (args[n], XmNleftPosition, 51); n++;
755 XtSetArg (args[n], XmNrightAttachment, XmATTACH_POSITION); n++;
756 XtSetArg (args[n], XmNrightPosition, 74); n++;
757 XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
758 XtSetArg (args[n], XmNtopWidget, separator); n++;
759 XtSetArg (args[n], XmNtopOffset, 5); n++;
760 XtSetArg (args[n], XmNmarginHeight, 4); n++;
761 close = XmCreatePushButtonGadget (form, "close", args, n);
762 XtManageChild (close);
763 XtAddCallback(close, XmNhelpCallback, (XtCallbackProc)HelpRequestCB,
764 HELP_FIND_DIALOG_STR);
768 XtSetArg (args[n], XmNlabelString, helpXmString); n++;
769 XtSetArg (args[n], XmNleftAttachment, XmATTACH_POSITION); n++;
770 XtSetArg (args[n], XmNleftPosition, 76); n++;
771 XtSetArg (args[n], XmNrightAttachment, XmATTACH_POSITION); n++;
772 XtSetArg (args[n], XmNrightPosition, 99); n++;
773 XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
774 XtSetArg (args[n], XmNtopWidget, separator); n++;
775 XtSetArg (args[n], XmNtopOffset, 5); n++;
776 XtSetArg (args[n], XmNmarginHeight, 4); n++;
777 help = XmCreatePushButton (form, "help", args, n);
778 XtManageChild (help);
779 XtAddCallback(help, XmNactivateCallback, (XtCallbackProc)HelpRequestCB,
780 HELP_FIND_DIALOG_STR);
781 XtAddCallback(help, XmNhelpCallback, (XtCallbackProc)HelpRequestCB,
782 HELP_FIND_DIALOG_STR);
786 XtSetArg (args[0], XmNdefaultButton, start);
787 XtSetArg (args[1], XmNcancelButton, close);
788 XtSetValues (form, args, 2);
790 /* Fill in our instance structure */
792 find_rec->shell = shell;
793 find_rec->form = form;
794 find_rec->fileNameFilter = filterText;
795 find_rec->content = contentText;
796 #if defined(__hpux) || defined(sun)
797 find_rec->followLink = followLink;
799 find_rec->followLink = NULL;
801 find_rec->listLabel = listLabel;
802 find_rec->matchList = scrolledList;
803 find_rec->searchDirectory = dirName;
804 find_rec->newFM = newFM;
805 find_rec->putOnDT = putOnDT;
806 find_rec->start = start;
807 find_rec->stop = stop;
808 find_rec->close = close;
809 find_rec->help = help;
811 find_rec->selectedItem = -1;
812 find_rec->popenId = NULL;
813 find_rec->childpid = -1;
814 find_rec->alternateInputId = 0;
815 find_rec->searchInProgress = False;
816 find_rec->fileMgrRec = NULL;
819 /* Set the return values for the dialog widget and dialog instance. */
821 *return_widget = form;
822 *dialog = (XtPointer) find_rec;
827 /************************************************************************
831 ************************************************************************/
836 XtCallbackProc callback,
837 XtPointer client_data )
839 FindApply * apply_data;
842 /* Setup the callback data to be sent to the most of our */
843 /* actions callbacks. */
845 apply_data = (FindApply *) XtMalloc (sizeof (FindApply));
846 apply_data->callback = callback;
847 apply_data->client_data = client_data;
848 apply_data->find_rec = (XtPointer) find_rec;
849 find_rec->apply_data = apply_data;
855 /************************************************************************
859 ************************************************************************/
864 XtCallbackProc callback,
865 XtPointer client_data )
867 Atom delete_window_atom;
869 XtAddCallback (find_rec->close, XmNactivateCallback, callback, client_data);
871 delete_window_atom = XmInternAtom (XtDisplay(find_rec->shell), "WM_DELETE_WINDOW", True);
872 XmRemoveWMProtocols( find_rec->shell, &delete_window_atom, 1 );
873 XmAddWMProtocolCallback( find_rec->shell, delete_window_atom, callback,
874 (XtPointer) client_data );
880 /************************************************************************
884 ************************************************************************/
890 XtDestroyWidget (find_rec->shell);
891 XtFree ((char *) find_rec->apply_data);
892 XtFree ((char *) find_rec);
898 /************************************************************************
902 ************************************************************************/
908 FindData * find_data;
912 /* Allocate and initialize the find file dialog data. */
914 find_data = (FindData *) XtMalloc (sizeof (FindData));
916 find_data->displayed = True;
918 XtSetArg (args[0], XmNx, &find_data->x);
919 XtSetArg (args[1], XmNy, &find_data->y);
920 XtSetArg (args[2], XmNwidth, &find_data->width);
921 XtSetArg (args[3], XmNheight, &find_data->height);
922 XtGetValues (find_rec->shell, args, 4);
924 (void) GetFindValues (find_rec, find_data, False);
926 return ((XtPointer) find_data);
932 /************************************************************************
936 ************************************************************************/
939 GetDefaultValues( void )
942 char dirbuf[MAX_DIR_PATH_LEN];
944 /* Allocate and initialize the default find file dialog data. */
946 find_data = (FindData *) XtMalloc (sizeof (FindData));
948 find_data->displayed = False;
951 find_data->height = 0;
952 find_data->width = 0;
954 (char *)getcwd((char *)dirbuf, (unsigned int)MAX_DIR_PATH_LEN);
956 strncmp(users_home_dir, dirbuf, strlen(users_home_dir)) != 0)
958 find_data->directories = (char *)XtMalloc(strlen(users_home_dir) + 1);
959 strcpy(find_data->directories, users_home_dir);
963 find_data->directories = (char *)XtMalloc(strlen(dirbuf) + 1);
964 strcpy(find_data->directories, dirbuf);
967 find_data->filter = NULL;
968 find_data->content = NULL;
969 find_data->matches = NULL;
970 find_data->num_matches = 0;
971 find_data->selected_item = -1;
972 #if defined(__hpux) || defined(sun)
973 find_data->follow_links = follow_links;
976 return ((XtPointer) find_data);
982 /************************************************************************
986 ************************************************************************/
990 XrmDatabase data_base,
993 FindData * find_data;
995 static Boolean convertersAdded = False;
998 /* Allocate and get the resources for find file dialog data. */
1000 find_data = (FindData *) XtCalloc (1, sizeof (FindData));
1002 _DtDialogGetResources (data_base, name_list, FIND_FILE, (char *) find_data,
1003 resources, findClass->resource_count);
1005 /* Create new strings for any string value we read in from our
1008 find_data->directories = XtNewString(find_data->directories);
1009 find_data->filter = XtNewString(find_data->filter);
1010 find_data->content = XtNewString(find_data->content);
1012 /* Do a special read to get the list of matches. */
1013 /* The information is read in as a single string, and then must */
1014 /* be converted into the internal array format. */
1016 _DtDialogGetResources (data_base, name_list, FIND_FILE, (char *) (&dummy),
1017 match_resources, XtNumber(match_resources));
1019 CvtStringToStringList (dummy.string, &find_data->matches,
1020 &find_data->num_matches);
1022 return ((XtPointer) find_data);
1028 /************************************************************************
1032 ************************************************************************/
1037 FindData *find_data )
1043 XmTextFieldSetString (find_rec->fileNameFilter, find_data->filter);
1044 XmTextFieldSetInsertionPosition(find_rec->fileNameFilter,
1045 XmTextFieldGetLastPosition(find_rec->fileNameFilter));
1046 XmTextFieldSetString(find_rec->content, find_data->content);
1047 XmTextFieldSetInsertionPosition(find_rec->content,
1048 XmTextFieldGetLastPosition(find_rec->content));
1050 if(find_data->directories)
1051 XtFree(find_data->directories);
1052 find_data->directories =
1053 XtNewString(find_data->file_mgr_data->current_directory );
1055 XmTextFieldSetString(find_rec->searchDirectory, find_data->directories);
1056 XmTextFieldSetInsertionPosition(find_rec->searchDirectory,
1057 XmTextFieldGetLastPosition(find_rec->searchDirectory));
1058 if( find_data->file_mgr_data->restricted_directory )
1060 XtAddCallback (find_rec->searchDirectory, XmNmodifyVerifyCallback,
1061 (XtCallbackProc)TextChange,
1062 (XtPointer)find_data->file_mgr_data );
1063 XtAddCallback (find_rec->searchDirectory, XmNmotionVerifyCallback,
1064 (XtCallbackProc)TextChange,
1065 (XtPointer)find_data->file_mgr_data );
1068 /* Update the list of matches */
1070 if (find_data->num_matches > 0)
1072 XtSetArg (args[0], XmNitemCount, find_data->num_matches);
1074 (XmString *) XtMalloc (sizeof (XmString) * find_data->num_matches);
1076 for (i = 0; i < find_data->num_matches; i++)
1078 matches[i] = XmStringCreateLocalized (find_data->matches[i]);
1081 XtSetArg (args[1], XmNitems, matches);
1082 XtSetValues (find_rec->matchList, args, 2);
1084 for (i = 0; i < find_data->num_matches; i++)
1085 XmStringFree (matches[i]);
1087 XtFree ((char *) matches);
1089 if (find_data->selected_item != -1)
1091 XmListSelectPos (find_rec->matchList,
1092 find_data->selected_item + 1,False);
1097 XtSetArg (args[0], XmNitemCount, 0);
1098 XtSetValues (find_rec->matchList, args, 1);
1101 #if defined(__hpux) || defined(sun)
1102 /* Set up the Follow links option menu */
1103 if(find_data->follow_links)
1104 XtSetArg(args[0], XmNmenuHistory, find_rec->widgArry[ON]);
1106 XtSetArg(args[0], XmNmenuHistory, find_rec->widgArry[OFF]);
1107 XtSetValues (find_rec->followLink, args, 1);
1110 /* Update button sensitivity, if one of the matches is selected */
1112 if (find_data->selected_item != -1)
1114 XtSetSensitive (find_rec->newFM, True);
1115 XtSetSensitive (find_rec->putOnDT, True);
1119 XtSetSensitive (find_rec->newFM, False);
1120 XtSetSensitive (find_rec->putOnDT, False);
1123 find_rec->selectedItem = find_data->selected_item;
1130 /************************************************************************
1132 * WriteResourceValues
1134 ************************************************************************/
1137 WriteResourceValues(
1142 FindData * find_data = (FindData *) values->data;
1148 /* If the dialog is currently displayed, update the geometry */
1149 /* fields to their current values. */
1151 if (find_data->displayed == True)
1153 _DtGenericUpdateWindowPosition(values);
1154 find_rec = (FindRec *) _DtGetDialogInstance (values);
1155 (void) GetFindValues (find_rec, find_data, False);
1158 _DtDialogPutResources (fd, name_list, FIND_FILE, (char *) values->data,
1159 resources, findClass->resource_count);
1162 /* Special case for writing the array of matching files. */
1163 /* Write all of the information out as a single string, which */
1164 /* we'll parse when we read it back in at a later point in time. */
1165 /* The format for this string is: */
1167 /* <match string1>, <match string2>, <match string3>, ... */
1169 if (find_data->num_matches > 0)
1171 dummy.displayed = False;
1172 dummy.string = CvtStringListToString (find_data->matches,
1173 find_data->num_matches);
1175 _DtDialogPutResources (fd, name_list, FIND_FILE, (char *) &dummy,
1176 match_resources, XtNumber (match_resources));
1178 XtFree ((char *) dummy.string);
1179 dummy.string = NULL;
1186 /************************************************************************
1190 ************************************************************************/
1194 FindData *find_data )
1198 if( find_data->filter )
1199 XtFree ((char *) find_data->filter);
1200 if( find_data->directories )
1201 XtFree ((char *) find_data->directories);
1202 FreeMatchInfo (find_data->matches, find_data->num_matches);
1203 XtFree ((char *) find_data);
1208 /************************************************************************
1211 * Update the current find file values within the data structure
1212 * from the current values.
1214 ************************************************************************/
1219 FindData *find_data,
1224 XmString * stringTable;
1227 /* Get the filename to search for (e.g. Filter) */
1229 find_data->displayed = True;
1230 find_data->content = XmTextFieldGetString (find_rec->content);
1231 find_data->filter = (char *)_DtStripSpaces (
1232 XmTextFieldGetString (find_rec->fileNameFilter));
1235 if ((strlen (find_data->filter) == 0) &&
1236 (strcmp(find_data->content, "") == 0))
1238 XtFree ((char *) find_data->filter);
1239 find_data->filter = NULL;
1243 /* Get the list of directories to search */
1244 if(find_data->directories)
1245 XtFree(find_data->directories);
1246 find_data->directories = XmTextFieldGetString (find_rec->searchDirectory);
1250 find_data->directories = (char *)_DtStripSpaces (find_data->directories);
1252 if (strlen (find_data->directories) == 0)
1254 /* A directory must be supplied */
1256 InvalidFindMessage (find_rec, BAD_DIR_NAME, NULL);
1257 XtFree ((char *) find_data->filter);
1258 find_data->filter = NULL;
1259 XtFree ((char *) find_data->directories);
1260 find_data->directories = NULL;
1265 /* Make a copy of the array of matching strings */
1267 find_data->selected_item = find_rec->selectedItem;
1268 XtSetArg (args[0], XmNitemCount, &find_data->num_matches);
1269 XtSetArg (args[1], XmNitems, &stringTable);
1270 XtGetValues (find_rec->matchList, args, 2);
1271 if (find_data->num_matches == 0)
1273 find_data->matches = NULL;
1277 find_data->matches =
1278 (String *) XtMalloc (sizeof(String) * find_data->num_matches);
1280 for (i = 0; i < find_data->num_matches; i++)
1282 find_data->matches[i] = (char *) _XmStringUngenerate(stringTable[i],
1283 XmFONTLIST_DEFAULT_TAG,
1284 XmCHARSET_TEXT, XmCHARSET_TEXT);
1288 #if defined(__hpux) || defined(sun)
1292 XtSetArg (args[0], XmNmenuHistory, &menuHistory);
1293 XtGetValues (find_rec->followLink, args, 1);
1295 if(menuHistory == find_rec->widgArry[ON])
1296 find_data->follow_links = True;
1298 find_data->follow_links = False;
1308 /************************************************************************
1310 * InvalidFindMessage
1311 * Display an error message.
1313 ************************************************************************/
1319 String extra_string )
1324 static String badDirectoryNameMessage = NULL;
1325 static String noDirectoryAccessMessage = NULL;
1326 static String noSearchArgumentMessage = NULL;
1327 static String noExistanceMessage = NULL;
1330 if (noExistanceMessage == NULL)
1332 tmpStr = GETMESSAGE(15,44, "Search Folder name argument is missing.\nType in the name of the folder where you want the search to begin.");
1333 badDirectoryNameMessage = XtNewString(tmpStr);
1335 tmpStr = GetSharedMessage(NO_DIR_ACCESS_ERROR);
1336 noDirectoryAccessMessage = XtNewString(tmpStr);
1338 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.");
1339 noSearchArgumentMessage = XtNewString(tmpStr);
1341 tmpStr = GETMESSAGE(15,45, "The selected file no longer exists.\n\nSomeone deleted the file after the search process completed.");
1342 noExistanceMessage = XtNewString(tmpStr);
1346 switch (messageIndex)
1349 string = badDirectoryNameMessage;
1352 string = noDirectoryAccessMessage;
1355 string = noExistanceMessage;
1357 case NO_FILE_OR_FOLDER_ARG:
1358 string = noSearchArgumentMessage;
1364 new_string = XtMalloc (strlen(string) + strlen(extra_string) + 1);
1365 (void) sprintf(new_string, string, extra_string);
1366 tmpStr = GetSharedMessage(FIND_ERROR_TITLE);
1367 title = XtNewString(tmpStr);
1368 _DtMessage (find_rec->shell, title, new_string, NULL, HelpRequestCB);
1369 XtFree ((char *) new_string);
1374 tmpStr = GetSharedMessage(FIND_ERROR_TITLE);
1375 title = XtNewString(tmpStr);
1376 _DtMessage (find_rec->shell, title, string, NULL, HelpRequestCB);
1380 _DtTurnOffHourGlass (find_rec->shell);
1386 /************************************************************************
1389 * Free up the space occupied by the array containing the match
1392 ************************************************************************/
1401 if (matches == NULL)
1404 for (i = 0; i < numMatches; i++)
1405 XtFree ((char *) matches[i]);
1408 XtFree ((char *) matches);
1413 /************************************************************************
1416 * Abort an active search operation.
1418 ************************************************************************/
1428 /* To avoid a race condition where the input processing routine */
1429 /* detected the end of the find operation and cleaned things up, */
1430 /* just as the user hit the 'stop' key, we need to check to see */
1431 /* if the operation is still active. */
1433 if (find_rec->popenId != NULL)
1435 /* Abort the find process, and remove the alternate input handler */
1436 (void) fclose (find_rec->popenId);
1437 if(find_rec->childpid > 1) /* trying to be safe */
1438 kill(find_rec->childpid,SIGTERM); /* Ignore errors */
1439 find_rec->popenId = NULL;
1440 find_rec->childpid = -1;
1441 XtRemoveInput (find_rec->alternateInputId);
1442 find_rec->alternateInputId = 0;
1443 find_rec->searchInProgress = False;
1447 /* Change button sensitivities */
1449 XtSetSensitive (find_rec->start, True);
1450 XtSetSensitive (find_rec->close, True);
1451 XtSetSensitive (find_rec->stop, False);
1453 XtSetArg (args[0], XmNdefaultButton, find_rec->start);
1454 XtSetValues (find_rec->form, args, 1);
1459 XtRemoveEventHandler (find_rec->stop, LeaveWindowMask, FALSE, (XtEventHandler)LeaveStopBttn, find_rec);
1460 XtRemoveEventHandler (find_rec->stop, EnterWindowMask, FALSE, (XtEventHandler)EnterStopBttn, find_rec);
1462 _DtTurnOffHourGlass (find_rec->shell);
1463 XmUpdateDisplay (w);
1472 /************************************************************************
1475 * Start an active search operation.
1477 ************************************************************************/
1484 FindData * find_data;
1487 _DtTurnOnHourGlass (find_rec->shell);
1489 /* Extract current dialog values; continue only if data is valid */
1491 find_data = (FindData *) XtMalloc (sizeof (FindData));
1493 if (!GetFindValues (find_rec, find_data, True))
1495 /* Dialog contained bogus values; abort request */
1497 XtFree ((char *) find_data);
1502 /* Desensitize buttons we don't want working during a search */
1504 XtSetSensitive (find_rec->stop, True);
1505 XtSetSensitive (find_rec->start, False);
1506 XtSetSensitive (find_rec->close, False);
1507 XtSetSensitive (find_rec->newFM, False);
1508 XtSetSensitive (find_rec->putOnDT, False);
1510 XtSetArg (args[0], XmNdefaultButton, find_rec->stop);
1511 XtSetArg (args[1], XmNcancelButton, find_rec->close);
1512 XtSetValues (find_rec->form, args, 2);
1514 /* Clean out the match list */
1516 find_rec->selectedItem = -1;
1517 XtSetArg (args[0], XmNitemCount, 0);
1518 XtSetValues (find_rec->matchList, args, 1);
1520 XmUpdateDisplay (w);
1523 /* Start the find process; not much we can say if it fails! */
1525 if (!FindProcessStarted (find_rec, find_data))
1527 XtSetSensitive (find_rec->close, True);
1528 XtSetSensitive (find_rec->newFM, False);
1529 XtSetSensitive (find_rec->putOnDT, False);
1530 XtSetSensitive (find_rec->start, True);
1531 XtSetSensitive (find_rec->stop, False);
1533 XtSetArg (args[0], XmNdefaultButton, find_rec->start);
1534 XtSetArg (args[1], XmNcancelButton, find_rec->close);
1535 XtSetValues (find_rec->form, args, 2);
1537 XmUpdateDisplay (w);
1541 find_rec->searchInProgress = True;
1543 /* This event handlers will be called when user is moving his mouse
1544 over the Find dialog's stop button.
1546 XtAddEventHandler( find_rec->stop, LeaveWindowMask, FALSE, (XtEventHandler)LeaveStopBttn, find_rec );
1547 XtAddEventHandler( find_rec->stop, EnterWindowMask, FALSE, (XtEventHandler)EnterStopBttn, find_rec );
1550 /* Free up the dialog values we allocated */
1552 FreeValues (find_data);
1556 /************************************************************************
1560 ************************************************************************/
1568 _DtTurnOffHourGlass (find_rec->shell);
1572 /************************************************************************
1576 ************************************************************************/
1584 _DtTurnOnHourGlass (find_rec->shell);
1588 /************************************************************************
1591 * Start a search operation.
1593 ************************************************************************/
1598 XtPointer client_data,
1599 XtPointer call_data )
1601 StartSearch (w, (FindRec *) client_data);
1607 /************************************************************************
1610 * Stop an active search operation.
1612 ************************************************************************/
1617 XtPointer client_data,
1618 XtPointer call_data )
1620 StopSearch (w, (FindRec *) client_data);
1626 /************************************************************************
1630 ************************************************************************/
1638 if (strlen (buf) + 1 + extra >= *size)
1640 *size = strlen(buf) + extra + 1025;
1641 buf = XtRealloc (buf, *size);
1650 /************************************************************************
1653 * Change relative path to absolute one.
1655 ************************************************************************/
1659 String current_directory,
1664 absPath = XtMalloc (strlen (path) + strlen (current_directory) + 2);
1665 (void) strcpy (absPath, current_directory);
1666 (void) strcat (absPath, "/");
1667 (void) strcat (absPath, path);
1675 /************************************************************************
1677 * FindProcessStarted()
1678 * Determine whether to do a 'find' or a 'grep'.
1680 ************************************************************************/
1685 FindData *find_data )
1687 FileMgrData * file_mgr_data;
1688 DialogData * dialog_data;
1690 dialog_data = _DtGetInstanceData ((XtPointer) (find_rec->fileMgrRec));
1691 file_mgr_data = (FileMgrData *) dialog_data->data;
1693 return(ExecuteFind(find_rec, find_data, file_mgr_data));
1697 /************************************************************************
1700 * Create the command string for invoking the 'find' process,
1701 * and then execute it.
1703 ************************************************************************/
1708 FindData * find_data,
1709 FileMgrData *file_mgr_data)
1717 XmString label_string;
1720 #if defined (SVR4) || defined(_AIX) || defined(sco)
1721 /* needed for getaccess () call */
1727 Tt_status tt_status;
1729 extern void sigchld_handler(int);
1730 #endif /* __osf__ */
1732 if(strcmp(find_data->content, "") == 0)
1734 label_string = XmStringCreateLocalized (GetSharedMessage(FILES_FOUND_LABEL));
1736 else if(strcmp(find_data->filter, "") == 0)
1738 tmpStr = GETMESSAGE(15,38, "Files Found (by Contents):");
1739 label_string = XmStringCreateLocalized (tmpStr);
1743 tmpStr = (GETMESSAGE(15,39, "Files Found (by Name and Contents):"));
1744 label_string = XmStringCreateLocalized (tmpStr);
1746 XtSetArg (args[0], XmNlabelString, label_string);
1747 XtSetValues (find_rec->listLabel, args, 1);
1748 XmStringFree(label_string);
1750 if(find_data->filter == NULL )
1752 InvalidFindMessage (find_rec, NO_FILE_OR_FOLDER_ARG, NULL);
1757 /* Construct the 'find' command */
1760 command = XtMalloc (commandLen);
1761 (void) strcpy (command, FIND_COMMAND);
1764 /* Convert directory names from external to internal (nfs) format */
1766 findptr = find_data->directories;
1769 /* Search for the end of the directory component */
1771 _DtPathFromInput(findptr, file_mgr_data->current_directory, &host, &path);
1775 InvalidFindMessage (find_rec, NO_DIR_ACCESS, findptr);
1779 link_path = _DtFollowLink(path);
1781 path = XtNewString(link_path);
1788 /* Verify that the path exists and is accessible */
1789 #if defined (SVR4) || defined(_AIX) || defined(sco)
1790 /* needed for getaccess () call */
1791 save_ruid = getuid();
1792 #if !defined(SVR4) && ! defined(sco)
1793 setreuid(geteuid(),-1);
1797 save_rgid = getgid();
1798 #if !defined(SVR4) && !defined(sco)
1799 setregid(getegid(),-1);
1803 access_priv = access (path, R_OK);
1804 #if !defined(SVR4) && !defined(sco)
1805 setreuid(save_ruid,-1);
1806 setregid(save_rgid,-1);
1811 if (access_priv == -1 && geteuid() != root_user)
1814 # if defined(__hp_osf) || defined(__ultrix) || defined(__osf__) || defined(linux)
1815 setreuid(geteuid(),-1);
1816 if (access ((char *) path, R_OK) == -1)
1820 setresuid(geteuid(),-1,-1);
1821 if (access ((char *) path, R_OK) == -1)
1824 if ((((access_priv = getaccess (path, UID_EUID, NGROUPS_EGID_SUPP,
1825 0, (void *) 0, (void *) 0)) == -1) ||
1826 !(access_priv & R_OK)) && (geteuid () != root_user))
1829 # endif /* Apollo & OSF */
1831 /* Post an error dialog, and then terminate the request */
1833 InvalidFindMessage (find_rec, NO_DIR_ACCESS, findptr);
1834 XtFree ((char *) path);
1835 XtFree ((char *) command);
1840 /* See if the buffer needs to grow */
1842 command = GrowBuffer (command, &commandLen, (int) strlen (path));
1845 /* Add path to the command string */
1847 (void) strcat (command, path);
1848 (void) strcat (command, " ");
1849 XtFree ((char *) path);
1851 /* Add on the rest of the search constraints */
1853 if(strcmp(find_data->content, "") != 0)
1855 command = GrowBuffer (command, &commandLen, (int) strlen (TYPEDIR));
1856 (void) strcat (command, TYPEDIR);
1860 /* File name regular expression */
1861 if (find_data->filter)
1864 GrowBuffer (command, &commandLen, (int)strlen (find_data->filter) +
1865 (int) strlen (NAME_OPTION) + 2);
1867 /* The string needs to be quoted */
1868 (void) strcat (command, NAME_OPTION);
1869 (void) strcat (command, "\"");
1870 (void) strcat (command, find_data->filter);
1871 (void) strcat (command, "\" ");
1876 #if defined(__hpux) || defined(sun)
1880 XtSetArg (args[0], XmNmenuHistory, &menuHistory);
1881 XtGetValues (find_rec->followLink, args, 1);
1883 if(menuHistory == find_rec->widgArry[ON])
1885 /* Add the option to follow a link */
1887 command = GrowBuffer (command, &commandLen,
1888 (int) strlen (FOLLOW_OPTION));
1889 (void) strcat (command, FOLLOW_OPTION);
1894 /* Add the -print to get the results of the find */
1896 command = GrowBuffer (command, &commandLen, (int) strlen (PRINT_OPTION));
1897 (void) strcat (command, PRINT_OPTION);
1900 /* Add the redirector for stderr, so it is disabled */
1902 command = GrowBuffer (command, &commandLen, (int) strlen (REDIRECTOR));
1903 (void) strcat (command, REDIRECTOR);
1906 /* Start the 'find' process */
1909 oldSig = signal(SIGCHLD, sigchld_handler);
1911 oldSig = signal(SIGCLD, SIG_DFL);
1912 #endif /* __osf__ */
1913 find_rec->popenId = findpopen(command, "r",&(find_rec->childpid));
1914 signal (SIGCLD, oldSig);
1916 if (find_rec->popenId == NULL)
1918 XtFree ((char *) command);
1923 /* Set up the alternate input source handler */
1925 if(strcmp(find_data->content, "") != 0)
1927 find_rec->alternateInputId =
1928 XtAddInput (fileno (find_rec->popenId), (XtPointer)XtInputReadMask,
1929 (XtInputCallbackProc)AlternateInputHandler2, find_rec);
1933 find_rec->alternateInputId =
1934 XtAddInput (fileno (find_rec->popenId), (XtPointer)XtInputReadMask,
1935 (XtInputCallbackProc)AlternateInputHandler, find_rec);
1938 /* printf ("%s\n", command); */
1940 XtFree ((char *) command);
1946 /************************************************************************
1949 * Create the command string for invoking the 'grep' process,
1950 * and then execute it.
1952 ************************************************************************/
1954 ExecuteGrep( FindRec * find_rec)
1965 /* Construct the 'grep' command */
1967 command = XtMalloc (commandLen);
1968 (void) strcpy (command, GREP_COMMAND);
1970 contents = XmTextFieldGetString (find_rec->content);
1972 command = GrowBuffer (command, &commandLen, strlen(contents) + 4);
1974 (void) strcat (command, "\"");
1975 (void) strcat (command, contents);
1976 (void) strcat (command, "\"");
1977 (void) strcat (command, " ");
1982 ptr2 = DtStrchr(ptr, ',');
1985 XtFree ((char *) command);
1989 if(find_rec->popenId != NULL)
1990 (void) fclose (find_rec->popenId);
1991 find_rec->popenId = NULL;
1992 find_rec->alternateInputId = 0;
1994 find_rec->searchInProgress = False;
1996 /* Reset button sensitivity */
1998 XtSetSensitive (find_rec->close, True);
1999 XtSetSensitive (find_rec->start, True);
2000 XtSetSensitive (find_rec->stop, False);
2002 XtSetArg (args[0], XmNitemCount, &item_count);
2003 XtGetValues (find_rec->matchList, args, 1);
2005 XtSetArg (args[0], XmNdefaultButton, find_rec->start);
2006 XtSetValues (find_rec->form, args, 1);
2008 if (item_count == 0)
2012 tmpStr = GetSharedMessage(FIND_ERROR_TITLE);
2013 title = XtNewString(tmpStr);
2014 tmpStr = GetSharedMessage(NO_FILES_FOUND_ERROR);
2015 msg = XtNewString(tmpStr);
2016 _DtMessage (find_rec->shell, title, msg, NULL, HelpRequestCB);
2022 XmListSelectPos(find_rec->matchList, 1, True);
2023 XmProcessTraversal(find_rec->matchList, XmTRAVERSE_CURRENT);
2026 _DtTurnOffHourGlass (find_rec->shell);
2032 command = GrowBuffer (command, &commandLen, (int) strlen (ptr) + 3);
2034 /* Add buffer to the command string */
2036 (void) strcat (command, ptr);
2037 (void) strcat (command, " ");
2043 /* Add the redirector for stderr, so it is disabled */
2045 command = GrowBuffer (command, &commandLen, (int) strlen (REDIRECTOR));
2046 (void) strcat (command, REDIRECTOR);
2049 /* Start the 'grep' process */
2051 if ((find_rec->popenId = popen (command, "r")) == NULL)
2053 XtFree ((char *) command);
2058 /* Set up the alternate input source handler */
2060 find_rec->alternateInputId =
2061 XtAddInput (fileno (find_rec->popenId), (XtPointer)XtInputReadMask,
2062 (XtInputCallbackProc)AlternateInputHandler3, find_rec);
2064 /* printf ("%s\n", command); */
2066 XtFree ((char *) command);
2079 /************************************************************************
2081 * AlternateInputHandler()
2082 * When a 'find' operation is taking place, this function will be
2083 * invoked whenever the 'find' process has some data to send to us.
2084 * The function will extract a single line from the pipe, and then
2085 * add it to the list of matches, if it matches the selected file
2088 ************************************************************************/
2091 AlternateInputHandler(
2092 XtPointer client_data,
2096 static int bufSize = 0;
2097 static char * buf = NULL;
2098 FindRec * find_rec = (FindRec *) client_data;
2099 FileMgrData *file_mgr_data;
2100 DialogData * dialog_data;
2108 struct stat stat_data;
2114 /* Abort if the pipe has already been closed */
2116 if (find_rec->popenId == NULL) {
2117 XtSetArg (args[0], XmNdefaultButton, find_rec->start);
2118 XtSetValues (find_rec->form, args, 1);
2119 _DtTurnOffHourGlass (find_rec->shell);
2124 /* Allocate some buffer, if this is the first time here */
2129 buf = XtMalloc (bufSize);
2132 dialog_data=_DtGetInstanceData((XtPointer)find_rec->fileMgrRec);
2133 file_mgr_data = (FileMgrData *) dialog_data->data;
2135 /* Extract the next line, upto a NewLine or EOF */
2139 while ((offset < bufSize - 1) &&
2140 ((count = fread (&next, sizeof (char), 1, find_rec->popenId)) == 1) &&
2143 buf[offset++] = next;
2147 /* See if we broke out because the buffer needs to grow */
2149 if (offset >= bufSize)
2152 buf = XtRealloc (buf, bufSize);
2157 /* Save the string we just extracted */
2162 buf = (String) DtEliminateDots (buf);
2164 if ((stat (buf, &stat_data) == 0) ||
2165 (lstat (buf, &stat_data) == 0))
2169 /* Strip out any invisible files */
2172 file_type = (char *) DtDtsDataToDataType(findptr, NULL, 0, NULL,
2174 if (_DtCheckForDataTypeProperty(file_type, "invisible"))
2178 /* Add string to the scrolled list of matches */
2179 /* Add to the scrolled list of matches */
2182 strncmp(desktop_dir, findptr, strlen(desktop_dir)) != 0)
2184 if(file_mgr_data->restricted_directory != NULL)
2185 string = XmStringCreateLocalized (findptr +
2186 strlen(file_mgr_data->restricted_directory));
2189 XmStringCreateLocalized (findptr);
2190 XmListAddItemUnselected (find_rec->matchList, string, 0);
2191 XmStringFree (string);
2198 /* EOF; command is complete */
2201 (void) fclose (find_rec->popenId);
2202 find_rec->popenId = NULL;
2203 XtRemoveInput (find_rec->alternateInputId);
2204 XtRemoveEventHandler (find_rec->stop, LeaveWindowMask, FALSE, (XtEventHandler)LeaveStopBttn, find_rec);
2205 XtRemoveEventHandler (find_rec->stop, EnterWindowMask, FALSE, (XtEventHandler)EnterStopBttn, find_rec);
2206 find_rec->alternateInputId = 0;
2208 find_rec->searchInProgress = False;
2210 /* Reset button sensitivity */
2212 XtSetSensitive (find_rec->close, True);
2213 XtSetSensitive (find_rec->start, True);
2214 XtSetSensitive (find_rec->stop, False);
2216 XtSetArg (args[0], XmNitemCount, &item_count);
2217 XtGetValues (find_rec->matchList, args, 1);
2219 XtSetArg (args[0], XmNdefaultButton, find_rec->start);
2220 XtSetValues (find_rec->form, args, 1);
2222 if (item_count == 0)
2226 tmpStr = GetSharedMessage(FIND_ERROR_TITLE);
2227 title = XtNewString(tmpStr);
2228 tmpStr = GetSharedMessage(NO_FILES_FOUND_ERROR);
2229 msg = XtNewString(tmpStr);
2230 _DtMessage (find_rec->shell, title, msg, NULL, HelpRequestCB);
2236 XmListSelectPos(find_rec->matchList, 1, True);
2237 XmProcessTraversal(find_rec->matchList, XmTRAVERSE_CURRENT);
2240 _DtTurnOffHourGlass (find_rec->shell);
2247 AlternateInputHandler2(
2248 XtPointer client_data,
2252 static int bufSize = 0;
2253 static char * buf = NULL;
2254 FindRec * find_rec = (FindRec *) client_data;
2259 struct stat stat_data;
2262 content = XmTextFieldGetString (find_rec->fileNameFilter);
2263 if(strcmp(content, "") == 0)
2264 content = XtNewString("*");
2266 /* Abort if the pipe has already been closed */
2268 if (find_rec->popenId == NULL) {
2271 _DtTurnOffHourGlass (find_rec->shell);
2272 XtSetArg (args[0], XmNdefaultButton, find_rec->start);
2273 XtSetValues (find_rec->form, args, 1);
2278 /* Allocate some buffer, if this is the first time here */
2283 buf = XtMalloc (bufSize);
2287 /* Extract the next line, upto a NewLine or EOF */
2291 while ((offset < bufSize - 1) &&
2292 ((count = fread (&next, sizeof (char), 1, find_rec->popenId)) == 1) &&
2295 buf[offset++] = next;
2299 /* See if we broke out because the buffer needs to grow */
2301 if (offset >= bufSize)
2304 buf = XtRealloc (buf, bufSize);
2309 /* Save the string we just extracted */
2314 buf = (String) DtEliminateDots (buf);
2316 if ((stat (buf, &stat_data) == 0) ||
2317 (lstat (buf, &stat_data) == 0))
2323 /* save it with the content, */
2326 buffer = (char *)XtMalloc(strlen(findptr) + strlen(content) + 3);
2327 strcpy(buffer, findptr);
2332 size = strlen(findptr) + strlen(buffer) + strlen(content) +4;
2333 buffer = (char *)XtRealloc(buffer, size);
2334 strcat(buffer, findptr);
2336 strcat(buffer, "/");
2337 strcat(buffer, content);
2338 strcat(buffer, ",");
2345 /* EOF; command is complete */
2348 (void) fclose (find_rec->popenId);
2349 find_rec->popenId = NULL;
2350 XtRemoveInput (find_rec->alternateInputId);
2351 XtRemoveEventHandler (find_rec->stop, LeaveWindowMask, FALSE, (XtEventHandler)LeaveStopBttn, find_rec);
2352 XtRemoveEventHandler (find_rec->stop, EnterWindowMask, FALSE, (XtEventHandler)EnterStopBttn, find_rec);
2353 find_rec->alternateInputId = 0;
2355 ExecuteGrep(find_rec);
2365 AlternateInputHandler3(
2366 XtPointer client_data,
2370 static int bufSize = 0;
2371 static char * buf = NULL;
2372 FindRec * find_rec = (FindRec *) client_data;
2373 FileMgrData *file_mgr_data;
2374 DialogData * dialog_data;
2381 struct stat stat_data;
2386 /* Abort if the pipe has already been closed */
2388 if (find_rec->popenId == NULL) {
2389 _DtTurnOffHourGlass (find_rec->shell);
2391 XtSetArg (args[0], XmNdefaultButton, find_rec->start);
2392 XtSetValues (find_rec->form, args, 1);
2396 /* Allocate some buffer, if this is the first time here */
2401 buf = XtMalloc (bufSize);
2404 dialog_data=_DtGetInstanceData((XtPointer)find_rec->fileMgrRec);
2405 file_mgr_data = (FileMgrData *) dialog_data->data;
2407 /* Extract the next line, upto a NewLine or EOF */
2410 while ((offset < bufSize - 1) &&
2411 ((count = fread (&next, sizeof (char), 1, find_rec->popenId)) == 1) &&
2414 buf[offset++] = next;
2418 /* See if we broke out because the buffer needs to grow */
2420 if (offset >= bufSize)
2423 buf = XtRealloc (buf, bufSize);
2428 /* Save the string we just extracted */
2433 buf = (String) DtEliminateDots (buf);
2435 if ((stat (buf, &stat_data) == 0) ||
2436 (lstat (buf, &stat_data) == 0))
2442 /* Make sure its nots a directory */
2443 if(!((stat_data.st_mode & S_IFMT) == S_IFDIR) &&
2444 strncmp(desktop_dir, findptr, strlen(desktop_dir)) != 0)
2446 if(file_mgr_data->restricted_directory != NULL)
2447 string = XmStringCreateLocalized (findptr +
2448 strlen(file_mgr_data->restricted_directory));
2451 XmStringCreateLocalized (findptr);
2452 XmListAddItemUnselected (find_rec->matchList, string, 0);
2453 XmStringFree (string);
2461 /* EOF; command is complete */
2464 (void) fclose (find_rec->popenId);
2465 find_rec->popenId = NULL;
2466 XtRemoveInput (find_rec->alternateInputId);
2467 XtRemoveEventHandler (find_rec->stop, LeaveWindowMask, FALSE, (XtEventHandler)LeaveStopBttn, find_rec);
2468 XtRemoveEventHandler (find_rec->stop, EnterWindowMask, FALSE, (XtEventHandler)EnterStopBttn, find_rec);
2469 find_rec->alternateInputId = 0;
2472 ExecuteGrep(find_rec);
2475 find_rec->searchInProgress = False;
2477 /* Reset button sensitivity */
2479 XtSetSensitive (find_rec->close, True);
2480 XtSetSensitive (find_rec->start, True);
2481 XtSetSensitive (find_rec->stop, False);
2483 XtSetArg (args[0], XmNitemCount, &item_count);
2484 XtGetValues (find_rec->matchList, args, 1);
2485 XtSetArg (args[0], XmNdefaultButton, find_rec->start);
2486 XtSetValues (find_rec->form, args, 1);
2488 if (item_count == 0)
2492 tmpStr = GetSharedMessage(FIND_ERROR_TITLE);
2493 title = XtNewString(tmpStr);
2494 tmpStr = GetSharedMessage(NO_FILES_FOUND_ERROR);
2495 msg = XtNewString(tmpStr);
2496 _DtMessage (find_rec->shell, title, msg, NULL, HelpRequestCB);
2502 XmListSelectPos(find_rec->matchList, 1, True);
2503 XmProcessTraversal(find_rec->matchList, XmTRAVERSE_CURRENT);
2506 _DtTurnOffHourGlass (find_rec->shell);
2514 /************************************************************************
2517 * Get host/dir for selected match item
2519 ************************************************************************/
2527 FileMgrData *file_mgr_data)
2535 XtSetArg (args[0], XmNitemCount, &count);
2536 XtSetArg (args[1], XmNitems, &items);
2537 XtGetValues (list, args, 2);
2539 temp = (char *) _XmStringUngenerate(items[selectedItem],
2540 XmFONTLIST_DEFAULT_TAG,
2541 XmCHARSET_TEXT, XmCHARSET_TEXT);
2544 if(file_mgr_data->restricted_directory != NULL)
2546 tmpptr = (char *)XtMalloc(
2547 strlen(file_mgr_data->restricted_directory) +
2549 strcpy(tmpptr, file_mgr_data->restricted_directory);
2550 strcat(tmpptr, *path);
2553 *path = (String)tmpptr;
2555 else if (*host != NULL)
2557 *path = XtNewString(*path);
2564 /************************************************************************
2567 * Check if the path specifies a directory or a file. If its a
2568 * file, then extract out the directory portion, since thats all
2571 ************************************************************************/
2581 Tt_status tt_status;
2582 struct stat statData;
2584 realPath = (String) ResolveLocalPathName (host, path, NULL, home_host_name, &tt_status);
2585 if( TT_OK != tt_status )
2589 if( stat (realPath, &statData ) != 0 )
2591 if( lstat (realPath, &statData) != 0 )
2600 /* Path already is a directory */
2602 if ((statData.st_mode & S_IFMT) == S_IFDIR)
2608 if(findptr = strrchr (path, '/'))
2612 *file_name = findptr;
2625 /************************************************************************
2628 * Do the real work of viewing a directory.
2630 ************************************************************************/
2635 XtPointer client_data,
2636 XtPointer call_data )
2639 FileMgrData *file_mgr_data;
2640 DialogData *file_mgr_dialog_data;
2641 DialogData *dialog_data;
2642 DirectorySet *directory_data;
2643 FileViewData *file_view_data;
2648 find_rec = (FindRec *)client_data;
2649 file_mgr_dialog_data =
2650 (DialogData *) _DtGetInstanceData ((XtPointer) find_rec->fileMgrRec);
2651 file_mgr_data = (FileMgrData *) (file_mgr_dialog_data->data);
2653 GetFileName (find_rec->matchList, find_rec->selectedItem, &host, &path,
2659 /* No host specified, use the one associated with the view */
2661 if (ExtractDirectory (file_mgr_data->host, path, &file_name))
2663 initiating_view = (XtPointer) file_mgr_data;
2664 if(file_mgr_data->restricted_directory == NULL)
2665 dialog_data = GetNewView (file_mgr_data->host, path, NULL, NULL, 0);
2668 special_view = True;
2669 special_treeType = file_mgr_data->show_type;
2670 special_viewType = file_mgr_data->view;
2671 special_orderType = file_mgr_data->order;
2672 special_directionType = file_mgr_data->direction;
2673 special_randomType = file_mgr_data->positionEnabled;
2674 special_restricted =
2675 XtNewString(file_mgr_data->restricted_directory);
2676 if(file_mgr_data->title == NULL)
2677 special_title = NULL;
2679 special_title = XtNewString(file_mgr_data->title);
2680 special_helpVol = XtNewString(file_mgr_data->helpVol);
2681 if(file_mgr_data->toolbox)
2682 dialog_data = GetNewView (file_mgr_data->host, path,
2683 file_mgr_data->restricted_directory, NULL, 0);
2685 dialog_data = GetNewView (file_mgr_data->host,
2686 path, NULL, NULL, 0);
2690 InvalidFindMessage (find_rec, NO_EXISTANCE, NULL);
2694 if (ExtractDirectory (host, path, &file_name))
2696 initiating_view = (XtPointer) file_mgr_data;
2697 if(file_mgr_data->restricted_directory == NULL)
2698 dialog_data = GetNewView (host, path, NULL, NULL, 0);
2701 special_view = True;
2702 special_treeType = file_mgr_data->show_type;
2703 special_viewType = file_mgr_data->view;
2704 special_orderType = file_mgr_data->order;
2705 special_directionType = file_mgr_data->direction;
2706 special_randomType = file_mgr_data->positionEnabled;
2707 special_restricted =
2708 XtNewString(file_mgr_data->restricted_directory);
2709 if(file_mgr_data->title == NULL)
2710 special_title = NULL;
2712 special_title = XtNewString(file_mgr_data->title);
2713 special_helpVol = XtNewString(file_mgr_data->helpVol);
2714 if(file_mgr_data->toolbox)
2715 dialog_data = GetNewView (file_mgr_data->host, path,
2716 file_mgr_data->restricted_directory, NULL, 0);
2718 dialog_data = GetNewView (file_mgr_data->host,
2719 path, NULL, NULL, 0);
2723 InvalidFindMessage (find_rec, NO_EXISTANCE, NULL);
2726 if(dialog_data != NULL)
2728 file_mgr_data = (FileMgrData *) dialog_data->data;
2729 directory_data = file_mgr_data->directory_set[0];
2731 for (j = 0; j < directory_data->file_count; j++)
2733 file_view_data = directory_data->file_view_data[j];
2735 if (file_view_data->filtered != True &&
2736 strcmp(file_name, file_view_data->file_data->file_name) == 0)
2738 SelectFile (file_mgr_data, file_view_data);
2739 PositionFileView(file_view_data, file_mgr_data);
2743 if (!directory_data->file_count)
2744 file_mgr_data->desktop_file = XtNewString(file_name);
2746 file_mgr_data->desktop_file = NULL;
2748 if(file_mgr_data->selection_list[0] != NULL)
2749 ActivateSingleSelect ((FileMgrRec *) file_mgr_data->file_mgr_rec,
2750 file_mgr_data->selection_list[0]->file_data->logical_type);
2752 XtFree ((char *) host);
2753 XtFree ((char *) path);
2758 /************************************************************************
2761 * Put the found file/directory on the Desktop
2763 ************************************************************************/
2768 XtPointer client_data,
2769 XtPointer call_data )
2771 FindRec *find_rec = (FindRec *)client_data;
2772 FileMgrData *file_mgr_data;
2773 DialogData *file_mgr_dialog_data;
2778 int EndIndex = desktop_data->numIconsUsed;
2780 file_mgr_dialog_data =
2781 (DialogData *) _DtGetInstanceData ((XtPointer) find_rec->fileMgrRec);
2782 file_mgr_data = (FileMgrData *) (file_mgr_dialog_data->data);
2784 GetFileName (find_rec->matchList, find_rec->selectedItem, &host, &path,
2787 if (file_mgr_data->toolbox)
2788 path = _DtResolveAppManPath(path, file_mgr_data->restricted_directory);
2791 result = ExtractDirectory (file_mgr_data->host, path, &file_name);
2793 result = ExtractDirectory (host, path, &file_name);
2797 InvalidFindMessage (find_rec, NO_EXISTANCE, NULL);
2798 XtFree((char *)path);
2799 XtFree((char *)host);
2803 if(file_name == NULL)
2805 fileptr = strrchr (path, '/');
2807 file_name = fileptr + 1;
2812 SetupDesktopWindow (XtDisplay(widget), NULL,
2813 (FileMgrRec *)file_mgr_data->file_mgr_rec,
2814 file_name, file_mgr_data->host, path, -1, -1,
2815 file_mgr_data->restricted_directory,EndIndex);
2819 SetupDesktopWindow (XtDisplay(widget), NULL,
2820 (FileMgrRec *)file_mgr_data->file_mgr_rec,
2821 file_name, host, path, -1, -1,
2822 file_mgr_data->restricted_directory,EndIndex);
2824 XtFree((char *)path);
2825 XtFree((char *)host);
2828 /************************************************************************
2831 * Saves the index of the selected item
2833 ************************************************************************/
2838 XtPointer client_data,
2839 XtPointer call_data )
2841 FindRec * find_rec = (FindRec *) client_data;
2842 XmListCallbackStruct * cb = (XmListCallbackStruct *) call_data;
2844 find_rec->selectedItem = cb->item_position - 1;
2846 XtSetSensitive (find_rec->newFM, True);
2847 XtSetSensitive (find_rec->putOnDT, True);
2854 FindData *find_data )
2856 /* Force the focus to the text field */
2857 XmProcessTraversal(find_rec->fileNameFilter, XmTRAVERSE_CURRENT);
2861 findpopen(cmd,mode,childpid)
2866 static char *pname = "findpopen";
2868 register int parentside, childside;
2872 parentside = (mode[0] == 'r')? fd[0]:fd[1];
2873 childside = (mode[0] == 'r')? fd[1]:fd[0];
2874 if((*childpid = fork()) == 0)
2878 DBGFORK(("%s: child forked, pipe %d\n", pname, childside));
2880 /* Child has to select the stdin or stdout based on the mode */
2881 read_or_write = (mode[0] == 'r')? 1:0;
2882 (void) close(parentside);
2883 /* Dup the stdin or stdout based on the mode */
2884 if ( read_or_write != childside ) /* If what we got is already stdin */
2885 { /* or stdout then no need to close */
2886 (void) close(read_or_write);
2887 (void) fcntl(childside, F_DUPFD, read_or_write);
2888 (void) close(childside); /* Save a file descriptor */
2890 (void) execl("/bin/ksh", "ksh", "-c", cmd, (char *)0);
2891 /* Need to process the error return */
2893 DBGFORK(("%s: child exiting\n", pname));
2900 DBGFORK(("%s: forked child<%d>, pipe %d\n", pname, childpid, parentside));
2902 (void) close(childside); /* We don't need child side, so close it */
2903 return(fdopen(parentside, mode));