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 )