summaryrefslogtreecommitdiff
path: root/lib/wx/api_gen/wx_extra/wxEvtHandler.c_src
blob: 81cb5d8416c689f1c6e6b6a3aed94dd8ac073a3b (plain)
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")));
  }

}