📄 gcommon.c
字号:
/* $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 + -