Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.
| Obě strany předchozí revizePředchozí verze | |||
| pitel:gux:1 [05. 12. 2013, 13.17:04] – Zbytecne nadpisy pitel | pitel:gux:1 [30. 12. 2022, 13.43:01] (aktuální) – upraveno mimo DokuWiki 127.0.0.1 | ||
|---|---|---|---|
| Řádek 1: | Řádek 1: | ||
| + | ====== Projekt 1 ====== | ||
| + | [[http:// | ||
| + | <file c draw.c> | ||
| + | #include < | ||
| + | #include < | ||
| + | #include < | ||
| + | #include < | ||
| + | #include < | ||
| + | #include < | ||
| + | #include < | ||
| + | #include < | ||
| + | #include < | ||
| + | #include < | ||
| + | #include < | ||
| + | #include < | ||
| + | #include < | ||
| + | |||
| + | GC inputGC; | ||
| + | Widget question; | ||
| + | int x1, y1, x2, y2; /* input points */ | ||
| + | unsigned short button_pressed = 0; /* input state */ | ||
| + | Colormap cmap; | ||
| + | short fill = 0; | ||
| + | XColor red, green, blue, black, white; | ||
| + | XColor *lineFgColor = &black; | ||
| + | XColor *lineBgColor = &white; | ||
| + | XColor *fillFgColor = &red; | ||
| + | XColor *fillBgColor = &blue; | ||
| + | unsigned int line_width = 0; | ||
| + | int line_style = LineSolid; | ||
| + | int cap_style = CapButt; | ||
| + | int join_style = JoinMiter; | ||
| + | |||
| + | typedef enum toolkit {POINT, LINE, RECTANGLE, ELLIPSE} toolkit; | ||
| + | toolkit tool = LINE; | ||
| + | |||
| + | struct drawing { | ||
| + | toolkit tool; | ||
| + | GC gc; | ||
| + | short fill; | ||
| + | XColor fillColor; | ||
| + | int x1, y1, x2, y2; | ||
| + | }; | ||
| + | struct drawing *drawings = NULL; | ||
| + | size_t allocated = 1; | ||
| + | size_t ndrawings = 0; | ||
| + | |||
| + | /* Save drawing */ | ||
| + | void saveDrawing(Widget w) { | ||
| + | ndrawings++; | ||
| + | if (allocated <= ndrawings) { | ||
| + | drawings = (struct drawing *) realloc(drawings, | ||
| + | if (drawings != NULL) { | ||
| + | allocated *= 2; | ||
| + | } else { | ||
| + | fprintf(stderr, | ||
| + | exit(1); | ||
| + | } | ||
| + | } | ||
| + | drawings[ndrawings - 1].gc = XCreateGC(XtDisplay(w), | ||
| + | XSetForeground(XtDisplay(w), | ||
| + | XSetBackground(XtDisplay(w), | ||
| + | XCopyGC(XtDisplay(w), | ||
| + | drawings[ndrawings - 1].tool = tool; | ||
| + | drawings[ndrawings - 1].x1 = x1; | ||
| + | drawings[ndrawings - 1].x2 = x2; | ||
| + | drawings[ndrawings - 1].y1 = y1; | ||
| + | drawings[ndrawings - 1].y2 = y2; | ||
| + | drawings[ndrawings - 1].fill = fill; | ||
| + | drawings[ndrawings - 1].fillColor = *fillFgColor; | ||
| + | drawings[ndrawings].gc = NULL; /* Sentinel */ | ||
| + | } | ||
| + | |||
| + | /* Input event handler */ | ||
| + | void DrawEH(Widget w, XtPointer client_data, | ||
| + | Pixel fg, bg; | ||
| + | if (button_pressed) { | ||
| + | if (!inputGC) { | ||
| + | inputGC = XCreateGC(XtDisplay(w), | ||
| + | / | ||
| + | } | ||
| + | XtVaGetValues(w, | ||
| + | XSetForeground(XtDisplay(w), | ||
| + | XSetBackground(XtDisplay(w), | ||
| + | XSetLineAttributes(XtDisplay(w), | ||
| + | if (button_pressed > 1) { | ||
| + | XSetFunction(XtDisplay(w), | ||
| + | /* Kreslime znovu ten samy objekt pres sebe, cimz ho smazeme */ | ||
| + | switch (tool) { | ||
| + | case LINE: | ||
| + | XDrawLine(XtDisplay(w), | ||
| + | break; | ||
| + | case RECTANGLE: | ||
| + | if (fill) { | ||
| + | XSetForeground(XtDisplay(w), | ||
| + | XFillRectangle(XtDisplay(w), | ||
| + | XSetForeground(XtDisplay(w), | ||
| + | } | ||
| + | XDrawRectangle(XtDisplay(w), | ||
| + | break; | ||
| + | case ELLIPSE: | ||
| + | if (fill) { | ||
| + | XSetForeground(XtDisplay(w), | ||
| + | XFillArc(XtDisplay(w), | ||
| + | XSetForeground(XtDisplay(w), | ||
| + | } | ||
| + | XDrawArc(XtDisplay(w), | ||
| + | break; | ||
| + | default: | ||
| + | break; | ||
| + | } | ||
| + | } else { | ||
| + | /* remember first MotionNotify */ | ||
| + | button_pressed = 2; | ||
| + | } | ||
| + | x2 = event-> | ||
| + | y2 = event-> | ||
| + | switch (tool) { | ||
| + | case LINE: | ||
| + | XDrawLine(XtDisplay(w), | ||
| + | break; | ||
| + | case RECTANGLE: | ||
| + | if (fill) { | ||
| + | XSetForeground(XtDisplay(w), | ||
| + | XFillRectangle(XtDisplay(w), | ||
| + | XSetForeground(XtDisplay(w), | ||
| + | } | ||
| + | XDrawRectangle(XtDisplay(w), | ||
| + | break; | ||
| + | case ELLIPSE: | ||
| + | if (fill) { | ||
| + | XSetForeground(XtDisplay(w), | ||
| + | XFillArc(XtDisplay(w), | ||
| + | XSetForeground(XtDisplay(w), | ||
| + | } | ||
| + | XDrawArc(XtDisplay(w), | ||
| + | break; | ||
| + | default: | ||
| + | saveDrawing(w); | ||
| + | XDrawPoint(XtDisplay(w), | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | |||
| + | /* Save callback function */ | ||
| + | void SaveCB(Widget w, XtPointer client_data, | ||
| + | XmDrawingAreaCallbackStruct *d = (XmDrawingAreaCallbackStruct*) call_data; | ||
| + | switch (d-> | ||
| + | case ButtonPress: | ||
| + | if (d-> | ||
| + | button_pressed = 1; | ||
| + | x1 = d-> | ||
| + | y1 = d-> | ||
| + | } | ||
| + | break; | ||
| + | case ButtonRelease: | ||
| + | if (d-> | ||
| + | saveDrawing(w); | ||
| + | button_pressed = 0; | ||
| + | XClearArea(XtDisplay(w), | ||
| + | } | ||
| + | break; | ||
| + | } | ||
| + | } | ||
| + | |||
| + | /* " | ||
| + | void ExposeCB(Widget w, XtPointer client_data, | ||
| + | size_t i = 0; | ||
| + | XGCValues lineColor; | ||
| + | for (; i < ndrawings; i++) { | ||
| + | x1 = drawings[i].x1; | ||
| + | x2 = drawings[i].x2; | ||
| + | y1 = drawings[i].y1; | ||
| + | y2 = drawings[i].y2; | ||
| + | if (drawings[i].fill) { | ||
| + | XGetGCValues(XtDisplay(w), | ||
| + | } | ||
| + | switch (drawings[i].tool) { | ||
| + | case LINE: | ||
| + | XDrawLine(XtDisplay(w), | ||
| + | break; | ||
| + | case RECTANGLE: | ||
| + | if (drawings[i].fill) { | ||
| + | XSetForeground(XtDisplay(w), | ||
| + | XFillRectangle(XtDisplay(w), | ||
| + | XSetForeground(XtDisplay(w), | ||
| + | } | ||
| + | XDrawRectangle(XtDisplay(w), | ||
| + | break; | ||
| + | case ELLIPSE: | ||
| + | if (drawings[i].fill) { | ||
| + | XSetForeground(XtDisplay(w), | ||
| + | XFillArc(XtDisplay(w), | ||
| + | XSetForeground(XtDisplay(w), | ||
| + | } | ||
| + | XDrawArc(XtDisplay(w), | ||
| + | break; | ||
| + | case POINT: | ||
| + | XDrawPoint(XtDisplay(w), | ||
| + | XDrawPoint(XtDisplay(w), | ||
| + | break; | ||
| + | default: | ||
| + | fprintf(stderr, | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | |||
| + | /* " | ||
| + | void ClearCB(Widget w, XtPointer client_data, | ||
| + | Widget wcd = (Widget) client_data; | ||
| + | ndrawings = 0; | ||
| + | XClearWindow(XtDisplay(wcd), | ||
| + | } | ||
| + | |||
| + | /* Nastaveni nastroje */ | ||
| + | void setTool(Widget w, XtPointer newtool, XtPointer call_data) { | ||
| + | tool = (toolkit) newtool; | ||
| + | } | ||
| + | |||
| + | /* Nastaveni barvy popredi */ | ||
| + | void setColor(Widget w, XtPointer color, XtPointer call_data) { | ||
| + | unsigned long pixel = (*((XColor**)color))-> | ||
| + | if (pixel == black.pixel) { | ||
| + | *((XColor**) color) = &white; | ||
| + | } else if (pixel == white.pixel) { | ||
| + | *((XColor**) color) = &red; | ||
| + | } else if (pixel == red.pixel) { | ||
| + | *((XColor**) color) = &green; | ||
| + | } else if (pixel == green.pixel) { | ||
| + | *((XColor**) color) = &blue; | ||
| + | } else if (pixel == blue.pixel) { | ||
| + | *((XColor**) color) = &black; | ||
| + | } | ||
| + | / | ||
| + | XtVaSetValues(w, | ||
| + | } | ||
| + | |||
| + | /* Nastaveni tloustky cary */ | ||
| + | void setLineWidth(Widget w, XtPointer client_data, | ||
| + | XmString label; | ||
| + | switch (line_width) { | ||
| + | case 0: | ||
| + | line_width = 3; | ||
| + | label = XmStringCreateSimple(" | ||
| + | XtVaSetValues(w, | ||
| + | break; | ||
| + | case 3: | ||
| + | line_width = 8; | ||
| + | label = XmStringCreateSimple(" | ||
| + | XtVaSetValues(w, | ||
| + | break; | ||
| + | default: | ||
| + | line_width = 0; | ||
| + | label = XmStringCreateSimple(" | ||
| + | XtVaSetValues(w, | ||
| + | } | ||
| + | XmStringFree(label); | ||
| + | } | ||
| + | |||
| + | /* Nastaveni stylu cary */ | ||
| + | void setLineStyle(Widget w, XtPointer client_data, | ||
| + | XmString label; | ||
| + | switch (line_style) { | ||
| + | case LineSolid: | ||
| + | line_style = LineDoubleDash; | ||
| + | label = XmStringCreateSimple(" | ||
| + | XtVaSetValues(w, | ||
| + | break; | ||
| + | case LineDoubleDash: | ||
| + | line_style = LineSolid; | ||
| + | label = XmStringCreateSimple(" | ||
| + | XtVaSetValues(w, | ||
| + | break; | ||
| + | default: | ||
| + | label = XmStringCreateSimple("" | ||
| + | } | ||
| + | XmStringFree(label); | ||
| + | } | ||
| + | |||
| + | /* Nastaveni vyplnovani */ | ||
| + | void setFill(Widget w, XtPointer client_data, | ||
| + | XmString label; | ||
| + | if (fill) { | ||
| + | fill = 0; | ||
| + | label = XmStringCreateSimple(" | ||
| + | } else { | ||
| + | fill = 1; | ||
| + | label = XmStringCreateSimple(" | ||
| + | } | ||
| + | XtVaSetValues(w, | ||
| + | XmStringFree(label); | ||
| + | } | ||
| + | |||
| + | /* " | ||
| + | void quitCB(Widget w, XtPointer client_data, | ||
| + | XtManageChild(question); | ||
| + | } | ||
| + | |||
| + | /* Konecny callback */ | ||
| + | void questionCB(Widget w, XtPointer client_data, | ||
| + | size_t i = 0; | ||
| + | if ((int)client_data) { | ||
| + | for (; i < allocated; i++) { | ||
| + | if (drawings != NULL && drawings[i].gc != NULL) { | ||
| + | XFreeGC(XtDisplay(w), | ||
| + | } else { | ||
| + | / | ||
| + | break; | ||
| + | } | ||
| + | } | ||
| + | if (inputGC != NULL) { | ||
| + | XFreeGC(XtDisplay(w), | ||
| + | } | ||
| + | exit(0); | ||
| + | } | ||
| + | } | ||
| + | |||
| + | int main(int argc, char **argv) { | ||
| + | XtAppContext app_context; | ||
| + | XmString label; | ||
| + | Atom wm_delete; | ||
| + | Widget	topLevel, | ||
| + | mainWin, | ||
| + | frame, | ||
| + | drawArea, | ||
| + | command_window, | ||
| + | toolbox, | ||
| + | pointBtn, | ||
| + | lineBtn, | ||
| + | rectBtn, | ||
| + | ellipseBtn, | ||
| + | colors, | ||
| + | lineFgBtn, | ||
| + | lineBgBtn, | ||
| + | fillFgBtn, | ||
| + | fillBgBtn, | ||
| + | style, | ||
| + | lineSizeBtn, | ||
| + | lineStyleBtn, | ||
| + | fillBtn, | ||
| + | sys, | ||
| + | quitBtn, | ||
| + | clearBtn; | ||
| + | |||
| + | char *fallback_resources[] = { | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | NULL | ||
| + | }; | ||
| + | |||
| + | XtSetLanguageProc(NULL, | ||
| + | topLevel = XtVaAppInitialize( | ||
| + | & | ||
| + | " | ||
| + | NULL, 0, /* command line option list */ | ||
| + | & | ||
| + | fallback_resources, | ||
| + | XmNdeleteResponse, | ||
| + | NULL); | ||
| + | mainWin = XtVaCreateManagedWidget( | ||
| + | " | ||
| + | xmMainWindowWidgetClass, | ||
| + | topLevel, | ||
| + | XmNcommandWindowLocation, | ||
| + | NULL); | ||
| + | frame = XtVaCreateManagedWidget( | ||
| + | " | ||
| + | xmFrameWidgetClass, | ||
| + | mainWin, | ||
| + | NULL); | ||
| + | drawArea = XtVaCreateManagedWidget( | ||
| + | " | ||
| + | xmDrawingAreaWidgetClass, | ||
| + | frame, | ||
| + | XmNwidth, 320, /* set startup width */ | ||
| + | XmNheight, | ||
| + | NULL); | ||
| + | command_window = XtVaCreateManagedWidget( | ||
| + | " | ||
| + | xmRowColumnWidgetClass, | ||
| + | mainWin, | ||
| + | NULL); | ||
| + | toolbox = XtVaCreateManagedWidget( | ||
| + | " | ||
| + | xmRowColumnWidgetClass, | ||
| + | command_window, | ||
| + | XmNentryAlignment, | ||
| + | XmNorientation, | ||
| + | XmNpacking, | ||
| + | NULL); | ||
| + | colors = XtVaCreateManagedWidget( | ||
| + | " | ||
| + | xmRowColumnWidgetClass, | ||
| + | command_window, | ||
| + | XmNentryAlignment, | ||
| + | XmNorientation, | ||
| + | XmNpacking, | ||
| + | NULL); | ||
| + | style = XtVaCreateManagedWidget( | ||
| + | " | ||
| + | xmRowColumnWidgetClass, | ||
| + | command_window, | ||
| + | XmNentryAlignment, | ||
| + | XmNorientation, | ||
| + | XmNpacking, | ||
| + | NULL); | ||
| + | sys = XtVaCreateManagedWidget( | ||
| + | " | ||
| + | xmRowColumnWidgetClass, | ||
| + | command_window, | ||
| + | XmNentryAlignment, | ||
| + | XmNorientation, | ||
| + | XmNpacking, | ||
| + | NULL); | ||
| + | clearBtn = XtVaCreateManagedWidget( | ||
| + | " | ||
| + | xmPushButtonWidgetClass, | ||
| + | sys, | ||
| + | NULL); | ||
| + | pointBtn = XtVaCreateManagedWidget( | ||
| + | " | ||
| + | xmPushButtonWidgetClass, | ||
| + | toolbox, | ||
| + | NULL); | ||
| + | lineBtn = XtVaCreateManagedWidget( | ||
| + | " | ||
| + | xmPushButtonWidgetClass, | ||
| + | toolbox, | ||
| + | NULL); | ||
| + | rectBtn = XtVaCreateManagedWidget( | ||
| + | " | ||
| + | xmPushButtonWidgetClass, | ||
| + | toolbox, | ||
| + | NULL); | ||
| + | ellipseBtn = XtVaCreateManagedWidget( | ||
| + | " | ||
| + | xmPushButtonWidgetClass, | ||
| + | toolbox, | ||
| + | NULL); | ||
| + | lineFgBtn = XtVaCreateManagedWidget( | ||
| + | " | ||
| + | xmPushButtonWidgetClass, | ||
| + | colors, | ||
| + | NULL); | ||
| + | lineBgBtn = XtVaCreateManagedWidget( | ||
| + | " | ||
| + | xmPushButtonWidgetClass, | ||
| + | colors, | ||
| + | NULL); | ||
| + | fillFgBtn = XtVaCreateManagedWidget( | ||
| + | " | ||
| + | xmPushButtonWidgetClass, | ||
| + | colors, | ||
| + | NULL); | ||
| + | fillBgBtn = XtVaCreateManagedWidget( | ||
| + | " | ||
| + | xmPushButtonWidgetClass, | ||
| + | colors, | ||
| + | NULL); | ||
| + | label = XmStringCreateSimple(" | ||
| + | lineSizeBtn = XtVaCreateManagedWidget( | ||
| + | " | ||
| + | xmPushButtonWidgetClass, | ||
| + | style, | ||
| + | XmNlabelString, | ||
| + | NULL); | ||
| + | XmStringFree(label); | ||
| + | label = XmStringCreateSimple(" | ||
| + | lineStyleBtn = XtVaCreateManagedWidget( | ||
| + | " | ||
| + | xmPushButtonWidgetClass, | ||
| + | style, | ||
| + | XmNlabelString, | ||
| + | NULL); | ||
| + | XmStringFree(label); | ||
| + | label = XmStringCreateSimple(" | ||
| + | fillBtn = XtVaCreateManagedWidget( | ||
| + | " | ||
| + | xmPushButtonWidgetClass, | ||
| + | style, | ||
| + | XmNlabelString, | ||
| + | NULL); | ||
| + | XmStringFree(label); | ||
| + | quitBtn = XtVaCreateManagedWidget( | ||
| + | " | ||
| + | xmPushButtonWidgetClass, | ||
| + | sys, | ||
| + | NULL); | ||
| + | |||
| + | question = XmCreateQuestionDialog(topLevel, | ||
| + | XtVaSetValues(question, | ||
| + | XtUnmanageChild(XmMessageBoxGetChild(question, | ||
| + | XtAddCallback(question, | ||
| + | / | ||
| + | wm_delete = XInternAtom(XtDisplay(topLevel), | ||
| + | XmAddWMProtocolCallback(topLevel, | ||
| + | XmActivateWMProtocol(topLevel, | ||
| + | XtAddEventHandler(topLevel, | ||
| + | |||
| + | XmMainWindowSetAreas(mainWin, | ||
| + | |||
| + | cmap = DefaultColormap(XtDisplay(drawArea), | ||
| + | if ( | ||
| + | !XAllocNamedColor(XtDisplay(drawArea), | ||
| + | !XAllocNamedColor(XtDisplay(drawArea), | ||
| + | !XAllocNamedColor(XtDisplay(drawArea), | ||
| + | !XAllocNamedColor(XtDisplay(drawArea), | ||
| + | !XAllocNamedColor(XtDisplay(drawArea), | ||
| + | ) { | ||
| + | fprintf(stderr, | ||
| + | return 1; | ||
| + | } | ||
| + | XtVaSetValues(lineFgBtn, | ||
| + | XtVaSetValues(lineBgBtn, | ||
| + | XtVaSetValues(fillFgBtn, | ||
| + | XtVaSetValues(fillBgBtn, | ||
| + | |||
| + | XtAddCallback(drawArea, | ||
| + | XtAddEventHandler(drawArea, | ||
| + | XtAddCallback(drawArea, | ||
| + | XtAddCallback(clearBtn, | ||
| + | XtAddCallback(lineFgBtn, | ||
| + | XtAddCallback(lineBgBtn, | ||
| + | XtAddCallback(fillFgBtn, | ||
| + | XtAddCallback(fillBgBtn, | ||
| + | XtAddCallback(lineSizeBtn, | ||
| + | XtAddCallback(lineStyleBtn, | ||
| + | XtAddCallback(fillBtn, | ||
| + | XtAddCallback(pointBtn, | ||
| + | XtAddCallback(lineBtn, | ||
| + | XtAddCallback(rectBtn, | ||
| + | XtAddCallback(ellipseBtn, | ||
| + | XtAddCallback(quitBtn, | ||
| + | XtRealizeWidget(topLevel); | ||
| + | XtAppMainLoop(app_context); | ||
| + | return 0; | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | <file make Imakefile> | ||
| + | #include < | ||
| + | #include < | ||
| + | |||
| + | CC=gcc | ||
| + | CCOPTIONS=-O2 -pipe -pedantic-errors -Wall -Wextra -march=native -ansi | ||
| + | CDEBUGFLAGS=-g | ||
| + | |||
| + | LOCAL_LIBRARIES = XmClientLibs $(XMULIB) | ||
| + | |||
| + | MSimpleProgramTarget(draw) | ||
| + | |||
| + | clean:: | ||
| + | $(RM) Makefile | ||
| + | </ | ||