Listing 2

struct focus_wnd_handler : sync_handler<focus_wnd_handler, window_base> {
  static bool matches_wnd(window_base * w) {
    ptr<> surf = wnd_surface(w);
    return surf;
  }

  handle_event on_get_focus() {
    ptr<> focus = wnd_surface(self)->try_find_surface("focus");
    if ( focus) focus->is_visible(true);
    return event_ex<wm::keyb::set_focus>().HANDLED_BY(&me::on_get_focus);
  }
  handle_event on_lose_focus() {
    ptr<> focus = wnd_surface(self)->try_find_surface("focus");
    if ( focus) focus->is_visible(false);
    return event_ex<wm::keyb::kill_focus>().HANDLED_BY(&me::on_lose_focus);
  }
};