diff options
Diffstat (limited to 'xorg-server/hw/xfree86/utils/xorgcfg/mouse-cfg.c')
-rw-r--r-- | xorg-server/hw/xfree86/utils/xorgcfg/mouse-cfg.c | 449 |
1 files changed, 449 insertions, 0 deletions
diff --git a/xorg-server/hw/xfree86/utils/xorgcfg/mouse-cfg.c b/xorg-server/hw/xfree86/utils/xorgcfg/mouse-cfg.c new file mode 100644 index 000000000..24aec6ae4 --- /dev/null +++ b/xorg-server/hw/xfree86/utils/xorgcfg/mouse-cfg.c @@ -0,0 +1,449 @@ +/* + * 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 "xf86config.h" +#include "mouse-cfg.h" +#include <X11/Xaw/AsciiText.h> +#include <X11/Xaw/Label.h> +#include <X11/Xaw/List.h> +#include <X11/Xaw/Form.h> +#include <X11/Xaw/Toggle.h> +#include <X11/Xaw/Viewport.h> +#include <X11/extensions/xf86misc.h> + +/* + * Prototypes + */ +static void MouseDeviceCallback(Widget, XtPointer, XtPointer); +static void MouseProtocolCallback(Widget, XtPointer, XtPointer); +static void MouseEmulateCallback(Widget, XtPointer, XtPointer); +static void MouseApplyCallback(Widget, XtPointer, XtPointer); +static Bool MouseConfigCheck(void); + +/* + * Initialization + */ +static struct MouseProtocol { + char *name; + int type; +} protocols[] = { +#ifdef __SCO__ + {"OsMouse", MTYPE_AUTOMOUSE}, +#endif +#ifdef WSCONS_SUPPORT + {"wsmouse", MTYPE_AUTOMOUSE}, +#endif + {"Auto", MTYPE_AUTOMOUSE}, + {"SysMouse", MTYPE_SYSMOUSE}, + {"MouseSystems", MTYPE_MOUSESYS}, + {"BusMouse", MTYPE_BUSMOUSE}, + {"PS/2", MTYPE_PS_2}, + {"Microsoft", MTYPE_MICROSOFT}, +#ifndef __FreeBSD__ + {"ImPS/2", MTYPE_IMPS2}, + {"ExplorerPS/2", MTYPE_EXPPS2}, + {"GlidePointPS/2", MTYPE_GLIDEPOINTPS2}, + {"MouseManPlusPS/2", MTYPE_MMANPLUSPS2}, + {"NetMousePS/2", MTYPE_NETPS2}, + {"NetScrollPS/2", MTYPE_NETSCROLLPS2}, + {"ThinkingMousePS/2", MTYPE_THINKINGPS2}, +#endif + {"AceCad", MTYPE_ACECAD}, + {"GlidePoint", MTYPE_GLIDEPOINT}, + {"IntelliMouse", MTYPE_IMSERIAL}, + {"Logitech", MTYPE_LOGITECH}, + {"MMHitTab", MTYPE_MMHIT}, + {"MMSeries", MTYPE_MMSERIES}, + {"MouseMan", MTYPE_LOGIMAN}, + {"ThinkingMouse", MTYPE_THINKING}, +}; + +static Widget text; +static char *device, *protocol; +static Bool emulate; +static XF86ConfInputPtr current_input; + +/* + * Implementation + */ +/*ARGSUSED*/ +XtPointer +MouseConfig(XtPointer config) +{ + XF86ConfInputPtr mouse = (XF86ConfInputPtr)config; + XF86OptionPtr option; + char mouse_name[32]; + Arg args[1]; + + static char *Device = "Device", *Protocol = "Protocol", + *Emulate3Buttons = "Emulate3Buttons", + *Emulate3Timeout = "Emulate3Timeout"; + + current_input = mouse; + + if (mouse != NULL) { + emulate = xf86findOption(mouse->inp_option_lst, + Emulate3Buttons) != NULL; + if ((option = xf86findOption(mouse->inp_option_lst, Device)) != NULL) + device = option->opt_val; + else + device = NULL; + if ((option = xf86findOption(mouse->inp_option_lst, Protocol)) != NULL) + protocol = option->opt_val; + else + protocol = NULL; + + XtSetArg(args[0], XtNstring, mouse->inp_identifier); + XtSetValues(ident_widget, args, 1); + } + else { + XF86ConfInputPtr input = XF86Config->conf_input_lst; + int nmouses = 0; + + while (input != NULL) { + if (strcasecmp(input->inp_driver, "mouse") == 0) + ++nmouses; + input = (XF86ConfInputPtr)(input->list.next); + } + do { + XmuSnprintf(mouse_name, sizeof(mouse_name), "Mouse%d", nmouses); + ++nmouses; + } while (xf86findInput(mouse_name, + XF86Config->conf_input_lst)); + + XtSetArg(args[0], XtNstring, mouse_name); + XtSetValues(ident_widget, args, 1); + + emulate = True; + device = NULL; + protocol = NULL; + } + + xf86info.cur_list = MOUSE; + XtSetSensitive(back, xf86info.lists[MOUSE].cur_function > 0); + XtSetSensitive(next, xf86info.lists[MOUSE].cur_function < + xf86info.lists[MOUSE].num_functions - 1); + (xf86info.lists[MOUSE].functions[xf86info.lists[MOUSE].cur_function]) + (&xf86info); + + if (ConfigLoop(MouseConfigCheck) == True) { + XtSetArg(args[0], XtNstring, &device); + XtGetValues(text, args, 1); + if (mouse == NULL) { + mouse = XtNew(XF86ConfInputRec); + mouse->list.next = NULL; + mouse->inp_identifier = XtNewString(ident_string); + mouse->inp_driver = XtNewString("mouse"); + mouse->inp_option_lst = xf86newOption(XtNewString(Device), + XtNewString(device)); + xf86addNewOption(mouse->inp_option_lst, + XtNewString(Protocol), XtNewString(protocol)); + if (emulate) { + xf86addNewOption(mouse->inp_option_lst, + XtNewString(Emulate3Buttons), NULL); + xf86addNewOption(mouse->inp_option_lst, + XtNewString(Emulate3Timeout), + XtNewString("50")); + } + mouse->inp_comment = NULL; + } + else { + if ((option = xf86findOption(mouse->inp_option_lst, Device)) != NULL) { + XtFree(option->opt_val); + option->opt_val = XtNewString(device); + XtFree(option->opt_comment); + } + else { + if (mouse->inp_option_lst == NULL) + mouse->inp_option_lst = xf86newOption(XtNewString(Device), + XtNewString(device)); + else + xf86addNewOption(mouse->inp_option_lst, + XtNewString(Device), XtNewString(device)); + } + + if ((option = xf86findOption(mouse->inp_option_lst, Protocol)) != NULL) { + XtFree(option->opt_val); + option->opt_val = XtNewString(protocol); + XtFree(option->opt_comment); + } + else + xf86addNewOption(mouse->inp_option_lst, + XtNewString(Protocol), XtNewString(protocol)); + + if (emulate == False) { + xf86removeOption(&(mouse->inp_option_lst), Emulate3Buttons); + xf86removeOption(&(mouse->inp_option_lst), Emulate3Timeout); + } + else if (emulate) { + xf86addNewOption(mouse->inp_option_lst, + XtNewString(Emulate3Buttons), NULL); + xf86addNewOption(mouse->inp_option_lst, + XtNewString(Emulate3Timeout), XtNewString("50")); + } + } + if (strcasecmp(mouse->inp_identifier, ident_string)) + xf86renameInput(XF86Config, mouse, ident_string); + + return ((XtPointer)mouse); + } + + return (NULL); +} + +static Bool +MouseConfigCheck(void) +{ + Arg args[1]; + XF86ConfInputPtr mouse = XF86Config->conf_input_lst; + + XtSetArg(args[0], XtNstring, &device); + XtGetValues(text, args, 1); + + if (ident_string == NULL || strlen(ident_string) == 0 || + device == NULL || strlen(device) == 0 || protocol == NULL) + return (False); + while (mouse != NULL) { + if (mouse != current_input && + strcasecmp(ident_string, mouse->inp_identifier) == 0) + return (False); + mouse = (XF86ConfInputPtr)(mouse->list.next); + } + + return (True); +} + +static void +MouseDeviceCallback(Widget w, XtPointer user_data, XtPointer call_data) +{ + XawListReturnStruct *info = (XawListReturnStruct *)call_data; + Arg args[1]; + + XtSetArg(args[0], XtNstring, info->string); + XtSetValues((Widget)user_data, args, 1); + XawTextSetInsertionPoint((Widget)user_data, strlen(info->string)); +} + +static void +MouseProtocolCallback(Widget w, XtPointer user_data, XtPointer call_data) +{ + XawListReturnStruct *info = (XawListReturnStruct *)call_data; + + protocol = info->string; +} + +static void +MouseEmulateCallback(Widget w, XtPointer user_data, XtPointer call_data) +{ + emulate = (Bool)(long)call_data; +} + +static void +MouseApplyCallback(Widget w, XtPointer user_data, XtPointer call_data) +{ + int i; + XF86MiscMouseSettings mouse; + + XF86MiscGetMouseSettings(XtDisplay(w), &mouse); + XtFree(mouse.device); + + if (mouse.baudrate == 0 || mouse.baudrate < 0 || mouse.baudrate > 9600 || + mouse.baudrate % 1200) + mouse.baudrate = 1200; + + mouse.type = MTYPE_AUTOMOUSE; + for (i = 0; i < sizeof(protocols) / sizeof(protocols[0]); i++) + if (strcmp(protocols[i].name, protocol) == 0) { + mouse.type = protocols[i].type; + break; + } + + mouse.emulate3buttons = emulate; + mouse.flags |= MF_REOPEN; + + mouse.device = device; + + XFlush(XtDisplay(w)); + XF86MiscSetMouseSettings(XtDisplay(w), &mouse); +} + +void +MouseDeviceAndProtocol(XF86SetupInfo *info) +{ + static int first = 1, ndevices; + static Widget mouse_dp, listD, listP, emul3, apply; + static char **devices; + static char *dirs[] = { + "/dev", +#ifdef __linux__ + "/dev/input" +#endif + }; + static char *patterns[] = { +#ifdef WSCONS_SUPPORT + "wsmouse", +#endif + "cuaa", + "mice", + "mouse", + "ps", + "sysmouse", + "ttyS", + }; + Arg args[2]; + int i; + + if (first) { + Widget viewport; + struct dirent *ent; + DIR *dir; + char **list; + int count; + + first = 0; + + mouse_dp = XtCreateWidget("mouseDP", formWidgetClass, + configp, NULL, 0); + + /* DEVICE */ + for (count = 0; count < sizeof(dirs) / sizeof(dirs[0]); count++) { + if ((dir = opendir(dirs[count])) != NULL) { + int i, len, xlen = strlen(dirs[count]) + 2; + + (void)readdir(dir); + (void)readdir(dir); + while ((ent = readdir(dir)) != NULL) { + for (i = 0; i < sizeof(patterns) / sizeof(patterns[0]); i++) { + len = strlen(patterns[i]); + + if (strncmp(patterns[i], ent->d_name, len) == 0) { + len = strlen(ent->d_name) + xlen; + + devices = (char**)XtRealloc((XtPointer)devices, + sizeof(char*) * ++ndevices); + devices[ndevices - 1] = XtMalloc(len); + XmuSnprintf(devices[ndevices - 1], len, "%s/%s", + dirs[count], ent->d_name); + } + } + } + closedir(dir); + } + } + + (void) XtCreateManagedWidget("labelD", labelWidgetClass, + mouse_dp, NULL, 0); + text = XtVaCreateManagedWidget("device", asciiTextWidgetClass, + mouse_dp, + XtNeditType, XawtextEdit, + NULL); + viewport = XtCreateManagedWidget("viewportD", viewportWidgetClass, + mouse_dp, NULL, 0); + + listD = XtVaCreateManagedWidget("listD", listWidgetClass, + viewport, + XtNlist, devices, + XtNnumberStrings, ndevices, + NULL); + XtAddCallback(listD, XtNcallback, MouseDeviceCallback, (XtPointer)text); + + /* PROTOCOL */ + (void) XtCreateManagedWidget("labelP", labelWidgetClass, + mouse_dp, NULL, 0); + viewport = XtCreateManagedWidget("viewportP", viewportWidgetClass, + mouse_dp, NULL, 0); + + list = (char**)XtMalloc(sizeof(char*) * + sizeof(protocols)/sizeof(protocols[0])); + for (count = 0; count < sizeof(protocols)/sizeof(protocols[0]); count++) + list[count] = XtNewString(protocols[count].name); + listP = XtVaCreateManagedWidget("listP", listWidgetClass, + viewport, + XtNlist, list, + XtNnumberStrings, count, + NULL); + XtAddCallback(listP, XtNcallback, MouseProtocolCallback, NULL); + + emul3 = XtVaCreateManagedWidget("emulate3", toggleWidgetClass, + mouse_dp, XtNstate, True, NULL); + XtAddCallback(emul3, XtNcallback, MouseEmulateCallback, NULL); + apply = XtCreateManagedWidget("apply", commandWidgetClass, + mouse_dp, NULL, 0); + XtAddCallback(apply, XtNcallback, MouseApplyCallback, NULL); + + XtRealizeWidget(mouse_dp); + } + + if (device != NULL) { + for (i = 0; i < ndevices; i++) + if (strcmp(device, devices[i]) == 0) { + XtSetArg(args[0], XtNstring, device); + XtSetValues(text, args, 1); + XawListHighlight(listD, i); + break; + } + + if (i >= ndevices) { + devices = (char**)XtRealloc((XtPointer)devices, + sizeof(char*) * ++ndevices); + devices[ndevices - 1] = XtNewString(device); + XawListHighlight(listD, ndevices - 1); + XtSetArg(args[0], XtNlist, devices); + XtSetArg(args[1], XtNnumberStrings, ndevices); + XtSetValues(listD, args, 2); + } + device = devices[i]; + } + else { + XtSetArg(args[0], XtNstring, ""); + XtSetValues(text, args, 1); + XawListUnhighlight(listD); + } + + if (protocol != NULL) { + for (i = 0; i < sizeof(protocols) / sizeof(protocols[0]); i++) + if (strcasecmp(protocol, protocols[i].name) == 0) { + protocol = protocols[i].name; + XawListHighlight(listP, i); + break; + } + } + else { + /* "Auto" is the default */ + protocol = protocols[0].name; + XawListHighlight(listP, 0); + } + + XtSetArg(args[0], XtNstate, emulate); + XtSetValues(emul3, args, 1); + + XtChangeManagedSet(¤t, 1, NULL, NULL, &mouse_dp, 1); + current = mouse_dp; +} |