/* %Z%%M% %I% %E% */

/*
 * Copyright (c) 1994, 1995 by Wayne C. Gramlich.
 * All rights reserved.
 *
 * Permission to use, copy, modify, distribute, and sell this software
 * for any purpose is hereby granted without fee provided that the above
 * copyright notice and this permission are retained.  The author makes
 * no representations about the suitability of this software for any purpose.
 * It is provided "as is" without express or implied warranty.
 */

/*
 * This file provide a bunch of interface routines for creating and
 * manipulating input masks.
 */

#ifndef XLIB_H
#include "xlib.h"
#endif

extern unsigned xlib_input_bit__key_press;
extern unsigned xlib_input_bit__key_release;
extern unsigned xlib_input_bit__button_press;
extern unsigned xlib_input_bit__button_release;
extern unsigned xlib_input_bit__enter_window;
extern unsigned xlib_input_bit__leave_window;
extern unsigned xlib_input_bit__pointer_motion;
extern unsigned xlib_input_bit__pointer_motion_hint;
extern unsigned xlib_input_bit__button1_motion;
extern unsigned xlib_input_bit__button2_motion;
extern unsigned xlib_input_bit__button3_motion;
extern unsigned xlib_input_bit__button4_motion;
extern unsigned xlib_input_bit__button5_motion;
extern unsigned xlib_input_bit__button_motion;
extern unsigned xlib_input_bit__keymap_state;
extern unsigned xlib_input_bit__exposure;
extern unsigned xlib_input_bit__visibility_change;
extern unsigned xlib_input_bit__structure_notify;
extern unsigned xlib_input_bit__resize_redirect;
extern unsigned xlib_input_bit__substructure_notify;
extern unsigned xlib_input_bit__substructure_redirect;
extern unsigned xlib_input_bit__focus_change;
extern unsigned xlib_input_bit__property_change;
extern unsigned xlib_input_bit__colormap_change;
extern unsigned xlib_input_bit__owner_grab_button;


/* The initial object: */
Xlib_input_mask_struct xlib_input_mask___initial_object = {
    0
};
Xlib_input_mask xlib_input_mask___initial = &xlib_input_mask___initial_object;

/*
 * xlib_input_mask___bit_to_mask(input_bit)
 *	This routine will return the mask associated with {input_bit}.
 */
unsigned
xlib_input_mask___bit_to_mask(
    unsigned input_bit)
{
    if (input_bit == xlib_input_bit__key_press) {
	return KeyPressMask;
    } else if (input_bit == xlib_input_bit__key_release) {
	return KeyReleaseMask;
    } else if (input_bit == xlib_input_bit__button_press) {
	return ButtonPressMask;
    } else if (input_bit == xlib_input_bit__button_release) {
	return ButtonReleaseMask;
    } else if (input_bit == xlib_input_bit__enter_window) {
	return EnterWindowMask;
    } else if (input_bit == xlib_input_bit__leave_window) {
	return LeaveWindowMask;
    } else if (input_bit == xlib_input_bit__pointer_motion) {
	return PointerMotionMask;
    } else if (input_bit == xlib_input_bit__pointer_motion_hint) {
	return PointerMotionHintMask;
    } else if (input_bit == xlib_input_bit__button1_motion) {
	return Button1MotionMask;
    } else if (input_bit == xlib_input_bit__button2_motion) {
	return Button2MotionMask;
    } else if (input_bit == xlib_input_bit__button3_motion) {
	return Button3MotionMask;
    } else if (input_bit == xlib_input_bit__button4_motion) {
	return Button4MotionMask;
    } else if (input_bit == xlib_input_bit__button5_motion) {
	return Button5MotionMask;
    } else if (input_bit == xlib_input_bit__button_motion) {
	return ButtonMotionMask;
    } else if (input_bit == xlib_input_bit__keymap_state) {
	return KeymapStateMask;
    } else if (input_bit == xlib_input_bit__exposure) {
	return ExposureMask;
    } else if (input_bit == xlib_input_bit__visibility_change) {
	return VisibilityChangeMask;
    } else if (input_bit == xlib_input_bit__structure_notify) {
	return StructureNotifyMask;
    } else if (input_bit == xlib_input_bit__resize_redirect) {
	return ResizeRedirectMask;
    } else if (input_bit == xlib_input_bit__substructure_notify) {
	return SubstructureNotifyMask;
    } else if (input_bit == xlib_input_bit__substructure_redirect) {
	return SubstructureRedirectMask;
    } else if (input_bit == xlib_input_bit__focus_change) {
	return FocusChangeMask;
    } else if (input_bit == xlib_input_bit__property_change) {
	return PropertyChangeMask;
    } else if (input_bit == xlib_input_bit__colormap_change) {
	return ColormapChangeMask;
    } else if (input_bit == xlib_input_bit__owner_grab_button) {
	return OwnerGrabButtonMask;
    }
    assert(0);
    return 0;
}

/*
 * xlib_input_mask__address_get(xlib_input_mask)
 *	This routine will return the address of {input_mask}.
 */
unsigned
xlib_input_mask__address_get(
    Xlib_input_mask xlib_input_mask)
{
    return (unsigned)xlib_input_mask;
}

/*
 * xlib_input_mask__clear(input_mask, input_bit)
 *	This will clear {input_bit} in {input_mask{
 */
void
xlib_input_mask__clear(
    Xlib_input_mask input_mask,
    Xlib_input_bit input_bit)
{
    input_mask->mask &= ~xlib_input_mask___bit_to_mask(input_bit);
}

/*
 * xlib_input_mask__create()
 *	This routine will create and return a new {xlib_input_mask} object.
 */
Xlib_input_mask
xlib_input_mask__create(void)
{
    Xlib_input_mask xlib_input_mask;

    xlib_input_mask =
      (Xlib_input_mask)malloc(sizeof(*xlib_input_mask));
    xlib_input_mask->mask = 0;
    return xlib_input_mask;
}

/*
 * xlib_input_mask__erase(input_mask)
 *	This will erase the contents of {input_mask{.
 */
void
xlib_input_mask__erase(
    Xlib_input_mask input_mask)
{
    input_mask->mask = 0;
}

/*
 * xlib_input_mask__external__initialize()
 *	This routine will "initialize" the {xlib_input_mask} external
 *	code.
 */
void
xlib_input_mask__external__initialize(void)
{
    /* Do nothing! */
}

/*
 * xlib_input_mask__print(input_mask, out_stream)
 *	This routine will output {input_mask} to {out_stream}.
 */
void
xlib_input_mask__print(
    Xlib_input_mask input_mask,
    Out_stream out_stream)
{
    extern void unsigned__print(unsigned, Out_stream);

    unsigned__print(input_mask->mask, out_stream);
}

/*
 * xlib_input_mask__set(input_mask, input_bit)
 *	This will set {input_bit} in {input_mask{
 */
void
xlib_input_mask__set(
    Xlib_input_mask input_mask,
    Xlib_input_bit input_bit)
{
    input_mask->mask |= xlib_input_mask___bit_to_mask(input_bit);
}


