⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gcommon.c

📁 Graphviz - Graph Drawing Programs from AT&T Research and Lucent Bell Labs See doc/build.html for
💻 C
📖 第 1 页 / 共 2 页
字号:
/* $Id: gcommon.c,v 1.3 2006/06/27 12:43:47 ellson Exp $ $Revision: 1.3 $ *//* vim:set shiftwidth=4 ts=8: *//***********************************************************      This software is part of the graphviz package      **                http://www.graphviz.org/                 **                                                         **            Copyright (c) 1994-2004 AT&T Corp.           **                and is licensed under the                **            Common Public License, Version 1.0           **                      by AT&T Corp.                      **                                                         **        Information and Software Systems Research        **              AT&T Research, Florham Park NJ             ***********************************************************//* Lefteris Koutsofios - AT&T Labs Research */#include "common.h"#include "g.h"#include "gcommon.h"#include "mem.h"#define WCU widget->u.c#define WVU widget->u.vFILE *Gxfp;int Gxfd;int Gpopdownflag;int Gdepth;int Gnocallbacks;int menuselected;int menupoped;char *Gbufp = NULL;int Gbufn = 0, Gbufi = 0;PIXpoint_t *Gppp;int Gppn, Gppi;Gfont_t *Gfontp;int Gfontn;static HFONT deffont;static int twobmouse;static HWND palettechanged;LRESULT CALLBACK LeftyWndProc (HWND, UINT, WPARAM, LPARAM);LRESULT CALLBACK ArrayWndProc (HWND, UINT, WPARAM, LPARAM);LRESULT CALLBACK CanvasWndProc (HWND, UINT, WPARAM, LPARAM);LRESULT CALLBACK LabelWndProc (HWND, UINT, WPARAM, LPARAM);LRESULT CALLBACK ScrollWndProc (HWND, UINT, WPARAM, LPARAM);static void processcommand (Gwidget_t *, WPARAM, LPARAM);static void handleresize (Gwidget_t *);int Ginitgraphics (void) {    WNDCLASS wc;    HDC hdc;    ATOM rtn;    if (!hprevinstance) {        wc.style = NULL;        wc.lpfnWndProc = LeftyWndProc;        wc.cbClsExtra = 0;        wc.cbWndExtra = 0;        wc.hInstance = hinstance;        wc.hIcon = LoadIcon ((HINSTANCE) NULL, IDI_APPLICATION);        wc.hCursor = LoadCursor ((HINSTANCE) NULL, IDC_ARROW);        wc.hbrBackground = GetStockObject (WHITE_BRUSH);        wc.lpszMenuName = 0;        wc.lpszClassName = "LeftyClass";        if (!(rtn = RegisterClass (&wc)))            panic1 (POS, "GXinit", "register class rtn = %d", (int) rtn);        wc.style = NULL;        wc.lpfnWndProc = ArrayWndProc;        wc.cbClsExtra = 0;        wc.cbWndExtra = 0;        wc.hInstance = hinstance;        wc.hIcon = LoadIcon ((HINSTANCE) NULL, IDI_APPLICATION);        wc.hCursor = LoadCursor ((HINSTANCE) NULL, IDC_ARROW);        wc.hbrBackground = GetStockObject (WHITE_BRUSH);        wc.lpszMenuName = 0;        wc.lpszClassName = "ArrayClass";        if (!(rtn = RegisterClass (&wc)))            panic1 (POS, "GXinit", "register class rtn = %d", (int) rtn);        wc.style = CS_OWNDC;        wc.lpfnWndProc = CanvasWndProc;        wc.cbClsExtra = 0;        wc.cbWndExtra = 0;        wc.hInstance = hinstance;        wc.hIcon = LoadIcon ((HINSTANCE) NULL, IDI_APPLICATION);        wc.hCursor = NULL;        wc.hbrBackground = GetStockObject (WHITE_BRUSH);        wc.lpszMenuName = 0;        wc.lpszClassName = "CanvasClass";        if (!(rtn = RegisterClass (&wc)))            panic1 (POS, "GXinit", "register class rtn = %d", (int) rtn);        wc.style = NULL;        wc.lpfnWndProc = ScrollWndProc;        wc.cbClsExtra = 0;        wc.cbWndExtra = 0;        wc.hInstance = hinstance;        wc.hIcon = LoadIcon ((HINSTANCE) NULL, IDI_APPLICATION);        wc.hCursor = LoadCursor ((HINSTANCE) NULL, IDC_ARROW);        wc.hbrBackground = GetStockObject (WHITE_BRUSH);        wc.lpszMenuName = 0;        wc.lpszClassName = "ScrollClass";        if (!(rtn = RegisterClass (&wc)))            panic1 (POS, "GXinit", "register class rtn = %d", (int) rtn);        wc.style = NULL;        wc.lpfnWndProc = LabelWndProc;        wc.cbClsExtra = 0;        wc.cbWndExtra = 0;        wc.hInstance = hinstance;        wc.hIcon = LoadIcon ((HINSTANCE) NULL, IDI_APPLICATION);        wc.hCursor = LoadCursor ((HINSTANCE) NULL, IDC_ARROW);        wc.hbrBackground = GetStockObject (WHITE_BRUSH);        wc.lpszMenuName = 0;        wc.lpszClassName = "LabelClass";        if (!(rtn = RegisterClass (&wc)))            panic1 (POS, "GXinit", "register class rtn = %d", (int) rtn);    }    if (getenv ("LEFTY3BMOUSE"))        twobmouse = FALSE;    else        twobmouse = TRUE;    hdc = GetDC ((HWND) NULL);    Gdepth = GetDeviceCaps (hdc, BITSPIXEL);    deffont = GetStockObject (SYSTEM_FONT);#ifndef FEATURE_MS    if (!(Gxfp = fopen ("/dev/windows", "r")))        panic1 (POS, "GXinit", "cannot open windows device");    Gxfd = fileno (Gxfp);#endif    Gpopdownflag = FALSE;    Gbufp = Marrayalloc ((long) BUFINCR * BUFSIZE);    Gbufn = BUFINCR;    Gppp = Marrayalloc ((long) PPINCR * PPSIZE);    Gppn = PPINCR;    Gfontp = Marrayalloc ((long) FONTSIZE);    Gfontn = 1;    Gfontp[0].name = strdup ("default");    if (!Gdefaultfont)        Gfontp[0].font = deffont;    else if (Gdefaultfont[0] != '\000')        Gfontp[0].font = CreateFont (            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, Gdefaultfont        );    else        Gfontp[0].font = NULL;    ReleaseDC ((HWND) NULL, hdc);    Gnocallbacks = FALSE;    return 0;}int Gtermgraphics (void) {    int fi;    for (fi = 0; fi < Gfontn; fi++)        free (Gfontp[fi].name);    Marrayfree (Gfontp), Gfontp = NULL, Gfontn = 0;    Marrayfree (Gppp), Gppp = NULL, Gppn = 0;    Marrayfree (Gbufp), Gbufp = NULL, Gbufn = 0;    return 0;}int Gsync (void) {    return 0;}int Gresetbstate (int wi) {    Gcw_t *cw;    int bn;    cw = Gwidgets[wi].u.c;    bn = cw->bstate[0] + cw->bstate[1] + cw->bstate[2];    cw->bstate[0] = cw->bstate[1] = cw->bstate[2] = 0;    cw->buttonsdown -= bn;    Gbuttonsdown -= bn;    return 0;}int Gprocessevents (int waitflag, int mode) {    MSG msg;    int rtn;    rtn = 0;    switch (waitflag) {    case TRUE:        if (!GetMessage(&msg, (HWND) NULL, (UINT) NULL, (UINT) NULL))            exit (msg.wParam);        TranslateMessage(&msg);        DispatchMessage(&msg);        if (mode == G_ONEEVENT)            return 1;        rtn = 1;        /* FALL THROUGH */    case FALSE:        while (PeekMessage(&msg, (HWND) 0, (UINT) 0, (UINT) 0, PM_REMOVE)) {            if (msg.message == WM_QUIT)                exit (msg.wParam);            TranslateMessage(&msg);            DispatchMessage(&msg);            if (mode == G_ONEEVENT)                return 1;            rtn = 1;        }        break;    }    return rtn;}LRESULT CALLBACK LeftyWndProc (    HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam) {    Gwidget_t *widget;    WINDOWPOS *wpos;    Gevent_t gev;    widget = findwidget (hwnd, G_VIEWWIDGET);    switch (message) {    case WM_WINDOWPOSCHANGED:        if (Gnocallbacks || !widget)            return (DefWindowProc(hwnd, message, wparam, lparam));        wpos = (WINDOWPOS *) lparam;        if (!(wpos->flags & SWP_NOSIZE))            handleresize (widget);        break;    case WM_COMMAND:        if (Gnocallbacks || !widget)            return (DefWindowProc(hwnd, message, wparam, lparam));        processcommand (widget, wparam, lparam);        break;    case WM_CLOSE:        if (!widget)            exit (0);        if (WVU->closing)            DestroyWindow (hwnd);        if (Gnocallbacks)            exit (0);        gev.type = 0, gev.code = 0, gev.data = 0;        gev.wi = widget - &Gwidgets[0];        if (WVU->func)            (*WVU->func) (&gev);        else            exit (0);        break;    case WM_PALETTECHANGED:        palettechanged = (HWND) wparam;        break;    default:        return (DefWindowProc(hwnd, message, wparam, lparam));    }    return 0;}LRESULT CALLBACK ArrayWndProc (    HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam) {    Gwidget_t *widget;    WINDOWPOS *wpos;    if (Gnocallbacks || !(widget = findwidget (hwnd, G_ARRAYWIDGET)))        return (DefWindowProc(hwnd, message, wparam, lparam));    switch (message) {    case WM_WINDOWPOSCHANGED:        wpos = (WINDOWPOS *) lparam;        if (!(wpos->flags & SWP_NOSIZE))            handleresize (widget);        break;    case WM_COMMAND:        processcommand (widget, wparam, lparam);        break;    default:        return (DefWindowProc (hwnd, message, wparam, lparam));    }    return 0;}LRESULT CALLBACK CanvasWndProc (    HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam) {    Gwidget_t *widget;    WINDOWPOS *wpos;    PIXpoint_t pp;    Gevent_t gev;    POINT p;    int wi, bn;    static int cntlflag;    if (Gnocallbacks || !(widget = findwidget (hwnd, G_CANVASWIDGET)))        return (DefWindowProc(hwnd, message, wparam, lparam));    Gpopdownflag = FALSE;    switch (message) {    case WM_PAINT:        if (palettechanged != hwnd)            RealizePalette (widget->u.c->gc);        Gneedredraw = widget->u.c->needredraw = TRUE;        Gadjustclip (widget);        return (DefWindowProc(hwnd, message, wparam, lparam));    case WM_WINDOWPOSCHANGED:        wpos = (WINDOWPOS *) lparam;        if (!(wpos->flags & SWP_NOSIZE))            handleresize (widget);        return 0;    case WM_MOUSEACTIVATE:        SetFocus (widget->w);        return (DefWindowProc(hwnd, message, wparam, lparam));    case WM_COMMAND:        processcommand (widget, wparam, lparam);        return 0;    case WM_CHAR:        gev.type = G_KEYBD;        gev.code = G_DOWN;   /* I don't know how to get up events so I make */        Gpopdownflag = TRUE; /* the code after this switch send the up event */        gev.data = wparam;        GetCursorPos (&p);        ScreenToClient (widget->w, &p);        pp.x = p.x, pp.y = p.y;        gev.p = ppixtodraw (widget, pp);        /* continues after the end of this switch */        break;    case WM_LBUTTONDOWN:    case WM_LBUTTONUP:    case WM_MBUTTONDOWN:    case WM_MBUTTONUP:    case WM_RBUTTONDOWN:    case WM_RBUTTONUP:        gev.type = G_MOUSE;        if (twobmouse) {            if (message == WM_LBUTTONDOWN && (wparam & MK_CONTROL))                message = WM_MBUTTONDOWN, cntlflag = TRUE;            if (message == WM_LBUTTONUP && cntlflag)                message = WM_MBUTTONUP, cntlflag = FALSE;        }        switch (message) {        case WM_LBUTTONDOWN: gev.code = G_DOWN, gev.data = G_LEFT;   break;        case WM_LBUTTONUP:   gev.code = G_UP,   gev.data = G_LEFT;   break;        case WM_MBUTTONDOWN: gev.code = G_DOWN, gev.data = G_MIDDLE; break;        case WM_MBUTTONUP:   gev.code = G_UP,   gev.data = G_MIDDLE; break;        case WM_RBUTTONDOWN: gev.code = G_DOWN, gev.data = G_RIGHT;  break;        case WM_RBUTTONUP:   gev.code = G_UP,   gev.data = G_RIGHT;  break;        }        pp.x = LOWORD (lparam), pp.y = HIWORD (lparam);        gev.p = ppixtodraw (widget, pp);        bn = WCU->bstate[gev.data];

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -