Reinstate mouse scroll actions (audio clocks, shuttle wheel, faders), clearing select...
authorNick Mainsbridge <beatroute@iprimus.com.au>
Mon, 10 Apr 2006 02:14:05 +0000 (02:14 +0000)
committerNick Mainsbridge <beatroute@iprimus.com.au>
Mon, 10 Apr 2006 02:14:05 +0000 (02:14 +0000)
git-svn-id: svn://localhost/trunk/ardour2@449 d708f5d6-7413-0410-9779-e7cbd77b26cf

gtk2_ardour/ardour_ui.h
gtk2_ardour/ardour_ui2.cc
gtk2_ardour/audio_clock.cc
gtk2_ardour/audio_clock.h
gtk2_ardour/editor.cc
gtk2_ardour/editor_canvas_events.cc
gtk2_ardour/editor_mouse.cc
gtk2_ardour/editor_ops.cc
gtk2_ardour/time_axis_view.cc
libs/gtkmm2ext/gtkmm2ext/pixscroller.h
libs/gtkmm2ext/pixscroller.cc

index 9f4d8de8d94ba52c4d8037008cab0f6514106940..bca41f6ca7c65e721c44ab5ed4db4a19537f8ca8 100644 (file)
@@ -408,6 +408,7 @@ class ARDOUR_UI : public Gtkmm2ext::UI
 
        gint shuttle_box_button_press (GdkEventButton*);
        gint shuttle_box_button_release (GdkEventButton*);
+       gint shuttle_box_scroll (GdkEventScroll*);
        gint shuttle_box_motion (GdkEventMotion*);
        gint shuttle_box_expose (GdkEventExpose*);
        gint mouse_shuttle (double x, bool force);
index c55ba08f8ff175f93096d542b576e7197e31fbfd..47b457e59461c7c28ee538b96127103944166b63 100644 (file)
@@ -306,11 +306,12 @@ ARDOUR_UI::setup_transport ()
        ARDOUR_UI::instance()->tooltips().set_tip (speed_display_box, _("Current transport speed"));
        
        shuttle_box.set_flags (CAN_FOCUS);
-       shuttle_box.add_events (Gdk::ENTER_NOTIFY_MASK|Gdk::LEAVE_NOTIFY_MASK|Gdk::BUTTON_RELEASE_MASK|Gdk::BUTTON_PRESS_MASK|Gdk::POINTER_MOTION_MASK);
+       shuttle_box.add_events (Gdk::ENTER_NOTIFY_MASK|Gdk::LEAVE_NOTIFY_MASK|Gdk::BUTTON_RELEASE_MASK|Gdk::BUTTON_PRESS_MASK|Gdk::POINTER_MOTION_MASK|Gdk::SCROLL_MASK);
        shuttle_box.set_size_request (100, 15);
 
        shuttle_box.signal_button_press_event().connect (mem_fun(*this, &ARDOUR_UI::shuttle_box_button_press));
        shuttle_box.signal_button_release_event().connect (mem_fun(*this, &ARDOUR_UI::shuttle_box_button_release));
+       shuttle_box.signal_scroll_event().connect (mem_fun(*this, &ARDOUR_UI::shuttle_box_scroll));
        shuttle_box.signal_motion_notify_event().connect (mem_fun(*this, &ARDOUR_UI::shuttle_box_motion));
        shuttle_box.signal_expose_event().connect (mem_fun(*this, &ARDOUR_UI::shuttle_box_expose));
 
@@ -683,6 +684,28 @@ ARDOUR_UI::shuttle_box_button_release (GdkEventButton* ev)
        return true;
 }
 
+gint
+ARDOUR_UI::shuttle_box_scroll (GdkEventScroll* ev)
+{
+       if (!session) {
+               return true;
+       }
+       
+       switch (ev->direction) {
+               
+       case GDK_SCROLL_UP:
+               shuttle_fract += 0.005;
+               break;
+       case GDK_SCROLL_DOWN:
+               shuttle_fract -= 0.005;
+               break;
+       }
+
+       use_shuttle_fract (true);
+
+       return true;
+}
+
 gint
 ARDOUR_UI::shuttle_box_motion (GdkEventMotion* ev)
 {
index 8ecc160e1a86bb3755092454d2543686f3afd65a..fc9b51075392e07743c87eea51219e4bf447a95a 100644 (file)
@@ -186,7 +186,7 @@ AudioClock::AudioClock (const string& name, bool allow_edit, bool duration, bool
           stays disabled.
        */
 
-       clock_base.add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK);
+       clock_base.add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK|Gdk::SCROLL_MASK);
        clock_base.signal_button_release_event().connect (bind (mem_fun (*this, &AudioClock::field_button_release_event), SMPTE_Hours));
 
        if (editable) {
@@ -201,17 +201,17 @@ AudioClock::setup_events ()
 {
        clock_base.set_flags (Gtk::CAN_FOCUS);
 
-       hours_ebox.add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK|Gdk::KEY_PRESS_MASK|Gdk::KEY_RELEASE_MASK|Gdk::FOCUS_CHANGE_MASK|Gdk::POINTER_MOTION_MASK);
-       minutes_ebox.add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK|Gdk::KEY_PRESS_MASK|Gdk::KEY_RELEASE_MASK|Gdk::FOCUS_CHANGE_MASK|Gdk::POINTER_MOTION_MASK);
-       seconds_ebox.add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK|Gdk::KEY_PRESS_MASK|Gdk::KEY_RELEASE_MASK|Gdk::FOCUS_CHANGE_MASK|Gdk::POINTER_MOTION_MASK);
-       frames_ebox.add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK|Gdk::KEY_PRESS_MASK|Gdk::KEY_RELEASE_MASK|Gdk::FOCUS_CHANGE_MASK|Gdk::POINTER_MOTION_MASK);
-       bars_ebox.add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK|Gdk::KEY_PRESS_MASK|Gdk::KEY_RELEASE_MASK|Gdk::FOCUS_CHANGE_MASK|Gdk::POINTER_MOTION_MASK);
-       beats_ebox.add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK|Gdk::KEY_PRESS_MASK|Gdk::KEY_RELEASE_MASK|Gdk::FOCUS_CHANGE_MASK|Gdk::POINTER_MOTION_MASK);
-       ticks_ebox.add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK|Gdk::KEY_PRESS_MASK|Gdk::KEY_RELEASE_MASK|Gdk::FOCUS_CHANGE_MASK|Gdk::POINTER_MOTION_MASK);
-       ms_hours_ebox.add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK|Gdk::KEY_PRESS_MASK|Gdk::KEY_RELEASE_MASK|Gdk::FOCUS_CHANGE_MASK|Gdk::POINTER_MOTION_MASK);
-       ms_minutes_ebox.add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK|Gdk::KEY_PRESS_MASK|Gdk::KEY_RELEASE_MASK|Gdk::FOCUS_CHANGE_MASK|Gdk::POINTER_MOTION_MASK);
-       ms_seconds_ebox.add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK|Gdk::KEY_PRESS_MASK|Gdk::KEY_RELEASE_MASK|Gdk::FOCUS_CHANGE_MASK|Gdk::POINTER_MOTION_MASK);
-       audio_frames_ebox.add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK|Gdk::KEY_PRESS_MASK|Gdk::KEY_RELEASE_MASK|Gdk::FOCUS_CHANGE_MASK|Gdk::POINTER_MOTION_MASK);
+       hours_ebox.add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK|Gdk::KEY_PRESS_MASK|Gdk::KEY_RELEASE_MASK|Gdk::FOCUS_CHANGE_MASK|Gdk::POINTER_MOTION_MASK|Gdk::SCROLL_MASK);
+       minutes_ebox.add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK|Gdk::KEY_PRESS_MASK|Gdk::KEY_RELEASE_MASK|Gdk::FOCUS_CHANGE_MASK|Gdk::POINTER_MOTION_MASK|Gdk::SCROLL_MASK);
+       seconds_ebox.add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK|Gdk::KEY_PRESS_MASK|Gdk::KEY_RELEASE_MASK|Gdk::FOCUS_CHANGE_MASK|Gdk::POINTER_MOTION_MASK|Gdk::SCROLL_MASK);
+       frames_ebox.add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK|Gdk::KEY_PRESS_MASK|Gdk::KEY_RELEASE_MASK|Gdk::FOCUS_CHANGE_MASK|Gdk::POINTER_MOTION_MASK|Gdk::SCROLL_MASK);
+       bars_ebox.add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK|Gdk::KEY_PRESS_MASK|Gdk::KEY_RELEASE_MASK|Gdk::FOCUS_CHANGE_MASK|Gdk::POINTER_MOTION_MASK|Gdk::SCROLL_MASK);
+       beats_ebox.add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK|Gdk::KEY_PRESS_MASK|Gdk::KEY_RELEASE_MASK|Gdk::FOCUS_CHANGE_MASK|Gdk::POINTER_MOTION_MASK|Gdk::SCROLL_MASK);
+       ticks_ebox.add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK|Gdk::KEY_PRESS_MASK|Gdk::KEY_RELEASE_MASK|Gdk::FOCUS_CHANGE_MASK|Gdk::POINTER_MOTION_MASK|Gdk::SCROLL_MASK);
+       ms_hours_ebox.add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK|Gdk::KEY_PRESS_MASK|Gdk::KEY_RELEASE_MASK|Gdk::FOCUS_CHANGE_MASK|Gdk::POINTER_MOTION_MASK|Gdk::SCROLL_MASK);
+       ms_minutes_ebox.add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK|Gdk::KEY_PRESS_MASK|Gdk::KEY_RELEASE_MASK|Gdk::FOCUS_CHANGE_MASK|Gdk::POINTER_MOTION_MASK|Gdk::SCROLL_MASK);
+       ms_seconds_ebox.add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK|Gdk::KEY_PRESS_MASK|Gdk::KEY_RELEASE_MASK|Gdk::FOCUS_CHANGE_MASK|Gdk::POINTER_MOTION_MASK|Gdk::SCROLL_MASK);
+       audio_frames_ebox.add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK|Gdk::KEY_PRESS_MASK|Gdk::KEY_RELEASE_MASK|Gdk::FOCUS_CHANGE_MASK|Gdk::POINTER_MOTION_MASK|Gdk::SCROLL_MASK);
 
        hours_ebox.set_flags (Gtk::CAN_FOCUS);
        minutes_ebox.set_flags (Gtk::CAN_FOCUS);
@@ -261,6 +261,18 @@ AudioClock::setup_events ()
        ms_minutes_ebox.signal_button_release_event().connect (bind (mem_fun(*this, &AudioClock::field_button_release_event), MS_Minutes));
        ms_seconds_ebox.signal_button_release_event().connect (bind (mem_fun(*this, &AudioClock::field_button_release_event), MS_Seconds));
 
+       hours_ebox.signal_scroll_event().connect (bind (mem_fun(*this, &AudioClock::field_button_scroll_event), SMPTE_Hours));
+       minutes_ebox.signal_scroll_event().connect (bind (mem_fun(*this, &AudioClock::field_button_scroll_event), SMPTE_Minutes));
+       seconds_ebox.signal_scroll_event().connect (bind (mem_fun(*this, &AudioClock::field_button_scroll_event), SMPTE_Seconds));
+       frames_ebox.signal_scroll_event().connect (bind (mem_fun(*this, &AudioClock::field_button_scroll_event), SMPTE_Frames));
+       audio_frames_ebox.signal_scroll_event().connect (bind (mem_fun(*this, &AudioClock::field_button_scroll_event), AudioFrames));
+       bars_ebox.signal_scroll_event().connect (bind (mem_fun(*this, &AudioClock::field_button_scroll_event), Bars));
+       beats_ebox.signal_scroll_event().connect (bind (mem_fun(*this, &AudioClock::field_button_scroll_event), Beats));
+       ticks_ebox.signal_scroll_event().connect (bind (mem_fun(*this, &AudioClock::field_button_scroll_event), Ticks));
+       ms_hours_ebox.signal_scroll_event().connect (bind (mem_fun(*this, &AudioClock::field_button_scroll_event), MS_Hours));
+       ms_minutes_ebox.signal_scroll_event().connect (bind (mem_fun(*this, &AudioClock::field_button_scroll_event), MS_Minutes));
+       ms_seconds_ebox.signal_scroll_event().connect (bind (mem_fun(*this, &AudioClock::field_button_scroll_event), MS_Seconds));
+
        hours_ebox.signal_key_release_event().connect (bind (mem_fun(*this, &AudioClock::field_key_release_event), SMPTE_Hours));
        minutes_ebox.signal_key_release_event().connect (bind (mem_fun(*this, &AudioClock::field_key_release_event), SMPTE_Minutes));
        seconds_ebox.signal_key_release_event().connect (bind (mem_fun(*this, &AudioClock::field_key_release_event), SMPTE_Seconds));
@@ -984,6 +996,51 @@ AudioClock::field_button_press_event (GdkEventButton *ev, Field field)
        return TRUE;
 }
 
+bool
+AudioClock::field_button_scroll_event (GdkEventScroll *ev, Field field)
+{
+       if (session == 0) return FALSE;
+
+       jack_nframes_t frames = 0;
+
+       switch (ev->direction) {
+
+       case GDK_SCROLL_UP:
+              frames = get_frames (field);
+              if (frames != 0) {
+                     if (Keyboard::modifier_state_equals (ev->state, Keyboard::Control)) {
+                            frames *= 10;
+                     }
+                     set (current_time() + frames, true);
+                     ValueChanged (); /* EMIT_SIGNAL */
+              }
+              break;
+
+       case GDK_SCROLL_DOWN:
+              frames = get_frames (field);
+              if (frames != 0) {
+                     if (Keyboard::modifier_state_equals (ev->state, Keyboard::Control)) {
+                            frames *= 10;
+                     }
+                     
+                     if ((double)current_time() - (double)frames < 0.0) {
+                            set (0, true);
+                     } else {
+                            set (current_time() - frames, true);
+                     }
+                     
+                     ValueChanged (); /* EMIT_SIGNAL */
+              }
+              break;
+
+       default:
+               return FALSE;
+               break;
+       }
+       
+       return TRUE;
+}
+
 bool
 AudioClock::field_motion_notify_event (GdkEventMotion *ev, Field field)
 {
index dd06f7cf44f847f42cc042245458c1085dd40124..a0733e7de3acd1d229ee983f2bfc8970f963182a 100644 (file)
@@ -153,6 +153,7 @@ class AudioClock : public Gtk::HBox
        bool field_motion_notify_event (GdkEventMotion *ev, Field);
        bool field_button_press_event (GdkEventButton *ev, Field);
        bool field_button_release_event (GdkEventButton *ev, Field);
+       bool field_button_scroll_event (GdkEventScroll *ev, Field);
        bool field_key_release_event (GdkEventKey *, Field);
        bool field_focus_in_event (GdkEventFocus *, Field);
        bool field_focus_out_event (GdkEventFocus *, Field);
index 5cae99e369a835e083e8aed94ca04f919559dd25..2b0bbee1aeaa22e85c29881d0fa0b20020936ca9 100644 (file)
@@ -966,7 +966,7 @@ Editor::control_scroll (float fraction)
        } else if ((fraction > 0.0f) && (max_frames - session->transport_frame() < step)) {
                target = (max_frames - (current_page_frames()*2)); // allow room for slop in where the PH is on the screen
        } else {
-               target = (session->transport_frame() + (fraction * current_page_frames()));
+               target = (session->transport_frame() + (jack_nframes_t)(fraction * current_page_frames()));
        }
 
        /* move visuals, we'll catch up with it later */
index 824b547938c177ce54b6898c2011bcbfcd11d646..256920d32f2c247bfaee55718e3e06323a858ee8 100644 (file)
@@ -49,7 +49,7 @@ Editor::track_canvas_scroll (GdkEventScroll* ev)
 {
        int x, y;
        double wx, wy;
-       
+
        switch (ev->direction) {
        case GDK_SCROLL_UP:
          if (Keyboard::modifier_state_equals (ev->state, Keyboard::Control)) {
@@ -72,6 +72,16 @@ Editor::track_canvas_scroll (GdkEventScroll* ev)
                jack_nframes_t where = event_frame (&event, 0, 0);
                temporal_zoom_to_frame (true, where);
                return true;
+         } else if (Keyboard::modifier_state_equals (ev->state, Keyboard::Shift)) {
+               if (!current_stepping_trackview) {
+                       step_timeout = Glib::signal_timeout().connect (mem_fun(*this, &Editor::track_height_step_timeout), 500);
+                       if (!(current_stepping_trackview = dynamic_cast<AudioTimeAxisView*> (trackview_by_y_position (ev->y)))) {
+                             return false;
+                       }
+               }
+               gettimeofday (&last_track_height_step_timestamp, 0);
+               current_stepping_trackview->step_height (true);
+               return true;
          } else {
                scroll_tracks_up_line ();
                return true;
@@ -94,15 +104,15 @@ Editor::track_canvas_scroll (GdkEventScroll* ev)
                temporal_zoom_to_frame (false, where);
                return true;
          } else if (Keyboard::modifier_state_equals (ev->state, Keyboard::Shift)) {
-               if (clicked_trackview) {
-                 if (!current_stepping_trackview) {
-                   step_timeout = Glib::signal_timeout().connect (mem_fun(*this, &Editor::track_height_step_timeout), 500);
-                   current_stepping_trackview = clicked_trackview;
-                 }
-                 gettimeofday (&last_track_height_step_timestamp, 0);
-                 current_stepping_trackview->step_height (true);
+               if (!current_stepping_trackview) {
+                       step_timeout = Glib::signal_timeout().connect (mem_fun(*this, &Editor::track_height_step_timeout), 500);
+                       if (!(current_stepping_trackview = dynamic_cast<AudioTimeAxisView*> (trackview_by_y_position (ev->y)))) {
+                               return false;
+                       }
                }
-               return true;
+               gettimeofday (&last_track_height_step_timestamp, 0);
+               current_stepping_trackview->step_height (false);
+           return true;
          } else {
                scroll_tracks_down_line ();
                return true;
index 4569b39182c8ff1fe45a6a7249b1c03ce6b72c6d..efb6f9efe823583416cab58ac50e08e49d55a2bf 100644 (file)
@@ -3609,11 +3609,13 @@ Editor::start_selection_grab (ArdourCanvas::Item* item, GdkEvent* event)
 void
 Editor::cancel_selection ()
 {
-       for (TrackViewList::iterator i = track_views.begin(); i != track_views.end(); ++i) {
+        for (TrackViewList::iterator i = track_views.begin(); i != track_views.end(); ++i) {
                (*i)->hide_selection ();
        }
+       begin_reversible_command (_("cancel selection"));
        selection->clear ();
        clicked_selection = 0;
+       commit_reversible_command ();
 }      
 
 void
index e5e16381abe313acffbe7745d6dcc645cad7e972..192269eb15bc3d6ff909d2b5b177491b918150a2 100644 (file)
@@ -984,7 +984,12 @@ Editor::scroll_tracks_down ()
                cnt = (int) floor (prefix);
        }
 
-       vertical_adjustment.set_value (vertical_adjustment.get_value() + (cnt * vertical_adjustment.get_page_size()));
+       double vert_value = vertical_adjustment.get_value() + (cnt *
+               vertical_adjustment.get_page_size());
+       if (vert_value > vertical_adjustment.get_upper() - canvas_height) {
+               vert_value = vertical_adjustment.get_upper() - canvas_height;
+       }
+       vertical_adjustment.set_value (vert_value);
 }
 
 void
@@ -1006,15 +1011,21 @@ Editor::scroll_tracks_up ()
 void
 Editor::scroll_tracks_down_line ()
 {
+
         Gtk::Adjustment* adj = edit_vscrollbar.get_adjustment();
-       adj->set_value (adj->get_value() + 10);
+       double vert_value = adj->get_value() + 20;
+
+       if (vert_value>adj->get_upper() - canvas_height) {
+               vert_value = adj->get_upper() - canvas_height;
+       }
+       adj->set_value (vert_value);
 }
 
 void
 Editor::scroll_tracks_up_line ()
 {
         Gtk::Adjustment* adj = edit_vscrollbar.get_adjustment();
-       adj->set_value (adj->get_value() - 10);
+       adj->set_value (adj->get_value() - 20);
 }
 
 /* ZOOM */
index fc467bee3dfffb140cd704a3932801d87b159d23..1b6c1f390c8e8f9ebf80a313fea80665d76d2fcf 100644 (file)
@@ -244,14 +244,14 @@ TimeAxisView::controls_ebox_scroll (GdkEventScroll* ev)
 {
        switch (ev->direction) {
        case GDK_SCROLL_UP:
-               if (Keyboard::modifier_state_equals (ev->state, Keyboard::Control)) {
+               if (Keyboard::modifier_state_equals (ev->state, Keyboard::Shift)) {
                        step_height (true);
                        return true;
                }
                break;
                
        case GDK_SCROLL_DOWN:
-               if (Keyboard::modifier_state_equals (ev->state, Keyboard::Control)) {
+               if (Keyboard::modifier_state_equals (ev->state, Keyboard::Shift)) {
                        step_height (false);
                        return true;
                }
@@ -328,30 +328,35 @@ TimeAxisView::hide ()
 void
 TimeAxisView::step_height (bool bigger)
 {
-       switch (height) {
-       case Largest:
-               if (!bigger) set_height (Large);
-               break;
-       case Large:
-               if (bigger) set_height (Largest);
-               else set_height (Larger);
-               break;
-       case Larger:
-               if (bigger) set_height (Large);
-               else set_height (Normal);
-               break;
-       case Normal:
-               if (bigger) set_height (Larger);
-               else set_height (Smaller);
-               break;
-       case Smaller:
-               if (bigger) set_height (Normal);
-               else set_height (Small);
-               break;
-       case Small:
-               if (bigger) set_height (Smaller);
-               break;
-       }
+  
+       if (height == hLargest) {
+               if (!bigger) set_height (Large);
+               return;
+       }
+       if (height == hLarge) {
+               if (bigger) set_height (Largest);
+                else set_height (Larger);
+               return;
+       }
+       if (height == hLarger) {
+                if (bigger) set_height (Large);
+                else set_height (Normal);
+               return;
+       }
+       if (height == hNormal) {
+                if (bigger) set_height (Larger);
+                else set_height (Smaller);
+               return;
+       }
+       if (height == hSmaller) {
+                if (bigger) set_height (Normal);
+                else set_height (Small);
+               return;
+       }
+       if (height == hSmall) {
+                if (bigger) set_height (Smaller);
+               return;
+       }
 }
 
 void
index 4bc13ef173d0b09377972a1c14c10b8ab305ba00..8739478a8fd5b912269486322fc0ddfd0d2488f6 100644 (file)
@@ -18,6 +18,7 @@ class PixScroller : public Gtk::DrawingArea
        bool on_motion_notify_event (GdkEventMotion*);
        bool on_button_press_event (GdkEventButton*);
        bool on_button_release_event (GdkEventButton*);
+       bool on_scroll_event (GdkEventScroll*);
        void on_size_request (GtkRequisition*);
 
   protected:
index 813b4fd7f6c1a7a11a4f10319c6831ac02ac588f..f459726f274820caa910d180ab55620dbe39c571 100644 (file)
@@ -176,11 +176,34 @@ PixScroller::on_button_release_event (GdkEventButton* ev)
                        }
                }
                break;
-       case 4:
+       default:
+               break;
+       }
+       return false;
+}
+
+bool
+PixScroller::on_scroll_event (GdkEventScroll* ev)
+{
+       double scale;
+       
+       if (ev->state & GDK_CONTROL_MASK) {
+               if (ev->state & GDK_MOD1_MASK) {
+                       scale = 0.05;
+               } else {
+                       scale = 0.1;
+               }
+       } else {
+               scale = 0.5;
+       }
+
+       switch (ev->direction) {
+
+       case GDK_SCROLL_UP:
                /* wheel up */
                adj.set_value (adj.get_value() + (adj.get_page_increment() * scale));
                break;
-       case 5:
+       case GDK_SCROLL_DOWN:
                /* wheel down */
                adj.set_value (adj.get_value() - (adj.get_page_increment() * scale));
                break;