siemens-rtl/rtlmenu.c
2023-07-11 14:40:13 +02:00

352 lines
7.2 KiB
C
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#ifndef lint
static char sccs_id[] = "%W% %H%";
#endif
/*
* Copyright 1988 by Siemens Research and Technology Laboratories, Princeton, NJ
*
* All Rights Reserved
*
* 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 and that
* both that copyright notice and this permission notice appear in
* supporting documentation, and that the name of Siemens Research and Technology
* Laboratories not be used in advertising or publicity pertaining to
* distribution of the software without specific, written prior permission.
*
*
* SIEMENS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
* ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
* SIEMENS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
* ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
* WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
* ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
* SOFTWARE.
*/
#include "copyright.h"
/*
RTL Menu Package Version 1.2
by Joe Camaratta and Mike Berman, Siemens RTL, Princeton NJ, 1988
rtlmenu.c: interface level for menu package
*/
#include <stdio.h>
#include <X11/Xlib.h>
#include "rtlmenuP.h"
static Display *dpy;
static int scrn;
static RTLPoint menu_pos;
static int initialized = 0;
extern bool SetItemText();
extern void InitMenu();
extern void DisposeMenu();
extern RTLMenu NewMenu();
extern RTLMenuItem MenuItemByName();
extern RTLMenuItem AddMenuItem();
extern RTLMenuItem MenuItemByData();
extern RTLMenuItem TrackMenu();
void
RTLMenu_Initialize (display, screen, options_mask)
Display *display;
int screen;
RTLMenuOptionsMask options_mask;
{
if (initialized) return;
dpy = display;
scrn = screen;
initialized = 1;
InitMenu ("rtl", options_mask, display);
}
RTLMenu
RTLMenu_Create()
{
return (RTLMenu) NewMenu (dpy, scrn, FALSE);
}
void
RTLMenu_Destroy( menu )
RTLMenu menu;
{
DisposeMenu (menu);
}
generic
RTLMenu_Data( item )
RTLMenuItem item;
{
return ItemData(item);
}
RTLMenu
RTLMenu_Get_Submenu( menu, str )
RTLMenu menu;
char *str;
{
RTLMenuItem item = MenuItemByName (menu, str);
if (!ItemIsNull(item))
return (RTLMenu) ItemSubmenu(item);
else
return (RTLMenu)NULLMENU;
}
static void
RTLMenu_Client_Send( item )
RTLMenuItem item;
{
printf ("RTLMenu_Client_Send not yet implemented for X, string = \"%s\"\n",
(char *) item);
}
RTLMenuItem
RTLMenu_Append_String( menu, str, strval )
RTLMenu menu;
char *str;
generic strval;
{
RTLMenuItem item = AddMenuItem(menu);
if (!ItemIsNull(item))
{
SetItemText(menu,item,str);
ItemCallback(item) = (Callback)RTLMenu_Client_Send;
ItemData(item) = strval;
}
return (RTLMenuItem)item;
}
RTLMenuItem
RTLMenu_Append_Callback( menu, backproc )
RTLMenu menu;
VoidFunc backproc;
{
RTLMenuItem item = AddMenuItem(menu);
if (!ItemIsNull(item))
{
ItemGenerator(item) = (Callback)backproc;
}
return (RTLMenuItem)item;
}
RTLMenuItem
RTLMenu_Append_Call( menu, str, proc, data )
RTLMenu menu;
char *str;
VoidFunc proc;
generic data;
{
RTLMenuItem item = AddMenuItem(menu);
if (!ItemIsNull(item))
{
if (SetItemText(menu, item, str) == FALSE)
return NULLITEM;
ItemCallback(item) = proc;
ItemData(item) = data;
}
return (RTLMenuItem)item;
}
RTLMenuItem
RTLMenu_Append_Checkback( menu, str, checkproc, proc, data )
RTLMenu menu;
char *str; /* Menu string */
BoolFunc checkproc; /* Boolean function called when menu entry
is about to be displayed. If true, then
the item appears checked; else no check */
VoidFunc proc; /* function to be called when the item selected */
generic data; /* data associated with this item */
{
RTLMenuItem item = AddMenuItem(menu);
if (!ItemIsNull(item))
{
if (SetItemText(menu, item, str) == FALSE)
return(NULLITEM);
ItemCallback(item) = proc;
ItemData(item) = data;
ItemCheckproc(item) = checkproc;
}
return (RTLMenuItem)item;
}
RTLMenuItem
RTLMenu_Append_Submenu( menu, str, submenu )
RTLMenu menu;
char *str;
RTLMenu submenu;
{
RTLMenuItem item = AddMenuItem(menu);
if (!ItemIsNull(item))
{
if (SetItemText(menu, item, str) == FALSE)
return(NULLITEM);
SetItemSubmenu(item, submenu);
}
return (RTLMenuItem)item;
}
void
RTLMenu_Replace_Data_By_String( menu, data, str )
RTLMenu menu;
generic data;
char *str;
{
RTLMenuItem item = MenuItemByName(menu, str);
if (!ItemIsNull(item))
ItemData(item) = data;
}
void
RTLMenu_Activate_Entry( menu, item )
RTLMenu menu;
RTLMenuItem item;
{
(void)SetItemDisable(menu, item, FALSE);
}
void
RTLMenu_Inactivate_Entry( menu, item )
RTLMenu menu;
RTLMenuItem item;
{
(void)SetItemDisable(menu, item, TRUE);
}
bool
RTLMenu_Has_Data( menu, val )
RTLMenu menu;
generic val;
{
RTLMenuItem item = MenuItemByData(menu, val);
return (!ItemIsNull(item));
}
void
RTLMenu_Delete_Entries( menu )
RTLMenu menu;
{
while (DisposeItem(menu, MenuItems(menu)));
}
void
RTLMenu_Delete_String( menu, str )
RTLMenu menu;
char *str;
{
RTLMenuItem item = MenuItemByName(menu, str);
if (!ItemIsNull(item))
(void) DisposeItem (menu, item);
}
void
RTLMenu_Delete_Data( menu, val )
RTLMenu menu;
generic val;
{
RTLMenuItem item = MenuItemByData(menu, val);
if (!ItemIsNull(item))
(void) DisposeItem(menu, item);
}
void
RTLMenu_Enter( menu, butnum, buttime, base_window, pos )
RTLMenu menu;
unsigned int butnum;
Time buttime;
Window base_window;
RTLPoint pos;
{
RTLMenuItem selected;
menu_pos = pos;
if (TestOptionFlag(menu, savebits))
XGrabServer(dpy);
selected = TrackMenu (menu, menu_pos.x, menu_pos.y,
(int)butnum, base_window, buttime);
if (TestOptionFlag(menu, savebits))
XUngrabServer(dpy);
if (!ItemIsNull(selected))
(ItemCallback(selected)) (menu, selected);
}
RTLPoint
RTLMenu_Entry_Pos()
{
/* menu_pos is a global static that gets set by the call to */
/* XQueryPointer that is used by the TrackMenu call. */
return menu_pos;
}
void
RTLMenu_Generate_Items(menu, proc)
/* apply VoidFunc proc to each item in the menu, with */
/* arguments menu and menuItem */
RTLMenu menu;
VoidFunc proc;
{
RTLMenuItem item;
for (item = MenuItems(menu);
!ItemIsNull(item); item = ItemNext(item))
{
(proc)(menu, item);
}
return;
}
RTLMenuItem
RTLMenu_Append_Item(menu)
RTLMenu menu;
{
return (RTLMenuItem)AddMenuItem(menu);
}
void
RTLMenu_Set_String(menu, item, menu_str)
RTLMenu menu;
RTLMenuItem item;
char *menu_str;
{
if (!ItemIsNull(item))
(void) SetItemText(menu, item, menu_str);
}
void
RTLMenu_Set_Generator(item, generator)
RTLMenuItem item;
VoidFunc generator;
{
if (!ItemIsNull(item))
ItemGenerator(item) = generator;
}
void
RTLMenu_Set_Data(item, data)
RTLMenuItem item;
generic data;
{
if (!ItemIsNull(item))
ItemData(item) = data;
}