File indexing completed on 2024-12-08 13:18:51
0001 /* 0002 SPDX-FileCopyrightText: 1999-2001 Lubos Lunak <l.lunak@kde.org> 0003 SPDX-FileCopyrightText: 2008 Michael Jansen <kde@michael-jansen.biz> 0004 0005 SPDX-License-Identifier: LGPL-2.0-only 0006 */ 0007 0008 #include "actions.h" 0009 0010 #include "input.h" 0011 #include "shortcuts_handler.h" 0012 #include "windows_handler.h" 0013 #include "windows_helper/window_selection_list.h" 0014 0015 #include <KConfigGroup> 0016 #include <KSharedConfig> 0017 #include <QDebug> 0018 0019 // #include <X11/X.h> 0020 #include <QX11Info> 0021 #include <X11/Xlib.h> 0022 0023 /* 0024 */ 0025 0026 namespace KHotKeys 0027 { 0028 KeyboardInputActionVisitor::~KeyboardInputActionVisitor() 0029 { 0030 } 0031 0032 KeyboardInputAction::KeyboardInputAction(ActionData *data_P, const QString &input_P, Windowdef_list *dest_window_P, bool active_window_P) 0033 : Action(data_P) 0034 , _input(input_P) 0035 , _dest_window(dest_window_P) 0036 { 0037 if (dest_window_P) 0038 _destination = SpecificWindow; 0039 else if (active_window_P) 0040 _destination = ActiveWindow; 0041 else 0042 _destination = ActionWindow; 0043 0044 if (!_dest_window) 0045 _dest_window = new Windowdef_list; 0046 } 0047 0048 KeyboardInputAction::~KeyboardInputAction() 0049 { 0050 delete _dest_window; 0051 } 0052 0053 void KeyboardInputAction::accept(ActionVisitor &visitor) 0054 { 0055 if (KeyboardInputActionVisitor *v = dynamic_cast<KeyboardInputActionVisitor *>(&visitor)) { 0056 v->visit(*this); 0057 } else { 0058 qDebug() << "Visitor error"; 0059 } 0060 } 0061 0062 const QString &KeyboardInputAction::input() const 0063 { 0064 return _input; 0065 } 0066 0067 void KeyboardInputAction::setDestination(const DestinationWindow &dest) 0068 { 0069 _destination = dest; 0070 } 0071 0072 void KeyboardInputAction::setDestinationWindowRules(Windowdef_list *list) 0073 { 0074 if (_dest_window) 0075 delete _dest_window; 0076 0077 _dest_window = list; 0078 } 0079 0080 void KeyboardInputAction::setInput(const QString &input) 0081 { 0082 _input = input; 0083 } 0084 0085 const Windowdef_list *KeyboardInputAction::dest_window() const 0086 { 0087 return _dest_window; 0088 } 0089 0090 Windowdef_list *KeyboardInputAction::dest_window() 0091 { 0092 return _dest_window; 0093 } 0094 0095 KeyboardInputAction::DestinationWindow KeyboardInputAction::destination() const 0096 { 0097 return _destination; 0098 } 0099 0100 void KeyboardInputAction::cfg_write(KConfigGroup &cfg_P) const 0101 { 0102 base::cfg_write(cfg_P); 0103 cfg_P.writeEntry("Type", "KEYBOARD_INPUT"); // overwrites value set in base::cfg_write() 0104 cfg_P.writeEntry("Input", input()); 0105 0106 cfg_P.writeEntry("DestinationWindow", int(_destination)); 0107 0108 if (_destination == SpecificWindow && dest_window() != nullptr) { 0109 KConfigGroup windowGroup(cfg_P.config(), cfg_P.name() + "DestinationWindow"); 0110 dest_window()->cfg_write(windowGroup); 0111 } 0112 } 0113 0114 void KeyboardInputAction::execute() 0115 { 0116 qDebug(); 0117 0118 if (input().isEmpty()) { 0119 qDebug() << "Input is empty"; 0120 return; 0121 } 0122 0123 Window w = InputFocus; 0124 switch (_destination) { 0125 case SpecificWindow: 0126 Q_ASSERT(dest_window()); 0127 w = windows_handler->find_window(dest_window()); 0128 if (w == None) 0129 w = InputFocus; 0130 break; 0131 0132 case ActionWindow: 0133 w = windows_handler->action_window(); 0134 if (w == None) 0135 w = InputFocus; 0136 break; 0137 0138 case ActiveWindow: 0139 // Nothing to do because w is InputFocus already 0140 break; 0141 0142 default: 0143 Q_ASSERT(false); 0144 } 0145 0146 int last_index = -1, start = 0; 0147 while ((last_index = input().indexOf(':', last_index + 1)) != -1) // find next ';' 0148 { 0149 QString key = input().mid(start, last_index - start).trimmed(); 0150 keyboard_handler->send_macro_key(key, w); 0151 start = last_index + 1; 0152 } 0153 // and the last one 0154 QString key = input().mid(start, input().length()).trimmed(); 0155 keyboard_handler->send_macro_key(key, w); // the rest 0156 if (QX11Info::isPlatformX11()) 0157 XFlush(QX11Info::display()); 0158 } 0159 0160 const QString KeyboardInputAction::description() const 0161 { 0162 QString tmp = input(); 0163 tmp.replace('\n', ' '); 0164 tmp.truncate(30); 0165 return i18n("Keyboard input: ") + tmp; 0166 } 0167 0168 Action *KeyboardInputAction::copy(ActionData *data_P) const 0169 { 0170 return new KeyboardInputAction(data_P, input(), dest_window() ? dest_window()->copy() : nullptr, _destination == ActiveWindow); 0171 } 0172 0173 } // namespace KHotKeys