302 lines
		
	
	
		
			8.5 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			302 lines
		
	
	
		
			8.5 KiB
		
	
	
	
		
			C
		
	
	
	
| /*
 | |
|  * Copyright (c) 2000 by Conectiva S.A. (http://www.conectiva.com)
 | |
|  * 
 | |
|  * Permission is hereby granted, free of charge, to any person obtaining a
 | |
|  * copy of this software and associated documentation files (the "Software"),
 | |
|  * to deal in the Software without restriction, including without limitation
 | |
|  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 | |
|  * and/or sell copies of the Software, and to permit persons to whom the
 | |
|  * Software is furnished to do so, subject to the following conditions:
 | |
|  * 
 | |
|  * The above copyright notice and this permission notice shall be included in
 | |
|  * all copies or substantial portions of the Software.
 | |
|  *  
 | |
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | |
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | |
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 | |
|  * CONECTIVA LINUX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
 | |
|  * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
 | |
|  * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 | |
|  * SOFTWARE.
 | |
|  * 
 | |
|  * Except as contained in this notice, the name of Conectiva Linux shall
 | |
|  * not be used in advertising or otherwise to promote the sale, use or other
 | |
|  * dealings in this Software without prior written authorization from
 | |
|  * Conectiva Linux.
 | |
|  *
 | |
|  * Author: Paulo César Pereira de Andrade <pcpa@conectiva.com.br>
 | |
|  *
 | |
|  */
 | |
| 
 | |
| #include "config.h"
 | |
| #include "mouse-cfg.h"
 | |
| #include "keyboard-cfg.h"
 | |
| #include "card-cfg.h"
 | |
| #include "monitor-cfg.h"
 | |
| #include "screen-cfg.h"
 | |
| #include <X11/Xaw/AsciiText.h>
 | |
| #include <X11/Xaw/Paned.h>
 | |
| #include <X11/Xaw/Form.h>
 | |
| #include <X11/Xaw/Label.h>
 | |
| #include <X11/Xaw/Command.h>
 | |
| #include <X11/Shell.h>
 | |
| 
 | |
| /*
 | |
|  * Prototypes
 | |
|  */
 | |
| void BackCallback(Widget, XtPointer, XtPointer);
 | |
| void NextCallback(Widget, XtPointer, XtPointer);
 | |
| void ApplyCallback(Widget, XtPointer, XtPointer);
 | |
| void CloseCallback(Widget, XtPointer, XtPointer);
 | |
| void ErrorCallback(Widget, XtPointer, XtPointer);
 | |
| 
 | |
| /*
 | |
|  * Initialization
 | |
|  */
 | |
| XF86SetupFunction mouse_functions[] = {
 | |
|     MouseDeviceAndProtocol,
 | |
| };
 | |
| 
 | |
| XF86SetupFunction keyboard_functions[] = {
 | |
|     KeyboardModelAndLayout,
 | |
| };
 | |
| 
 | |
| XF86SetupFunction card_functions[] = {
 | |
|     CardModel,
 | |
| };
 | |
| 
 | |
| XF86SetupFunction monitor_functions[] = {
 | |
|     MonitorLayout,
 | |
| };
 | |
| 
 | |
| XF86SetupFunction screen_functions[] = {
 | |
|     ScreenDialog,
 | |
| };
 | |
| 
 | |
| XF86SetupFunctionList function_lists[] = {
 | |
|     {mouse_functions, sizeof(mouse_functions) / sizeof(mouse_functions[0]),},
 | |
|     {keyboard_functions, sizeof(keyboard_functions) / sizeof(keyboard_functions[0]),},
 | |
|     {card_functions, sizeof(card_functions) / sizeof(card_functions[0]),},
 | |
|     {monitor_functions, sizeof(monitor_functions) / sizeof(monitor_functions[0]),},
 | |
|     {screen_functions, sizeof(screen_functions) / sizeof(screen_functions[0]),},
 | |
| };
 | |
| 
 | |
| XF86SetupInfo xf86info = {
 | |
|     sizeof(function_lists) / sizeof(function_lists[0]),
 | |
|     MOUSE,
 | |
|     function_lists,
 | |
| };
 | |
| 
 | |
| Widget configp, current, ok, back, next;
 | |
| static Widget shell, errcurrent, oldcurrent;
 | |
| 
 | |
| static int config_status, config_popped;
 | |
| 
 | |
| static ConfigCheckFunction config_function;
 | |
| 
 | |
| Widget ident_widget;
 | |
| char *ident_string;
 | |
| XF86ConfigPtr XF86Config;
 | |
| 
 | |
| /*
 | |
|  * Implementation
 | |
|  */
 | |
| void
 | |
| StartConfig(void)
 | |
| {
 | |
|     static int first = 1;
 | |
|     Widget pane, top, bottom, cancel;
 | |
|     const char *filename;
 | |
| 
 | |
|     if (!first)
 | |
| 	return;
 | |
|     first = 0;
 | |
| 
 | |
|     /* Read initial configuration */
 | |
|     if ((filename = xf86openConfigFile(getuid() == 0 ? CONFPATH : USER_CONFPATH,
 | |
| 				       XF86Config_path, NULL)) == NULL) {
 | |
| 	int length = XF86Config_path ? strlen(XF86Config_path) : -1;
 | |
| 
 | |
| 	if (length > 2 &&
 | |
| 	    XF86Config_path[length - 2] == '-' &&
 | |
| 	    XF86Config_path[length - 1] == '4') {
 | |
| 	    XF86Config_path[length - 2] = '\0';
 | |
| 	    filename = xf86openConfigFile(getuid() == 0 ?
 | |
| 					  CONFPATH : USER_CONFPATH,
 | |
| 					  XF86Config_path, NULL);
 | |
| 	}
 | |
| 
 | |
| 	if (filename == NULL) {
 | |
| 	    fprintf(stderr, "Cannot open config file.\n");
 | |
| 	    exit(1);
 | |
| 	}
 | |
|     }
 | |
|     XF86Config_path = (char *)filename;
 | |
|     if ((XF86Config = xf86readConfigFile()) == NULL) {
 | |
| 	fprintf(stderr, "Problem when parsing config file\n");
 | |
| 	exit(1);
 | |
|     }
 | |
| 
 | |
|     shell = XtCreatePopupShell("config", transientShellWidgetClass,
 | |
| 			       toplevel, NULL, 0);
 | |
|     pane = XtCreateManagedWidget("pane", panedWidgetClass,
 | |
| 				 shell, NULL, 0);
 | |
|     top = XtCreateManagedWidget("top", formWidgetClass,
 | |
| 				pane, NULL, 0);
 | |
|     (void) XtCreateManagedWidget("label", labelWidgetClass,
 | |
| 				  top, NULL, 0);
 | |
|     ident_widget = XtVaCreateManagedWidget("identifier", asciiTextWidgetClass,
 | |
| 					   top,
 | |
| 					   XtNeditType, XawtextEdit,
 | |
| 					   NULL);
 | |
|     configp = XtCreateManagedWidget("work", formWidgetClass,
 | |
| 				    pane, NULL, 0);
 | |
|     current = XtCreateManagedWidget("wellcome", labelWidgetClass,
 | |
| 				    configp, NULL, 0);
 | |
|     bottom = XtCreateManagedWidget("bottom", formWidgetClass,
 | |
| 				   pane, NULL, 0);
 | |
|     back = XtCreateManagedWidget("back", commandWidgetClass,
 | |
| 				 bottom, NULL, 0);
 | |
|     XtAddCallback(back, XtNcallback, BackCallback, (XtPointer)&xf86info);
 | |
|     next = XtCreateManagedWidget("next", commandWidgetClass,
 | |
| 				 bottom, NULL, 0);
 | |
|     XtAddCallback(next, XtNcallback, NextCallback, (XtPointer)&xf86info);
 | |
|     ok = XtCreateManagedWidget("ok", commandWidgetClass,
 | |
| 			       bottom, NULL, 0);
 | |
|     XtAddCallback(ok, XtNcallback, ApplyCallback, (XtPointer)NULL);
 | |
|     cancel = XtCreateManagedWidget("cancel", commandWidgetClass,
 | |
| 				   bottom, NULL, 0);
 | |
|     XtAddCallback(cancel, XtNcallback, CloseCallback, (XtPointer)NULL);
 | |
| 
 | |
|     XtRealizeWidget(shell);
 | |
| 
 | |
|     XSetWMProtocols(DPY, XtWindow(shell), &wm_delete_window, 1);
 | |
| }
 | |
| 
 | |
| /*ARGSUSED*/
 | |
| Bool
 | |
| ConfigLoop(ConfigCheckFunction config_fn)
 | |
| {
 | |
|     Arg args[1];
 | |
|     config_popped = True;
 | |
|     XtPopup(shell, XtGrabExclusive);
 | |
| 
 | |
|     config_function = config_fn;
 | |
|     while (config_popped)
 | |
| 	XtAppProcessEvent(XtWidgetToApplicationContext(shell), XtIMAll);
 | |
| 
 | |
|     XtSetArg(args[0], XtNstring, &ident_string);
 | |
|     XtGetValues(ident_widget, args, 1);
 | |
| 
 | |
|     return (config_status);
 | |
| }
 | |
| 
 | |
| /*ARGSUSED*/
 | |
| void
 | |
| ConfigError(void)
 | |
| {
 | |
|     static int first = 1;
 | |
| 
 | |
|     if (first) {
 | |
| 	Widget command;
 | |
| 
 | |
| 	errcurrent = XtCreateWidget("error", formWidgetClass,
 | |
| 			 	     configp, NULL, 0);
 | |
| 	(void) XtCreateManagedWidget("label", labelWidgetClass,
 | |
| 				      errcurrent, NULL, 0);
 | |
| 	command = XtCreateManagedWidget("command", commandWidgetClass,
 | |
| 					errcurrent, NULL, 0);
 | |
| 	XtAddCallback(command, XtNcallback, ErrorCallback, NULL);
 | |
| 
 | |
| 	XtRealizeWidget(errcurrent);
 | |
|     }
 | |
| 
 | |
|     oldcurrent = current;
 | |
|     XtChangeManagedSet(¤t, 1, NULL, NULL, &errcurrent, 1);
 | |
|     current = errcurrent;
 | |
| 
 | |
|     XtSetSensitive(ok, False);
 | |
| }
 | |
| 
 | |
| /*ARGSUSED*/
 | |
| void
 | |
| ErrorCallback(Widget w, XtPointer user_data, XtPointer call_data)
 | |
| {
 | |
|     XtChangeManagedSet(&errcurrent, 1, NULL, NULL, &oldcurrent, 1);
 | |
|     current = oldcurrent;
 | |
| 
 | |
|     XtSetSensitive(ok, True);
 | |
| }
 | |
| 
 | |
| /*ARGSUSED*/
 | |
| void
 | |
| BackCallback(Widget w, XtPointer user_data, XtPointer call_data)
 | |
| {
 | |
|     XF86SetupInfo *info = (XF86SetupInfo*)user_data;
 | |
|     int idx = info->lists[info->cur_list].cur_function - 1;
 | |
| 
 | |
|     if (idx >= 0 && info->lists[info->cur_list].num_functions > 0) {
 | |
| 	info->lists[info->cur_list].cur_function = idx;
 | |
| 	if (idx - 1 == -1)
 | |
| 	    XtSetSensitive(back, False);
 | |
| 	if (!XtIsSensitive(next))
 | |
| 	    XtSetSensitive(next, True);
 | |
| 	(info->lists[info->cur_list].functions[idx])(info);
 | |
|     }
 | |
| }
 | |
| 
 | |
| /*ARGSUSED*/
 | |
| void
 | |
| NextCallback(Widget w, XtPointer user_data, XtPointer call_data)
 | |
| {
 | |
|     XF86SetupInfo *info = (XF86SetupInfo*)user_data;
 | |
|     int idx = info->lists[info->cur_list].cur_function + 1;
 | |
| 
 | |
|     if (idx < info->lists[info->cur_list].num_functions) {
 | |
| 	info->lists[info->cur_list].cur_function = idx;
 | |
| 	if (idx + 1 == info->lists[info->cur_list].num_functions)
 | |
| 	    XtSetSensitive(next, False);
 | |
| 	if (!XtIsSensitive(back))
 | |
| 	    XtSetSensitive(back, True);
 | |
| 	(info->lists[info->cur_list].functions[idx])(info);
 | |
|     }
 | |
| }
 | |
| 
 | |
| /*ARGSUSED*/
 | |
| void
 | |
| CloseCallback(Widget w, XtPointer user_data, XtPointer call_data)
 | |
| {
 | |
|     XtPopdown(shell);
 | |
|     config_popped = False;
 | |
|     config_status = False;
 | |
|     /* make sure it is sensitive */
 | |
|     XtSetSensitive(ok, True);
 | |
|     xf86info.lists[xf86info.cur_list].cur_function = 0;
 | |
| }
 | |
| 
 | |
| /*ARGSUSED*/
 | |
| void
 | |
| ApplyCallback(Widget w, XtPointer user_data, XtPointer call_data)
 | |
| {
 | |
|     Arg args[1];
 | |
| 
 | |
|     XtSetArg(args[0], XtNstring, &ident_string);
 | |
|     XtGetValues(ident_widget, args, 1);
 | |
| 
 | |
|     if (config_function == NULL || (*config_function)()) {
 | |
| 	XtPopdown(shell);
 | |
| 	config_popped = False;
 | |
| 	config_status = True;
 | |
| 	xf86info.lists[xf86info.cur_list].cur_function = 0;
 | |
|     }
 | |
|     else
 | |
| 	ConfigError();
 | |
| }
 | |
| 
 | |
| /*ARGSUSED*/
 | |
| void
 | |
| ConfigCancelAction(Widget w, XEvent *event, String *params, Cardinal *num_params)
 | |
| {
 | |
|     CloseCallback(w, NULL, NULL);
 | |
| }
 |