//////////////////////////////////////////////////////////////////////////////// // Copyright (C) 2018 Leo Tenenbaum // This file is part of GraphColoring. // // GraphColoring is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // GraphColoring is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with GraphColoring. If not, see . //////////////////////////////////////////////////////////////////////////////// #include "window.hpp" #include "utils/errors.hpp" namespace gui { int Window::SetKeydownCallback(callback_t callback, guint key) { is_keydown_callbacks_modified = true; return AddToCallbackMap(keydown_callbacks, key, callback); } void Window::RemoveKeydownCallback(int id, guint key) { if (keydown_callbacks.count(key) == 0) utils::errors::Die("Invalid key passed to remove key callback."); RemoveFromCallbackList(keydown_callbacks[key], id); is_keydown_callbacks_modified = true; } void Window::ProcessKeydown(GdkEventKey* event) { keymap[event->keyval] = true; is_keydown_callbacks_modified = false; for (callback_t callback : CheckCallbackMap(keydown_callbacks, event->keyval)) { if (!callback) continue; callback(this); if (is_keydown_callbacks_modified) break; } } void GtkKeydownCallback(GtkWidget*, GdkEventKey* event, gpointer data) { Window* win = (Window*)data; win->ProcessKeydown(event); } int Window::SetKeyupCallback(callback_t callback, guint key) { is_keyup_callbacks_modified = true; return AddToCallbackMap(keyup_callbacks, key, callback); } void Window::RemoveKeyupCallback(int id, guint key) { if (keyup_callbacks.count(key) == 0) utils::errors::Die("Invalid key passed to remove key callback."); RemoveFromCallbackList(keyup_callbacks[key], id); is_keyup_callbacks_modified = true; } void Window::ProcessKeyup(GdkEventKey* event) { keymap[event->keyval] = false; is_keyup_callbacks_modified = false; for (callback_t callback : CheckCallbackMap(keyup_callbacks, event->keyval)) { if (!callback) continue; callback(this); if (is_keyup_callbacks_modified) break; } } void GtkKeyupCallback(GtkWidget*, GdkEventKey* event, gpointer data) { Window* win = (Window*)data; win->ProcessKeyup(event); } bool Window::IsKeyDown(guint key) const { if (keymap.count(key)) return keymap.at(key); else return false; } bool Window::IsControlDown() const { return IsKeyDown(GDK_KEY_Control_L) || IsKeyDown(GDK_KEY_Control_R); } } // namespace gui