midi_clock_slave: enable debugging output
[ardour.git] / libs / gtkmm2ext / tearoff.cc
index 3df70ad54b85840863ad012ae42206c7c13cbef9..c33663e8f745cc3fa624e3992b6fa376d104b32c 100644 (file)
@@ -19,6 +19,7 @@
 */
 
 #include <cmath>
+#include <iostream>
 #include <gtkmm2ext/tearoff.h>
 #include <gtkmm2ext/utils.h>
 
@@ -36,6 +37,7 @@ TearOff::TearOff (Widget& c, bool allow_resize)
 {
        dragging = false;
        _visible = true;
+       _can_be_torn_off = true;
 
        tearoff_event_box.add (tearoff_arrow);
        tearoff_event_box.set_events (BUTTON_PRESS_MASK|BUTTON_RELEASE_MASK);
@@ -45,13 +47,13 @@ TearOff::TearOff (Widget& c, bool allow_resize)
        close_event_box.set_events (BUTTON_PRESS_MASK|BUTTON_RELEASE_MASK);
        close_event_box.signal_button_release_event().connect (mem_fun (*this, &TearOff::close_click));
        
-       own_window.add_events (BUTTON_PRESS_MASK|BUTTON_RELEASE_MASK|POINTER_MOTION_MASK|POINTER_MOTION_HINT_MASK);
+       own_window.add_events (KEY_PRESS_MASK|KEY_RELEASE_MASK|BUTTON_PRESS_MASK|BUTTON_RELEASE_MASK|POINTER_MOTION_MASK|POINTER_MOTION_HINT_MASK);
        own_window.set_resizable (allow_resize);
        own_window.set_type_hint (WINDOW_TYPE_HINT_TOOLBAR);
        
        VBox* box1;
        box1 = manage (new VBox);
-       box1->pack_start (close_event_box, false, false, 5);
+       box1->pack_start (close_event_box, false, false, 2);
        
        window_box.pack_end (*box1, false, false, 2);
        own_window.add (window_box);
@@ -67,7 +69,7 @@ TearOff::TearOff (Widget& c, bool allow_resize)
 
        VBox* box2;
        box2 = manage (new VBox);
-       box2->pack_start (tearoff_event_box, false, false, 5);
+       box2->pack_start (tearoff_event_box, false, false, 2);
 
        pack_start (contents);
        pack_start (*box2, false, false, 2);
@@ -78,6 +80,21 @@ TearOff::~TearOff ()
 {
 }
 
+void
+TearOff::set_can_be_torn_off (bool yn)
+{
+       if (yn != _can_be_torn_off) {
+               if (yn) {
+                       tearoff_arrow.set_no_show_all (false);
+                       tearoff_arrow.show ();
+               } else {
+                       tearoff_arrow.set_no_show_all (true);
+                       tearoff_arrow.hide ();
+               }
+               _can_be_torn_off = yn;
+       }
+}
+
 void
 TearOff::set_visible (bool yn)
 {
@@ -100,20 +117,25 @@ TearOff::set_visible (bool yn)
 }
 
 gint
-TearOff::tearoff_click (GdkEventButton* ev)
+TearOff::tearoff_click (GdkEventButton* /*ev*/)
 {
-       remove (contents);
-       window_box.pack_start (contents);
-       own_window.set_name (get_name());
-       close_event_box.set_name (get_name());
-       own_window.show_all ();
-       hide ();
-       Detach ();
+       if (_can_be_torn_off) {
+               remove (contents);
+               window_box.pack_start (contents);
+               own_window.set_name (get_name());
+               close_event_box.set_name (get_name());
+               own_window.show_all ();
+               own_window.present ();
+               std::cerr << "own window should be visible\n";
+               hide ();
+               Detach ();
+       }
+
        return true;
 }
 
 gint
-TearOff::close_click (GdkEventButton* ev)
+TearOff::close_click (GdkEventButton* /*ev*/)
 {
        window_box.remove (contents);
        pack_start (contents);
@@ -143,7 +165,7 @@ TearOff::window_button_press (GdkEventButton* ev)
 }
 
 gint
-TearOff::window_button_release (GdkEventButton* ev)
+TearOff::window_button_release (GdkEventButton* /*ev*/)
 {
        dragging = false;
        own_window.remove_modal_grab();
@@ -151,7 +173,7 @@ TearOff::window_button_release (GdkEventButton* ev)
 }
 
 gint
-TearOff::window_delete_event (GdkEventAny* ev)
+TearOff::window_delete_event (GdkEventAny* /*ev*/)
 {
        return close_click(0);
 }