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")));
}
}
|