X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fnetradiant.git;a=blobdiff_plain;f=radiant%2Fwindowobservers.cpp;h=9dc75a565ac2f80978eee664ff77eb7cd1e87573;hp=989c1196309ef7ea40f9fc65cffc1802dba0e4bf;hb=42856811f2b174e37a761bfcb9fbeb8c6af2f558;hpb=e4287c28bb2dafedc81c66e63951d947cfbeb225 diff --git a/radiant/windowobservers.cpp b/radiant/windowobservers.cpp index 989c1196..9dc75a56 100644 --- a/radiant/windowobservers.cpp +++ b/radiant/windowobservers.cpp @@ -22,130 +22,153 @@ #include "windowobservers.h" #include -#include +#include #include "generic/bitfield.h" -namespace -{ -ModifierFlags g_modifier_state = c_modifierNone; +namespace { + ModifierFlags g_modifier_state = c_modifierNone; } -typedef std::vector WindowObservers; +typedef std::vector WindowObservers; -inline void WindowObservers_OnModifierDown( WindowObservers& observers, ModifierFlags type ){ - g_modifier_state = bitfield_enable( g_modifier_state, type ); - for ( WindowObservers::iterator i = observers.begin(); i != observers.end(); ++i ) - { - ( *i )->onModifierDown( type ); - } +inline void WindowObservers_OnModifierDown(WindowObservers &observers, ModifierFlags type) +{ + g_modifier_state = bitfield_enable(g_modifier_state, type); + for (WindowObservers::iterator i = observers.begin(); i != observers.end(); ++i) { + (*i)->onModifierDown(type); + } } -inline void WindowObservers_OnModifierUp( WindowObservers& observers, ModifierFlags type ){ - g_modifier_state = bitfield_disable( g_modifier_state, type ); - for ( WindowObservers::iterator i = observers.begin(); i != observers.end(); ++i ) - { - ( *i )->onModifierUp( type ); - } +inline void WindowObservers_OnModifierUp(WindowObservers &observers, ModifierFlags type) +{ + g_modifier_state = bitfield_disable(g_modifier_state, type); + for (WindowObservers::iterator i = observers.begin(); i != observers.end(); ++i) { + (*i)->onModifierUp(type); + } } #include -gboolean selection_modifier_key_press( GtkWidget* widget, GdkEventKey* event, WindowObservers& observers ){ - switch ( event->keyval ) - { - case GDK_Alt_L: - case GDK_Alt_R: - //globalOutputStream() << "Alt PRESSED\n"; - WindowObservers_OnModifierDown( observers, c_modifierAlt ); - break; - case GDK_Shift_L: - case GDK_Shift_R: - //globalOutputStream() << "Shift PRESSED\n"; - WindowObservers_OnModifierDown( observers, c_modifierShift ); - break; - case GDK_Control_L: - case GDK_Control_R: - //globalOutputStream() << "Control PRESSED\n"; - WindowObservers_OnModifierDown( observers, c_modifierControl ); - break; - } - return FALSE; +gboolean selection_modifier_key_press(ui::Widget widget, GdkEventKey *event, WindowObservers &observers) +{ + switch (event->keyval) { + case GDK_KEY_Alt_L: + case GDK_KEY_Alt_R: + //globalOutputStream() << "Alt PRESSED\n"; + WindowObservers_OnModifierDown(observers, c_modifierAlt); + break; + case GDK_KEY_Shift_L: + case GDK_KEY_Shift_R: + //globalOutputStream() << "Shift PRESSED\n"; + WindowObservers_OnModifierDown(observers, c_modifierShift); + break; + case GDK_KEY_Control_L: + case GDK_KEY_Control_R: + //globalOutputStream() << "Control PRESSED\n"; + WindowObservers_OnModifierDown(observers, c_modifierControl); + break; + } + return FALSE; } -gboolean selection_modifier_key_release( GtkWidget* widget, GdkEventKey* event, WindowObservers& observers ){ - switch ( event->keyval ) - { - case GDK_Alt_L: - case GDK_Alt_R: - //globalOutputStream() << "Alt RELEASED\n"; - WindowObservers_OnModifierUp( observers, c_modifierAlt ); - break; - case GDK_Shift_L: - case GDK_Shift_R: - //globalOutputStream() << "Shift RELEASED\n"; - WindowObservers_OnModifierUp( observers, c_modifierShift ); - break; - case GDK_Control_L: - case GDK_Control_R: - //globalOutputStream() << "Control RELEASED\n"; - WindowObservers_OnModifierUp( observers, c_modifierControl ); - break; - } - return FALSE; +gboolean selection_modifier_key_release(ui::Widget widget, GdkEventKey *event, WindowObservers &observers) +{ + switch (event->keyval) { + case GDK_KEY_Alt_L: + case GDK_KEY_Alt_R: + //globalOutputStream() << "Alt RELEASED\n"; + WindowObservers_OnModifierUp(observers, c_modifierAlt); + break; + case GDK_KEY_Shift_L: + case GDK_KEY_Shift_R: + //globalOutputStream() << "Shift RELEASED\n"; + WindowObservers_OnModifierUp(observers, c_modifierShift); + break; + case GDK_KEY_Control_L: + case GDK_KEY_Control_R: + //globalOutputStream() << "Control RELEASED\n"; + WindowObservers_OnModifierUp(observers, c_modifierControl); + break; + } + return FALSE; } -void WindowObservers_UpdateModifier( WindowObservers& observers, ModifierFlags modifiers, ModifierFlags modifier ){ - if ( !bitfield_enabled( g_modifier_state, modifier ) && bitfield_enabled( modifiers, modifier ) ) { - WindowObservers_OnModifierDown( observers, modifier ); - } - if ( bitfield_enabled( g_modifier_state, modifier ) && !bitfield_enabled( modifiers, modifier ) ) { - WindowObservers_OnModifierUp( observers, modifier ); - } +void WindowObservers_UpdateModifier(WindowObservers &observers, ModifierFlags modifiers, ModifierFlags modifier) +{ + if (!bitfield_enabled(g_modifier_state, modifier) && bitfield_enabled(modifiers, modifier)) { + WindowObservers_OnModifierDown(observers, modifier); + } + if (bitfield_enabled(g_modifier_state, modifier) && !bitfield_enabled(modifiers, modifier)) { + WindowObservers_OnModifierUp(observers, modifier); + } } -void WindowObservers_UpdateModifiers( WindowObservers& observers, ModifierFlags modifiers ){ - WindowObservers_UpdateModifier( observers, modifiers, c_modifierAlt ); - WindowObservers_UpdateModifier( observers, modifiers, c_modifierShift ); - WindowObservers_UpdateModifier( observers, modifiers, c_modifierControl ); +void WindowObservers_UpdateModifiers(WindowObservers &observers, ModifierFlags modifiers) +{ + WindowObservers_UpdateModifier(observers, modifiers, c_modifierAlt); + WindowObservers_UpdateModifier(observers, modifiers, c_modifierShift); + WindowObservers_UpdateModifier(observers, modifiers, c_modifierControl); } -gboolean modifiers_button_press( GtkWidget* widget, GdkEventButton* event, WindowObservers* observers ){ - if ( event->type == GDK_BUTTON_PRESS ) { - WindowObservers_UpdateModifiers( *observers, modifiers_for_state( event->state ) ); - } - return FALSE; +gboolean modifiers_button_press(ui::Widget widget, GdkEventButton *event, WindowObservers *observers) +{ + if (event->type == GDK_BUTTON_PRESS) { + WindowObservers_UpdateModifiers(*observers, modifiers_for_state(event->state)); + } + return FALSE; } -gboolean modifiers_button_release( GtkWidget* widget, GdkEventButton* event, WindowObservers* observers ){ - if ( event->type == GDK_BUTTON_RELEASE ) { - WindowObservers_UpdateModifiers( *observers, modifiers_for_state( event->state ) ); - } - return FALSE; +gboolean modifiers_button_release(ui::Widget widget, GdkEventButton *event, WindowObservers *observers) +{ + if (event->type == GDK_BUTTON_RELEASE) { + WindowObservers_UpdateModifiers(*observers, modifiers_for_state(event->state)); + } + return FALSE; } -gboolean modifiers_motion( GtkWidget *widget, GdkEventMotion *event, WindowObservers* observers ){ - WindowObservers_UpdateModifiers( *observers, modifiers_for_state( event->state ) ); - return FALSE; +gboolean modifiers_motion(ui::Widget widget, GdkEventMotion *event, WindowObservers *observers) +{ + WindowObservers_UpdateModifiers(*observers, modifiers_for_state(event->state)); + return FALSE; } WindowObservers g_window_observers; -void GlobalWindowObservers_updateModifiers( ModifierFlags modifiers ){ - WindowObservers_UpdateModifiers( g_window_observers, modifiers ); +void GlobalWindowObservers_updateModifiers(ModifierFlags modifiers) +{ + WindowObservers_UpdateModifiers(g_window_observers, modifiers); +} + +void GlobalWindowObservers_add(WindowObserver *observer) +{ + g_window_observers.push_back(observer); } -void GlobalWindowObservers_add( WindowObserver* observer ){ - g_window_observers.push_back( observer ); +void GlobalWindowObservers_connectTopLevel(ui::Window window) +{ + window.connect("key_press_event", G_CALLBACK(selection_modifier_key_press), &g_window_observers); + window.connect("key_release_event", G_CALLBACK(selection_modifier_key_release), &g_window_observers); } -void GlobalWindowObservers_connectTopLevel( GtkWindow* window ){ - g_signal_connect( G_OBJECT( window ), "key_press_event", G_CALLBACK( selection_modifier_key_press ), &g_window_observers ); - g_signal_connect( G_OBJECT( window ), "key_release_event", G_CALLBACK( selection_modifier_key_release ), &g_window_observers ); +void GlobalWindowObservers_connectWidget(ui::Widget widget) +{ + widget.connect("button_press_event", G_CALLBACK(modifiers_button_press), &g_window_observers); + widget.connect("button_release_event", G_CALLBACK(modifiers_button_release), &g_window_observers); + widget.connect("motion_notify_event", G_CALLBACK(modifiers_motion), &g_window_observers); } -void GlobalWindowObservers_connectWidget( GtkWidget* widget ){ - g_signal_connect( G_OBJECT( widget ), "button_press_event", G_CALLBACK( modifiers_button_press ), &g_window_observers ); - g_signal_connect( G_OBJECT( widget ), "button_release_event", G_CALLBACK( modifiers_button_release ), &g_window_observers ); - g_signal_connect( G_OBJECT( widget ), "motion_notify_event", G_CALLBACK( modifiers_motion ), &g_window_observers ); +ModifierFlags modifiers_for_state(unsigned int state) +{ + ModifierFlags modifiers = c_modifierNone; + if (state & GDK_SHIFT_MASK) { + modifiers |= c_modifierShift; + } + if (state & GDK_CONTROL_MASK) { + modifiers |= c_modifierControl; + } + if (state & GDK_MOD1_MASK) { + modifiers |= c_modifierAlt; + } + return modifiers; }