x::w::new_listlayoutmanager new_list; new_list.selection_type=x::w::multiple_selection_type; new_list.selection_type=[] (ONLY IN_THREAD, const x::w::listlayoutmanagerbase & l, size_t item_number) { }; new_list.selection_changed=[] (ONLY IN_THREAD, const x::w::list_item_status_info_t &info) { }; new_list.current_list_item_changed=[] (ONLY IN_THREAD, const x::w::list_item_status_info_t &info) { };
      The default behavior of a selection list is that selecting a
      different list item
      automatically unselects the previously-selected list item.
      Selecting the same list item again unselects it.
      Setting selection_type
      to x::w::multiple_selection_type results
      in each list item getting selected and unselected individually.
      Clicking on a list item with a pointer, or tabbing to the list,
      moving the cursor to the item's row, and pressing Enter
      selects and unselects that item only.
    
      Setting selection_type to a lambda results in
      custom selection
      callback lambda.
      Clicking on an item executes the lambda,
      and the lambda has full control over which list items get selected
      or unselected. The selection_type lambda's parameters
      are: the list layout manager, given as a
      x::w::listlayoutmanager, the index of which
      item was clicked on, and the busy mcguffin. The
      lambda is responsible for selecting or
      unselecting the list's items, as it sees fit.
    
	selection_type callbacks get executed by the
	connection thread.
	They should use IN_THREAD
	x::w::listlayoutmanager
	methods to examine and update the list.
      
      selection_changed is an optional
      callback that gets invoked whenever
      any item in the list gets selected or unselected, individually.
      The callback's
      x::w::list_item_status_info_t
      reports which item was changed, and its new status is.
      Each individual list item can also have its own individual callback
      that gets invoked only when that item's status changes. This is invoked
      in addition to the list-wide selection_changed
      callback. This is used in menus, but
      may also be used in selection lists as well.
    
The usual rules for captured references apply. Callbacks cannot capture references to their list's container, or any of its parent elements. The callbacks conveniently receive their list layout manager as one of their parameters, which should take care of most of their needs.
The library obtains an internal lock on the underlying list, that's held for the duration of the callback; and the callback must acquire its own lock, if it needs one. In any case, the underlying list is locked for the duration of the callback, and cannot be accessed by other execution threads.
      current_list_item is a similar optional
      callback that reports the current list
      item highlighted by the pointer or the keyboard.
      This callback reports, basically, each time a list item gets highlighted
      or has its highlight removed; irrespective of whether the list item
      is formally selected or not.
    
std::optional<size_t> selection=list->selected(); if (selection) { auto v=selection.value(); } std::vector<size_t> all_selections=list->all_selected(); if (lm->selected(1)) { // ... }
      The selected() method makes an ad-hoc query
      to retrieve the currently-selected item, if there is one.
      This approach is suitable with single selection lists.
      With x::w::multiple_selection_type lists
      all_selected() gives the list of all items
      that are currently selected;
      or an overloaded selected() takes a parameter
      and returns an indication whether the given item is currently selected.
    
      Given LibCXXW's multi-threaded nature, the internal library thread
      can end up selecting or unselecting a list item at any time in response
      to pointer or keyboard activity, so what's
      selected() can change at any time.
      Use a list lock to freeze the contents
      of the list, examine what's selected(), at
      a given time, and perhaps add or remove items from the list while
      blocking all other threads from accessing the list.
    
An alternative approach involves attaching callbacks to individual list items. A list item's callback gets invoked whenever the list item gets selected or unselected. Other items may be added or removed from the list, but the callback stays with its paired item, and gets invoked only for its item.