diff options
Diffstat (limited to 'libs/gtkmm2ext')
-rw-r--r-- | libs/gtkmm2ext/SConscript | 4 | ||||
-rw-r--r-- | libs/gtkmm2ext/barcontroller.cc | 74 | ||||
-rw-r--r-- | libs/gtkmm2ext/focus_entry.cc | 31 | ||||
-rw-r--r-- | libs/gtkmm2ext/gtkmm2ext/barcontroller.h | 22 | ||||
-rw-r--r-- | libs/gtkmm2ext/gtkmm2ext/focus_entry.h | 22 | ||||
-rw-r--r-- | libs/gtkmm2ext/gtkmm2ext/pixfader.h | 70 | ||||
-rw-r--r-- | libs/gtkmm2ext/gtkmm2ext/slider_controller.h | 13 | ||||
-rw-r--r-- | libs/gtkmm2ext/pixfader.cc | 249 | ||||
-rw-r--r-- | libs/gtkmm2ext/prompter.cc | 2 | ||||
-rw-r--r-- | libs/gtkmm2ext/slider_controller.cc | 21 | ||||
-rw-r--r-- | libs/gtkmm2ext/tearoff.cc | 8 |
11 files changed, 449 insertions, 67 deletions
diff --git a/libs/gtkmm2ext/SConscript b/libs/gtkmm2ext/SConscript index e654b6cb52..9c7511c85d 100644 --- a/libs/gtkmm2ext/SConscript +++ b/libs/gtkmm2ext/SConscript @@ -39,10 +39,12 @@ choice.cc click_box.cc dndtreeview.cc fastmeter.cc +focus_entry.cc gtk_ui.cc hexentry.cc idle_adjustment.cc pathlist.cc +pixfader.cc pixscroller.cc popup.cc prompter.cc @@ -67,7 +69,7 @@ Default(libgtkmm2ext) if env['NLS']: i18n (gtkmm2ext, gtkmm2ext_files, env) -env.Alias('install', env.Install(os.path.join(install_prefix, 'lib/ardour2'), libgtkmm2ext)) +env.Alias('install', env.Install(os.path.join(install_prefix, env['LIBDIR'], 'ardour2'), libgtkmm2ext)) env.Alias('tarball', env.Distribute (env['DISTTREE'], [ 'SConscript', 'i18n.h', 'gettext.h'] + diff --git a/libs/gtkmm2ext/barcontroller.cc b/libs/gtkmm2ext/barcontroller.cc index 734c4b77e2..f59d192ff1 100644 --- a/libs/gtkmm2ext/barcontroller.cc +++ b/libs/gtkmm2ext/barcontroller.cc @@ -70,8 +70,8 @@ BarController::BarController (Gtk::Adjustment& adj, darea.signal_expose_event().connect (mem_fun (*this, &BarController::expose)); darea.signal_motion_notify_event().connect (mem_fun (*this, &BarController::motion)); - darea.signal_button_press_event().connect (mem_fun (*this, &BarController::button_press)); - darea.signal_button_release_event().connect (mem_fun (*this, &BarController::button_release)); + darea.signal_button_press_event().connect (mem_fun (*this, &BarController::button_press), false); + darea.signal_button_release_event().connect (mem_fun (*this, &BarController::button_release), false); darea.signal_scroll_event().connect (mem_fun (*this, &BarController::scroll)); spinner.signal_activate().connect (mem_fun (*this, &BarController::entry_activated)); @@ -82,9 +82,21 @@ BarController::BarController (Gtk::Adjustment& adj, show_all (); } +void +BarController::drop_grab () +{ + if (grabbed) { + grabbed = false; + darea.remove_modal_grab(); + StopGesture (); + } +} + bool BarController::button_press (GdkEventButton* ev) { + double fract; + if (binding_proxy.button_press_handler (ev)) { return true; } @@ -93,8 +105,7 @@ BarController::button_press (GdkEventButton* ev) case 1: if (ev->type == GDK_2BUTTON_PRESS) { switch_on_release = true; - grabbed = false; - darea.remove_modal_grab(); + drop_grab (); } else { switch_on_release = false; darea.add_modal_grab(); @@ -107,6 +118,9 @@ BarController::button_press (GdkEventButton* ev) break; case 2: + fract = ev->x / (darea.get_width() - 2.0); + adjustment.set_value (adjustment.get_lower() + fract * (adjustment.get_upper() - adjustment.get_lower())); + case 3: break; @@ -121,6 +135,8 @@ BarController::button_press (GdkEventButton* ev) bool BarController::button_release (GdkEventButton* ev) { + drop_grab (); + switch (ev->button) { case 1: if (switch_on_release) { @@ -143,23 +159,11 @@ BarController::button_release (GdkEventButton* ev) mouse_control (ev->x, ev->window, scale); } - darea.remove_modal_grab(); - grabbed = false; - StopGesture (); - grabbed = false; break; case 2: - if (true) { // XXX FIX ME - /* relax */ - } else { - double fract; - fract = ev->x / (darea.get_width() - 2.0); - adjustment.set_value (adjustment.get_lower() + - fract * (adjustment.get_upper() - adjustment.get_lower())); - } - return true; - + break; + case 3: return false; @@ -204,7 +208,7 @@ BarController::motion (GdkEventMotion* ev) double scale; if (!grabbed) { - return TRUE; + return true; } if ((ev->state & (GDK_SHIFT_MASK|GDK_CONTROL_MASK)) == GDK_SHIFT_MASK) { @@ -225,7 +229,7 @@ BarController::motion (GdkEventMotion* ev) gint BarController::mouse_control (double x, GdkWindow* window, double scaling) { - double fract; + double fract = 0.0; double delta; if (window != grab_window) { @@ -259,7 +263,7 @@ BarController::expose (GdkEventExpose* event) { Glib::RefPtr<Gdk::Window> win (darea.get_window()); Widget* parent; - gint x1, x2, y1, y2; + gint x1=0, x2=0, y1=0, y2=0; gint w, h; double fract; @@ -271,6 +275,7 @@ BarController::expose (GdkEventExpose* event) switch (_style) { case Line: + h = darea.get_height(); x1 = (gint) floor (w * fract); x2 = x1; y1 = 0; @@ -281,22 +286,18 @@ BarController::expose (GdkEventExpose* event) if (parent) { win->draw_rectangle (parent->get_style()->get_fg_gc (parent->get_state()), - true, - 0, 0, darea.get_width(), darea.get_height()); + true, + 0, 0, darea.get_width(), darea.get_height()); } - } else { - win->draw_rectangle (get_style()->get_bg_gc (get_state()), - true, - 0, 0, darea.get_width(), darea.get_height()); - } - if (fract == 0.0) { - win->draw_rectangle (get_style()->get_fg_gc (get_state()), - true, x1, 1, 2, darea.get_height() - 2); } else { - win->draw_rectangle (get_style()->get_fg_gc (get_state()), - true, x1 - 1, 1, 3, darea.get_height() - 2); + + win->draw_rectangle (get_style()->get_bg_gc (get_state()), + true, + 0, 0, darea.get_width() - ((darea.get_width()+1) % 2), darea.get_height()); } + + win->draw_line (get_style()->get_fg_gc (get_state()), x1, 0, x1, h); break; case CenterOut: @@ -456,3 +457,10 @@ BarController::set_use_parent (bool yn) use_parent = yn; queue_draw (); } + +void +BarController::set_sensitive (bool yn) +{ + Frame::set_sensitive (yn); + darea.set_sensitive (yn); +} diff --git a/libs/gtkmm2ext/focus_entry.cc b/libs/gtkmm2ext/focus_entry.cc new file mode 100644 index 0000000000..dbe833d06b --- /dev/null +++ b/libs/gtkmm2ext/focus_entry.cc @@ -0,0 +1,31 @@ +#include <gtkmm2ext/focus_entry.h> + +using namespace Gtkmm2ext; + +FocusEntry::FocusEntry () +{ + next_release_selects = false; +} + +bool +FocusEntry::on_button_press_event (GdkEventButton* ev) +{ + if (!has_focus()) { + next_release_selects = true; + } + return Entry::on_button_press_event (ev); +} + +bool +FocusEntry::on_button_release_event (GdkEventButton* ev) +{ + if (next_release_selects) { + bool ret = Entry::on_button_release_event (ev); + select_region (0, -1); + next_release_selects = false; + return ret; + } + + return Entry::on_button_release_event (ev); +} + diff --git a/libs/gtkmm2ext/gtkmm2ext/barcontroller.h b/libs/gtkmm2ext/gtkmm2ext/barcontroller.h index ebce4e2de9..e5b8e31b58 100644 --- a/libs/gtkmm2ext/gtkmm2ext/barcontroller.h +++ b/libs/gtkmm2ext/gtkmm2ext/barcontroller.h @@ -20,7 +20,8 @@ #ifndef __gtkmm2ext_bar_controller_h__ #define __gtkmm2ext_bar_controller_h__ -#include <gtkmm.h> +#include <gtkmm/frame.h> +#include <gtkmm/drawingarea.h> #include <gtkmm2ext/binding_proxy.h> namespace ARDOUR { @@ -35,10 +36,6 @@ class BarController : public Gtk::Frame BarController (Gtk::Adjustment& adj, PBD::Controllable&, sigc::slot<void,char*,unsigned int>); virtual ~BarController () {} - void set_sensitive (bool yn) { - darea.set_sensitive (yn); - } - enum Style { LeftToRight, RightToLeft, @@ -53,6 +50,8 @@ class BarController : public Gtk::Frame void set_with_text (bool yn); void set_use_parent (bool yn); + void set_sensitive (bool yn); + Gtk::SpinButton& get_spin_button() { return spinner; } sigc::signal<void> StartGesture; @@ -79,12 +78,12 @@ class BarController : public Gtk::Frame Gtk::SpinButton spinner; bool use_parent; - bool button_press (GdkEventButton *); - bool button_release (GdkEventButton *); - bool motion (GdkEventMotion *); - bool expose (GdkEventExpose *); - bool scroll (GdkEventScroll *); - bool entry_focus_out (GdkEventFocus*); + virtual bool button_press (GdkEventButton *); + virtual bool button_release (GdkEventButton *); + virtual bool motion (GdkEventMotion *); + virtual bool expose (GdkEventExpose *); + virtual bool scroll (GdkEventScroll *); + virtual bool entry_focus_out (GdkEventFocus*); gint mouse_control (double x, GdkWindow* w, double scaling); @@ -92,6 +91,7 @@ class BarController : public Gtk::Frame gint switch_to_spinner (); void entry_activated (); + void drop_grab (); }; diff --git a/libs/gtkmm2ext/gtkmm2ext/focus_entry.h b/libs/gtkmm2ext/gtkmm2ext/focus_entry.h new file mode 100644 index 0000000000..5d9d7fdac7 --- /dev/null +++ b/libs/gtkmm2ext/gtkmm2ext/focus_entry.h @@ -0,0 +1,22 @@ +#ifndef __gtkmm2ext_focus_entry_h__ +#define __gtkmm2ext_focus_entry_h__ + +#include <gtkmm/entry.h> + +namespace Gtkmm2ext { + +class FocusEntry : public Gtk::Entry +{ + public: + FocusEntry (); + + protected: + bool on_button_press_event (GdkEventButton*); + bool on_button_release_event (GdkEventButton*); + private: + bool next_release_selects; +}; + +} + +#endif /* __gtkmm2ext_focus_entry_h__ */ diff --git a/libs/gtkmm2ext/gtkmm2ext/pixfader.h b/libs/gtkmm2ext/gtkmm2ext/pixfader.h new file mode 100644 index 0000000000..bb4176240a --- /dev/null +++ b/libs/gtkmm2ext/gtkmm2ext/pixfader.h @@ -0,0 +1,70 @@ +/* + Copyright (C) 2006 Paul Davis + + This program 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 2 of the License, or + (at your option) any later version. + + This program 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 this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + $Id: fastmeter.h 570 2006-06-07 21:21:21Z sampo $ +*/ + +#ifndef __gtkmm2ext_pixfader_h__ +#define __gtkmm2ext_pixfader_h__ + +#include <cmath> + +#include <gtkmm/drawingarea.h> +#include <gtkmm/adjustment.h> +#include <gdkmm/pixbuf.h> + +namespace Gtkmm2ext { + +class PixFader : public Gtk::DrawingArea { + public: + PixFader (Glib::RefPtr<Gdk::Pixbuf> belt_image, Gtk::Adjustment& adjustment); + virtual ~PixFader (); + + protected: + Gtk::Adjustment& adjustment; + + void on_size_request (GtkRequisition*); + + bool on_expose_event (GdkEventExpose*); + bool on_button_press_event (GdkEventButton*); + bool on_button_release_event (GdkEventButton*); + bool on_motion_notify_event (GdkEventMotion*); + bool on_scroll_event (GdkEventScroll* ev); + + private: + Glib::RefPtr<Gdk::Pixbuf> pixbuf; + gint pixheight; + + GdkRectangle view; + + GdkWindow* grab_window; + double grab_y; + double grab_start; + int last_drawn; + bool dragging; + float default_value; + int unity_y; + + void adjustment_changed (); + + int display_height (); +}; + + +} /* namespace */ + + #endif /* __gtkmm2ext_pixfader_h__ */ diff --git a/libs/gtkmm2ext/gtkmm2ext/slider_controller.h b/libs/gtkmm2ext/gtkmm2ext/slider_controller.h index f0f645eab7..c137dbabf5 100644 --- a/libs/gtkmm2ext/gtkmm2ext/slider_controller.h +++ b/libs/gtkmm2ext/gtkmm2ext/slider_controller.h @@ -22,7 +22,7 @@ #include <gtkmm.h> #include <gtkmm2ext/popup.h> -#include <gtkmm2ext/pixscroller.h> +#include <gtkmm2ext/pixfader.h> #include <gtkmm2ext/binding_proxy.h> namespace Gtkmm2ext { @@ -35,11 +35,10 @@ namespace PBD { namespace Gtkmm2ext { -class SliderController : public Gtkmm2ext::PixScroller +class SliderController : public Gtkmm2ext::PixFader { public: - SliderController (Glib::RefPtr<Gdk::Pixbuf> slider, - Glib::RefPtr<Gdk::Pixbuf> rail, + SliderController (Glib::RefPtr<Gdk::Pixbuf> image, Gtk::Adjustment* adj, PBD::Controllable&, bool with_numeric = true); @@ -64,8 +63,7 @@ class SliderController : public Gtkmm2ext::PixScroller class VSliderController : public SliderController { public: - VSliderController (Glib::RefPtr<Gdk::Pixbuf> slider, - Glib::RefPtr<Gdk::Pixbuf> rail, + VSliderController (Glib::RefPtr<Gdk::Pixbuf> image, Gtk::Adjustment *adj, PBD::Controllable&, bool with_numeric = true); @@ -74,8 +72,7 @@ class VSliderController : public SliderController class HSliderController : public SliderController { public: - HSliderController (Glib::RefPtr<Gdk::Pixbuf> slider, - Glib::RefPtr<Gdk::Pixbuf> rail, + HSliderController (Glib::RefPtr<Gdk::Pixbuf> image, Gtk::Adjustment *adj, PBD::Controllable&, bool with_numeric = true); diff --git a/libs/gtkmm2ext/pixfader.cc b/libs/gtkmm2ext/pixfader.cc new file mode 100644 index 0000000000..f3a40ffc69 --- /dev/null +++ b/libs/gtkmm2ext/pixfader.cc @@ -0,0 +1,249 @@ +/* + Copyright (C) 2006 Paul Davis + + This program 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 2 of the License, or + (at your option) any later version. + + This program 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 this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + $Id: fastmeter.h 570 2006-06-07 21:21:21Z sampo $ +*/ + + +#include <iostream> +#include <gtkmm2ext/pixfader.h> + +using namespace Gtkmm2ext; +using namespace Gtk; +using namespace Gdk; +using namespace std; + +PixFader::PixFader (Glib::RefPtr<Pixbuf> belt, Gtk::Adjustment& adj) + : adjustment (adj), + pixbuf (belt) +{ + dragging = false; + default_value = adjustment.get_value(); + last_drawn = -1; + pixheight = pixbuf->get_height(); + + view.x = 0; + view.y = 0; + view.width = pixbuf->get_width(); + view.height = pixheight / 2; + + unity_y = (int) rint (view.height - (default_value * view.height)) - 1; + + add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK|Gdk::POINTER_MOTION_MASK|Gdk::SCROLL_MASK); + + adjustment.signal_value_changed().connect (mem_fun (*this, &PixFader::adjustment_changed)); + adjustment.signal_changed().connect (mem_fun (*this, &PixFader::adjustment_changed)); +} + +PixFader::~PixFader () +{ +} + +bool +PixFader::on_expose_event (GdkEventExpose* ev) +{ + GdkRectangle intersection; + int dh = display_height (); + int offset_into_pixbuf = (int) floor (view.height / ((float) view.height / dh)); + Glib::RefPtr<Gdk::GC> fg_gc (get_style()->get_fg_gc(get_state())); + + if (gdk_rectangle_intersect (&view, &ev->area, &intersection)) { + get_window()->draw_pixbuf (fg_gc, pixbuf, + intersection.x, offset_into_pixbuf + intersection.y, + intersection.x, intersection.y, + intersection.width, intersection.height, + Gdk::RGB_DITHER_NONE, 0, 0); + + get_window()->draw_line (get_style()->get_bg_gc(STATE_ACTIVE), 0, 0, view.width - 1, 0); /* top */ + get_window()->draw_line (get_style()->get_bg_gc(STATE_ACTIVE), 0, 0, 0, view.height - 1); /* left */ + get_window()->draw_line (get_style()->get_bg_gc(STATE_NORMAL), view.width - 1, 0, view.width - 1, view.height - 1); /* right */ + get_window()->draw_line (get_style()->get_bg_gc(STATE_NORMAL), 0, view.height - 1, view.width - 1, view.height - 1); /* bottom */ + } + + /* always draw the line */ + + get_window()->draw_line (fg_gc, 1, unity_y, view.width - 2, unity_y); + + last_drawn = dh; + return true; +} + +void +PixFader::on_size_request (GtkRequisition* req) +{ + req->width = view.width; + req->height = view.height; +} + +bool +PixFader::on_button_press_event (GdkEventButton* ev) +{ + switch (ev->button) { + case 1: + case 2: + add_modal_grab(); + grab_y = ev->y; + grab_start = ev->y; + grab_window = ev->window; + dragging = true; + break; + default: + break; + } + + + return false; +} + +bool +PixFader::on_button_release_event (GdkEventButton* ev) +{ + double fract; + + switch (ev->button) { + case 1: + if (dragging) { + remove_modal_grab(); + dragging = false; + + if (ev->y == grab_start) { + + /* no motion - just a click */ + + if (ev->state & Gdk::SHIFT_MASK) { + adjustment.set_value (default_value); + } else if (ev->state & GDK_CONTROL_MASK) { + adjustment.set_value (adjustment.get_lower()); + } else if (ev->y < view.height - display_height()) { + /* above the current display height, remember X Window coords */ + adjustment.set_value (adjustment.get_value() + adjustment.get_step_increment()); + } else { + adjustment.set_value (adjustment.get_value() - adjustment.get_step_increment()); + } + } + + } + break; + + case 2: + if (dragging) { + remove_modal_grab(); + dragging = false; + + fract = 1.0 - (ev->y / view.height); // inverted X Window coordinates, grrr + + fract = min (1.0, fract); + fract = max (0.0, fract); + + adjustment.set_value (fract * (adjustment.get_upper() - adjustment.get_lower())); + } + break; + + default: + break; + } + + return false; +} + +bool +PixFader::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 */ + adjustment.set_value (adjustment.get_value() + (adjustment.get_page_increment() * scale)); + break; + case GDK_SCROLL_DOWN: + /* wheel down */ + adjustment.set_value (adjustment.get_value() - (adjustment.get_page_increment() * scale)); + break; + default: + break; + } + return false; +} + +bool +PixFader::on_motion_notify_event (GdkEventMotion* ev) +{ + if (dragging) { + double fract; + double delta; + double scale; + + if (ev->window != grab_window) { + grab_y = ev->y; + grab_window = ev->window; + return true; + } + + if (ev->state & GDK_CONTROL_MASK) { + if (ev->state & GDK_MOD1_MASK) { + scale = 0.05; + } else { + scale = 0.1; + } + } else { + scale = 1.0; + } + + delta = ev->y - grab_y; + grab_y = ev->y; + + fract = (delta / view.height); + + fract = min (1.0, fract); + fract = max (-1.0, fract); + + // X Window is top->bottom for 0..Y + + fract = -fract; + + adjustment.set_value (adjustment.get_value() + scale * fract * (adjustment.get_upper() - adjustment.get_lower())); + } + + return true; +} + +void +PixFader::adjustment_changed () +{ + if (display_height() != last_drawn) { + queue_draw (); + } +} + +int +PixFader::display_height () +{ + float fract = (adjustment.get_upper() - adjustment.get_value ()) / ((adjustment.get_upper() - adjustment.get_lower())); + return (int) floor (view.height * (1.0 - fract)); +} diff --git a/libs/gtkmm2ext/prompter.cc b/libs/gtkmm2ext/prompter.cc index c3a04f19a8..d06204d356 100644 --- a/libs/gtkmm2ext/prompter.cc +++ b/libs/gtkmm2ext/prompter.cc @@ -86,7 +86,7 @@ Prompter::get_result (string &str, bool strip) { str = entry.get_text (); if (strip) { - strip_whitespace_edges (str); + PBD::strip_whitespace_edges (str); } } diff --git a/libs/gtkmm2ext/slider_controller.cc b/libs/gtkmm2ext/slider_controller.cc index e524eba1cb..3e2b42f409 100644 --- a/libs/gtkmm2ext/slider_controller.cc +++ b/libs/gtkmm2ext/slider_controller.cc @@ -20,7 +20,7 @@ #include <string> #include <gtkmm2ext/gtk_ui.h> -#include <gtkmm2ext/pixscroller.h> +#include <gtkmm2ext/pixfader.h> #include <gtkmm2ext/slider_controller.h> #include "i18n.h" @@ -28,13 +28,12 @@ using namespace Gtkmm2ext; using namespace PBD; -SliderController::SliderController (Glib::RefPtr<Gdk::Pixbuf> slide, - Glib::RefPtr<Gdk::Pixbuf> rail, +SliderController::SliderController (Glib::RefPtr<Gdk::Pixbuf> image, Gtk::Adjustment *adj, Controllable& c, bool with_numeric) - : PixScroller (*adj, slide, rail), + : PixFader (image, *adj), binding_proxy (c), spin (*adj, 0, 2) { @@ -47,7 +46,7 @@ SliderController::SliderController (Glib::RefPtr<Gdk::Pixbuf> slide, void SliderController::set_value (float v) { - adj.set_value (v); + adjustment.set_value (v); } bool @@ -56,16 +55,15 @@ SliderController::on_button_press_event (GdkEventButton *ev) if (binding_proxy.button_press_handler (ev)) { return true; } - return PixScroller::on_button_press_event (ev); + return PixFader::on_button_press_event (ev); } -VSliderController::VSliderController (Glib::RefPtr<Gdk::Pixbuf> slide, - Glib::RefPtr<Gdk::Pixbuf> rail, +VSliderController::VSliderController (Glib::RefPtr<Gdk::Pixbuf> image, Gtk::Adjustment *adj, Controllable& control, bool with_numeric) - : SliderController (slide, rail, adj, control, with_numeric) + : SliderController (image, adj, control, with_numeric) { if (with_numeric) { spin_frame.add (spin); @@ -76,13 +74,12 @@ VSliderController::VSliderController (Glib::RefPtr<Gdk::Pixbuf> slide, } } -HSliderController::HSliderController (Glib::RefPtr<Gdk::Pixbuf> slide, - Glib::RefPtr<Gdk::Pixbuf> rail, +HSliderController::HSliderController (Glib::RefPtr<Gdk::Pixbuf> image, Gtk::Adjustment *adj, Controllable& control, bool with_numeric) - : SliderController (slide, rail, adj, control, with_numeric) + : SliderController (image, adj, control, with_numeric) { if (with_numeric) { spin_frame.add (spin); diff --git a/libs/gtkmm2ext/tearoff.cc b/libs/gtkmm2ext/tearoff.cc index e4a9207195..92bde5541e 100644 --- a/libs/gtkmm2ext/tearoff.cc +++ b/libs/gtkmm2ext/tearoff.cc @@ -127,7 +127,7 @@ TearOff::close_click (GdkEventButton* ev) gint TearOff::window_button_press (GdkEventButton* ev) { - if (dragging) { + if (dragging || ev->button != 1) { dragging = false; own_window.remove_modal_grab(); return true; @@ -172,6 +172,12 @@ TearOff::window_motion (GdkEventMotion* ev) return true; } + if (!(ev->state & GDK_BUTTON1_MASK)) { + dragging = false; + own_window.remove_modal_grab(); + return true; + } + x_delta = ev->x_root - drag_x; y_delta = ev->y_root - drag_y; |