folder icon move segv, resources drag scroll bug, memory leaks, global msgqual, po...
[goodguy/history.git] / cinelerra-5.1 / guicast / bcwindowbase.C
index 5909aced83e841ac9b33925f1b2c442b48ee6be9..2794830f6c8eb6d8febca0419a7a76507e8f9426 100644 (file)
@@ -36,7 +36,7 @@
 #include "bcwindowbase.h"
 #include "bcwindowevents.h"
 #include "bccmodels.h"
-#include "colors.h"
+#include "bccolors.h"
 #include "condition.h"
 #include "cursors.h"
 #include "bchash.h"
@@ -177,6 +177,7 @@ BC_WindowBase::~BC_WindowBase()
                         &BC_WindowBase::mediumfont,
                         &BC_WindowBase::largefont,
                         &BC_WindowBase::bigfont,
+                        &BC_WindowBase::clockfont,
                };
                for( int i=sizeof(xfont)/sizeof(xfont[0]); --i>=0; )
                        XFreeFont(display, this->*xfont[i]);
@@ -193,6 +194,7 @@ BC_WindowBase::~BC_WindowBase()
                         &BC_WindowBase::bold_smallfont_xft,
                         &BC_WindowBase::bold_mediumfont_xft,
                         &BC_WindowBase::bold_largefont_xft,
+                        &BC_WindowBase::clockfont_xft,
                };
                for( int i=sizeof(xft_font)/sizeof(xft_font[0]); --i>=0; ) {
                        XftFont *xft = (XftFont *)(this->*xft_font[i]);
@@ -223,7 +225,12 @@ BC_WindowBase::~BC_WindowBase()
                }
                else
 #endif
+               {
+// _XftDisplayInfo needs a lock.
+                       get_resources()->create_window_lock->lock("BC_WindowBase::~BC_WindowBase");
                        XCloseDisplay(display);
+                       get_resources()->create_window_lock->unlock();
+               }
 // clipboard uses a different display connection
                clipboard->stop_clipboard();
                delete clipboard;
@@ -296,6 +303,7 @@ int BC_WindowBase::initialize()
        active_menubar = 0;
        active_popup_menu = 0;
        active_subwindow = 0;
+       cursor_entered = 0;
        pixmap = 0;
        bg_pixmap = 0;
        _7segment_pixmaps = 0;
@@ -325,16 +333,24 @@ int BC_WindowBase::initialize()
 #ifdef HAVE_LIBXXF86VM
        vm_switched = 0;
 #endif
-       smallfont_xft = 0;
-       bold_largefont_xft = 0;
-       bold_mediumfont_xft = 0;
-       bold_smallfont_xft = 0;
        input_method = 0;
        input_context = 0;
 
+       smallfont = 0;
+       mediumfont = 0;
+       largefont = 0;
+       bigfont = 0;
+       clockfont = 0;
+
+       smallfont_xft = 0;
        mediumfont_xft = 0;
        largefont_xft = 0;
        bigfont_xft = 0;
+       clockfont_xft = 0;
+
+       bold_smallfont_xft = 0;
+       bold_mediumfont_xft = 0;
+       bold_largefont_xft = 0;
 #ifdef SINGLE_THREAD
        completion_lock = new Condition(0, "BC_WindowBase::completion_lock");
 #else
@@ -371,22 +387,10 @@ int BC_WindowBase::initialize()
                        FocusChangeMask
 
 
-int BC_WindowBase::create_window(BC_WindowBase *parent_window,
-                               const char *title,
-                               int x,
-                               int y,
-                               int w,
-                               int h,
-                               int minw,
-                               int minh,
-                               int allow_resize,
-                               int private_color,
-                               int hide,
-                               int bg_color,
-                               const char *display_name,
-                               int window_type,
-                               BC_Pixmap *bg_pixmap,
-                               int group_it)
+int BC_WindowBase::create_window(BC_WindowBase *parent_window, const char *title,
+               int x, int y, int w, int h, int minw, int minh, int allow_resize,
+               int private_color, int hide, int bg_color, const char *display_name,
+               int window_type, BC_Pixmap *bg_pixmap, int group_it)
 {
        XSetWindowAttributes attr;
        unsigned long mask;
@@ -1325,11 +1329,20 @@ locking_message = event->xclient.message_type;
                break;
 
        case LeaveNotify:
+               if( cursor_entered && event->xcrossing.window == win ) {
+                       cursor_entered = 0;
+               }
                event_win = event->xany.window;
                dispatch_cursor_leave();
                break;
 
        case EnterNotify:
+               if( !cursor_entered && event->xcrossing.window == win ) {
+                       if( !event->xcrossing.focus && get_resources()->grab_input_focus ) {
+                               XSetInputFocus(display, win, RevertToParent, CurrentTime);
+                       }
+                       cursor_entered = 1;
+               }
                event_win = event->xany.window;
                cursor_x = event->xcrossing.x;
                cursor_y = event->xcrossing.y;
@@ -2288,6 +2301,10 @@ int BC_WindowBase::init_fonts()
                if( !(bigfont = XLoadQueryFont(display, _(resources.big_font2))) )
                        bigfont = XLoadQueryFont(display, "fixed");
 
+       if((clockfont = XLoadQueryFont(display, _(resources.clock_font))) == NULL)
+               if((clockfont = XLoadQueryFont(display, _(resources.clock_font2))) == NULL)
+                       clockfont = XLoadQueryFont(display, "fixed");
+
        init_xft();
        if(get_resources()->use_fontset)
        {
@@ -2306,8 +2323,11 @@ int BC_WindowBase::init_fonts()
                        largefontset = XCreateFontSet(display, "fixed,*", &m, &n, &d);
                bigfontset = XCreateFontSet(display, resources.big_fontset, &m, &n, &d);
                if( !bigfontset )
-                       largefontset = XCreateFontSet(display, "fixed,*", &m, &n, &d);
-               if(bigfontset && largefontset && mediumfontset && smallfontset) {
+                       bigfontset = XCreateFontSet(display, "fixed,*", &m, &n, &d);
+               clockfontset = XCreateFontSet(display, resources.clock_fontset, &m, &n, &d);
+               if( !clockfontset )
+                       clockfontset = XCreateFontSet(display, "fixed,*", &m, &n, &d);
+               if(clockfontset && bigfontset && largefontset && mediumfontset && smallfontset) {
                        curr_fontset = mediumfontset;
                        get_resources()->use_fontset = 1;
                }
@@ -2352,6 +2372,12 @@ void BC_WindowBase::init_xft()
                if(!(bigfont_xft =
                        XftFontOpenXlfd(display, screen, resources.big_font_xft2)))
                        bigfont_xft = XftFontOpenXlfd(display, screen, "fixed");
+       if(!(clockfont_xft =
+               (resources.clock_font_xft[0] == '-' ?
+                       XftFontOpenXlfd(display, screen, resources.clock_font_xft) :
+                       XftFontOpenName(display, screen, resources.clock_font_xft))) )
+               clockfont_xft = XftFontOpenXlfd(display, screen, "fixed");
+
 
        if(!(bold_smallfont_xft =
                (resources.small_b_font_xft[0] == '-' ?
@@ -2369,21 +2395,24 @@ void BC_WindowBase::init_xft()
                        XftFontOpenName(display, screen, resources.large_b_font_xft))) )
                bold_largefont_xft = XftFontOpenXlfd(display, screen, "fixed");
 
-// Extension failed to locate fonts
        if( !smallfont_xft || !mediumfont_xft || !largefont_xft || !bigfont_xft ||
-           !bold_largefont_xft || !bold_mediumfont_xft || !bold_largefont_xft ) {
+           !bold_largefont_xft || !bold_mediumfont_xft || !bold_largefont_xft ||
+           !clockfont_xft ) {
                printf("BC_WindowBase::init_fonts: no xft fonts found:"
-                       " %s=%p\n %s=%p\n %s=%p\n %s=%p\n %s=%p\n %s=%p\n %s=%p\n",
+                       " %s=%p\n %s=%p\n %s=%p\n %s=%p\n %s=%p\n %s=%p\n %s=%p\n %s=%p\n",
                        resources.small_font_xft, smallfont_xft,
                        resources.medium_font_xft, mediumfont_xft,
                        resources.large_font_xft, largefont_xft,
                        resources.big_font_xft, bigfont_xft,
+                       resources.clock_font_xft, clockfont_xft,
                        resources.small_b_font_xft, bold_smallfont_xft,
                        resources.medium_b_font_xft, bold_mediumfont_xft,
                        resources.large_b_font_xft, bold_largefont_xft);
                get_resources()->use_xft = 0;
                exit(1);
        }
+// _XftDisplayInfo needs a lock.
+       XftDefaultHasRender(display);
 #endif // HAVE_XFT
 }
 
@@ -2734,6 +2763,7 @@ XFontStruct* BC_WindowBase::get_font_struct(int font)
                case MEDIUMFONT: return top_level->mediumfont; break;
                case LARGEFONT:  return top_level->largefont;  break;
                case BIGFONT:    return top_level->bigfont;    break;
+               case CLOCKFONT:  return top_level->clockfont;  break;
        }
        return 0;
 }
@@ -2749,6 +2779,7 @@ XFontSet BC_WindowBase::get_fontset(int font)
                        case MEDIUMFONT: fs = top_level->mediumfontset; break;
                        case LARGEFONT:  fs = top_level->largefontset; break;
                        case BIGFONT:    fs = top_level->bigfontset;   break;
+                       case CLOCKFONT: fs = top_level->clockfontset; break;
                }
        }
 
@@ -2763,6 +2794,7 @@ XftFont* BC_WindowBase::get_xft_struct(int font)
                case MEDIUMFONT:   return (XftFont*)top_level->mediumfont_xft;
                case LARGEFONT:    return (XftFont*)top_level->largefont_xft;
                case BIGFONT:      return (XftFont*)top_level->bigfont_xft;
+               case CLOCKFONT:    return (XftFont*)top_level->clockfont_xft;
                case MEDIUMFONT_3D: return (XftFont*)top_level->bold_mediumfont_xft;
                case SMALLFONT_3D:  return (XftFont*)top_level->bold_smallfont_xft;
                case LARGEFONT_3D:  return (XftFont*)top_level->bold_largefont_xft;
@@ -2773,13 +2805,6 @@ XftFont* BC_WindowBase::get_xft_struct(int font)
 #endif
 
 
-
-
-
-
-
-
-
 int BC_WindowBase::get_current_font()
 {
        return top_level->current_font;
@@ -2815,6 +2840,7 @@ void BC_WindowBase::set_fontset(int font)
                        case MEDIUMFONT: fs = top_level->mediumfontset; break;
                        case LARGEFONT:  fs = top_level->largefontset; break;
                        case BIGFONT:    fs = top_level->bigfontset;   break;
+                       case CLOCKFONT:  fs = top_level->clockfontset; break;
                }
        }