mirror of
https://github.com/edeproject/ede.git
synced 2023-08-10 21:13:03 +03:00
286 lines
6.9 KiB
C++
286 lines
6.9 KiB
C++
/*
|
|
* $Id$
|
|
*
|
|
* Keyboard shortcuts applet
|
|
* Part of Equinox Desktop Environment (EDE).
|
|
* Copyright (c) 2005-2006 EDE Authors.
|
|
*
|
|
* This program is licenced under terms of the
|
|
* GNU General Public Licence version 2 or newer.
|
|
* See COPYING for details.
|
|
*/
|
|
|
|
#include "ekeys.h"
|
|
|
|
|
|
using namespace fltk;
|
|
using namespace edelib;
|
|
|
|
|
|
#define NR_HOTKEYS 30
|
|
|
|
|
|
static struct {
|
|
char systemname[20];
|
|
char uiname[50];
|
|
char command[50];
|
|
} hotkeys[] = {
|
|
{"NextWindow", "Next window", ""},
|
|
{"PreviousWindow", "Previous window", ""},
|
|
{"NextDesktop", "Next workspace", ""},
|
|
{"PreviousDesktop", "Previous workspace", ""},
|
|
{"FastRun", "Run program", ""},
|
|
{"FindUtil", "Find file", ""},
|
|
{"CloseWindow", "Close window", ""},
|
|
{"MinimizeWindow", "Minimize window", ""},
|
|
{"MaximizeWindow", "Maximize window", ""},
|
|
{"Desktop1", "Workspace 1", ""},
|
|
{"Desktop2", "Workspace 2", ""},
|
|
{"Desktop3", "Workspace 3", ""},
|
|
{"Desktop4", "Workspace 4", ""},
|
|
{"Desktop5", "Workspace 5", ""},
|
|
{"Desktop6", "Workspace 6", ""},
|
|
{"Desktop7", "Workspace 7", ""},
|
|
{"Desktop8", "Workspace 8", ""},
|
|
{"App1", "", ""},
|
|
{"App2", "", ""},
|
|
{"App3", "", ""},
|
|
{"App4", "", ""},
|
|
{"App5", "", ""},
|
|
{"App6", "", ""},
|
|
{"App7", "", ""},
|
|
{"App8", "", ""},
|
|
{"App9", "", ""},
|
|
{"App10", "", ""},
|
|
{"App11", "", ""},
|
|
{"App12", "", ""},
|
|
|
|
};
|
|
|
|
|
|
|
|
int keycodes[NR_HOTKEYS];
|
|
|
|
|
|
|
|
|
|
static void sendClientMessage(XWindow w, Atom a, long x)
|
|
{
|
|
XEvent ev;
|
|
long mask;
|
|
|
|
memset(&ev, 0, sizeof(ev));
|
|
ev.xclient.type = ClientMessage;
|
|
ev.xclient.window = w;
|
|
ev.xclient.message_type = a;
|
|
ev.xclient.format = 32;
|
|
ev.xclient.data.l[0] = x;
|
|
ev.xclient.data.l[1] = CurrentTime;
|
|
mask = 0L;
|
|
if (w == RootWindow(xdisplay, xscreen))
|
|
mask = SubstructureRedirectMask;
|
|
XSendEvent(xdisplay, w, False, mask, &ev);
|
|
}
|
|
|
|
void sendUpdateInfo()
|
|
{
|
|
// No worky
|
|
/* unsigned int i, nrootwins;
|
|
XWindow dw1, dw2, *rootwins = 0;
|
|
int screen_count = ScreenCount(fltk::xdisplay);
|
|
extern Atom FLTKChangeSettings;
|
|
for (int s = 0; s < screen_count; s++) {
|
|
XWindow root = RootWindow(fltk::xdisplay, s);
|
|
XQueryTree(fltk::xdisplay, root, &dw1, &dw2, &rootwins, &nrootwins);
|
|
for (i = 0; i < nrootwins; i++) {
|
|
if (rootwins[i]!=RootWindow(fltk::xdisplay, fltk::xscreen)) {
|
|
sendClientMessage(rootwins[i], FLTKChangeSettings, 0);
|
|
}
|
|
}
|
|
}
|
|
XFlush(fltk::xdisplay);*/
|
|
}
|
|
|
|
int getshortcutfor(const char* action)
|
|
{
|
|
for (int i=0; i<NR_HOTKEYS; i++)
|
|
if (strcmp(action,hotkeys[i].uiname) == 0) return keycodes[i];
|
|
|
|
return 0;
|
|
}
|
|
|
|
void setshortcutfor(const char* action, int svalue)
|
|
{
|
|
for (int i=0; i<NR_HOTKEYS; i++)
|
|
if (strcmp(action,hotkeys[i].uiname) == 0) keycodes[i] = svalue;
|
|
}
|
|
|
|
int name_to_svalue(char *hotkey)
|
|
{
|
|
static struct {
|
|
char *name;
|
|
int value;
|
|
} keys[] = {
|
|
{"alt", ALT},
|
|
{"ctrl", CTRL},
|
|
{"shift", SHIFT},
|
|
{"win", META},
|
|
{"space", SpaceKey},
|
|
{"backspace", BackSpaceKey},
|
|
{"tab", TabKey},
|
|
{"enter", ReturnKey},
|
|
{"escape", EscapeKey},
|
|
{"home", HomeKey},
|
|
{"left", LeftKey},
|
|
{"up", UpKey},
|
|
{"right", RightKey},
|
|
{"down", DownKey},
|
|
{"pageup", PageUpKey},
|
|
{"pagedown", PageDownKey},
|
|
{"end", EndKey},
|
|
{"insert", InsertKey},
|
|
{"delete", DeleteKey},
|
|
{"f1", F1Key},
|
|
{"f2", F2Key},
|
|
{"f3", F3Key},
|
|
{"f4", F4Key},
|
|
{"f5", F5Key},
|
|
{"f6", F6Key},
|
|
{"f7", F7Key},
|
|
{"f8", F8Key},
|
|
{"f9", F9Key},
|
|
{"f10", F10Key},
|
|
{"f11", F11Key},
|
|
{"f12", F12Key},
|
|
{0, 0}
|
|
};
|
|
int parsed = 0;
|
|
char f[20];
|
|
|
|
// The parser - case insensitive and hopefully robust
|
|
int plus=0;
|
|
for (int i=0; i<=strlen(hotkey); i++) {
|
|
if (i<strlen(hotkey) && hotkey[i] != '+') continue;
|
|
if (i==plus) { plus=i+1; continue; } // two +s in row
|
|
char key[20];
|
|
strncpy (key, hotkey+plus, i-plus);
|
|
key[i-plus]='\0';
|
|
plus=i+1;
|
|
|
|
bool found = false;
|
|
for (int j=0; keys[j].value; j++) {
|
|
if (strcasecmp(key,keys[j].name) == 0) {
|
|
parsed += keys[j].value;
|
|
found = true;
|
|
}
|
|
}
|
|
|
|
if (!found) {
|
|
// use first letter as shortcut key
|
|
if ((key[0] >= 'a') && (key[0] <= 'z')) {
|
|
parsed += key[0];
|
|
} else if ((key[0] >= 'A') && (key[0] <= 'Z')) {
|
|
parsed += (key[0] - 'A' + 'a');
|
|
}
|
|
}
|
|
}
|
|
|
|
return parsed;
|
|
}
|
|
|
|
void readKeysConfiguration()
|
|
{
|
|
Config globalConfig(Config::find_file("wmanager.conf", 0), true, false);
|
|
globalConfig.set_section("Hotkeys");
|
|
|
|
for (int i=0; i<NR_HOTKEYS; i++) {
|
|
char tmp[128];
|
|
globalConfig.read(hotkeys[i].systemname, tmp, "", 128);
|
|
keycodes[i] = name_to_svalue(tmp);
|
|
}
|
|
|
|
globalConfig.set_section("Applications");
|
|
for (int i=0; i<NR_HOTKEYS; i++) {
|
|
char tmp[128];
|
|
if ((strncmp(hotkeys[i].systemname,"App",3) == 0) && (keycodes[i] != 0)) {
|
|
globalConfig.read(hotkeys[i].systemname, tmp, "", 128);
|
|
if (tmp != "") strncpy(hotkeys[i].command, tmp, 50);
|
|
if (keycodes[i]>0 && tmp != "") strncpy(hotkeys[i].uiname, hotkeys[i].systemname, 20);
|
|
}
|
|
}
|
|
|
|
globalConfig.set_section("ApplicationNames");
|
|
for (int i=0; i<NR_HOTKEYS; i++) {
|
|
char tmp[128];
|
|
if ((strncmp(hotkeys[i].systemname,"App",3) == 0) && (keycodes[i] != 0)) {
|
|
globalConfig.read(hotkeys[i].systemname, tmp, "", 128);
|
|
if (tmp != "") strncpy(hotkeys[i].uiname, tmp, 50);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
void writeKeysConfiguration()
|
|
{
|
|
Config globalConfig(Config::find_file("wmanager.conf", true));
|
|
globalConfig.set_section("Hotkeys");
|
|
|
|
for (int i=0; i<NR_HOTKEYS; i++)
|
|
globalConfig.write(hotkeys[i].systemname, key_name(keycodes[i]));
|
|
|
|
globalConfig.set_section("Applications");
|
|
for (int i=0; i<NR_HOTKEYS; i++)
|
|
if ((strncmp(hotkeys[i].systemname,"App",3) == 0)
|
|
&& (strcmp(hotkeys[i].uiname,"") != 0)
|
|
&& (strcmp(hotkeys[i].command,"") != 0))
|
|
globalConfig.write(hotkeys[i].systemname, hotkeys[i].command);
|
|
|
|
globalConfig.set_section("ApplicationNames");
|
|
for (int i=0; i<NR_HOTKEYS; i++)
|
|
if ((strncmp(hotkeys[i].systemname,"App",3) == 0)
|
|
&& (strcmp(hotkeys[i].uiname,"") != 0)
|
|
&& (strcmp(hotkeys[i].command,"") != 0))
|
|
globalConfig.write(hotkeys[i].systemname, hotkeys[i].uiname);
|
|
}
|
|
|
|
void populatelist(InputBrowser *action)
|
|
{
|
|
action->clear(); // Rewrite?
|
|
for (int i=0; i<NR_HOTKEYS; i++)
|
|
if (strcmp(hotkeys[i].uiname,"") != 0) action->add ( hotkeys[i].uiname);
|
|
}
|
|
|
|
void addShortcut(const char *name, const char *cmd)
|
|
{
|
|
if ((strcmp(name,"") !=0) && (strcmp(cmd,"") != 0)) {
|
|
for (int i=0; i<NR_HOTKEYS; i++) {
|
|
if ((strncmp(hotkeys[i].systemname,"App",3) == 0) && (strcmp(hotkeys[i].uiname,name) == 0)) {
|
|
alert(_("Shortcut already defined! Please use a different name"));
|
|
return;
|
|
}
|
|
}
|
|
for (int i=0; i<NR_HOTKEYS; i++) {
|
|
if ((strncmp(hotkeys[i].systemname,"App",3) == 0) && (strcmp(hotkeys[i].uiname,"") == 0)) {
|
|
strncpy(hotkeys[i].uiname, name, 50);
|
|
strncpy(hotkeys[i].command, cmd, 50);
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
alert(_("Maximum number of user shortcuts exceeded"));
|
|
}
|
|
|
|
|
|
void removeShortcut(const char* action)
|
|
{
|
|
for (int i=0; i<NR_HOTKEYS; i++)
|
|
if (strcmp(action,hotkeys[i].uiname)==0) {
|
|
keycodes[i]=0;
|
|
if (strncmp(hotkeys[i].systemname,"App",3) == 0)
|
|
strcpy(hotkeys[i].uiname,"");
|
|
}
|
|
}
|