Fixes for GCC 4.3.
[ardour.git] / libs / gtkmm2ext / barcontroller.cc
index 734c4b77e283874204884d5b6f6fda2a35acd482..a3b2a13bf5aaf37ed08a4e5bab6910c7cd95a880 100644 (file)
@@ -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) {
@@ -133,7 +149,7 @@ BarController::button_release (GdkEventButton* ev)
                } else {
                        double scale;
 
-                       if (ev->state & (GDK_CONTROL_MASK|GDK_SHIFT_MASK) == (GDK_CONTROL_MASK|GDK_SHIFT_MASK)) {
+                       if ((ev->state & (GDK_CONTROL_MASK|GDK_SHIFT_MASK)) == (GDK_CONTROL_MASK|GDK_SHIFT_MASK)) {
                                scale = 0.01;
                        } else if (ev->state & GDK_CONTROL_MASK) {
                                scale = 0.1;
@@ -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;
                
@@ -175,7 +179,7 @@ BarController::scroll (GdkEventScroll* ev)
 {
        double scale;
 
-       if (ev->state & (GDK_CONTROL_MASK|GDK_SHIFT_MASK) == (GDK_CONTROL_MASK|GDK_SHIFT_MASK)) {
+       if ((ev->state & (GDK_CONTROL_MASK|GDK_SHIFT_MASK)) == (GDK_CONTROL_MASK|GDK_SHIFT_MASK)) {
                scale = 0.01;
        } else if (ev->state & GDK_CONTROL_MASK) {
                scale = 0.1;
@@ -204,14 +208,14 @@ BarController::motion (GdkEventMotion* ev)
        double scale;
        
        if (!grabbed) {
-               return TRUE;
+               return true;
        }
 
        if ((ev->state & (GDK_SHIFT_MASK|GDK_CONTROL_MASK)) == GDK_SHIFT_MASK) {
                return TRUE;
        }
 
-       if (ev->state & (GDK_CONTROL_MASK|GDK_SHIFT_MASK) == (GDK_CONTROL_MASK|GDK_SHIFT_MASK)) {
+       if ((ev->state & (GDK_CONTROL_MASK|GDK_SHIFT_MASK)) == (GDK_CONTROL_MASK|GDK_SHIFT_MASK)) {
                scale = 0.01;
        } else if (ev->state & GDK_CONTROL_MASK) {
                scale = 0.1;
@@ -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,18 +263,17 @@ 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;
 
-       w = darea.get_width() - 2;
-       h = darea.get_height() - 2;
-
        fract = ((adjustment.get_value() - adjustment.get_lower()) /
                 (adjustment.get_upper() - adjustment.get_lower()));
        
        switch (_style) {
        case Line:
+               w = darea.get_width() - 1;
+               h = darea.get_height();
                x1 = (gint) floor (w * fract);
                x2 = x1;
                y1 = 0;
@@ -281,28 +284,28 @@ 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:
                break;
 
        case LeftToRight:
+
+               w = darea.get_width() - 2;
+               h = darea.get_height() - 2;
+
                x1 = 0;
                x2 = (gint) floor (w * fract);
                y1 = 0;
@@ -346,7 +349,8 @@ BarController::expose (GdkEventExpose* event)
                char buf[64];
                buf[0] = '\0';
 
-               label_callback (buf, 64);
+               if (label_callback)
+                       label_callback (buf, 64);
 
                if (buf[0] != '\0') {
 
@@ -456,3 +460,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);
+}