Skip to content

Commit

Permalink
Reuse WMKey in KProgram.
Browse files Browse the repository at this point in the history
  • Loading branch information
gijsbers committed Aug 2, 2024
1 parent 5ea69e7 commit dce879b
Show file tree
Hide file tree
Showing 7 changed files with 46 additions and 37 deletions.
2 changes: 1 addition & 1 deletion src/wmapp.cc
Original file line number Diff line number Diff line change
Expand Up @@ -489,7 +489,7 @@ void YWMApp::initPointers() {

void YWMApp::keyboardRemap() {
reparseKeyPrefs();
for (KProgramIterType p = keyProgs.iterator(); ++p; ) {
for (KProgram* p : keyProgs) {
p->parse();
}
if (manager && !initializing && manager->isRunning()) {
Expand Down
1 change: 0 additions & 1 deletion src/wmapp.h
Original file line number Diff line number Diff line change
Expand Up @@ -216,7 +216,6 @@ extern lazy<TabsMenu> tabsMenu;

class KProgram;
typedef YObjectArray<KProgram> KProgramArrayType;
typedef KProgramArrayType::IterType KProgramIterType;
extern KProgramArrayType keyProgs;

extern RebootShutdown rebootOrShutdown;
Expand Down
17 changes: 17 additions & 0 deletions src/wmkey.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
#ifndef WMKEY_H
#define WMKEY_H

struct WMKey {
KeySym key;
unsigned mod;
const char* name;
bool initial;

bool eq(KeySym k, unsigned m) const { return key == k && mod == m; }
bool operator==(const WMKey& o) const { return eq(o.key, o.mod); }
bool operator!=(const WMKey& o) const { return !eq(o.key, o.mod); }
bool parse();
bool set(const char* arg);
};

#endif
8 changes: 3 additions & 5 deletions src/wmmgr.cc
Original file line number Diff line number Diff line change
Expand Up @@ -247,8 +247,7 @@ void YWindowManager::grabKeys() {
grab(gKeySysKeyboardNext);

{
KProgramIterType k = keyProgs.iterator();
while (++k) {
for (KProgram* k : keyProgs) {
grabVKey(k->key(), k->modifiers());
}
}
Expand Down Expand Up @@ -417,7 +416,7 @@ bool YWindowManager::handleSwitchWorkspaceKey(const XKeyEvent& key,
bool YWindowManager::handleWMKey(const XKeyEvent &key, KeySym k, unsigned vm) {
YFrameWindow *frame = getFocus();

for (KProgramIterType p = keyProgs.iterator(); ++p; ) {
for (KProgram* p : keyProgs) {
if (p->isKey(k, vm)) {
XAllowEvents(xapp->display(), AsyncKeyboard, key.time);
p->open(key.state);
Expand Down Expand Up @@ -690,8 +689,7 @@ void YWindowManager::handleButton(const XButtonEvent &button) {
KeySym k = button.button - Button1 + XK_Pointer_Button1;
unsigned int m = KEY_MODMASK(button.state);
unsigned int vm = VMod(m);
KProgramIterType p = keyProgs.iterator();
while (++p) {
for (KProgram* p : keyProgs) {
if (p->isKey(k, vm)) {
p->open(m);
break;
Expand Down
23 changes: 15 additions & 8 deletions src/wmprog.cc
Original file line number Diff line number Diff line change
Expand Up @@ -93,19 +93,23 @@ DProgram *DProgram::newProgram(
KProgramArrayType keyProgs;

KProgram::KProgram(const char *key, DProgram *prog, bool bIsDynSwitchMenuProg) :
fDef(newstr(key)),
fKey(NoSymbol),
fMod(0),
bIsDynSwitchMenu(bIsDynSwitchMenuProg),
fProg(prog),
pSwitchWindow(nullptr)
{
parse();
keyProgs.append(this);
wm.name = newstr(key);
wm.initial = false;
wm.key = NoSymbol;
wm.mod = 0;
wm.parse();
keyProgs += this;
}

void KProgram::parse() {
xapp->parseKey(fDef, &fKey, &fMod);
KProgram::~KProgram() {
delete fProg;
if (wm.initial == false)
delete[] const_cast<char *>(wm.name);
delete pSwitchWindow;
}

class MenuProgSwitchItems: public ISwitchItems {
Expand All @@ -121,6 +125,9 @@ class MenuProgSwitchItems: public ISwitchItems {
menu = new MenuProgMenu(wmapp, wmapp, nullptr /* no wmaction handling*/,
"switch popup internal menu", prog->cmd(), prog->args());
}
~MenuProgSwitchItems() {
delete menu;
}
virtual void updateList() override {
menu->refresh();
zTarget = 0;
Expand Down Expand Up @@ -194,7 +201,7 @@ void KProgram::open(unsigned mods) {

if (bIsDynSwitchMenu) {
if (!pSwitchWindow) {
ISwitchItems* items = new MenuProgSwitchItems(fProg, fKey, fMod);
ISwitchItems* items = new MenuProgSwitchItems(fProg, wm.key, wm.mod);
pSwitchWindow = new SwitchWindow(desktop, items, quickSwitchVertical);
}
pSwitchWindow->begin(true, mods);
Expand Down
18 changes: 9 additions & 9 deletions src/wmprog.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
#define WMPROG_H

#include "objmenu.h"
#include "wmkey.h"

class ObjectContainer;
class YSMListener;
Expand Down Expand Up @@ -169,20 +170,19 @@ class StartMenu: public MenuFileMenu {
class KProgram {
public:
KProgram(const char *key, DProgram *prog, bool bIsDynSwitchMenuProg);
~KProgram() { delete fProg; delete[] fDef; }
~KProgram();

void parse();
bool isKey(KeySym key, unsigned int mod) {
return (key == fKey && mod == fMod);
void parse() { wm.parse(); }
bool isKey(KeySym key, unsigned mod) const {
return wm.eq(key, mod);
}
void open(unsigned mods);
KeySym key() { return fKey; }
unsigned int modifiers() { return fMod; }
KeySym key() const { return wm.key; }
unsigned modifiers() const { return wm.mod; }

private:
const char* fDef;
KeySym fKey;
unsigned int fMod;
WMKey wm;

// not a program starter but custom switch menu
// use as bool to fit into memory wasted wit 64bit alignment
unsigned int bIsDynSwitchMenu;
Expand Down
14 changes: 1 addition & 13 deletions src/yconfig.h
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@

#include <X11/X.h>
#include "yfontname.h"
#include "wmkey.h"

#define kfShift 1
#define kfCtrl 2
Expand All @@ -41,19 +42,6 @@
#define kfHyper 32
#define kfAltGr 64

struct WMKey {
KeySym key;
unsigned mod;
const char* name;
bool initial;

bool eq(KeySym k, unsigned m) const { return key == k && mod == m; }
bool operator==(const WMKey& o) const { return eq(o.key, o.mod); }
bool operator!=(const WMKey& o) const { return !eq(o.key, o.mod); }
bool parse();
bool set(const char* arg);
};

#ifdef CFGDESC
#define DESC(d) d
#else
Expand Down

0 comments on commit dce879b

Please sign in to comment.