12 #include "fcitx-utils/macros.h" 14 #include "focusgroup_p.h" 16 #include "inputcontextmanager.h" 21 FocusGroup::FocusGroup(
const std::string &display, InputContextManager &manager)
22 : d_ptr(
std::make_unique<FocusGroupPrivate>(this, display, manager)) {
23 manager.registerFocusGroup(*
this);
26 FocusGroup::~FocusGroup() {
28 while (!d->ics_.empty()) {
29 auto *ic = *d->ics_.begin();
30 ic->setFocusGroup(
nullptr);
32 d->manager_.unregisterFocusGroup(*
this);
35 void FocusGroup::setFocusedInputContext(InputContext *ic) {
37 assert(!ic || d->ics_.contains(ic));
38 if (ic == d->focus_) {
42 d->focus_->setHasFocus(
false);
44 auto *oldFocus = d->focus_;
47 d->focus_->setHasFocus(
true);
49 if (
auto *instance = d->manager_.instance()) {
51 FocusGroupFocusChangedEvent(
this, oldFocus, d->focus_));
55 InputContext *FocusGroup::focusedInputContext()
const {
60 bool FocusGroup::foreach(
const InputContextVisitor &visitor) {
62 for (
auto *ic : d->ics_) {
70 void FocusGroup::addInputContext(InputContext *ic) {
72 auto iter = d->ics_.insert(ic);
77 void FocusGroup::removeInputContext(InputContext *ic) {
79 if (ic == d->focus_) {
80 setFocusedInputContext(
nullptr);
82 auto iter = d->ics_.find(ic);
83 assert(iter != d->ics_.end());
88 const std::string &FocusGroup::display()
const {
93 size_t FocusGroup::size()
const {
95 return d->ics_.size();