/* * tkUtil.c (CTk) -- * * This file contains miscellaneous utility procedures that * are used by the rest of Tk, such as a procedure for drawing * a focus highlight. * * Copyright (c) 1994 The Regents of the University of California. * Copyright (c) 1994-1995 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * @(#) $Id: ctk.shar,v 1.50 1996/01/15 14:47:16 andrewm Exp andrewm $ */ #include "tk.h" #include "tkPort.h" /* *---------------------------------------------------------------------- * * Tk_GetScrollInfo -- * * This procedure is invoked to parse "xview" and "yview" * scrolling commands for widgets using the new scrolling * command syntax ("moveto" or "scroll" options). * * Results: * The return value is either TK_SCROLL_MOVETO, TK_SCROLL_PAGES, * TK_SCROLL_UNITS, or TK_SCROLL_ERROR. This indicates whether * the command was successfully parsed and what form the command * took. If TK_SCROLL_MOVETO, *dblPtr is filled in with the * desired position; if TK_SCROLL_PAGES or TK_SCROLL_UNITS, * *intPtr is filled in with the number of lines to move (may be * negative); if TK_SCROLL_ERROR, interp->result contains an * error message. * * Side effects: * None. * *---------------------------------------------------------------------- */ int Tk_GetScrollInfo(interp, argc, argv, dblPtr, intPtr) Tcl_Interp *interp; /* Used for error reporting. */ int argc; /* # arguments for command. */ char **argv; /* Arguments for command. */ double *dblPtr; /* Filled in with argument "moveto" * option, if any. */ int *intPtr; /* Filled in with number of pages * or lines to scroll, if any. */ { int c; size_t length; length = strlen(argv[2]); c = argv[2][0]; if ((c == 'm') && (strncmp(argv[2], "moveto", length) == 0)) { if (argc != 4) { Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], " ", argv[1], " moveto fraction\"", (char *) NULL); return TK_SCROLL_ERROR; } if (Tcl_GetDouble(interp, argv[3], dblPtr) != TCL_OK) { return TK_SCROLL_ERROR; } return TK_SCROLL_MOVETO; } else if ((c == 's') && (strncmp(argv[2], "scroll", length) == 0)) { if (argc != 5) { Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], " ", argv[1], " scroll number units|pages\"", (char *) NULL); return TK_SCROLL_ERROR; } if (Tcl_GetInt(interp, argv[3], intPtr) != TCL_OK) { return TK_SCROLL_ERROR; } length = strlen(argv[4]); c = argv[4][0]; if ((c == 'p') && (strncmp(argv[4], "pages", length) == 0)) { return TK_SCROLL_PAGES; } else if ((c == 'u') && (strncmp(argv[4], "units", length) == 0)) { return TK_SCROLL_UNITS; } else { Tcl_AppendResult(interp, "bad argument \"", argv[4], "\": must be units or pages", (char *) NULL); return TK_SCROLL_ERROR; } } Tcl_AppendResult(interp, "unknown option \"", argv[2], "\": must be moveto or scroll", (char *) NULL); return TK_SCROLL_ERROR; }