⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 _xview.c

📁 数据类型和算法库LEDA 数据类型和算法库LEDA
💻 C
📖 第 1 页 / 共 3 页
字号:
/*
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 + -