From 5be9f0a9040282e8a5eb7e5a40df9855b25ee8b5 Mon Sep 17 00:00:00 2001 From: lecoanet Date: Wed, 27 Sep 2000 14:47:28 +0000 Subject: Debut de travail sur le rendu local avec m�moire partag�e. Renommage de la commande verticeat en vertexat. --- generic/tkZinc.c | 68 +++++++++++++++++++++++++++++++++++++------------------- 1 file changed, 45 insertions(+), 23 deletions(-) (limited to 'generic/tkZinc.c') diff --git a/generic/tkZinc.c b/generic/tkZinc.c index faf1d10..dc255d5 100644 --- a/generic/tkZinc.c +++ b/generic/tkZinc.c @@ -62,6 +62,11 @@ static const char compile_id[]="$Compile: " __FILE__ " " __DATE__ " " __TIME__ " #include #include #include +#ifdef SHM +#include +#include +#endif + #if 0 typedef struct TagSearch { @@ -385,8 +390,8 @@ ZincObjCmd(ClientData client_data, /* Main window associated with WidgetInfo *wi; Tk_Window tkwin; unsigned int num; - int major_op, first_err, first_evt; - + int major_op, minor_op, first_err, first_evt; + if (!inited) { InitZinc(interp); } @@ -414,8 +419,19 @@ ZincObjCmd(ClientData client_data, /* Main window associated with wi->interp = interp; wi->dpy = Tk_Display(tkwin); wi->screen = Tk_Screen(tkwin); - wi->has_x_shm = XQueryExtension(wi->dpy, "MIT-SHM", - &major_op, &first_evt, &first_err); + wi->has_z_pixmaps = False; + wi->has_x_shm = False; +#ifdef SHM + if (XQueryExtension(wi->dpy, "MIT-SHM", &major_op, &first_evt, &first_err)) { + ZnBool pixmaps; + if (XShmQueryVersion(wi->dpy, &major_op, &minor_op, &pixmaps) == True) { + wi->has_x_shm = True; + if ((pixmaps == True) && (XShmPixmapFormat(wi->dpy) == ZPixmap)) { + wi->has_z_pixmap = True; + } + } + } +#endif #ifdef SHAPE wi->has_x_shape = XQueryExtension(wi->dpy, "SHAPE", &major_op, &first_evt, &first_err); @@ -2103,8 +2119,7 @@ Contour(WidgetInfo *wi, } cmd = ops[index]; - result = ZnItemWithTagOrId(wi, args[4], wi->top_group, True, - &shape, search); + result = ZnItemWithTagOrId(wi, args[4], wi->top_group, True, &shape, search_var); if ((result == ZN_ERROR) || (shape == ZN_NO_ITEM)) { Tcl_ResetResult(wi->interp); if (ParseCoordList(wi, args[4], &points, &num_points) == ZN_ERROR) { @@ -2407,7 +2422,7 @@ WidgetObjCmd(ClientData client_data, /* Information about the widget. */ "lower", "monitor", "numparts", "postscript", "raise", "remove", "rotate", "scale", "select", "smooth", "tapply", "tdelete", "transform", "translate", "treset", - "trestore", "tsave", "type", "verticeat", NULL + "trestore", "tsave", "type", "vertexat", NULL }; enum sub_cmds { ZN_W_ADD, ZN_W_ADDTAG, ZN_W_ANCHORXY, ZN_W_BBOX, ZN_W_BECOMES, ZN_W_BIND, @@ -2419,7 +2434,7 @@ WidgetObjCmd(ClientData client_data, /* Information about the widget. */ ZN_W_LOWER, ZN_W_MONITOR, ZN_W_NUMPARTS, ZN_W_POSTSCRIPT, ZN_W_RAISE, ZN_W_REMOVE, ZN_W_ROTATE, ZN_W_SCALE, ZN_W_SELECT, ZN_W_SMOOTH, ZN_W_TAPPLY, ZN_W_TDELETE, ZN_W_TRANSFORM, ZN_W_TRANSLATE, ZN_W_TRESET, - ZN_W_TRESTORE, ZN_W_TSAVE, ZN_W_TYPE, ZN_W_VERTICE_AT, + ZN_W_TRESTORE, ZN_W_TSAVE, ZN_W_TYPE, ZN_W_VERTEX_AT, }; static char *sel_cmd_strings[] = { "adjust", "clear", "from", "item", "to", NULL @@ -2757,7 +2772,7 @@ WidgetObjCmd(ClientData client_data, /* Information about the widget. */ } result = ZnItemWithTagOrId(wi, args[3], wi->top_group, True, &grp, &search_var); - if ((result == ZN_ERROR) || (grp == ZN_NO_ITEM)) { + if ((result == ZN_ERROR) || (grp == ZN_NO_ITEM)|| (grp->class != ZnGroup)) { goto error; } if (argc == 5) { @@ -2842,7 +2857,7 @@ WidgetObjCmd(ClientData client_data, /* Information about the widget. */ "contour tagOrId operator coordListOrTagOrId"); goto error; } - if (Contour(wi, argc, args) == ZN_ERROR) { + if (Contour(wi, argc, args, &search_var) == ZN_ERROR) { goto error; } break; @@ -4005,20 +4020,29 @@ WidgetObjCmd(ClientData client_data, /* Information about the widget. */ } break; /* - * verticeat + * vertexat */ - case ZN_W_VERTICE_AT: + case ZN_W_VERTEX_AT: { ZnPoint p; int contour, vertex, o_vertex; if (argc != 5) { - Tcl_WrongNumArgs(interp, 1, args, " verticeat tagOrId x y"); + Tcl_WrongNumArgs(interp, 1, args, " vertexat tagOrId x y"); goto error; } - result = ZnItemWithTagOrId(wi, args[2], wi->top_group, True, - &item, &search_var); - if ((result == ZN_ERROR) || (item == ZN_NO_ITEM)) { + if (ZnTagSearchScan(wi, args[2], &search_var) == ZN_ERROR) { + goto error; + } + for (item = ZnTagSearchFirst(search_var, wi->top_group, True); + item != ZN_NO_ITEM; item = ZnTagSearchNext(search_var)) { + if (item->class->PickVertex != NULL) { + break; + } + } + if (item == ZN_NO_ITEM) { + Tcl_AppendResult(interp, "can't find a suitable item \"", + Tcl_GetString(args[2]), "\"", NULL); goto error; } if (Tcl_GetDoubleFromObj(interp, args[3], &p.x) == ZN_ERROR) { @@ -4029,13 +4053,11 @@ WidgetObjCmd(ClientData client_data, /* Information about the widget. */ } p.x -= wi->inset; p.y -= wi->inset; - if (item->class->PickVertex) { - item->class->PickVertex(item, &p, &contour, &vertex, &o_vertex); - l = Tcl_GetObjResult(interp); - Tcl_ListObjAppendElement(interp, l, Tcl_NewIntObj(contour)); - Tcl_ListObjAppendElement(interp, l, Tcl_NewIntObj(vertex)); - Tcl_ListObjAppendElement(interp, l, Tcl_NewIntObj(o_vertex)); - } + item->class->PickVertex(item, &p, &contour, &vertex, &o_vertex); + l = Tcl_GetObjResult(interp); + Tcl_ListObjAppendElement(interp, l, Tcl_NewIntObj(contour)); + Tcl_ListObjAppendElement(interp, l, Tcl_NewIntObj(vertex)); + Tcl_ListObjAppendElement(interp, l, Tcl_NewIntObj(o_vertex)); } } -- cgit v1.1