| 504 (void)cxListFindRemove(bindings, obj); |
504 (void)cxListFindRemove(bindings, obj); |
| 505 } |
505 } |
| 506 } |
506 } |
| 507 } |
507 } |
| 508 |
508 |
| |
509 static void stateful_action_notify_group(UiMenuRadioGroup *group, UiInteger *i) { |
| |
510 UiEvent event; |
| |
511 event.obj = group->obj; |
| |
512 event.window = event.obj->window; |
| |
513 event.document = event.obj->ctx->document; |
| |
514 event.eventdata = NULL; |
| |
515 event.eventdatatype = 0; |
| |
516 event.intval = (int)i->value; |
| |
517 event.set = ui_get_setop(); |
| |
518 |
| |
519 CxIterator iter = cxListIterator(group->callbacks); |
| |
520 cx_foreach(UiCallbackData *, cb, iter) { |
| |
521 if(cb->callback) { |
| |
522 cb->callback(&event, cb->userdata); |
| |
523 } |
| |
524 } |
| |
525 |
| |
526 UiObserver *obs = i->observers; |
| |
527 while(obs) { |
| |
528 if(obs->callback) { |
| |
529 obs->callback(&event, obs->data); |
| |
530 } |
| |
531 obs = obs->next; |
| |
532 } |
| |
533 } |
| |
534 |
| 509 static void ui_action_set_state(UiInteger *i, int64_t value) { |
535 static void ui_action_set_state(UiInteger *i, int64_t value) { |
| 510 UiMenuRadioGroup *group = i->obj; |
|
| 511 i->value = value; |
536 i->value = value; |
| 512 char buf[32]; |
537 CxList *bindings = i->obj; |
| 513 snprintf(buf, 32, "%d", (int)value); |
538 CxIterator iter = cxListIterator(bindings); |
| 514 GVariant *state = g_variant_new_string(buf); |
539 cx_foreach(UiMenuRadioGroup *, group, iter) { |
| 515 g_action_change_state(G_ACTION(group->action), state); |
540 char buf[32]; |
| |
541 snprintf(buf, 32, "%d", (int)value); |
| |
542 GVariant *state = g_variant_new_string(buf); |
| |
543 g_action_change_state(G_ACTION(group->action), state); |
| |
544 stateful_action_notify_group(group, i); |
| |
545 } |
| 516 } |
546 } |
| 517 |
547 |
| 518 static int64_t ui_action_get_state(UiInteger *i) { |
548 static int64_t ui_action_get_state(UiInteger *i) { |
| 519 return i->value; |
549 return i->value; |
| 520 } |
550 } |
| 560 int v; |
590 int v; |
| 561 if(!cx_strtoi(value, &v, 10)) { |
591 if(!cx_strtoi(value, &v, 10)) { |
| 562 i->value = v; |
592 i->value = v; |
| 563 } |
593 } |
| 564 |
594 |
| 565 UiEvent event; |
595 CxList *bindings = i->obj; |
| 566 event.obj = group->obj; |
596 CxIterator iter = cxListIterator(bindings); |
| 567 event.window = event.obj->window; |
597 cx_foreach(UiMenuRadioGroup *, gr, iter) { |
| 568 event.document = event.obj->ctx->document; |
598 stateful_action_notify_group(gr, i); |
| 569 event.eventdata = NULL; |
599 } |
| 570 event.eventdatatype = 0; |
600 } |
| 571 event.intval = v; |
|
| 572 event.set = ui_get_setop(); |
|
| 573 |
|
| 574 CxIterator iter = cxListIterator(group->callbacks); |
|
| 575 cx_foreach(UiCallbackData *, cb, iter) { |
|
| 576 if(cb->callback) { |
|
| 577 cb->callback(&event, cb->userdata); |
|
| 578 } |
|
| 579 } |
|
| 580 |
|
| 581 UiObserver *obs = i->observers; |
|
| 582 while(obs) { |
|
| 583 if(obs->callback) { |
|
| 584 obs->callback(&event, obs->data); |
|
| 585 } |
|
| 586 obs = obs->next; |
|
| 587 } |
|
| 588 } |
|
| 589 |
|
| 590 |
601 |
| 591 |
602 |
| 592 void ui_gmenu_add_radioitem(GMenu *parent, int index, UiMenuItemI *item, UiObject *obj) { |
603 void ui_gmenu_add_radioitem(GMenu *parent, int index, UiMenuItemI *item, UiObject *obj) { |
| 593 UiMenuRadioItem *i = (UiMenuRadioItem*)item; |
604 UiMenuRadioItem *i = (UiMenuRadioItem*)item; |
| 594 |
605 |