rework keyframe hide popup, keyframe auto render, textbox set_selection wide text
[goodguy/history.git] / cinelerra-5.1 / guicast / bcwindowbase.C
index c61691f2ffc9bf80c60c143cc3b6e5206a0c9a88..8322837d3302ef1f39378a45bc1225d417007518 100644 (file)
@@ -101,15 +101,20 @@ BC_WindowBase::~BC_WindowBase()
 #endif
 
 #ifdef HAVE_LIBXXF86VM
-   if(window_type == VIDMODE_SCALED_WINDOW && vm_switched)
-   {
-          restore_vm();
-   }
+       if(window_type == VIDMODE_SCALED_WINDOW && vm_switched) {
+               restore_vm();
+       }
 #endif
+       is_deleting = 1;
 
        hide_tooltip();
        if(window_type != MAIN_WINDOW)
        {
+// stop event input
+               XSelectInput(top_level->display, this->win, 0);
+               motion_events = resize_events = translation_events = 0;
+               top_level->dequeue_events(win);
+
                if(top_level->active_menubar == this) top_level->active_menubar = 0;
                if(top_level->active_popup_menu == this) top_level->active_popup_menu = 0;
                if(top_level->active_subwindow == this) top_level->active_subwindow = 0;
@@ -118,10 +123,10 @@ BC_WindowBase::~BC_WindowBase()
        }
 
        if(icon_window) delete icon_window;
-       if(window_type == POPUP_WINDOW) parent_window->remove_popup(this);
+       if(window_type == POPUP_WINDOW)
+               parent_window->remove_popup(this);
 
 // Delete the subwindows
-       is_deleting = 1;
        if(subwindows)
        {
                while(subwindows->total)
@@ -186,7 +191,6 @@ BC_WindowBase::~BC_WindowBase()
                }
 #endif
                finit_im();
-
                flush();
                sync_display();
 
@@ -339,6 +343,7 @@ int BC_WindowBase::initialize()
        glx_win = 0;
 #endif
 
+       win = 0;
        return 0;
 }
 
@@ -1915,11 +1920,17 @@ int BC_WindowBase::unset_all_repeaters()
 //     return top_level->next_repeat_id++;
 // }
 
+XEvent *BC_WindowBase::new_xevent()
+{
+       XEvent *event = new XEvent;
+       memset(event, 0, sizeof(*event));
+       return event;
+}
 
 #ifndef SINGLE_THREAD
 int BC_WindowBase::arm_repeat(int64_t duration)
 {
-       XEvent *event = new XEvent;
+       XEvent *event = new_xevent();
        XClientMessageEvent *ptr = (XClientMessageEvent*)event;
        ptr->type = ClientMessage;
        ptr->message_type = RepeaterXAtom;
@@ -1939,7 +1950,7 @@ int BC_WindowBase::recieve_custom_xatoms(xatom_event *event)
 
 int BC_WindowBase::send_custom_xatom(xatom_event *event)
 {
-       XEvent *myevent = new XEvent;
+       XEvent *myevent = new_xevent();
        XClientMessageEvent *ptr = (XClientMessageEvent*)myevent;
        ptr->type = ClientMessage;
        ptr->message_type = event->message_type;
@@ -1963,12 +1974,9 @@ Atom BC_WindowBase::create_xatom(const char *atom_name)
 
 int BC_WindowBase::get_atoms()
 {
-       SetDoneXAtom =  create_xatom("BC_REPEAT_EVENT");
-       RepeaterXAtom = create_xatom("BC_CLOSE_EVENT");
-       DelWinXAtom = create_xatom("WM_DELETE_WINDOW");
-       ProtoXAtom = create_xatom("WM_PROTOCOLS");
        SetDoneXAtom =  XInternAtom(display, "BC_REPEAT_EVENT", False);
        RepeaterXAtom = XInternAtom(display, "BC_CLOSE_EVENT", False);
+       DestroyAtom =   XInternAtom(display, "BC_DESTROY_WINDOW", False);
        DelWinXAtom =   XInternAtom(display, "WM_DELETE_WINDOW", False);
        if( (ProtoXAtom = XInternAtom(display, "WM_PROTOCOLS", False)) != 0 )
                XChangeProperty(display, win, ProtoXAtom, XA_ATOM, 32,
@@ -3305,7 +3313,7 @@ void BC_WindowBase::set_done(int return_value)
 #else // SINGLE_THREAD
                init_wait();
                if( !event_thread ) return;
-               XEvent *event = new XEvent;
+               XEvent *event = new_xevent();
                XClientMessageEvent *ptr = (XClientMessageEvent*)event;
                event->type = ClientMessage;
                ptr->message_type = SetDoneXAtom;
@@ -4352,6 +4360,20 @@ void BC_WindowBase::put_event(XEvent *event)
        event_condition->unlock();
 }
 
+void BC_WindowBase::dequeue_events(Window win)
+{
+       event_lock->lock("BC_WindowBase::dequeue_events");
+
+       int out = 0, total = common_events.size();
+       for( int in=0; in<total; ++in ) {
+               if( common_events[in]->xany.window == win ) continue;
+               common_events[out++] = common_events[in];
+       }
+       common_events.total = out;
+
+       event_lock->unlock();
+}
+
 #endif // SINGLE_THREAD
 
 int BC_WindowBase::get_id()