367
367
var cl = sig.parent_symbol as Class;
368
368
csignew.add_argument (new CCodeConstant ("\"%s\"".printf (sig.get_cname ())));
369
369
csignew.add_argument (new CCodeIdentifier (type.get_type_id ()));
370
csignew.add_argument (new CCodeConstant ("G_SIGNAL_RUN_LAST"));
370
string[] flags = new string[0];
371
if (sig.run_type == "first") {
372
flags += "G_SIGNAL_RUN_FIRST";
373
} else if (sig.run_type == "cleanup") {
374
flags += "G_SIGNAL_RUN_CLEANUP";
376
flags += "G_SIGNAL_RUN_LAST";
378
if (sig.is_detailed) {
379
flags += "G_SIGNAL_DETAILED";
382
if (sig.no_recurse) {
383
flags += "G_SIGNAL_NO_RECURSE";
387
flags += "G_SIGNAL_ACTION";
391
flags += "G_SIGNAL_NO_HOOKS";
394
csignew.add_argument (new CCodeConstant (string.joinv (" | ", flags)));
371
396
if (sig.default_handler == null) {
372
397
csignew.add_argument (new CCodeConstant ("0"));
477
return connect_signal (sig, assignment.left, assignment.right, disconnect, assignment);
502
return connect_signal (sig, assignment.left, assignment.right, disconnect, false, assignment);
480
505
public override void visit_assignment (Assignment assignment) {
550
575
handler.accept (codegen);
552
577
bool disconnect = (method_type.method_symbol.name == "disconnect");
578
bool after = (method_type.method_symbol.name == "connect_after");
554
expr.ccodenode = connect_signal (sig, signal_access, handler, disconnect, expr);
580
expr.ccodenode = connect_signal (sig, signal_access, handler, disconnect, after, expr);
557
CCodeExpression? connect_signal (Signal sig, Expression signal_access, Expression handler, bool disconnect, CodeNode expr) {
583
CCodeExpression? connect_signal (Signal sig, Expression signal_access, Expression handler, bool disconnect, bool after, CodeNode expr) {
558
584
string connect_func;
560
586
var m = (Method) handler.symbol_reference;
562
588
if (!disconnect) {
564
590
if (sig is DynamicSignal) {
565
connect_func = head.get_dynamic_signal_connect_wrapper_name ((DynamicSignal) sig);
592
connect_func = head.get_dynamic_signal_connect_wrapper_name ((DynamicSignal) sig);
594
connect_func = head.get_dynamic_signal_connect_after_wrapper_name ((DynamicSignal) sig);
568
597
connect_func = "g_signal_connect_data";
569
598
} else if (in_gobject_instance (m)) {
570
599
connect_func = "g_signal_connect_object";
572
601
connect_func = "g_signal_connect";
603
connect_func = "g_signal_connect_after";
630
var ccomma = new CCodeCommaExpression ();
662
ccomma = new CCodeCommaExpression ();
631
663
var temp_decl = get_temp_variable (uint_type);
632
664
temp_vars.insert (0, temp_decl);
633
665
var parse_call = new CCodeFunctionCall (new CCodeIdentifier ("g_signal_parse_name"));
635
667
var decl_type = (TypeSymbol) sig.parent_symbol;
636
668
parse_call.add_argument (new CCodeIdentifier (decl_type.get_type_id ()));
637
669
parse_call.add_argument (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, get_variable_cexpression (temp_decl.name)));
670
LocalVariable? detail_temp_decl = null;
638
671
if (signal_detail == null) {
639
672
parse_call.add_argument (new CCodeConstant ("NULL"));
673
parse_call.add_argument (new CCodeConstant ("FALSE"));
641
var detail_temp_decl = get_temp_variable (gquark_type);
675
detail_temp_decl = get_temp_variable (gquark_type);
642
676
temp_vars.insert (0, detail_temp_decl);
643
677
parse_call.add_argument (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, new CCodeIdentifier (detail_temp_decl.name)));
678
parse_call.add_argument (new CCodeConstant ("TRUE"));
645
parse_call.add_argument (new CCodeConstant ("FALSE"));
646
680
ccomma.append_expression (parse_call);
647
ccomma.append_expression (get_variable_cexpression (temp_decl.name));
649
682
// third argument: signal_id
650
ccall.add_argument (ccomma);
683
ccall.add_argument (get_variable_cexpression (temp_decl.name));
652
685
// fourth argument: detail
653
ccall.add_argument (new CCodeConstant ("0"));
686
if (detail_temp_decl == null) {
687
ccall.add_argument (new CCodeConstant ("0"));
689
ccall.add_argument (get_variable_cexpression (detail_temp_decl.name));
654
691
// fifth argument: closure
655
692
ccall.add_argument (new CCodeConstant ("NULL"));
669
706
ccall.add_argument (new CCodeCastExpression (handler_destroy_notify, "GClosureNotify"));
671
708
// sixth argument: connect_flags
672
ccall.add_argument (new CCodeConstant ("0"));
710
ccall.add_argument (new CCodeConstant ("0"));
712
ccall.add_argument (new CCodeConstant ("G_CONNECT_AFTER"));
673
713
} else if (m.binding == MemberBinding.INSTANCE) {
674
714
// g_signal_connect_object or g_signal_handlers_disconnect_matched
675
715
// or dynamic_signal_connect or dynamic_signal_disconnect
690
730
// g_signal_connect_object
692
732
// fifth argument: connect_flags
693
ccall.add_argument (new CCodeConstant ("0"));
734
ccall.add_argument (new CCodeConstant ("0"));
736
ccall.add_argument (new CCodeConstant ("G_CONNECT_AFTER"));
696
// g_signal_connect or g_signal_handlers_disconnect_matched
739
// g_signal_connect or g_signal_connect_after or g_signal_handlers_disconnect_matched
697
740
// or dynamic_signal_connect or dynamic_signal_disconnect
699
742
// fourth resp. seventh argument: user_data
700
743
ccall.add_argument (new CCodeConstant ("NULL"));
746
if (ccomma != null) {
747
ccomma.append_expression (ccall);