- gtk_key_snooper_remove (snooper_id);
-}
-
-XMLNode&
-Keyboard::get_state (void)
-{
- XMLNode* node = new XMLNode ("Keyboard");
- char buf[32];
-
- snprintf (buf, sizeof (buf), "%d", edit_but);
- node->add_property ("edit-button", buf);
- snprintf (buf, sizeof (buf), "%d", edit_mod);
- node->add_property ("edit-modifier", buf);
- snprintf (buf, sizeof (buf), "%d", delete_but);
- node->add_property ("delete-button", buf);
- snprintf (buf, sizeof (buf), "%d", delete_mod);
- node->add_property ("delete-modifier", buf);
- snprintf (buf, sizeof (buf), "%d", snap_mod);
- node->add_property ("snap-modifier", buf);
-
- return *node;
-}
-
-int
-Keyboard::set_state (const XMLNode& node)
-{
- const XMLProperty* prop;
-
- if ((prop = node.property ("edit-button")) != 0) {
- sscanf (prop->value().c_str(), "%d", &edit_but);
- }
-
- if ((prop = node.property ("edit-modifier")) != 0) {
- sscanf (prop->value().c_str(), "%d", &edit_mod);
- }
-
- if ((prop = node.property ("delete-button")) != 0) {
- sscanf (prop->value().c_str(), "%d", &delete_but);
- }
-
- if ((prop = node.property ("delete-modifier")) != 0) {
- sscanf (prop->value().c_str(), "%d", &delete_mod);
- }
-
- if ((prop = node.property ("snap-modifier")) != 0) {
- sscanf (prop->value().c_str(), "%d", &snap_mod);
- }
-
- return 0;
-}
-
-gint
-Keyboard::_snooper (GtkWidget *widget, GdkEventKey *event, gpointer data)
-{
- return ((Keyboard *) data)->snooper (widget, event);
-}
-
-gint
-Keyboard::snooper (GtkWidget *widget, GdkEventKey *event)
-{
- uint32_t keyval;
- bool ret = false;
-
-#if 0
- cerr << "snoop widget " << widget << " key " << event->keyval << " type: " << event->type
- << " state " << std::hex << event->state << std::dec
- << endl;
-#endif
-
-#if KBD_DEBUG
- if (debug_keyboard) {
- cerr << "snoop widget " << widget << " key " << event->keyval << " type: " << event->type
- << endl;
- }
-#endif
-
- if (event->keyval == GDK_Shift_R) {
- keyval = GDK_Shift_L;
-
- } else if (event->keyval == GDK_Control_R) {
- keyval = GDK_Control_L;
-
- } else {
- keyval = event->keyval;
- }
-
- if (event->type == GDK_KEY_PRESS) {
-
- if (find (state.begin(), state.end(), keyval) == state.end()) {
- state.push_back (keyval);
- sort (state.begin(), state.end());
-
- } else {
-
- /* key is already down. if its also used for release,
- prevent auto-repeat events.
- */
-
- for (map<AccelKey,two_strings,AccelKeyLess>::iterator k = release_keys.begin(); k != release_keys.end(); ++k) {
-
- const AccelKey& ak (k->first);
-
- if (keyval == ak.get_key() && (Gdk::ModifierType)(event->state | Gdk::RELEASE_MASK) == ak.get_mod()) {
- ret = true;
- break;
- }
- }
- }
-
- } else if (event->type == GDK_KEY_RELEASE) {
-
- State::iterator i;
-
- if ((i = find (state.begin(), state.end(), keyval)) != state.end()) {
- state.erase (i);
- sort (state.begin(), state.end());
- }
-
- for (map<AccelKey,two_strings,AccelKeyLess>::iterator k = release_keys.begin(); k != release_keys.end(); ++k) {
-
- const AccelKey& ak (k->first);
- two_strings ts (k->second);
-
- if (keyval == ak.get_key() && (Gdk::ModifierType)(event->state | Gdk::RELEASE_MASK) == ak.get_mod()) {
- Glib::RefPtr<Gtk::Action> act = ActionManager::get_action (ts.first.c_str(), ts.second.c_str());
- if (act) {
- act->activate();
- ret = true;
- }
- break;
- }
- }
- }
-
- /* Special keys that we want to handle in
- any dialog, no matter whether it uses
- the regular set of accelerators or not
- */
-
- if (event->type == GDK_KEY_RELEASE && modifier_state_equals (event->state, PrimaryModifier)) {
- switch (event->keyval) {
- case GDK_w:
- if (current_window) {
- current_window->hide ();
- current_window = 0;
- ret = true;
- }
- break;
- }
- }
-
- return ret;
-}
-
-bool
-Keyboard::key_is_down (uint32_t keyval)
-{
- return find (state.begin(), state.end(), keyval) != state.end();
-}
-
-bool
-Keyboard::enter_window (GdkEventCrossing *ev, Gtk::Window* win)
-{
- current_window = win;
- return false;
-}
-
-bool
-Keyboard::leave_window (GdkEventCrossing *ev, Gtk::Window* win)
-{
- if (ev) {
- switch (ev->detail) {
- case GDK_NOTIFY_INFERIOR:
- if (debug_keyboard) {
- cerr << "INFERIOR crossing ... out\n";
- }
- break;
-
- case GDK_NOTIFY_VIRTUAL:
- if (debug_keyboard) {
- cerr << "VIRTUAL crossing ... out\n";
- }
- /* fallthru */
-
- default:
- if (debug_keyboard) {
- cerr << "REAL CROSSING ... out\n";
- cerr << "clearing current target\n";
- }
- state.clear ();
- current_window = 0;
- }
- } else {
- current_window = 0;
- }
-
- return false;