Prima

 view release on metacpan or  search on metacpan

class/Widget/events.c  view on Meta::CPAN

#include "apricot.h"
#include "guts.h"
#include "Application.h"
#include "Popup.h"
#include "Widget.h"

#ifdef __cplusplus
extern "C" {
#endif

#undef  my
#define inherited CDrawable

#define enter_method PWidget_vmt selfvmt = ((( PWidget) self)-> self)
#define my  selfvmt
#define var (( PWidget) self)

#define evOK ( var-> evStack[ var-> evPtr - 1])
#define objCheck if ( var-> stage > csNormal) return

extern Bool Widget_size_notify( Handle self, Handle child, const Rect* metrix);
extern Bool Widget_move_notify( Handle self, Handle child, Point * moveTo);
extern void Widget_pack_slaves( Handle self);
extern void Widget_place_slaves( Handle self);


static Bool
dnd_event_wanted(Handle self, PEvent event)
{
	Bool r;
	SV * ret;
	if ( var-> dndAware == NULL) return false;
	if ( strcmp(var->dndAware, "1") == 0) return true;
	ENTER;
	SAVETMPS;
	ret = call_perl( event->dnd.clipboard, "has_format", "<s", var->dndAware);
	r = ret ? SvTRUE( ret) : false;
	FREETMPS;
	LEAVE;
	return r;
}

static void
handle_drag_begin( Handle self, PEvent event)
{
	enter_method;
	if ( !dnd_event_wanted(self, event)) {
		opt_clear(optDropSession);
		return;
	}
	opt_set(optDropSession);
	my-> notify( self, "<sHiiPH", "DragBegin",
		event-> dnd. clipboard,
		event-> dnd. action,
		event-> dnd. modmap,
		event-> dnd. where,
		event-> dnd. counterpart
	);
}

static void
handle_drag_over( Handle self, PEvent event)
{
	dPROFILE;
	enter_method;
	HV * profile;
	SV * ref;

	if ( !is_opt(optDropSession)) {
		Point size = apc_widget_get_size(self);
		event-> dnd.allow      = 0;
		event-> dnd.pad.x      = event-> dnd.pad.y = 0;
		event-> dnd.pad.width  = size.x;
		event-> dnd.pad.height = size.y;
		return;
	}

	profile = newHV();
	ref = newRV_noinc((SV*) profile);

	pset_i(allow,1);
	pset_i(action,dndCopy);
	my-> notify( self, "<sHiiPHS", "DragOver",
		event-> dnd. clipboard,
		event-> dnd. action,
		event-> dnd. modmap,
		event-> dnd. where,
		event-> dnd. counterpart,
		ref
	);

	event-> dnd. allow  = pexist(allow)  ? pget_i(allow)  : 1;
	event-> dnd. action = pexist(action) ? pget_i(action) : dndCopy;
	memset( &event-> dnd.pad, 0, sizeof(Rect));
	if ( pexist(pad)) {
		int rect[4];
		prima_read_point( pget_sv(pad), rect, 4, "Array panic on 'pad'");
		event->dnd.pad.x      = rect[0];
		event->dnd.pad.y      = rect[1];
		event->dnd.pad.width  = rect[2];
		event->dnd.pad.height = rect[3];
	}

	sv_free(ref);
}

static void
handle_drag_end( Handle self, PEvent event)
{
	dPROFILE;
	enter_method;
	HV * profile;
	SV * ref;

	if ( !is_opt(optDropSession)) {
		event-> dnd. allow = 0;
		return;
	}
	opt_clear(optDropSession);

	profile = newHV();
	ref = newRV_noinc((SV*) profile);

	pset_i(allow, 1);
	pset_i(action, event->dnd.action);
	my-> notify( self, "<sHiiPHS", "DragEnd", 
		event-> dnd. allow ? event-> dnd.clipboard : NULL_HANDLE, 
		event-> dnd. action,
		event-> dnd. modmap,
		event-> dnd. where,
		event-> dnd. counterpart,
		ref
	);
	event-> dnd. allow  = pexist(allow)  ? pget_i(allow)  : 1;
	event-> dnd. action = pexist(action) ? pget_i(action) : dndCopy;

	sv_free(ref);
}

static void
handle_drag_query( Handle self, PEvent event)
{
	dPROFILE;
	enter_method;
	HV * profile = newHV();
	SV * ref = newRV_noinc((SV*) profile);
	pset_i(allow, event->dnd.allow);
	my-> notify( self, "<siHS", "DragQuery", event->dnd.modmap, event->dnd.counterpart, ref);
	if (pexist(allow))
		event-> dnd.allow = pget_i(allow);
	event-> dnd.action = pexist(action) ? pget_i(action) : 0;
	sv_free(ref);
}

static void
handle_key_down( Handle self, PEvent event)
{
	enter_method;
	int i;
	int rep = event-> key. repeat;
	Handle next = NULL_HANDLE;
	if ( is_opt( optBriefKeys))
		rep = 1;
	else
		event-> key. repeat = 1;
	for ( i = 0; i < rep; i++) {
		my-> notify( self, "<siiii", "KeyDown",
			event-> key.code, event-> key. key, event-> key. mod, event-> key. repeat);
		objCheck;
		if ( evOK) {
			Event ev = *event;
			ev. key. source = self;
			ev. cmd         = var-> owner ? cmDelegateKey : cmTranslateAccel;
			ev. key. subcmd = 0;
			if ( !my-> message( self, &ev)) {
				my-> clear_event( self);
				return;
			}
			objCheck;
		}
		if ( !evOK) break;

		switch( event-> key. key) {
		case kbF1:
		case kbHelp:
			my-> help( self);
			my-> clear_event( self);



( run in 1.001 second using v1.01-cache-2.11-cpan-2398b32b56e )