diff options
Diffstat (limited to 'generic')
-rw-r--r-- | generic/tkZinc.c | 135 |
1 files changed, 45 insertions, 90 deletions
diff --git a/generic/tkZinc.c b/generic/tkZinc.c index 712b646..7b1affb 100644 --- a/generic/tkZinc.c +++ b/generic/tkZinc.c @@ -64,10 +64,9 @@ static const char compile_id[]="$Compile: " __FILE__ " " __DATE__ " " __TIME__ " #include <X11/Xatom.h> #ifdef GLX #include <GL/glx.h> +#include <GL/glu.h> #endif -/*#define PRINT_CONFIG*/ - #if 0 typedef struct TagSearch { WidgetInfo *wi; @@ -147,8 +146,8 @@ static Tk_Uid neg_tag_val_uid; static Tk_ConfigSpec config_specs[] = { {TK_CONFIG_PIXELS, "-borderwidth", "borderWidth", "BorderWidth", "2", Tk_Offset(WidgetInfo, border_width), 0}, - {TK_CONFIG_BORDER, "-backcolor", "backColor", "BackColor", - "#c3c3c3", Tk_Offset(WidgetInfo, bg_border), 0}, + {TK_CONFIG_COLOR, "-backcolor", "backColor", "BackColor", + "#c3c3c3", Tk_Offset(WidgetInfo, back_color), 0}, {TK_CONFIG_ACTIVE_CURSOR, "-cursor", "cursor", "Cursor", "", Tk_Offset(WidgetInfo, cursor), TK_CONFIG_NULL_OK}, {TK_CONFIG_FONT, "-font", "font", "Font", @@ -395,7 +394,9 @@ ZincObjCmd(ClientData client_data, /* Main window associated with if (glXQueryVersion(wi->dpy, &major_op, &minor_op)) { if ((major_op == 1) && (minor_op >= 1)) { #if 1 - printf("GLX version %d.%d\n", major_op, minor_op); + if (wi->render) { + printf("GLX version %d.%d\n", major_op, minor_op); + } #endif wi->has_glx = True; } @@ -426,9 +427,9 @@ ZincObjCmd(ClientData client_data, /* Main window associated with wi->binding_table = 0; wi->realized = False; wi->update_pending = 0; - wi->bg_border = NULL; - wi->back_color = NULL; /* back_color will be initialized by Configure */ wi->fore_color = NULL; + wi->back_color = NULL; + wi->relief_grad = NULL; wi->bbox_color = NULL; wi->draw_bboxes = 0; wi->light_angle = 120; @@ -540,7 +541,7 @@ ZincObjCmd(ClientData client_data, /* Main window associated with if (wi->render) { #ifdef GLX if (wi->has_glx) { -#ifdef PRINT_CONFIG +#ifdef GLX_PRINT_CONFIG int val; #endif int attribs[] = { GLX_RGBA, @@ -562,7 +563,7 @@ ZincObjCmd(ClientData client_data, /* Main window associated with wi->render = False; } else { -#ifdef PRINT_CONFIG +#ifdef GLX_PRINT_CONFIG printf(" Visual : 0x%x, ", (int) wi->gl_visual->visualid); glXGetConfig(wi->dpy, wi->gl_visual, GLX_RGBA, &val); printf("RGBA : %d, ", val); @@ -2180,7 +2181,7 @@ Contour(WidgetInfo *wi, if (!shape->class->GetContours) { ZnTriStrip tristrip; /* - * If there is no GetContours mrthod try to use + * If there is no GetContours method try to use * the GetClipVertices. It works only for simple * shapes (i.e tose returning a bounding box). */ @@ -4211,9 +4212,13 @@ Configure(Tcl_Interp *interp,/* Used for error reporting. */ wi->pick_aperture = 0; } - wi->back_color = Tk_3DBorderColor(wi->bg_border); - Tk_SetBackgroundFromBorder(wi->win, wi->bg_border); - + if (CONFIG_PROBE(BACK_COLOR_SPEC) || !wi->relief_grad) { + Tk_SetWindowBackground(wi->win, ZnPixel(wi->back_color)); + if (wi->relief_grad) { + ZnFreeGradient(wi->relief_grad); + } + wi->relief_grad = ZnGetReliefGradient(interp, wi->win, ZnNameOfColor(wi->back_color)); + } if (CONFIG_PROBE(BACK_COLOR_SPEC) || CONFIG_PROBE(LIGHT_ANGLE_SPEC)) { bbox.orig.x = bbox.orig.y = 0; bbox.corner.x = wi->width; @@ -4376,6 +4381,10 @@ Focus(WidgetInfo *wi, if (wi->text_info.focus_item != ZN_NO_ITEM) { ITEM.Invalidate(wi->text_info.focus_item, ZN_COORDS_FLAG); } + /*printf("focus %s\n", got_focus ? "in" : "out");*/ + if (wi->highlight_width > 0) { + ZnNeedRedisplay(wi); + } } @@ -4403,7 +4412,7 @@ Event(ClientData client_data, /* Information about widget. */ WidgetInfo *wi = (WidgetInfo *) client_data; /*printf("=============== DEBUT %s EVENT ==================\n", - event->type == MapNotify ? "MAP": + event->type == MapNotify ? "MAP": event->type == Expose? "EXPOSE" : event->type == ConfigureNotify ? "CONFIGURE" : event->type == DestroyNotify ? "DESTROY" : @@ -4411,8 +4420,8 @@ Event(ClientData client_data, /* Information about widget. */ if (event->type == MapNotify) { if (!wi->gc) { wi->realized = True; -#ifdef GLX if (wi->render) { +#ifdef GLX GLfloat r[2]; glXMakeCurrent(wi->dpy, ZnWindowId(wi->win), wi->gl_context); @@ -4422,14 +4431,15 @@ Event(ClientData client_data, /* Information about widget. */ /*glGetFloatv(GL_ALIASED_POINT_SIZE_RANGE, r);*/ glGetFloatv(GL_SMOOTH_POINT_SIZE_RANGE, r); wi->max_point_width = r[1]; -#ifdef PRINT_CONFIG +#ifdef GLX_PRINT_CONFIG printf("OpenGL version %s\n", (char *) glGetString(GL_VERSION)); printf(" Moteur de rendu : %s, ", (char *) glGetString(GL_RENDERER)); printf(" Fabriquant : %s\n", (char *) glGetString(GL_VENDOR)); printf(" Extensions présentes : %s\n", (char *) glGetString(GL_EXTENSIONS)); -#endif - } #endif +#endif + } + /* * Get the work GC and suppress GraphicExpose * and NoExpose events reception. @@ -4463,7 +4473,7 @@ Event(ClientData client_data, /* Information about widget. */ else if (event->type == Expose) { ZnBBox bbox; ZnDim width, height; - + bbox.orig.x = (((XExposeEvent*) event)->x - wi->inset); bbox.orig.y = (((XExposeEvent*) event)->y - wi->inset); width = ((XExposeEvent*) event)->width; @@ -4500,21 +4510,20 @@ Event(ClientData client_data, /* Information about widget. */ * need such change, it can bind a handler on <Configure>. */ else if (event->type == ConfigureNotify) { - ZnDim w, h; + ZnDim int_width, int_height; ZnBBox bbox; - + /* w = ((XConfigureEvent*) event)->width-2*wi->inset; h = ((XConfigureEvent*) event)->height-2*wi->inset;*/ - w = Tk_Width(wi->win)-2*wi->inset; - h = Tk_Height(wi->win)-2*wi->inset; + int_width = Tk_Width(wi->win)-2*wi->inset; + int_height = Tk_Height(wi->win)-2*wi->inset; - if ((wi->width != w) || (wi->height != h)) { - /*printf("reallocating double buffer\n");*/ + if ((wi->width != int_width) || (wi->height != int_height)) { bbox.orig.x = bbox.orig.y = 0; - bbox.corner.x = MAX(wi->width, w); - bbox.corner.y = MAX(wi->height, h); - wi->opt_width = wi->width = w; - wi->opt_height = wi->height = h; + bbox.corner.x = MAX(wi->width, int_width); + bbox.corner.y = MAX(wi->height, int_height); + wi->opt_width = wi->width = int_width; + wi->opt_height = wi->height = int_height; ITEM_P.ResetTransformStack(wi); ITEM_P.Damage(wi, &bbox); @@ -4524,9 +4533,10 @@ Event(ClientData client_data, /* Information about widget. */ * Reallocate the double buffer pixmap/image. */ if (!wi->render) { + /*printf("reallocating double buffer\n");*/ XFreePixmap(wi->dpy, wi->draw_buffer); wi->draw_buffer = XCreatePixmap(wi->dpy, RootWindowOfScreen(wi->screen), - wi->width, wi->height, + int_width, int_height, DefaultDepthOfScreen(wi->screen)); } } @@ -5325,6 +5335,8 @@ Destroy(char *mem_ptr) /* Info about the widget. */ ZnListFree(wi->work_doubles); #endif ZnListFree(wi->work_xpts); + + ZnFreeGradient(wi->relief_grad); FreeChrono(wi->total_draw_chrono); FreeChrono(wi->this_draw_chrono); @@ -5356,9 +5368,6 @@ static void Redisplay(ClientData client_data) /* Information about the widget. */ { WidgetInfo *wi = (WidgetInfo *) client_data; - ZnBBox merge; - Tk_Window tkwin; - XRectangle r; wi->update_pending = 0; if (!wi->realized || !Tk_IsMapped(wi->win)) { @@ -5387,6 +5396,8 @@ Redisplay(ClientData client_data) /* Information about the widget. */ * for Tcl_Preserve/Tcl_Release. */ if (ISSET(wi->events_flags, INTERNAL_NEED_REPICK)) { + Tk_Window tkwin; + Tcl_Preserve((ClientData) wi); CLEAR(wi->events_flags, INTERNAL_NEED_REPICK); PickCurrentItem(wi, &wi->pick_event); @@ -5402,43 +5413,10 @@ Redisplay(ClientData client_data) /* Information about the widget. */ ISSET(wi->events_flags, INTERNAL_NEED_REPICK)); /* - * Merge the repaired area with the exposed area. - */ - ResetBBox(&merge); - CopyBBox(&wi->damaged_area, &merge); - wi->damaged_area_w = wi->damaged_area.corner.x-wi->damaged_area.orig.x; - wi->damaged_area_h = wi->damaged_area.corner.y-wi->damaged_area.orig.y; - AddBBoxToBBox(&merge, &wi->exposed_area); - /* * Repair the scene where it is no longer up to date, * then send the merged area back to the screen. */ - if (!IsEmptyBBox(&merge)) { - if (wi->render || !IsEmptyBBox(&wi->damaged_area)) { - ITEM_P.Repair(wi); - } - - BBox2XRect(&merge, &r); - if (wi->render) { -#ifdef GLX - /* Switch the GL buffers. */ - glXSwapBuffers(wi->dpy, ZnWindowId(wi->win)); - /* - * Wait the end of GL update if we need to do some X - * drawing (specifically borders and highlight). - */ - if ((wi->border_width > 0) || - (wi->highlight_width > 0)) { - glXWaitGL(); - } -#endif - } - else { - XCopyArea(wi->dpy, - wi->draw_buffer, ZnWindowId(wi->win), wi->gc, - r.x, r.y, r.width, r.height, r.x+wi->inset, r.y+wi->inset); - } - } + ITEM_P.Repair(wi); /* * Reset the exposed & damaged areas. @@ -5446,29 +5424,6 @@ Redisplay(ClientData client_data) /* Information about the widget. */ ResetBBox(&wi->exposed_area); ResetBBox(&wi->damaged_area); - /* - * Redraw the borders. - */ - if (wi->border_width > 0) { - /*printf("win size %d %d\n", Tk_Width(wi->win), Tk_Height(wi->win));*/ - Tk_Draw3DRectangle(wi->win, ZnWindowId(wi->win), wi->bg_border, - wi->highlight_width, wi->highlight_width, - Tk_Width(wi->win) - 2*wi->highlight_width, - Tk_Height(wi->win) - 2*wi->highlight_width, - wi->border_width, wi->relief); - - } - if (wi->highlight_width > 0) { - GC gc; - if (wi->text_info.got_focus) { - gc = Tk_GCForColor(wi->highlight_color, Tk_WindowId(wi->win)); - } - else { - gc = Tk_GCForColor(wi->highlight_bg_color, Tk_WindowId(wi->win)); - } - Tk_DrawFocusHighlight(wi->win, gc, wi->highlight_width, Tk_WindowId(wi->win)); - } - if (wi->monitoring) { XStopChrono(wi->total_draw_chrono, wi->dpy, ZnWindowId(wi->win)); XStopChrono(wi->this_draw_chrono, wi->dpy, ZnWindowId(wi->win)); |