}
-
-
-
-
-
int BC_WindowBase::shm_completion_event = -1;
-
-
-
-BC_Resources BC_WindowBase::resources;
-
+BC_Resources *BC_WindowBase::resources = 0;
Window XGroupLeader = 0;
Mutex BC_KeyboardHandlerLock::keyboard_listener_mutex("keyboard_listener",0);
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;
// This must be done before fonts to know if antialiasing is available.
init_colors();
// get the resources
- if(resources.use_shm < 0) resources.initialize_display(this);
+ if(resources->use_shm < 0) resources->initialize_display(this);
x_correction = BC_DisplayInfo::get_left_border();
y_correction = BC_DisplayInfo::get_top_border();
if(this->y < 0) this->y = 0;
if(this->bg_color == -1)
- this->bg_color = resources.get_bg_color();
+ this->bg_color = resources->get_bg_color();
// printf("bcwindowbase 1 %s\n", title);
// if(window_type == MAIN_WINDOW) sleep(1);
KeyPressMask | KeyReleaseMask;
if(this->bg_color == -1)
- this->bg_color = resources.get_bg_color();
+ this->bg_color = resources->get_bg_color();
attr.background_pixel = top_level->get_color(bg_color);
attr.colormap = top_level->cmap;
if(top_level->is_hourglass)
}
if(!hidden) show_window();
-
+ init_glyphs();
}
draw_background(0, 0, this->w, this->h);
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)
+ 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)
+ if((long)(button_time3 - button_time2) < resources->double_click)
{
double_click = 1;
// button_time3 = button_time2 = button_time1 = 0;
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);
int BC_WindowBase::init_fonts()
{
- if( !(smallfont = XLoadQueryFont(display, _(resources.small_font))) )
- if( !(smallfont = XLoadQueryFont(display, _(resources.small_font2))) )
+ if( !(smallfont = XLoadQueryFont(display, _(resources->small_font))) )
+ if( !(smallfont = XLoadQueryFont(display, _(resources->small_font2))) )
smallfont = XLoadQueryFont(display, "fixed");
- if( !(mediumfont = XLoadQueryFont(display, _(resources.medium_font))) )
- if( !(mediumfont = XLoadQueryFont(display, _(resources.medium_font2))) )
+ if( !(mediumfont = XLoadQueryFont(display, _(resources->medium_font))) )
+ if( !(mediumfont = XLoadQueryFont(display, _(resources->medium_font2))) )
mediumfont = XLoadQueryFont(display, "fixed");
- if( !(largefont = XLoadQueryFont(display, _(resources.large_font))) )
- if( !(largefont = XLoadQueryFont(display, _(resources.large_font2))) )
+ if( !(largefont = XLoadQueryFont(display, _(resources->large_font))) )
+ if( !(largefont = XLoadQueryFont(display, _(resources->large_font2))) )
largefont = XLoadQueryFont(display, "fixed");
- if( !(bigfont = XLoadQueryFont(display, _(resources.big_font))) )
- if( !(bigfont = XLoadQueryFont(display, _(resources.big_font2))) )
+ if( !(bigfont = XLoadQueryFont(display, _(resources->big_font))) )
+ 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)
+ if((clockfont = XLoadQueryFont(display, _(resources->clock_font))) == NULL)
+ if((clockfont = XLoadQueryFont(display, _(resources->clock_font2))) == NULL)
clockfont = XLoadQueryFont(display, "fixed");
init_xft();
int n;
// FIXME: should check the m,d,n values
- smallfontset = XCreateFontSet(display, resources.small_fontset, &m, &n, &d);
+ smallfontset = XCreateFontSet(display, resources->small_fontset, &m, &n, &d);
if( !smallfontset )
smallfontset = XCreateFontSet(display, "fixed,*", &m, &n, &d);
- mediumfontset = XCreateFontSet(display, resources.medium_fontset, &m, &n, &d);
+ mediumfontset = XCreateFontSet(display, resources->medium_fontset, &m, &n, &d);
if( !mediumfontset )
mediumfontset = XCreateFontSet(display, "fixed,*", &m, &n, &d);
- largefontset = XCreateFontSet(display, resources.large_fontset, &m, &n, &d);
+ largefontset = XCreateFontSet(display, resources->large_fontset, &m, &n, &d);
if( !largefontset )
largefontset = XCreateFontSet(display, "fixed,*", &m, &n, &d);
- bigfontset = XCreateFontSet(display, resources.big_fontset, &m, &n, &d);
+ bigfontset = XCreateFontSet(display, resources->big_fontset, &m, &n, &d);
if( !bigfontset )
bigfontset = XCreateFontSet(display, "fixed,*", &m, &n, &d);
- clockfontset = XCreateFontSet(display, resources.clock_fontset, &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) {
static Mutex xft_init_lock("BC_WindowBase::xft_init_lock", 0);
xft_init_lock.lock("BC_WindowBase::init_xft");
if(!(smallfont_xft =
- (resources.small_font_xft[0] == '-' ?
- xftFontOpenXlfd(display, screen, resources.small_font_xft) :
- xftFontOpenName(display, screen, resources.small_font_xft))) )
+ (resources->small_font_xft[0] == '-' ?
+ xftFontOpenXlfd(display, screen, resources->small_font_xft) :
+ xftFontOpenName(display, screen, resources->small_font_xft))) )
if(!(smallfont_xft =
- xftFontOpenXlfd(display, screen, resources.small_font_xft2)))
+ xftFontOpenXlfd(display, screen, resources->small_font_xft2)))
smallfont_xft = xftFontOpenXlfd(display, screen, "fixed");
if(!(mediumfont_xft =
- (resources.medium_font_xft[0] == '-' ?
- xftFontOpenXlfd(display, screen, resources.medium_font_xft) :
- xftFontOpenName(display, screen, resources.medium_font_xft))) )
+ (resources->medium_font_xft[0] == '-' ?
+ xftFontOpenXlfd(display, screen, resources->medium_font_xft) :
+ xftFontOpenName(display, screen, resources->medium_font_xft))) )
if(!(mediumfont_xft =
- xftFontOpenXlfd(display, screen, resources.medium_font_xft2)))
+ xftFontOpenXlfd(display, screen, resources->medium_font_xft2)))
mediumfont_xft = xftFontOpenXlfd(display, screen, "fixed");
if(!(largefont_xft =
- (resources.large_font_xft[0] == '-' ?
- xftFontOpenXlfd(display, screen, resources.large_font_xft) :
- xftFontOpenName(display, screen, resources.large_font_xft))) )
+ (resources->large_font_xft[0] == '-' ?
+ xftFontOpenXlfd(display, screen, resources->large_font_xft) :
+ xftFontOpenName(display, screen, resources->large_font_xft))) )
if(!(largefont_xft =
- xftFontOpenXlfd(display, screen, resources.large_font_xft2)))
+ xftFontOpenXlfd(display, screen, resources->large_font_xft2)))
largefont_xft = xftFontOpenXlfd(display, screen, "fixed");
if(!(bigfont_xft =
- (resources.big_font_xft[0] == '-' ?
- xftFontOpenXlfd(display, screen, resources.big_font_xft) :
- xftFontOpenName(display, screen, resources.big_font_xft))) )
+ (resources->big_font_xft[0] == '-' ?
+ xftFontOpenXlfd(display, screen, resources->big_font_xft) :
+ xftFontOpenName(display, screen, resources->big_font_xft))) )
if(!(bigfont_xft =
- xftFontOpenXlfd(display, screen, resources.big_font_xft2)))
+ 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))) )
+ (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] == '-' ?
- xftFontOpenXlfd(display, screen, resources.small_b_font_xft) :
- xftFontOpenName(display, screen, resources.small_b_font_xft))) )
+ (resources->small_b_font_xft[0] == '-' ?
+ xftFontOpenXlfd(display, screen, resources->small_b_font_xft) :
+ xftFontOpenName(display, screen, resources->small_b_font_xft))) )
bold_smallfont_xft = xftFontOpenXlfd(display, screen, "fixed");
if(!(bold_mediumfont_xft =
- (resources.medium_b_font_xft[0] == '-' ?
- xftFontOpenXlfd(display, screen, resources.medium_b_font_xft) :
- xftFontOpenName(display, screen, resources.medium_b_font_xft))) )
+ (resources->medium_b_font_xft[0] == '-' ?
+ xftFontOpenXlfd(display, screen, resources->medium_b_font_xft) :
+ xftFontOpenName(display, screen, resources->medium_b_font_xft))) )
bold_mediumfont_xft = xftFontOpenXlfd(display, screen, "fixed");
if(!(bold_largefont_xft =
- (resources.large_b_font_xft[0] == '-' ?
- xftFontOpenXlfd(display, screen, resources.large_b_font_xft) :
- xftFontOpenName(display, screen, resources.large_b_font_xft))) )
+ (resources->large_b_font_xft[0] == '-' ?
+ xftFontOpenXlfd(display, screen, resources->large_b_font_xft) :
+ xftFontOpenName(display, screen, resources->large_b_font_xft))) )
bold_largefont_xft = xftFontOpenXlfd(display, screen, "fixed");
if( !smallfont_xft || !mediumfont_xft || !largefont_xft || !bigfont_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",
- 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);
+ 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);
}
#endif // HAVE_XFT
}
+void BC_WindowBase::init_glyphs()
+{
+// draw all ascii char glyphs
+// There are problems with some/my graphics boards/drivers
+// which cause some glyphs to be munged if draws occur while
+// the font is being loaded. This code fills the font caches
+// by drawing all the ascii glyphs before the system starts.
+// Not a fix, but much better than nothing.
+ static int inited = 0;
+ if( inited ) return;
+ inited = 1;
+ int cur_font = current_font;
+// locale encodings, needed glyphs to be preloaded
+ const char *text = _( // ascii 0x20...0x7e
+ " !\"#$%&'()*+,-./0123456789:;<=>?"
+ "@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_"
+ "`abcdefghijklmnopqrstuvwxyz{|}~");
+ for( int font=SMALLFONT; font<=LARGEFONT; ++font ) {
+ set_font(font);
+ draw_text(5,5, text, 0);
+ }
+ set_font(cur_font);
+}
+
void BC_WindowBase::init_im()
{
XIMStyles *xim_styles;
BC_Resources* BC_WindowBase::get_resources()
{
- return &BC_WindowBase::resources;
+ return BC_WindowBase::resources;
}
BC_Synchronous* BC_WindowBase::get_synchronous()
{
- return BC_WindowBase::resources.get_synchronous();
+ return BC_WindowBase::resources->get_synchronous();
}
int BC_WindowBase::get_bg_color()
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)
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);
{
// 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)
return 0;
}
+void BC_WindowBase::init_resources(float scale)
+{
+ if( resources ) return;
+ XInitThreads();
+ const char *env = getenv("BC_SCALE");
+ if( env ) scale = atof(env);
+ float x_scale = 1, y_scale = 1;
+ if( scale <= 0 ) {
+ BC_DisplayInfo info;
+ int wx, wy, ww, wh;
+ int cins = info.xinerama_big_screen();
+ if( !info.xinerama_geometry(cins, wx, wy, ww, wh) ) {
+ if( (x_scale = ww/1920.) < 1 ) x_scale = 1;
+ if( (y_scale = wh/1080.) < 1 ) y_scale = 1;
+ }
+ }
+ else
+ x_scale = y_scale = scale;
+ // constructor sets BC_WindowBase::resources
+ new BC_Resources(x_scale, y_scale);
+}
+void BC_WindowBase::finit_resources()
+{
+ delete resources; resources = 0;
+}
+
int BC_WindowBase::set_w(int w)
{
this->w = w;
int BC_WindowBase::load_defaults(BC_Hash *defaults)
{
- BC_Resources *resources = get_resources();
char string[BCTEXTLEN];
int newest_id = - 1;
for(int i = 0; i < FILEBOX_HISTORY_SIZE; i++)
int BC_WindowBase::save_defaults(BC_Hash *defaults)
{
- BC_Resources *resources = get_resources();
char string[BCTEXTLEN];
for(int i = 0; i < FILEBOX_HISTORY_SIZE; i++)
{
// 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;
}
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());
}
}
}
-
-
-
-
#ifdef HAVE_LIBXXF86VM
void BC_WindowBase::closest_vm(int *vm, int *width, int *height)
{