diff options
author | rathnor <rathnor> | 2003-04-15 00:50:25 (GMT) |
---|---|---|
committer | rathnor <rathnor> | 2003-04-15 00:50:25 (GMT) |
commit | 58e19dc91eba51739d4b8ed2dfdbb49e28d96379 (patch) | |
tree | 1fbb529d593c1b1b1fabb76832a97783649cab23 /src/Keys.cc | |
parent | 1aa5ede1b70dfba6519eeaa38101948bbdfea8a2 (diff) | |
download | fluxbox_pavel-58e19dc91eba51739d4b8ed2dfdbb49e28d96379.zip fluxbox_pavel-58e19dc91eba51739d4b8ed2dfdbb49e28d96379.tar.bz2 |
add most recently used window cycling (Simon)
It is now the default cycling action
Diffstat (limited to 'src/Keys.cc')
-rw-r--r-- | src/Keys.cc | 48 |
1 files changed, 36 insertions, 12 deletions
diff --git a/src/Keys.cc b/src/Keys.cc index 8d705c1..02cfabd 100644 --- a/src/Keys.cc +++ b/src/Keys.cc | |||
@@ -19,7 +19,7 @@ | |||
19 | // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER | 19 | // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER |
20 | // DEALINGS IN THE SOFTWARE. | 20 | // DEALINGS IN THE SOFTWARE. |
21 | 21 | ||
22 | //$Id: Keys.cc,v 1.24 2003/04/14 12:10:16 fluxgen Exp $ | 22 | //$Id: Keys.cc,v 1.25 2003/04/15 00:50:24 rathnor Exp $ |
23 | 23 | ||
24 | 24 | ||
25 | #include "Keys.hh" | 25 | #include "Keys.hh" |
@@ -140,14 +140,18 @@ Keys::Keys(const char *filename): | |||
140 | m_numlock_mod(0), | 140 | m_numlock_mod(0), |
141 | m_scrolllock_mod(0), | 141 | m_scrolllock_mod(0), |
142 | m_abortkey(0), | 142 | m_abortkey(0), |
143 | m_display(FbTk::App::instance()->display()) | 143 | m_display(FbTk::App::instance()->display()), |
144 | m_modmap(0) | ||
144 | { | 145 | { |
145 | determineModmap(); | 146 | loadModmap(); |
146 | if (filename != 0) | 147 | if (filename != 0) |
147 | load(filename); | 148 | load(filename); |
148 | } | 149 | } |
149 | 150 | ||
150 | Keys::~Keys() { | 151 | Keys::~Keys() { |
152 | if (m_modmap) { | ||
153 | XFreeModifiermap(m_modmap); | ||
154 | } | ||
151 | ungrabKeys(); | 155 | ungrabKeys(); |
152 | deleteTree(); | 156 | deleteTree(); |
153 | } | 157 | } |
@@ -458,7 +462,7 @@ unsigned int Keys::getKey(const char *keystr) { | |||
458 | Keys::KeyAction Keys::getAction(XKeyEvent *ke) { | 462 | Keys::KeyAction Keys::getAction(XKeyEvent *ke) { |
459 | static t_key *next_key = 0; | 463 | static t_key *next_key = 0; |
460 | //remove numlock, capslock and scrolllock | 464 | //remove numlock, capslock and scrolllock |
461 | ke->state &= ~Mod2Mask & ~Mod5Mask & ~LockMask; | 465 | ke->state = cleanMods(ke->state); |
462 | 466 | ||
463 | if (m_abortkey && *m_abortkey==ke) { //abort current keychain | 467 | if (m_abortkey && *m_abortkey==ke) { //abort current keychain |
464 | next_key = 0; | 468 | next_key = 0; |
@@ -636,9 +640,14 @@ Keys::t_key::~t_key() { | |||
636 | } | 640 | } |
637 | 641 | ||
638 | /** | 642 | /** |
639 | determines modifier mapping for caps, num and scroll lock | 643 | * load state relating to the modifier map |
640 | */ | 644 | */ |
641 | void Keys::determineModmap() { | 645 | void Keys::loadModmap() { |
646 | if (m_modmap) { | ||
647 | XFreeModifiermap(m_modmap); | ||
648 | } | ||
649 | m_modmap = XGetModifierMapping(m_display); | ||
650 | |||
642 | // mask to use for modifier | 651 | // mask to use for modifier |
643 | int mods[] = { | 652 | int mods[] = { |
644 | ShiftMask, | 653 | ShiftMask, |
@@ -652,15 +661,14 @@ void Keys::determineModmap() { | |||
652 | 0 | 661 | 0 |
653 | }; | 662 | }; |
654 | 663 | ||
655 | XModifierKeymap *map = XGetModifierMapping(m_display); | ||
656 | // find modifiers and set them | 664 | // find modifiers and set them |
657 | for (int i=0, realkey=0; i<8; ++i) { | 665 | for (int i=0, realkey=0; i<8; ++i) { |
658 | for (int key=0; key<map->max_keypermod; ++key, ++realkey) { | 666 | for (int key=0; key<m_modmap->max_keypermod; ++key, ++realkey) { |
659 | 667 | ||
660 | if (map->modifiermap[realkey] == 0) | 668 | if (m_modmap->modifiermap[realkey] == 0) |
661 | continue; | 669 | continue; |
662 | 670 | ||
663 | KeySym ks = XKeycodeToKeysym(m_display, map->modifiermap[realkey], 0); | 671 | KeySym ks = XKeycodeToKeysym(m_display, m_modmap->modifiermap[realkey], 0); |
664 | 672 | ||
665 | switch (ks) { | 673 | switch (ks) { |
666 | case XK_Caps_Lock: | 674 | case XK_Caps_Lock: |
@@ -675,5 +683,21 @@ void Keys::determineModmap() { | |||
675 | } | 683 | } |
676 | } | 684 | } |
677 | } | 685 | } |
678 | XFreeModifiermap(map); | 686 | } |
687 | |||
688 | unsigned int Keys::keycodeToModmask(unsigned int keycode) { | ||
689 | if (!m_modmap) return 0; | ||
690 | |||
691 | // search through modmap for this keycode | ||
692 | for (int mod=0; mod < 8; mod++) { | ||
693 | for (int key=0; key < m_modmap->max_keypermod; ++key) { | ||
694 | // modifiermap is an array with 8 sets of keycodes | ||
695 | // each max_keypermod long, but in a linear array. | ||
696 | if (m_modmap->modifiermap[m_modmap->max_keypermod*mod + key] == keycode) { | ||
697 | return (1<<mod); | ||
698 | } | ||
699 | } | ||
700 | } | ||
701 | // no luck | ||
702 | return 0; | ||
679 | } | 703 | } |