This commit is contained in:
MatthiasWM 2023-11-29 13:16:35 +01:00
commit 06e2bd7f0e
23 changed files with 175 additions and 67 deletions

View File

@ -61,6 +61,8 @@ public:
void label(Fl_Widget*w) FL_OVERRIDE;
void label(Fl_Menu_Item*m) FL_OVERRIDE;
void uncache() FL_OVERRIDE;
int cache_w() {return cache_w_;}
int cache_h() {return cache_h_;}
};
#endif

View File

@ -383,7 +383,7 @@ public:
Fl_Fontsize size; /**< font size */
Fl_Font_Descriptor(const char* fontname, Fl_Fontsize size);
virtual FL_EXPORT ~Fl_Font_Descriptor() {}
short ascent, descent;
int ascent, descent;
unsigned int listbase;// base of display list, 0 = none
};

View File

@ -369,6 +369,8 @@ public:
void label(Fl_Widget*w) FL_OVERRIDE;
void label(Fl_Menu_Item*m) FL_OVERRIDE;
void uncache() FL_OVERRIDE;
int cache_w() {return cache_w_;}
int cache_h() {return cache_h_;}
/** Sets the maximum allowed image size in bytes when creating an Fl_RGB_Image object.
The image size in bytes of an Fl_RGB_Image object is the value of the product w() * h() * d().

View File

@ -72,6 +72,8 @@ public:
void label(Fl_Widget*w) FL_OVERRIDE;
void label(Fl_Menu_Item*m) FL_OVERRIDE;
void uncache() FL_OVERRIDE;
int cache_w() {return cache_w_;}
int cache_h() {return cache_h_;}
};
#endif

View File

@ -74,11 +74,11 @@ alignment_panel.o: ../FL/Fl_Scheme.H
alignment_panel.o: ../FL/Fl_Scheme_Choice.H
alignment_panel.o: ../FL/Fl_Scrollbar.H
alignment_panel.o: ../FL/Fl_Shortcut_Button.H
alignment_panel.o: ../FL/Fl_Simple_Terminal.H
alignment_panel.o: ../FL/Fl_Slider.H
alignment_panel.o: ../FL/Fl_Spinner.H
alignment_panel.o: ../FL/fl_string_functions.h
alignment_panel.o: ../FL/Fl_Tabs.H
alignment_panel.o: ../FL/Fl_Terminal.H
alignment_panel.o: ../FL/Fl_Text_Buffer.H
alignment_panel.o: ../FL/Fl_Text_Display.H
alignment_panel.o: ../FL/Fl_Text_Editor.H
@ -363,10 +363,10 @@ factory.o: ../FL/Fl_Repeat_Button.H
factory.o: ../FL/Fl_RGB_Image.H
factory.o: ../FL/Fl_Roller.H
factory.o: ../FL/Fl_Scrollbar.H
factory.o: ../FL/Fl_Simple_Terminal.H
factory.o: ../FL/Fl_Slider.H
factory.o: ../FL/Fl_Spinner.H
factory.o: ../FL/Fl_Tabs.H
factory.o: ../FL/Fl_Terminal.H
factory.o: ../FL/Fl_Text_Buffer.H
factory.o: ../FL/Fl_Text_Display.H
factory.o: ../FL/Fl_Text_Editor.H
@ -448,11 +448,11 @@ Fd_Snap_Action.o: ../FL/Fl_Scheme.H
Fd_Snap_Action.o: ../FL/Fl_Scheme_Choice.H
Fd_Snap_Action.o: ../FL/Fl_Scrollbar.H
Fd_Snap_Action.o: ../FL/Fl_Shortcut_Button.H
Fd_Snap_Action.o: ../FL/Fl_Simple_Terminal.H
Fd_Snap_Action.o: ../FL/Fl_Slider.H
Fd_Snap_Action.o: ../FL/Fl_Spinner.H
Fd_Snap_Action.o: ../FL/fl_string_functions.h
Fd_Snap_Action.o: ../FL/Fl_Tabs.H
Fd_Snap_Action.o: ../FL/Fl_Terminal.H
Fd_Snap_Action.o: ../FL/Fl_Text_Buffer.H
Fd_Snap_Action.o: ../FL/Fl_Text_Display.H
Fd_Snap_Action.o: ../FL/Fl_Text_Editor.H
@ -530,11 +530,11 @@ file.o: ../FL/Fl_Scheme_Choice.H
file.o: ../FL/Fl_Scrollbar.H
file.o: ../FL/Fl_Shared_Image.H
file.o: ../FL/Fl_Shortcut_Button.H
file.o: ../FL/Fl_Simple_Terminal.H
file.o: ../FL/Fl_Slider.H
file.o: ../FL/Fl_Spinner.H
file.o: ../FL/fl_string_functions.h
file.o: ../FL/Fl_Tabs.H
file.o: ../FL/Fl_Terminal.H
file.o: ../FL/Fl_Text_Buffer.H
file.o: ../FL/Fl_Text_Display.H
file.o: ../FL/Fl_Text_Editor.H
@ -623,11 +623,11 @@ fluid.o: ../FL/Fl_Scheme_Choice.H
fluid.o: ../FL/Fl_Scrollbar.H
fluid.o: ../FL/Fl_Shared_Image.H
fluid.o: ../FL/Fl_Shortcut_Button.H
fluid.o: ../FL/Fl_Simple_Terminal.H
fluid.o: ../FL/Fl_Slider.H
fluid.o: ../FL/Fl_Spinner.H
fluid.o: ../FL/fl_string_functions.h
fluid.o: ../FL/Fl_Tabs.H
fluid.o: ../FL/Fl_Terminal.H
fluid.o: ../FL/Fl_Text_Buffer.H
fluid.o: ../FL/Fl_Text_Display.H
fluid.o: ../FL/Fl_Text_Editor.H
@ -869,6 +869,7 @@ Fl_Function_Type.o: Fl_Window_Type.h
Fl_Function_Type.o: function_panel.h
Fl_Function_Type.o: mergeback.h
Fl_Function_Type.o: StyleParse.h
Fl_Function_Type.o: undo.h
Fl_Function_Type.o: widget_browser.h
Fl_Grid_Type.o: ../config.h
Fl_Grid_Type.o: ../FL/Enumerations.H
@ -1149,12 +1150,12 @@ Fl_Widget_Type.o: ../FL/Fl_Scrollbar.H
Fl_Widget_Type.o: ../FL/Fl_Shared_Image.H
Fl_Widget_Type.o: ../FL/Fl_Shortcut_Button.H
Fl_Widget_Type.o: ../FL/fl_show_colormap.H
Fl_Widget_Type.o: ../FL/Fl_Simple_Terminal.H
Fl_Widget_Type.o: ../FL/Fl_Slider.H
Fl_Widget_Type.o: ../FL/Fl_Spinner.H
Fl_Widget_Type.o: ../FL/fl_string_functions.h
Fl_Widget_Type.o: ../FL/Fl_Table.H
Fl_Widget_Type.o: ../FL/Fl_Tabs.H
Fl_Widget_Type.o: ../FL/Fl_Terminal.H
Fl_Widget_Type.o: ../FL/Fl_Text_Buffer.H
Fl_Widget_Type.o: ../FL/Fl_Text_Display.H
Fl_Widget_Type.o: ../FL/Fl_Text_Editor.H
@ -1247,11 +1248,11 @@ Fl_Window_Type.o: ../FL/Fl_Scheme_Choice.H
Fl_Window_Type.o: ../FL/Fl_Scrollbar.H
Fl_Window_Type.o: ../FL/Fl_Shared_Image.H
Fl_Window_Type.o: ../FL/Fl_Shortcut_Button.H
Fl_Window_Type.o: ../FL/Fl_Simple_Terminal.H
Fl_Window_Type.o: ../FL/Fl_Slider.H
Fl_Window_Type.o: ../FL/Fl_Spinner.H
Fl_Window_Type.o: ../FL/fl_string_functions.h
Fl_Window_Type.o: ../FL/Fl_Tabs.H
Fl_Window_Type.o: ../FL/Fl_Terminal.H
Fl_Window_Type.o: ../FL/Fl_Text_Buffer.H
Fl_Window_Type.o: ../FL/Fl_Text_Display.H
Fl_Window_Type.o: ../FL/Fl_Text_Editor.H
@ -1299,7 +1300,6 @@ function_panel.o: ../FL/Fl_Browser_.H
function_panel.o: ../FL/Fl_Button.H
function_panel.o: ../FL/Fl_Cairo.H
function_panel.o: ../FL/fl_casts.H
function_panel.o: ../FL/Fl_Check_Button.H
function_panel.o: ../FL/Fl_Choice.H
function_panel.o: ../FL/fl_config.h
function_panel.o: ../FL/Fl_Device.H
@ -1478,11 +1478,11 @@ shell_command.o: ../FL/Fl_Scheme.H
shell_command.o: ../FL/Fl_Scheme_Choice.H
shell_command.o: ../FL/Fl_Scrollbar.H
shell_command.o: ../FL/Fl_Shortcut_Button.H
shell_command.o: ../FL/Fl_Simple_Terminal.H
shell_command.o: ../FL/Fl_Slider.H
shell_command.o: ../FL/Fl_Spinner.H
shell_command.o: ../FL/fl_string_functions.h
shell_command.o: ../FL/Fl_Tabs.H
shell_command.o: ../FL/Fl_Terminal.H
shell_command.o: ../FL/Fl_Text_Buffer.H
shell_command.o: ../FL/Fl_Text_Display.H
shell_command.o: ../FL/Fl_Text_Editor.H

View File

@ -42,8 +42,6 @@ get_setting_sync(DBusConnection *const connection,
DBusMessage *message;
DBusMessage *reply;
dbus_error_init(&error);
message = dbus_message_new_method_call(
"org.freedesktop.portal.Desktop",
"/org/freedesktop/portal/desktop",
@ -58,6 +56,8 @@ get_setting_sync(DBusConnection *const connection,
if (!success)
return NULL;
dbus_error_init(&error);
reply = dbus_connection_send_with_reply_and_block(
connection,
message,
@ -66,9 +66,12 @@ get_setting_sync(DBusConnection *const connection,
dbus_message_unref(message);
if (dbus_error_is_set(&error))
if (dbus_error_is_set(&error)) {
dbus_error_free(&error);
return NULL;
}
dbus_error_free(&error);
return reply;
}

View File

@ -953,9 +953,9 @@ J1:
*/
Fl_Browser_::Fl_Browser_(int X, int Y, int W, int H, const char* L)
: Fl_Group(X, Y, W, H, L),
linespacing_(0),
scrollbar(0, 0, 0, 0, 0), // they will be resized by draw()
hscrollbar(0, 0, 0, 0, 0),
linespacing_(0)
hscrollbar(0, 0, 0, 0, 0)
{
box(FL_NO_BOX);
align(FL_ALIGN_BOTTOM);

View File

@ -153,7 +153,7 @@ public:
void ps_translate(int, int);
void ps_untranslate();
void draw_cached_pattern_(Fl_Image *img, cairo_pattern_t *pat, int X, int Y, int W, int H, int cx, int cy);
void draw_cached_pattern_(Fl_Image *img, cairo_pattern_t *pat, int X, int Y, int W, int H, int cx, int cy, int cache_w, int cache_h);
void draw_image(const uchar *data, int ix, int iy, int iw, int ih, int D, int LD) FL_OVERRIDE;
void draw_rgb(Fl_RGB_Image *rgb,int XP, int YP, int WP, int HP, int cx, int cy) FL_OVERRIDE;
void cache(Fl_RGB_Image *rgb) FL_OVERRIDE;

View File

@ -783,7 +783,7 @@ void Fl_Cairo_Graphics_Driver::overlay_rect(int x, int y, int w , int h) {
}
void Fl_Cairo_Graphics_Driver::draw_cached_pattern_(Fl_Image *img, cairo_pattern_t *pat, int X, int Y, int W, int H, int cx, int cy) {
void Fl_Cairo_Graphics_Driver::draw_cached_pattern_(Fl_Image *img, cairo_pattern_t *pat, int X, int Y, int W, int H, int cx, int cy, int cache_w, int cache_h) {
// compute size of output image in drawing units
cairo_matrix_t matrix;
cairo_get_matrix(cairo_, &matrix);
@ -794,7 +794,7 @@ void Fl_Cairo_Graphics_Driver::draw_cached_pattern_(Fl_Image *img, cairo_pattern
int Hs = Fl_Scalable_Graphics_Driver::floor(Y - cy + img->h(), s) - Ys;
if (Ws == 0 || Hs == 0) return;
cairo_save(cairo_);
bool need_extend = (img->data_w() != Ws || img->data_h() != Hs || (W >= 2 && H >= 2));
bool need_extend = (cache_w != Ws || cache_h != Hs || (W >= 2 && H >= 2));
if (need_extend || cx || cy || W < img->w() || H < img->h()) { // clip when necessary
cairo_rectangle(cairo_, X - 0.5, Y - 0.5, W + 0.5, H + 0.5);
cairo_clip(cairo_);
@ -805,11 +805,12 @@ void Fl_Cairo_Graphics_Driver::draw_cached_pattern_(Fl_Image *img, cairo_pattern
cairo_set_matrix(cairo_, &matrix);
if (img->d() >= 1) cairo_set_source(cairo_, pat);
if (need_extend) {
cairo_pattern_set_filter(pat, Fl_RGB_Image::scaling_algorithm() == FL_RGB_SCALING_BILINEAR ?
CAIRO_FILTER_GOOD : CAIRO_FILTER_FAST);
bool condition = Fl_RGB_Image::scaling_algorithm() == FL_RGB_SCALING_BILINEAR &&
(fabs(Ws/float(cache_w) - 1) > 0.02 || fabs(Hs/float(cache_h) - 1) > 0.02);
cairo_pattern_set_filter(pat, condition ? CAIRO_FILTER_GOOD : CAIRO_FILTER_FAST);
cairo_pattern_set_extend(pat, CAIRO_EXTEND_PAD);
}
cairo_matrix_init_scale(&matrix, double(img->data_w())/Ws, double(img->data_h())/Hs);
cairo_matrix_init_scale(&matrix, double(cache_w)/Ws, double(cache_h)/Hs);
cairo_matrix_translate(&matrix, -Xs , -Ys );
cairo_pattern_set_matrix(pat, &matrix);
if (img->d() > 1) cairo_paint(cairo_);
@ -834,7 +835,7 @@ void Fl_Cairo_Graphics_Driver::draw_rgb(Fl_RGB_Image *rgb,int XP, int YP, int WP
cache(rgb);
pat = (cairo_pattern_t*)*Fl_Graphics_Driver::id(rgb);
}
draw_cached_pattern_(rgb, pat, X, Y, W, H, cx, cy);
draw_cached_pattern_(rgb, pat, X, Y, W, H, cx, cy, rgb->cache_w(), rgb->cache_h());
}
@ -927,7 +928,10 @@ void Fl_Cairo_Graphics_Driver::draw_fixed(Fl_Bitmap *bm,int XP, int YP, int WP,
} else {
pat = (cairo_pattern_t*)*Fl_Graphics_Driver::id(bm);
color(color());
draw_cached_pattern_(bm, pat, XP, YP, WP, HP, cx, cy);
int old_w = bm->w(), old_h = bm->h();
bm->scale(bm->cache_w(), bm->cache_h(), 0, 1); // transiently
draw_cached_pattern_(bm, pat, XP, YP, WP, HP, cx, cy, bm->cache_w(), bm->cache_h());
bm->scale(old_w, old_h, 0, 1); // back
}
cairo_set_matrix(cairo_, &matrix);
}
@ -1013,7 +1017,10 @@ void Fl_Cairo_Graphics_Driver::draw_fixed(Fl_Pixmap *pxm,int XP, int YP, int WP,
Fl_Graphics_Driver::draw_empty(pxm, XP, YP);
} else {
pat = (cairo_pattern_t*)*Fl_Graphics_Driver::id(pxm);
draw_cached_pattern_(pxm, pat, XP, YP, WP, HP, cx, cy);
int old_w = pxm->w(), old_h = pxm->h();
pxm->scale(pxm->cache_w(), pxm->cache_h(), 0, 1); // transiently
draw_cached_pattern_(pxm, pat, XP, YP, WP, HP, cx, cy, pxm->cache_w(), pxm->cache_h());
pxm->scale(old_w, old_h, 0, 1); // back
}
cairo_set_matrix(cairo_, &matrix);
}

View File

@ -145,12 +145,11 @@ Fl_PostScript_Graphics_Driver::Fl_PostScript_Graphics_Driver(void)
//lang_level_ = 3;
lang_level_ = 2;
mask = 0;
#endif
ps_filename_ = NULL;
scale_x = scale_y = 1.;
bg_r = bg_g = bg_b = 255;
clip_ = NULL;
what = NONE;
scale_x = scale_y = 1.;
#endif
ps_filename_ = NULL;
}
/** \brief The destructor. */
@ -1750,9 +1749,9 @@ Fl_EPS_File_Surface::Fl_EPS_File_Surface(int width, int height, FILE *eps, Fl_Co
if (s != 1) {
ps->clocale_printf("GR GR GS %f %f SC GS\n", s, s);
}
Fl::get_color(background, ps->bg_r, ps->bg_g, ps->bg_b);
#endif
ps->scale_x = ps->scale_y = s;
Fl::get_color(background, ps->bg_r, ps->bg_g, ps->bg_b);
}
}

View File

@ -1,7 +1,7 @@
//
// Support for graphics output to PostScript file for the Fast Light Tool Kit (FLTK).
//
// Copyright 2010-2022 by Bill Spitzak and others.
// Copyright 2010-2023 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@ -49,7 +49,6 @@ public:
char *ps_filename_;
int nPages;
double pw_, ph_;
uchar bg_r, bg_g, bg_b;
Fl_PostScript_Graphics_Driver();
~Fl_PostScript_Graphics_Driver();
@ -80,11 +79,13 @@ public:
int not_clipped(int x, int y, int w, int h) FL_OVERRIDE;
int clip_box(int x, int y, int w, int h, int &X, int &Y, int &W, int &H) FL_OVERRIDE;
virtual int has_feature(driver_feature feature_mask) FL_OVERRIDE { return feature_mask & PRINTER; }
#if !FLTK_USE_CAIRO
// draw image classes without caching them
void draw_rgb_bitmap_(Fl_Image *img,int XP, int YP, int WP, int HP, int cx, int cy);
void draw_pixmap(Fl_Pixmap * pxm,int XP, int YP, int WP, int HP, int cx, int cy) FL_OVERRIDE;
void draw_bitmap(Fl_Bitmap * bitmap,int XP, int YP, int WP, int HP, int cx, int cy) FL_OVERRIDE;
void draw_rgb(Fl_RGB_Image * rgb,int XP, int YP, int WP, int HP, int cx, int cy) FL_OVERRIDE;
void draw_rgb_bitmap_(Fl_Image *img,int XP, int YP, int WP, int HP, int cx, int cy);
void draw_pixmap(Fl_Pixmap * pxm,int XP, int YP, int WP, int HP, int cx, int cy) FL_OVERRIDE;
void draw_bitmap(Fl_Bitmap * bitmap,int XP, int YP, int WP, int HP, int cx, int cy) FL_OVERRIDE;
void draw_rgb(Fl_RGB_Image * rgb,int XP, int YP, int WP, int HP, int cx, int cy) FL_OVERRIDE;
#endif // !FLTK_USE_CAIRO
};
#else // ! USE_PANGO

View File

@ -1,7 +1,7 @@
//
// Postscript image drawing implementation for the Fast Light Tool Kit (FLTK).
//
// Copyright 1998-2022 by Bill Spitzak and others.
// Copyright 1998-2023 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@ -68,7 +68,9 @@ void Fl_PostScript_Graphics_Driver::draw_image(const uchar *data, int ix, int iy
draw_image(draw_image_cb, &cb_data, ix, iy, iw, ih, abs(D));
}
#if USE_PANGO
#if USE_PANGO
#if !FLTK_USE_CAIRO
static void destroy_BGRA(void *data) {
delete[] (uchar*)data;
@ -180,7 +182,9 @@ void Fl_PostScript_Graphics_Driver::draw_rgb_bitmap_(Fl_Image *img,int XP, int Y
}
}
#else // USE_PANGO
#endif // !FLTK_USE_CAIRO
#else // ! USE_PANGO
//
// Implementation of the /ASCII85Encode PostScript filter

View File

@ -46,6 +46,8 @@ private:
void swap_buffers() FL_OVERRIDE;
void resize(int is_a_resize, int w, int h) FL_OVERRIDE;
char swap_type() FL_OVERRIDE;
void swap_interval(int) FL_OVERRIDE;
int swap_interval() const FL_OVERRIDE;
Fl_Gl_Choice *find(int m, const int *alistp) FL_OVERRIDE;
GLContext create_gl_context(Fl_Window* window, const Fl_Gl_Choice* g) FL_OVERRIDE;
void set_gl_context(Fl_Window* w, GLContext context) FL_OVERRIDE;

View File

@ -63,6 +63,9 @@ struct gl_start_support { // to support use of gl_start / gl_finish
static EGLConfig wld_egl_conf = NULL;
static EGLint swap_interval_ = 1;
static EGLint max_swap_interval = 1000;
static EGLint min_swap_interval = 0;
EGLDisplay Fl_Wayland_Gl_Window_Driver::egl_display = EGL_NO_DISPLAY;
@ -170,6 +173,9 @@ Fl_Gl_Choice *Fl_Wayland_Gl_Window_Driver::find(int m, const int *alistp)
Fl::fatal("failed to choose an EGL config\n");
}
eglGetConfigAttrib(egl_display, g->egl_conf, EGL_MAX_SWAP_INTERVAL, &max_swap_interval);
eglGetConfigAttrib(egl_display, g->egl_conf, EGL_MIN_SWAP_INTERVAL, &min_swap_interval);
first = g;
return g;
}
@ -431,6 +437,18 @@ void Fl_Wayland_Gl_Window_Driver::gl_start() {
glClear(GL_COLOR_BUFFER_BIT);
}
void Fl_Wayland_Gl_Window_Driver::swap_interval(int interval) {
if (interval < min_swap_interval) interval = min_swap_interval;
if (interval > max_swap_interval) interval = max_swap_interval;
if (egl_display && eglSwapInterval(egl_display, interval))
swap_interval_ = interval;
// printf("swap_interval_=%d\n",swap_interval_);
}
int Fl_Wayland_Gl_Window_Driver::swap_interval() const {
return swap_interval_;
}
FL_EXPORT EGLContext fl_wl_glcontext(GLContext rc) { return (EGLContext)rc; }

View File

@ -397,41 +397,90 @@ char Fl_X11_Gl_Window_Driver::swap_type() {
return copy;
}
typedef void (*SWAPINTERVALPROC) (Display *dpy, GLXDrawable drawable, int interval);
static SWAPINTERVALPROC glXSwapIntervalEXT = NULL;
static bool glXSwapIntervalChecked = false;
static void checkGlxXSwapInterval() {
if (!glXSwapIntervalChecked) {
glXSwapIntervalChecked = true;
glXSwapIntervalEXT = (SWAPINTERVALPROC)glXGetProcAddressARB((const GLubyte*)"glXSwapIntervalEXT");
// Start of swap_interval implementation in the three possibel ways for X11
// -1 = not yet initialized, 0 = none found, 1 = GLX, 2 = MESA, 3 = SGI
static signed char swap_interval_type = -1;
typedef void (*GLX_Set_Swap_Iterval_Proc) (Display *dpy, GLXDrawable drawable, int interval);
typedef int (*MESA_Set_Swap_Iterval_Proc) (unsigned int interval);
typedef int (*MESA_Get_Swap_Iterval_Proc) ();
typedef int (*SGI_Set_Swap_Iterval_Proc) (int interval);
static union {
GLX_Set_Swap_Iterval_Proc glXSwapIntervalEXT = NULL;
MESA_Set_Swap_Iterval_Proc glXSwapIntervalMESA;
SGI_Set_Swap_Iterval_Proc glXSwapIntervalSGI;
};
static MESA_Get_Swap_Iterval_Proc glXGetSwapIntervalMESA = NULL;
static void init_swap_interval() {
if (swap_interval_type != -1) return;
int major = 1, minor = 0;
glXQueryVersion(fl_display, &major, &minor);
swap_interval_type = 0;
const char *extensions = glXQueryExtensionsString(fl_display, fl_screen);
if (strstr(extensions, "GLX_EXT_swap_control") && ((major > 1) || (minor >= 3))) {
glXSwapIntervalEXT = (GLX_Set_Swap_Iterval_Proc)glXGetProcAddressARB((const GLubyte*)"glXSwapIntervalEXT");
swap_interval_type = 1;
} else if (strstr(extensions, "GLX_MESA_swap_control")) {
glXSwapIntervalMESA = (MESA_Set_Swap_Iterval_Proc)glXGetProcAddressARB((const GLubyte*)"glXSwapIntervalMESA");
glXGetSwapIntervalMESA = (MESA_Get_Swap_Iterval_Proc)glXGetProcAddressARB((const GLubyte*)"glXGetSwapIntervalMESA");
swap_interval_type = 2;
} else if (strstr(extensions, "GLX_SGI_swap_control")) {
glXSwapIntervalSGI = (SGI_Set_Swap_Iterval_Proc)glXGetProcAddressARB((const GLubyte*)"glXSwapIntervalSGI");
swap_interval_type = 3;
}
}
void Fl_X11_Gl_Window_Driver::swap_interval(int interval) {
if (!fl_xid(pWindow))
return;
if (!glXSwapIntervalChecked) checkGlxXSwapInterval();
if (glXSwapIntervalEXT) {
glXSwapIntervalEXT(fl_display, fl_xid(pWindow), interval);
if (swap_interval_type == -1)
init_swap_interval();
switch (swap_interval_type) {
case 1:
if (glXSwapIntervalEXT)
glXSwapIntervalEXT(fl_display, fl_xid(pWindow), interval);
break;
case 2:
if (glXSwapIntervalMESA)
glXSwapIntervalMESA((unsigned int)interval);
break;
case 3:
if (glXSwapIntervalSGI)
glXSwapIntervalSGI(interval);
break;
}
}
int Fl_X11_Gl_Window_Driver::swap_interval() const {
if (!fl_xid(pWindow))
return -1;
if (!glXSwapIntervalChecked) checkGlxXSwapInterval();
if (!glXSwapIntervalEXT) return -1;
static bool ext_checked = false, ext_exists = false;
if (!ext_checked) {
ext_checked = true;
ext_exists = (strstr(glXQueryExtensionsString(fl_display, fl_screen), "GLX_EXT_swap_control") != NULL);
if (swap_interval_type == -1)
init_swap_interval();
int interval = -1;
switch (swap_interval_type) {
case 1: {
unsigned int val = 0;
glXQueryDrawable(fl_display, fl_xid(pWindow), 0x20F1 /*GLX_SWAP_INTERVAL_EXT*/, &val);
interval = (int)val;
break; }
case 2:
if (glXGetSwapIntervalMESA)
interval = glXGetSwapIntervalMESA();
break;
case 3:
// not available
break;
}
if (!ext_exists) return -1;
unsigned int interval = -1;
glXQueryDrawable(fl_display, fl_xid(pWindow), 0x20F1 /*GLX_SWAP_INTERVAL_EXT*/, &interval);
return interval;
}
// end of swap_interval implementation
void Fl_X11_Gl_Window_Driver::waitGL() {
glXWaitGL();
}

View File

@ -2439,6 +2439,7 @@ Fl_Input.o: ../FL/Fl_Image.H
Fl_Input.o: ../FL/Fl_Input.H
Fl_Input.o: ../FL/Fl_Input_.H
Fl_Input.o: ../FL/Fl_Int_Input.H
Fl_Input.o: ../FL/Fl_Menu_Item.H
Fl_Input.o: ../FL/Fl_Multiline_Input.H
Fl_Input.o: ../FL/Fl_Multiline_Output.H
Fl_Input.o: ../FL/Fl_Output.H
@ -3929,6 +3930,9 @@ Fl_Text_Display.o: ../FL/Fl_Export.H
Fl_Text_Display.o: ../FL/Fl_Graphics_Driver.H
Fl_Text_Display.o: ../FL/Fl_Group.H
Fl_Text_Display.o: ../FL/Fl_Image.H
Fl_Text_Display.o: ../FL/Fl_Input.H
Fl_Text_Display.o: ../FL/Fl_Input_.H
Fl_Text_Display.o: ../FL/Fl_Menu_Item.H
Fl_Text_Display.o: ../FL/Fl_Pixmap.H
Fl_Text_Display.o: ../FL/Fl_Plugin.H
Fl_Text_Display.o: ../FL/Fl_Preferences.H

View File

@ -3149,3 +3149,18 @@ windowfocus.o: ../FL/fl_utf8.h
windowfocus.o: ../FL/Fl_Widget.H
windowfocus.o: ../FL/Fl_Window.H
windowfocus.o: ../FL/platform_types.h
wizard.o: ../FL/Enumerations.H
wizard.o: ../FL/Fl.H
wizard.o: ../FL/fl_attr.h
wizard.o: ../FL/Fl_Button.H
wizard.o: ../FL/Fl_Cairo.H
wizard.o: ../FL/fl_casts.H
wizard.o: ../FL/fl_config.h
wizard.o: ../FL/Fl_Export.H
wizard.o: ../FL/Fl_Group.H
wizard.o: ../FL/fl_types.h
wizard.o: ../FL/fl_utf8.h
wizard.o: ../FL/Fl_Widget.H
wizard.o: ../FL/Fl_Window.H
wizard.o: ../FL/Fl_Wizard.H
wizard.o: ../FL/platform_types.h