X-Git-Url: https://cinelerra-gg.org/git/?a=blobdiff_plain;f=cinelerra-5.1%2Fguicast%2Fbcwindowbase.C;h=ad25943b3ae97e540d83c0dc06e33248d46f37e4;hb=0df48ad2d876409c5beeae2e21933a728ea76c33;hp=23e5bec4a7918345c1ca7bbb7384df62a4be56a1;hpb=3932d2c16e903573db3cacdb3102dea9639c6ca4;p=goodguy%2Fcinelerra.git diff --git a/cinelerra-5.1/guicast/bcwindowbase.C b/cinelerra-5.1/guicast/bcwindowbase.C index 23e5bec4..ad25943b 100644 --- a/cinelerra-5.1/guicast/bcwindowbase.C +++ b/cinelerra-5.1/guicast/bcwindowbase.C @@ -69,17 +69,8 @@ BC_ResizeCall::BC_ResizeCall(int w, int h) } - - - - - int BC_WindowBase::shm_completion_event = -1; - - - BC_Resources BC_WindowBase::resources; - Window XGroupLeader = 0; Mutex BC_KeyboardHandlerLock::keyboard_listener_mutex("keyboard_listener",0); @@ -149,7 +140,11 @@ BC_WindowBase::~BC_WindowBase() //printf("delete glx=%08x, win=%08x %s\n", (unsigned)glx_win, (unsigned)win, title); #ifdef HAVE_GL if( get_resources()->get_synchronous() && glx_win != 0 ) { + if( window_type == MAIN_WINDOW ) + unlock_window(); get_resources()->get_synchronous()->delete_window(this); + if( window_type == MAIN_WINDOW ) + lock_window("BC_WindowBase::delete_window"); } #endif XDestroyWindow(top_level->display, win); @@ -456,8 +451,19 @@ int BC_WindowBase::create_window(BC_WindowBase *parent_window, const char *title vis = get_glx_visual(display); if( !vis ) #endif + { + int mask = VisualDepthMask | VisualClassMask; + static XVisualInfo vinfo; + memset(&vinfo, 0, sizeof(vinfo)); + vinfo.depth = 24; + vinfo.c_class = TrueColor; + int nitems = 0; + XVisualInfo *vis_info = XGetVisualInfo(display, mask, &vinfo, &nitems); + vis = vis_info && nitems>0 ? vis_info[0].visual : 0; + if( vis_info ) XFree(vis_info); + } + if( !vis ) vis = DefaultVisual(display, screen); - default_depth = DefaultDepth(display, screen); client_byte_order = (*(const u_int32_t*)"a ") & 0x00000001; @@ -566,9 +572,8 @@ int BC_WindowBase::create_window(BC_WindowBase *parent_window, const char *title mask = CWEventMask | CWBackPixel | CWColormap | CWOverrideRedirect | CWSaveUnder | CWCursor; - attr.event_mask = DEFAULT_EVENT_MASKS | - KeyPressMask | - KeyReleaseMask; + attr.event_mask = DEFAULT_EVENT_MASKS | ExposureMask | + KeyPressMask | KeyReleaseMask; if(this->bg_color == -1) this->bg_color = resources.get_bg_color(); @@ -729,9 +734,8 @@ int BC_WindowBase::run_window() init_lock->unlock(); // Handle common events - while(!done) - { - dispatch_event(0); + while( !done ) { + dispatch_event(); } unset_all_repeaters(); @@ -887,13 +891,14 @@ pthread_t locking_task = (pthread_t)-1L; int locking_event = -1; int locking_message = -1; -int BC_WindowBase::dispatch_event(XEvent *event) +int BC_WindowBase::dispatch_event() { Window tempwin; int result; XClientMessageEvent *ptr; int cancel_resize, cancel_translation; volatile static int debug = 0; + XEvent *event; key_pressed = 0; @@ -1066,7 +1071,13 @@ if( debug && event->type != ClientMessage ) { case Expose: event_win = event->xany.window; - dispatch_expose_event(); + result = 0; + for( int i=0; !result && iwin == event_win ) + result = popups[i]->dispatch_expose_event(); + } + if( !result ) + result = dispatch_expose_event(); break; case MotionNotify: @@ -2072,15 +2083,8 @@ int BC_WindowBase::init_colors() char *data = 0; XImage *ximage; ximage = XCreateImage(top_level->display, - top_level->vis, - top_level->default_depth, - ZPixmap, - 0, - data, - 16, - 16, - 8, - 0); + top_level->vis, top_level->default_depth, + ZPixmap, 0, data, 16, 16, 8, 0); bits_per_pixel = ximage->bits_per_pixel; XDestroyImage(ximage); @@ -3860,13 +3864,13 @@ int BC_WindowBase::get_abs_cursor_y(int lock_window) void BC_WindowBase::get_pop_cursor(int &px, int &py, int lock_window) { - int margin = 100; + int xmargin = xS(100), ymargin = yS(100); get_abs_cursor(px, py, lock_window); - if( px < margin ) px = margin; - if( py < margin ) py = margin; - int wd = get_screen_w(lock_window,-1) - margin; + if( px < xmargin ) px = xmargin; + if( py < ymargin ) py = ymargin; + int wd = get_screen_w(lock_window,-1) - xmargin; if( px > wd ) px = wd; - int ht = get_screen_h(lock_window,-1) - margin; + int ht = get_screen_h(lock_window,-1) - ymargin; if( py > ht ) py = ht; } int BC_WindowBase::get_pop_cursor_x(int lock_window) @@ -4051,6 +4055,11 @@ int BC_WindowBase::resize_window(int w, int h) size_hints.max_width = w; size_hints.min_height = h; size_hints.max_height = h; + if( this->x > -BC_INFINITY && this->x < BC_INFINITY ) { + size_hints.flags |= PPosition; + size_hints.x = this->x; + size_hints.y = this->y; + } XSetNormalHints(top_level->display, win, &size_hints); } XResizeWindow(top_level->display, win, w, h); @@ -4122,21 +4131,15 @@ int BC_WindowBase::reposition_window(int x, int y, int w, int h) { // KDE shifts window right and down. // FVWM leaves window alone and adds border around it. - XMoveResizeWindow(top_level->display, - win, + XMoveResizeWindow(top_level->display, win, x - BC_DisplayInfo::auto_reposition_x, y - BC_DisplayInfo::auto_reposition_y, - this->w, - this->h); + this->w, this->h); } else { - XMoveResizeWindow(top_level->display, - win, - x, - y, - this->w, - this->h); + XMoveResizeWindow(top_level->display, win, x, y, + this->w, this->h); } if(resize) @@ -4356,12 +4359,8 @@ int BC_WindowBase::save_defaults(BC_Hash *defaults) // For some reason XTranslateCoordinates can take a long time to return. // We work around this by only calling it when the event windows are different. -void BC_WindowBase::translate_coordinates(Window src_w, - Window dest_w, - int src_x, - int src_y, - int *dest_x_return, - int *dest_y_return) +void BC_WindowBase::translate_coordinates(Window src_w, Window dest_w, + int src_x, int src_y, int *dest_x_return, int *dest_y_return) { Window tempwin = 0; //Timer timer; @@ -4373,14 +4372,8 @@ void BC_WindowBase::translate_coordinates(Window src_w, } else { - XTranslateCoordinates(top_level->display, - src_w, - dest_w, - src_x, - src_y, - dest_x_return, - dest_y_return, - &tempwin); + XTranslateCoordinates(top_level->display, src_w, dest_w, + src_x, src_y, dest_x_return, dest_y_return, &tempwin); //printf("BC_WindowBase::translate_coordinates 1 %lld\n", timer.get_difference()); } } @@ -4396,10 +4389,6 @@ void BC_WindowBase::get_win_coordinates(int abs_x, int abs_y, int *x, int *y) } - - - - #ifdef HAVE_LIBXXF86VM void BC_WindowBase::closest_vm(int *vm, int *width, int *height) {