1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
|
void wxEvtHandler_Connect(WxeApp *app, wxeMemEnv *memenv, wxeCommand& Ecmd)
{
ErlNifEnv *env = Ecmd.env;
ERL_NIF_TERM * argv = Ecmd.args;
int winid;
int lastid;
int skip;
wxeErlTerm * userData;
int fun_cb;
wxEvtHandler *This = (wxEvtHandler *) memenv->getPtr(env, argv[0], "This");
if(!enif_get_int(env, argv[1], &winid)) Badarg("Winid");
if(!enif_get_int(env, argv[2], &lastid)) Badarg("LastId");
skip = enif_is_identical(argv[3], WXE_ATOM_true);
userData = new wxeErlTerm(argv[4]);
if(!enif_get_int(env, argv[5], &fun_cb)) Badarg("FunId");
if(!enif_is_atom(env, argv[6])) Badarg("EvType");
int eventType = wxeEventTypeFromAtom(argv[6]);
if(!enif_is_atom(env, argv[7])) Badarg("ClassName");
wxeReturn rt = wxeReturn(memenv, Ecmd.caller, true);
if(eventType > 0 ) {
wxeEvtListener * Evt_cb = new wxeEvtListener(Ecmd.caller,app->getRef(This, memenv),
argv[7], fun_cb, skip, userData, memenv->me_ref);
This->Connect(winid, lastid, eventType,
(wxObjectEventFunction)(wxEventFunction) &wxeEvtListener::forward,
Evt_cb, Evt_cb);
rt.send(enif_make_tuple2(rt.env, WXE_ATOM_ok,
rt.make_ref(app->getRef((void *)Evt_cb,memenv),
"wxeEvtListener")));
} else {
rt.send(enif_make_tuple2(rt.env, WXE_ATOM_badarg, rt.make_atom("event_type")));
}
}
void wxEvtHandler_Disconnect_2(WxeApp *app, wxeMemEnv *memenv, wxeCommand& Ecmd)
{
ErlNifEnv *env = Ecmd.env;
ERL_NIF_TERM * argv = Ecmd.args;
int winid;
int lastid;
wxeEvtListener *Listener = (wxeEvtListener *) memenv->getPtr(env, argv[0], "Listener");
wxEvtHandler *This = (wxEvtHandler *) memenv->getPtr(env, argv[1],"This");
if(!enif_get_int(env, argv[2], &winid)) Badarg("Winid");
if(!enif_get_int(env, argv[3], &lastid)) Badarg("LastId");
if(!enif_is_atom(env, argv[4])) Badarg("EvType");
int eventType = wxeEventTypeFromAtom(argv[4]);
wxeReturn rt = wxeReturn(memenv, Ecmd.caller, true);
if(eventType > 0) {
if(app->recurse_level > 1) {
Ecmd.op = 101;
app->delayed_delete->Append(&Ecmd);
} else {
bool Result = This->Disconnect(winid,lastid,eventType,
(wxObjectEventFunction)(wxEventFunction)
&wxeEvtListener::forward,
NULL, Listener);
rt.send(rt.make_bool(Result));
}
} else {
rt.send(enif_make_tuple2(rt.env, WXE_ATOM_badarg, rt.make_atom("event_type")));
}
}
|