/* when a mouse button is clicked this function is called params:gtk opgn gl canvas , GdkEventButton object and custom data return value:true or false, fails (false) if cannot init gl */ static gboolean button_press_event(GtkWidget * widget, GdkEventButton * event, gpointer data) { if (view->graphCount) { if (glCompSetClick (view->Topview->topviewmenu, (int) event->x, (int) event->y)) expose_event(view->drawing_area, NULL, NULL); } begin_x = (float) event->x; begin_y = (float) event->y; if (event->button == 3) //right click view->mouse.button = rightmousebutton; if (event->button == 1) //left click { view->prevpanx = view->panx; view->prevpany = view->pany; view->mouse.mouse_down = 1; view->mouse.button = leftmousebutton; if (GetOGLPosRef ((int) begin_x, (int) begin_y, &(view->GLx), &(view->GLy), &(view->GLz))) { if (view->mouse.mouse_mode == MM_SINGLE_SELECT) //single select { view->Selection.Active = 1; view->Selection.Type = 0; view->Selection.AlreadySelected = 0; view->Selection.X = view->GLx - SINGLE_SELECTION_WIDTH / 2; view->Selection.Y = view->GLy - SINGLE_SELECTION_WIDTH / 2; view->Selection.W = SINGLE_SELECTION_WIDTH; view->Selection.H = SINGLE_SELECTION_WIDTH; expose_event(view->drawing_area, NULL, NULL); } } } return FALSE; }
int key_hook(int keycode, t_env *e) { double diviseur; diviseur = e->zoom / 100; if (keycode == 53) exit(0); else if (keycode == KEY_LEFT || keycode == KEY_RIGHT || keycode == KEY_DOWN || keycode == KEY_UP) direction_keys(keycode, e, diviseur); else if (keycode == KEY_Q || keycode == KEY_W) zoom_keys(keycode, e, diviseur); else if (keycode == KEY_E) { e->fractal_y[0] = e->fractal_y[0] - 0.1; e->fractal_y[1] = e->fractal_y[1] - 0.1; } else if (keycode == KEY_C) switch_key(e); else if (keycode == KEY_P) e->motion_enabled ^= 1; expose_event(e); return (0); }
static void * x_thread_main (void *closure) { x_global_t *xg = closure; XEvent event; struct pollfd fds[2]; int timeout; sigset_t mask; sigemptyset (&mask); sigaddset (&mask, SIGALRM); sigaddset (&mask, SIGIO); sigaddset (&mask, SIGCHLD); sigaddset (&mask, SIGINT); pthread_sigmask (SIG_BLOCK, &mask, NULL); fds[0].fd = ConnectionNumber (xg->dpy); fds[0].events = POLLIN; fds[1].fd = xg->pipe[0]; fds[1].events = POLLIN; while (xg->running) { while (XPending (xg->dpy)) { XNextEvent (xg->dpy, &event); switch (event.type) { case ConfigureNotify: configure_event (xg, &event.xconfigure); break; case Expose: expose_event (xg, &event.xexpose); break; case MotionNotify: motion_notify_event (xg, &event.xmotion); break; case ButtonPress: case ButtonRelease: button_event (xg, &event.xbutton); break; case KeyPress: case KeyRelease: key_event (xg, &event.xkey); break; case ClientMessage: client_message_event (xg, &event.xclient); break; case FocusIn: case FocusOut: focus_change_event (xg, &event.xfocus); break; } } timeout = -1; while (xg->repaint) { int when = now (); timeout = xg->repaint->when - when; if (timeout > 0) break; timeout = -1; repaint_timeout (xg, when); } poll (fds, 2, timeout); if (fds[1].revents & POLLIN) { char stuffed[128]; read (fds[1].fd, stuffed, sizeof (stuffed)); } } close (xg->pipe[0]); close (xg->pipe[1]); XCloseDisplay (xg->dpy); free (xg); return 0; }
/* when a mouse button is released(always after click) this function is called params:gtk opgn gl canvas , GdkEventButton object and custom data return value:true or false, fails (false) if cannot init gl */ static gboolean button_release_event(GtkWidget * widget, GdkEventButton * event, gpointer data) { if (event->button == 1) //left click release { if (glCompSetRelease (view->Topview->topviewmenu, (int) event->x_root, (int) event->y_root)) { expose_event(view->drawing_area, NULL, NULL); } view->mouse.mouse_down = 0; if ((view->mouse.mouse_mode == MM_RECTANGULAR_SELECT) || (view->mouse.mouse_mode == MM_RECTANGULAR_X_SELECT)) { if (view->GLx <= view->GLx2) view->Selection.X = view->GLx; else view->Selection.X = view->GLx2; if (view->GLy <= view->GLy2) view->Selection.Y = view->GLy; else view->Selection.Y = view->GLy2; view->Selection.W = view->GLx2 - view->GLx; if (view->Selection.W < 0) view->Selection.W = view->Selection.W * -1; view->Selection.H = view->GLy2 - view->GLy; if (view->Selection.H < 0) view->Selection.H = view->Selection.H * -1; if (view->mouse.mouse_mode == 4) view->Selection.Type = 1; else view->Selection.Type = 2; view->Selection.Active = 1; expose_event(view->drawing_area, NULL, NULL); } if (view->mouse.mouse_mode == MM_MOVE) { if (GD_TopView(view->g[view->activeGraph]) == 0) move_nodes(view->g[view->activeGraph]); else move_TVnodes(); } if ((view->mouse.mouse_mode == MM_FISHEYE_MAGNIFIER) || (view->mouse.mouse_mode == MM_MAGNIFIER)) //fisheye mag mouse release, stop distortion { originate_distorded_coordinates(view->Topview); expose_event(view->drawing_area, NULL, NULL); } if (view->mouse.mouse_mode==MM_PAN) { view->mouse.pick=1; expose_event(view->drawing_area, NULL, NULL); } } if (event->button == 3) //right click { if (view->Topview->is_top_fisheye) { GetFixedOGLPoslocal((int) event->x, (int) event->y, view->GLDepth, &(view->GLx2), &(view->GLy2), &(view->GLz2)); changetopfishfocus(view->Topview, &view->GLx2, &view->GLy2, 0, 1); expose_event(view->drawing_area, NULL, NULL); } } dx = 0.0; dy = 0.0; return FALSE; }