|
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 m
Length: 3990 (0xf96) Types: TextFile Names: »menu.c«
└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987 └─⟦this⟧ »EUUGD18/Sun/Sdi/menu.c«
#include <suntool/sunview.h> #include <stdio.h> #include "walkmenu_impl.h" #include "image_impl.h" #define MAX_ITEMS 32 /* * Copyright 1987 by Mark Weiser. * Permission to reproduce and use in any manner whatsoever on Suns is granted * so long as this copyright and other identifying marks of authorship * in the code and the game remain intact and visible. Use of this code * in other products is reserved to me--I'm working on Mac and IBM versions. */ /* * Pie menu code -- patent applied for. */ /* * The front-end routines to make pie-menus look like the normal * Sun window library (at least a little bit). */ void pie_menu_set(m, arg) struct menu *m; int arg; { char **argptr = &(char *)arg; pie_menu_set_internal(m, argptr); } pie_menu_item_set(mi, arg) struct menu_item *mi; int arg; { char **argptr = &(char *)arg; pie_menu_item_set_internal(mi, argptr); } struct menu * pie_menu_create(arg) int arg; { char **argptr = &(char *)arg; struct menu *m; m = (struct menu *)calloc(sizeof(struct menu),1); m->item_list = (struct menu_item **)calloc(sizeof(struct menu_item *), MAX_ITEMS); m->max_nitems = MAX_ITEMS; pie_menu_set_internal(m, argptr); return m; } struct menu_item * pie_menu_create_item(arg) int arg; { char **argptr = &(char *)arg; struct menu_item *mi; mi = (struct menu_item *)calloc(sizeof(struct menu_item),1); mi->image = (struct image *)calloc(sizeof(struct image),1); pie_menu_item_set_internal(mi, argptr); return mi; } pie_menu_set_internal(m, argptr) struct menu *m; char **argptr; { while (*argptr != 0) { switch(*argptr) { case MENU_APPEND_ITEM: { if (m->nitems >= (m->max_nitems-1)) { fprintf("Too many items in a pie menu.\n"); abort(); } m->item_list[m->nitems] = (struct menu_item *)(*(argptr+1)); ((struct menu_item *)m->item_list[m->nitems])->parent = m; m->nitems += 1; argptr += 2; break; } case MENU_NOTIFY_PROC: { (caddr_t)m->notify_proc = (caddr_t)(*(argptr+1)); argptr += 2; break; } default: { fprintf(stderr, "Unexpected item in pie_menu_set_internal.\n"); abort(); break; } } } } pie_menu_item_set_internal(mi, argptr) struct menu_item *mi; char **argptr; { while (*argptr != 0) { switch(*argptr) { case MENU_IMAGE: { mi->image->pr = (struct pixrect *)*(argptr+1); argptr += 2; break; } case MENU_STRING: { mi->image->string = (char *)*(argptr+1); argptr += 2; break; } case MENU_PULLRIGHT: { mi->pullright = TRUE; mi->value = (caddr_t)*(argptr+1); ((struct menu *)mi->value)->parent = mi; argptr += 2; break; } case MENU_RELEASE: { mi->free_item = TRUE; argptr += 1; break; } case MENU_RELEASE_IMAGE: { mi->image->free_image = TRUE; argptr += 1; break; } case MENU_CLIENT_DATA: { mi->client_data = (caddr_t)*(argptr+1); argptr += 2; break; } default: { fprintf(stderr, "Unexpected item in pie_menu_item_set_internal.\n"); abort(); break; } } } } pie_menu_destroy(m) struct menu *m; { int i; if (m == NULL) return; for (i=0; i<m->nitems; i++) { if (m->item_list[i]->free_item) { free(m->item_list[i]->image); free(m->item_list[i]); } } free(m->item_list); free(m); } caddr_t pie_menu_get(m, arg) struct menu *m; Menu_attribute arg; { switch(arg) { case MENU_CLIENT_DATA: { return (caddr_t) m->client_data; break; } default: { fprintf(stderr, "Unexpected item in pie_menu_get.\n"); abort(); break; } } } caddr_t pie_menu_item_get(mi, arg) struct menu_item *mi; Menu_attribute arg; { switch(arg) { case MENU_CLIENT_DATA: { return (caddr_t) mi->client_data; break; } default: { fprintf(stderr, "Unexpected item in pie_menu_item_get.\n"); abort(); break; } } } caddr_t pie_menu_show(m, w, e, f, s) struct menu *m; Window w; Event *e; int (*f)(); char *s; { struct menu_item *rval; rval = (struct menu_item *)menu_track(m, w, e, f, s); }