/*
    ####             #    #     # #
    #   #            #    #       #          The FreeWare C library for 
    #   #  ##   ###  #  # #     # ###             RISC OS machines
    #   # #  # #     # #  #     # #  #   ___________________________________
    #   # ####  ###  ##   #     # #  #                                      
    #   # #        # # #  #     # #  #    Please refer to the accompanying
    ####   ### ####  #  # ##### # ###    documentation for conditions of use
    ________________________________________________________________________

    File:    Menu2.Attach.c
    Author:  Copyright  1995 Julian Smith
    Version: 1.00 (22 Jun 1995)
    Purpose: Attaching menus to icons/windows.
*/


#include "Desk.Event.h"
#include "Desk.Menu2.h"



static Desk_bool	Desk_Menu2__OpenFromClick( 
	Desk_event_pollblock	*event, 
	Desk_menu2_handle	menu, 
	int		button
	)
{
if ( event->data.mouse.button.value != button)	return Desk_bool_FALSE;

Desk_Menu2_Open( 
	menu, 
	event->data.mouse.pos.x, 
	(event->data.mouse.window < 0) ? -1 : event->data.mouse.pos.y
	);
return Desk_bool_TRUE;
}



Desk_SDLS_PtrFn( 
	static, 
	Desk_bool, 
	Desk_Menu2__SelectClickHandler( Desk_event_pollblock *event, void *reference)
	)
/*static Desk_bool	Desk_Menu2__SelectClickHandler( Desk_event_pollblock *event, void *reference)*/
{
return Desk_Menu2__OpenFromClick( event, (Desk_menu2_handle) reference, Desk_button_SELECT);
}


Desk_SDLS_PtrFn( 
	static, 
	Desk_bool, 
	Desk_Menu2__AdjustClickHandler( Desk_event_pollblock *event, void *reference)
	)
/*static Desk_bool	Desk_Menu2__AdjustClickHandler( Desk_event_pollblock *event, void *reference)*/
{
return Desk_Menu2__OpenFromClick( event, (Desk_menu2_handle) reference, Desk_button_ADJUST);
}



Desk_SDLS_PtrFn( 
	static, 
	Desk_bool, 
	Desk_Menu2__MenuClickHandler( Desk_event_pollblock *event, void *reference)
	)
/*static Desk_bool	Desk_Menu2__MenuClickHandler( Desk_event_pollblock *event, void *reference)*/
{
return Desk_Menu2__OpenFromClick( event, (Desk_menu2_handle) reference, Desk_button_MENU);
}



static void	Desk_Menu2__AttachOrReleaseMenu(
	Desk_window_handle		window, 
	Desk_icon_handle		icon, 
	Desk_menu2_handle		menu, 
	int			button,
	Desk_event_claimorreleasefn	fn
	)
{
if ( button & Desk_button_MENU)
	fn( Desk_event_CLICK, window, icon, Desk_SDLS_dllEntry( Desk_Menu2__MenuClickHandler),   (void *) menu );

if ( button & Desk_button_SELECT)
	fn( Desk_event_CLICK, window, icon, Desk_SDLS_dllEntry( Desk_Menu2__SelectClickHandler), (void *) menu);

if ( button & Desk_button_ADJUST)
	fn( Desk_event_CLICK, window, icon, Desk_SDLS_dllEntry( Desk_Menu2__AdjustClickHandler), (void *) menu);
}




void	Desk_Menu2_AttachMenu( 
	Desk_window_handle	window, 
	Desk_icon_handle	icon, 
	Desk_menu2_handle	menu, 
	int		button
	)
{
Desk_Menu2__AttachOrReleaseMenu( window, icon, menu, button, Desk_Event_Claim);
}



void	Desk_Menu2_DetachMenu( 
	Desk_window_handle	window, 
	Desk_icon_handle	icon, 
	Desk_menu2_handle	menu, 
	int		button
	)
{
Desk_Menu2__AttachOrReleaseMenu( window, icon, menu, button, Desk_Event_Release);
}
