~ubuntu-branches/ubuntu/hardy/xcircuit/hardy

« back to all changes in this revision

Viewing changes to keybindings.c

  • Committer: Bazaar Package Importer
  • Author(s): Aanjhan Ranganathan
  • Date: 2006-04-18 23:51:39 UTC
  • mfrom: (1.1.2 upstream)
  • Revision ID: james.westby@ubuntu.com-20060418235139-s49pkhwdzxvsxm5k
Tags: 3.4.21-0ubuntu1
New upstream release

Show diffs side-by-side

added added

removed removed

Lines of Context:
13
13
#include <ctype.h>       /* for tolower(), toupper() */
14
14
#include <math.h>
15
15
 
 
16
#ifndef XC_WIN32
16
17
#include <X11/Intrinsic.h>
17
18
#include <X11/StringDefs.h>
 
19
#endif
 
20
 
 
21
#if !defined(XC_WIN32) || defined(TCL_WRAPPER)
18
22
#define  XK_MISCELLANY
19
23
#define  XK_LATIN1
20
24
#define  XK_XKB_KEYS
21
25
#include <X11/keysymdef.h>
 
26
#endif
22
27
 
23
28
/*----------------------------------------------------------------------*/
24
29
/* Local includes                                                       */
44
49
 
45
50
extern Display *dpy;
46
51
extern char  _STR[150], _STR2[250];
47
 
extern short help_up;
 
52
extern short eventmode;
 
53
extern Boolean pressmode;
48
54
 
49
55
/*--------------------------------------------------------------*/
50
56
/* Key modifiers (convenience definitions)                      */
 
57
/* Use Mod2Mask for a "hold" ("press") definition.              */
51
58
/*--------------------------------------------------------------*/
52
59
 
53
60
#define ALT (Mod1Mask << 16)
57
64
#define BUTTON1 (Button1Mask << 16)
58
65
#define BUTTON2 (Button2Mask << 16)
59
66
#define BUTTON3 (Button3Mask << 16)
 
67
#define BUTTON4 (Button4Mask << 16)
 
68
#define BUTTON5 (Button5Mask << 16)
 
69
#define HOLD (Mod2Mask << 16)
60
70
 
61
71
/*--------------------------------------------------------------*/
62
72
/* This list declares all the functions which can be bound to   */
64
74
/* xcircuit.h!                                                  */
65
75
/*--------------------------------------------------------------*/
66
76
 
67
 
static char *function_names[NUM_FUNCTIONS] = {
 
77
static char *function_names[NUM_FUNCTIONS + 1] = {
68
78
   "Page", "Justify", "Superscript", "Subscript", "Normalscript",
69
79
   "Nextfont", "Boldfont", "Italicfont", "Normalfont", "Underline",
70
 
   "Overline", "ISO Encoding", "Return", "Halfspace", "Quarterspace",
 
80
   "Overline", "ISO Encoding", "Halfspace", "Quarterspace",
71
81
   "Special", "Tab Stop", "Tab Forward", "Tab Backward",
72
82
   "Text Return", "Text Delete", "Text Right", "Text Left",
73
83
   "Text Up", "Text Down", "Text Split", 
74
 
   "Text Home", "Text End", "Return Char", "Parameter",
 
84
   "Text Home", "Text End", "Linebreak", "Parameter",
75
85
   "Parameterize Point", "Break at Point", "Delete Point", "Insert Point",
76
 
   "Next Point", "Attach", "Next Library", "Library Directory",
 
86
   "Append Point", "Next Point", "Attach", "Next Library", "Library Directory",
77
87
   "Library Move", "Library Copy", "Library Edit", "Library Delete",
78
88
   "Library Duplicate", "Library Hide", "Library Virtual Copy",
79
 
   "Page Directory ", "Library Pop",
 
89
   "Page Directory", "Library Pop", "Virtual Copy",
80
90
   "Help", "Redraw", "View", "Zoom In", "Zoom Out", "Pan",
81
 
   "Double Snap", "Halve Snap", "Pan Left", "Pan Right", "Pan Up",
82
 
   "Pan Down", "Write", "Rotate", "Flip X", "Flip Y", "Snap", "Snap To",
 
91
   "Double Snap", "Halve Snap", "Write", "Rotate", "Flip X",
 
92
   "Flip Y", "Snap", "Snap To",
83
93
   "Pop", "Push", "Delete", "Select", "Box", "Arc", "Text",
84
 
   "Exchange", "Copy", "Join", "Unjoin", "Spline", "Edit",
85
 
   "Undelete", "Select Save", "Unselect", "Dashed", "Dotted",
86
 
   "Solid", "Prompt", "Dot", "Wire", "Start", "Finish", "Cancel",
87
 
   "Nothing", "Exit",
88
 
 
89
 
#ifdef SCHEMA
90
 
   "Netlist", "Swap", "Pin Label", "Pin Global", "Info Label",
91
 
   "Connectivity", "Sim", "SPICE", "PCB", "SPICE Flat",
92
 
#endif
93
 
 
 
94
   "Exchange", "Copy", "Move", "Join", "Unjoin", "Spline", "Edit",
 
95
   "Undo", "Redo", "Select Save", "Unselect", "Dashed", "Dotted",
 
96
   "Solid", "Prompt", "Dot", "Wire", "Cancel", "Nothing", "Exit",
 
97
   "Netlist", "Swap", "Pin Label", "Pin Global", "Info Label", "Graphic",
 
98
   "Rescale", "Select Box", "Connectivity", "Continue Copy",
 
99
   "Continue Element", "Finish Copy", "Finish Element", "Finish",
 
100
   "Cancel Segment", "Sim", "SPICE", "PCB", "SPICE Flat", "Text Delete Param",
94
101
   NULL                 /* sentinel */
95
102
};
96
103
 
126
133
}
127
134
 
128
135
/*--------------------------------------------------------------*/
 
136
/* Return the nth function bound to the indicated keywstate.    */
 
137
/* Return -1 if no function is bound.                           */
 
138
/*--------------------------------------------------------------*/
 
139
 
 
140
int boundfunction(int keywstate, int n)
 
141
{
 
142
   int j;
 
143
   keybinding *ksearch;
 
144
 
 
145
   j = 0;
 
146
   for (ksearch = keylist; ksearch != NULL; ksearch = ksearch->nextbinding)
 
147
      if (keywstate == ksearch->keywstate)
 
148
         if (j++ == n)
 
149
            return ksearch->function;
 
150
 
 
151
   return -1;
 
152
}
 
153
 
 
154
/*--------------------------------------------------------------*/
129
155
/* Return TRUE if the indicated key (keysym + bit-shifted state)*/
130
156
/* is bound to the indicated function (called by name)          */
131
157
/*--------------------------------------------------------------*/
237
263
         keywstate |= ALT;
238
264
         kptr += 5;
239
265
      }
 
266
      else if (!strncmp(kptr, "Hold_", 5)) {
 
267
         keywstate |= HOLD;
 
268
         kptr += 5;
 
269
      }
240
270
      else if (*kptr == '^') {
241
271
         kptr++;
242
272
         ct = (int)tolower(*kptr);
256
286
               case '1': keywstate = (Button1Mask << 16); break;
257
287
               case '2': keywstate = (Button2Mask << 16); break;
258
288
               case '3': keywstate = (Button3Mask << 16); break;
 
289
               case '4': keywstate = (Button4Mask << 16); break;
 
290
               case '5': keywstate = (Button5Mask << 16); break;
259
291
            }
260
292
         }
261
293
         else {
301
333
            tmpstr = function_names[ksearch->function];
302
334
         else
303
335
            tmpstr = key_to_string(ksearch->keywstate);
304
 
         retstr = (char *)realloc(retstr, strlen(retstr) + strlen(tmpstr) + 
 
336
         if (tmpstr != NULL) {
 
337
            retstr = (char *)realloc(retstr, strlen(retstr) + strlen(tmpstr) + 
305
338
                ((first) ? 1 : 3));
306
 
         if (!first) strcat(retstr, ", ");
307
 
         strcat(retstr, tmpstr);
308
 
         if (function >= 0) free(tmpstr);
 
339
            if (!first) strcat(retstr, ", ");
 
340
            strcat(retstr, tmpstr);
 
341
            if (function >= 0) free(tmpstr);
 
342
         }
309
343
         first = False;
310
344
      }
311
345
   }
327
361
   KeySym ks = keywstate & 0xffff;
328
362
   int kmod = keywstate >> 16;
329
363
 
 
364
#if defined(XC_WIN32) && defined(TCL_WRAPPER)
 
365
   if (ks != NoSymbol) str = XKeysymToString_TkW32(ks);
 
366
#else
330
367
   if (ks != NoSymbol) str = XKeysymToString(ks);
 
368
#endif
331
369
 
332
370
   kptr = (char *)malloc(32);
333
371
   kptr[0] = '\0';
334
372
   if (kmod & Mod1Mask) strcat(kptr, "Alt_");
 
373
   if (kmod & Mod2Mask) strcat(kptr, "Hold_");
335
374
   if (kmod & ControlMask) strcat(kptr, "Control_");
336
375
   if (kmod & LockMask) strcat(kptr, "Capslock_");
337
376
   if (kmod & ShiftMask) strcat(kptr, "Shift_");
338
377
 
339
378
   if (str != NULL) {
340
 
      kptr = (char *)realloc(kptr, strlen(str) + 32);
 
379
      /* 33 is length of all modifiers concatenated + 1 */
 
380
      kptr = (char *)realloc(kptr, strlen(str) + 33);
341
381
      strcat(kptr, str);
342
382
   }
343
383
   else {
345
385
      if (kmod & Button1Mask) strcat(kptr, "Button1");
346
386
      else if (kmod & Button2Mask) strcat(kptr, "Button2");
347
387
      else if (kmod & Button3Mask) strcat(kptr, "Button3");
 
388
      else if (kmod & Button4Mask) strcat(kptr, "Button4");
 
389
      else if (kmod & Button5Mask) strcat(kptr, "Button5");
348
390
      else {
349
391
         kptr[0] = '0';
350
392
         kptr[1] = 'x';
474
516
 
475
517
int add_binding(int keywstate, int function)
476
518
{
477
 
   return add_vbinding(keywstate, function, -1);
 
519
   return add_vbinding(keywstate, function, (short)-1);
478
520
}
479
521
 
480
522
/*--------------------------------------------------------------*/
512
554
   add_vbinding(XK_9, XCF_Page, 9);
513
555
   add_vbinding(XK_0, XCF_Page, 10);
514
556
 
515
 
   add_vbinding(SHIFT | XK_KP_1, XCF_Justify, 0);
516
 
   add_vbinding(SHIFT | XK_KP_2, XCF_Justify, 1);
517
 
   add_vbinding(SHIFT | XK_KP_3, XCF_Justify, 2);
518
 
   add_vbinding(SHIFT | XK_KP_4, XCF_Justify, 3);
519
 
   add_vbinding(SHIFT | XK_KP_5, XCF_Justify, 4);
520
 
   add_vbinding(SHIFT | XK_KP_6, XCF_Justify, 5);
521
 
   add_vbinding(SHIFT | XK_KP_7, XCF_Justify, 6);
522
 
   add_vbinding(SHIFT | XK_KP_8, XCF_Justify, 7);
523
 
   add_vbinding(SHIFT | XK_KP_9, XCF_Justify, 8);
 
557
   add_vbinding(XK_KP_1, XCF_Justify, 0);
 
558
   add_vbinding(XK_KP_2, XCF_Justify, 1);
 
559
   add_vbinding(XK_KP_3, XCF_Justify, 2);
 
560
   add_vbinding(XK_KP_4, XCF_Justify, 3);
 
561
   add_vbinding(XK_KP_5, XCF_Justify, 4);
 
562
   add_vbinding(XK_KP_6, XCF_Justify, 5);
 
563
   add_vbinding(XK_KP_7, XCF_Justify, 6);
 
564
   add_vbinding(XK_KP_8, XCF_Justify, 7);
 
565
   add_vbinding(XK_KP_9, XCF_Justify, 8);
524
566
 
525
567
   add_vbinding(XK_KP_End, XCF_Justify, 0);
526
568
   add_vbinding(XK_KP_Down, XCF_Justify, 1);
534
576
 
535
577
   add_binding(XK_Delete, XCF_Text_Delete);
536
578
   add_binding(XK_Return, XCF_Text_Return);
 
579
   add_binding(BUTTON1, XCF_Text_Return);
537
580
   add_binding(XK_BackSpace, XCF_Text_Delete);
538
581
   add_binding(XK_Left, XCF_Text_Left);
539
582
   add_binding(XK_Right, XCF_Text_Right);
558
601
   add_binding(ALT | XK_u, XCF_Underline);
559
602
   add_binding(ALT | XK_o, XCF_Overline);
560
603
   add_binding(ALT | XK_e, XCF_ISO_Encoding);
561
 
   add_binding(ALT | XK_Return, XCF_Return_Char);
 
604
   add_binding(ALT | XK_Return, XCF_Linebreak);
562
605
   add_binding(ALT | XK_h, XCF_Halfspace);
563
606
   add_binding(ALT | XK_q, XCF_Quarterspace);
564
607
   add_binding(XK_backslash, XCF_Special);
571
614
   add_binding(XK_i, XCF_Edit_Insert);
572
615
   add_binding(XK_Insert, XCF_Edit_Insert);
573
616
   add_binding(XK_e, XCF_Edit_Next);
 
617
   add_binding(BUTTON1, XCF_Edit_Next);
574
618
   add_binding(XK_A, XCF_Attach);
 
619
   add_binding(XK_V, XCF_Virtual);
575
620
   add_binding(XK_l, XCF_Next_Library);
576
621
   add_binding(XK_L, XCF_Library_Directory);
577
622
   add_binding(XK_c, XCF_Library_Copy);
583
628
   add_binding(XK_M, XCF_Library_Move);
584
629
   add_binding(XK_P, XCF_Page_Directory);
585
630
   add_binding(XK_less, XCF_Library_Pop);
 
631
   add_binding(HOLD | BUTTON1, XCF_Library_Pop);
586
632
   add_binding(XK_h, XCF_Help);
587
633
   add_binding(XK_question, XCF_Help);
588
634
   add_binding(XK_space, XCF_Redraw);
592
638
   add_binding(XK_v, XCF_View);
593
639
   add_binding(XK_Z, XCF_Zoom_In);
594
640
   add_binding(XK_z, XCF_Zoom_Out);
595
 
   add_binding(XK_p, XCF_Pan);
 
641
   add_vbinding(XK_p, XCF_Pan, 0);
596
642
   add_binding(XK_plus, XCF_Double_Snap);
597
643
   add_binding(XK_minus, XCF_Halve_Snap);
598
 
   add_binding(XK_Left, XCF_Pan_Left);
599
 
   add_binding(XK_Right, XCF_Pan_Right);
600
 
   add_binding(XK_Up, XCF_Pan_Up);
601
 
   add_binding(XK_Down, XCF_Pan_Down);
 
644
   add_vbinding(XK_Left, XCF_Pan, 1);
 
645
   add_vbinding(XK_Right, XCF_Pan, 2);
 
646
   add_vbinding(XK_Up, XCF_Pan, 3);
 
647
   add_vbinding(XK_Down, XCF_Pan, 4);
602
648
   add_binding(XK_W, XCF_Write);
603
649
   add_vbinding(XK_O, XCF_Rotate, -5);
604
650
   add_vbinding(XK_o, XCF_Rotate, 5);
612
658
   add_binding(XK_Delete, XCF_Delete);
613
659
   add_binding(XK_d, XCF_Delete);
614
660
   add_binding(XK_F19, XCF_Select);
615
 
   add_binding(BUTTON2, XCF_Select);
616
661
   add_binding(XK_b, XCF_Box);
617
662
   add_binding(XK_a, XCF_Arc);
618
663
   add_binding(XK_t, XCF_Text);
622
667
   add_binding(XK_J, XCF_Unjoin);
623
668
   add_binding(XK_s, XCF_Spline);
624
669
   add_binding(XK_e, XCF_Edit);
625
 
   add_binding(XK_u, XCF_Undelete);
 
670
   add_binding(XK_u, XCF_Undo);
 
671
   add_binding(XK_U, XCF_Redo);
626
672
   add_binding(XK_M, XCF_Select_Save);
627
673
   add_binding(XK_m, XCF_Select_Save);
628
674
   add_binding(XK_x, XCF_Unselect);
633
679
   add_binding(XK_period, XCF_Dot);
634
680
   add_binding(BUTTON1, XCF_Wire);
635
681
   add_binding(XK_w, XCF_Wire);
636
 
   add_binding(BUTTON3, XCF_Nothing);
637
682
   add_binding(CTRL | ALT | XK_q, XCF_Exit);
638
 
   add_binding(BUTTON1, XCF_Start);
639
 
   add_binding(SHIFT | BUTTON1, XCF_Finish);
640
 
   add_binding(BUTTON2, XCF_Finish);
641
 
   add_binding(BUTTON3, XCF_Cancel);
 
683
   add_binding(HOLD | BUTTON1, XCF_Move);
 
684
   add_binding(BUTTON1, XCF_Continue_Element);
 
685
   add_binding(BUTTON1, XCF_Continue_Copy);
 
686
   add_binding(BUTTON1, XCF_Finish);
 
687
   add_binding(XK_Escape, XCF_Cancel);
 
688
   add_binding(ALT | XK_r, XCF_Rescale);
642
689
   add_binding(ALT | XK_s, XCF_SnapTo);
643
 
 
644
 
#ifdef SCHEMA
645
690
   add_binding(ALT | XK_q, XCF_Netlist);
646
691
   add_binding(XK_slash, XCF_Swap);
647
692
   add_binding(XK_T, XCF_Pin_Label);
648
693
   add_binding(XK_G, XCF_Pin_Global);
649
694
   add_binding(XK_I, XCF_Info_Label);
650
695
   add_binding(ALT | XK_w, XCF_Connectivity);
651
 
   add_binding(ALT | XK_d, XCF_Sim);
652
 
   add_binding(ALT | XK_a, XCF_SPICE);
653
 
   add_binding(ALT | XK_f, XCF_SPICEflat);
654
 
   add_binding(ALT | XK_p, XCF_PCB);
655
 
#endif
656
 
 
657
 
}
 
696
 
 
697
/* These are for test purposes only.  Menu selection is */
 
698
/* preferred.                                           */
 
699
 
 
700
/* add_binding(ALT | XK_d, XCF_Sim);            */
 
701
/* add_binding(ALT | XK_a, XCF_SPICE);          */
 
702
/* add_binding(ALT | XK_f, XCF_SPICEflat);      */
 
703
/* add_binding(ALT | XK_p, XCF_PCB);            */
 
704
 
 
705
   /* 2-button vs. 3-button mouse bindings (set with -2 */
 
706
   /* commandline option; 3-button bindings default)    */
 
707
 
 
708
   if (pressmode) {
 
709
      add_binding(BUTTON3, XCF_Text_Return);
 
710
      add_binding(BUTTON3, XCF_Select);
 
711
      add_binding(HOLD | BUTTON3, XCF_SelectBox);
 
712
      add_binding(BUTTON3, XCF_Finish_Element);
 
713
      add_binding(BUTTON3, XCF_Finish_Copy);
 
714
 
 
715
      add_binding(XK_BackSpace, XCF_Cancel_Last);
 
716
      add_binding(XK_BackSpace, XCF_Cancel);
 
717
   }
 
718
   else {
 
719
      add_binding(BUTTON2, XCF_Text_Return);
 
720
      add_binding(SHIFT | BUTTON1, XCF_Text_Return);
 
721
      add_binding(BUTTON2, XCF_Select);
 
722
      add_binding(SHIFT | BUTTON1, XCF_Select);
 
723
      add_binding(HOLD | BUTTON2, XCF_SelectBox);
 
724
      add_binding(SHIFT | HOLD | BUTTON1, XCF_SelectBox);
 
725
      add_binding(BUTTON2, XCF_Finish_Element);
 
726
      add_binding(SHIFT | BUTTON1, XCF_Finish_Element);
 
727
      add_binding(BUTTON2, XCF_Finish_Copy);
 
728
      add_binding(SHIFT | BUTTON1, XCF_Finish_Copy);
 
729
      add_binding(BUTTON3, XCF_Cancel_Last);
 
730
      add_binding(BUTTON3, XCF_Cancel);
 
731
   }
 
732
}
 
733
 
 
734
#ifndef TCL_WRAPPER
 
735
/*----------------------------------------------*/
 
736
/* Mode-setting rebindings (non-Tcl version)    */
 
737
/*----------------------------------------------*/
 
738
 
 
739
static int button1mode = XCF_Wire;
 
740
 
 
741
/*--------------------------------------------------------------*/
 
742
/* Re-bind BUTTON1 to the indicated function and optional value */
 
743
/*--------------------------------------------------------------*/
 
744
 
 
745
void mode_rebinding(int newmode, int newvalue)
 
746
{
 
747
   remove_binding(BUTTON1, button1mode);
 
748
   add_vbinding(BUTTON1, newmode, (short)newvalue);
 
749
   button1mode = newmode;
 
750
   toolcursor(newmode);
 
751
}
 
752
 
 
753
/*--------------------------------------------------------------*/
 
754
/* Execute the function associated with the indicated BUTTON1   */
 
755
/* mode, but return the keybinding to its previous state.       */
 
756
/*--------------------------------------------------------------*/
 
757
 
 
758
void mode_tempbinding(int newmode, int newvalue)
 
759
{
 
760
   short saveval;
 
761
   XPoint cpos;
 
762
 
 
763
   if (isnbound(BUTTON1, button1mode, &saveval)) {
 
764
      remove_binding(BUTTON1, button1mode);
 
765
      add_vbinding(BUTTON1, newmode, (short)newvalue);
 
766
      cpos = UGetCursor();
 
767
      eventdispatch(BUTTON1, (int)cpos.x, (int)cpos.y);
 
768
      remove_binding(BUTTON1, newmode);
 
769
      add_vbinding(BUTTON1, button1mode, saveval);
 
770
   }
 
771
   else
 
772
      fprintf(stderr, "Error: No such button1 binding %s\n",
 
773
                func_to_string(button1mode));
 
774
}
 
775
 
 
776
#endif /* TCL_WRAPPER */
658
777
 
659
778
#undef ALT
660
779
#undef CTRL