|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T s
Length: 12336 (0x3030) Types: TextFile Names: »sxDemo.c«
└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki └─⟦526ad3590⟧ »EUUGD11/gnu-31mar87/X.V10.R4.tar.Z« └─⟦2109abc41⟧ └─⟦this⟧ »./X.V10R4/Toolkit/Sx/doc/sxDemo.c«
/* * sxDemo.c -- * * This is a sample window application that demonstrates many * of the features of the Sx package. Unfortunately, it's so * simple that it doesn't make very good use of the "clientData" * arguments. * * Copyright (C) 1986 Regents of the University of California. * Permission to use, copy, modify, and distribute this * software and its documentation for any purpose and without * fee is hereby granted, provided that the above copyright * notice appear in all copies. The University of California * makes no representations about the suitability of this software * for any purpose. It is provided "as is" without express or * implied warranty. */ #ifndef lint static char rcsid[] = "$Header: sxDemo.c,v 1.12 86/11/16 15:53:13 ouster Exp $ SPRITE (Berkeley)"; #endif not lint #include <stdio.h> #include <X/Xlib.h> #undef NULL #include "sx.h" /* * Forward declarations of callback procedures. */ void MakeButtonProc(), ChangeTextProc(), DeleteButtonProc(); void NewButtonMenuProc(), DeleteButtonMenuProc(), EnableMaskProc(); void Notifier1Proc(), Notifier2Proc(); void QuitProc(); void ScrollProc(); void RedisplayProc(); void ButtonProc(); /* * Pull-down menu declarations: */ Sx_MenuEntry buttons[] = { {NULL, "Make Button", NULL, -1, MakeButtonProc, (ClientData) NULL}, {NULL, "Change Text", NULL, -1, ChangeTextProc, (ClientData) NULL}, {NULL, "Delete Button", NULL, -1, DeleteButtonProc, (ClientData) NULL} }; Sx_MenuEntry menus[] = { {"Make new button menu", NULL, NULL, -1, NewButtonMenuProc, (ClientData) NULL}, {"Delete newest button menu", NULL, NULL, -1, DeleteButtonMenuProc, (ClientData) NULL}, {"Disable this menu entry", NULL, NULL, -1, EnableMaskProc, (ClientData) ~0x4}, {"Enable previous menu entry", NULL, NULL, -1, EnableMaskProc, (ClientData) ~0} }; Sx_MenuEntry notifiers[] = { {"Test Notifier 1", NULL, NULL, -1, Notifier1Proc, (ClientData) NULL}, {"Test Notifier 2", NULL, NULL, -1, Notifier2Proc, (ClientData) NULL} }; Sx_MenuEntry quit[] = { {NULL, "Quit", NULL, -1, QuitProc, (ClientData) NULL} }; /* * Windows that make up SxDemo's application. */ Window w; /* Top-level window. */ Window title, vertScrollbar, horizScrollbar; Window menuBar, buttonsMenu, menusMenu, notifiersMenu, quitMenu; Window entry; Window buttonsMenu2 = NULL; Window button = NULL; /* * Font and color information: */ static FontInfo *fontPtr; static int foreground, background; static Pixmap fgPixmap, bgPixmap; \f main(argc, argv) int argc; char **argv; { int height; char entryText[100], *defString; Color hard, exact; /* * Open a connection to the display. */ if (XOpenDisplay((char *) NULL) == NULL) { printf("Couldn't open display. Are you sure X is running?\n"); return; } /* * Read defaults, and set up color and font information. */ foreground = BlackPixel; fgPixmap = BlackPixmap; background = WhitePixel; bgPixmap = WhitePixmap; if (DisplayCells() > 2) { defString = XGetDefault(argv[0], "Foreground"); if ((defString != NULL) && (XGetColor(defString, &hard, &exact) != 0) && (XGetHardwareColor(&hard) != 0)) { foreground = hard.pixel; fgPixmap = XMakeTile(foreground); } defString = XGetDefault(argv[0], "Background"); if ((defString != NULL) && (XGetColor(defString, &hard, &exact) != 0) && (XGetHardwareColor(&hard) != 0)) { background = hard.pixel; bgPixmap = XMakeTile(background); } } defString = XGetDefault(argv[0], "BodyFont"); if (defString != NULL) { fontPtr = XOpenFont(defString); } if (fontPtr == NULL) { fontPtr = XOpenFont("8x13"); if (fontPtr == NULL) { Sx_Panic("SxDemo: couldn't find a font to use."); } } /* * Create the window and its subwindows. */ w = XCreateWindow(RootWindow, 100, 100, 450, 300, 2, fgPixmap, bgPixmap); (void) Sx_HandlerCreate(w, ExposeWindow, RedisplayProc, (ClientData) NULL); height = Sx_DefaultHeight(fontPtr); title = Sx_TitleCreate(w, SX_TOP, height, 0, fontPtr, background, foreground, (char *) NULL, "Sx Demonstrator Program", (char *) NULL); menuBar = Sx_CreatePacked(w, SX_TOP, height, 1, (Window) NULL, (Window) NULL, fgPixmap, bgPixmap); menusMenu = Sx_MenuCreate(menuBar, "Menus", 4, menus, fontPtr, foreground, background); buttonsMenu = Sx_MenuCreate(menuBar, "Buttons", 3, buttons, fontPtr, foreground, background); notifiersMenu = Sx_MenuCreate(menuBar, "Notifiers", 2, notifiers, fontPtr, foreground, background); quitMenu = Sx_MenuCreate(menuBar, "Quit", 1, quit, fontPtr, foreground, background); horizScrollbar = Sx_ScrollbarCreate(w, SX_BOTTOM, foreground, background, background, ScrollProc, (ClientData) NULL); Sx_ScrollbarSetRange(horizScrollbar, 0.0, .2); vertScrollbar = Sx_ScrollbarCreate(w, SX_RIGHT,foreground, background, background, ScrollProc, (ClientData) NULL); Sx_ScrollbarSetRange(vertScrollbar, 0.0, .2); entry = Sx_CreatePacked(w, SX_BOTTOM, height, 1, (Window) NULL, (Window) NULL, fgPixmap, bgPixmap); Sx_EntryMake(entry, "You can type text here: ", fontPtr, foreground, background, entryText, 100); XMapWindow(w); while (1) { XEvent event; XNextEvent(&event); Sx_HandleEvent(&event); } } /* * Callback procedure invoked whenever a mouse button is pressed over * the button subwindow: */ void ButtonProc(clientData, whichButton, window) ClientData clientData; /* Not used. */ int whichButton; /* Tells which button was clicked. */ Window window; /* Not used. */ { static char *name[] = {"right", "middle", "left"}; printf("You touched me with the %s mouse button.\n", name[whichButton]); } /* * Callback procedure invoked whenever the "Make Button" menu entry is invoked. */ void MakeButtonProc(clientData, index, window) ClientData clientData; /* Not used. */ int index; /* Index of menu entry; not used. */ Window window; /* Not used. */ { if (button != NULL) { printf("Can't create the button: it exists already.\n"); return; } button = Sx_ButtonCreate(w, 100, 200, 0, 0, 1, "Click on me", fontPtr, foreground, background, ButtonProc, (ClientData) NULL); } /* * Callback procedure invoked whenever the "Change Text" menu entry is invoked. */ void ChangeTextProc(clientData, index, window) ClientData clientData; /* Not used. */ int index; /* Not used. */ Window window; /* Not used. */ { if (button == NULL) { printf("Create the button before changing its text.\n"); return; } Sx_ButtonMake(button, "New text", fontPtr, foreground, background, ButtonProc, (ClientData) NULL); } /* * Callback procedure invoked whenever the "Delete Button" menu entry * is invoked. */ void DeleteButtonProc(clientData, index, window) ClientData clientData; /* Not used. */ int index; /* Not used. */ Window window; /* Not used. */ { if (button == NULL) { printf("Can't delete the button: it doesn't exist.\n"); return; } XDestroyWindow(button); button = NULL; } /* * Callback procedure invoked whenever the "Make new button menu" menu entry * is invoked. */ void NewButtonMenuProc(clientData, index, window) ClientData clientData; /* Not used. */ int index; /* Not used. */ Window window; /* Not used. */ { if (buttonsMenu2 != NULL) { printf("You've already got a second buttons menu. Delete it\n"); printf("before making a new one.\n"); return; } buttonsMenu2 = Sx_MenuCreate(menuBar, "2nd Buttons", 3, buttons, fontPtr, foreground, background); } /* * Callback procedure invoked whenever the "Delete newest button menu" * menu entry is invoked. */ void DeleteButtonMenuProc(clientData, index, window) ClientData clientData; /* Not used. */ int index; /* Not used. */ Window window; /* Not used. */ { if (buttonsMenu2 == NULL) { printf("Create a new buttons menu before trying to delete.\n"); return; } XDestroyWindow(buttonsMenu2); buttonsMenu2 = NULL; } /* * Callback procedure invoked by several different menu entries to * enable or disable menu entries. */ void EnableMaskProc(clientData, index, window) ClientData clientData; /* New mask. */ int index; /* Not used. */ Window window; /* Not used. */ { int mask; /* * The clientData value here is actually the new mask for the * "Menus" menu. By passing different clientData values in, * the same procedure can handle several different menu entries. */ mask = (int) clientData; (void) Sx_MenuSetMask(menusMenu, mask); } /* * Callback procedure invoked whenever the "Test Notifier 1" * menu entry is invoked. */ void Notifier1Proc(clientData, index, window) ClientData clientData; /* Not used. */ int index; /* Not used. */ Window window; /* Not used. */ { static char *message = "This notifier is centered in the root window. \ Notice that it grabs the server, so you can't do anything else until \ you select an option. Notice also how the Sx package automatically \ chopped one long string up into left-justified lines for display in the \ window."; (void) Sx_Notify(RootWindow, -1, -1, 0, message, fontPtr, FALSE, "OK", NULL); } /* * Callback procedure invoked whenever the "Test Notifier 2" * menu entry is invoked. */ void Notifier2Proc(clientData, index, window) ClientData clientData; /* Not used. */ int index; /* Not used. */ Window window; /* Not used. */ { static char *message = "This notifier was centered in the sxDemo window, \ but still grabs the server.\n\n\It uses center justification \ for the text."; int result; result = Sx_Notify(w, -1, -1, 0, message, fontPtr, TRUE, "She loves me", "She loves me not", NULL); if (result == 0) { printf("You selected the \"she loves me\" option.\n"); } else { printf("You selected the \"she loves me not\" option.\n"); } } /* * Callback procedure invoked whenever the "Quit" * menu entry is invoked. */ void QuitProc(clientData, index, window) ClientData clientData; /* Not used. */ int index; /* Not used. */ Window window; /* Not used. */ { exit(0); } /* * Callback procedure invoked whenever the user requests scrolling by * clicking over one of the scrollbars. */ void ScrollProc(clientData, distance, units, window) ClientData clientData; /* Not used. */ float distance; /* Amount of motion. */ int units; /* SX_SCROLL_ABSOLUTE or SX_SCROLL_PAGES. */ Window window; /* Scrollbar window. */ { char *direction; if (window == vertScrollbar) { direction = "vertical"; } else { direction = "horizontal"; } printf("You just requested %s scrolling", direction); if (units == SX_SCROLL_ABSOLUTE) { printf(" to center position %.2f in the view.\n", distance); distance -= .1; } else { float top, bottom; printf(" by %.2f pages.\n", distance); Sx_ScrollbarGetRange(window, &top, &bottom); distance = (distance * .2) + top; } printf("I can't actually scroll the window, but I will "); printf("update the scrollbar display.\n"); if (distance < 0) { distance = 0.0; } if (distance > .8) { distance = .8; } Sx_ScrollbarSetRange(window, distance, distance + .2); } /* * Callback procedure that is invoked whenever the window needs to * be redrawn. It just displays some help text. */ void RedisplayProc(clientData, eventPtr) ClientData clientData; /* Not used. */ XEvent *eventPtr; /* ExposeWindow event; not used. */ { static char *(msgs[]) = { "To try out the Sx features:", "(a) press a mouse button over a menu name (above)", " and select a menu entry, or", "(b) click a button over a scrollbar, or", "(c) resize the window (the packer will re-size", " subwindows).", "Information messages will appear on standard", "output (not in this window).", NULL }; char **stringPtr; int y; for (y = 50, stringPtr = msgs; *stringPtr != NULL; stringPtr++, y += fontPtr->height + 1) { XText(w, 5, y, *stringPtr, strlen(*stringPtr), fontPtr->id, foreground, background); } }