fix audiospect ratio in scale per andrew, upgrade dav1d to 0.6.0, fix shapewipe black...
[goodguy/cinelerra.git] / cinelerra-5.1 / guicast / bcwindowbase.C
index a362095e3405c0084f0e170460465d1248076152..e64b2eb04b15fbed85aa667d67aaec122acb650c 100644 (file)
@@ -57,7 +57,9 @@
 #include <typeinfo>
 
 #include <X11/extensions/Xinerama.h>
+#ifdef HAVE_XV
 #include <X11/extensions/Xvlib.h>
+#endif
 #include <X11/extensions/shape.h>
 #include <X11/XF86keysym.h>
 #include <X11/Sunkeysym.h>
@@ -205,9 +207,10 @@ BC_WindowBase::~BC_WindowBase()
                        XFree(xinerama_info);
                xinerama_screens = 0;
                xinerama_info = 0;
+#ifdef HAVE_XV
                if( xvideo_port_id >= 0 )
                        XvUngrabPort(display, xvideo_port_id, CurrentTime);
-
+#endif
                unlock_window();
 // Must be last reference to display.
 // _XftDisplayInfo needs a lock.
@@ -869,8 +872,11 @@ int BC_WindowBase::keysym_lookup(XEvent *event)
        wkey_string_length = 0;
 
        if( input_context ) {
+               wchar_t wkey[4];
                wkey_string_length = XwcLookupString(input_context,
-                       (XKeyEvent*)event, wkey_string, 4, &keysym, 0);
+                       (XKeyEvent*)event, wkey, 4, &keysym, 0);
+               for( int i=0; i<wkey_string_length; ++i )
+                       wkey_string[i] = wkey[i];
 //printf("keysym_lookup 1 %d %d %lx %x %x %x %x\n", wkey_string_length, keysym,
 //  wkey_string[0], wkey_string[1], wkey_string[2], wkey_string[3]);
 
@@ -1016,8 +1022,8 @@ if( debug && event->type != ClientMessage ) {
 
 //printf("BC_WindowBase::dispatch_event %d %d\n", __LINE__, button_number);
                event_win = event->xany.window;
-               if (button_number < 6) {
-                       if(button_number < 4)
+               if( button_number < 6 ) {
+                       if( button_number < 4 )
                                button_down = 1;
                        button_pressed = event->xbutton.button;
                        button_time1 = button_time2;
@@ -1030,23 +1036,20 @@ if( debug && event->type != ClientMessage ) {
                        drag_x2 = cursor_x + get_resources()->drag_radius;
                        drag_y1 = cursor_y - get_resources()->drag_radius;
                        drag_y2 = cursor_y + get_resources()->drag_radius;
-
-                       if((long)(button_time3 - button_time1) < resources->double_click * 2)
-                       {
-                               triple_click = 1;
-                               button_time3 = button_time2 = button_time1 = 0;
-                       }
-                       if((long)(button_time3 - button_time2) < resources->double_click)
-                       {
-                               double_click = 1;
-//                             button_time3 = button_time2 = button_time1 = 0;
-                       }
-                       else
-                       {
-                               triple_click = 0;
-                               double_click = 0;
+                       if( button_number < 4 ) {
+                               if((long)(button_time3 - button_time1) < resources->double_click * 2) {
+                                       triple_click = 1;
+                                       button_time3 = button_time2 = button_time1 = 0;
+                               }
+                               if((long)(button_time3 - button_time2) < resources->double_click) {
+                                       double_click = 1;
+//                                     button_time3 = button_time2 = button_time1 = 0;
+                               }
+                               else {
+                                       triple_click = 0;
+                                       double_click = 0;
+                               }
                        }
-
                        dispatch_button_press();
                }
                break;
@@ -1261,35 +1264,8 @@ if( debug && event->type != ClientMessage ) {
                case XK_F10:            key_pressed = KEY_F10;  break;
                case XK_F11:            key_pressed = KEY_F11;  break;
                case XK_F12:            key_pressed = KEY_F12;  break;
-
+// activates remote
                case XK_Menu:           key_pressed = KPMENU;   break;  /* menu */
-// remote control
-// above       case XK_KP_Enter:       key_pressed = KPENTER;  break;  /* check */
-               case XF86XK_MenuKB:     key_pressed = KPMENU;   break;  /* menu */
-// intercepted case XF86XK_PowerDown: key_pressed = KPPOWER;   break;  /* Power */
-               case XF86XK_Launch1:    key_pressed = KPTV;     break;  /* TV */
-               case XF86XK_Launch2:    key_pressed = KPDVD;    break;  /* DVD */
-// intercepted case XF86XK_WWW:        key_pressed = KPWWEB;   break;  /* WEB */
-               case XF86XK_Launch3:    key_pressed = KPBOOK;   break;  /* book */
-               case XF86XK_Launch4:    key_pressed = KPHAND;   break;  /* hand */
-               case XF86XK_Reply:      key_pressed = KPTMR;    break;  /* timer */
-               case SunXK_Front:       key_pressed = KPMAXW;   break;  /* max */
-// above       case XK_Left:           key_pressed = LEFT;     break;  /* left */
-// above       case XK_Right:          key_pressed = RIGHT;    break;  /* right */
-// above       case XK_Down:           key_pressed = DOWN;     break;  /* down */
-// above       case XK_Up:             key_pressed = UP;       break;  /* up */
-// above       case XK_SPACE:          key_pressed = KPSPACE;  break;  /* ok */
-// intercepted case XF86XK_AudioRaiseVolume: key_pressed = KPVOLU;     break;  /* VOL + */
-// intercepted case XF86XK_AudioMute: key_pressed = KPMUTE;    break;  /* MUTE */
-// intercepted case XF86XK_AudioLowerVolume: key_pressed = KPVOLD;     break;  /* VOL - */
-               case XF86XK_ScrollUp:   key_pressed = KPCHUP;   break;  /* CH + */
-               case XF86XK_ScrollDown: key_pressed = KPCHDN;   break;  /* CH - */
-               case XF86XK_AudioRecord: key_pressed = KPRECD;  break;  /* ( o) red */
-               case XF86XK_Forward:    key_pressed = KPPLAY;   break;  /* ( >) */
-               case XK_Redo:           key_pressed = KPFWRD;   break;  /* (>>) */
-               case XF86XK_Back:       key_pressed = KPBACK;   break;  /* (<<) */
-               case XK_Cancel:         key_pressed = KPSTOP;   break;  /* ([]) */
-               case XK_Pause:          key_pressed = KPAUSE;   break;  /* ('') */
 
                default:
                        key_pressed = keysym & 0xff;
@@ -2448,7 +2424,7 @@ void BC_WindowBase::init_glyphs()
                "`abcdefghijklmnopqrstuvwxyz{|}~");
        for( int font=SMALLFONT; font<=LARGEFONT; ++font ) {
                set_font(font);
-               draw_text(5,5, text, 0);
+               draw_text(5,5, text);
        }
        set_font(cur_font);
        XUngrabServer(display);
@@ -2971,10 +2947,10 @@ int BC_WindowBase::get_text_width(int font, const char *text, int length)
        return w;
 }
 
-int BC_WindowBase::get_text_width(int font, const wchar_t *text, int length)
+int BC_WindowBase::get_text_width(int font, const wchr_t *text, int length)
 {
        int i, j, w = 0;
-       if( length < 0 ) length = wcslen(text);
+       if( length < 0 ) length = wstrlen(text);
 
        for( i=j=0; i<length && text[i]; ++i ) {
                if( text[i] != '\n' ) continue;
@@ -3141,6 +3117,7 @@ int BC_WindowBase::accel_available(int color_model, int lock_it)
 
 int BC_WindowBase::grab_port_id(int color_model)
 {
+#ifdef HAVE_XV
        if( !get_resources()->use_xvideo ||     // disabled
            !get_resources()->use_shm )         // Only local server is fast enough.
                return -1;
@@ -3187,8 +3164,10 @@ int BC_WindowBase::grab_port_id(int color_model)
        }
 
        XvFreeAdaptorInfo(info);
-
        return xvideo_port_id;
+#else
+       return -1;
+#endif
 }
 
 
@@ -3928,9 +3907,9 @@ void BC_WindowBase::get_pop_cursor(int &px, int &py, int lock_window)
        get_abs_cursor(px, py, lock_window);
        if( px < xmargin ) px = xmargin;
        if( py < ymargin ) py = ymargin;
-       int wd = get_screen_w(lock_window,-1) - xmargin;
+       int wd = get_screen_x(lock_window,-1) + get_screen_w(lock_window,-1) - xmargin;
        if( px > wd ) px = wd;
-       int ht = get_screen_h(lock_window,-1) - ymargin;
+       int ht = get_screen_y(lock_window,-1) + get_screen_h(lock_window,-1) - ymargin;
        if( py > ht ) py = ht;
 }
 int BC_WindowBase::get_pop_cursor_x(int lock_window)
@@ -4066,7 +4045,7 @@ int BC_WindowBase::ctrl_down()
        return top_level->ctrl_mask;
 }
 
-wchar_t* BC_WindowBase::get_wkeystring(int *length)
+wchr_t* BC_WindowBase::get_wkeystring(int *length)
 {
        if(length)
                *length = top_level->wkey_string_length;
@@ -4241,6 +4220,8 @@ void BC_WindowBase::set_force_tooltip(int v)
 
 int BC_WindowBase::raise_window(int do_flush)
 {
+       if( hidden ) return 1;
+       if( wait_viewable(500) ) return 1;
        XRaiseWindow(top_level->display, win);
        if(do_flush) XFlush(top_level->display);
        return 0;
@@ -4657,3 +4638,15 @@ void BC_WindowBase::focus()
                XSetInputFocus(top_level->display, top_level->win, RevertToParent, CurrentTime);
 }
 
+int BC_WindowBase::wait_viewable(int ms)
+{
+       Timer timer;
+       XWindowAttributes xwa;
+       do {
+               XGetWindowAttributes(top_level->display, top_level->win, &xwa);
+               if( xwa.map_state == IsViewable ) return 0;
+               usleep(10000);
+       } while( timer.get_difference() < ms );
+       return 1;
+}
+