X-Git-Url: http://git.cinelerra-gg.org/git/?p=goodguy%2Fhistory.git;a=blobdiff_plain;f=cinelerra-5.1%2Fguicast%2Fbcwindowevents.C;h=2660c9498fa8a0f3604c849c1cf8599ea76cd912;hp=3d4dd5b4c5d8f660f8b20eb0301215e402a0786f;hb=3ec3a9cc6afc6561311686b3ec597ee3c1d80d6f;hpb=788dfe4aae1aef521caddcc68dec7369a996dce7 diff --git a/cinelerra-5.1/guicast/bcwindowevents.C b/cinelerra-5.1/guicast/bcwindowevents.C index 3d4dd5b4..2660c949 100644 --- a/cinelerra-5.1/guicast/bcwindowevents.C +++ b/cinelerra-5.1/guicast/bcwindowevents.C @@ -46,19 +46,16 @@ BC_WindowEvents::BC_WindowEvents(BC_Display *display) BC_WindowEvents::~BC_WindowEvents() { -// First set done, then send dummy event through XSendEvent to unlock the loop in ::run() +// no more external events, send one last event into X to flush out all of the +// pending events so that no straglers or shm leaks are possible. //printf("BC_WindowEvents::~BC_WindowEvents %d %s\n", __LINE__, window->title); - done = 1; - XEvent event; + XSelectInput(window->display, window->win, 0); + XEvent event; memset(&event,0,sizeof(event)); XClientMessageEvent *ptr = (XClientMessageEvent*)&event; event.type = ClientMessage; - ptr->message_type = XInternAtom(window->display, "DUMMY_XATOM", False); + ptr->message_type = window->DestroyAtom; ptr->format = 32; - XSendEvent(window->display, - window->win, - 0, - 0, - &event); + XSendEvent(window->display, window->win, 0, 0, &event); window->flush(); Thread::join(); //printf("BC_WindowEvents::~BC_WindowEvents %d %s\n", __LINE__, window->title); @@ -80,8 +77,6 @@ void BC_WindowEvents::run() int x_fd = ConnectionNumber(window->display); #endif - - while(!done) { @@ -90,7 +85,6 @@ void BC_WindowEvents::run() #ifdef SINGLE_THREAD event = new XEvent; XNextEvent(display->display, event); - display->put_event(event); #else // This came from a linuxquestions post. // We can get a file descriptor for the X display & use select instead of XNextEvent. @@ -107,20 +101,33 @@ void BC_WindowEvents::run() { event = new XEvent; XNextEvent(window->display, event); +#endif if( event->type == BC_WindowBase::shm_completion_event ) { - window->top_level->active_bitmaps.reque(event); + window->active_bitmaps.reque(event); delete event; continue; } + if( event->type == ClientMessage ) { + XClientMessageEvent *ptr = (XClientMessageEvent*)event; + if( ptr->message_type == window->DestroyAtom ) { + delete event; + done = 1; + break; + } + } +#ifndef SINGLE_THREAD // HACK: delay is required to get the close event - usleep(1); + yield(); //if(window && event) //printf("BC_WindowEvents::run %d %s %d\n", __LINE__, window->title, event->type); window->put_event(event); } XUnlockDisplay(window->display); //printf("BC_WindowEvents::run %d %s\n", __LINE__, window->title); +#else + display->put_event(event); #endif + } }