⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xrolo.c

📁 `smith.motif.tar.Z includes the source code for the book "Designing X clients with Xt/Motif," by Je
💻 C
📖 第 1 页 / 共 4 页
字号:
static void create_dialogs(app, parent, resource_data)XtAppContext app;Widget parent;ApplicationData *resource_data;{	static DialogButtonItem quit_unsaved_items[] = {		{"Save", SaveUnsavedChanges, (XtPointer) xrolo_QUIT_WARNING},		{"Discard", DiscardUnsavedChanges, (XtPointer) xrolo_QUIT_WARNING},		{"Cancel", CancelUnsavedChanges, (XtPointer) xrolo_QUIT_WARNING},		{NULL, NULL, NULL},	};	static DialogButtonItem open_warning_items[] = {		{"Save", SaveUnsavedChanges, (XtPointer) xrolo_OPEN_WARNING},		{"Discard", DiscardUnsavedChanges, (XtPointer) xrolo_OPEN_WARNING},		{"Cancel", CancelUnsavedChanges, (XtPointer) xrolo_OPEN_WARNING},		{NULL, NULL, NULL},	};	static DialogButtonItem overwrite_items[] = {		{"Overwrite", OverwriteOK, NULL},		{"Cancel", OverwriteCancel, NULL},		{NULL, NULL, NULL},	};	static DialogButtonItem message_items[] = {		{"  OK  ", NULL, NULL},		{NULL, NULL, NULL},	};	static menu_entry toggle_menu[] = {		{menu_TOG_ENTRY, "Case insensitive", "findInsensitiveButton",			InsensitiveSearch, NULL, NULL, NULL},		{menu_TOG_ENTRY, "Case sensitive", "findSensitiveButton",			SensitiveSearch, NULL, NULL, NULL},		{menu_END, NULL, NULL, NULL, NULL, NULL, NULL},	};	char dir_mask[xrolo_DIR_MASK_MAX_LEN + 2], *home;	Arg args[10];	int i;	Dimension height, margin_height;	Widget findPane, findBox, findLabel, findButtonBox,		findForwardButton, findReverseButton, findDismissButton,		findRadioBox;	if (*resource_data->dir_mask)		strncpy(dir_mask, resource_data->dir_mask, xrolo_DIR_MASK_MAX_LEN);	else if ((home = (char *) getenv("HOME")) == NULL)		strcpy(dir_mask, xrolo_DIR_MASK);	else {		strncpy(dir_mask, home, xrolo_DIR_MASK_MAX_LEN);		strncat(dir_mask, "/", xrolo_DIR_MASK_MAX_LEN - strlen(home));		strncat(dir_mask, xrolo_DIR_MASK, xrolo_DIR_MASK_MAX_LEN - strlen(home) - 1);	}	i = 0;	XtSetArg(args[i], XmNdialogTitle,		XmStringCreateLtoR("xrolodex", char_set)); i++;	XtSetArg(args[i], XmNdirMask,		XmStringCreateLtoR(dir_mask, char_set)); i++;	fileSelectionDialog = (Widget) XmCreateFileSelectionDialog(parent,		"fileSelectionDialog", args, i);	XtAddCallback(fileSelectionDialog, XmNokCallback,		FileSelectionOK, NULL);	XtAddCallback(fileSelectionDialog, XmNcancelCallback,		FileSelectionCancel, NULL);	XtUnmanageChild((Widget) XmFileSelectionBoxGetChild(fileSelectionDialog,		XmDIALOG_HELP_BUTTON));/***********************************************************************	dialog_create(app, parent, instance_name, items, num_columns,		title, prompt, char_set, dialog_position, modal_dialog,		max_win_mgr, string_input, auto_popdown, default_button);***********************************************************************/	quitUnsavedDialog = dialog_create(app, parent, "quitUnsavedDialog",		quit_unsaved_items, 0, "xrolodex", xrolo_QUIT_WARNING_MSG, char_set,		(resource_data->center_dialogs) ? dialog_CENTER : dialog_DEFAULT,		FALSE, FALSE, FALSE, FALSE, 0);	openUnsavedDialog = dialog_create(app, parent, "openUnsavedDialog",		open_warning_items, 0, "xrolodex", xrolo_OPEN_WARNING_MSG, char_set,		(resource_data->center_dialogs) ? dialog_CENTER : dialog_DEFAULT,		FALSE, FALSE, FALSE, FALSE, 0);	overwriteDialog = dialog_create(app, parent, "overwriteDialog",		overwrite_items, 0, "xrolodex", "File already exists!", char_set,		(resource_data->center_dialogs) ? dialog_CENTER : dialog_DEFAULT,		FALSE, FALSE, FALSE, TRUE, 0);	messageDialog = dialog_create(app, parent, "messageDialog",		message_items, 0, "xrolodex", "", char_set,		(resource_data->center_dialogs) ? dialog_CENTER : dialog_DEFAULT,		FALSE, FALSE, FALSE, TRUE, 0);	i = 0;	XtSetArg(args[i], XmNallowShellResize, (XtArgVal) True); i++;	XtSetArg(args[i], XmNmappedWhenManaged, (XtArgVal) False); i++;	findShell = XtAppCreateShell(NULL, xrolo_APP_CLASS,		topLevelShellWidgetClass, XtDisplay(parent), args, i);	i = 0;	XtSetArg(args[i], XmNsashWidth, (XtArgVal) 1); i++;	XtSetArg(args[i], XmNsashHeight, (XtArgVal) 1); i++;	findPane = XtCreateManagedWidget("findPane",		xmPanedWindowWidgetClass, findShell, args, i);	i = 0;	XtSetArg(args[i], XmNhorizontalSpacing, (XtArgVal) 5); i++;	XtSetArg(args[i], XmNverticalSpacing, (XtArgVal) 5); i++;	findBox = XtCreateManagedWidget("findBox",		xmFormWidgetClass, findPane, args, i);	i = 0;	XtSetArg(args[i], XmNleftAttachment, (XtArgVal) XmATTACH_FORM); i++;	XtSetArg(args[i], XmNrightAttachment, (XtArgVal) XmATTACH_FORM); i++;	XtSetArg(args[i], XmNtopAttachment, (XtArgVal) XmATTACH_FORM); i++;	XtSetArg(args[i], XmNlabelString,		XmStringCreateLtoR("Search for the next entry containing:",			char_set)); i++;	XtSetArg(args[i], XmNalignment, (XtArgVal) XmALIGNMENT_CENTER); i++;	findLabel = XtCreateManagedWidget("findLabel",		xmLabelWidgetClass, findBox, args, i);	i = 0;	XtSetArg(args[i], XmNleftAttachment, (XtArgVal) XmATTACH_FORM); i++;	XtSetArg(args[i], XmNrightAttachment, (XtArgVal) XmATTACH_FORM); i++;	XtSetArg(args[i], XmNtopAttachment, (XtArgVal) XmATTACH_WIDGET); i++;	XtSetArg(args[i], XmNtopWidget, (XtArgVal) findLabel); i++;	XtSetArg(args[i], XmNcolumns, (XtArgVal) 40); i++;	findText = XtCreateManagedWidget("findText",		xmTextWidgetClass, findBox, args, i);	XtAddCallback(findText, XmNactivateCallback, FindForward, NULL);	i = 0;	XtSetArg(args[i], XmNleftAttachment, (XtArgVal) XmATTACH_FORM); i++;	XtSetArg(args[i], XmNrightAttachment, (XtArgVal) XmATTACH_FORM); i++;	XtSetArg(args[i], XmNtopAttachment, (XtArgVal) XmATTACH_WIDGET); i++;	XtSetArg(args[i], XmNtopWidget, (XtArgVal) findText); i++;	XtSetArg(args[i], XmNborderWidth, (XtArgVal) 0); i++;	XtSetArg(args[i], XmNorientation, (XtArgVal) XmHORIZONTAL); i++;	XtSetArg(args[i], XmNradioBehavior, (XtArgVal) True); i++;	XtSetArg(args[i], XmNradioAlwaysOne, (XtArgVal) True); i++;	findRadioBox = XtCreateManagedWidget("findRadioBox",		xmRowColumnWidgetClass, findBox, args, i);	create_menus(findRadioBox, toggle_menu, char_set);	i = 0;	XtSetArg(args[i], XmNset, (XtArgVal) True); i++;	XtSetValues(toggle_menu[0].id, args, i);	i = 0;	XtSetArg(args[i], XmNborderWidth, (XtArgVal) 0); i++;	XtSetArg(args[i], XmNorientation, (XtArgVal) XmHORIZONTAL); i++;	findButtonBox = XtCreateManagedWidget("findButtonBox",		xmRowColumnWidgetClass, findPane, args, i);	i = 0;	XtSetArg(args[i], XmNlabelString,		XmStringCreateLtoR("Forward", char_set)); i++;	findForwardButton = XtCreateManagedWidget("findForwardButton",		xmPushButtonWidgetClass, findButtonBox, args, i);	XtAddCallback(findForwardButton,		XmNactivateCallback, FindForward, NULL);	i = 0;	XtSetArg(args[i], XmNlabelString,		XmStringCreateLtoR("Reverse", char_set)); i++;	findReverseButton = XtCreateManagedWidget("findReverseButton",		xmPushButtonWidgetClass, findButtonBox, args, i);	XtAddCallback(findReverseButton,		XmNactivateCallback, FindReverse, NULL);	i = 0;	XtSetArg(args[i], XmNlabelString,		XmStringCreateLtoR("Dismiss", char_set)); i++;	findDismissButton = XtCreateManagedWidget("findDismissButton",		xmPushButtonWidgetClass, findButtonBox, args, i);	XtAddCallback(findDismissButton,		XmNactivateCallback, FindDismiss, NULL);	i = 0;	XtSetArg(args[i], XmNmarginHeight, &margin_height); i++;	XtGetValues(findButtonBox, args, i);	i = 0;	XtSetArg(args[i], XmNheight, &height); i++;	XtGetValues(findDismissButton, args, i);	i = 0;	XtSetArg(args[i], XmNpaneMinimum,		(XtArgVal) (height + (margin_height * 2))); i++;	XtSetArg(args[i], XmNpaneMaximum,		(XtArgVal) (height + (margin_height * 2))); i++;	XtSetValues(findButtonBox, args, i);	remove_sash_traversal(findPane);}	/* create_dialogs *//*Private callback functions:*//*Close() terminates the application after freeing dynamicresources and processing unsaved changes.*//*ARGSUSED*/static void Close(w, client_data, call_data)Widget w;XtPointer client_data;XtPointer call_data;{	if (check_for_unsaved_changes(quitUnsavedDialog))		return;	cleanup_and_exit((Widget) client_data);}	/* Close *//*UnmapWindow() provides "Close" button functionality for pop-ups.*//*ARGSUSED*/static void UnmapWindow(w, client_data, call_data)Widget w;XtPointer client_data;XtPointer call_data;{	XtUnmapWidget((Widget) client_data);}	/* UnmapWindow *//*UnmanageWindow() provides "Close" button functionality for Motif dialogs.*//*ARGSUSED*/static void UnmanageWindow(w, client_data, call_data)Widget w;XtPointer client_data;XtPointer call_data;{	XtUnmanageChild((Widget) client_data);}	/* UnmanageWindow *//*DialogCancel() provides "Close" button functionality for`Dialog' dialogs.  Because `xrolodex' does NOT interpretdata associated with any of its dialogs' buttons, itdoesn't matter which button we interpret the "Close"operation as being equivalent to; thus, the 0th buttonis used; see dialog_cancel() in `dialog.c'.*//*ARGSUSED*/static void DialogCancel(w, client_data, call_data)Widget w;XtPointer client_data;XtPointer call_data;{	dialog_cancel((Dialog) client_data, 0);}	/* DialogCancel *//*Quit() terminates the application after freeing dynamicresources.  It first checks with the user via a dialog box.*//*ARGSUSED*/static void Quit(w, client_data, call_data)Widget w;XtPointer client_data;XtPointer call_data;{	if (check_for_unsaved_changes(quitUnsavedDialog))		return;	cleanup_and_exit(w);}	/* Quit *//*Exit() terminates the application after saving changes.*//*ARGSUSED*/static void Exit(w, client_data, call_data)Widget w;XtPointer client_data;XtPointer call_data;{	if (!is_rolodex_active())		return;	save_first_time();	save_current_text();	xrolo_db_save();	cleanup_and_exit(w);}	/* Exit *//*Open() prompts regarding unsaved changes and thenactivates the file selection box for loading a rolodexfile.  FileSelectionOK() manages the actual open/loadoperation for the rolodex file.*//*ARGSUSED*/static void Open(w, client_data, call_data)Widget w;XtPointer client_data;XtPointer call_data;{	Arg arg;	static XtCallbackRec open_cb_list[] = {		{FileSelectionOK, (XtPointer) xrolo_OPEN},	/* ptr warning */		{(XtCallbackProc) NULL, (XtPointer) NULL},	};	if (check_for_unsaved_changes(openUnsavedDialog))		return;	XtSetArg(arg, XmNokCallback, (XtArgVal) open_cb_list);	XtSetValues(fileSelectionDialog, &arg, 1);	XtManageChild(fileSelectionDialog);}	/* Open *//*Save() saves changes to the currently open rolodex database.*//*ARGSUSED*/static void Save(w, client_data, call_data)Widget w;XtPointer client_data;XtPointer call_data;{	if (!is_rolodex_active())		return;	save_first_time();	save_current_text();	xrolo_db_save();}	/* Save *//*SaveAs() activates the file selection box for specifyinga rolodex file.  FileSelectionOK() manages the actual saveoperation for the rolodex file.*//*ARGSUSED*/static void SaveAs(w, client_data, call_data)Widget w;XtPointer client_data;XtPointer call_data;{	Arg arg;	static XtCallbackRec save_as_cb_list[] = {		{FileSelectionOK, (XtPointer) xrolo_SAVE_AS},	/* ptr warning */		{(XtCallbackProc) NULL, (XtPointer) NULL},	};	if (!is_rolodex_active())		return;	XtSetArg(arg, XmNokCallback, (XtArgVal) save_as_cb_list);	XtSetValues(fileSelectionDialog, &arg, 1);	XtManageChild(fileSelectionDialog);}	/* SaveAs *//*EntryModified() signals modifications to the rolodex entry viewport.It is registered with the editor pseudo-widget's modify callback.*//*ARGSUSED*/static void EntryModified(w, client_data, call_data)Widget w;XtPointer client_data;XtPointer call_data;{	if (!is_rolodex_active())		return;	entry_modified = TRUE;}	/* EntryModified *//*InsensitiveSearch() signals modifications to the rolodex entrysearch case sensitivity.  It is registered with the togglebutton's value-changed callback.*//*ARGSUSED*/static void InsensitiveSearch(w, client_data, call_data)Widget w;XtPointer client_data;XtPointer call_data;{	case_sensitive_search = FALSE;}	/* InsensitiveSearch *//*SensitiveSearch() signals modifications to the rolodex entrysearch case sensitivity.  It is registered with the togglebutton's value-changed callback.*//*ARGSUSED*/static void SensitiveSearch(w, client_data, call_data)Widget w;XtPointer client_data;XtPointer call_data;{	case_sensitive_search = TRUE;}	/* SensitiveSearch *//*FileSelectionOK() responds to a user's file selection.  Itmust handle rolodex file "Open" and "SaveAs" operations.*//*ARGSUSED*/static void FileSelectionOK(w, client_data, call_data)Widget w;XtPointer client_data;XtPointer call_data;{	Arg args[5];	int i;	char *filename;	XmString xmstring;	i = 0;	XtSetArg(args[i], XmNtextString, &xmstring); i++;	XtGetValues(fileSelectionDialog, args, i);	if (!XmStringGetLtoR(xmstring, char_set, &filename))		return;	XtUnmanageChild(fileSelectionDialog);	if ((int) client_data == xrolo_OPEN)		open_rolodex_file(filename);	else if ((int) client_data == xrolo_SAVE_AS) {		/*		save_as_rolodex_file() *may* activate a nonmodal dialog box		and return with it still pending, so create a copy of the local		filename before freeing it.  Since callbacks are involved, there		is no point in passing it as arguments to procedures and setting		(and resetting) callback client-data values:		*/		if (save_as_filename)/*			free(save_as_filename);*/			XtFree(save_as_filename);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -