X-Git-Url: http://git.cinelerra-gg.org/git/?a=blobdiff_plain;f=cinelerra-5.1%2Fguicast%2Fbcwindowbase.C;h=96e71f39ee3bfe27e3f7a03e6a158540df13ccfd;hb=7a70932d3e04454177c456d0b42ee2f5318d6ad1;hp=0c34217adfa474ea83cb4912001c0489e74260b4;hpb=30bdb85eb33a8ee7ba675038a86c6be59c43d7bd;p=goodguy%2Fhistory.git diff --git a/cinelerra-5.1/guicast/bcwindowbase.C b/cinelerra-5.1/guicast/bcwindowbase.C index 0c34217a..96e71f39 100644 --- a/cinelerra-5.1/guicast/bcwindowbase.C +++ b/cinelerra-5.1/guicast/bcwindowbase.C @@ -101,15 +101,21 @@ 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; +#ifndef SINGLE_THREAD + top_level->dequeue_events(win); +#endif 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 +124,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 +192,6 @@ BC_WindowBase::~BC_WindowBase() } #endif finit_im(); - flush(); sync_display(); @@ -339,6 +344,7 @@ int BC_WindowBase::initialize() glx_win = 0; #endif + win = 0; return 0; } @@ -882,7 +888,7 @@ int BC_WindowBase::keysym_lookup(XEvent *event) return ret; } -pthread_t locking_task = -1; +pthread_t locking_task = (pthread_t)-1L; int locking_event = -1; int locking_message = -1; @@ -1915,11 +1921,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 +1951,8 @@ int BC_WindowBase::recieve_custom_xatoms(xatom_event *event) int BC_WindowBase::send_custom_xatom(xatom_event *event) { - XEvent *myevent = new XEvent; +#ifndef SINGLE_THREAD + XEvent *myevent = new_xevent(); XClientMessageEvent *ptr = (XClientMessageEvent*)myevent; ptr->type = ClientMessage; ptr->message_type = event->message_type; @@ -1951,6 +1964,7 @@ int BC_WindowBase::send_custom_xatom(xatom_event *event) ptr->data.l[4] = event->data.l[4]; put_event(myevent); +#endif return 0; } @@ -1963,12 +1977,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 +3316,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; @@ -3317,8 +3328,8 @@ void BC_WindowBase::set_done(int return_value) // it is deleted. // Deletion of event_thread is done at the end of BC_WindowBase::run_window() - by calling the destructor put_event(event); - } #endif + } } void BC_WindowBase::close(int return_value) @@ -4029,17 +4040,10 @@ void BC_WindowBase::set_background(VFrame *bitmap) void BC_WindowBase::put_title(const char *text) { - if( BC_Resources::locale_utf8 ) { - char *bp=this->title, *ep = bp+sizeof(this->title)-1; - for( const char *cp=text; *cp!=0 && bptitle, text); + char *cp = this->title, *ep = cp+sizeof(this->title)-1; + for( const unsigned char *bp = (const unsigned char *)text; *bp && cp= ' ' ? *bp : ' '; + *cp = 0; } void BC_WindowBase::set_title(const char *text) @@ -4359,6 +4363,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; inxany.window == win ) continue; + common_events[out++] = common_events[in]; + } + common_events.total = out; + + event_lock->unlock(); +} + #endif // SINGLE_THREAD int BC_WindowBase::get_id()