From: ellson Date: Mon, 28 Feb 2005 18:38:37 +0000 (+0000) Subject: reconnect mouse bindings X-Git-Tag: LAST_LIBGRAPH~32^2~7858 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=d6dbc90bc590e67857a939c5652172bc3b974906;p=graphviz reconnect mouse bindings --- diff --git a/lib/gvc/gvcint.h b/lib/gvc/gvcint.h index 77740aad9..3a2ffb508 100644 --- a/lib/gvc/gvcint.h +++ b/lib/gvc/gvcint.h @@ -114,6 +114,7 @@ extern "C" { pointf compscale; /* composite device scale incl: scale, zoom, dpi, y_goes_down */ boolean fit_mode, needs_refresh, click, active, has_grown; + double oldx, oldy; /* old pointer position in pixels */ void *window; /* display-specific data for gvrender plugin */ }; @@ -129,6 +130,13 @@ extern "C" { gvplugin_type_t *typeptr; }; + typedef int (*gvevent_key_callback_t) (gvrender_job_t * job); + + typedef struct gvevent_key_binding_s { + char *keystring; + gvevent_key_callback_t callback; + } gvevent_key_binding_t; + #define MAXNEST 4 struct GVC_s { diff --git a/lib/gvc/gvevent.c b/lib/gvc/gvevent.c index 67d79c6fb..152abec03 100644 --- a/lib/gvc/gvevent.c +++ b/lib/gvc/gvevent.c @@ -32,89 +32,27 @@ #define ZOOMFACTOR 1.1 #define EPSILON .0001 -#define ARRAY_SIZE(A) (sizeof(A)/sizeof(A[0])) - -typedef int (*key_callback_t) (gvrender_job_t * job); - -typedef struct key_binding { - char *key; - key_callback_t callback; -} key_binding_t; - -/* callbacks */ -static int quit_cb(gvrender_job_t * job); -static int left_cb(gvrender_job_t * job); -static int right_cb(gvrender_job_t * job); -static int up_cb(gvrender_job_t * job); -static int down_cb(gvrender_job_t * job); -static int zoom_in_cb(gvrender_job_t * job); -static int zoom_out_cb(gvrender_job_t * job); -static int toggle_fit_cb(gvrender_job_t * job); - -static key_binding_t key_binding[] = { - {"Q", quit_cb}, - {"Left", left_cb}, - {"KP_Left", left_cb}, - {"Right", right_cb}, - {"KP_Right", right_cb}, - {"Up", up_cb}, - {"KP_Up", up_cb}, - {"Down", down_cb}, - {"KP_Down", down_cb}, - {"plus", zoom_in_cb}, - {"KP_Add", zoom_in_cb}, - {"minus", zoom_out_cb}, - {"KP_Subtract", zoom_out_cb}, - {"F", toggle_fit_cb}, -}; - void gvevent_refresh(gvrender_job_t * job) { emit_graph(job->gvc, job->g); } -#if 0 - -void gvevent_grow_pixmap(gvrender_job_t * job) +void gvevent_button_press(gvrender_job_t * job, int button, double x, double y) { - - Pixmap new; -#if 0 - cairo_surface_t *surface; -#endif - - new = XCreatePixmap(job->dpy, job->win, job->width, job->height, - job->depth); - XFillRectangle(job->dpy, new, job->gc, 0, 0, - job->width, job->height); - XCopyArea(job->dpy, job->pix, new, job->gc, 0, 0, - job->width, job->height, 0, 0); - XFreePixmap(job->dpy, job->pix); - job->pix = new; -#if 0 - surface = cairo_xlib_surface_create(job->dpy, job->pix, job->visual, - CAIRO_FORMAT_ARGB32, job->cmap); - cairo_set_target_surface(job->surface, surface); - cairo_surface_destroy(surface); -#endif -} - -void gvevent_button_press(gvrender_job_t * job, XButtonEvent *bev) -{ - switch (bev->button) { + switch (button) { case 1: /* select / create in edit mode */ case 2: /* pan */ case 3: /* / delete in edit mode */ job->click = 1; - job->active = bev->button; + job->active = button; job->needs_refresh = 1; break; case 4: /* scrollwheel zoom in at current mouse x,y */ job->fit_mode = 0; - job->focus.x += (bev->x - job->width / 2.) + job->focus.x += (x - job->width / 2.) * (ZOOMFACTOR - 1.) / job->zoom; - job->focus.y += -(bev->y - job->height / 2.) + job->focus.y += -(y - job->height / 2.) * (ZOOMFACTOR - 1.) / job->zoom; job->zoom *= ZOOMFACTOR; job->needs_refresh = 1; @@ -122,21 +60,21 @@ void gvevent_button_press(gvrender_job_t * job, XButtonEvent *bev) case 5: /* scrollwheel zoom out at current mouse x,y */ job->fit_mode = 0; job->zoom /= ZOOMFACTOR; - job->focus.x -= (bev->x - job->width / 2.) + job->focus.x -= (x - job->width / 2.) * (ZOOMFACTOR - 1.) / job->zoom; - job->focus.y -= -(bev->y - job->height / 2.) + job->focus.y -= -(y - job->height / 2.) * (ZOOMFACTOR - 1.) / job->zoom; job->needs_refresh = 1; break; } - job->oldx = bev->x; - job->oldy = bev->y; + job->oldx = x; + job->oldy = y; } -void gvevent_motion(gvrender_job_t * job, XMotionEvent *mev) +void gvevent_motion(gvrender_job_t * job, double x, double y) { - double dx = mev->x - job->oldx; - double dy = mev->y - job->oldy; + double dx = x - job->oldx; + double dy = y - job->oldy; if (abs(dx) < EPSILON && abs(dy) < EPSILON) /* ignore motion events with no motion */ return; @@ -156,78 +94,16 @@ void gvevent_motion(gvrender_job_t * job, XMotionEvent *mev) case 3: /* drag with button 3 - unused */ break; } - job->oldx = mev->x; - job->oldy = mev->y; + job->oldx = x; + job->oldy = y; } -void gvevent_button_release(gvrender_job_t *job, XButtonEvent *bev) +void gvevent_button_release(gvrender_job_t *job, int button, double x, double y) { job->click = 0; job->active = 0; } -int gvevent_key_press(gvrender_job_t * job, XKeyEvent * kev) -{ -#if 0 - unsigned int i; - - for (i = 0; i < ARRAY_SIZE(key_binding); i++) - if (key_binding[i].keycode == kev->keycode) - return (key_binding[i].callback) (job); -#endif - return 0; -} - -static void gvevent_reconfigure_normal(gvrender_job_t * job, unsigned int width, - unsigned int height) -{ - int has_grown = 0; - - if (width > job->width || height > job->height) - has_grown = 1; - job->width = width; - job->height = height; - if (has_grown) - gvevent_grow_pixmap(job); - job->needs_refresh = 1; -} - -static void gvevent_reconfigure_fit_mode(gvrender_job_t * job, unsigned int width, - unsigned int height) -{ - int dflt_width, dflt_height; - - dflt_width = job->width; - dflt_height = job->height; - job->zoom = - MIN((double) width / (double) dflt_width, - (double) height / (double) dflt_height); - - gvevent_reconfigure_normal(job, width, height); -} - -void gvevent_configure(gvrender_job_t * job, XConfigureEvent * cev) -{ - if (job->fit_mode) - gvevent_reconfigure_fit_mode(job, cev->width, cev->height); - else - gvevent_reconfigure_normal(job, cev->width, cev->height); -} - -void gvevent_expose(gvrender_job_t * job, XExposeEvent * eev) -{ - XCopyArea(job->dpy, job->pix, job->win, job->gc, - eev->x, eev->y, eev->width, eev->height, eev->x, eev->y); -} - -void gvevent_client_message(gvrender_job_t * job, XClientMessageEvent * cmev) -{ - if (cmev->format == 32 - && (Atom) cmev->data.l[0] == job->wm_delete_window_atom) - exit(0); -} -#endif - static int quit_cb(gvrender_job_t * job) { return 1; @@ -297,3 +173,20 @@ static int toggle_fit_cb(gvrender_job_t * job) } return 0; } + +gvevent_key_binding_t gvevent_key_binding[] = { + {"Q", quit_cb}, + {"Left", left_cb}, + {"KP_Left", left_cb}, + {"Right", right_cb}, + {"KP_Right", right_cb}, + {"Up", up_cb}, + {"KP_Up", up_cb}, + {"Down", down_cb}, + {"KP_Down", down_cb}, + {"plus", zoom_in_cb}, + {"KP_Add", zoom_in_cb}, + {"minus", zoom_out_cb}, + {"KP_Subtract", zoom_out_cb}, + {"F", toggle_fit_cb}, +}; diff --git a/lib/gvc/gvplugin_render.h b/lib/gvc/gvplugin_render.h index 4d22e3f9f..0ac9cfcdb 100644 --- a/lib/gvc/gvplugin_render.h +++ b/lib/gvc/gvplugin_render.h @@ -64,6 +64,9 @@ extern "C" { /* callbacks */ extern void gvevent_refresh(gvrender_job_t * job); + extern void gvevent_button_press(gvrender_job_t * job, int button, double x, double y); + extern void gvevent_button_release(gvrender_job_t * job, int button, double x, double y); + extern void gvevent_motion(gvrender_job_t * job, double x, double y); #ifdef __cplusplus }