123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194 |
- /*************************************************************************
- * Copyright (c) 2011 AT&T Intellectual Property
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * https://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors: Details at https://graphviz.org
- *************************************************************************/
- #include "hotkeymap.h"
- #include <stdint.h>
- #include <util/alloc.h>
- static int get_mouse_mode(const char *s)
- {
- if (strcmp(s, "MM_PAN") == 0)
- return MM_PAN;
- if (strcmp(s, "MM_ZOOM") == 0)
- return MM_ZOOM;
- if (strcmp(s, "MM_ROTATE") == 0)
- return MM_ROTATE;
- if (strcmp(s, "MM_SINGLE_SELECT") == 0)
- return MM_SINGLE_SELECT;
- if (strcmp(s, "MM_RECTANGULAR_SELECT") == 0)
- return MM_RECTANGULAR_SELECT;
- if (strcmp(s, "MM_RECTANGULAR_X_SELECT") == 0)
- return MM_RECTANGULAR_X_SELECT;
- if (strcmp(s, "MM_POLYGON_SELECT") == 0)
- return MM_POLYGON_SELECT;
- if (strcmp(s, "MM_MOVE") == 0)
- return MM_MOVE;
- if (strcmp(s, "MM_MOVE") == 0)
- return MM_MOVE;
- if (strcmp(s, "MM_MAGNIFIER") == 0)
- return MM_MAGNIFIER;
- if (strcmp(s, "MM_FISHEYE_MAGNIFIER") == 0)
- return MM_FISHEYE_MAGNIFIER;
- if (strcmp(s, "MM_FISHEYE_PICK") == 0)
- return MM_FISHEYE_PICK;
- return -1;
- }
- static int get_button(const char *s)
- {
- if(view->guiMode != GUI_FULLSCREEN)
- {
- if (strcmp(s, "B_LSHIFT") == 0)
- return B_LSHIFT;
- if (strcmp(s, "B_RSHIFT") == 0)
- return B_RSHIFT;
- if (strcmp(s, "B_LCTRL") == 0)
- return B_LCTRL;
- if (strcmp(s, "B_RCTRL") == 0)
- return B_RCTRL;
- if (strcmp(s, "0") == 0)
- return 0;
- }
- else
- {
- int mod = glutGetModifiers();
- if (mod == GLUT_ACTIVE_ALT)
- if (strcmp(s, "B_LSHIFT") == 0)
- return GLUT_ACTIVE_SHIFT;
- if (strcmp(s, "B_RSHIFT") == 0)
- return GLUT_ACTIVE_SHIFT;
- if (strcmp(s, "B_LCTRL") == 0)
- return GLUT_ACTIVE_CTRL;
- if (strcmp(s, "B_RCTRL") == 0)
- return GLUT_ACTIVE_CTRL;
- if (strcmp(s, "0") == 0)
- return 0;
- }
- return 0;
- }
- static int get_view_mode(const char *s)
- {
- if (strcmp(s, "ALL") == 0)
- return smyrna_all;
- if (strcmp(s, "2D") == 0)
- return smyrna_2D;
- if (strcmp(s, "3D") == 0)
- return smyrna_3D;
- if (strcmp(s, "FISHEYE") == 0)
- return smyrna_fisheye;
- if (strcmp(s, "NO_FISHEYE") == 0)
- return smyrna_all_but_fisheye;
- return -1;
- }
- static int get_mouse_button(const char *s)
- {
- if (strcmp(s, "LEFT") == 0)
- return glMouseLeftButton;
- if (strcmp(s, "RIGHT") == 0)
- return glMouseRightButton;
- if (strcmp(s, "MIDDLE") == 0)
- return glMouseMiddleButton;
- return -1;
- }
- static int get_drag(const char *s)
- {
- if (s[0] == '1')
- return 1;
- return 0;
- }
- void load_mouse_actions(ViewInfo * v)
- {
- // file parsing is temporarily not available
- int i = 0;
- FILE *file;
- char linebuf[BUFSIZ];
- char *a;
- char *action_file = smyrnaPath("mouse_actions.txt");
- file = fopen(action_file, "r");
- if (file != NULL) {
- int ind = 0;
- while (fgets(linebuf, BUFSIZ, file) != NULL) {
- int idx = 0;
- a = strtok(linebuf, ",");
- if (linebuf[0] == '#' || linebuf[0] == ' ' || strlen(linebuf) == 0)
- continue;
- v->mouse_actions = gv_recalloc(v->mouse_actions, v->mouse_action_count,
- v->mouse_action_count + 1,
- sizeof(mouse_action_t));
- v->mouse_action_count++;
- v->mouse_actions[ind].action = get_mouse_mode(a);
- v->mouse_actions[ind].index = i;
- while ((a = strtok(NULL, ","))) {
- //#Action(0),hotkey(1),view_mode(2),mouse_button(3),drag(4)
- switch (idx) {
- case 0:
- v->mouse_actions[ind].hotkey = get_button(a);
- break;
- case 1:
- v->mouse_actions[ind].mode = get_view_mode(a);
- break;
- case 2:
- v->mouse_actions[ind].type = get_mouse_button(a);
- break;
- case 3:
- v->mouse_actions[ind].drag = get_drag(a);
- break;
- }
- idx++;
- }
- ind++;
- }
- fclose(file);
- }
- free(action_file);
- }
- int get_mode(ViewInfo * v)
- {
- glMouseButtonType curMouseType = v->mouse.t;
- int curDragging = v->mouse.dragX != 0 || v->mouse.dragY != 0;
- smyrna_view_mode view_mode;
- view_mode = smyrna_2D;
- if (v->active_camera != SIZE_MAX)
- view_mode = smyrna_3D;
- if (v->Topview->fisheyeParams.active)
- view_mode = smyrna_fisheye;
- for (size_t ind = 0; ind < v->mouse_action_count; ind++) {
- if (v->mouse_actions[ind].hotkey == v->keyVal
- && v->mouse_actions[ind].type == curMouseType
- && v->mouse_actions[ind].drag == curDragging
- &&
- (v->mouse_actions[ind].mode == view_mode
- || v->mouse_actions[ind].mode == smyrna_all
- || (v->mouse_actions[ind].mode == smyrna_all_but_fisheye
- && view_mode != smyrna_fisheye)
- )) {
- return v->mouse_actions[ind].action;
- }
- }
- return -1;
- }
|