/* newlabel.c */
/*
* A new text label widget
*/
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include "lui.h"
static void draw_label( LUI_NEWLABEL *l )
{
int i, x, y;
char *str, *ch;
int len;
/* draw background */
XFillRectangle( LUI_Display, l->window, LUI_GC_gray,
0, 0, l->width, l->height );
x = LUI_Border;
y = LUI_Border + (l->height - 2*LUI_Border - l->lines * LUI_Font_height) / 2
+ LUI_Font_yoff;
/* draw text strings */
str = l->label;
for (i=0;i<l->lines;i++) {
ch = str;
len = 0;
while (*ch!='\n' && *ch!=0) {
len++;
ch++;
}
XDrawString( LUI_Display, l->window, LUI_GC_black, x, y, str, len );
y += LUI_Font_height;
str = ch+1;
}
}
static int label_process( LUI_NEWLABEL *l, XEvent *event )
{
switch (event->type) {
case Expose:
draw_label( l );
break;
default:
printf("Error in label_process: unexpected event\n");
}
return 1;
}
/*
* Compute how many lines of text are in the label.
*/
static void compute_lines( LUI_NEWLABEL *l )
{
char *ch;
l->lines = 0;
for (ch=l->label;*ch;ch++) {
if (*ch=='\n')
l->lines++;
}
l->lines++;
}
void LUI_NewLabelDestroy( LUI_NEWLABEL *l )
{
LUI_EventRemove( l->window );
XDestroyWindow( LUI_Display, l->window );
free( l->label );
free( l );
}
/*
* Create a new label. Multi-line text labels can be specified by
* inserting newline '\n' characters in the label string.
* Input: parent - parent window ID
* x, y - position of lable with respect to parent.
* width, height - size of label window
* label - the character string label
*/
LUI_NEWLABEL *LUI_NewLabelCreate( Window parent, int x, int y,
int width, int height, char *label )
{
LUI_NEWLABEL *l;
LUI_LayoutCheck( &x, &y, &width, &height );
l = (LUI_NEWLABEL *) malloc( sizeof(LUI_NEWLABEL) );
if (!l) {
return NULL;
}
/* Create the X window, the size-2 takes into effect of the 1-pixel */
/* black border surrounding the window */
l->window = XCreateSimpleWindow( LUI_Display, parent,
x, y, width, height,
0, LUI_Color_black, LUI_Color_gray );
LUI_EventAdd2( l->window, ExposureMask, (LUI_FNCP) label_process, l );
XMapWindow( LUI_Display, l->window );
l->x = x;
l->y = y;
l->width = width;
l->height = height;
l->label = strdup( label );
compute_lines( l );
LUI_AddWidgetToWindow( parent, l, (LUI_FNCP) LUI_NewLabelDestroy );
return l;
}
void LUI_NewLabelRefresh( LUI_NEWLABEL *l )
{
draw_label( l );
}
void LUI_NewLabelChangeText( LUI_NEWLABEL *l, char *label )
{
if (l->label) {
free( l->label );
}
l->label = strdup( label );
compute_lines( l );
draw_label( l );
}
syntax highlighted by Code2HTML, v. 0.9.1