📄 callbacks.c
字号:
/* $Header: /cvsroot/lesstif/lesstif/test/Xm/drag_icon/callbacks.c,v 1.2 2001/05/23 13:45:57 amai Exp $ */#include <stdio.h>#include <Xm/Xm.h>#include "bitmap.h"/* Callbacks for our palette of pixmaps (an XmDrawingArea) */extern void drag_bitmap();extern Bitmap_t bitmaps[];GC gc = NULL;static voidcreate_gc(w) Widget w;{ XGCValues values; int i = 0; Pixel fg, bg; if (gc != 0) return; XtVaGetValues(w, XmNforeground, &fg, XmNbackground, &bg, NULL); values.foreground = fg; values.background = bg; values.fill_style = FillOpaqueStippled; gc = XCreateGC(XtDisplay(w), XtWindow(w), GCForeground | GCBackground | GCFillStyle, &values); while (bitmaps[i].name) { bitmaps[i].pixmap = XCreatePixmapFromBitmapData(XtDisplay(w), XtWindow(w), bitmaps[i].data, bitmaps[i].width, bitmaps[i].height, fg, bg, DefaultDepthOfScreen(XtScreen(w))); bitmaps[i].bitmap = XCreateBitmapFromData(XtDisplay(w), XtWindow(w), bitmaps[i].data, bitmaps[i].width, bitmaps[i].height); i++; }}void draw_bitmap(w, width, height, bitmap, x, y, line_height) Widget w; Bitmap_p bitmap; Position *x, *y; Dimension *line_height, width, height;{ XGCValues values; if (*x + bitmap->width > width) { *x = 0; *y = *y + *line_height; *line_height = 0; } if (*y + bitmap->height > height) return; if (bitmap->height > *line_height) *line_height = bitmap->height; values.ts_x_origin = *x; values.ts_y_origin = *y; values.stipple = bitmap->bitmap; XChangeGC(XtDisplay(w), gc, GCStipple | GCTileStipXOrigin | GCTileStipYOrigin, &values); XFillRectangle(XtDisplay(w), XtWindow(w), gc, *x, *y, bitmap->width, bitmap->height); *x = *x + bitmap->width;}voiddo_expose(w, client_data, call_data) Widget w; XtPointer client_data; XtPointer call_data;{ int i = 0; Dimension line_height = 0; Position x = 0; Position y = 0; Dimension width, height; create_gc(w); XtVaGetValues(w, XmNwidth, &width, XmNheight, &height, NULL); while (bitmaps[i].name) draw_bitmap(w, width, height, &(bitmaps[i++]), &x, &y, &line_height);}voiddo_resize(w, client_data, call_data) Widget w; XtPointer client_data; XtPointer call_data;{ if (XtIsRealized(w)) XClearArea(XtDisplay(w), XtWindow(w), 0, 0, 0, 0, False);}voiddo_input(w, client_data, cd) Widget w; XtPointer client_data; XtPointer cd;{ int i = 0; Dimension line_height = 0; Position x = 0; Position y = 0; Dimension width, height; Bitmap_p bitmap = NULL; XmDrawingAreaCallbackStruct *call_data = (XmDrawingAreaCallbackStruct *) cd; if (call_data->event->type == ButtonPress && call_data->event->xbutton.button == 2) { XtVaGetValues(w, XmNwidth, &width, XmNheight, &height, NULL); while (bitmaps[i].name) { if (x + bitmaps[i].width > width) { x = 0; y = y + line_height; line_height = 0; } if (y + bitmaps[i].height > height) break; if (bitmaps[i].height > line_height) line_height = bitmaps[i].height; if (call_data->event->xbutton.x <= x + bitmaps[i].width && call_data->event->xbutton.y <= y + bitmaps[i].height) { bitmap = &(bitmaps[i]); break; } x = x + bitmaps[i].width; i++; } if (bitmap) { printf("Got : %s\n", bitmap->name); drag_bitmap(w, bitmap, call_data->event); } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -