📄 garnish.c
字号:
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 + -