There are two ways to get the current state of a checkbox or a radio button.
size_t n=button->get_state();
      get_state() returns the current state of the
      checkbox or the radio button, directly. A turned off checkbox or a
      radio button returns 0. A turned on checkbox or a radio button returns
      1, and a checkbox with an
      explicitly set
	“intermediate” state returns 2.
    
	Using get_state() immediately after an
	explicit
	set_state() may return the button's
	previous state.
	This is because the checkbox's or the radio button's state
	gets updated by LibCXX Widget Toolkit's internal
	  execution thread, and that hasn't happened just yet.
	set_state() sends an internal message
	to the execution thread, which might be busy with other things.
	Once all other urgen matters get resolved, the execution thread
	will process the message and update the button's state.
      
      on_activate installs
      a callback that gets executed by
      the internal thread whenever it updates the checkbox's or the radio
      button's state:
    
button->on_activate([] (ONLY IN_THREAD, size_t value, const x::w::callback_trigger_t &trigger, const x::w::busy &mcguffin) { if (trigger.index() == x::w::callback_trigger_initial) { .. ,,, } });
      The lambda gets executed whenever the button changes its value.
      The lambda also gets executed immediately after it gets installed,
      and receives the checkbox's current state as the
      value. Its trigger parameter
      indicates the reason for lambda's execution.
      x::w::callback_trigger_t
      is a std::variant and the initial invocation
      of the variant specifies
      x::w::callback_trigger_initial.
    
	Because the lambda gets executed from the
	internal execution thread
	the lambda may get invoked before or after
	on_activate()
	returns.
      
      Only one callback can be installed at a time. Installing a second
      callback replaces the first one, and the second callback also gets
      executed with the trigger indicating its initial
      invocation. Since callback execution and installation
      is asynchronous, it's possible for the first callback to get executed
      one last time after
      on_activate() gets called to install its
      replacement callback. This happens
      if the internal execution thread already started processing a button
      click. In all cases the first callback never gets called after
      the initial execution of the second callback; so this is a confirmation
      that the callback is replaced.
    
      These callbacks get invoked to report new button values set directly,
      by pointer and button clicks; and manually with
      set_value(). Setting a new radio button
      results in callbacks for both the previously set and the newly set
      radio button getting invoked, in turn, reporting the change to the
      value of the previous radio button and the newly set one.