32 #include "gwensignal_p.h"
33 #include <gwenhywfar/misc.h>
34 #include <gwenhywfar/debug.h>
35 #include <gwenhywfar/inherit.h>
50 so->signalList=GWEN_Signal_List2_new();
51 so->slotList=GWEN_Slot_List2_new();
78 GWEN_SIGNAL_LIST2_ITERATOR *sit;
83 sit=GWEN_Signal_List2_First(so->signalList);
87 sig=GWEN_Signal_List2Iterator_Data(sit);
94 if (strcasecmp(s, name)==0 &&
95 (typeId1==0 || typeId1==sig->typeOfArg1) &&
96 (typeId2==0 || typeId2==sig->typeOfArg2)) {
97 GWEN_Signal_List2Iterator_free(sit);
100 sig=GWEN_Signal_List2Iterator_Next(sit);
102 GWEN_Signal_List2Iterator_free(sit);
112 const char *typeOfArg1,
113 const char *typeOfArg2) {
130 GWEN_SLOT_LIST2_ITERATOR *sit;
135 sit=GWEN_Slot_List2_First(so->slotList);
139 slot=GWEN_Slot_List2Iterator_Data(sit);
146 if (strcasecmp(s, name)==0 &&
147 (typeId1==0 || typeId1==slot->typeOfArg1) &&
148 (typeId2==0 || typeId2==slot->typeOfArg2)) {
149 GWEN_Slot_List2Iterator_free(sit);
152 slot=GWEN_Slot_List2Iterator_Next(sit);
154 GWEN_Slot_List2Iterator_free(sit);
164 const char *typeOfArg1,
165 const char *typeOfArg2) {
183 "Signal \"%s\" already exists",
188 sig->signalObject=so;
189 GWEN_Signal_List2_PushBack(so->signalList, sig);
201 "Slot \"%s\" already exists",
205 slot->signalObject=so;
206 GWEN_Slot_List2_PushBack(so->slotList, slot);
214 const char *derivedType) {
216 GWEN_SLOT_LIST2_ITERATOR *slotIt;
217 GWEN_SIGNAL_LIST2_ITERATOR *sigIt;
223 slotIt=GWEN_Slot_List2_First(so->slotList);
227 slot=GWEN_Slot_List2Iterator_Data(slotIt);
234 if (typeId==0 || slot->derivedParentType==typeId) {
235 GWEN_Slot_List2_Erase(so->slotList, slotIt);
238 slot=GWEN_Slot_List2Iterator_Data(slotIt);
241 slot=GWEN_Slot_List2Iterator_Next(slotIt);
243 GWEN_Slot_List2Iterator_free(slotIt);
246 sigIt=GWEN_Signal_List2_First(so->signalList);
250 sig=GWEN_Signal_List2Iterator_Data(sigIt);
257 if (typeId==0 || sig->derivedParentType==typeId) {
258 GWEN_Signal_List2_Erase(so->signalList, sigIt);
261 sig=GWEN_Signal_List2Iterator_Data(sigIt);
264 sig=GWEN_Signal_List2Iterator_Next(sigIt);
266 GWEN_Signal_List2Iterator_free(sigIt);
275 const char *derivedType,
277 const char *typeOfArg1,
278 const char *typeOfArg2) {
285 sig->connectedSlots=GWEN_Slot_List2_new();
286 sig->name=strdup(name);
306 assert(sig->_refCount);
307 if (sig->_refCount==1) {
308 GWEN_SLOT_LIST2_ITERATOR *sit;
311 sit=GWEN_Slot_List2_First(sig->connectedSlots);
315 slot=GWEN_Slot_List2Iterator_Data(sit);
320 next=GWEN_Slot_List2Iterator_Next(sit);
322 "Disconnecting signal \"%s\" from slot \"%s\"",
323 sig->name, slot->name);
324 GWEN_Signal_List2_Remove(slot->connectedSignals, sig);
327 GWEN_Slot_List2Iterator_free(sit);
329 GWEN_Slot_List2_free(sig->connectedSlots);
344 assert(sig->_refCount);
359 GWEN_Signal_List2_free(slist);
366 if ((
void*)sig==user_data)
385 return sig->signalObject;
393 if (sig->typeOfArg1!=slot->typeOfArg1) {
395 "Signal \"%s\" and slot \"%s\" use different types for "
397 sig->name, slot->name);
400 if (sig->typeOfArg2!=slot->typeOfArg2) {
402 "Signal \"%s\" and slot \"%s\" use different types for "
404 sig->name, slot->name);
409 "Signal \"%s\" and slot \"%s\" already connected",
410 sig->name, slot->name);
416 "Signal \"%s\" and slot \"%s\" already connected",
417 sig->name, slot->name);
421 GWEN_Signal_List2_PushBack(slot->connectedSignals, sig);
422 GWEN_Slot_List2_PushBack(sig->connectedSlots, slot);
434 "Signal \"%s\" and slot \"%s\" are not connected",
435 sig->name, slot->name);
441 "Signal \"%s\" and slot \"%s\" are not connected",
442 sig->name, slot->name);
446 GWEN_Signal_List2_Remove(slot->connectedSignals, sig);
447 GWEN_Slot_List2_Remove(sig->connectedSlots, slot);
455 void *pArg1,
void *pArg2,
int iArg3,
int iArg4) {
456 GWEN_SLOT_LIST2_ITERATOR *sit;
460 sit=GWEN_Slot_List2_First(sig->connectedSlots);
464 slot=GWEN_Slot_List2Iterator_Data(sit);
471 "Sending signal \"%s\" to slot \"%s\" (%p)",
472 sig->name, slot->name, slot);
473 rv=slot->func(slot, slot->userData, pArg1, pArg2, iArg3, iArg4);
476 "Slot \"%s\" (%p) returned an error (%d)",
477 slot->name, slot, rv);
481 slot=GWEN_Slot_List2Iterator_Next(sit);
483 GWEN_Slot_List2Iterator_free(sit);
495 const char *derivedType,
497 const char *typeOfArg1,
498 const char *typeOfArg2,
506 slot->connectedSignals=GWEN_Signal_List2_new();
507 slot->name=strdup(name);
515 slot->userData=userData;
529 assert(slot->_refCount);
530 if (slot->_refCount==1) {
531 GWEN_SIGNAL_LIST2_ITERATOR *sit;
534 sit=GWEN_Signal_List2_First(slot->connectedSignals);
538 sig=GWEN_Signal_List2Iterator_Data(sit);
542 "Disconnecting slot \"%s\" from signal \"%s\"",
543 slot->name, sig->name);
544 GWEN_Slot_List2_Remove(sig->connectedSlots, slot);
545 sig=GWEN_Signal_List2Iterator_Next(sit);
547 GWEN_Signal_List2Iterator_free(sit);
549 GWEN_Signal_List2_free(slot->connectedSignals);
564 assert(slot->_refCount);
579 GWEN_Slot_List2_free(slist);
586 if ((
void*)slot==user_data)
605 return slot->signalObject;