📄 _xview.c
字号:
/*
x_draw_copy_rect(x1,y1,x2,y2,x,y)
{ x_draw_copy(x1,y1,x2,y2,0);
x_draw_paste(0,x,y);
}
*/
x_draw_copy_rect(x1,y1,x2,y2,x,y)
double x1,y1,x2,y2,x,y;
{
Pixmap P;
int w = (int)((x2-x1)*x_draw_scale);
int h = (int)((y2-y1)*x_draw_scale);
int X1 = XPIX(x1);
int Y1 = YPIX(y2);
int X = XPIX(x);
int Y = YPIX(y)-h;
int save;
P = XCreatePixmap(display,drawable,w,h,x_draw_depth);
save = x_draw_set_mode(0); /* src-mode */
XCopyArea(display,drawable,P,gc, X1,Y1,w,h,0,0);
XCopyArea(display,P,drawable,gc,0,0,w,h,X,Y);
x_draw_set_mode(save);
if (x_draw_screen_flush)
XFlush(display);
}
x_draw_move_rect(x1,y1,x2,y2,x,y)
double x1,y1,x2,y2,x,y;
{
Pixmap P;
int w = (int)((x2-x1)*x_draw_scale);
int h = (int)((y2-y1)*x_draw_scale);
int X1 = XPIX(x1);
int Y1 = YPIX(y2);
int X = XPIX(x);
int Y = YPIX(y)-h;
int i,j;
int save;
P = XCreatePixmap(display,drawable,w,h,x_draw_depth);
save = x_draw_set_mode(0); /* src-mode */
XCopyArea(display,drawable,P,gc, X1,Y1,w,h,0,0);
save = x_draw_set_mode(1); /* xor-mode */
while (X1!=X || Y1!=Y)
{
if (X1<X) i = X1+1;
if (X1>X) i = X1-1;
if (Y1<Y) j = Y1+1;
if (Y1>Y) j = Y1-1;
XCopyArea(display,P,drawable,gc,0,0,w,h,i,j);
XCopyArea(display,P,drawable,gc,0,0,w,h,X1,Y1);
X1 = i;
Y1 = j;
}
x_draw_set_mode(save);
if (x_draw_screen_flush)
XFlush(display);
}
x_draw_clear(col)
int col;
{
int i=0;
int n = 4;
double x,y;
XPoint *grid_points;
x_draw_del_messages();
XClearWindow(display,drawable);
n = 0;
if (x_draw_grid_mode) /* draw grid */
{ for(x = (int)(x_draw_xmin/x_draw_grid_mode)*x_draw_grid_mode; x<=x_draw_xmax; x+=x_draw_grid_mode)
for(y = (int)(x_draw_ymin/x_draw_grid_mode)*x_draw_grid_mode; y<=x_draw_ymax; y+=x_draw_grid_mode)
n++;
grid_points = (XPoint *) malloc(2*n*sizeof(short));
for(x = (int)(x_draw_xmin/x_draw_grid_mode)*x_draw_grid_mode; x<=x_draw_xmax; x+=x_draw_grid_mode)
for(y = (int)(x_draw_ymin/x_draw_grid_mode)*x_draw_grid_mode; y<=x_draw_ymax; y+=x_draw_grid_mode)
{ if (x*y == 0)
x_draw_filled_arc(x,y,2/x_draw_scale,2/x_draw_scale,0.0,2*M_PI,1);
else
{ grid_points[i].x = (short) XPIX(x);
grid_points[i].y = (short) YPIX(y);
i++;
}
}
XDrawPoints(display,drawable,gc,grid_points,n,CoordModeOrigin);
}
if (x_draw_screen_flush)
XFlush(display);
}
/* TEXT */
x_draw_message(s)
char * s;
{
XGCValues gc_val;
int y;
mesg_list[mesg_count] = (char*)malloc(strlen(s)+1);
strcpy(mesg_list[mesg_count],s);
mesg_count++;
y = 30*mesg_count+15;
x_draw_set_color(1);
gc_val.font = (Font)xv_get(message_font,XV_XID);
gc_val.function = GXxor;
XChangeGC(display,gc,GCFont|GCFunction,&gc_val);
XDrawString(display,drawable,gc,30,y,s,strlen(s));
gc_val.font = (Font)xv_get(text_font,XV_XID);
gc_val.function = xpix_mode_op;
XChangeGC(display,gc,GCFont|GCFunction,&gc_val);
if (x_draw_screen_flush)
XFlush(display);
}
x_draw_del_messages()
{
XGCValues gc_val;
int y;
char* s;
x_draw_set_color(1);
gc_val.font = (Font)xv_get(message_font,XV_XID);
gc_val.function = GXxor;
XChangeGC(display,gc,GCFont|GCFunction,&gc_val);
while(mesg_count > 0)
{ s = mesg_list[mesg_count-1];
y = 30*mesg_count+15;
XDrawString(display,drawable,gc,30,y,s,strlen(s));
mesg_count--;
free(s);
}
gc_val.font = (Font)xv_get(text_font,XV_XID);
gc_val.function = xpix_mode_op;
XChangeGC(display,gc,GCFont|GCFunction,&gc_val);
if (x_draw_screen_flush)
XFlush(display);
}
x_draw_text(x,y,s,col)
double x,y;
char * s;
int col;
{
DPRINT(("x_draw_text im modus %d\n",xpix_mode_op));
if (col != x_draw_color) x_draw_set_color(col);
if(x_draw_text_mode == 1) /* opaque */
XDrawImageString(display,drawable,gc,XPIX(x),YPIX(y),s,strlen(s));
else
XDrawString(display,drawable,gc,XPIX(x),YPIX(y),s,strlen(s));
if (x_draw_screen_flush)
XFlush(display);
}
x_draw_ctext(x,y,s,col)
double x,y;
char * s;
int col;
{
Font_string_dims dims;
DPRINT(("x_draw_ctext im modus %d\n",xpix_mode_op));
if (col != x_draw_color) x_draw_set_color(col);
xv_get(text_font,FONT_STRING_DIMS,s,&dims);
x -= ((double)dims.width)/(2*x_draw_scale);
y -= ((double)dims.height)/(3*x_draw_scale);
x_draw_text(x,y,s,col);
}
x_draw_int(x0,y0,i,col)
double x0,y0;
int i,col;
{
char buf[16];
sprintf(buf,"%d",i);
x_draw_ctext(x0,y0,buf,col);
}
x_draw_cursor()
{
int X = XPIX(mouse_xreal);
int Y = YPIX(mouse_yreal);
xv_vector(pw,X,Y,X+10,Y,PIX_SRC^PIX_DST,1);
xv_vector(pw,X,Y,X-10,Y,PIX_SRC^PIX_DST,1);
xv_vector(pw,X,Y,X,Y+10,PIX_SRC^PIX_DST,1);
xv_vector(pw,X,Y,X,Y-10,PIX_SRC^PIX_DST,1);
}
int x_draw_confirm(header)
char *header;
{ /* ask for yes or no */
char* s[2];
s[0] = "NO";
s[1] = "YES";
return x_draw_read_panel(header,2,s,0);
}
int x_draw_acknowledge(header)
char *header;
{ /* ask for ok */
char* s[1];
s[0] = "OK";
return x_draw_read_panel(header,1,s,0);
}
/* notify proc */
static void panel_input_notify(item, event)
Panel_item item;
Event *event;
{
xv_set(panel,PANEL_CLIENT_DATA,(int)panel_get(item, PANEL_CLIENT_DATA),0);
notify_stop();
}
int x_draw_screen_width()
{ Rect *r;
Frame frame = window_create(0, FRAME,NULL);
r = (Rect *) window_get(frame, WIN_SCREEN_RECT);
window_destroy(frame);
return(r->r_width);
}
int x_draw_screen_height()
{ Rect *r;
Frame frame = window_create(0, FRAME,NULL);
r = (Rect *) window_get(frame, WIN_SCREEN_RECT);
window_destroy(frame);
return(r->r_height);
}
static void
center_frame(frame)
Frame frame;
{ Rect * r;
int left,top,width,height;
/* center frame on the screen */
height = (int) window_get(frame, WIN_HEIGHT);
width = (int) window_get(frame, WIN_WIDTH);
left = (screen_width - width) / 2;
top = (screen_height - height) / 2;
if (left < 0) left = 0;
if (top < 0) top = 0;
window_set(frame, WIN_X, left, WIN_Y, top, 0);
}
static void
init_panel_frame(message,num,label,vertical)
char *message;
int num;
char **label;
int vertical;
{
Panel_item message_item,button[64],but;
int i,w,left, top, panel_width[64], width, height;
Rect *r;
panel_frame = window_create(0, FRAME,
FRAME_SHOW_LABEL, FALSE,
FRAME_NO_CONFIRM, TRUE,
WIN_X, 100, WIN_Y, 100, 0);
panel = window_create(panel_frame, PANEL, WIN_FONT, text_font, 0);
message_item = panel_create_item(panel, PANEL_MESSAGE,
PANEL_LABEL_STRING, message,
PANEL_LABEL_BOLD, TRUE,
PANEL_ITEM_X, 12,
PANEL_ITEM_Y, 10,
0);
r = (Rect *) panel_get(message_item, PANEL_ITEM_RECT);
left = 12;
height = rect_bottom(r) + 15;
button[0] = panel_create_item(panel, PANEL_BUTTON,
PANEL_ITEM_X, left, PANEL_ITEM_Y, height,
PANEL_LABEL_STRING, label[0],
PANEL_CLIENT_DATA, 0,
PANEL_NOTIFY_PROC, panel_input_notify,
0);
but = panel_create_item(panel, PANEL_BUTTON,
PANEL_ITEM_Y, (i+1) * height,
PANEL_LABEL_STRING, "0",
0);
panel_width[0] = panel_get(but,PANEL_ITEM_X) -left -10;
w = panel_width[0];
xv_destroy(but);
if (vertical)
for(i=1;i<num;i++)
{ button[i] = panel_create_item(panel, PANEL_BUTTON,
PANEL_ITEM_X, left, PANEL_ITEM_Y, (i+1) * height,
PANEL_LABEL_STRING, label[i],
PANEL_CLIENT_DATA, i,
PANEL_NOTIFY_PROC, panel_input_notify,
0);
but = panel_create_item(panel, PANEL_BUTTON,
PANEL_ITEM_Y, (i+1) * height,
PANEL_LABEL_STRING, "0",
0);
panel_width[i] = panel_get(but,PANEL_ITEM_X) -left -10;
if (w < panel_width[i]) w = panel_width[i];
xv_destroy(but);
}
else
{ for(i=1;i<num;i++)
button[i] = panel_create_item(panel, PANEL_BUTTON,
PANEL_ITEM_Y, height,
PANEL_LABEL_STRING, label[i],
PANEL_CLIENT_DATA, i,
PANEL_NOTIFY_PROC, panel_input_notify,
0);
but = panel_create_item(panel, PANEL_BUTTON,
PANEL_ITEM_Y, height,
PANEL_LABEL_STRING, "0",
0);
w = panel_get(but,PANEL_ITEM_X) -left -10;
xv_destroy(but);
for(i=0;i<num;i++) panel_width[i] = w;
}
/* center buttons under the message or vice versa */
for(i=0;i<num;i++)
{ left = (w - panel_width[i]) / 2;
panel_set(button[i],PANEL_ITEM_X,panel_get(button[i],PANEL_ITEM_X)+left,0);
}
left = (r->r_width - w) / 2;
if (left < 0)
panel_set(message_item,PANEL_ITEM_X,12-left,0);
else
for(i=0;i<num;i++)
panel_set(button[i],PANEL_ITEM_X,panel_get(button[i],PANEL_ITEM_X)+left,0);
window_fit(panel);
window_fit(panel_frame);
center_frame(panel_frame);
}
int x_draw_read_panel(message,n,labels,vertical)
char *message;
int n;
char **labels;
int vertical;
{
int answer;
if (x_draw_grid_mode) x_draw_cursor();
/* create the panel_frame */
init_panel_frame(message,n,labels,vertical);
xv_main_loop(panel_frame);
answer = (int)xv_get(panel,PANEL_CLIENT_DATA);
/* destroy the panel_frame */
window_destroy(panel_frame);
if (x_draw_grid_mode) x_draw_cursor();
x_draw_reset_gc();
XFlush(display);
return answer;
}
char* x_draw_read_text_panel(message,menu_label,n,items)
char *message;
char *menu_label;
int n;
char **items;
{
if (x_draw_grid_mode) x_draw_cursor();
/* create the panel_frame */
init_panel_text_frame(message,menu_label,n,items);
xv_main_loop(panel_frame);
/* destroy the panel_frame */
window_destroy(panel_frame);
if (x_draw_grid_mode) x_draw_cursor();
x_draw_reset_gc();
XFlush(display);
return text_panel_answer;
}
static Panel_item panel_text_item;
static void
init_panel_text_frame(message,menu_label,n,items)
char *message;
char *menu_label;
int n;
char **items;
{
int left, top, width, height;
Rect *r;
int i;
Menu menu;
int cols;
cols = 1+ n/15;
panel_frame = window_create(0, FRAME,
FRAME_SHOW_LABEL, FALSE,
FRAME_NO_CONFIRM, TRUE,
WIN_X, mouse_xpix, WIN_Y, mouse_ypix, 0);
panel = window_create(panel_frame, PANEL, WIN_FONT, text_font, 0);
panel_text_item = panel_create_item(panel, PANEL_TEXT,
PANEL_ITEM_Y, 18,
PANEL_NOTIFY_PROC, panel_input_text_notify,
PANEL_LABEL_STRING, message,
PANEL_VALUE_DISPLAY_LENGTH, 20,
PANEL_VALUE_STORED_LENGTH, 256,
0);
/*
if (n>0)
{ menu = (Menu)xv_create(NULL, MENU,
MENU_NCOLS, cols,
MENU_NOTIFY_PROC, text_panel_menu_proc,
0);
for(i=0;i<n;i++) menu_set(menu,MENU_STRING_ITEM,items[i],i,0);
(void) xv_create(panel, PANEL_BUTTON,
PANEL_LABEL_STRING, menu_label,
PANEL_ITEM_MENU, menu,
0);
}
*/
window_fit(panel);
window_fit(panel_frame);
center_frame(panel_frame);
window_set(panel, PANEL_CARET_ITEM, panel_text_item, 0);
}
/* notify proc */
static void panel_input_text_notify(item, event) /* pressing return */
Panel_item item;
Event *event;
{
strcpy(text_panel_answer,(char*)panel_get_value(item));
notify_stop();
}
static void text_panel_menu_proc(menu, menu_item) /* selecting menu */
Menu menu;
Menu_item menu_item;
{
xv_set(panel_text_item,PANEL_VALUE,xv_get(menu_item, MENU_STRING),0);
strcpy(text_panel_answer,xv_get(menu_item, MENU_STRING));
notify_stop();
}
static done_proc(subframe)
Frame subframe;
{ xv_set(subframe,XV_SHOW,FALSE,0);
notify_stop();
}
x_draw_message_panel(argc, argv)
char *argv[];
{ int max_len,i,left, top, width, height;
Rect *r;
Panel_item but;
if (x_draw_grid_mode) x_draw_cursor();
panel_frame = (Frame)xv_create(NULL, FRAME,
FRAME_LABEL, argv[0],
WIN_X, 10,
WIN_Y, 10,
NULL);
/*
panel_frame = (Frame)xv_create(frame, FRAME_CMD,
WIN_X, 10,
WIN_Y, 10,
WIN_WIDTH, 10,
WIN_HEIGHT, 10,
FRAME_CMD_PUSHPIN_IN, TRUE,
FRAME_LABEL, argv[0],
FRAME_DONE_PROC, done_proc,
NULL);
*/
panel = window_create(panel_frame, PANEL,
PANEL_LAYOUT, PANEL_VERTICAL,
WIN_FONT, text_font, 0);
if (argc > 1)
{ xv_create(panel, PANEL_MESSAGE,
PANEL_ITEM_Y, 10,
PANEL_ITEM_X, 25,
PANEL_LABEL_BOLD, TRUE,
PANEL_LABEL_STRING, argv[1],
NULL);
max_len = strlen(argv[1]);
}
for(i = 2; i< argc; i++)
{ if (max_len < strlen(argv[i]))
max_len = strlen(argv[i]);
xv_create(panel, PANEL_MESSAGE,
PANEL_ITEM_X, 25,
PANEL_LABEL_BOLD, TRUE,
PANEL_LABEL_STRING, argv[i],
NULL);
}
but = xv_create(panel, PANEL_BUTTON,
PANEL_LABEL_STRING, "OK",
PANEL_CLIENT_DATA, 0,
PANEL_NOTIFY_PROC, panel_input_notify,
NULL);
window_fit(panel);
window_fit(panel_frame);
width = xv_get(panel_frame,WIN_WIDTH);
panel_set(but,PANEL_ITEM_X,width/2 - 15,0);
center_frame(panel_frame);
xv_main_loop(panel_frame);
window_destroy(panel_frame);
if (x_draw_grid_mode) x_draw_cursor();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -