/** fontposition.c **/ #include #define HEIGHT 100 #define WIDTH 300 #define STRING_LEFT 1 #define STRING_CENTER 2 #define STRING_RIGHT 3 #define STRING_TOP 1 #define STRING_MIDDLE 2 #define STRING_BOTTOM 3 typedef struct { GdkFont *font; GtkWidget *drawingArea; gint horizontal; gint vertical; } Context; gint eventDelete(GtkWidget *widget, GdkEvent *event,gpointer data); gint eventDestroy(GtkWidget *widget, GdkEvent *event,gpointer data); void eventFontSet(GtkWidget *widget, gchar *string,Context *context); gboolean eventDraw(GtkWidget *widget, GdkEvent *event,Context *context); void topButton(GtkWidget *widget,Context *context); void middleButton(GtkWidget *widget,Context *context); void bottomButton(GtkWidget *widget,Context *context); void leftButton(GtkWidget *widget,Context *context); void centerButton(GtkWidget *widget,Context *context); void rightButton(GtkWidget *widget,Context *context); static GtkWidget *createPositionWidget(Context *context); int main(int argc,char *argv[]) { GtkWidget *app; GtkWidget *position; Context context = { NULL, NULL, STRING_RIGHT, STRING_MIDDLE }; gnome_init("fontposition","1.0",argc,argv); app = gnome_app_new("fontposition","Font Position"); gtk_container_set_border_width(GTK_CONTAINER(app),30); gtk_signal_connect(GTK_OBJECT(app),"delete_event", GTK_SIGNAL_FUNC(eventDelete),NULL); gtk_signal_connect(GTK_OBJECT(app),"destroy", GTK_SIGNAL_FUNC(eventDestroy),NULL); position = createPositionWidget(&context); gnome_app_set_contents(GNOME_APP(app),position); gtk_widget_show_all(app); gtk_main(); exit(0); } static GtkWidget *createPositionWidget(Context *context) { GtkWidget *position; GtkWidget *box; GtkWidget *button; GtkWidget *frame; GtkWidget *fontpicker; position = gtk_vbox_new(FALSE,0); box = gtk_hbox_new(TRUE,10); button = gtk_button_new_with_label("Top"); gtk_signal_connect(GTK_OBJECT(button),"clicked", GTK_SIGNAL_FUNC(topButton),context); gtk_box_pack_start(GTK_BOX(box),button, FALSE,TRUE,0); button = gtk_button_new_with_label("Middle"); gtk_signal_connect(GTK_OBJECT(button),"clicked", GTK_SIGNAL_FUNC(middleButton),context); gtk_box_pack_start(GTK_BOX(box),button, FALSE,TRUE,0); button = gtk_button_new_with_label("Bottom"); gtk_signal_connect(GTK_OBJECT(button),"clicked", GTK_SIGNAL_FUNC(bottomButton),context); gtk_box_pack_start(GTK_BOX(box),button, FALSE,TRUE,0); gtk_box_pack_start(GTK_BOX(position),box, FALSE,FALSE,0); context->drawingArea = gtk_drawing_area_new(); gtk_drawing_area_size( GTK_DRAWING_AREA(context->drawingArea), WIDTH,HEIGHT); gtk_signal_connect(GTK_OBJECT(context->drawingArea), "event",GTK_SIGNAL_FUNC(eventDraw),context); frame = gtk_frame_new(NULL); gtk_container_add(GTK_CONTAINER(frame), context->drawingArea); gtk_box_pack_start(GTK_BOX(position),frame, FALSE,FALSE,0); box = gtk_hbox_new(TRUE,10); button = gtk_button_new_with_label("Left"); gtk_signal_connect(GTK_OBJECT(button),"clicked", GTK_SIGNAL_FUNC(leftButton),context); gtk_box_pack_start(GTK_BOX(box),button, FALSE,TRUE,0); button = gtk_button_new_with_label("Center"); gtk_signal_connect(GTK_OBJECT(button),"clicked", GTK_SIGNAL_FUNC(centerButton),context); gtk_box_pack_start(GTK_BOX(box),button, FALSE,TRUE,0); button = gtk_button_new_with_label("Right"); gtk_signal_connect(GTK_OBJECT(button),"clicked", GTK_SIGNAL_FUNC(rightButton),context); gtk_box_pack_start(GTK_BOX(box),button, FALSE,TRUE,0); gtk_box_pack_start(GTK_BOX(position),box, FALSE,FALSE,0); fontpicker = gnome_font_picker_new(); gtk_signal_connect(GTK_OBJECT(fontpicker),"font-set", GTK_SIGNAL_FUNC(eventFontSet),context); gtk_box_pack_start(GTK_BOX(position),fontpicker, FALSE,FALSE,0); return(position); } void eventFontSet(GtkWidget *widget, gchar *string,Context *context) { if(context->font != NULL) gdk_font_unref(context->font); context->font = gdk_font_load(string); gdk_window_clear_area_e(context->drawingArea->window, 0,0,WIDTH,HEIGHT); } gboolean eventDraw(GtkWidget *widget, GdkEvent *event,Context *context) { gchar outstring[40]; gint lbearing; gint rbearing; gint width; gint ascent; gint descent; gint x; gint y; if(context->font == NULL) { context->font = gdk_font_load( "-*-bookman-light-r-normal--14-*-*-*-p-*-iso8859-1"); } switch(context->vertical) { case STRING_TOP: strcpy(outstring,"Top"); break; case STRING_MIDDLE: strcpy(outstring,"Middle"); break; case STRING_BOTTOM: strcpy(outstring,"Bottom"); break; } switch(context->horizontal) { case STRING_LEFT: strcat(outstring," Left"); break; case STRING_CENTER: strcat(outstring," Center"); break; case STRING_RIGHT: strcat(outstring," Right"); break; } gdk_text_extents(context->font, outstring, strlen(outstring), &lbearing, &rbearing, &width, &ascent, &descent); switch(context->vertical) { case STRING_TOP: y = ascent; break; case STRING_MIDDLE: y = HEIGHT / 2; y += (ascent - descent) / 2; break; case STRING_BOTTOM: y = HEIGHT - descent; break; } switch(context->horizontal) { case STRING_LEFT: x = 0; break; case STRING_CENTER: x = (WIDTH / 2) - (width / 2); break; case STRING_RIGHT: x = WIDTH - width; break; } gdk_draw_string(widget->window, context->font, context->drawingArea->style->black_gc, x,y, outstring); return(TRUE); } void topButton(GtkWidget *widget,Context *context) { context->vertical = STRING_TOP; gdk_window_clear_area_e(context->drawingArea->window, 0,0,WIDTH,HEIGHT); } void middleButton(GtkWidget *widget,Context *context) { context->vertical = STRING_MIDDLE; gdk_window_clear_area_e(context->drawingArea->window, 0,0,WIDTH,HEIGHT); } void bottomButton(GtkWidget *widget,Context *context) { context->vertical = STRING_BOTTOM; gdk_window_clear_area_e(context->drawingArea->window, 0,0,WIDTH,HEIGHT); } void leftButton(GtkWidget *widget,Context *context) { context->horizontal = STRING_LEFT; gdk_window_clear_area_e(context->drawingArea->window, 0,0,WIDTH,HEIGHT); } void centerButton(GtkWidget *widget,Context *context) { context->horizontal = STRING_CENTER; gdk_window_clear_area_e(context->drawingArea->window, 0,0,WIDTH,HEIGHT); } void rightButton(GtkWidget *widget,Context *context) { context->horizontal = STRING_RIGHT; gdk_window_clear_area_e(context->drawingArea->window, 0,0,WIDTH,HEIGHT); } gint eventDelete(GtkWidget *widget, GdkEvent *event,gpointer data) { return(FALSE); } gint eventDestroy(GtkWidget *widget, GdkEvent *event,gpointer data) { gtk_main_quit(); return(0); }