summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gtk2_ardour/ardour_ui.h1
-rw-r--r--gtk2_ardour/ardour_ui2.cc25
-rw-r--r--gtk2_ardour/audio_clock.cc81
-rw-r--r--gtk2_ardour/audio_clock.h1
-rw-r--r--gtk2_ardour/editor.cc2
-rw-r--r--gtk2_ardour/editor_canvas_events.cc28
-rw-r--r--gtk2_ardour/editor_mouse.cc4
-rw-r--r--gtk2_ardour/editor_ops.cc17
-rw-r--r--gtk2_ardour/time_axis_view.cc57
-rw-r--r--libs/gtkmm2ext/gtkmm2ext/pixscroller.h1
-rw-r--r--libs/gtkmm2ext/pixscroller.cc27
11 files changed, 189 insertions, 55 deletions
diff --git a/gtk2_ardour/ardour_ui.h b/gtk2_ardour/ardour_ui.h
index 9f4d8de8d9..bca41f6ca7 100644
--- a/gtk2_ardour/ardour_ui.h
+++ b/gtk2_ardour/ardour_ui.h
@@ -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);
diff --git a/gtk2_ardour/ardour_ui2.cc b/gtk2_ardour/ardour_ui2.cc
index c55ba08f8f..47b457e594 100644
--- a/gtk2_ardour/ardour_ui2.cc
+++ b/gtk2_ardour/ardour_ui2.cc
@@ -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));
@@ -684,6 +685,28 @@ ARDOUR_UI::shuttle_box_button_release (GdkEventButton* ev)
}
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)
{
if (!session || !shuttle_grabbed) {
diff --git a/gtk2_ardour/audio_clock.cc b/gtk2_ardour/audio_clock.cc
index 8ecc160e1a..fc9b510753 100644
--- a/gtk2_ardour/audio_clock.cc
+++ b/gtk2_ardour/audio_clock.cc
@@ -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));
@@ -985,6 +997,51 @@ AudioClock::field_button_press_event (GdkEventButton *ev, Field field)
}
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)
{
if (session == 0 || !dragging) {
diff --git a/gtk2_ardour/audio_clock.h b/gtk2_ardour/audio_clock.h
index dd06f7cf44..a0733e7de3 100644
--- a/gtk2_ardour/audio_clock.h
+++ b/gtk2_ardour/audio_clock.h
@@ -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);
diff --git a/gtk2_ardour/editor.cc b/gtk2_ardour/editor.cc
index 5cae99e369..2b0bbee1ae 100644
--- a/gtk2_ardour/editor.cc
+++ b/gtk2_ardour/editor.cc
@@ -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 */
diff --git a/gtk2_ardour/editor_canvas_events.cc b/gtk2_ardour/editor_canvas_events.cc
index 824b547938..256920d32f 100644
--- a/gtk2_ardour/editor_canvas_events.cc
+++ b/gtk2_ardour/editor_canvas_events.cc
@@ -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;
diff --git a/gtk2_ardour/editor_mouse.cc b/gtk2_ardour/editor_mouse.cc
index 4569b39182..efb6f9efe8 100644
--- a/gtk2_ardour/editor_mouse.cc
+++ b/gtk2_ardour/editor_mouse.cc
@@ -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
diff --git a/gtk2_ardour/editor_ops.cc b/gtk2_ardour/editor_ops.cc
index e5e16381ab..192269eb15 100644
--- a/gtk2_ardour/editor_ops.cc
+++ b/gtk2_ardour/editor_ops.cc
@@ -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 */
diff --git a/gtk2_ardour/time_axis_view.cc b/gtk2_ardour/time_axis_view.cc
index fc467bee3d..1b6c1f390c 100644
--- a/gtk2_ardour/time_axis_view.cc
+++ b/gtk2_ardour/time_axis_view.cc
@@ -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
diff --git a/libs/gtkmm2ext/gtkmm2ext/pixscroller.h b/libs/gtkmm2ext/gtkmm2ext/pixscroller.h
index 4bc13ef173..8739478a8f 100644
--- a/libs/gtkmm2ext/gtkmm2ext/pixscroller.h
+++ b/libs/gtkmm2ext/gtkmm2ext/pixscroller.h
@@ -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:
diff --git a/libs/gtkmm2ext/pixscroller.cc b/libs/gtkmm2ext/pixscroller.cc
index 813b4fd7f6..f459726f27 100644
--- a/libs/gtkmm2ext/pixscroller.cc
+++ b/libs/gtkmm2ext/pixscroller.cc
@@ -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;