fix delete clip deadlock
[goodguy/cinelerra.git] / cinelerra-5.1 / cinelerra / mwindowgui.C
index 70c4808a959ea8b8c25a72b13fc6abb471ef0227..89ddbccef325bdecc00824de2ec1f23a752159db 100644 (file)
@@ -65,6 +65,7 @@
 #include "swindow.h"
 #include "theme.h"
 #include "trackcanvas.h"
+#include "trackpopup.h"
 #include "trackscroll.h"
 #include "tracks.h"
 #include "transitionpopup.h"
@@ -116,6 +117,7 @@ MWindowGUI::MWindowGUI(MWindow *mwindow)
        statusbar = 0;
        zoombar = 0;
        mainclock = 0;
+       track_menu = 0;
        edit_menu = 0;
        plugin_menu = 0;
        keyframe_menu = 0;
@@ -336,6 +338,9 @@ void MWindowGUI::create_objects()
 //     cursor->create_objects();
 
 
+       if(debug) printf("MWindowGUI::create_objects %d\n", __LINE__);
+       add_subwindow(track_menu = new TrackPopup(mwindow, this));
+       track_menu->create_objects();
        if(debug) printf("MWindowGUI::create_objects %d\n", __LINE__);
        add_subwindow(edit_menu = new EditPopup(mwindow, this));
        edit_menu->create_objects();
@@ -698,28 +703,17 @@ void MWindowGUI::draw_indexes(Indexable *indexable)
        }
 }
 
-void MWindowGUI::draw_canvas(int mode /* = 0 */, int hide_cursor /* = 1 */)
+void MWindowGUI::draw_canvas(int redraw, int hide_cursor)
 {
-       if(mode != IGNORE_THREAD)
-       {
-               resource_thread->stop_draw(1);
-       }
+       resource_thread->stop_draw(0);
 
-
-       for(int i = 0; i < TOTAL_PANES; i++)
-       {
-               if(pane[i])
-               {
+       int mode = redraw ? FORCE_REDRAW : NORMAL_DRAW;
+       for(int i = 0; i < TOTAL_PANES; i++) {
+               if( pane[i] )
                        pane[i]->canvas->draw(mode, hide_cursor);
-               }
-       }
-
-
-       if(mode != IGNORE_THREAD)
-       {
-               resource_thread->start_draw();
        }
 
+       resource_thread->start_draw();
 }
 
 void MWindowGUI::flash_canvas(int flush)
@@ -801,7 +795,7 @@ void MWindowGUI::update_scrollbars(int flush)
        {
                if(pane[i])
                {
-                       pane[i]->update(1, 0, 0, 0);
+                       pane[i]->update(1, NO_DRAW, 0, 0);
                }
        }
        if(flush) this->flush();
@@ -877,10 +871,8 @@ void MWindowGUI::update(int scrollbars,
 
        mwindow->edl->tracks->update_y_pixels(mwindow->theme);
 
-       if(do_canvas && do_canvas != IGNORE_THREAD)
-       {
+       if( do_canvas != NO_DRAW && do_canvas != IGNORE_THREAD )
                resource_thread->stop_draw(1);
-       }
 
        for(int i = 0; i < TOTAL_PANES; i++)
        {
@@ -890,10 +882,8 @@ void MWindowGUI::update(int scrollbars,
                        patchbay);
        }
 
-       if(do_canvas && do_canvas != IGNORE_THREAD)
-       {
+       if( do_canvas != NO_DRAW && do_canvas != IGNORE_THREAD )
                resource_thread->start_draw();
-       }
 
 //     if(scrollbars) this->get_scrollbars(0);
 //     if(timebar) this->timebar->update(0);
@@ -923,8 +913,7 @@ void MWindowGUI::update(int scrollbars,
 
 // Can't age if the cache called this to draw missing picons
 // or the GUI is updating the status of the draw toggle.
-       if(do_canvas != FORCE_REDRAW && do_canvas != IGNORE_THREAD)
-       {
+       if( do_canvas != FORCE_REDRAW && do_canvas != IGNORE_THREAD ) {
                unlock_window();
                mwindow->age_caches();
                lock_window("MWindowGUI::update");
@@ -1197,6 +1186,25 @@ int MWindowGUI::keypress_event()
                result = 1;
                break;
 
+       case 'c':
+               if( !ctrl_down() || alt_down() ) break;
+               mwindow->selected_to_clipboard();
+               break;
+       case 'v':
+               if( !ctrl_down() || alt_down() ) break;
+               mwindow->paste();
+               break;
+       case 'z':
+       case 'x':
+               if( !ctrl_down() || alt_down() ) break;
+               mwindow->cut_selected_edits(get_keypress()=='x' ? 1 : 0);
+               break;
+       case 'm':
+       case DELETE:
+               if( !ctrl_down() || alt_down() ) break;
+               mwindow->delete_edits(get_keypress()==DELETE ? 1 : 0);
+               break;
+
        case '1': case '2': case '3': case '4':
        case '5': case '6': case '7': case '8':
                if( !alt_down() || shift_down() ) break;
@@ -1304,7 +1312,7 @@ int MWindowGUI::keypress_event()
                        if( !selected && this_track ) this_track->record = 1;
                }
 
-               update(0, 1, 0, 0, 1, 0, 1);
+               update(0, NORMAL_DRAW, 0, 0, 1, 0, 1);
                unlock_window();
                mwindow->cwindow->update(0, 1, 1);
                lock_window("MWindowGUI::keypress_event 3");
@@ -1842,7 +1850,7 @@ void MWindowGUI::delete_y_pane(int cursor_y)
 void MWindowGUI::stop_pane_drag()
 {
        dragging_pane = 0;
-       resource_thread->stop_draw(1);
+       resource_thread->stop_draw(0);
 
        if(x_pane_drag)
        {
@@ -2420,10 +2428,12 @@ ProxyToggle::~ProxyToggle()
 int ProxyToggle::handle_event()
 {
        int disabled = get_value();
+       mwindow->gui->unlock_window();
        if( disabled )
                mwindow->disable_proxy();
        else
                mwindow->enable_proxy();
+       mwindow->gui->lock_window("ProxyToggle::handle_event");
        set_tooltip(!disabled ? _("Disable proxy") : _("Enable proxy"));
        return 1;
 }