ui/gtk/menu.c

changeset 852
a04cb4398034
parent 850
3e1c3f4e2ad4
child 859
c13653b1cc9d
equal deleted inserted replaced
851:367b2bbbc07e 852:a04cb4398034
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

mercurial