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

📄 garnish.c

📁 地震波正演和显示模块
💻 C
📖 第 1 页 / 共 2 页
字号:
    if (light.blue > 1) light.blue += 20000;
    light.flags = COLOR_FLAGS;
    colors[loop][3] = light;
    XAllocColor(display, colormap, &colors[loop][3]);
    light = colors[loop][3];
  }
  else {
    dark = colors[index][1];
    medium = colors[index][2];
    light = colors[index][3];
  }
  bw = 3;
  bh = 3;
  
  XSetLineAttributes(display, gc, 1,LineSolid,CapRound,JoinMiter);
  /** Draw the main text rectangle **/
  if (state == UP) 
    XSetForeground(display, gc, color.pixel);
  else
    XSetForeground(display, gc, medium.pixel);
  XFillRectangle(display, win, gc, x,y,width,height);
  
  /** Place the text in the rectangle **/
  if (((int) strlen(text)) > 0) {
    if (mode == FIXED)
      tx = 0;
    else
      tx = width/2-(((int) strlen(text))*c_width)/2;
    ty = height - (height - c_height)/2;
    XSetForeground(display, gc, textcolor.pixel);
    XDrawString(display, win, gc, x+tx,y+ty,text,(int) strlen(text));
  }

  /** Draw the upper highlight border **/
  if (state == UP)
    XSetForeground(display, gc, light.pixel);
  else
    XSetForeground(display, gc, dark.pixel);
  XFillRectangle(display, win, gc, x-bw, y-bh+1,bw,height+bh);
  for(loop = 0; loop < bh; loop++) 
    XDrawLine(display, win, gc, x, y-loop,x+width+loop,y-loop);
  if (state == UP)
    XSetForeground(display, gc, dark.pixel);
  else
    XSetForeground(display, gc, light.pixel);
  XFillRectangle(display, win, gc, x-bw, y+height,width+bw*2,bh);
  for(loop = 0; loop < bw; loop++)
    XDrawLine(display, win, gc, x+width+loop, y-loop,x+width+loop,
	      y+height);
}

void
DrawScrollBar(Window win,int x,int y,int width,int height,int pos,XColor color)
{
  XColor accentuate;
  XColor foreground;

  if ((((unsigned int) (color.red)) + ((unsigned int) color.blue) +
	((unsigned int) color.green)) < ((unsigned int) 90000))
    foreground.red = foreground.blue = foreground.green = 0;
  else
    foreground.red = foreground.blue = foreground.green = 65000;
  XAllocColor(display, colormap, &foreground);
  accentuate.red = color.red;
  accentuate.green = color.green;
  accentuate.blue = color.blue;
  accentuate.flags = COLOR_FLAGS;
  if (accentuate.red > 1) accentuate.red -= 15000;
  if (accentuate.green > 1) accentuate.green -= 15000;
  if (accentuate.blue > 1) accentuate.blue -= 15000;
  XAllocColor(display, colormap, &accentuate);
  XSetForeground(display, gc, color.pixel);
  XFillRectangle(display, win, gc, x,y,width,height);
  /** Draw the Arrows Boxes **/
  XSetForeground(display, gc, accentuate.pixel);
  XFillRectangle(display, win, gc, x,y,20,width);
  XFillRectangle(display, win, gc, x,y+height-20,20,width);
  XSetForeground(display, gc, foreground.pixel);
  XSetLineAttributes(display, gc, 1,LineSolid,CapRound,JoinMiter);
  /** Draw up arrow **/
  XDrawLine(display, win, gc, x+width/2,y+18,x+width/2,y+2);
  XDrawLine(display, win, gc, x+width/2-4,y+6,x+width/2,y+2);
  XDrawLine(display, win, gc, x+width/2+4,y+6,x+width/2,y+2);
  /** Draw down arrow **/
  XDrawLine(display, win, gc, x+width/2,y+height-2,x+width/2,y+height-18);
  XDrawLine(display, win, gc, x+width/2-4,y+height-6,x+width/2,y+height-2);
  XDrawLine(display, win, gc, x+width/2+4,y+height-6,x+width/2,y+height-2);
  /** Draw the position marker **/
  XSetForeground(display, gc, foreground.pixel);
  XFillRectangle(display, win, gc, x+2,y+20+pos*(height-40)/40,
		 width-4,(height-40)/40);
}

void RefreshTextLine(TextSet *set, int which)
{
  int x, y,l;
  char stemp[80];
  int state;
  XColor fore,back;

  if (which == set->currently_pointed) 
    state = DOWN;
  else
    state = UP;
  fore.pixel = set->foreground;
  back.pixel = set->background;
  fore.flags = back.flags = COLOR_FLAGS;
  XQueryColor(display, colormap, &fore);
  XQueryColor(display, colormap, &back);
  x = set->startx; y = set->starty;
  y += which*(set->space + set->char_height);
  XSetForeground(display,  gc, set->background);
/*  XFillRectangle(display, set->win, gc, set->startx-3, y-set->char_height,
		 set->max*set->char_width+6,set->char_height+4); */
  XSetFont(display, gc, set->font);
  XSetForeground(display, gc, set->foreground);
  XSetBackground(display, gc, set->background);
/*
  XDrawLine(display, set->win, gc, x, y+1, x+set->max*set->char_width, y+1);
*/
  l = (int) strlen(&set->text[which][set->view_start[which]]);
  memset(stemp, '\0', sizeof(stemp));
  if (l < set->max)
    strncpy(stemp, &set->text[which][set->view_start[which]],
	    l);
  else
    strncpy(stemp, &set->text[which][set->view_start[which]],
	    set->max);
  NewButton(set->win, x, y-set->char_height/*-set->space/3*/, 
	    set->max*set->char_width,
	    set->char_height, state, back, fore, 
	    stemp, set->char_width, set->char_height,FIXED);
  XSetForeground(display, gc, set->foreground);
  if (which == set->currently_pointed) {
    int loop;

    x += (set->char_pos-set->view_start[set->currently_pointed])*
      set->char_width;
    y -= 2;
    for (loop = 0; loop < 4; loop++) {
      XDrawLine(display, set->win, gc, x-loop, y+loop, x,y);
      XDrawLine(display, set->win, gc, x-loop, y+loop, x+loop,y+loop);
      XDrawLine(display, set->win, gc, x+loop, y+loop, x, y);
    }
  }
}

/*****************************************************************************/
/** This procedure refreshes the entire test set.                           **/
/*****************************************************************************/
void RefreshTextSet(TextSet *set)
{
  int loop;

  for (loop = 0; loop < set->number; loop++) 
    RefreshTextLine(set, loop);
}

void CheckTextSet(TextSet *set, int x, int y)
{
  int dist; /* distance of pointer from start of line */

  dist = x-set->startx;
  if (x < set->startx || x > set->startx+set->max*set->char_width)
    return;
  if (y < set->starty - set->char_height ||
      y > set->starty + (set->char_height*set->number-1)+
      (set->space*(set->number-1)))
    return;
  if (y > set->starty-set->char_height && y < set->starty)  {
    int i;

    i = set->currently_pointed;
    set->currently_pointed = 0;
    
    set->char_pos = set->view_start[set->currently_pointed] +
      (dist/set->char_width);
    if (set->char_pos > (((int) strlen(set->text[set->currently_pointed]))-1))
      set->char_pos = (int) strlen(set->text[set->currently_pointed]);
    if (i >= 0)
      RefreshTextLine(set, i);
    if (set->number != 1)
      RefreshTextLine(set, 0);
  }
  else {
    int i;
    
    if (set->number < 2) 
      return;
    y = y - set->starty;
    y = y / (set->char_height+set->space);
    i = set->currently_pointed;
    if (y >= set->number-1)  return;
    set->currently_pointed = y+1;
    set->char_pos = set->view_start[set->currently_pointed]
      + (dist/set->char_width);
    if (set->char_pos > (((int) strlen(set->text[set->currently_pointed]))-1))
      set->char_pos = (int) strlen(set->text[set->currently_pointed]);
    if (i >= 0 && i < set->number)
      RefreshTextLine(set, i);
    if (y+1 < set->number)
    RefreshTextLine(set, y+1);
  }
  /*
   * As we may have several text sets operational at once, we need to
   * remember which one was last indicated.
   */
  CurrentTextSet = set;
}

int SetTextSetLine(TextSet *set, int which) 
{
  if (which > -1 && which < set->number)
    set->currently_pointed = which;
  else
    return 0;
  return 1;
}

int GetTextSetLine(set) 
     TextSet *set;
{
  if (!set) return -1;
  return set->currently_pointed;
}

void GetTextLineString(TextSet *set, int which, char *str)
{
  memset(str, '\0',  strlen(str)); strcpy(str, set->text[which]);
}

void AddTextSetString(TextSet *set, char *str)
{
  if (set->currently_pointed == -1) {
    fprintf(stderr, "ERROR : Currently pointed is -1!\n");
    exit(0);
  }
  strcpy(set->text[set->currently_pointed], str);
  RefreshTextLine(set, set->currently_pointed);
}

TextSet *QueryCurrentTextSet()
{
  return CurrentTextSet;
}

void SetCurrentTextSet(TextSet *set, int dir)
{
  if (CurrentTextSet != NULL)
    RefreshTextSet(CurrentTextSet);
  if (CurrentTextSet == set)
    return;
  if (CurrentTextSet != NULL)
    CurrentTextSet->currently_pointed = -1;
  if (CurrentTextSet != NULL)
    RefreshTextSet(CurrentTextSet);
  if (dir == UP)
    set->currently_pointed = set->number-1;
  else
    set->currently_pointed = 0;
  if (CurrentTextSet != NULL)
    set->char_pos = CurrentTextSet->char_pos;
  else
    set->char_pos = 0;
  CurrentTextSet = set;
  if (set->text[set->currently_pointed][0] == '\0')
    set->char_pos = 0;
  else if (set->char_pos > (((int) strlen(set->text[set->currently_pointed]))-1))
    set->char_pos = (int) strlen(set->text[set->currently_pointed]);
  RefreshTextSet(set);
}


/*****************************************************************************/
/** This procedure adds a character to the currently pointed text line in   **/
/** the indicated set.  If the set is NULL then the CurrentTextSet is used. **/
/*****************************************************************************/
void AddTextSetChar(TextSet *set, char c)
{
  char stemp[180];

  if (!set) 
    set = CurrentTextSet;
  if (set->currently_pointed == -1)
    return;

  memset(stemp, '\0', sizeof(stemp));
  strncpy(stemp, set->text[set->currently_pointed], set->char_pos);
  stemp[set->char_pos] = c;
  strcat(stemp, &set->text[set->currently_pointed][set->char_pos]);
  strcpy(set->text[set->currently_pointed], stemp);
  set->char_pos++;
  if (set->char_pos > set->view_start[set->currently_pointed]+set->max)
    set->view_start[set->currently_pointed]++;
  RefreshTextLine(set, set->currently_pointed);
}

void TextLineBack(TextSet *set)
{
  if (!set) 
    set = CurrentTextSet;
  if (set->char_pos == 0) return;
  if (set->char_pos == set->view_start[set->currently_pointed]) {
    set->char_pos --;
    set->view_start[set->currently_pointed] --;
  }
  else
    set->char_pos--;
  RefreshTextLine(set, set->currently_pointed);
}

void TextLineForward(TextSet *set)
{
  if (!set) 
    set = CurrentTextSet;
  if (set->char_pos > (((int) strlen(set->text[set->currently_pointed]))-1))
    return;
  set->char_pos++;
  if ((set->char_pos - set->view_start[set->currently_pointed]) > set->max) 
    set->view_start[set->currently_pointed]++;
  RefreshTextLine(set, set->currently_pointed);
}

int TextLineUp(TextSet *set)
{
  if (!set) 
    set = CurrentTextSet;
  if (set->currently_pointed == 0)
    return -1;
  set->currently_pointed--;
  if (set->char_pos >  (((int) strlen(set->text[set->currently_pointed]))-1))
    set->char_pos = (int) strlen(set->text[set->currently_pointed]);
  RefreshTextLine(set, set->currently_pointed+1);
  RefreshTextLine(set, set->currently_pointed);
  return EXIT_SUCCESS;
}

int TextLineDown(TextSet *set)
{
  if (!set) 
    set = CurrentTextSet;
  if (set->currently_pointed < set->number-1) {
    set->currently_pointed ++;
    if (set->char_pos >  (((int) strlen(set->text[set->currently_pointed]))-1))
      set->char_pos = (int) strlen(set->text[set->currently_pointed]);
    RefreshTextLine(set, set->currently_pointed-1);
    RefreshTextLine(set, set->currently_pointed);
    return 0;
  }
  return -1;
}

void DeleteTextSetChar(TextSet *set)
{
  char stemp[180];
  
  
  if (!set) 
    set = CurrentTextSet;
  if (!set->char_pos) return;
  set->char_pos--;
  memset(stemp, '\0', sizeof(stemp));
  if (set->char_pos - set->view_start[set->currently_pointed] < 0)
    set->view_start[set->currently_pointed]--;
  strncpy(stemp, set->text[set->currently_pointed], set->char_pos);
  strcat(stemp, &set->text[set->currently_pointed][set->char_pos+1]);
  strcpy(set->text[set->currently_pointed], stemp);
  RefreshTextLine(set, set->currently_pointed);
}

TextSet *CreateTextSet(Window wind, int startx, int starty, int number,
		       int space, int max, Font font, int char_width,
		       int char_height, unsigned long foreground,
		       unsigned long background)
{
  int loop;
  TextSet *ret;  

  ret = (TextSet *) malloc(sizeof(TextSet));
  ret->win         = wind;
  ret->startx      = startx;
  ret->starty      = starty;
  ret->number      = number;
  ret->space       = space;
  ret->max         = max;
  ret->font        = font;
  ret->char_width  = char_width;
  ret->char_height = char_height;
  ret->currently_pointed = 1;
  ret->char_pos    = 0;
  ret->foreground  = foreground;
  ret->background  = background;
  for (loop = 0; loop < number; loop ++) {
    ret->text[loop][0] = '\0';
    ret->view_start[loop]  = 0;
  }
  CurrentTextSet=ret;
  return ret;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -