From 4d26ce66a87236432b7639714b8d587b8ac749f6 Mon Sep 17 00:00:00 2001 From: Stefan Frederik Date: Sun, 6 Dec 2020 16:10:22 +0100 Subject: [PATCH] more state variables into xctx: move / create new objects --- scconfig/src/scripts/find_fungw.c | 2 +- src/actions.c | 813 +++++++++++++++--------------- src/callback.c | 115 ++--- src/move.c | 696 ++++++++++++------------- src/xinit.c | 22 + src/xschem.h | 26 + 6 files changed, 876 insertions(+), 798 deletions(-) diff --git a/scconfig/src/scripts/find_fungw.c b/scconfig/src/scripts/find_fungw.c index 05da7f62..028a118a 100644 --- a/scconfig/src/scripts/find_fungw.c +++ b/scconfig/src/scripts/find_fungw.c @@ -86,7 +86,7 @@ int find_script_fungw_user_call_ctx(const char *name, int logdepth, int fatal) int find_script_fungw_cfg_pupdir(const char *name, int logdepth, int fatal) { const char *lf, *cf, *inc; - char * out; + char * out; char *test_c = NL "#include " NL "int main() {" diff --git a/src/actions.c b/src/actions.c index 401874e8..ea62da67 100644 --- a/src/actions.c +++ b/src/actions.c @@ -1414,48 +1414,45 @@ void view_unzoom(double z) void zoom_box(int what) { - static double x1,y1,x2,y2; - static double xx1,yy1,xx2,yy2; - if( (what & START) ) { - x1=x2=xctx->mousex_snap;y1=y2=xctx->mousey_snap; + xctx->nl_x1=xctx->nl_x2=xctx->mousex_snap;xctx->nl_y1=xctx->nl_y2=xctx->mousey_snap; xctx->ui_state |= STARTZOOM; } if( what & END) { xctx->ui_state &= ~STARTZOOM; - RECTORDER(x1,y1,x2,y2); - drawtemprect(xctx->gctiled, NOW, xx1,yy1,xx2,yy2); - xctx->xorigin=-x1;xctx->yorigin=-y1; - xctx->zoom=(x2-x1)/(xctx->areaw-4*INT_WIDTH(xctx->lw)); - yy1=(y2-y1)/(xctx->areah-4*INT_WIDTH(xctx->lw)); - if(yy1>xctx->zoom) xctx->zoom=yy1; + RECTORDER(xctx->nl_x1,xctx->nl_y1,xctx->nl_x2,xctx->nl_y2); + drawtemprect(xctx->gctiled, NOW, xctx->nl_xx1,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy2); + xctx->xorigin=-xctx->nl_x1;xctx->yorigin=-xctx->nl_y1; + xctx->zoom=(xctx->nl_x2-xctx->nl_x1)/(xctx->areaw-4*INT_WIDTH(xctx->lw)); + xctx->nl_yy1=(xctx->nl_y2-xctx->nl_y1)/(xctx->areah-4*INT_WIDTH(xctx->lw)); + if(xctx->nl_yy1>xctx->zoom) xctx->zoom=xctx->nl_yy1; xctx->mooz=1/xctx->zoom; change_linewidth(-1.); draw(); dbg(1, "zoom_box(): coord: %.16g %.16g %.16g %.16g zoom=%.16g\n", - x1,y1,xctx->mousex_snap, xctx->mousey_snap,xctx->zoom); + xctx->nl_x1,xctx->nl_y1,xctx->mousex_snap, xctx->mousey_snap,xctx->zoom); } if(what & RUBBER) { - xx1=x1;yy1=y1;xx2=x2;yy2=y2; - RECTORDER(xx1,yy1,xx2,yy2); - drawtemprect(xctx->gctiled,NOW, xx1,yy1,xx2,yy2); - x2=xctx->mousex_snap;y2=xctx->mousey_snap; + xctx->nl_xx1=xctx->nl_x1;xctx->nl_yy1=xctx->nl_y1;xctx->nl_xx2=xctx->nl_x2;xctx->nl_yy2=xctx->nl_y2; + RECTORDER(xctx->nl_xx1,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy2); + drawtemprect(xctx->gctiled,NOW, xctx->nl_xx1,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy2); + xctx->nl_x2=xctx->mousex_snap;xctx->nl_y2=xctx->mousey_snap; /* 20171211 update selected objects while dragging */ rebuild_selected_array(); bbox(START,0.0, 0.0, 0.0, 0.0); - bbox(ADD, xx1, yy1, xx2, yy2); + bbox(ADD, xctx->nl_xx1, xctx->nl_yy1, xctx->nl_xx2, xctx->nl_yy2); bbox(SET,0.0, 0.0, 0.0, 0.0); draw_selection(gc[SELLAYER], 0); bbox(END,0.0, 0.0, 0.0, 0.0); - xx1=x1;yy1=y1;xx2=x2;yy2=y2; - RECTORDER(xx1,yy1,xx2,yy2); - drawtemprect(gc[SELLAYER], NOW, xx1,yy1,xx2,yy2); + xctx->nl_xx1=xctx->nl_x1;xctx->nl_yy1=xctx->nl_y1;xctx->nl_xx2=xctx->nl_x2;xctx->nl_yy2=xctx->nl_y2; + RECTORDER(xctx->nl_xx1,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy2); + drawtemprect(gc[SELLAYER], NOW, xctx->nl_xx1,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy2); } } @@ -1546,145 +1543,162 @@ void restore_selection(double x1, double y1, double x2, double y2) void new_wire(int what, double mx_snap, double my_snap) { - static double x1,y1,x2,y2; - static double xx1,yy1,xx2,yy2; + if( (what & PLACE) ) { + if( (xctx->ui_state & STARTWIRE) && (xctx->nl_x1!=xctx->nl_x2 || xctx->nl_y1!=xctx->nl_y2) ) { + push_undo(); + if(manhattan_lines==1) { + if(xctx->nl_xx2!=xctx->nl_xx1) { + xctx->nl_xx1 = xctx->nl_x1; xctx->nl_yy1 = xctx->nl_y1; + xctx->nl_xx2 = xctx->nl_x2; xctx->nl_yy2 = xctx->nl_y2; + ORDER(xctx->nl_xx1,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy1); + storeobject(-1, xctx->nl_xx1,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy1,WIRE,0,0,NULL); + drawline(WIRELAYER,NOW, xctx->nl_xx1,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy1, 0); + } + if(xctx->nl_yy2!=xctx->nl_yy1) { + xctx->nl_xx1 = xctx->nl_x1; xctx->nl_yy1 = xctx->nl_y1; + xctx->nl_xx2 = xctx->nl_x2; xctx->nl_yy2 = xctx->nl_y2; + ORDER(xctx->nl_xx2,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy2); + storeobject(-1, xctx->nl_xx2,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy2,WIRE,0,0,NULL); + drawline(WIRELAYER,NOW, xctx->nl_xx2,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy2, 0); + } + } else if(manhattan_lines==2) { + if(xctx->nl_yy2!=xctx->nl_yy1) { + xctx->nl_xx1 = xctx->nl_x1; xctx->nl_yy1 = xctx->nl_y1; + xctx->nl_xx2 = xctx->nl_x2; xctx->nl_yy2 = xctx->nl_y2; + ORDER(xctx->nl_xx1,xctx->nl_yy1,xctx->nl_xx1,xctx->nl_yy2); + storeobject(-1, xctx->nl_xx1,xctx->nl_yy1,xctx->nl_xx1,xctx->nl_yy2,WIRE,0,0,NULL); + drawline(WIRELAYER,NOW, xctx->nl_xx1,xctx->nl_yy1,xctx->nl_xx1,xctx->nl_yy2, 0); + } + if(xctx->nl_xx2!=xctx->nl_xx1) { + xctx->nl_xx1=xctx->nl_x1;xctx->nl_yy1=xctx->nl_y1; + xctx->nl_xx2=xctx->nl_x2;xctx->nl_yy2=xctx->nl_y2; + ORDER(xctx->nl_xx1,xctx->nl_yy2,xctx->nl_xx2,xctx->nl_yy2); + storeobject(-1, xctx->nl_xx1,xctx->nl_yy2,xctx->nl_xx2,xctx->nl_yy2,WIRE,0,0,NULL); + drawline(WIRELAYER,NOW, xctx->nl_xx1,xctx->nl_yy2,xctx->nl_xx2,xctx->nl_yy2, 0); + } + } else { + xctx->nl_xx1 = xctx->nl_x1; xctx->nl_yy1 = xctx->nl_y1; + xctx->nl_xx2 = xctx->nl_x2; xctx->nl_yy2 = xctx->nl_y2; + ORDER(xctx->nl_xx1,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy2); + storeobject(-1, xctx->nl_xx1,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy2,WIRE,0,0,NULL); + drawline(WIRELAYER,NOW, xctx->nl_xx1,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy2, 0); + } + hash_wire(XINSERT, xctx->wires-1, 1); + /* xctx->prep_hash_wires = 0; */ + xctx->prep_hi_structs = 0; - if( (what & PLACE) ) { - if( (xctx->ui_state & STARTWIRE) && (x1!=x2 || y1!=y2) ) { - push_undo(); - if(manhattan_lines==1) { - if(xx2!=xx1) { - xx1 = x1; yy1 = y1; xx2 = x2; yy2 = y2; - ORDER(xx1,yy1,xx2,yy1); - storeobject(-1, xx1,yy1,xx2,yy1,WIRE,0,0,NULL); - drawline(WIRELAYER,NOW, xx1,yy1,xx2,yy1, 0); - } - if(yy2!=yy1) { - xx1 = x1; yy1 = y1; xx2 = x2; yy2 = y2; - ORDER(xx2,yy1,xx2,yy2); - storeobject(-1, xx2,yy1,xx2,yy2,WIRE,0,0,NULL); - drawline(WIRELAYER,NOW, xx2,yy1,xx2,yy2, 0); - } - } else if(manhattan_lines==2) { - if(yy2!=yy1) { - xx1 = x1; yy1 = y1; xx2 = x2; yy2 = y2; - ORDER(xx1,yy1,xx1,yy2); - storeobject(-1, xx1,yy1,xx1,yy2,WIRE,0,0,NULL); - drawline(WIRELAYER,NOW, xx1,yy1,xx1,yy2, 0); - } - if(xx2!=xx1) { - xx1=x1;yy1=y1;xx2=x2;yy2=y2; - ORDER(xx1,yy2,xx2,yy2); - storeobject(-1, xx1,yy2,xx2,yy2,WIRE,0,0,NULL); - drawline(WIRELAYER,NOW, xx1,yy2,xx2,yy2, 0); - } - } else { - xx1 = x1; yy1 = y1; xx2 = x2; yy2 = y2; - ORDER(xx1,yy1,xx2,yy2); - storeobject(-1, xx1,yy1,xx2,yy2,WIRE,0,0,NULL); - drawline(WIRELAYER,NOW, xx1,yy1,xx2,yy2, 0); - } - hash_wire(XINSERT, xctx->wires-1, 1); - /* xctx->prep_hash_wires = 0; */ - xctx->prep_hi_structs = 0; - - update_conn_cues(1,1); - if(show_pin_net_names) { - prepare_netlist_structs(0); - bbox(START , 0.0 , 0.0 , 0.0 , 0.0); - find_inst_to_be_redrawn(xctx->wire[xctx->wires-1].node); - find_inst_hash_clear(); - bbox(SET , 0.0 , 0.0 , 0.0 , 0.0); - draw(); - bbox(END , 0.0 , 0.0 , 0.0 , 0.0); - } - draw_hilight_net(1);/* for updating connection bubbles on hilight nets */ - } - if(! (what &END)) { - x1=mx_snap; - y1=my_snap; - x2=xctx->mousex_snap; - y2=xctx->mousey_snap; - xx1=x1; - yy1=y1; - xx2=xctx->mousex_snap; - yy2=xctx->mousey_snap; - if(manhattan_lines==1) { - x2 = mx_snap; y2 = my_snap; - xx1 = x1; yy1 = y1; xx2 = x2; yy2 = y2; - ORDER(xx1,yy1,xx2,yy1); - drawtempline(gc[WIRELAYER], NOW, xx1,yy1,xx2,yy1); - xx1 = x1; yy1 = y1; xx2 = x2; yy2 = y2; - ORDER(xx2,yy1,xx2,yy2); - drawtempline(gc[WIRELAYER], NOW, xx2,yy1,xx2,yy2); - } else if(manhattan_lines==2) { - x2 = mx_snap; y2 = my_snap; - xx1 = x1; yy1 = y1; xx2 = x2; yy2 = y2; - ORDER(xx1,yy1,xx1,yy2); - drawtempline(gc[WIRELAYER], NOW, xx1,yy1,xx1,yy2); - xx1 = x1; yy1 = y1; xx2 = x2; yy2 = y2; - ORDER(xx1,yy2,xx2,yy2); - drawtempline(gc[WIRELAYER], NOW, xx1,yy2,xx2,yy2); - } else { - x2 = mx_snap; y2 = my_snap; - xx1 = x1; yy1 = y1; xx2 = x2; yy2 = y2; - ORDER(xx1,yy1,xx2,yy2); - drawtempline(gc[WIRELAYER], NOW, xx1,yy1,xx2,yy2); - } - } - xctx->ui_state |= STARTWIRE; - } - if( what & END) { - xctx->ui_state &= ~STARTWIRE; - } - if( (what & RUBBER) ) { - if(manhattan_lines==1) { - xx1=x1;yy1=y1;xx2=x2;yy2=y2; - ORDER(xx1,yy1,xx2,yy1); - drawtempline(xctx->gctiled, NOW, xx1,yy1,xx2,yy1); - xx1=x1;yy1=y1;xx2=x2;yy2=y2; - ORDER(xx2,yy1,xx2,yy2); - drawtempline(xctx->gctiled, NOW, xx2,yy1,xx2,yy2); - restore_selection(x1, y1, x2, y2); - x2 = mx_snap; y2 = my_snap; - if(!(what & CLEAR)) { - xx1 = x1; yy1 = y1; xx2 = x2; yy2 = y2; - ORDER(xx1,yy1,xx2,yy1); - drawtempline(gc[WIRELAYER], NOW, xx1,yy1,xx2,yy1); - xx1 = x1; yy1 = y1; xx2 = x2; yy2 = y2; - ORDER(xx2,yy1,xx2,yy2); - drawtempline(gc[WIRELAYER], NOW, xx2,yy1,xx2,yy2); - } - } else if(manhattan_lines==2) { - xx1 = x1; yy1 = y1; xx2 = x2; yy2 = y2; - ORDER(xx1,yy1,xx1,yy2); - drawtempline(xctx->gctiled, NOW, xx1,yy1,xx1,yy2); - xx1 = x1; yy1 = y1; xx2 = x2; yy2 = y2; - ORDER(xx1,yy2,xx2,yy2); - drawtempline(xctx->gctiled, NOW, xx1,yy2,xx2,yy2); - restore_selection(x1, y1, x2, y2); - x2 = mx_snap; y2 = my_snap; - if(!(what & CLEAR)) { - xx1 = x1; yy1 = y1; xx2 = x2; yy2 = y2; - ORDER(xx1,yy1,xx1,yy2); - drawtempline(gc[WIRELAYER], NOW, xx1,yy1,xx1,yy2); - xx1 = x1; yy1 = y1; xx2 = x2; yy2 = y2; - ORDER(xx1,yy2,xx2,yy2); - drawtempline(gc[WIRELAYER], NOW, xx1,yy2,xx2,yy2); - } - } else { - xx1 = x1; yy1 = y1; xx2 = x2; yy2 = y2; - ORDER(xx1,yy1,xx2,yy2); - drawtempline(xctx->gctiled, NOW, xx1,yy1,xx2,yy2); - restore_selection(x1, y1, x2, y2); - x2 = mx_snap; y2 = my_snap; - if(!(what & CLEAR)) { - xx1 = x1; yy1 = y1; xx2 = x2; yy2 = y2; - ORDER(xx1,yy1,xx2,yy2); - drawtempline(gc[WIRELAYER], NOW, xx1,yy1,xx2,yy2); - } - } - } + update_conn_cues(1,1); + if(show_pin_net_names) { + prepare_netlist_structs(0); + bbox(START , 0.0 , 0.0 , 0.0 , 0.0); + find_inst_to_be_redrawn(xctx->wire[xctx->wires-1].node); + find_inst_hash_clear(); + bbox(SET , 0.0 , 0.0 , 0.0 , 0.0); + draw(); + bbox(END , 0.0 , 0.0 , 0.0 , 0.0); + } + draw_hilight_net(1);/* for updating connection bubbles on hilight nets */ + } + if(! (what &END)) { + xctx->nl_x1=mx_snap; + xctx->nl_y1=my_snap; + xctx->nl_x2=xctx->mousex_snap; + xctx->nl_y2=xctx->mousey_snap; + xctx->nl_xx1=xctx->nl_x1; + xctx->nl_yy1=xctx->nl_y1; + xctx->nl_xx2=xctx->mousex_snap; + xctx->nl_yy2=xctx->mousey_snap; + if(manhattan_lines==1) { + xctx->nl_x2 = mx_snap; xctx->nl_y2 = my_snap; + xctx->nl_xx1 = xctx->nl_x1; xctx->nl_yy1 = xctx->nl_y1; + xctx->nl_xx2 = xctx->nl_x2; xctx->nl_yy2 = xctx->nl_y2; + ORDER(xctx->nl_xx1,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy1); + drawtempline(gc[WIRELAYER], NOW, xctx->nl_xx1,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy1); + xctx->nl_xx1 = xctx->nl_x1; xctx->nl_yy1 = xctx->nl_y1; + xctx->nl_xx2 = xctx->nl_x2; xctx->nl_yy2 = xctx->nl_y2; + ORDER(xctx->nl_xx2,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy2); + drawtempline(gc[WIRELAYER], NOW, xctx->nl_xx2,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy2); + } else if(manhattan_lines==2) { + xctx->nl_x2 = mx_snap; xctx->nl_y2 = my_snap; + xctx->nl_xx1 = xctx->nl_x1; xctx->nl_yy1 = xctx->nl_y1; + xctx->nl_xx2 = xctx->nl_x2; xctx->nl_yy2 = xctx->nl_y2; + ORDER(xctx->nl_xx1,xctx->nl_yy1,xctx->nl_xx1,xctx->nl_yy2); + drawtempline(gc[WIRELAYER], NOW, xctx->nl_xx1,xctx->nl_yy1,xctx->nl_xx1,xctx->nl_yy2); + xctx->nl_xx1 = xctx->nl_x1; xctx->nl_yy1 = xctx->nl_y1; + xctx->nl_xx2 = xctx->nl_x2; xctx->nl_yy2 = xctx->nl_y2; + ORDER(xctx->nl_xx1,xctx->nl_yy2,xctx->nl_xx2,xctx->nl_yy2); + drawtempline(gc[WIRELAYER], NOW, xctx->nl_xx1,xctx->nl_yy2,xctx->nl_xx2,xctx->nl_yy2); + } else { + xctx->nl_x2 = mx_snap; xctx->nl_y2 = my_snap; + xctx->nl_xx1 = xctx->nl_x1; xctx->nl_yy1 = xctx->nl_y1; + xctx->nl_xx2 = xctx->nl_x2; xctx->nl_yy2 = xctx->nl_y2; + ORDER(xctx->nl_xx1,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy2); + drawtempline(gc[WIRELAYER], NOW, xctx->nl_xx1,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy2); + } + } + xctx->ui_state |= STARTWIRE; + } + if( what & END) { + xctx->ui_state &= ~STARTWIRE; + } + if( (what & RUBBER) ) { + if(manhattan_lines==1) { + xctx->nl_xx1=xctx->nl_x1;xctx->nl_yy1=xctx->nl_y1; + xctx->nl_xx2=xctx->nl_x2;xctx->nl_yy2=xctx->nl_y2; + ORDER(xctx->nl_xx1,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy1); + drawtempline(xctx->gctiled, NOW, xctx->nl_xx1,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy1); + xctx->nl_xx1=xctx->nl_x1;xctx->nl_yy1=xctx->nl_y1; + xctx->nl_xx2=xctx->nl_x2;xctx->nl_yy2=xctx->nl_y2; + ORDER(xctx->nl_xx2,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy2); + drawtempline(xctx->gctiled, NOW, xctx->nl_xx2,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy2); + restore_selection(xctx->nl_x1, xctx->nl_y1, xctx->nl_x2, xctx->nl_y2); + xctx->nl_x2 = mx_snap; xctx->nl_y2 = my_snap; + if(!(what & CLEAR)) { + xctx->nl_xx1 = xctx->nl_x1; xctx->nl_yy1 = xctx->nl_y1; + xctx->nl_xx2 = xctx->nl_x2; xctx->nl_yy2 = xctx->nl_y2; + ORDER(xctx->nl_xx1,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy1); + drawtempline(gc[WIRELAYER], NOW, xctx->nl_xx1,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy1); + xctx->nl_xx1 = xctx->nl_x1; xctx->nl_yy1 = xctx->nl_y1; + xctx->nl_xx2 = xctx->nl_x2; xctx->nl_yy2 = xctx->nl_y2; + ORDER(xctx->nl_xx2,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy2); + drawtempline(gc[WIRELAYER], NOW, xctx->nl_xx2,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy2); + } + } else if(manhattan_lines==2) { + xctx->nl_xx1 = xctx->nl_x1; xctx->nl_yy1 = xctx->nl_y1; + xctx->nl_xx2 = xctx->nl_x2; xctx->nl_yy2 = xctx->nl_y2; + ORDER(xctx->nl_xx1,xctx->nl_yy1,xctx->nl_xx1,xctx->nl_yy2); + drawtempline(xctx->gctiled, NOW, xctx->nl_xx1,xctx->nl_yy1,xctx->nl_xx1,xctx->nl_yy2); + xctx->nl_xx1 = xctx->nl_x1; xctx->nl_yy1 = xctx->nl_y1; + xctx->nl_xx2 = xctx->nl_x2; xctx->nl_yy2 = xctx->nl_y2; + ORDER(xctx->nl_xx1,xctx->nl_yy2,xctx->nl_xx2,xctx->nl_yy2); + drawtempline(xctx->gctiled, NOW, xctx->nl_xx1,xctx->nl_yy2,xctx->nl_xx2,xctx->nl_yy2); + restore_selection(xctx->nl_x1, xctx->nl_y1, xctx->nl_x2, xctx->nl_y2); + xctx->nl_x2 = mx_snap; xctx->nl_y2 = my_snap; + if(!(what & CLEAR)) { + xctx->nl_xx1 = xctx->nl_x1; xctx->nl_yy1 = xctx->nl_y1; + xctx->nl_xx2 = xctx->nl_x2; xctx->nl_yy2 = xctx->nl_y2; + ORDER(xctx->nl_xx1,xctx->nl_yy1,xctx->nl_xx1,xctx->nl_yy2); + drawtempline(gc[WIRELAYER], NOW, xctx->nl_xx1,xctx->nl_yy1,xctx->nl_xx1,xctx->nl_yy2); + xctx->nl_xx1 = xctx->nl_x1; xctx->nl_yy1 = xctx->nl_y1; + xctx->nl_xx2 = xctx->nl_x2; xctx->nl_yy2 = xctx->nl_y2; + ORDER(xctx->nl_xx1,xctx->nl_yy2,xctx->nl_xx2,xctx->nl_yy2); + drawtempline(gc[WIRELAYER], NOW, xctx->nl_xx1,xctx->nl_yy2,xctx->nl_xx2,xctx->nl_yy2); + } + } else { + xctx->nl_xx1 = xctx->nl_x1; xctx->nl_yy1 = xctx->nl_y1; + xctx->nl_xx2 = xctx->nl_x2; xctx->nl_yy2 = xctx->nl_y2; + ORDER(xctx->nl_xx1,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy2); + drawtempline(xctx->gctiled, NOW, xctx->nl_xx1,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy2); + restore_selection(xctx->nl_x1, xctx->nl_y1, xctx->nl_x2, xctx->nl_y2); + xctx->nl_x2 = mx_snap; xctx->nl_y2 = my_snap; + if(!(what & CLEAR)) { + xctx->nl_xx1 = xctx->nl_x1; xctx->nl_yy1 = xctx->nl_y1; + xctx->nl_xx2 = xctx->nl_x2; xctx->nl_yy2 = xctx->nl_y2; + ORDER(xctx->nl_xx1,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy2); + drawtempline(gc[WIRELAYER], NOW, xctx->nl_xx1,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy2); + } + } + } } void change_layer() @@ -1732,221 +1746,226 @@ void change_layer() void new_arc(int what, double sweep) { - static double x, y, r, a, b; - static double x1, y1, x2, y2, x3, y3; - static double xx1, yy1, xx2, yy2; - static int state; - static double sweep_angle; if(what & PLACE) { - state=0; - r = -1.; - sweep_angle=sweep; - xx1 = xx2 = x1 = x2 = x3 = xctx->mousex_snap; - yy1 = yy2 = y1 = y2 = y3 = xctx->mousey_snap; + xctx->nl_state=0; + xctx->nl_r = -1.; + xctx->nl_sweep_angle=sweep; + xctx->nl_xx1 = xctx->nl_xx2 = xctx->nl_x1 = xctx->nl_x2 = xctx->nl_x3 = xctx->mousex_snap; + xctx->nl_yy1 = xctx->nl_yy2 = xctx->nl_y1 = xctx->nl_y2 = xctx->nl_y3 = xctx->mousey_snap; xctx->ui_state |= STARTARC; } if(what & SET) { - if(state==0) { - x2 = xctx->mousex_snap; - y2 = xctx->mousey_snap; - drawtempline(xctx->gctiled, NOW, xx1,yy1,xx2,yy2); - state=1; - } else if(state==1) { - x3 = xctx->mousex_snap; - y3 = xctx->mousey_snap; - arc_3_points(x1, y1, x2, y2, x3, y3, &x, &y, &r, &a, &b); - if(sweep_angle==360.) b=360.; - if(r>0.) { + if(xctx->nl_state==0) { + xctx->nl_x2 = xctx->mousex_snap; + xctx->nl_y2 = xctx->mousey_snap; + drawtempline(xctx->gctiled, NOW, xctx->nl_xx1,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy2); + xctx->nl_state=1; + } else if(xctx->nl_state==1) { + xctx->nl_x3 = xctx->mousex_snap; + xctx->nl_y3 = xctx->mousey_snap; + arc_3_points(xctx->nl_x1, xctx->nl_y1, xctx->nl_x2, xctx->nl_y2, + xctx->nl_x3, xctx->nl_y3, &xctx->nl_x, &xctx->nl_y, &xctx->nl_r, &xctx->nl_a, &xctx->nl_b); + if(xctx->nl_sweep_angle==360.) xctx->nl_b=360.; + if(xctx->nl_r>0.) { push_undo(); - drawarc(rectcolor, NOW, x, y, r, a, b, 0, 0); - store_arc(-1, x, y, r, a, b, rectcolor, 0, NULL); + drawarc(rectcolor, NOW, xctx->nl_x, xctx->nl_y, xctx->nl_r, xctx->nl_a, xctx->nl_b, 0, 0); + store_arc(-1, xctx->nl_x, xctx->nl_y, xctx->nl_r, xctx->nl_a, xctx->nl_b, rectcolor, 0, NULL); } xctx->ui_state &= ~STARTARC; - state=0; + xctx->nl_state=0; } } if(what & RUBBER) { - if(state==0) { - drawtempline(xctx->gctiled, NOW, xx1,yy1,xx2,yy2); - xx2 = xctx->mousex_snap; - yy2 = xctx->mousey_snap; - xx1 = x1;yy1 = y1; - ORDER(xx1,yy1,xx2,yy2); - drawtempline(gc[SELLAYER], NOW, xx1,yy1,xx2,yy2); + if(xctx->nl_state==0) { + drawtempline(xctx->gctiled, NOW, xctx->nl_xx1,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy2); + xctx->nl_xx2 = xctx->mousex_snap; + xctx->nl_yy2 = xctx->mousey_snap; + xctx->nl_xx1 = xctx->nl_x1;xctx->nl_yy1 = xctx->nl_y1; + ORDER(xctx->nl_xx1,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy2); + drawtempline(gc[SELLAYER], NOW, xctx->nl_xx1,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy2); } - else if(state==1) { - x3 = xctx->mousex_snap; - y3 = xctx->mousey_snap; - if(r>0.) drawtemparc(xctx->gctiled, NOW, x, y, r, a, b); - arc_3_points(x1, y1, x2, y2, x3, y3, &x, &y, &r, &a, &b); - if(sweep_angle==360.) b=360.; - if(r>0.) drawtemparc(gc[rectcolor], NOW, x, y, r, a, b); + else if(xctx->nl_state==1) { + xctx->nl_x3 = xctx->mousex_snap; + xctx->nl_y3 = xctx->mousey_snap; + if(xctx->nl_r>0.) drawtemparc(xctx->gctiled, NOW, xctx->nl_x, xctx->nl_y, xctx->nl_r, xctx->nl_a, xctx->nl_b); + arc_3_points(xctx->nl_x1, xctx->nl_y1, xctx->nl_x2, xctx->nl_y2, + xctx->nl_x3, xctx->nl_y3, &xctx->nl_x, &xctx->nl_y, &xctx->nl_r, &xctx->nl_a, &xctx->nl_b); + if(xctx->nl_sweep_angle==360.) xctx->nl_b=360.; + if(xctx->nl_r>0.) drawtemparc(gc[rectcolor], NOW, xctx->nl_x, xctx->nl_y, xctx->nl_r, xctx->nl_a, xctx->nl_b); } } } + void new_line(int what) { - static double x1,y1,x2,y2; - static double xx1,yy1,xx2,yy2; + if( (what & PLACE) ) + { + if( (xctx->nl_x1!=xctx->nl_x2 || xctx->nl_y1!=xctx->nl_y2) && (xctx->ui_state & STARTLINE) ) + { + push_undo(); + if(manhattan_lines==1) { + if(xctx->nl_xx2!=xctx->nl_xx1) { + xctx->nl_xx1 = xctx->nl_x1; xctx->nl_yy1 = xctx->nl_y1; + xctx->nl_xx2 = xctx->nl_x2; xctx->nl_yy2 = xctx->nl_y2; + ORDER(xctx->nl_xx1,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy1); + storeobject(-1, xctx->nl_xx1,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy1,LINE,rectcolor,0,NULL); + drawline(rectcolor,NOW, xctx->nl_xx1,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy1, 0); + } + if(xctx->nl_yy2!=xctx->nl_yy1) { + xctx->nl_xx1 = xctx->nl_x1; xctx->nl_yy1 = xctx->nl_y1; + xctx->nl_xx2 = xctx->nl_x2; xctx->nl_yy2 = xctx->nl_y2; + ORDER(xctx->nl_xx2,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy2); + storeobject(-1, xctx->nl_xx2,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy2,LINE,rectcolor,0,NULL); + drawline(rectcolor,NOW, xctx->nl_xx2,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy2, 0); + } + } else if(manhattan_lines==2) { + if(xctx->nl_yy2!=xctx->nl_yy1) { + xctx->nl_xx1 = xctx->nl_x1; xctx->nl_yy1 = xctx->nl_y1; + xctx->nl_xx2 = xctx->nl_x2; xctx->nl_yy2 = xctx->nl_y2; + ORDER(xctx->nl_xx1,xctx->nl_yy1,xctx->nl_xx1,xctx->nl_yy2); + storeobject(-1, xctx->nl_xx1,xctx->nl_yy1,xctx->nl_xx1,xctx->nl_yy2,LINE,rectcolor,0,NULL); + drawline(rectcolor,NOW, xctx->nl_xx1,xctx->nl_yy1,xctx->nl_xx1,xctx->nl_yy2, 0); + } + if(xctx->nl_xx2!=xctx->nl_xx1) { + xctx->nl_xx1=xctx->nl_x1;xctx->nl_yy1=xctx->nl_y1; + xctx->nl_xx2=xctx->nl_x2;xctx->nl_yy2=xctx->nl_y2; + ORDER(xctx->nl_xx1,xctx->nl_yy2,xctx->nl_xx2,xctx->nl_yy2); + storeobject(-1, xctx->nl_xx1,xctx->nl_yy2,xctx->nl_xx2,xctx->nl_yy2,LINE,rectcolor,0,NULL); + drawline(rectcolor,NOW, xctx->nl_xx1,xctx->nl_yy2,xctx->nl_xx2,xctx->nl_yy2, 0); + } + } else { + xctx->nl_xx1 = xctx->nl_x1; xctx->nl_yy1 = xctx->nl_y1; + xctx->nl_xx2 = xctx->nl_x2; xctx->nl_yy2 = xctx->nl_y2; + ORDER(xctx->nl_xx1,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy2); + storeobject(-1, xctx->nl_xx1,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy2,LINE,rectcolor,0,NULL); + drawline(rectcolor,NOW, xctx->nl_xx1,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy2, 0); + } + } + xctx->nl_x1=xctx->nl_x2=xctx->mousex_snap;xctx->nl_y1=xctx->nl_y2=xctx->mousey_snap; + xctx->ui_state |= STARTLINE; + } + if( what & END) + { + xctx->ui_state &= ~STARTLINE; + } - if( (what & PLACE) ) - { - if( (x1!=x2 || y1!=y2) && (xctx->ui_state & STARTLINE) ) - { - push_undo(); - if(manhattan_lines==1) { - if(xx2!=xx1) { - xx1 = x1; yy1 = y1; xx2 = x2; yy2 = y2; - ORDER(xx1,yy1,xx2,yy1); - storeobject(-1, xx1,yy1,xx2,yy1,LINE,rectcolor,0,NULL); - drawline(rectcolor,NOW, xx1,yy1,xx2,yy1, 0); - } - if(yy2!=yy1) { - xx1 = x1; yy1 = y1; xx2 = x2; yy2 = y2; - ORDER(xx2,yy1,xx2,yy2); - storeobject(-1, xx2,yy1,xx2,yy2,LINE,rectcolor,0,NULL); - drawline(rectcolor,NOW, xx2,yy1,xx2,yy2, 0); - } - } else if(manhattan_lines==2) { - if(yy2!=yy1) { - xx1 = x1; yy1 = y1; xx2 = x2; yy2 = y2; - ORDER(xx1,yy1,xx1,yy2); - storeobject(-1, xx1,yy1,xx1,yy2,LINE,rectcolor,0,NULL); - drawline(rectcolor,NOW, xx1,yy1,xx1,yy2, 0); - } - if(xx2!=xx1) { - xx1=x1;yy1=y1;xx2=x2;yy2=y2; - ORDER(xx1,yy2,xx2,yy2); - storeobject(-1, xx1,yy2,xx2,yy2,LINE,rectcolor,0,NULL); - drawline(rectcolor,NOW, xx1,yy2,xx2,yy2, 0); - } - } else { - xx1 = x1; yy1 = y1; xx2 = x2; yy2 = y2; - ORDER(xx1,yy1,xx2,yy2); - storeobject(-1, xx1,yy1,xx2,yy2,LINE,rectcolor,0,NULL); - drawline(rectcolor,NOW, xx1,yy1,xx2,yy2, 0); - } - } - x1=x2=xctx->mousex_snap;y1=y2=xctx->mousey_snap; - xctx->ui_state |= STARTLINE; - } - if( what & END) - { - xctx->ui_state &= ~STARTLINE; - } - - if(what & RUBBER) - { - if(manhattan_lines==1) { - xx1=x1;yy1=y1;xx2=x2;yy2=y2; - ORDER(xx1,yy1,xx2,yy1); - drawtempline(xctx->gctiled, NOW, xx1,yy1,xx2,yy1); - xx1=x1;yy1=y1;xx2=x2;yy2=y2; - ORDER(xx2,yy1,xx2,yy2); - drawtempline(xctx->gctiled, NOW, xx2,yy1,xx2,yy2); - restore_selection(x1, y1, x2, y2); - x2 = xctx->mousex_snap; y2 = xctx->mousey_snap; - if(!(what & CLEAR)) { - xx1 = x1; yy1 = y1; xx2 = x2; yy2 = y2; - ORDER(xx1,yy1,xx2,yy1); - drawtempline(gc[rectcolor], NOW, xx1,yy1,xx2,yy1); - xx1 = x1; yy1 = y1; xx2 = x2; yy2 = y2; - ORDER(xx2,yy1,xx2,yy2); - drawtempline(gc[rectcolor], NOW, xx2,yy1,xx2,yy2); - } - } else if(manhattan_lines==2) { - xx1 = x1; yy1 = y1; xx2 = x2; yy2 = y2; - ORDER(xx1,yy1,xx1,yy2); - drawtempline(xctx->gctiled, NOW, xx1,yy1,xx1,yy2); - xx1 = x1; yy1 = y1; xx2 = x2; yy2 = y2; - ORDER(xx1,yy2,xx2,yy2); - drawtempline(xctx->gctiled, NOW, xx1,yy2,xx2,yy2); - restore_selection(x1, y1, x2, y2); - x2 = xctx->mousex_snap; y2 = xctx->mousey_snap; - if(!(what & CLEAR)) { - xx1 = x1; yy1 = y1; xx2 = x2; yy2 = y2; - ORDER(xx1,yy1,xx1,yy2); - drawtempline(gc[rectcolor], NOW, xx1,yy1,xx1,yy2); - xx1 = x1; yy1 = y1; xx2 = x2; yy2 = y2; - ORDER(xx1,yy2,xx2,yy2); - drawtempline(gc[rectcolor], NOW, xx1,yy2,xx2,yy2); - } - } else { - xx1 = x1; yy1 = y1; xx2 = x2; yy2 = y2; - ORDER(xx1,yy1,xx2,yy2); - drawtempline(xctx->gctiled, NOW, xx1,yy1,xx2,yy2); - restore_selection(x1, y1, x2, y2); - x2 = xctx->mousex_snap; y2 = xctx->mousey_snap; - if(!(what & CLEAR)) { - xx1 = x1; yy1 = y1; xx2 = x2; yy2 = y2; - ORDER(xx1,yy1,xx2,yy2); - drawtempline(gc[rectcolor], NOW, xx1,yy1,xx2,yy2); - } - } - } + if(what & RUBBER) + { + if(manhattan_lines==1) { + xctx->nl_xx1=xctx->nl_x1;xctx->nl_yy1=xctx->nl_y1; + xctx->nl_xx2=xctx->nl_x2;xctx->nl_yy2=xctx->nl_y2; + ORDER(xctx->nl_xx1,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy1); + drawtempline(xctx->gctiled, NOW, xctx->nl_xx1,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy1); + xctx->nl_xx1=xctx->nl_x1;xctx->nl_yy1=xctx->nl_y1; + xctx->nl_xx2=xctx->nl_x2;xctx->nl_yy2=xctx->nl_y2; + ORDER(xctx->nl_xx2,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy2); + drawtempline(xctx->gctiled, NOW, xctx->nl_xx2,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy2); + restore_selection(xctx->nl_x1, xctx->nl_y1, xctx->nl_x2, xctx->nl_y2); + xctx->nl_x2 = xctx->mousex_snap; xctx->nl_y2 = xctx->mousey_snap; + if(!(what & CLEAR)) { + xctx->nl_xx1 = xctx->nl_x1; xctx->nl_yy1 = xctx->nl_y1; + xctx->nl_xx2 = xctx->nl_x2; xctx->nl_yy2 = xctx->nl_y2; + ORDER(xctx->nl_xx1,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy1); + drawtempline(gc[rectcolor], NOW, xctx->nl_xx1,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy1); + xctx->nl_xx1 = xctx->nl_x1; xctx->nl_yy1 = xctx->nl_y1; + xctx->nl_xx2 = xctx->nl_x2; xctx->nl_yy2 = xctx->nl_y2; + ORDER(xctx->nl_xx2,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy2); + drawtempline(gc[rectcolor], NOW, xctx->nl_xx2,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy2); + } + } else if(manhattan_lines==2) { + xctx->nl_xx1 = xctx->nl_x1; xctx->nl_yy1 = xctx->nl_y1; + xctx->nl_xx2 = xctx->nl_x2; xctx->nl_yy2 = xctx->nl_y2; + ORDER(xctx->nl_xx1,xctx->nl_yy1,xctx->nl_xx1,xctx->nl_yy2); + drawtempline(xctx->gctiled, NOW, xctx->nl_xx1,xctx->nl_yy1,xctx->nl_xx1,xctx->nl_yy2); + xctx->nl_xx1 = xctx->nl_x1; xctx->nl_yy1 = xctx->nl_y1; + xctx->nl_xx2 = xctx->nl_x2; xctx->nl_yy2 = xctx->nl_y2; + ORDER(xctx->nl_xx1,xctx->nl_yy2,xctx->nl_xx2,xctx->nl_yy2); + drawtempline(xctx->gctiled, NOW, xctx->nl_xx1,xctx->nl_yy2,xctx->nl_xx2,xctx->nl_yy2); + restore_selection(xctx->nl_x1, xctx->nl_y1, xctx->nl_x2, xctx->nl_y2); + xctx->nl_x2 = xctx->mousex_snap; xctx->nl_y2 = xctx->mousey_snap; + if(!(what & CLEAR)) { + xctx->nl_xx1 = xctx->nl_x1; xctx->nl_yy1 = xctx->nl_y1; + xctx->nl_xx2 = xctx->nl_x2; xctx->nl_yy2 = xctx->nl_y2; + ORDER(xctx->nl_xx1,xctx->nl_yy1,xctx->nl_xx1,xctx->nl_yy2); + drawtempline(gc[rectcolor], NOW, xctx->nl_xx1,xctx->nl_yy1,xctx->nl_xx1,xctx->nl_yy2); + xctx->nl_xx1 = xctx->nl_x1; xctx->nl_yy1 = xctx->nl_y1; + xctx->nl_xx2 = xctx->nl_x2; xctx->nl_yy2 = xctx->nl_y2; + ORDER(xctx->nl_xx1,xctx->nl_yy2,xctx->nl_xx2,xctx->nl_yy2); + drawtempline(gc[rectcolor], NOW, xctx->nl_xx1,xctx->nl_yy2,xctx->nl_xx2,xctx->nl_yy2); + } + } else { + xctx->nl_xx1 = xctx->nl_x1; xctx->nl_yy1 = xctx->nl_y1; + xctx->nl_xx2 = xctx->nl_x2; xctx->nl_yy2 = xctx->nl_y2; + ORDER(xctx->nl_xx1,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy2); + drawtempline(xctx->gctiled, NOW, xctx->nl_xx1,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy2); + restore_selection(xctx->nl_x1, xctx->nl_y1, xctx->nl_x2, xctx->nl_y2); + xctx->nl_x2 = xctx->mousex_snap; xctx->nl_y2 = xctx->mousey_snap; + if(!(what & CLEAR)) { + xctx->nl_xx1 = xctx->nl_x1; xctx->nl_yy1 = xctx->nl_y1; + xctx->nl_xx2 = xctx->nl_x2; xctx->nl_yy2 = xctx->nl_y2; + ORDER(xctx->nl_xx1,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy2); + drawtempline(gc[rectcolor], NOW, xctx->nl_xx1,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy2); + } + } + } } void new_rect(int what) { - static double x1,y1,x2,y2; - static double xx1,yy1,xx2,yy2; - - if( (what & PLACE) ) + if( (what & PLACE) ) + { + if( (xctx->nl_x1!=xctx->nl_x2 || xctx->nl_y1!=xctx->nl_y2) && (xctx->ui_state & STARTRECT) ) { - if( (x1!=x2 || y1!=y2) && (xctx->ui_state & STARTRECT) ) - { - int save_draw; - RECTORDER(x1,y1,x2,y2); - push_undo(); - drawrect(rectcolor, NOW, x1,y1,x2,y2, 0); - save_draw = draw_window; - draw_window = 1; - filledrect(rectcolor, NOW, x1,y1,x2,y2); /* draw fill pattern even in XCopyArea mode */ - draw_window = save_draw; - storeobject(-1, x1,y1,x2,y2,xRECT,rectcolor, 0, NULL); - } - x1=x2=xctx->mousex_snap;y1=y2=xctx->mousey_snap; - xctx->ui_state |= STARTRECT; - } - if( what & END) - { - xctx->ui_state &= ~STARTRECT; - } - if(what & RUBBER) - { - xx1=x1;yy1=y1;xx2=x2;yy2=y2; - RECTORDER(xx1,yy1,xx2,yy2); - drawtemprect(xctx->gctiled,NOW, xx1,yy1,xx2,yy2); - x2=xctx->mousex_snap;y2=xctx->mousey_snap; - xx1=x1;yy1=y1;xx2=x2;yy2=y2; - RECTORDER(xx1,yy1,xx2,yy2); - drawtemprect(gc[rectcolor], NOW, xx1,yy1,xx2,yy2); + int save_draw; + RECTORDER(xctx->nl_x1,xctx->nl_y1,xctx->nl_x2,xctx->nl_y2); + push_undo(); + drawrect(rectcolor, NOW, xctx->nl_x1,xctx->nl_y1,xctx->nl_x2,xctx->nl_y2, 0); + save_draw = draw_window; + draw_window = 1; + /* draw fill pattern even in XCopyArea mode */ + filledrect(rectcolor, NOW, xctx->nl_x1,xctx->nl_y1,xctx->nl_x2,xctx->nl_y2); + draw_window = save_draw; + storeobject(-1, xctx->nl_x1,xctx->nl_y1,xctx->nl_x2,xctx->nl_y2,xRECT,rectcolor, 0, NULL); } + xctx->nl_x1=xctx->nl_x2=xctx->mousex_snap;xctx->nl_y1=xctx->nl_y2=xctx->mousey_snap; + xctx->ui_state |= STARTRECT; + } + if( what & END) + { + xctx->ui_state &= ~STARTRECT; + } + if(what & RUBBER) + { + xctx->nl_xx1=xctx->nl_x1;xctx->nl_yy1=xctx->nl_y1;xctx->nl_xx2=xctx->nl_x2;xctx->nl_yy2=xctx->nl_y2; + RECTORDER(xctx->nl_xx1,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy2); + drawtemprect(xctx->gctiled,NOW, xctx->nl_xx1,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy2); + xctx->nl_x2=xctx->mousex_snap;xctx->nl_y2=xctx->mousey_snap; + xctx->nl_xx1=xctx->nl_x1;xctx->nl_yy1=xctx->nl_y1;xctx->nl_xx2=xctx->nl_x2;xctx->nl_yy2=xctx->nl_y2; + RECTORDER(xctx->nl_xx1,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy2); + drawtemprect(gc[rectcolor], NOW, xctx->nl_xx1,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy2); + } } void new_polygon(int what) { - static double *x=NULL, *y=NULL; - static int points=0; - static int maxpoints=0; + if( what & PLACE ) xctx->nl_points=0; /* start new polygon placement */ - if( what & PLACE ) points=0; /* start new polygon placement */ - - if(points >= maxpoints-1) { /* check storage for 2 points */ - maxpoints = (1+points / CADCHUNKALLOC) * CADCHUNKALLOC; - my_realloc(17, &x, sizeof(double)*maxpoints); - my_realloc(18, &y, sizeof(double)*maxpoints); + if(xctx->nl_points >= xctx->nl_maxpoints-1) { /* check storage for 2 xctx->nl_points */ + xctx->nl_maxpoints = (1+xctx->nl_points / CADCHUNKALLOC) * CADCHUNKALLOC; + my_realloc(17, &xctx->nl_polyx, sizeof(double)*xctx->nl_maxpoints); + my_realloc(18, &xctx->nl_polyy, sizeof(double)*xctx->nl_maxpoints); } if( what & PLACE ) { - /* fprintf(errfp, "new_poly: PLACE, points=%d\n", points); */ - y[points]=xctx->mousey_snap; - x[points]=xctx->mousex_snap; - points++; - x[points]=x[points-1]; /* prepare next point for rubber */ - y[points] = y[points-1]; - /* fprintf(errfp, "added point: %.16g %.16g\n", x[points-1], y[points-1]); */ + /* fprintf(errfp, "new_poly: PLACE, xctx->nl_points=%d\n", xctx->nl_points); */ + xctx->nl_polyy[xctx->nl_points]=xctx->mousey_snap; + xctx->nl_polyx[xctx->nl_points]=xctx->mousex_snap; + xctx->nl_points++; + xctx->nl_polyx[xctx->nl_points]=xctx->nl_polyx[xctx->nl_points-1]; /* prepare next point for rubber */ + xctx->nl_polyy[xctx->nl_points] = xctx->nl_polyy[xctx->nl_points-1]; + /* fprintf(errfp, "added point: %.16g %.16g\n", xctx->nl_polyx[xctx->nl_points-1], + xctx->nl_polyy[xctx->nl_points-1]); */ xctx->ui_state |= STARTPOLYGON; } if( what & ADD) @@ -1954,42 +1973,45 @@ void new_polygon(int what) /* closed poly */ if(what & END) { /* delete last rubber */ - drawtemppolygon(xctx->gctiled, NOW, x, y, points+1); - x[points] = x[0]; - y[points] = y[0]; + drawtemppolygon(xctx->gctiled, NOW, xctx->nl_polyx, xctx->nl_polyy, xctx->nl_points+1); + xctx->nl_polyx[xctx->nl_points] = xctx->nl_polyx[0]; + xctx->nl_polyy[xctx->nl_points] = xctx->nl_polyy[0]; /* add point */ - } else if(x[points] != x[points-1] || y[points] != y[points-1]) { - x[points] = xctx->mousex_snap; - y[points] = xctx->mousey_snap; + } else if(xctx->nl_polyx[xctx->nl_points] != xctx->nl_polyx[xctx->nl_points-1] || + xctx->nl_polyy[xctx->nl_points] != xctx->nl_polyy[xctx->nl_points-1]) { + xctx->nl_polyx[xctx->nl_points] = xctx->mousex_snap; + xctx->nl_polyy[xctx->nl_points] = xctx->mousey_snap; } else { return; } - points++; + xctx->nl_points++; /* prepare next point for rubber */ - x[points]=x[points-1];y[points]=y[points-1]; + xctx->nl_polyx[xctx->nl_points]=xctx->nl_polyx[xctx->nl_points-1]; + xctx->nl_polyy[xctx->nl_points]=xctx->nl_polyy[xctx->nl_points-1]; } /* end open or closed poly by user request */ if((what & SET || (what & END)) || /* closed poly end by clicking on first point */ - ((what & ADD) && x[points-1] == x[0] && y[points-1] == y[0]) ) { + ((what & ADD) && xctx->nl_polyx[xctx->nl_points-1] == xctx->nl_polyx[0] && + xctx->nl_polyy[xctx->nl_points-1] == xctx->nl_polyy[0]) ) { push_undo(); - drawtemppolygon(xctx->gctiled, NOW, x, y, points+1); - store_poly(-1, x, y, points, rectcolor, 0, NULL); - /* fprintf(errfp, "new_poly: finish: points=%d\n", points); */ - drawtemppolygon(gc[rectcolor], NOW, x, y, points); + drawtemppolygon(xctx->gctiled, NOW, xctx->nl_polyx, xctx->nl_polyy, xctx->nl_points+1); + store_poly(-1, xctx->nl_polyx, xctx->nl_polyy, xctx->nl_points, rectcolor, 0, NULL); + /* fprintf(errfp, "new_poly: finish: xctx->nl_points=%d\n", xctx->nl_points); */ + drawtemppolygon(gc[rectcolor], NOW, xctx->nl_polyx, xctx->nl_polyy, xctx->nl_points); xctx->ui_state &= ~STARTPOLYGON; - drawpolygon(rectcolor, NOW, x, y, points, 0, 0); - my_free(711, &x); - my_free(712, &y); - maxpoints = points = 0; + drawpolygon(rectcolor, NOW, xctx->nl_polyx, xctx->nl_polyy, xctx->nl_points, 0, 0); + my_free(711, &xctx->nl_polyx); + my_free(712, &xctx->nl_polyy); + xctx->nl_maxpoints = xctx->nl_points = 0; } if(what & RUBBER) { /* fprintf(errfp, "new_poly: RUBBER\n"); */ - drawtemppolygon(xctx->gctiled, NOW, x, y, points+1); - y[points] = xctx->mousey_snap; - x[points] = xctx->mousex_snap; - drawtemppolygon(gc[rectcolor], NOW, x, y, points+1); + drawtemppolygon(xctx->gctiled, NOW, xctx->nl_polyx, xctx->nl_polyy, xctx->nl_points+1); + xctx->nl_polyy[xctx->nl_points] = xctx->mousey_snap; + xctx->nl_polyx[xctx->nl_points] = xctx->mousex_snap; + drawtemppolygon(gc[rectcolor], NOW, xctx->nl_polyx, xctx->nl_polyy, xctx->nl_points+1); } } @@ -2232,26 +2254,26 @@ void place_text(int draw_text, double mx, double my) void pan2(int what, int mx, int my) { int dx, dy, ddx, ddy; - static int mx_save, my_save; - static int mmx_save, mmy_save; + static int mx_s, my_s; + static int mmx_s, mmy_s; static double xorig_save, yorig_save; if(what & START) { - mmx_save = mx_save = mx; - mmy_save = my_save = my; + mmx_s = mx_s = mx; + mmy_s = my_s = my; xorig_save = xctx->xorigin; yorig_save = xctx->yorigin; } else if(what == RUBBER) { - dx = mx - mx_save; - dy = my - my_save; - ddx = abs(mx -mmx_save); - ddy = abs(my -mmy_save); + dx = mx - mx_s; + dy = my - my_s; + ddx = abs(mx -mmx_s); + ddy = abs(my -mmy_s); if(ddx>5 || ddy>5) { xctx->xorigin = xorig_save + dx*xctx->zoom; xctx->yorigin = yorig_save + dy*xctx->zoom; draw(); - mmx_save = mx; - mmy_save = my; + mmx_s = mx; + mmy_s = my; } } } @@ -2286,72 +2308,67 @@ void pan(int what) /* 20150927 select=1: select objects, select=0: unselect objects */ void select_rect(int what, int select) { - static double xr,yr,xr2,yr2; - static double xx1,xx2,yy1,yy2; - static int sel; - static int sem=0; - if(what & RUBBER) { - if(sem==0) { + if(xctx->nl_sem==0) { fprintf(errfp, "ERROR: select_rect() RUBBER called before START\n"); tcleval("alert_ {ERROR: select_rect() RUBBER called before START} {}"); } - xx1=xr;xx2=xr2;yy1=yr;yy2=yr2; - RECTORDER(xx1,yy1,xx2,yy2); - drawtemprect(xctx->gctiled,NOW, xx1,yy1,xx2,yy2); - xr2=xctx->mousex_snap;yr2=xctx->mousey_snap; + xctx->nl_xx1=xctx->nl_xr;xctx->nl_xx2=xctx->nl_xr2;xctx->nl_yy1=xctx->nl_yr;xctx->nl_yy2=xctx->nl_yr2; + RECTORDER(xctx->nl_xx1,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy2); + drawtemprect(xctx->gctiled,NOW, xctx->nl_xx1,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy2); + xctx->nl_xr2=xctx->mousex_snap;xctx->nl_yr2=xctx->mousey_snap; /* 20171026 update unselected objects while dragging */ rebuild_selected_array(); bbox(START,0.0, 0.0, 0.0, 0.0); - bbox(ADD, xx1, yy1, xx2, yy2); + bbox(ADD, xctx->nl_xx1, xctx->nl_yy1, xctx->nl_xx2, xctx->nl_yy2); bbox(SET,0.0, 0.0, 0.0, 0.0); draw_selection(gc[SELLAYER], 0); - if(!sel) select_inside(xx1, yy1, xx2, yy2, sel); + if(!xctx->nl_sel) select_inside(xctx->nl_xx1, xctx->nl_yy1, xctx->nl_xx2, xctx->nl_yy2, xctx->nl_sel); bbox(END,0.0, 0.0, 0.0, 0.0); - xx1=xr;xx2=xr2;yy1=yr;yy2=yr2; - RECTORDER(xx1,yy1,xx2,yy2); - drawtemprect(gc[SELLAYER],NOW, xx1,yy1,xx2,yy2); + xctx->nl_xx1=xctx->nl_xr;xctx->nl_xx2=xctx->nl_xr2;xctx->nl_yy1=xctx->nl_yr;xctx->nl_yy2=xctx->nl_yr2; + RECTORDER(xctx->nl_xx1,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy2); + drawtemprect(gc[SELLAYER],NOW, xctx->nl_xx1,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy2); } else if(what & START) { /* - * if(sem==1) { + * if(xctx->nl_sem==1) { * fprintf(errfp, "ERROR: reentrant call of select_rect()\n"); * tcleval("alert_ {ERROR: reentrant call of select_rect()} {}"); * } */ - sel = select; + xctx->nl_sel = select; xctx->ui_state |= STARTSELECT; /* use m[xy]_double_save instead of mouse[xy]_snap */ /* to avoid delays in setting the start point of a */ /* selection rectangle, this is noticeable and annoying on */ /* networked / slow X servers. 20171218 */ - /* xr=xr2=xctx->mousex_snap; */ - /* yr=yr2=xctx->mousey_snap; */ - xr=xr2=xctx->mx_double_save; - yr=yr2=xctx->my_double_save; - sem=1; + /* xctx->nl_xr=xctx->nl_xr2=xctx->mousex_snap; */ + /* xctx->nl_yr=xctx->nl_yr2=xctx->mousey_snap; */ + xctx->nl_xr=xctx->nl_xr2=xctx->mx_double_save; + xctx->nl_yr=xctx->nl_yr2=xctx->my_double_save; + xctx->nl_sem=1; } else if(what & END) { - RECTORDER(xr,yr,xr2,yr2); - drawtemprect(xctx->gctiled, NOW, xr,yr,xr2,yr2); + RECTORDER(xctx->nl_xr,xctx->nl_yr,xctx->nl_xr2,xctx->nl_yr2); + drawtemprect(xctx->gctiled, NOW, xctx->nl_xr,xctx->nl_yr,xctx->nl_xr2,xctx->nl_yr2); /* draw_selection(gc[SELLAYER], 0); */ - select_inside(xr,yr,xr2,yr2, sel); + select_inside(xctx->nl_xr,xctx->nl_yr,xctx->nl_xr2,xctx->nl_yr2, xctx->nl_sel); bbox(START,0.0, 0.0, 0.0, 0.0); - bbox(ADD, xr, yr, xr2, yr2); + bbox(ADD, xctx->nl_xr, xctx->nl_yr, xctx->nl_xr2, xctx->nl_yr2); bbox(SET,0.0, 0.0, 0.0, 0.0); draw_selection(gc[SELLAYER], 0); bbox(END,0.0, 0.0, 0.0, 0.0); /* /20171219 */ xctx->ui_state &= ~STARTSELECT; - sem=0; + xctx->nl_sem=0; } } diff --git a/src/callback.c b/src/callback.c index fd2ba553..9f1c158c 100644 --- a/src/callback.c +++ b/src/callback.c @@ -21,25 +21,23 @@ */ #include "xschem.h" -static int mx_save, my_save; -static int last_command=0; void start_line(double mx, double my) { - last_command = STARTLINE; + xctx->last_command = STARTLINE; if(xctx->ui_state & STARTLINE) { if(!vertical_move) { - mx_save = mx; + xctx->mx_save = mx; xctx->mx_double_save=xctx->mousex_snap; } if(!horizontal_move) { - my_save = my; + xctx->my_save = my; xctx->my_double_save=xctx->mousey_snap; } if(horizontal_move) xctx->mousey_snap = xctx->my_double_save; if(vertical_move) xctx->mousex_snap = xctx->mx_double_save; } else { - mx_save = mx; my_save = my; + xctx->mx_save = mx; xctx->my_save = my; xctx->mx_double_save=xctx->mousex_snap; xctx->my_double_save=xctx->mousey_snap; } @@ -48,20 +46,20 @@ void start_line(double mx, double my) void start_wire(double mx, double my) { - last_command = STARTWIRE; + xctx->last_command = STARTWIRE; if(xctx->ui_state & STARTWIRE) { if(!vertical_move) { - mx_save = mx; + xctx->mx_save = mx; xctx->mx_double_save=xctx->mousex_snap; } if(!horizontal_move) { - my_save = my; + xctx->my_save = my; xctx->my_double_save=xctx->mousey_snap; } if(horizontal_move) xctx->mousey_snap = xctx->my_double_save; if(vertical_move) xctx->mousex_snap = xctx->mx_double_save; } else { - mx_save = mx; my_save = my; + xctx->mx_save = mx; xctx->my_save = my; xctx->mx_double_save=xctx->mousex_snap; xctx->my_double_save=xctx->mousey_snap; } @@ -74,7 +72,6 @@ int callback(int event, int mx, int my, KeySym key, int button, int aux, int state) { char str[PATH_MAX + 100]; /* overflow safe 20161122 */ - static char sel_or_clip[PATH_MAX] = "";/* overflow safe 20161122 */ struct stat buf; unsigned short sel; static int capslock = 0; @@ -146,24 +143,24 @@ int callback(int event, int mx, int my, KeySym key, switch(event) { case EnterNotify: - if(!sel_or_clip[0]) my_snprintf(sel_or_clip, S(sel_or_clip), "%s/%s", user_conf_dir, ".selection.sch"); + if(!xctx->sel_or_clip[0]) my_snprintf(xctx->sel_or_clip, S(xctx->sel_or_clip), "%s/%s", user_conf_dir, ".selection.sch"); /* xschem window *sending* selected objects when the pointer comes back in abort copy operation since it has been done in another xschem xctx->window; STARTCOPY set and selection file does not exist any more */ - if( stat(sel_or_clip, &buf) && (xctx->ui_state & STARTCOPY) ) + if( stat(xctx->sel_or_clip, &buf) && (xctx->ui_state & STARTCOPY) ) { copy_objects(ABORT); /* also unlinks sel_or_flip file */ unselect_all(); } /* xschem window *receiving* selected objects */ /* no selected objects and selection file exists */ - if(xctx->lastsel == 0 && !stat(sel_or_clip, &buf)) { + if(xctx->lastsel == 0 && !stat(xctx->sel_or_clip, &buf)) { dbg(2, "callback(): Enter event\n"); xctx->mousex_snap = 490; xctx->mousey_snap = -340; merge_file(1, ".sch"); - xunlink(sel_or_clip); + xunlink(xctx->sel_or_clip); } break; @@ -260,12 +257,12 @@ int callback(int event, int mx, int my, KeySym key, !(state & ShiftMask) && !(xctx->ui_state & PLACE_SYMBOL)) { static int onetime=0; - if(mx != mx_save || my != my_save) { + if(mx != xctx->mx_save || my != xctx->my_save) { if( !(xctx->ui_state & STARTSELECT)) { select_rect(START,1); onetime=1; } - if(abs(mx-mx_save) > 8 || abs(my-my_save) > 8 ) { /* set some reasonable threshold before unselecting */ + if(abs(mx-xctx->mx_save) > 8 || abs(my-xctx->my_save) > 8 ) { /* set some reasonable threshold before unselecting */ if(onetime) { unselect_all(); /* 20171026 avoid multiple calls of unselect_all() */ onetime=0; @@ -282,12 +279,12 @@ int callback(int event, int mx, int my, KeySym key, } else if((state&Button1Mask) && (state & ShiftMask) && !(xctx->ui_state & PLACE_SYMBOL) && !(xctx->ui_state & STARTPAN2) ) { - if(mx != mx_save || my != my_save) { + if(mx != xctx->mx_save || my != xctx->my_save) { if( !(xctx->ui_state & STARTSELECT)) { select_rect(START,1); } - if(abs(mx-mx_save) > 8 || abs(my-my_save) > 8 ) { /* set some reasonable threshold before unselecting */ - select_object(X_TO_XSCHEM(mx_save), Y_TO_XSCHEM(my_save), 0, 0); /* remove near object if dragging */ + if(abs(mx-xctx->mx_save) > 8 || abs(my-xctx->my_save) > 8 ) { /* set some reasonable threshold before unselecting */ + select_object(X_TO_XSCHEM(xctx->mx_save), Y_TO_XSCHEM(xctx->my_save), 0, 0); /* remove near object if dragging */ rebuild_selected_array(); } } @@ -522,7 +519,7 @@ int callback(int event, int mx, int my, KeySym key, find_closest_net_or_symbol_pin(xctx->mousex, xctx->mousey, &x, &y); xx = X_TO_SCREEN(x); yy = Y_TO_SCREEN(y); - mx_save = xx; my_save = yy; + xctx->mx_save = xx; xctx->my_save = yy; xctx->mx_double_save = ROUND(x / cadsnap) * cadsnap; xctx->my_double_save = ROUND(y / cadsnap) * cadsnap; new_wire(PLACE, x, y); @@ -551,7 +548,7 @@ int callback(int event, int mx, int my, KeySym key, no_draw = 0; if(xctx->semaphore >= 2) break; tcleval("set vertical_move 0; set horizontal_move 0" ); - last_command=0; + xctx->last_command=0; manhattan_lines = 0; horizontal_move = vertical_move = 0; dbg(1, "callback(): Escape: xctx->ui_state=%ld\n", xctx->ui_state); @@ -603,10 +600,10 @@ int callback(int event, int mx, int my, KeySym key, { if(xctx->semaphore >= 2) break; dbg(1, "callback(): start polygon\n"); - mx_save = mx; my_save = my; + xctx->mx_save = mx; xctx->my_save = my; xctx->mx_double_save=xctx->mousex_snap; xctx->my_double_save=xctx->mousey_snap; - last_command = 0; + xctx->last_command = 0; new_polygon(PLACE); break; } @@ -680,17 +677,17 @@ int callback(int event, int mx, int my, KeySym key, if(key=='t' && state == 0) /* place text */ { if(xctx->semaphore >= 2) break; - last_command = 0; + xctx->last_command = 0; place_text(1, xctx->mousex_snap, xctx->mousey_snap); /* 1 = draw text 24122002 */ break; } if(key=='r' && !xctx->ui_state && state==0) /* start rect */ { dbg(1, "callback(): start rect\n"); - mx_save = mx; my_save = my; + xctx->mx_save = mx; xctx->my_save = my; xctx->mx_double_save=xctx->mousex_snap; xctx->my_double_save=xctx->mousey_snap; - last_command = 0; + xctx->last_command = 0; new_rect(PLACE); break; } @@ -816,20 +813,20 @@ int callback(int event, int mx, int my, KeySym key, if(key=='C' && state == ShiftMask) /* place arc */ { if(xctx->semaphore >= 2) break; - mx_save = mx; my_save = my; + xctx->mx_save = mx; xctx->my_save = my; xctx->mx_double_save=xctx->mousex_snap; xctx->my_double_save=xctx->mousey_snap; - last_command = 0; + xctx->last_command = 0; new_arc(PLACE, 180.); break; } if(key=='C' && state == (ControlMask|ShiftMask)) /* place circle */ { if(xctx->semaphore >= 2) break; - mx_save = mx; my_save = my; + xctx->mx_save = mx; xctx->my_save = my; xctx->mx_double_save=xctx->mousex_snap; xctx->my_double_save=xctx->mousey_snap; - last_command = 0; + xctx->last_command = 0; new_arc(PLACE, 360.); break; } @@ -887,7 +884,7 @@ int callback(int event, int mx, int my, KeySym key, if(key==XK_Insert || (key == 'I' && state == ShiftMask) ) /* insert sym */ { if(xctx->semaphore >= 2) break; - last_command = 0; + xctx->last_command = 0; #if 1 /* enable on request also in scheduler.c */ rebuild_selected_array(); if(xctx->lastsel && xctx->sel_array[0].type==ELEMENT) { @@ -898,7 +895,7 @@ int callback(int event, int mx, int my, KeySym key, unselect_all(); /* place_symbol(-1,NULL,xctx->mousex_snap, xctx->mousey_snap, 0, 0, NULL,3, 1);*/ - mx_save = mx; my_save = my; + xctx->mx_save = mx; xctx->my_save = my; xctx->mx_double_save = xctx->mousex_snap; xctx->my_double_save = xctx->mousey_snap; if(place_symbol(-1,NULL,xctx->mousex_snap, xctx->mousey_snap, 0, 0, NULL, 4, 1) ) { @@ -1116,7 +1113,7 @@ int callback(int event, int mx, int my, KeySym key, else if(xctx->ui_state & STARTCOPY) copy_objects(FLIP); else { rebuild_selected_array(); - mx_save = mx; my_save = my; + xctx->mx_save = mx; xctx->my_save = my; xctx->mx_double_save=xctx->mousex_snap; xctx->my_double_save=xctx->mousey_snap; move_objects(START,0,0,0); @@ -1138,7 +1135,7 @@ int callback(int event, int mx, int my, KeySym key, else if(xctx->ui_state & STARTCOPY) copy_objects(FLIP|ROTATELOCAL); else { rebuild_selected_array(); - mx_save = mx; my_save = my; + xctx->mx_save = mx; xctx->my_save = my; xctx->mx_double_save=xctx->mousex_snap; xctx->my_double_save=xctx->mousey_snap; move_objects(START,0,0,0); @@ -1153,7 +1150,7 @@ int callback(int event, int mx, int my, KeySym key, else if(xctx->ui_state & STARTCOPY) copy_objects(ROTATE); else { rebuild_selected_array(); - mx_save = mx; my_save = my; + xctx->mx_save = mx; xctx->my_save = my; xctx->mx_double_save=xctx->mousex_snap; xctx->my_double_save=xctx->mousey_snap; move_objects(START,0,0,0); @@ -1170,7 +1167,7 @@ int callback(int event, int mx, int my, KeySym key, else if(xctx->ui_state & STARTCOPY) copy_objects(ROTATE|ROTATELOCAL); else { rebuild_selected_array(); - mx_save = mx; my_save = my; + xctx->mx_save = mx; xctx->my_save = my; xctx->mx_double_save=xctx->mousex_snap; xctx->my_double_save=xctx->mousey_snap; move_objects(START,0,0,0); @@ -1181,7 +1178,7 @@ int callback(int event, int mx, int my, KeySym key, } if(key=='m' && state==0 && !(xctx->ui_state & (STARTMOVE | STARTCOPY)))/* move selected obj. */ { - mx_save = mx; my_save = my; + xctx->mx_save = mx; xctx->my_save = my; xctx->mx_double_save=xctx->mousex_snap; xctx->my_double_save=xctx->mousey_snap; move_objects(START,0,0,0); @@ -1192,7 +1189,7 @@ int callback(int event, int mx, int my, KeySym key, !(xctx->ui_state & (STARTMOVE | STARTCOPY))) { if(xctx->semaphore >= 2) break; - mx_save = mx; my_save = my; + xctx->mx_save = mx; xctx->my_save = my; xctx->mx_double_save=xctx->mousex_snap; xctx->my_double_save=xctx->mousey_snap; copy_objects(START); @@ -1399,7 +1396,7 @@ int callback(int event, int mx, int my, KeySym key, dbg(1, "callback(): ButtonPress xctx->ui_state=%ld state=%d\n",xctx->ui_state,state); if(xctx->ui_state & STARTPAN2) { xctx->ui_state &=~STARTPAN2; - mx_save = mx; my_save = my; + xctx->mx_save = mx; xctx->my_save = my; xctx->mx_double_save=xctx->mousex_snap; xctx->my_double_save=xctx->mousey_snap; @@ -1408,7 +1405,7 @@ int callback(int event, int mx, int my, KeySym key, if(button==Button5 && state == 0 ) view_unzoom(CADZOOMSTEP); else if(button == Button3 && xctx->semaphore <2) { if(!(xctx->ui_state & STARTPOLYGON) && !(state & Mod1Mask) ) { - last_command = 0; + xctx->last_command = 0; unselect_all(); select_object(xctx->mousex,xctx->mousey,SELECTED, 1); rebuild_selected_array(); @@ -1439,8 +1436,8 @@ int callback(int event, int mx, int my, KeySym key, draw(); } else if(button==Button1 && (state & Mod1Mask) ) { - last_command = 0; - mx_save = mx; my_save = my; + xctx->last_command = 0; + xctx->mx_save = mx; xctx->my_save = my; xctx->mx_double_save=xctx->mousex_snap; xctx->my_double_save=xctx->mousey_snap; @@ -1470,9 +1467,9 @@ int callback(int event, int mx, int my, KeySym key, } else if(button==Button1) { - if(persistent_command && last_command) { - if(last_command == STARTLINE) start_line(mx, my); - if(last_command == STARTWIRE) start_wire(mx, my); + if(persistent_command && xctx->last_command) { + if(xctx->last_command == STARTLINE) start_line(mx, my); + if(xctx->last_command == STARTWIRE) start_wire(mx, my); break; } if(!(xctx->ui_state & STARTPOLYGON) && !(xctx->ui_state & STARTWIRE) && !(xctx->ui_state & STARTLINE) ) { @@ -1485,7 +1482,7 @@ int callback(int event, int mx, int my, KeySym key, break; } if(xctx->ui_state & MENUSTARTWIRE) { - mx_save = mx; my_save = my; + xctx->mx_save = mx; xctx->my_save = my; xctx->mx_double_save=xctx->mousex_snap; xctx->my_double_save=xctx->mousey_snap; new_wire(PLACE, xctx->mousex_snap, xctx->mousey_snap); @@ -1499,7 +1496,7 @@ int callback(int event, int mx, int my, KeySym key, find_closest_net_or_symbol_pin(xctx->mousex, xctx->mousey, &x, &y); xx = X_TO_SCREEN(x); yy = Y_TO_SCREEN(y); - mx_save = xx; my_save = yy; + xctx->mx_save = xx; xctx->my_save = yy; xctx->mx_double_save = ROUND(x / cadsnap) * cadsnap; xctx->my_double_save = ROUND(y / cadsnap) * cadsnap; @@ -1508,7 +1505,7 @@ int callback(int event, int mx, int my, KeySym key, break; } if(xctx->ui_state & MENUSTARTLINE) { - mx_save = mx; my_save = my; + xctx->mx_save = mx; xctx->my_save = my; xctx->mx_double_save=xctx->mousex_snap; xctx->my_double_save=xctx->mousey_snap; new_line(PLACE); @@ -1516,7 +1513,7 @@ int callback(int event, int mx, int my, KeySym key, break; } if(xctx->ui_state & MENUSTARTRECT) { - mx_save = mx; my_save = my; + xctx->mx_save = mx; xctx->my_save = my; xctx->mx_double_save=xctx->mousex_snap; xctx->my_double_save=xctx->mousey_snap; new_rect(PLACE); @@ -1524,7 +1521,7 @@ int callback(int event, int mx, int my, KeySym key, break; } if(xctx->ui_state & MENUSTARTPOLYGON) { - mx_save = mx; my_save = my; + xctx->mx_save = mx; xctx->my_save = my; xctx->mx_double_save=xctx->mousex_snap; xctx->my_double_save=xctx->mousey_snap; new_polygon(PLACE); @@ -1532,7 +1529,7 @@ int callback(int event, int mx, int my, KeySym key, break; } if(xctx->ui_state & MENUSTARTARC) { - mx_save = mx; my_save = my; + xctx->mx_save = mx; xctx->my_save = my; xctx->mx_double_save=xctx->mousex_snap; xctx->my_double_save=xctx->mousey_snap; new_arc(PLACE, 180.); @@ -1540,7 +1537,7 @@ int callback(int event, int mx, int my, KeySym key, break; } if(xctx->ui_state & MENUSTARTCIRCLE) { - mx_save = mx; my_save = my; + xctx->mx_save = mx; xctx->my_save = my; xctx->mx_double_save=xctx->mousex_snap; xctx->my_double_save=xctx->mousey_snap; new_arc(PLACE, 360.); @@ -1563,11 +1560,11 @@ int callback(int event, int mx, int my, KeySym key, if(xctx->ui_state & STARTWIRE) { if(persistent_command) { if(!vertical_move) { - mx_save = mx; + xctx->mx_save = mx; xctx->mx_double_save=xctx->mousex_snap; } if(!horizontal_move) { - my_save = my; + xctx->my_save = my; xctx->my_double_save=xctx->mousey_snap; } if(horizontal_move) xctx->mousey_snap = xctx->my_double_save; @@ -1586,11 +1583,11 @@ int callback(int event, int mx, int my, KeySym key, if(xctx->ui_state & STARTLINE) { if(persistent_command) { if(!vertical_move) { - mx_save = mx; + xctx->mx_save = mx; xctx->mx_double_save=xctx->mousex_snap; } if(!horizontal_move) { - my_save = my; + xctx->my_save = my; xctx->my_double_save=xctx->mousey_snap; } if(horizontal_move) xctx->mousey_snap = xctx->my_double_save; @@ -1626,7 +1623,7 @@ int callback(int event, int mx, int my, KeySym key, } if( !(xctx->ui_state & STARTSELECT) && !(xctx->ui_state & STARTWIRE) && !(xctx->ui_state & STARTLINE) ) { int prev_last_sel = xctx->lastsel; - mx_save = mx; my_save = my; + xctx->mx_save = mx; xctx->my_save = my; xctx->mx_double_save=xctx->mousex_snap; xctx->my_double_save=xctx->mousey_snap; if( !(state & ShiftMask) && !(state & Mod1Mask) ) { @@ -1676,7 +1673,7 @@ int callback(int event, int mx, int my, KeySym key, case ButtonRelease: if(xctx->ui_state & STARTPAN2) { xctx->ui_state &=~STARTPAN2; - mx_save = mx; my_save = my; + xctx->mx_save = mx; xctx->my_save = my; xctx->mx_double_save=xctx->mousex_snap; xctx->my_double_save=xctx->mousey_snap; diff --git a/src/move.c b/src/move.c index 3bc17920..71ac1039 100644 --- a/src/move.c +++ b/src/move.c @@ -21,14 +21,6 @@ */ #include "xschem.h" -static double rx1, rx2, ry1, ry2; -static short move_rot = 0; -static short move_flip = 0; -static double x1=0.0, y_1=0.0, x2=0.0, y_2=0.0, deltax = 0.0, deltay = 0.0; -/* static int i,c,n,k; */ -static int lastsel; -static short rotatelocal=0; - void rebuild_selected_array() /* can be used only if new selected set is lower */ /* that is, xctx->sel_array[] size can not increase */ @@ -174,10 +166,10 @@ void update_symbol_bboxes(short rot, short flip) int i, n; short save_flip, save_rot; - for(i=0;imovelastsel;i++) { n = xctx->sel_array[i].n; - dbg(1, "update_symbol_bboxes(): i=%d, lastsel=%d, n=%d\n", i, lastsel, n); + dbg(1, "update_symbol_bboxes(): i=%d, xctx->movelastsel=%d, n=%d\n", i, xctx->movelastsel, n); dbg(1, "update_symbol_bboxes(): symbol flip=%d, rot=%d\n", xctx->inst[n].flip, xctx->inst[n].rot); if(xctx->sel_array[i].type == ELEMENT) { save_flip = xctx->inst[n].flip; @@ -198,27 +190,27 @@ void draw_selection(GC g, int interruptable) int customfont; #endif - if(g == gc[SELLAYER]) lastsel = xctx->lastsel; - for(i=0;imovelastsel = xctx->lastsel; + for(i=0;imovelastsel;i++) { c = xctx->sel_array[i].col;n = xctx->sel_array[i].n; switch(xctx->sel_array[i].type) { case xTEXT: - if(rotatelocal) { - ROTATION(move_rot, move_flip, xctx->text[n].x0, xctx->text[n].y0, - xctx->text[n].x0, xctx->text[n].y0, rx1,ry1); + if(xctx->rotatelocal) { + ROTATION(xctx->move_rot, xctx->move_flip, xctx->text[n].x0, xctx->text[n].y0, + xctx->text[n].x0, xctx->text[n].y0, xctx->rx1,xctx->ry1); } else { - ROTATION(move_rot, move_flip, x1, y_1, xctx->text[n].x0, xctx->text[n].y0, rx1,ry1); + ROTATION(xctx->move_rot, xctx->move_flip, xctx->x1, xctx->y_1, xctx->text[n].x0, xctx->text[n].y0, xctx->rx1,xctx->ry1); } #ifdef HAS_CAIRO customfont = set_text_custom_font(&xctx->text[n]); #endif draw_temp_string(g,ADD, xctx->text[n].txt_ptr, (xctx->text[n].rot + - ( (move_flip && (xctx->text[n].rot & 1) ) ? move_rot+2 : move_rot) ) & 0x3, - xctx->text[n].flip^move_flip, xctx->text[n].hcenter, xctx->text[n].vcenter, - rx1+deltax, ry1+deltay, + ( (xctx->move_flip && (xctx->text[n].rot & 1) ) ? xctx->move_rot+2 : xctx->move_rot) ) & 0x3, + xctx->text[n].flip^xctx->move_flip, xctx->text[n].hcenter, xctx->text[n].vcenter, + xctx->rx1+xctx->deltax, xctx->ry1+xctx->deltay, xctx->text[n].xscale, xctx->text[n].yscale); #ifdef HAS_CAIRO if(customfont) cairo_restore(xctx->cairo_ctx); @@ -226,71 +218,71 @@ void draw_selection(GC g, int interruptable) break; case xRECT: - if(rotatelocal) { - ROTATION(move_rot, move_flip, xctx->rect[c][n].x1, xctx->rect[c][n].y1, - xctx->rect[c][n].x1, xctx->rect[c][n].y1, rx1,ry1); - ROTATION(move_rot, move_flip, xctx->rect[c][n].x1, xctx->rect[c][n].y1, - xctx->rect[c][n].x2, xctx->rect[c][n].y2, rx2,ry2); + if(xctx->rotatelocal) { + ROTATION(xctx->move_rot, xctx->move_flip, xctx->rect[c][n].x1, xctx->rect[c][n].y1, + xctx->rect[c][n].x1, xctx->rect[c][n].y1, xctx->rx1,xctx->ry1); + ROTATION(xctx->move_rot, xctx->move_flip, xctx->rect[c][n].x1, xctx->rect[c][n].y1, + xctx->rect[c][n].x2, xctx->rect[c][n].y2, xctx->rx2,xctx->ry2); } else { - ROTATION(move_rot, move_flip, x1, y_1, xctx->rect[c][n].x1, xctx->rect[c][n].y1, rx1,ry1); - ROTATION(move_rot, move_flip, x1, y_1, xctx->rect[c][n].x2, xctx->rect[c][n].y2, rx2,ry2); + ROTATION(xctx->move_rot, xctx->move_flip, xctx->x1, xctx->y_1, xctx->rect[c][n].x1, xctx->rect[c][n].y1, xctx->rx1,xctx->ry1); + ROTATION(xctx->move_rot, xctx->move_flip, xctx->x1, xctx->y_1, xctx->rect[c][n].x2, xctx->rect[c][n].y2, xctx->rx2,xctx->ry2); } if(xctx->rect[c][n].sel==SELECTED) { - RECTORDER(rx1,ry1,rx2,ry2); - drawtemprect(g, ADD, rx1+deltax, ry1+deltay, rx2+deltax, ry2+deltay); + RECTORDER(xctx->rx1,xctx->ry1,xctx->rx2,xctx->ry2); + drawtemprect(g, ADD, xctx->rx1+xctx->deltax, xctx->ry1+xctx->deltay, xctx->rx2+xctx->deltax, xctx->ry2+xctx->deltay); } else if(xctx->rect[c][n].sel==SELECTED1) { - rx1+=deltax; - ry1+=deltay; - RECTORDER(rx1,ry1,rx2,ry2); - drawtemprect(g, ADD, rx1, ry1, rx2, ry2); + xctx->rx1+=xctx->deltax; + xctx->ry1+=xctx->deltay; + RECTORDER(xctx->rx1,xctx->ry1,xctx->rx2,xctx->ry2); + drawtemprect(g, ADD, xctx->rx1, xctx->ry1, xctx->rx2, xctx->ry2); } else if(xctx->rect[c][n].sel==SELECTED2) { - rx2+=deltax; - ry1+=deltay; - RECTORDER(rx1,ry1,rx2,ry2); - drawtemprect(g, ADD, rx1, ry1, rx2, ry2); + xctx->rx2+=xctx->deltax; + xctx->ry1+=xctx->deltay; + RECTORDER(xctx->rx1,xctx->ry1,xctx->rx2,xctx->ry2); + drawtemprect(g, ADD, xctx->rx1, xctx->ry1, xctx->rx2, xctx->ry2); } else if(xctx->rect[c][n].sel==SELECTED3) { - rx1+=deltax; - ry2+=deltay; - RECTORDER(rx1,ry1,rx2,ry2); - drawtemprect(g, ADD, rx1, ry1, rx2, ry2); + xctx->rx1+=xctx->deltax; + xctx->ry2+=xctx->deltay; + RECTORDER(xctx->rx1,xctx->ry1,xctx->rx2,xctx->ry2); + drawtemprect(g, ADD, xctx->rx1, xctx->ry1, xctx->rx2, xctx->ry2); } else if(xctx->rect[c][n].sel==SELECTED4) { - rx2+=deltax; - ry2+=deltay; - RECTORDER(rx1,ry1,rx2,ry2); - drawtemprect(g, ADD, rx1, ry1, rx2, ry2); + xctx->rx2+=xctx->deltax; + xctx->ry2+=xctx->deltay; + RECTORDER(xctx->rx1,xctx->ry1,xctx->rx2,xctx->ry2); + drawtemprect(g, ADD, xctx->rx1, xctx->ry1, xctx->rx2, xctx->ry2); } else if(xctx->rect[c][n].sel==(SELECTED1|SELECTED2)) { - ry1+=deltay; - RECTORDER(rx1,ry1,rx2,ry2); - drawtemprect(g, ADD, rx1, ry1, rx2, ry2); + xctx->ry1+=xctx->deltay; + RECTORDER(xctx->rx1,xctx->ry1,xctx->rx2,xctx->ry2); + drawtemprect(g, ADD, xctx->rx1, xctx->ry1, xctx->rx2, xctx->ry2); } else if(xctx->rect[c][n].sel==(SELECTED3|SELECTED4)) { - ry2+=deltay; - RECTORDER(rx1,ry1,rx2,ry2); - drawtemprect(g, ADD, rx1, ry1, rx2, ry2); + xctx->ry2+=xctx->deltay; + RECTORDER(xctx->rx1,xctx->ry1,xctx->rx2,xctx->ry2); + drawtemprect(g, ADD, xctx->rx1, xctx->ry1, xctx->rx2, xctx->ry2); } else if(xctx->rect[c][n].sel==(SELECTED1|SELECTED3)) { - rx1+=deltax; - RECTORDER(rx1,ry1,rx2,ry2); - drawtemprect(g, ADD, rx1, ry1, rx2, ry2); + xctx->rx1+=xctx->deltax; + RECTORDER(xctx->rx1,xctx->ry1,xctx->rx2,xctx->ry2); + drawtemprect(g, ADD, xctx->rx1, xctx->ry1, xctx->rx2, xctx->ry2); } else if(xctx->rect[c][n].sel==(SELECTED2|SELECTED4)) { - rx2+=deltax; - RECTORDER(rx1,ry1,rx2,ry2); - drawtemprect(g, ADD, rx1, ry1, rx2, ry2); + xctx->rx2+=xctx->deltax; + RECTORDER(xctx->rx1,xctx->ry1,xctx->rx2,xctx->ry2); + drawtemprect(g, ADD, xctx->rx1, xctx->ry1, xctx->rx2, xctx->ry2); } break; case POLYGON: @@ -300,14 +292,14 @@ void draw_selection(GC g, int interruptable) if(xctx->poly[c][n].sel==SELECTED || xctx->poly[c][n].sel==SELECTED1) { for(k=0;kpoly[c][n].points; k++) { if( xctx->poly[c][n].sel==SELECTED || xctx->poly[c][n].selected_point[k]) { - if(rotatelocal) { - ROTATION(move_rot, move_flip, xctx->poly[c][n].x[0], xctx->poly[c][n].y[0], - xctx->poly[c][n].x[k], xctx->poly[c][n].y[k], rx1,ry1); + if(xctx->rotatelocal) { + ROTATION(xctx->move_rot, xctx->move_flip, xctx->poly[c][n].x[0], xctx->poly[c][n].y[0], + xctx->poly[c][n].x[k], xctx->poly[c][n].y[k], xctx->rx1,xctx->ry1); } else { - ROTATION(move_rot, move_flip, x1, y_1, xctx->poly[c][n].x[k], xctx->poly[c][n].y[k], rx1,ry1); + ROTATION(xctx->move_rot, xctx->move_flip, xctx->x1, xctx->y_1, xctx->poly[c][n].x[k], xctx->poly[c][n].y[k], xctx->rx1,xctx->ry1); } - x[k] = rx1 + deltax; - y[k] = ry1 + deltay; + x[k] = xctx->rx1 + xctx->deltax; + y[k] = xctx->ry1 + xctx->deltay; } else { x[k] = xctx->poly[c][n].x[k]; y[k] = xctx->poly[c][n].y[k]; @@ -321,114 +313,114 @@ void draw_selection(GC g, int interruptable) break; case WIRE: - if(rotatelocal) { - ROTATION(move_rot, move_flip, xctx->wire[n].x1, xctx->wire[n].y1, - xctx->wire[n].x1, xctx->wire[n].y1, rx1,ry1); - ROTATION(move_rot, move_flip, xctx->wire[n].x1, xctx->wire[n].y1, - xctx->wire[n].x2, xctx->wire[n].y2, rx2,ry2); + if(xctx->rotatelocal) { + ROTATION(xctx->move_rot, xctx->move_flip, xctx->wire[n].x1, xctx->wire[n].y1, + xctx->wire[n].x1, xctx->wire[n].y1, xctx->rx1,xctx->ry1); + ROTATION(xctx->move_rot, xctx->move_flip, xctx->wire[n].x1, xctx->wire[n].y1, + xctx->wire[n].x2, xctx->wire[n].y2, xctx->rx2,xctx->ry2); } else { - ROTATION(move_rot, move_flip, x1, y_1, xctx->wire[n].x1, xctx->wire[n].y1, rx1,ry1); - ROTATION(move_rot, move_flip, x1, y_1, xctx->wire[n].x2, xctx->wire[n].y2, rx2,ry2); + ROTATION(xctx->move_rot, xctx->move_flip, xctx->x1, xctx->y_1, xctx->wire[n].x1, xctx->wire[n].y1, xctx->rx1,xctx->ry1); + ROTATION(xctx->move_rot, xctx->move_flip, xctx->x1, xctx->y_1, xctx->wire[n].x2, xctx->wire[n].y2, xctx->rx2,xctx->ry2); } - ORDER(rx1,ry1,rx2,ry2); + ORDER(xctx->rx1,xctx->ry1,xctx->rx2,xctx->ry2); if(xctx->wire[n].sel==SELECTED) { if(xctx->wire[n].bus) - drawtempline(g, THICK, rx1+deltax, ry1+deltay, rx2+deltax, ry2+deltay); + drawtempline(g, THICK, xctx->rx1+xctx->deltax, xctx->ry1+xctx->deltay, xctx->rx2+xctx->deltax, xctx->ry2+xctx->deltay); else - drawtempline(g, ADD, rx1+deltax, ry1+deltay, rx2+deltax, ry2+deltay); + drawtempline(g, ADD, xctx->rx1+xctx->deltax, xctx->ry1+xctx->deltay, xctx->rx2+xctx->deltax, xctx->ry2+xctx->deltay); } else if(xctx->wire[n].sel==SELECTED1) { if(xctx->wire[n].bus) - drawtempline(g, THICK, rx1+deltax, ry1+deltay, rx2, ry2); + drawtempline(g, THICK, xctx->rx1+xctx->deltax, xctx->ry1+xctx->deltay, xctx->rx2, xctx->ry2); else - drawtempline(g, ADD, rx1+deltax, ry1+deltay, rx2, ry2); + drawtempline(g, ADD, xctx->rx1+xctx->deltax, xctx->ry1+xctx->deltay, xctx->rx2, xctx->ry2); } else if(xctx->wire[n].sel==SELECTED2) { if(xctx->wire[n].bus) - drawtempline(g, THICK, rx1, ry1, rx2+deltax, ry2+deltay); + drawtempline(g, THICK, xctx->rx1, xctx->ry1, xctx->rx2+xctx->deltax, xctx->ry2+xctx->deltay); else - drawtempline(g, ADD, rx1, ry1, rx2+deltax, ry2+deltay); + drawtempline(g, ADD, xctx->rx1, xctx->ry1, xctx->rx2+xctx->deltax, xctx->ry2+xctx->deltay); } break; case LINE: - if(rotatelocal) { - ROTATION(move_rot, move_flip, xctx->line[c][n].x1, xctx->line[c][n].y1, - xctx->line[c][n].x1, xctx->line[c][n].y1, rx1,ry1); - ROTATION(move_rot, move_flip, xctx->line[c][n].x1, xctx->line[c][n].y1, - xctx->line[c][n].x2, xctx->line[c][n].y2, rx2,ry2); + if(xctx->rotatelocal) { + ROTATION(xctx->move_rot, xctx->move_flip, xctx->line[c][n].x1, xctx->line[c][n].y1, + xctx->line[c][n].x1, xctx->line[c][n].y1, xctx->rx1,xctx->ry1); + ROTATION(xctx->move_rot, xctx->move_flip, xctx->line[c][n].x1, xctx->line[c][n].y1, + xctx->line[c][n].x2, xctx->line[c][n].y2, xctx->rx2,xctx->ry2); } else { - ROTATION(move_rot, move_flip, x1, y_1, xctx->line[c][n].x1, xctx->line[c][n].y1, rx1,ry1); - ROTATION(move_rot, move_flip, x1, y_1, xctx->line[c][n].x2, xctx->line[c][n].y2, rx2,ry2); + ROTATION(xctx->move_rot, xctx->move_flip, xctx->x1, xctx->y_1, xctx->line[c][n].x1, xctx->line[c][n].y1, xctx->rx1,xctx->ry1); + ROTATION(xctx->move_rot, xctx->move_flip, xctx->x1, xctx->y_1, xctx->line[c][n].x2, xctx->line[c][n].y2, xctx->rx2,xctx->ry2); } - ORDER(rx1,ry1,rx2,ry2); + ORDER(xctx->rx1,xctx->ry1,xctx->rx2,xctx->ry2); if(xctx->line[c][n].sel==SELECTED) { if(xctx->line[c][n].bus) - drawtempline(g, THICK, rx1+deltax, ry1+deltay, rx2+deltax, ry2+deltay); + drawtempline(g, THICK, xctx->rx1+xctx->deltax, xctx->ry1+xctx->deltay, xctx->rx2+xctx->deltax, xctx->ry2+xctx->deltay); else - drawtempline(g, ADD, rx1+deltax, ry1+deltay, rx2+deltax, ry2+deltay); + drawtempline(g, ADD, xctx->rx1+xctx->deltax, xctx->ry1+xctx->deltay, xctx->rx2+xctx->deltax, xctx->ry2+xctx->deltay); } else if(xctx->line[c][n].sel==SELECTED1) { if(xctx->line[c][n].bus) - drawtempline(g, THICK, rx1+deltax, ry1+deltay, rx2, ry2); + drawtempline(g, THICK, xctx->rx1+xctx->deltax, xctx->ry1+xctx->deltay, xctx->rx2, xctx->ry2); else - drawtempline(g, ADD, rx1+deltax, ry1+deltay, rx2, ry2); + drawtempline(g, ADD, xctx->rx1+xctx->deltax, xctx->ry1+xctx->deltay, xctx->rx2, xctx->ry2); } else if(xctx->line[c][n].sel==SELECTED2) { if(xctx->line[c][n].bus) - drawtempline(g, THICK, rx1, ry1, rx2+deltax, ry2+deltay); + drawtempline(g, THICK, xctx->rx1, xctx->ry1, xctx->rx2+xctx->deltax, xctx->ry2+xctx->deltay); else - drawtempline(g, ADD, rx1, ry1, rx2+deltax, ry2+deltay); + drawtempline(g, ADD, xctx->rx1, xctx->ry1, xctx->rx2+xctx->deltax, xctx->ry2+xctx->deltay); } break; case ARC: - if(rotatelocal) { + if(xctx->rotatelocal) { /* rotate center wrt itself: do nothing */ - rx1 = xctx->arc[c][n].x; - ry1 = xctx->arc[c][n].y; + xctx->rx1 = xctx->arc[c][n].x; + xctx->ry1 = xctx->arc[c][n].y; } else { - ROTATION(move_rot, move_flip, x1, y_1, xctx->arc[c][n].x, xctx->arc[c][n].y, rx1,ry1); + ROTATION(xctx->move_rot, xctx->move_flip, xctx->x1, xctx->y_1, xctx->arc[c][n].x, xctx->arc[c][n].y, xctx->rx1,xctx->ry1); } angle = xctx->arc[c][n].a; - if(move_flip) { - angle = 270.*move_rot+180.-xctx->arc[c][n].b-xctx->arc[c][n].a; + if(xctx->move_flip) { + angle = 270.*xctx->move_rot+180.-xctx->arc[c][n].b-xctx->arc[c][n].a; } else { - angle = xctx->arc[c][n].a+move_rot*270.; + angle = xctx->arc[c][n].a+xctx->move_rot*270.; } angle = fmod(angle, 360.); if(angle<0.) angle+=360.; if(xctx->arc[c][n].sel==SELECTED) { - drawtemparc(g, ADD, rx1+deltax, ry1+deltay, xctx->arc[c][n].r, angle, xctx->arc[c][n].b); + drawtemparc(g, ADD, xctx->rx1+xctx->deltax, xctx->ry1+xctx->deltay, xctx->arc[c][n].r, angle, xctx->arc[c][n].b); } else if(xctx->arc[c][n].sel==SELECTED1) { - drawtemparc(g, ADD, rx1, ry1, fabs(xctx->arc[c][n].r+deltax), angle, xctx->arc[c][n].b); + drawtemparc(g, ADD, xctx->rx1, xctx->ry1, fabs(xctx->arc[c][n].r+xctx->deltax), angle, xctx->arc[c][n].b); } else if(xctx->arc[c][n].sel==SELECTED3) { - angle = ROUND(fmod(atan2(-deltay, deltax)*180./XSCH_PI+xctx->arc[c][n].b, 360.)); + angle = ROUND(fmod(atan2(-xctx->deltay, xctx->deltax)*180./XSCH_PI+xctx->arc[c][n].b, 360.)); if(angle<0.) angle +=360.; if(angle==0) angle=360.; - drawtemparc(g, ADD, rx1, ry1, xctx->arc[c][n].r, xctx->arc[c][n].a, angle); + drawtemparc(g, ADD, xctx->rx1, xctx->ry1, xctx->arc[c][n].r, xctx->arc[c][n].a, angle); } else if(xctx->arc[c][n].sel==SELECTED2) { - angle = ROUND(fmod(atan2(-deltay, deltax)*180./XSCH_PI+angle, 360.)); + angle = ROUND(fmod(atan2(-xctx->deltay, xctx->deltax)*180./XSCH_PI+angle, 360.)); if(angle<0.) angle +=360.; - drawtemparc(g, ADD, rx1, ry1, xctx->arc[c][n].r, angle, xctx->arc[c][n].b); + drawtemparc(g, ADD, xctx->rx1, xctx->ry1, xctx->arc[c][n].r, angle, xctx->arc[c][n].b); } break; case ELEMENT: - if(rotatelocal) { - ROTATION(move_rot, move_flip, xctx->inst[n].x0, xctx->inst[n].y0, - xctx->inst[n].x0, xctx->inst[n].y0, rx1,ry1); + if(xctx->rotatelocal) { + ROTATION(xctx->move_rot, xctx->move_flip, xctx->inst[n].x0, xctx->inst[n].y0, + xctx->inst[n].x0, xctx->inst[n].y0, xctx->rx1,xctx->ry1); } else { - ROTATION(move_rot, move_flip, x1, y_1, xctx->inst[n].x0, xctx->inst[n].y0, rx1,ry1); + ROTATION(xctx->move_rot, xctx->move_flip, xctx->x1, xctx->y_1, xctx->inst[n].x0, xctx->inst[n].y0, xctx->rx1,xctx->ry1); } for(k=0;kinst[n].rot & 1) ) ? move_rot+2 : move_rot, - rx1-xctx->inst[n].x0+deltax,ry1-xctx->inst[n].y0+deltay); + draw_temp_symbol(ADD, g, n, k, xctx->move_flip, + ( xctx->move_flip && (xctx->inst[n].rot & 1) ) ? xctx->move_rot+2 : xctx->move_rot, + xctx->rx1-xctx->inst[n].x0+xctx->deltax,xctx->ry1-xctx->inst[n].y0+xctx->deltay); break; } #ifdef __unix__ @@ -437,7 +429,7 @@ void draw_selection(GC g, int interruptable) drawtemparc(g, END, 0.0, 0.0, 0.0, 0.0, 0.0); drawtemprect(g, END, 0.0, 0.0, 0.0, 0.0); drawtempline(g, END, 0.0, 0.0, 0.0, 0.0); - lastsel = i+1; + xctx->movelastsel = i+1; return; } #else @@ -446,7 +438,7 @@ void draw_selection(GC g, int interruptable) drawtemparc(g, END, 0.0, 0.0, 0.0, 0.0, 0.0); drawtemprect(g, END, 0.0, 0.0, 0.0, 0.0); drawtempline(g, END, 0.0, 0.0, 0.0, 0.0); - lastsel = i + 1; + xctx->movelastsel = i + 1; return; } #endif @@ -454,14 +446,12 @@ void draw_selection(GC g, int interruptable) drawtemparc(g, END, 0.0, 0.0, 0.0, 0.0, 0.0); drawtemprect(g, END, 0.0, 0.0, 0.0, 0.0); drawtempline(g, END, 0.0, 0.0, 0.0, 0.0); - lastsel = i; + xctx->movelastsel = i; } -static struct int_hashentry *nodetable[HASHSIZE]; - void find_inst_hash_clear(void) { - free_int_hash(nodetable); + free_int_hash(xctx->node_redraw_table); } void find_inst_to_be_redrawn(const char *node) @@ -470,7 +460,7 @@ void find_inst_to_be_redrawn(const char *node) xSymbol * sym; - if(int_hash_lookup(nodetable, node, 0, XINSERT_NOREPLACE)) return; + if(int_hash_lookup(xctx->node_redraw_table, node, 0, XINSERT_NOREPLACE)) return; dbg(1, "find_inst_to_be_redrawn(): node=%s\n", node); for(i=0; i < xctx->instances; i++) { sym = xctx->inst[i].ptr + xctx->sym; @@ -519,21 +509,21 @@ void copy_objects(int what) if(what & START) { - rotatelocal=0; + xctx->rotatelocal=0; dbg(1, "copy_objects(): START copy\n"); rebuild_selected_array(); save_selection(1); - deltax = deltay = 0.0; - lastsel = xctx->lastsel; - x1=xctx->mousex_snap;y_1=xctx->mousey_snap; - move_flip = 0;move_rot = 0; + xctx->deltax = xctx->deltay = 0.0; + xctx->movelastsel = xctx->lastsel; + xctx->x1=xctx->mousex_snap;xctx->y_1=xctx->mousey_snap; + xctx->move_flip = 0;xctx->move_rot = 0; xctx->ui_state|=STARTCOPY; } if(what & ABORT) /* draw objects while moving */ { char *str = NULL; /* 20161122 overflow safe */ draw_selection(xctx->gctiled,0); - move_rot=move_flip=deltax=deltay=0; + xctx->move_rot=xctx->move_flip=xctx->deltax=xctx->deltay=0; xctx->ui_state&=~STARTCOPY; my_strdup(225, &str, user_conf_dir); my_strcat(226, &str, "/.selection.sch"); @@ -543,30 +533,30 @@ void copy_objects(int what) } if(what & RUBBER) /* draw objects while moving */ { - x2=xctx->mousex_snap;y_2=xctx->mousey_snap; + xctx->x2=xctx->mousex_snap;xctx->y_2=xctx->mousey_snap; draw_selection(xctx->gctiled,0); - deltax = x2-x1; deltay = y_2 - y_1; + xctx->deltax = xctx->x2-xctx->x1; xctx->deltay = xctx->y_2 - xctx->y_1; draw_selection(gc[SELLAYER],1); } if(what & ROTATELOCAL ) { - rotatelocal=1; + xctx->rotatelocal=1; } if(what & ROTATE) { draw_selection(xctx->gctiled,0); - move_rot= (move_rot+1) & 0x3; - update_symbol_bboxes(move_rot, move_flip); + xctx->move_rot= (xctx->move_rot+1) & 0x3; + update_symbol_bboxes(xctx->move_rot, xctx->move_flip); } if(what & FLIP) { draw_selection(xctx->gctiled,0); - move_flip = !move_flip; - update_symbol_bboxes(move_rot, move_flip); + xctx->move_flip = !xctx->move_flip; + update_symbol_bboxes(xctx->move_rot, xctx->move_flip); } if(what & END) /* copy selected objects */ { int firstw, firsti; int save_draw; - /* if the copy operation involved move_flip or rotations the original element bboxes were changed. + /* if the copy operation involved xctx->move_flip or rotations the original element bboxes were changed. restore them now */ update_symbol_bboxes(0, 0); save_draw = draw_window; @@ -601,40 +591,42 @@ void copy_objects(int what) bbox(ADD, xctx->wire[n].x1-ov, y1 , xctx->wire[n].x2+ov , y2 ); } */ - if(rotatelocal) { - ROTATION(move_rot, move_flip, xctx->wire[n].x1, xctx->wire[n].y1, - xctx->wire[n].x1, xctx->wire[n].y1, rx1,ry1); - ROTATION(move_rot, move_flip, xctx->wire[n].x1, xctx->wire[n].y1, - xctx->wire[n].x2, xctx->wire[n].y2, rx2,ry2); + if(xctx->rotatelocal) { + ROTATION(xctx->move_rot, xctx->move_flip, xctx->wire[n].x1, xctx->wire[n].y1, + xctx->wire[n].x1, xctx->wire[n].y1, xctx->rx1,xctx->ry1); + ROTATION(xctx->move_rot, xctx->move_flip, xctx->wire[n].x1, xctx->wire[n].y1, + xctx->wire[n].x2, xctx->wire[n].y2, xctx->rx2,xctx->ry2); } else { - ROTATION(move_rot, move_flip, x1, y_1, xctx->wire[n].x1, xctx->wire[n].y1, rx1,ry1); - ROTATION(move_rot, move_flip, x1, y_1, xctx->wire[n].x2, xctx->wire[n].y2, rx2,ry2); + ROTATION(xctx->move_rot, xctx->move_flip, xctx->x1, xctx->y_1, + xctx->wire[n].x1, xctx->wire[n].y1, xctx->rx1,xctx->ry1); + ROTATION(xctx->move_rot, xctx->move_flip, xctx->x1, xctx->y_1, + xctx->wire[n].x2, xctx->wire[n].y2, xctx->rx2,xctx->ry2); } if( xctx->wire[n].sel & (SELECTED|SELECTED1) ) { - rx1+=deltax; - ry1+=deltay; + xctx->rx1+=xctx->deltax; + xctx->ry1+=xctx->deltay; } if( xctx->wire[n].sel & (SELECTED|SELECTED2) ) { - rx2+=deltax; - ry2+=deltay; + xctx->rx2+=xctx->deltax; + xctx->ry2+=xctx->deltay; } - tmpx=rx1; /* used as temporary storage */ - tmpy=ry1; - ORDER(rx1,ry1,rx2,ry2); - if( tmpx == rx2 && tmpy == ry2) + tmpx=xctx->rx1; /* used as temporary storage */ + tmpy=xctx->ry1; + ORDER(xctx->rx1,xctx->ry1,xctx->rx2,xctx->ry2); + if( tmpx == xctx->rx2 && tmpy == xctx->ry2) { if(xctx->wire[n].sel == SELECTED1) xctx->wire[n].sel = SELECTED2; else if(xctx->wire[n].sel == SELECTED2) xctx->wire[n].sel = SELECTED1; } xctx->sel_array[i].n=xctx->wires; - storeobject(-1, rx1,ry1,rx2,ry2,WIRE,0,xctx->wire[n].sel,xctx->wire[n].prop_ptr); + storeobject(-1, xctx->rx1,xctx->ry1,xctx->rx2,xctx->ry2,WIRE,0,xctx->wire[n].sel,xctx->wire[n].prop_ptr); xctx->wire[n].sel=0; if(xctx->wire[n].bus) - drawline(WIRELAYER, THICK, rx1,ry1,rx2,ry2, 0); + drawline(WIRELAYER, THICK, xctx->rx1,xctx->ry1,xctx->rx2,xctx->ry2, 0); else - drawline(WIRELAYER, ADD, rx1,ry1,rx2,ry2, 0); + drawline(WIRELAYER, ADD, xctx->rx1,xctx->ry1,xctx->rx2,xctx->ry2, 0); } drawline(WIRELAYER, END, 0.0, 0.0, 0.0, 0.0, 0); } @@ -650,39 +642,42 @@ void copy_objects(int what) case LINE: if(c!=k) break; /* bbox(ADD, xctx->line[c][n].x1, xctx->line[c][n].y1, xctx->line[c][n].x2, xctx->line[c][n].y2) */ - if(rotatelocal) { - ROTATION(move_rot, move_flip, xctx->line[c][n].x1, xctx->line[c][n].y1, - xctx->line[c][n].x1, xctx->line[c][n].y1, rx1,ry1); - ROTATION(move_rot, move_flip, xctx->line[c][n].x1, xctx->line[c][n].y1, - xctx->line[c][n].x2, xctx->line[c][n].y2, rx2,ry2); + if(xctx->rotatelocal) { + ROTATION(xctx->move_rot, xctx->move_flip, xctx->line[c][n].x1, xctx->line[c][n].y1, + xctx->line[c][n].x1, xctx->line[c][n].y1, xctx->rx1,xctx->ry1); + ROTATION(xctx->move_rot, xctx->move_flip, xctx->line[c][n].x1, xctx->line[c][n].y1, + xctx->line[c][n].x2, xctx->line[c][n].y2, xctx->rx2,xctx->ry2); } else { - ROTATION(move_rot, move_flip, x1, y_1, xctx->line[c][n].x1, xctx->line[c][n].y1, rx1,ry1); - ROTATION(move_rot, move_flip, x1, y_1, xctx->line[c][n].x2, xctx->line[c][n].y2, rx2,ry2); + ROTATION(xctx->move_rot, xctx->move_flip, xctx->x1, xctx->y_1, + xctx->line[c][n].x1, xctx->line[c][n].y1, xctx->rx1,xctx->ry1); + ROTATION(xctx->move_rot, xctx->move_flip, xctx->x1, xctx->y_1, + xctx->line[c][n].x2, xctx->line[c][n].y2, xctx->rx2,xctx->ry2); } if( xctx->line[c][n].sel & (SELECTED|SELECTED1) ) { - rx1+=deltax; - ry1+=deltay; + xctx->rx1+=xctx->deltax; + xctx->ry1+=xctx->deltay; } if( xctx->line[c][n].sel & (SELECTED|SELECTED2) ) { - rx2+=deltax; - ry2+=deltay; + xctx->rx2+=xctx->deltax; + xctx->ry2+=xctx->deltay; } - tmpx=rx1; - tmpy=ry1; - ORDER(rx1,ry1,rx2,ry2); - if( tmpx == rx2 && tmpy == ry2) + tmpx=xctx->rx1; + tmpy=xctx->ry1; + ORDER(xctx->rx1,xctx->ry1,xctx->rx2,xctx->ry2); + if( tmpx == xctx->rx2 && tmpy == xctx->ry2) { if(xctx->line[c][n].sel == SELECTED1) xctx->line[c][n].sel = SELECTED2; else if(xctx->line[c][n].sel == SELECTED2) xctx->line[c][n].sel = SELECTED1; } if(xctx->line[c][n].bus) - drawline(k, THICK, rx1,ry1,rx2,ry2, xctx->line[c][n].dash); + drawline(k, THICK, xctx->rx1,xctx->ry1,xctx->rx2,xctx->ry2, xctx->line[c][n].dash); else - drawline(k, ADD, rx1,ry1,rx2,ry2, xctx->line[c][n].dash); + drawline(k, ADD, xctx->rx1,xctx->ry1,xctx->rx2,xctx->ry2, xctx->line[c][n].dash); xctx->sel_array[i].n=xctx->lines[c]; - storeobject(-1, rx1, ry1, rx2, ry2, LINE, c, xctx->line[c][n].sel, xctx->line[c][n].prop_ptr); + storeobject(-1, xctx->rx1, xctx->ry1, xctx->rx2, xctx->ry2, LINE, c, + xctx->line[c][n].sel, xctx->line[c][n].prop_ptr); xctx->line[c][n].sel=0; break; @@ -702,13 +697,13 @@ void copy_objects(int what) if(j==0 || p->y[j] > by2) by2 = p->y[j]; */ if( p->sel==SELECTED || p->selected_point[j]) { - if(rotatelocal) { - ROTATION(move_rot, move_flip, p->x[0], p->y[0], p->x[j], p->y[j], rx1,ry1); + if(xctx->rotatelocal) { + ROTATION(xctx->move_rot, xctx->move_flip, p->x[0], p->y[0], p->x[j], p->y[j], xctx->rx1,xctx->ry1); } else { - ROTATION(move_rot, move_flip, x1, y_1, p->x[j], p->y[j], rx1,ry1); + ROTATION(xctx->move_rot, xctx->move_flip, xctx->x1, xctx->y_1, p->x[j], p->y[j], xctx->rx1,xctx->ry1); } - x[j] = rx1+deltax; - y[j] = ry1+deltay; + x[j] = xctx->rx1+xctx->deltax; + y[j] = xctx->ry1+xctx->deltay; } else { x[j] = p->x[j]; y[j] = p->y[j]; @@ -730,18 +725,19 @@ void copy_objects(int what) &tmp.x1, &tmp.y1, &tmp.x2, &tmp.y2); bbox(ADD, tmp.x1, tmp.y1, tmp.x2, tmp.y2); */ - if(rotatelocal) { + if(xctx->rotatelocal) { /* rotate center wrt itself: do nothing */ - rx1 = xctx->arc[c][n].x; - ry1 = xctx->arc[c][n].y; + xctx->rx1 = xctx->arc[c][n].x; + xctx->ry1 = xctx->arc[c][n].y; } else { - ROTATION(move_rot, move_flip, x1, y_1, xctx->arc[c][n].x, xctx->arc[c][n].y, rx1,ry1); + ROTATION(xctx->move_rot, xctx->move_flip, xctx->x1, xctx->y_1, + xctx->arc[c][n].x, xctx->arc[c][n].y, xctx->rx1,xctx->ry1); } angle = xctx->arc[c][n].a; - if(move_flip) { - angle = 270.*move_rot+180.-xctx->arc[c][n].b-xctx->arc[c][n].a; + if(xctx->move_flip) { + angle = 270.*xctx->move_rot+180.-xctx->arc[c][n].b-xctx->arc[c][n].a; } else { - angle = xctx->arc[c][n].a+move_rot*270.; + angle = xctx->arc[c][n].a+xctx->move_rot*270.; } angle = fmod(angle, 360.); if(angle<0.) angle+=360.; @@ -749,32 +745,36 @@ void copy_objects(int what) xctx->arc[c][n].sel=0; - drawarc(k, ADD, rx1+deltax, ry1+deltay, + drawarc(k, ADD, xctx->rx1+xctx->deltax, xctx->ry1+xctx->deltay, xctx->arc[c][n].r, angle, xctx->arc[c][n].b, xctx->arc[c][n].fill, xctx->arc[c][n].dash); xctx->sel_array[i].n=xctx->arcs[c]; - store_arc(-1, rx1+deltax, ry1+deltay, + store_arc(-1, xctx->rx1+xctx->deltax, xctx->ry1+xctx->deltay, xctx->arc[c][n].r, angle, xctx->arc[c][n].b, c, SELECTED, xctx->arc[c][n].prop_ptr); break; case xRECT: if(c!=k) break; /* bbox(ADD, xctx->rect[c][n].x1, xctx->rect[c][n].y1, xctx->rect[c][n].x2, xctx->rect[c][n].y2); */ - if(rotatelocal) { - ROTATION(move_rot, move_flip, xctx->rect[c][n].x1, xctx->rect[c][n].y1, - xctx->rect[c][n].x1, xctx->rect[c][n].y1, rx1,ry1); - ROTATION(move_rot, move_flip, xctx->rect[c][n].x1, xctx->rect[c][n].y1, - xctx->rect[c][n].x2, xctx->rect[c][n].y2, rx2,ry2); + if(xctx->rotatelocal) { + ROTATION(xctx->move_rot, xctx->move_flip, xctx->rect[c][n].x1, xctx->rect[c][n].y1, + xctx->rect[c][n].x1, xctx->rect[c][n].y1, xctx->rx1,xctx->ry1); + ROTATION(xctx->move_rot, xctx->move_flip, xctx->rect[c][n].x1, xctx->rect[c][n].y1, + xctx->rect[c][n].x2, xctx->rect[c][n].y2, xctx->rx2,xctx->ry2); } else { - ROTATION(move_rot, move_flip, x1, y_1, xctx->rect[c][n].x1, xctx->rect[c][n].y1, rx1,ry1); - ROTATION(move_rot, move_flip, x1, y_1, xctx->rect[c][n].x2, xctx->rect[c][n].y2, rx2,ry2); + ROTATION(xctx->move_rot, xctx->move_flip, xctx->x1, xctx->y_1, + xctx->rect[c][n].x1, xctx->rect[c][n].y1, xctx->rx1,xctx->ry1); + ROTATION(xctx->move_rot, xctx->move_flip, xctx->x1, xctx->y_1, + xctx->rect[c][n].x2, xctx->rect[c][n].y2, xctx->rx2,xctx->ry2); } - RECTORDER(rx1,ry1,rx2,ry2); + RECTORDER(xctx->rx1,xctx->ry1,xctx->rx2,xctx->ry2); xctx->rect[c][n].sel=0; - drawrect(k, ADD, rx1+deltax, ry1+deltay, rx2+deltax, ry2+deltay, xctx->rect[c][n].dash); - filledrect(k, ADD, rx1+deltax, ry1+deltay, rx2+deltax, ry2+deltay); + drawrect(k, ADD, xctx->rx1+xctx->deltax, xctx->ry1+xctx->deltay, + xctx->rx2+xctx->deltax, xctx->ry2+xctx->deltay, xctx->rect[c][n].dash); + filledrect(k, ADD, xctx->rx1+xctx->deltax, xctx->ry1+xctx->deltay, + xctx->rx2+xctx->deltax, xctx->ry2+xctx->deltay); xctx->sel_array[i].n=xctx->rects[c]; - storeobject(-1, rx1+deltax, ry1+deltay, - rx2+deltax, ry2+deltay,xRECT, c, SELECTED, xctx->rect[c][n].prop_ptr); + storeobject(-1, xctx->rx1+xctx->deltax, xctx->ry1+xctx->deltay, + xctx->rx2+xctx->deltax, xctx->ry2+xctx->deltay,xRECT, c, SELECTED, xctx->rect[c][n].prop_ptr); break; case xTEXT: @@ -787,28 +787,29 @@ void copy_objects(int what) text_bbox(xctx->text[n].txt_ptr, xctx->text[n].xscale, xctx->text[n].yscale, xctx->text[n].rot,xctx->text[n].flip, xctx->text[n].hcenter, xctx->text[n].vcenter, xctx->text[n].x0, xctx->text[n].y0, - &rx1,&ry1, &rx2,&ry2); + &xctx->rx1,&xctx->ry1, &xctx->rx2,&xctx->ry2); #ifdef HAS_CAIRO if(customfont) cairo_restore(xctx->cairo_ctx); #endif - bbox(ADD, rx1, ry1, rx2, ry2 ); + bbox(ADD, xctx->rx1, xctx->ry1, xctx->rx2, xctx->ry2 ); */ - if(rotatelocal) { - ROTATION(move_rot, move_flip, xctx->text[n].x0, xctx->text[n].y0, - xctx->text[n].x0, xctx->text[n].y0, rx1,ry1); + if(xctx->rotatelocal) { + ROTATION(xctx->move_rot, xctx->move_flip, xctx->text[n].x0, xctx->text[n].y0, + xctx->text[n].x0, xctx->text[n].y0, xctx->rx1,xctx->ry1); } else { - ROTATION(move_rot, move_flip, x1, y_1, xctx->text[n].x0, xctx->text[n].y0, rx1,ry1); + ROTATION(xctx->move_rot, xctx->move_flip, xctx->x1, xctx->y_1, + xctx->text[n].x0, xctx->text[n].y0, xctx->rx1,xctx->ry1); } xctx->text[xctx->texts].txt_ptr=NULL; my_strdup(229, &xctx->text[xctx->texts].txt_ptr,xctx->text[n].txt_ptr); xctx->text[n].sel=0; dbg(2, "copy_objects(): current str=%s\n", xctx->text[xctx->texts].txt_ptr); - xctx->text[xctx->texts].x0=rx1+deltax; - xctx->text[xctx->texts].y0=ry1+deltay; + xctx->text[xctx->texts].x0=xctx->rx1+xctx->deltax; + xctx->text[xctx->texts].y0=xctx->ry1+xctx->deltay; xctx->text[xctx->texts].rot=(xctx->text[n].rot + - ( (move_flip && (xctx->text[n].rot & 1) ) ? move_rot+2 : move_rot) ) & 0x3; - xctx->text[xctx->texts].flip=move_flip^xctx->text[n].flip; + ( (xctx->move_flip && (xctx->text[n].rot & 1) ) ? xctx->move_rot+2 : xctx->move_rot) ) & 0x3; + xctx->text[xctx->texts].flip=xctx->move_flip^xctx->text[n].flip; xctx->text[xctx->texts].sel=SELECTED; xctx->text[xctx->texts].prop_ptr=NULL; xctx->text[xctx->texts].font=NULL; @@ -858,7 +859,7 @@ void copy_objects(int what) draw_string(textlayer, ADD, xctx->text[xctx->texts].txt_ptr, /* draw moved txt */ xctx->text[xctx->texts].rot, xctx->text[xctx->texts].flip, xctx->text[xctx->texts].hcenter, xctx->text[xctx->texts].vcenter, - rx1+deltax,ry1+deltay, + xctx->rx1+xctx->deltax,xctx->ry1+xctx->deltay, xctx->text[xctx->texts].xscale, xctx->text[xctx->texts].yscale); #ifndef HAS_CAIRO drawrect(textlayer, END, 0.0, 0.0, 0.0, 0.0, 0); @@ -881,11 +882,12 @@ void copy_objects(int what) firsti = 0; } check_inst_storage(); - if(rotatelocal) { - ROTATION(move_rot, move_flip, xctx->inst[n].x0, xctx->inst[n].y0, - xctx->inst[n].x0, xctx->inst[n].y0, rx1,ry1); + if(xctx->rotatelocal) { + ROTATION(xctx->move_rot, xctx->move_flip, xctx->inst[n].x0, xctx->inst[n].y0, + xctx->inst[n].x0, xctx->inst[n].y0, xctx->rx1,xctx->ry1); } else { - ROTATION(move_rot, move_flip, x1, y_1, xctx->inst[n].x0, xctx->inst[n].y0, rx1,ry1); + ROTATION(xctx->move_rot, xctx->move_flip, xctx->x1, xctx->y_1, + xctx->inst[n].x0, xctx->inst[n].y0, xctx->rx1,xctx->ry1); } xctx->inst[xctx->instances] = xctx->inst[n]; xctx->inst[xctx->instances].prop_ptr=NULL; @@ -898,12 +900,12 @@ void copy_objects(int what) xctx->inst[n].sel=0; xctx->inst[xctx->instances].flags = xctx->inst[n].flags; xctx->inst[xctx->instances].flags &= ~4; /* do not propagate hilight */ - xctx->inst[xctx->instances].x0 = rx1+deltax; - xctx->inst[xctx->instances].y0 = ry1+deltay; + xctx->inst[xctx->instances].x0 = xctx->rx1+xctx->deltax; + xctx->inst[xctx->instances].y0 = xctx->ry1+xctx->deltay; xctx->inst[xctx->instances].sel = SELECTED; - xctx->inst[xctx->instances].rot = (xctx->inst[xctx->instances].rot + - ( (move_flip && (xctx->inst[xctx->instances].rot & 1) ) ? move_rot+2 : move_rot) ) & 0x3; - xctx->inst[xctx->instances].flip = (move_flip? !xctx->inst[n].flip:xctx->inst[n].flip); + xctx->inst[xctx->instances].rot = (xctx->inst[xctx->instances].rot + ( (xctx->move_flip && + (xctx->inst[xctx->instances].rot & 1) ) ? xctx->move_rot+2 : xctx->move_rot) ) & 0x3; + xctx->inst[xctx->instances].flip = (xctx->move_flip? !xctx->inst[n].flip:xctx->inst[n].flip); /* the newpropcnt argument is zero for the 1st call and used in */ /* new_prop_string() for cleaning some internal caches. */ if(!newpropcnt) hash_all_names(xctx->instances); @@ -962,11 +964,11 @@ void copy_objects(int what) check_collapsing_objects(); update_conn_cues(1, 1); xctx->ui_state &= ~STARTCOPY; - x1=y_1=x2=y_2=move_rot=move_flip=deltax=deltay=0; + xctx->x1=xctx->y_1=xctx->x2=xctx->y_2=xctx->move_rot=xctx->move_flip=xctx->deltax=xctx->deltay=0; bbox(SET , 0.0 , 0.0 , 0.0 , 0.0); draw(); bbox(END , 0.0 , 0.0 , 0.0 , 0.0); - rotatelocal=0; + xctx->rotatelocal=0; draw_window = save_draw; } draw_selection(gc[SELLAYER], 0); @@ -994,46 +996,46 @@ void move_objects(int what, int merge, double dx, double dy) if(what & START) { - rotatelocal=0; - deltax = deltay = 0.0; + xctx->rotatelocal=0; + xctx->deltax = xctx->deltay = 0.0; rebuild_selected_array(); - lastsel = xctx->lastsel; + xctx->movelastsel = xctx->lastsel; if(xctx->lastsel==1 && xctx->sel_array[0].type==ARC && xctx->arc[c=xctx->sel_array[0].col][n=xctx->sel_array[0].n].sel!=SELECTED) { - x1 = xctx->arc[c][n].x; - y_1 = xctx->arc[c][n].y; - } else {x1=xctx->mousex_snap;y_1=xctx->mousey_snap;} - move_flip = 0;move_rot = 0; + xctx->x1 = xctx->arc[c][n].x; + xctx->y_1 = xctx->arc[c][n].y; + } else {xctx->x1=xctx->mousex_snap;xctx->y_1=xctx->mousey_snap;} + xctx->move_flip = 0;xctx->move_rot = 0; xctx->ui_state|=STARTMOVE; } if(what & ABORT) /* draw objects while moving */ { draw_selection(xctx->gctiled,0); - move_rot=move_flip=deltax=deltay=0; + xctx->move_rot=xctx->move_flip=xctx->deltax=xctx->deltay=0; xctx->ui_state &= ~STARTMOVE; xctx->ui_state &= ~PLACE_SYMBOL; update_symbol_bboxes(0, 0); } if(what & RUBBER) /* abort operation */ { - x2=xctx->mousex_snap;y_2=xctx->mousey_snap; + xctx->x2=xctx->mousex_snap;xctx->y_2=xctx->mousey_snap; draw_selection(xctx->gctiled,0); - deltax = x2-x1; deltay = y_2 - y_1; + xctx->deltax = xctx->x2-xctx->x1; xctx->deltay = xctx->y_2 - xctx->y_1; draw_selection(gc[SELLAYER],1); } if(what & ROTATELOCAL) { - rotatelocal=1; + xctx->rotatelocal=1; } if(what & ROTATE) { draw_selection(xctx->gctiled,0); - move_rot= (move_rot+1) & 0x3; - update_symbol_bboxes(move_rot, move_flip); + xctx->move_rot= (xctx->move_rot+1) & 0x3; + update_symbol_bboxes(xctx->move_rot, xctx->move_flip); } if(what & FLIP) { draw_selection(xctx->gctiled,0); - move_flip = !move_flip; - update_symbol_bboxes(move_rot, move_flip); + xctx->move_flip = !xctx->move_flip; + update_symbol_bboxes(xctx->move_rot, xctx->move_flip); } if(what & END) /* move selected objects */ { @@ -1051,8 +1053,8 @@ void move_objects(int what, int merge, double dx, double dy) } xctx->ui_state &= ~PLACE_SYMBOL; if(dx!=0.0 || dy!=0.0) { - deltax = dx; - deltay = dy; + xctx->deltax = dx; + xctx->deltay = dy; } /* calculate moving symbols bboxes before actually doing the move */ @@ -1101,36 +1103,40 @@ void move_objects(int what, int merge, double dx, double dy) else { y1 = wire[n].y1+ov; y2 = wire[n].y2-ov; } bbox(ADD, wire[n].x1-ov, y1 , wire[n].x2+ov , y2 ); } - if(rotatelocal) { - ROTATION(move_rot, move_flip, wire[n].x1, wire[n].y1, wire[n].x1, wire[n].y1, rx1,ry1); - ROTATION(move_rot, move_flip, wire[n].x1, wire[n].y1, wire[n].x2, wire[n].y2, rx2,ry2); + if(xctx->rotatelocal) { + ROTATION(xctx->move_rot, xctx->move_flip, wire[n].x1, wire[n].y1, + wire[n].x1, wire[n].y1, xctx->rx1,xctx->ry1); + ROTATION(xctx->move_rot, xctx->move_flip, wire[n].x1, wire[n].y1, + wire[n].x2, wire[n].y2, xctx->rx2,xctx->ry2); } else { - ROTATION(move_rot, move_flip, x1, y_1, wire[n].x1, wire[n].y1, rx1,ry1); - ROTATION(move_rot, move_flip, x1, y_1, wire[n].x2, wire[n].y2, rx2,ry2); + ROTATION(xctx->move_rot, xctx->move_flip, xctx->x1, xctx->y_1, + wire[n].x1, wire[n].y1, xctx->rx1,xctx->ry1); + ROTATION(xctx->move_rot, xctx->move_flip, xctx->x1, xctx->y_1, + wire[n].x2, wire[n].y2, xctx->rx2,xctx->ry2); } if( wire[n].sel & (SELECTED|SELECTED1) ) { - rx1+=deltax; - ry1+=deltay; + xctx->rx1+=xctx->deltax; + xctx->ry1+=xctx->deltay; } if( wire[n].sel & (SELECTED|SELECTED2) ) { - rx2+=deltax; - ry2+=deltay; + xctx->rx2+=xctx->deltax; + xctx->ry2+=xctx->deltay; } - wire[n].x1=rx1; - wire[n].y1=ry1; - ORDER(rx1,ry1,rx2,ry2); - if( wire[n].x1 == rx2 && wire[n].y1 == ry2) + wire[n].x1=xctx->rx1; + wire[n].y1=xctx->ry1; + ORDER(xctx->rx1,xctx->ry1,xctx->rx2,xctx->ry2); + if( wire[n].x1 == xctx->rx2 && wire[n].y1 == xctx->ry2) { if(wire[n].sel == SELECTED1) wire[n].sel = SELECTED2; else if(wire[n].sel == SELECTED2) wire[n].sel = SELECTED1; } - wire[n].x1=rx1; - wire[n].y1=ry1; - wire[n].x2=rx2; - wire[n].y2=ry2; + wire[n].x1=xctx->rx1; + wire[n].y1=xctx->ry1; + wire[n].x2=xctx->rx2; + wire[n].y2=xctx->ry2; } else if(k == WIRELAYER) { if(wire[n].bus) drawline(WIRELAYER, THICK, wire[n].x1, wire[n].y1, wire[n].x2, wire[n].y2, 0); @@ -1141,36 +1147,40 @@ void move_objects(int what, int merge, double dx, double dy) case LINE: if(c!=k) break; bbox(ADD, line[c][n].x1, line[c][n].y1, line[c][n].x2, line[c][n].y2); - if(rotatelocal) { - ROTATION(move_rot, move_flip, line[c][n].x1, line[c][n].y1, line[c][n].x1, line[c][n].y1, rx1,ry1); - ROTATION(move_rot, move_flip, line[c][n].x1, line[c][n].y1, line[c][n].x2, line[c][n].y2, rx2,ry2); + if(xctx->rotatelocal) { + ROTATION(xctx->move_rot, xctx->move_flip, line[c][n].x1, line[c][n].y1, + line[c][n].x1, line[c][n].y1, xctx->rx1,xctx->ry1); + ROTATION(xctx->move_rot, xctx->move_flip, line[c][n].x1, line[c][n].y1, + line[c][n].x2, line[c][n].y2, xctx->rx2,xctx->ry2); } else { - ROTATION(move_rot, move_flip, x1, y_1, line[c][n].x1, line[c][n].y1, rx1,ry1); - ROTATION(move_rot, move_flip, x1, y_1, line[c][n].x2, line[c][n].y2, rx2,ry2); + ROTATION(xctx->move_rot, xctx->move_flip, xctx->x1, xctx->y_1, + line[c][n].x1, line[c][n].y1, xctx->rx1,xctx->ry1); + ROTATION(xctx->move_rot, xctx->move_flip, xctx->x1, xctx->y_1, + line[c][n].x2, line[c][n].y2, xctx->rx2,xctx->ry2); } if( line[c][n].sel & (SELECTED|SELECTED1) ) { - rx1+=deltax; - ry1+=deltay; + xctx->rx1+=xctx->deltax; + xctx->ry1+=xctx->deltay; } if( line[c][n].sel & (SELECTED|SELECTED2) ) { - rx2+=deltax; - ry2+=deltay; + xctx->rx2+=xctx->deltax; + xctx->ry2+=xctx->deltay; } - line[c][n].x1=rx1; - line[c][n].y1=ry1; - ORDER(rx1,ry1,rx2,ry2); - if( line[c][n].x1 == rx2 && line[c][n].y1 == ry2) + line[c][n].x1=xctx->rx1; + line[c][n].y1=xctx->ry1; + ORDER(xctx->rx1,xctx->ry1,xctx->rx2,xctx->ry2); + if( line[c][n].x1 == xctx->rx2 && line[c][n].y1 == xctx->ry2) { if(line[c][n].sel == SELECTED1) line[c][n].sel = SELECTED2; else if(line[c][n].sel == SELECTED2) line[c][n].sel = SELECTED1; } - line[c][n].x1=rx1; - line[c][n].y1=ry1; - line[c][n].x2=rx2; - line[c][n].y2=ry2; + line[c][n].x1=xctx->rx1; + line[c][n].y1=xctx->ry1; + line[c][n].x2=xctx->rx2; + line[c][n].y2=xctx->ry2; if(line[c][n].bus) drawline(k, THICK, line[c][n].x1, line[c][n].y1, line[c][n].x2, line[c][n].y2, line[c][n].dash); @@ -1195,14 +1205,14 @@ void move_objects(int what, int merge, double dx, double dy) if(j==0 || p->y[j] > by2) by2 = p->y[j]; if( p->sel==SELECTED || p->selected_point[j]) { - if(rotatelocal) { - ROTATION(move_rot, move_flip, savex0, savey0, p->x[j], p->y[j], rx1,ry1); + if(xctx->rotatelocal) { + ROTATION(xctx->move_rot, xctx->move_flip, savex0, savey0, p->x[j], p->y[j], xctx->rx1,xctx->ry1); } else { - ROTATION(move_rot, move_flip, x1, y_1, p->x[j], p->y[j], rx1,ry1); + ROTATION(xctx->move_rot, xctx->move_flip, xctx->x1, xctx->y_1, p->x[j], p->y[j], xctx->rx1,xctx->ry1); } - p->x[j] = rx1+deltax; - p->y[j] = ry1+deltay; + p->x[j] = xctx->rx1+xctx->deltax; + p->y[j] = xctx->ry1+xctx->deltay; } } @@ -1222,43 +1232,44 @@ void move_objects(int what, int merge, double dx, double dy) dbg(1, "move_objects(): arc_bbox: %g %g %g %g\n", tmp.x1, tmp.y1, tmp.x2, tmp.y2); bbox(ADD, tmp.x1, tmp.y1, tmp.x2, tmp.y2); - if(rotatelocal) { + if(xctx->rotatelocal) { /* rotate center wrt itself: do nothing */ - rx1 = xctx->arc[c][n].x; - ry1 = xctx->arc[c][n].y; + xctx->rx1 = xctx->arc[c][n].x; + xctx->ry1 = xctx->arc[c][n].y; } else { - ROTATION(move_rot, move_flip, x1, y_1, xctx->arc[c][n].x, xctx->arc[c][n].y, rx1,ry1); + ROTATION(xctx->move_rot, xctx->move_flip, xctx->x1, xctx->y_1, + xctx->arc[c][n].x, xctx->arc[c][n].y, xctx->rx1,xctx->ry1); } angle = xctx->arc[c][n].a; - if(move_flip) { - angle = 270.*move_rot+180.-xctx->arc[c][n].b-xctx->arc[c][n].a; + if(xctx->move_flip) { + angle = 270.*xctx->move_rot+180.-xctx->arc[c][n].b-xctx->arc[c][n].a; } else { - angle = xctx->arc[c][n].a+move_rot*270.; + angle = xctx->arc[c][n].a+xctx->move_rot*270.; } angle = fmod(angle, 360.); if(angle<0.) angle+=360.; if(xctx->arc[c][n].sel == SELECTED) { - xctx->arc[c][n].x = rx1+deltax; - xctx->arc[c][n].y = ry1+deltay; + xctx->arc[c][n].x = xctx->rx1+xctx->deltax; + xctx->arc[c][n].y = xctx->ry1+xctx->deltay; xctx->arc[c][n].a = angle; } else if(xctx->arc[c][n].sel == SELECTED1) { - xctx->arc[c][n].x = rx1; - xctx->arc[c][n].y = ry1; - if(xctx->arc[c][n].r+deltax) xctx->arc[c][n].r = fabs(xctx->arc[c][n].r+deltax); + xctx->arc[c][n].x = xctx->rx1; + xctx->arc[c][n].y = xctx->ry1; + if(xctx->arc[c][n].r+xctx->deltax) xctx->arc[c][n].r = fabs(xctx->arc[c][n].r+xctx->deltax); xctx->arc[c][n].a = angle; } else if(xctx->arc[c][n].sel == SELECTED2) { - angle = ROUND(fmod(atan2(-deltay, deltax)*180./XSCH_PI+angle, 360.)); + angle = ROUND(fmod(atan2(-xctx->deltay, xctx->deltax)*180./XSCH_PI+angle, 360.)); if(angle<0.) angle +=360.; - xctx->arc[c][n].x = rx1; - xctx->arc[c][n].y = ry1; + xctx->arc[c][n].x = xctx->rx1; + xctx->arc[c][n].y = xctx->ry1; xctx->arc[c][n].a = angle; } else if(xctx->arc[c][n].sel==SELECTED3) { - angle = ROUND(fmod(atan2(-deltay, deltax)*180./XSCH_PI+xctx->arc[c][n].b, 360.)); + angle = ROUND(fmod(atan2(-xctx->deltay, xctx->deltax)*180./XSCH_PI+xctx->arc[c][n].b, 360.)); if(angle<0.) angle +=360.; if(angle==0) angle=360.; - xctx->arc[c][n].x = rx1; - xctx->arc[c][n].y = ry1; + xctx->arc[c][n].x = xctx->rx1; + xctx->arc[c][n].y = xctx->ry1; xctx->arc[c][n].b = angle; } drawarc(k, ADD, xctx->arc[c][n].x, xctx->arc[c][n].y, xctx->arc[c][n].r, @@ -1268,76 +1279,78 @@ void move_objects(int what, int merge, double dx, double dy) case xRECT: if(c!=k) break; bbox(ADD, xctx->rect[c][n].x1, xctx->rect[c][n].y1, xctx->rect[c][n].x2, xctx->rect[c][n].y2); - if(rotatelocal) { - ROTATION(move_rot, move_flip, xctx->rect[c][n].x1, xctx->rect[c][n].y1, - xctx->rect[c][n].x1, xctx->rect[c][n].y1, rx1,ry1); - ROTATION(move_rot, move_flip, xctx->rect[c][n].x1, xctx->rect[c][n].y1, - xctx->rect[c][n].x2, xctx->rect[c][n].y2, rx2,ry2); + if(xctx->rotatelocal) { + ROTATION(xctx->move_rot, xctx->move_flip, xctx->rect[c][n].x1, xctx->rect[c][n].y1, + xctx->rect[c][n].x1, xctx->rect[c][n].y1, xctx->rx1,xctx->ry1); + ROTATION(xctx->move_rot, xctx->move_flip, xctx->rect[c][n].x1, xctx->rect[c][n].y1, + xctx->rect[c][n].x2, xctx->rect[c][n].y2, xctx->rx2,xctx->ry2); } else { - ROTATION(move_rot, move_flip, x1, y_1, xctx->rect[c][n].x1, xctx->rect[c][n].y1, rx1,ry1); - ROTATION(move_rot, move_flip, x1, y_1, xctx->rect[c][n].x2, xctx->rect[c][n].y2, rx2,ry2); + ROTATION(xctx->move_rot, xctx->move_flip, xctx->x1, xctx->y_1, + xctx->rect[c][n].x1, xctx->rect[c][n].y1, xctx->rx1,xctx->ry1); + ROTATION(xctx->move_rot, xctx->move_flip, xctx->x1, xctx->y_1, + xctx->rect[c][n].x2, xctx->rect[c][n].y2, xctx->rx2,xctx->ry2); } if( xctx->rect[c][n].sel == SELECTED) { - rx1+=deltax; - ry1+=deltay; - rx2+=deltax; - ry2+=deltay; + xctx->rx1+=xctx->deltax; + xctx->ry1+=xctx->deltay; + xctx->rx2+=xctx->deltax; + xctx->ry2+=xctx->deltay; } else if( xctx->rect[c][n].sel == SELECTED1) { /* 20070302 stretching on rectangles */ - rx1+=deltax; - ry1+=deltay; + xctx->rx1+=xctx->deltax; + xctx->ry1+=xctx->deltay; } else if( xctx->rect[c][n].sel == SELECTED2) { - rx2+=deltax; - ry1+=deltay; + xctx->rx2+=xctx->deltax; + xctx->ry1+=xctx->deltay; } else if( xctx->rect[c][n].sel == SELECTED3) { - rx1+=deltax; - ry2+=deltay; + xctx->rx1+=xctx->deltax; + xctx->ry2+=xctx->deltay; } else if( xctx->rect[c][n].sel == SELECTED4) { - rx2+=deltax; - ry2+=deltay; + xctx->rx2+=xctx->deltax; + xctx->ry2+=xctx->deltay; } else if(xctx->rect[c][n].sel==(SELECTED1|SELECTED2)) { - ry1+=deltay; + xctx->ry1+=xctx->deltay; } else if(xctx->rect[c][n].sel==(SELECTED3|SELECTED4)) { - ry2+=deltay; + xctx->ry2+=xctx->deltay; } else if(xctx->rect[c][n].sel==(SELECTED1|SELECTED3)) { - rx1+=deltax; + xctx->rx1+=xctx->deltax; } else if(xctx->rect[c][n].sel==(SELECTED2|SELECTED4)) { - rx2+=deltax; + xctx->rx2+=xctx->deltax; } - tx1 = rx1; - ty1 = ry1; - RECTORDER(rx1,ry1,rx2,ry2); + tx1 = xctx->rx1; + ty1 = xctx->ry1; + RECTORDER(xctx->rx1,xctx->ry1,xctx->rx2,xctx->ry2); - if( rx2 == tx1) { + if( xctx->rx2 == tx1) { if(xctx->rect[c][n].sel==SELECTED1) xctx->rect[c][n].sel = SELECTED2; else if(xctx->rect[c][n].sel==SELECTED2) xctx->rect[c][n].sel = SELECTED1; else if(xctx->rect[c][n].sel==SELECTED3) xctx->rect[c][n].sel = SELECTED4; else if(xctx->rect[c][n].sel==SELECTED4) xctx->rect[c][n].sel = SELECTED3; } - if( ry2 == ty1) { + if( xctx->ry2 == ty1) { if(xctx->rect[c][n].sel==SELECTED1) xctx->rect[c][n].sel = SELECTED3; else if(xctx->rect[c][n].sel==SELECTED3) xctx->rect[c][n].sel = SELECTED1; else if(xctx->rect[c][n].sel==SELECTED2) xctx->rect[c][n].sel = SELECTED4; else if(xctx->rect[c][n].sel==SELECTED4) xctx->rect[c][n].sel = SELECTED2; } - xctx->rect[c][n].x1 = rx1; - xctx->rect[c][n].y1 = ry1; - xctx->rect[c][n].x2 = rx2; - xctx->rect[c][n].y2 = ry2; + xctx->rect[c][n].x1 = xctx->rx1; + xctx->rect[c][n].y1 = xctx->ry1; + xctx->rect[c][n].x2 = xctx->rx2; + xctx->rect[c][n].y2 = xctx->ry2; drawrect(k, ADD, xctx->rect[c][n].x1, xctx->rect[c][n].y1, xctx->rect[c][n].x2, xctx->rect[c][n].y2, xctx->rect[c][n].dash); filledrect(c, ADD, xctx->rect[c][n].x1, xctx->rect[c][n].y1, @@ -1352,24 +1365,25 @@ void move_objects(int what, int merge, double dx, double dy) #endif text_bbox(xctx->text[n].txt_ptr, xctx->text[n].xscale, xctx->text[n].yscale, xctx->text[n].rot,xctx->text[n].flip, xctx->text[n].hcenter, - xctx->text[n].vcenter, xctx->text[n].x0, xctx->text[n].y0, &rx1,&ry1, &rx2,&ry2); + xctx->text[n].vcenter, xctx->text[n].x0, xctx->text[n].y0, &xctx->rx1,&xctx->ry1, &xctx->rx2,&xctx->ry2); #ifdef HAS_CAIRO if(customfont) cairo_restore(xctx->cairo_ctx); #endif - bbox(ADD, rx1, ry1, rx2, ry2 ); + bbox(ADD, xctx->rx1, xctx->ry1, xctx->rx2, xctx->ry2 ); - if(rotatelocal) { - ROTATION(move_rot, move_flip, xctx->text[n].x0, xctx->text[n].y0, - xctx->text[n].x0, xctx->text[n].y0, rx1,ry1); + if(xctx->rotatelocal) { + ROTATION(xctx->move_rot, xctx->move_flip, xctx->text[n].x0, xctx->text[n].y0, + xctx->text[n].x0, xctx->text[n].y0, xctx->rx1,xctx->ry1); } else { - ROTATION(move_rot, move_flip, x1, y_1, xctx->text[n].x0, xctx->text[n].y0, rx1,ry1); + ROTATION(xctx->move_rot, xctx->move_flip, xctx->x1, xctx->y_1, + xctx->text[n].x0, xctx->text[n].y0, xctx->rx1,xctx->ry1); } - xctx->text[n].x0=rx1+deltax; - xctx->text[n].y0=ry1+deltay; + xctx->text[n].x0=xctx->rx1+xctx->deltax; + xctx->text[n].y0=xctx->ry1+xctx->deltay; xctx->text[n].rot=(xctx->text[n].rot + - ( (move_flip && (xctx->text[n].rot & 1) ) ? move_rot+2 : move_rot) ) & 0x3; - xctx->text[n].flip=move_flip^xctx->text[n].flip; + ( (xctx->move_flip && (xctx->text[n].rot & 1) ) ? xctx->move_rot+2 : xctx->move_rot) ) & 0x3; + xctx->text[n].flip=xctx->move_flip^xctx->text[n].flip; textlayer = xctx->text[n].layer; if(textlayer < 0 || textlayer >= cadlayers) textlayer = TEXTLAYER; @@ -1411,16 +1425,18 @@ void move_objects(int what, int merge, double dx, double dy) xctx->prep_hash_inst=0; firsti = 0; } - if(rotatelocal) { - ROTATION(move_rot, move_flip, inst[n].x0, inst[n].y0, inst[n].x0, inst[n].y0, rx1,ry1); + if(xctx->rotatelocal) { + ROTATION(xctx->move_rot, xctx->move_flip, inst[n].x0, inst[n].y0, + inst[n].x0, inst[n].y0, xctx->rx1,xctx->ry1); } else { - ROTATION(move_rot, move_flip, x1, y_1, inst[n].x0, inst[n].y0, rx1,ry1); + ROTATION(xctx->move_rot, xctx->move_flip, xctx->x1, xctx->y_1, + inst[n].x0, inst[n].y0, xctx->rx1,xctx->ry1); } - inst[n].x0 = rx1+deltax; - inst[n].y0 = ry1+deltay; + inst[n].x0 = xctx->rx1+xctx->deltax; + inst[n].y0 = xctx->ry1+xctx->deltay; inst[n].rot = (inst[n].rot + - ( (move_flip && (inst[n].rot & 1) ) ? move_rot+2 : move_rot) ) & 0x3; - inst[n].flip = move_flip ^ inst[n].flip; + ( (xctx->move_flip && (inst[n].rot & 1) ) ? xctx->move_rot+2 : xctx->move_rot) ) & 0x3; + inst[n].flip = xctx->move_flip ^ inst[n].flip; } break; @@ -1468,12 +1484,12 @@ void move_objects(int what, int merge, double dx, double dy) update_conn_cues(1, 1); xctx->ui_state &= ~STARTMOVE; xctx->ui_state &= ~STARTMERGE; - x1=y_1=x2=y_2=move_rot=move_flip=deltax=deltay=0; + xctx->x1=xctx->y_1=xctx->x2=xctx->y_2=xctx->move_rot=xctx->move_flip=xctx->deltax=xctx->deltay=0; bbox(SET , 0.0 , 0.0 , 0.0 , 0.0); dbg(2, "move_objects(): bbox= %d %d %d %d\n", xctx->areax1, xctx->areay1, xctx->areaw, xctx->areah); draw(); bbox(END , 0.0 , 0.0 , 0.0 , 0.0); - rotatelocal=0; + xctx->rotatelocal=0; draw_window =save_draw; } draw_selection(gc[SELLAYER], 0); diff --git a/src/xinit.c b/src/xinit.c index 9d822f3e..7ca0abaf 100644 --- a/src/xinit.c +++ b/src/xinit.c @@ -424,6 +424,7 @@ void alloc_xschem_data() for(i = 0 ; i < HASHSIZE; i++) { xctx->node_table[i] = NULL; xctx->hilight_table[i] = NULL; + xctx->node_redraw_table[i] = NULL; /* move.c */ } xctx->inst_color=NULL; xctx->window = xctx->save_pixmap = 0; @@ -436,6 +437,27 @@ void alloc_xschem_data() xctx->node_mult = NULL; xctx->node_mult_size = 0; + /* move.c */ + xctx->rx1 = xctx->rx2 = xctx->ry1 = xctx->ry2 = 0.0; + xctx->move_rot = 0; + xctx->move_flip = 0; + xctx->x1 = xctx->y_1 = xctx->x2 = xctx->y_2 = xctx->deltax = xctx->deltay = 0.0; + xctx->movelastsel = 0; + xctx->rotatelocal=0; + /* new_wire */ + xctx->nl_x1 = xctx->nl_y1 = xctx->nl_x2 = xctx->nl_y2 = 0.0; + xctx->nl_xx1 = xctx->nl_yy1 = xctx->nl_xx2 = xctx->nl_yy2 = 0.0; + /* new_arc */ + xctx->nl_x = xctx->nl_y = xctx->nl_r = xctx->nl_a = xctx->nl_b = xctx->nl_x3 = xctx->nl_y3 = 0.0; + xctx->nl_state = 0; + xctx->nl_sweep_angle = 0.0; + /* new_polygon */ + xctx->nl_polyx = xctx->nl_polyy = NULL; + xctx->nl_points = xctx->nl_maxpoints = 0; + /* select_rect */ + xctx->nl_xr = xctx->nl_yr = xctx->nl_xr2 = xctx->nl_yr2 = 0.0; + xctx->nl_sel = xctx->nl_sem = 0; + xctx->hilight_nets = 0; xctx->hilight_color = 0; for(i=0;isch_path[i]=NULL; diff --git a/src/xschem.h b/src/xschem.h index 55a90478..952a9056 100644 --- a/src/xschem.h +++ b/src/xschem.h @@ -552,6 +552,32 @@ typedef struct { int new_node; int *node_mult; int node_mult_size; + /* callback.c */ + int mx_save, my_save, last_command; + char sel_or_clip[PATH_MAX]; + /* move.c */ + struct int_hashentry *node_redraw_table[HASHSIZE]; + double rx1, rx2, ry1, ry2; + short move_rot; + short move_flip; + double x1, y_1, x2, y_2, deltax, deltay; + int movelastsel; + short rotatelocal; + /* new_wire, new_line, new_rect*/ + double nl_x1,nl_y1,nl_x2,nl_y2; + double nl_xx1,nl_yy1,nl_xx2,nl_yy2; + /* new_arc */ + double nl_x, nl_y, nl_r, nl_a, nl_b; + double nl_x3, nl_y3; + int nl_state; + double nl_sweep_angle; + /* new_polygon */ + double *nl_polyx, *nl_polyy; + int nl_points, nl_maxpoints; + /* select_rect */ + double nl_xr, nl_yr, nl_xr2, nl_yr2; + int nl_sel, nl_sem; + } Xschem_ctx;