Fcitx
focusgroup.cpp
1 /*
2  * SPDX-FileCopyrightText: 2016-2016 CSSlayer <wengxt@gmail.com>
3  *
4  * SPDX-License-Identifier: LGPL-2.1-or-later
5  *
6  */
7 
8 #include <cassert>
9 #include <cstddef>
10 #include <memory>
11 #include <string>
12 #include "fcitx-utils/macros.h"
13 #include "event.h"
14 #include "focusgroup_p.h"
15 #include "inputcontext.h"
16 #include "inputcontextmanager.h"
17 #include "instance.h"
18 
19 namespace fcitx {
20 
21 FocusGroup::FocusGroup(const std::string &display, InputContextManager &manager)
22  : d_ptr(std::make_unique<FocusGroupPrivate>(this, display, manager)) {
23  manager.registerFocusGroup(*this);
24 }
25 
26 FocusGroup::~FocusGroup() {
27  FCITX_D();
28  while (!d->ics_.empty()) {
29  auto *ic = *d->ics_.begin();
30  ic->setFocusGroup(nullptr);
31  }
32  d->manager_.unregisterFocusGroup(*this);
33 }
34 
35 void FocusGroup::setFocusedInputContext(InputContext *ic) {
36  FCITX_D();
37  assert(!ic || d->ics_.contains(ic));
38  if (ic == d->focus_) {
39  return;
40  }
41  if (d->focus_) {
42  d->focus_->setHasFocus(false);
43  }
44  auto *oldFocus = d->focus_;
45  d->focus_ = ic;
46  if (d->focus_) {
47  d->focus_->setHasFocus(true);
48  }
49  if (auto *instance = d->manager_.instance()) {
50  instance->postEvent(
51  FocusGroupFocusChangedEvent(this, oldFocus, d->focus_));
52  }
53 }
54 
55 InputContext *FocusGroup::focusedInputContext() const {
56  FCITX_D();
57  return d->focus_;
58 }
59 
60 bool FocusGroup::foreach(const InputContextVisitor &visitor) {
61  FCITX_D();
62  for (auto *ic : d->ics_) {
63  if (!visitor(ic)) {
64  return false;
65  }
66  }
67  return true;
68 }
69 
70 void FocusGroup::addInputContext(InputContext *ic) {
71  FCITX_D();
72  auto iter = d->ics_.insert(ic);
73  assert(iter.second);
74  FCITX_UNUSED(iter);
75 }
76 
77 void FocusGroup::removeInputContext(InputContext *ic) {
78  FCITX_D();
79  if (ic == d->focus_) {
80  setFocusedInputContext(nullptr);
81  }
82  auto iter = d->ics_.find(ic);
83  assert(iter != d->ics_.end());
84  FCITX_UNUSED(iter);
85  d->ics_.erase(ic);
86 }
87 
88 const std::string &FocusGroup::display() const {
89  FCITX_D();
90  return d->display_;
91 }
92 
93 size_t FocusGroup::size() const {
94  FCITX_D();
95  return d->ics_.size();
96 }
97 } // namespace fcitx
Definition: action.cpp:17
Definition: matchrule.h:78
Input Context for Fcitx.