annotate src/gui_beos.cc @ 42:c75153d791d0

updated for version 7.0026
author vimboss
date Wed, 29 Dec 2004 20:58:21 +0000
parents fdf55076c53f
children af1bcb9a13c0
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1 /* vi:set ts=8 sts=4 sw=4:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3 * VIM - Vi IMproved by Bram Moolenaar
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4 * BeBox GUI support Copyright 1998 by Olaf Seibert.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5 * All Rights Reserved.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7 * Do ":help uganda" in Vim to read copying and usage conditions.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8 * Do ":help credits" in Vim to see a list of people who contributed.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10 * BeOS GUI.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
11 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
12 * GUI support for the Buzzword Enhanced Operating System.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
13 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
14 * Ported to R4 by Richard Offer <richard@whitequeen.com> Jul 99
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
15 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
16 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
17
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
18 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
19 * Structure of the BeOS GUI code:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
20 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
21 * There are 3 threads.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
22 * 1. The initial thread. In gui_mch_prepare() this gets to run the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
23 * BApplication message loop. But before it starts doing that,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
24 * it creates thread 2:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
25 * 2. The main() thread. This thread is created in gui_mch_prepare()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
26 * and its purpose in life is to call main(argc, argv) again.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
27 * This thread is doing the bulk of the work.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
28 * 3. Sooner or later, a window is opened by the main() thread. This
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
29 * causes a second message loop to be created: the window thread.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
30 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
31 * == alternatively ===
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
32 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
33 * #if RUN_BAPPLICATION_IN_NEW_THREAD...
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
34 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
35 * 1. The initial thread. In gui_mch_prepare() this gets to spawn
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
36 * thread 2. After doing that, it returns to main() to do the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
37 * bulk of the work, being the main() thread.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
38 * 2. Runs the BApplication.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
39 * 3. The window thread, just like in the first case.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
40 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
41 * This second alternative is cleaner from Vim's viewpoint. However,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
42 * the BeBook seems to assume everywhere that the BApplication *must*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
43 * run in the initial thread. So perhaps doing otherwise is very wrong.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
44 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
45 * However, from a B_SINGLE_LAUNCH viewpoint, the first is better.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
46 * If Vim is marked "Single Launch" in its application resources,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
47 * and a file is dropped on the Vim icon, and another Vim is already
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
48 * running, the file is passed on to the earlier Vim. This happens
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
49 * in BApplication::Run(). So we want Vim to terminate if
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
50 * BApplication::Run() terminates. (See the BeBook, on BApplication.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
51 * However, it seems that the second copy of Vim isn't even started
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
52 * in this case... which is for the better since I wouldn't know how
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
53 * to detect this case.)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
54 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
55 * Communication between these threads occurs mostly by translating
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
56 * BMessages that come in and posting an appropriate translation on
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
57 * the VDCMP (Vim Direct Communication Message Port). Therefore the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
58 * actions required for keypresses and window resizes, etc, are mostly
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
59 * performed in the main() thread.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
60 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
61 * A notable exception to this is the Draw() event. The redrawing of
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
62 * the window contents is performed asynchronously from the window
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
63 * thread. To make this work correctly, a locking protocol is used when
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
64 * any thread is accessing the essential variables that are used by
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
65 * the window thread.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
66 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
67 * This locking protocol consists of locking Vim's window. This is both
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
68 * convenient and necessary.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
69 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
70 extern "C" {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
71
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
72 #define new xxx_new_xxx
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
73
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
74 #include <float.h>
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
75 #include <assert.h>
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
76 #include "vim.h"
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
77 #include "globals.h"
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
78 #include "proto.h"
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
79 #include "option.h"
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
80
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
81 #undef new
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
82
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
83 } /* extern "C" */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
84
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
85 /* ---------------- start of header part ---------------- */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
86
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
87 #include <be/app/MessageQueue.h>
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
88 #include <be/app/Clipboard.h>
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
89 #include <be/kernel/OS.h>
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
90 #include <be/support/Beep.h>
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
91 #include <be/interface/View.h>
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
92 #include <be/interface/Window.h>
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
93 #include <be/interface/MenuBar.h>
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
94 #include <be/interface/MenuItem.h>
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
95 #include <be/interface/ScrollBar.h>
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
96 #include <be/interface/Region.h>
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
97 #include <be/interface/Screen.h>
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
98 #include <be/storage/Path.h>
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
99 #include <be/storage/Directory.h>
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
100 #include <be/storage/Entry.h>
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
101 #include <be/app/Application.h>
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
102 #include <be/support/Debug.h>
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
103
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
104 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
105 * The macro B_PIXEL_ALIGNMENT shows us which version
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
106 * of the header files we're using.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
107 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
108 #if defined(B_PIXEL_ALIGNMENT)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
109 #define HAVE_R3_OR_LATER 1
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
110 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
111 #define HAVE_R3_OR_LATER 0
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
112 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
113
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
114 class VimApp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
115 class VimFormView;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
116 class VimTextAreaView;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
117 class VimWindow;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
118
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
119 extern key_map *keyMap;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
120 extern char *keyMapChars;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
121
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
122 extern int main(int argc, char **argv);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
123
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
124 #ifndef B_MAX_PORT_COUNT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
125 #define B_MAX_PORT_COUNT 100
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
126 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
127
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
128 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
129 * VimApp seems comparable to the X "vimShell"
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
130 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
131 class VimApp: public BApplication
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
132 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
133 typedef BApplication Inherited;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
134 public:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
135 VimApp(const char *appsig);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
136 ~VimApp();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
137
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
138 // callbacks:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
139 #if 0
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
140 virtual void DispatchMessage(BMessage *m, BHandler *h)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
141 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
142 m->PrintToStream();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
143 Inherited::DispatchMessage(m, h);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
144 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
145 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
146 virtual void ReadyToRun();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
147 virtual void ArgvReceived(int32 argc, char **argv);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
148 virtual void RefsReceived(BMessage *m);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
149 virtual bool QuitRequested();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
150
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
151 static void SendRefs(BMessage *m, bool changedir);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
152 private:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
153 };
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
154
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
155 class VimWindow: public BWindow
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
156 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
157 typedef BWindow Inherited;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
158 public:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
159 VimWindow();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
160 ~VimWindow();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
161
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
162 virtual void DispatchMessage(BMessage *m, BHandler *h);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
163 virtual void WindowActivated(bool active);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
164 virtual bool QuitRequested();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
165
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
166 VimFormView *formView;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
167
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
168 private:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
169 void init();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
170
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
171 };
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
172
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
173 class VimFormView: public BView
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
174 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
175 typedef BView Inherited;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
176 public:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
177 VimFormView(BRect frame);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
178 ~VimFormView();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
179
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
180 // callbacks:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
181 virtual void AllAttached();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
182 virtual void FrameResized(float new_width, float new_height);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
183
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
184 #define MENUBAR_MARGIN 1
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
185 float MenuHeight() const
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
186 { return menuBar ? menuBar->Frame().Height() + MENUBAR_MARGIN: 0; }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
187 BMenuBar *MenuBar() const
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
188 { return menuBar; }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
189
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
190 private:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
191 void init(BRect);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
192
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
193 BMenuBar *menuBar;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
194 VimTextAreaView *textArea;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
195 };
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
196
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
197 class VimTextAreaView: public BView
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
198 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
199 typedef BView Inherited;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
200 public:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
201 VimTextAreaView(BRect frame);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
202 ~VimTextAreaView();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
203
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
204 // callbacks:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
205 virtual void Draw(BRect updateRect);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
206 virtual void KeyDown(const char *bytes, int32 numBytes);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
207 virtual void MouseDown(BPoint point);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
208 virtual void MouseUp(BPoint point);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
209 virtual void MouseMoved(BPoint point, uint32 transit, const BMessage *message);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
210 virtual void MessageReceived(BMessage *m);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
211
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
212 // own functions:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
213 int mchInitFont(char_u *name);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
214 void mchDrawString(int row, int col, char_u *s, int len, int flags);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
215 void mchClearBlock(int row1, int col1, int row2, int col2);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
216 void mchClearAll();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
217 void mchDeleteLines(int row, int num_lines);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
218 void mchInsertLines(int row, int num_lines);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
219
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
220 static void guiSendMouseEvent(int button, int x, int y, int repeated_click, int_u modifiers);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
221 static void guiBlankMouse(bool should_hide);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
222 static int_u mouseModifiersToVim(int32 beModifiers);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
223
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
224 int32 mouseDragEventCount;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
225
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
226 private:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
227 void init(BRect);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
228
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
229 int_u vimMouseButton;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
230 int_u vimMouseModifiers;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
231 };
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
232
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
233 class VimScrollBar: public BScrollBar
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
234 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
235 typedef BScrollBar Inherited;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
236 public:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
237 VimScrollBar(scrollbar_T *gsb, orientation posture);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
238 ~VimScrollBar();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
239
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
240 virtual void ValueChanged(float newValue);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
241 virtual void MouseUp(BPoint where);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
242 void SetValue(float newval);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
243 scrollbar_T *getGsb()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
244 { return gsb; }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
245
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
246 int32 scrollEventCount;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
247
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
248 private:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
249 scrollbar_T *gsb;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
250 float ignoreValue;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
251 };
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
252
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
253
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
254 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
255 * For caching the fonts that are used;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
256 * Vim seems rather sloppy in this regard.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
257 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
258 class VimFont: public BFont
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
259 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
260 typedef BFont Inherited;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
261 public:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
262 VimFont();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
263 VimFont(const VimFont *rhs);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
264 VimFont(const BFont *rhs);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
265 VimFont(const VimFont &rhs);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
266 ~VimFont();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
267
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
268 VimFont *next;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
269 int refcount;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
270 char_u *name;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
271
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
272 private:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
273 void init();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
274 };
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
275
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
276 /* ---------------- end of GUI classes ---------------- */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
277
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
278 struct MainArgs {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
279 int argc;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
280 char **argv;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
281 };
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
282
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
283 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
284 * These messages are copied through the VDCMP.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
285 * Therefore they ought not to have anything fancy.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
286 * They must be of POD type (Plain Old Data)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
287 * as the C++ standard calls them.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
288 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
289
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
290 #define KEY_MSG_BUFSIZ 7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
291 #if KEY_MSG_BUFSIZ < MAX_KEY_CODE_LEN
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
292 #error Increase KEY_MSG_BUFSIZ!
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
293 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
294
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
295 struct VimKeyMsg {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
296 char_u length;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
297 char_u chars[KEY_MSG_BUFSIZ]; /* contains Vim encoding */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
298 };
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
299
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
300 struct VimResizeMsg {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
301 int width;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
302 int height;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
303 };
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
304
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
305 struct VimScrollBarMsg {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
306 VimScrollBar *sb;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
307 long value;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
308 int stillDragging;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
309 };
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
310
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
311 struct VimMenuMsg {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
312 vimmenu_T *guiMenu;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
313 };
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
314
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
315 struct VimMouseMsg {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
316 int button;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
317 int x;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
318 int y;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
319 int repeated_click;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
320 int_u modifiers;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
321 };
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
322
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
323 struct VimFocusMsg {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
324 bool active;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
325 };
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
326
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
327 struct VimRefsMsg {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
328 BMessage *message;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
329 bool changedir;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
330 };
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
331
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
332 struct VimMsg {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
333 enum VimMsgType {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
334 Key, Resize, ScrollBar, Menu, Mouse, Focus, Refs
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
335 };
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
336
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
337 union {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
338 struct VimKeyMsg Key;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
339 struct VimResizeMsg NewSize;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
340 struct VimScrollBarMsg Scroll;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
341 struct VimMenuMsg Menu;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
342 struct VimMouseMsg Mouse;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
343 struct VimFocusMsg Focus;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
344 struct VimRefsMsg Refs;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
345 } u;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
346 };
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
347
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
348 #define RGB(r, g, b) ((char_u)(r) << 16 | (char_u)(g) << 8 | (char_u)(b) << 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
349 #define GUI_TO_RGB(g) { (g) >> 16, (g) >> 8, (g) >> 0, 255 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
350
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
351 /* ---------------- end of header part ---------------- */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
352
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
353 static struct specialkey
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
354 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
355 uint16 BeKeys;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
356 #define KEY(a,b) ((a)<<8|(b))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
357 #define K(a) KEY(0,a) // for ASCII codes
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
358 #define F(b) KEY(1,b) // for scancodes
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
359 char_u vim_code0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
360 char_u vim_code1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
361 } special_keys[] =
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
362 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
363 {K(B_UP_ARROW), 'k', 'u'},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
364 {K(B_DOWN_ARROW), 'k', 'd'},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
365 {K(B_LEFT_ARROW), 'k', 'l'},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
366 {K(B_RIGHT_ARROW), 'k', 'r'},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
367 {K(B_BACKSPACE), 'k', 'b'},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
368 {K(B_INSERT), 'k', 'I'},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
369 {K(B_DELETE), 'k', 'D'},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
370 {K(B_HOME), 'k', 'h'},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
371 {K(B_END), '@', '7'},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
372 {K(B_PAGE_UP), 'k', 'P'}, /* XK_Prior */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
373 {K(B_PAGE_DOWN), 'k', 'N'}, /* XK_Next, */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
374
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
375 #define FIRST_FUNCTION_KEY 11
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
376 {F(B_F1_KEY), 'k', '1'},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
377 {F(B_F2_KEY), 'k', '2'},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
378 {F(B_F3_KEY), 'k', '3'},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
379 {F(B_F4_KEY), 'k', '4'},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
380 {F(B_F5_KEY), 'k', '5'},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
381 {F(B_F6_KEY), 'k', '6'},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
382 {F(B_F7_KEY), 'k', '7'},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
383 {F(B_F8_KEY), 'k', '8'},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
384 {F(B_F9_KEY), 'k', '9'},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
385 {F(B_F10_KEY), 'k', ';'},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
386
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
387 {F(B_F11_KEY), 'F', '1'},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
388 {F(B_F12_KEY), 'F', '2'},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
389 // {XK_F13, 'F', '3'}, /* would be print screen/ */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
390 /* sysreq */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
391 {F(0x0F), 'F', '4'}, /* scroll lock */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
392 {F(0x10), 'F', '5'}, /* pause/break */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
393 // {XK_F16, 'F', '6'},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
394 // {XK_F17, 'F', '7'},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
395 // {XK_F18, 'F', '8'},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
396 // {XK_F19, 'F', '9'},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
397 // {XK_F20, 'F', 'A'},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
398 //
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
399 // {XK_F21, 'F', 'B'},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
400 // {XK_F22, 'F', 'C'},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
401 // {XK_F23, 'F', 'D'},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
402 // {XK_F24, 'F', 'E'},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
403 // {XK_F25, 'F', 'F'},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
404 // {XK_F26, 'F', 'G'},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
405 // {XK_F27, 'F', 'H'},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
406 // {XK_F28, 'F', 'I'},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
407 // {XK_F29, 'F', 'J'},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
408 // {XK_F30, 'F', 'K'},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
409 //
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
410 // {XK_F31, 'F', 'L'},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
411 // {XK_F32, 'F', 'M'},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
412 // {XK_F33, 'F', 'N'},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
413 // {XK_F34, 'F', 'O'},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
414 // {XK_F35, 'F', 'P'}, /* keysymdef.h defines up to F35 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
415
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
416 // {XK_Help, '%', '1'}, /* XK_Help */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
417 {F(B_PRINT_KEY), '%', '9'},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
418
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
419 #if 0
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
420 /* Keypad keys: */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
421 {F(0x48), 'k', 'l'}, /* XK_KP_Left */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
422 {F(0x4A), 'k', 'r'}, /* XK_KP_Right */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
423 {F(0x38), 'k', 'u'}, /* XK_KP_Up */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
424 {F(0x59), 'k', 'd'}, /* XK_KP_Down */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
425 {F(0x64), 'k', 'I'}, /* XK_KP_Insert */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
426 {F(0x65), 'k', 'D'}, /* XK_KP_Delete */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
427 {F(0x37), 'k', 'h'}, /* XK_KP_Home */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
428 {F(0x58), '@', '7'}, /* XK_KP_End */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
429 {F(0x39), 'k', 'P'}, /* XK_KP_Prior */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
430 {F(0x60), 'k', 'N'}, /* XK_KP_Next */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
431 {F(0x49), '&', '8'}, /* XK_Undo, keypad 5 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
432 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
433
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
434 /* End of list marker: */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
435 {0, 0, 0}
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
436 };
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
437
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
438 #define NUM_SPECIAL_KEYS (sizeof(special_keys)/sizeof(special_keys[0]))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
439
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
440 /* ---------------- VimApp ---------------- */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
441
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
442 static void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
443 docd(BPath &path)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
444 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
445 mch_chdir(path.Path());
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
446 /* Do this to get the side effects of a :cd command */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
447 do_cmdline_cmd((char_u *)"cd .");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
448 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
449
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
450 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
451 * Really handle dropped files and folders.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
452 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
453 static void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
454 RefsReceived(BMessage *m, bool changedir)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
455 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
456 uint32 type;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
457 int32 count;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
458
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
459 //m->PrintToStream();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
460 switch (m->what) {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
461 case B_REFS_RECEIVED:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
462 case B_SIMPLE_DATA:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
463 m->GetInfo("refs", &type, &count);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
464 if (type != B_REF_TYPE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
465 goto bad;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
466 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
467 case B_ARGV_RECEIVED:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
468 m->GetInfo("argv", &type, &count);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
469 if (type != B_STRING_TYPE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
470 goto bad;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
471 if (changedir) {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
472 char *dirname;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
473 if (m->FindString("cwd", (const char **) &dirname) == B_OK) {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
474 chdir(dirname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
475 do_cmdline_cmd((char_u *)"cd .");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
476 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
477 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
478 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
479 default:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
480 bad:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
481 //fprintf(stderr, "bad!\n");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
482 delete m;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
483 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
484 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
485
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
486 #ifdef FEAT_VISUAL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
487 reset_VIsual();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
488 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
489
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
490 char_u **fnames;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
491 fnames = (char_u **) alloc(count * sizeof(char_u *));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
492 int fname_index = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
493
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
494 switch (m->what) {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
495 case B_REFS_RECEIVED:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
496 case B_SIMPLE_DATA:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
497 //fprintf(stderr, "case B_REFS_RECEIVED\n");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
498 for (int i = 0; i < count; ++i)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
499 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
500 entry_ref ref;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
501 if (m->FindRef("refs", i, &ref) == B_OK) {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
502 BEntry entry(&ref, false);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
503 BPath path;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
504 entry.GetPath(&path);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
505
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
506 /* Change to parent directory? */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
507 if (changedir) {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
508 BPath parentpath;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
509 path.GetParent(&parentpath);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
510 docd(parentpath);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
511 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
512
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
513 /* Is it a directory? If so, cd into it. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
514 BDirectory bdir(&ref);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
515 if (bdir.InitCheck() == B_OK) {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
516 /* don't cd if we already did it */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
517 if (!changedir)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
518 docd(path);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
519 } else {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
520 mch_dirname(IObuff, IOSIZE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
521 char_u *fname = shorten_fname((char_u *)path.Path(), IObuff);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
522 if (fname == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
523 fname = (char_u *)path.Path();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
524 fnames[fname_index++] = vim_strsave(fname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
525 //fprintf(stderr, "%s\n", fname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
526 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
527
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
528 /* Only do it for the first file/dir */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
529 changedir = false;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
530 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
531 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
532 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
533 case B_ARGV_RECEIVED:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
534 //fprintf(stderr, "case B_ARGV_RECEIVED\n");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
535 for (int i = 1; i < count; ++i)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
536 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
537 char *fname;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
538
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
539 if (m->FindString("argv", i, (const char **) &fname) == B_OK) {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
540 fnames[fname_index++] = vim_strsave((char_u *)fname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
541 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
542 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
543 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
544 default:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
545 //fprintf(stderr, "case default\n");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
546 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
547 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
548
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
549 delete m;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
550
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
551 /* Handle the drop, :edit to get to the file */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
552 if (fname_index > 0) {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
553 handle_drop(fname_index, fnames, FALSE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
554
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
555 /* Update the screen display */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
556 update_screen(NOT_VALID);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
557 setcursor();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
558 out_flush();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
559 } else {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
560 vim_free(fnames);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
561 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
562 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
563
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
564 VimApp::VimApp(const char *appsig):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
565 BApplication(appsig)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
566 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
567 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
568
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
569 VimApp::~VimApp()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
570 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
571 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
572
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
573 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
574 VimApp::ReadyToRun()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
575 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
576 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
577 * Apparently signals are inherited by the created thread -
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
578 * disable the most annoying ones.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
579 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
580 signal(SIGINT, SIG_IGN);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
581 signal(SIGQUIT, SIG_IGN);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
582 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
583
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
584 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
585 VimApp::ArgvReceived(int32 arg_argc, char **arg_argv)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
586 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
587 if (!IsLaunching()) {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
588 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
589 * This can happen if we are set to Single or Exclusive
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
590 * Launch. Be nice and open the file(s).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
591 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
592 if (gui.vimWindow)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
593 gui.vimWindow->Minimize(false);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
594 BMessage *m = CurrentMessage();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
595 DetachCurrentMessage();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
596 SendRefs(m, true);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
597 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
598 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
599
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
600 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
601 VimApp::RefsReceived(BMessage *m)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
602 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
603 /* Horrible hack!!! XXX XXX XXX
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
604 * The real problem is that b_start_ffc is set too late for
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
605 * the initial empty buffer. As a result the window will be
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
606 * split instead of abandoned.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
607 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
608 int limit = 15;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
609 while (--limit >= 0 && (curbuf == NULL || curbuf->b_start_ffc == 0))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
610 snooze(100000); // 0.1 s
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
611 if (gui.vimWindow)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
612 gui.vimWindow->Minimize(false);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
613 DetachCurrentMessage();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
614 SendRefs(m, true);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
615 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
616
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
617 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
618 * Pass a BMessage on to the main() thread.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
619 * Caller must have detached the message.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
620 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
621 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
622 VimApp::SendRefs(BMessage *m, bool changedir)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
623 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
624 VimRefsMsg rm;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
625 rm.message = m;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
626 rm.changedir = changedir;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
627
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
628 write_port(gui.vdcmp, VimMsg::Refs, &rm, sizeof(rm));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
629 // calls ::RefsReceived
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
630 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
631
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
632 bool
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
633 VimApp::QuitRequested()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
634 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
635 (void)Inherited::QuitRequested();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
636 return false;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
637 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
638
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
639 /* ---------------- VimWindow ---------------- */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
640
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
641 VimWindow::VimWindow():
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
642 BWindow(BRect(40, 40, 150, 150),
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
643 "Vim",
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
644 B_TITLED_WINDOW,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
645 0,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
646 B_CURRENT_WORKSPACE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
647
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
648 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
649 init();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
650 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
651
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
652 VimWindow::~VimWindow()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
653 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
654 if (formView) {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
655 RemoveChild(formView);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
656 delete formView;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
657 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
658 gui.vimWindow = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
659 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
660
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
661 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
662 VimWindow::init()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
663 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
664 /* Attach the VimFormView */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
665 formView = new VimFormView(Bounds());
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
666 if (formView != NULL) {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
667 AddChild(formView);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
668 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
669 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
670
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
671 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
672 VimWindow::DispatchMessage(BMessage *m, BHandler *h)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
673 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
674 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
675 * Route B_MOUSE_UP messages to MouseUp(), in
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
676 * a manner that should be compatible with the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
677 * intended future system behaviour.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
678 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
679 switch (m->what) {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
680 case B_MOUSE_UP:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
681 // if (!h) h = PreferredHandler();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
682 // gcc isn't happy without this extra set of braces, complains about
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
683 // jump to case label crosses init of 'class BView * v'
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
684 // richard@whitequeen.com jul 99
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
685 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
686 BView *v = dynamic_cast<BView *>(h);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
687 if (v) {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
688 //m->PrintToStream();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
689 BPoint where;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
690 m->FindPoint("where", &where);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
691 v->MouseUp(where);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
692 } else {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
693 Inherited::DispatchMessage(m, h);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
694 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
695 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
696 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
697 default:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
698 Inherited::DispatchMessage(m, h);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
699 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
700 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
701
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
702 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
703 VimWindow::WindowActivated(bool active)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
704 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
705 Inherited::WindowActivated(active);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
706 /* the textArea gets the keyboard action */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
707 if (active && gui.vimTextArea)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
708 gui.vimTextArea->MakeFocus(true);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
709
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
710 struct VimFocusMsg fm;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
711 fm.active = active;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
712
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
713 write_port(gui.vdcmp, VimMsg::Focus, &fm, sizeof(fm));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
714 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
715
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
716 bool
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
717 VimWindow::QuitRequested()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
718 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
719 struct VimKeyMsg km;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
720 km.length = 5;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
721 memcpy((char *)km.chars, "\033:qa\r", km.length);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
722
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
723 write_port(gui.vdcmp, VimMsg::Key, &km, sizeof(km));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
724
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
725 return false;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
726 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
727
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
728 /* ---------------- VimFormView ---------------- */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
729
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
730 VimFormView::VimFormView(BRect frame):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
731 BView(frame, "VimFormView", B_FOLLOW_ALL_SIDES,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
732 B_WILL_DRAW | B_FRAME_EVENTS),
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
733 menuBar(NULL),
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
734 textArea(NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
735 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
736 init(frame);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
737 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
738
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
739 VimFormView::~VimFormView()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
740 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
741 if (menuBar) {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
742 RemoveChild(menuBar);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
743 #ifdef never
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
744 // deleting the menuBar leads to SEGV on exit
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
745 // richard@whitequeen.com Jul 99
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
746 delete menuBar;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
747 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
748 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
749 if (textArea) {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
750 RemoveChild(textArea);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
751 delete textArea;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
752 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
753 gui.vimForm = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
754 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
755
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
756 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
757 VimFormView::init(BRect frame)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
758 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
759 menuBar = new BMenuBar(BRect(0,0,-MENUBAR_MARGIN,-MENUBAR_MARGIN),
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
760 "VimMenuBar");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
761
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
762 AddChild(menuBar);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
763
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
764 BRect remaining = frame;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
765 textArea = new VimTextAreaView(remaining);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
766 AddChild(textArea);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
767 /* The textArea will be resized later when menus are added */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
768
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
769 gui.vimForm = this;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
770 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
771
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
772 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
773 VimFormView::AllAttached()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
774 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
775 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
776 * Apparently signals are inherited by the created thread -
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
777 * disable the most annoying ones.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
778 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
779 signal(SIGINT, SIG_IGN);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
780 signal(SIGQUIT, SIG_IGN);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
781
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
782 if (menuBar && textArea) {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
783 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
784 * Resize the textArea to fill the space left over by the menu.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
785 * This is somewhat futile since it will be done again once
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
786 * menus are added to the menu bar.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
787 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
788 BRect remaining = Bounds();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
789 remaining.top = MenuHeight();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
790 textArea->ResizeTo(remaining.Width(), remaining.Height());
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
791 textArea->MoveTo(remaining.left, remaining.top);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
792
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
793 #ifdef FEAT_MENU
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
794 menuBar->ResizeTo(remaining.right, remaining.top);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
795 gui.menu_height = (int) remaining.top;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
796 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
797 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
798 Inherited::AllAttached();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
799 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
800
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
801 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
802 VimFormView::FrameResized(float new_width, float new_height)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
803 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
804 BWindow *w = Window();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
805 #if 1
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
806 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
807 * Look if there are more resize messages in the queue.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
808 * If so, ignore this one. The later one will be handled
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
809 * eventually.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
810 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
811 BMessageQueue *q = w->MessageQueue();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
812 if (q->FindMessage(B_VIEW_RESIZED, 0) != NULL) {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
813 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
814 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
815 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
816 new_width += 1; // adjust from width to number of pixels occupied
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
817 new_height += 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
818
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
819 #if !HAVE_R3_OR_LATER
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
820 int adjust_h, adjust_w;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
821
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
822 adjust_w = ((int)new_width - gui_get_base_width()) % gui.char_width;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
823 adjust_h = ((int)new_height - gui_get_base_height()) % gui.char_height;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
824
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
825 if (adjust_w > 0 || adjust_h > 0) {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
826 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
827 * This will generate a new FrameResized() message.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
828 * If we're running R3 or later, SetWindowAlignment() should make
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
829 * sure that this does not happen.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
830 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
831 w->ResizeBy(-adjust_w, -adjust_h);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
832
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
833 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
834 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
835 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
836
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
837 struct VimResizeMsg sm;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
838 sm.width = (int) new_width;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
839 sm.height = (int) new_height;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
840
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
841 write_port(gui.vdcmp, VimMsg::Resize, &sm, sizeof(sm));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
842 // calls gui_resize_shell(new_width, new_height);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
843
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
844 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
845
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
846 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
847 * The area below the vertical scrollbar is erased to the colour
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
848 * set with SetViewColor() automatically, because we had set
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
849 * B_WILL_DRAW. Resizing the window tight around the vertical
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
850 * scroll bar also helps to avoid debris.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
851 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
852 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
853
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
854 /* ---------------- VimTextAreaView ---------------- */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
855
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
856 VimTextAreaView::VimTextAreaView(BRect frame):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
857 BView(frame, "VimTextAreaView", B_FOLLOW_ALL_SIDES,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
858 B_WILL_DRAW | B_FULL_UPDATE_ON_RESIZE),
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
859 mouseDragEventCount(0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
860 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
861 init(frame);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
862 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
863
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
864 VimTextAreaView::~VimTextAreaView()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
865 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
866 gui.vimTextArea = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
867 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
868
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
869 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
870 VimTextAreaView::init(BRect frame)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
871 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
872 /* set up global var for fast access */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
873 gui.vimTextArea = this;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
874
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
875 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
876 * Tell the app server not to erase the view: we will
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
877 * fill it in completely by ourselves.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
878 * (Does this really work? Even if not, it won't harm either.)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
879 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
880 SetViewColor(B_TRANSPARENT_32_BIT);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
881 #define PEN_WIDTH 1
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
882 SetPenSize(PEN_WIDTH);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
883 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
884
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
885 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
886 VimTextAreaView::Draw(BRect updateRect)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
887 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
888 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
889 * XXX Other ports call here:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
890 * out_flush(); * make sure all output has been processed *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
891 * but we can't do that, since it involves too much information
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
892 * that is owned by other threads...
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
893 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
894
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
895 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
896 * No need to use gui.vimWindow->Lock(): we are locked already.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
897 * However, it would not hurt.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
898 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
899 gui_redraw((int) updateRect.left, (int) updateRect.top,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
900 (int) (updateRect.Width() + PEN_WIDTH), (int) (updateRect.Height() + PEN_WIDTH));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
901
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
902 /* Clear the border areas if needed */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
903 rgb_color rgb = GUI_TO_RGB(gui.back_pixel);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
904 SetLowColor(rgb);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
905
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
906 if (updateRect.left < FILL_X(0)) // left border
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
907 FillRect(BRect(updateRect.left, updateRect.top,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
908 FILL_X(0)-PEN_WIDTH, updateRect.bottom), B_SOLID_LOW);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
909 if (updateRect.top < FILL_Y(0)) // top border
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
910 FillRect(BRect(updateRect.left, updateRect.top,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
911 updateRect.right, FILL_Y(0)-PEN_WIDTH), B_SOLID_LOW);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
912 if (updateRect.right >= FILL_X(Columns)) // right border
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
913 FillRect(BRect(FILL_X((int)Columns), updateRect.top,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
914 updateRect.right, updateRect.bottom), B_SOLID_LOW);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
915 if (updateRect.bottom >= FILL_Y(Rows)) // bottom border
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
916 FillRect(BRect(updateRect.left, FILL_Y((int)Rows),
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
917 updateRect.right, updateRect.bottom), B_SOLID_LOW);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
918 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
919
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
920 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
921 VimTextAreaView::KeyDown(const char *bytes, int32 numBytes)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
922 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
923 struct VimKeyMsg km;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
924 char_u *dest = km.chars;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
925
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
926 BMessage *msg = Window()->CurrentMessage();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
927 assert(msg);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
928 //msg->PrintToStream();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
929
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
930 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
931 * Convert special keys to Vim codes.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
932 * I think it is better to do it in the window thread
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
933 * so we use at least a little bit of the potential
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
934 * of our 2 CPUs. Besides, due to the fantastic mapping
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
935 * of special keys to UTF-8, we have quite some work to
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
936 * do...
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
937 * TODO: I'm not quite happy with detection of special
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
938 * keys. Perhaps I should use scan codes after all...
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
939 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
940 if (numBytes > 1) {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
941 /* This cannot be a special key */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
942 if (numBytes > KEY_MSG_BUFSIZ)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
943 numBytes = KEY_MSG_BUFSIZ; // should never happen... ???
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
944 km.length = numBytes;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
945 memcpy((char *)dest, bytes, numBytes);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
946 } else {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
947 int32 scancode = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
948 msg->FindInt32("key", &scancode);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
949
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
950 int32 beModifiers = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
951 msg->FindInt32("modifiers", &beModifiers);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
952
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
953 char_u string[3];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
954 int len = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
955 km.length = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
956
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
957 bool canHaveVimModifiers = false;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
958
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
959 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
960 * For normal, printable ASCII characters, don't look them up
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
961 * to check if they might be a special key. They aren't.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
962 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
963 assert(B_BACKSPACE <= 0x20);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
964 assert(B_DELETE == 0x7F);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
965 if (((char_u)bytes[0] <= 0x20 || (char_u)bytes[0] == 0x7F) &&
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
966 numBytes == 1) {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
967 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
968 * Due to the great nature of Be's mapping of special keys,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
969 * viz. into the range of the control characters,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
970 * we can only be sure it is *really* a special key if
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
971 * if it is special without using ctrl. So, only if ctrl is
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
972 * used, we need to check it unmodified.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
973 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
974 if (beModifiers & B_CONTROL_KEY) {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
975 int index = keyMap->normal_map[scancode];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
976 int newNumBytes = keyMapChars[index];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
977 char_u *newBytes = (char_u *)&keyMapChars[index + 1];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
978
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
979 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
980 * Check if still special without the control key.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
981 * This is needed for BACKSPACE: that key does produce
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
982 * different values with modifiers (DEL).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
983 * Otherwise we could simply have checked for equality.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
984 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
985 if (newNumBytes != 1 || (*newBytes > 0x20 &&
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
986 *newBytes != 0x7F )) {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
987 goto notspecial;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
988 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
989 bytes = (char *)newBytes;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
990 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
991 canHaveVimModifiers = true;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
992
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
993 uint16 beoskey;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
994 int first, last;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
995
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
996 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
997 * If numBytes == 0 that probably always indicates a special key.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
998 * (does not happen yet)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
999 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1000 if (numBytes == 0 || bytes[0] == B_FUNCTION_KEY) {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1001 beoskey = F(scancode);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1002 first = FIRST_FUNCTION_KEY;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1003 last = NUM_SPECIAL_KEYS;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1004 } else if (*bytes == '\n' && scancode == 0x47) {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1005 /* remap the (non-keypad) ENTER key from \n to \r. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1006 string[0] = '\r';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1007 len = 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1008 first = last = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1009 } else {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1010 beoskey = K(bytes[0]);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1011 first = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1012 last = FIRST_FUNCTION_KEY;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1013 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1014
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1015 for (int i = first; i < last; i++) {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1016 if (special_keys[i].BeKeys == beoskey) {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1017 string[0] = CSI;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1018 string[1] = special_keys[i].vim_code0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1019 string[2] = special_keys[i].vim_code1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1020 len = 3;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1021 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1022 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1023 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1024 notspecial:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1025 if (len == 0) {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1026 string[0] = bytes[0];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1027 len = 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1028 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1029
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1030 /* Special keys (and a few others) may have modifiers */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1031 #if 0
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1032 if (len == 3 ||
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1033 bytes[0] == B_SPACE || bytes[0] == B_TAB ||
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1034 bytes[0] == B_RETURN || bytes[0] == '\r' ||
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1035 bytes[0] == B_ESCAPE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1036 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1037 if (canHaveVimModifiers)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1038 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1039 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1040 int modifiers;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1041 modifiers = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1042 if (beModifiers & B_SHIFT_KEY)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1043 modifiers |= MOD_MASK_SHIFT;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1044 if (beModifiers & B_CONTROL_KEY)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1045 modifiers |= MOD_MASK_CTRL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1046 if (beModifiers & B_OPTION_KEY)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1047 modifiers |= MOD_MASK_ALT;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1048
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1049 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1050 * For some keys a shift modifier is translated into another key
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1051 * code. Do we need to handle the case where len != 1 and
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1052 * string[0] != CSI? (Not for BeOS, since len == 3 implies
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1053 * string[0] == CSI...)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1054 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1055 int key;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1056 if (string[0] == CSI && len == 3)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1057 key = TO_SPECIAL(string[1], string[2]);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1058 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1059 key = string[0];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1060 key = simplify_key(key, &modifiers);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1061 if (IS_SPECIAL(key))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1062 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1063 string[0] = CSI;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1064 string[1] = K_SECOND(key);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1065 string[2] = K_THIRD(key);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1066 len = 3;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1067 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1068 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1069 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1070 string[0] = key;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1071 len = 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1072 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1073
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1074 if (modifiers)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1075 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1076 *dest++ = CSI;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1077 *dest++ = KS_MODIFIER;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1078 *dest++ = modifiers;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1079 km.length = 3;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1080 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1081 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1082 memcpy((char *)dest, string, len);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1083 km.length += len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1084 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1085
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1086 write_port(gui.vdcmp, VimMsg::Key, &km, sizeof(km));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1087
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1088 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1089 * blank out the pointer if necessary
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1090 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1091 if (p_mh && !gui.pointer_hidden)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1092 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1093 guiBlankMouse(true);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1094 gui.pointer_hidden = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1095 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1096 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1097 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1098 VimTextAreaView::guiSendMouseEvent(
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1099 int button,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1100 int x,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1101 int y,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1102 int repeated_click,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1103 int_u modifiers)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1104 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1105 VimMouseMsg mm;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1106
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1107 mm.button = button;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1108 mm.x = x;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1109 mm.y = y;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1110 mm.repeated_click = repeated_click;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1111 mm.modifiers = modifiers;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1112
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1113 write_port(gui.vdcmp, VimMsg::Mouse, &mm, sizeof(mm));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1114 // calls gui_send_mouse_event()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1115
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1116 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1117 * if our pointer is currently hidden, then we should show it.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1118 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1119 if (gui.pointer_hidden)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1120 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1121 guiBlankMouse(false);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1122 gui.pointer_hidden = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1123 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1124 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1125
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1126 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1127 VimTextAreaView::guiBlankMouse(bool should_hide)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1128 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1129 if (should_hide) {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1130 //gui.vimApp->HideCursor();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1131 gui.vimApp->ObscureCursor();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1132 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1133 * ObscureCursor() would even be easier, but then
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1134 * Vim's idea of mouse visibility does not necessarily
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1135 * correspond to reality.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1136 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1137 } else {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1138 //gui.vimApp->ShowCursor();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1139 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1140 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1141
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1142 int_u
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1143 VimTextAreaView::mouseModifiersToVim(int32 beModifiers)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1144 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1145 int_u vim_modifiers = 0x0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1146
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1147 if (beModifiers & B_SHIFT_KEY)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1148 vim_modifiers |= MOUSE_SHIFT;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1149 if (beModifiers & B_CONTROL_KEY)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1150 vim_modifiers |= MOUSE_CTRL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1151 if (beModifiers & B_OPTION_KEY) /* Alt or Meta key */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1152 vim_modifiers |= MOUSE_ALT;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1153
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1154 return vim_modifiers;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1155 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1156
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1157 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1158 VimTextAreaView::MouseDown(BPoint point)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1159 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1160 BMessage *m = Window()->CurrentMessage();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1161 assert(m);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1162
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1163 int32 buttons = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1164 m->FindInt32("buttons", &buttons);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1165
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1166 int vimButton;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1167
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1168 if (buttons & B_PRIMARY_MOUSE_BUTTON)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1169 vimButton = MOUSE_LEFT;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1170 else if (buttons & B_SECONDARY_MOUSE_BUTTON)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1171 vimButton = MOUSE_RIGHT;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1172 else if (buttons & B_TERTIARY_MOUSE_BUTTON)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1173 vimButton = MOUSE_MIDDLE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1174 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1175 return; /* Unknown button */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1176
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1177 vimMouseButton = 1; /* don't care which one */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1178
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1179 /* Handle multiple clicks */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1180 int32 clicks = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1181 m->FindInt32("clicks", &clicks);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1182
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1183 int32 modifiers = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1184 m->FindInt32("modifiers", &modifiers);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1185
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1186 vimMouseModifiers = mouseModifiersToVim(modifiers);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1187
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1188 guiSendMouseEvent(vimButton, point.x, point.y,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1189 clicks > 1 /* = repeated_click*/, vimMouseModifiers);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1190 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1191
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1192 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1193 VimTextAreaView::MouseUp(BPoint point)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1194 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1195 vimMouseButton = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1196
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1197 BMessage *m = Window()->CurrentMessage();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1198 assert(m);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1199 //m->PrintToStream();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1200
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1201 int32 modifiers = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1202 m->FindInt32("modifiers", &modifiers);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1203
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1204 vimMouseModifiers = mouseModifiersToVim(modifiers);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1205
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1206 guiSendMouseEvent(MOUSE_RELEASE, point.x, point.y,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1207 0 /* = repeated_click*/, vimMouseModifiers);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1208
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1209 Inherited::MouseUp(point);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1210 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1211
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1212 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1213 VimTextAreaView::MouseMoved(BPoint point, uint32 transit, const BMessage *message)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1214 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1215 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1216 * if our pointer is currently hidden, then we should show it.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1217 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1218 if (gui.pointer_hidden)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1219 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1220 guiBlankMouse(false);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1221 gui.pointer_hidden = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1222 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1223
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1224 if (!vimMouseButton) /* could also check m->"buttons" */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1225 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1226
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1227 atomic_add(&mouseDragEventCount, 1);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1228
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1229 /* Don't care much about "transit" */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1230 guiSendMouseEvent(MOUSE_DRAG, point.x, point.y, 0, vimMouseModifiers);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1231 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1232
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1233 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1234 VimTextAreaView::MessageReceived(BMessage *m)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1235 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1236 switch (m->what) {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1237 case 'menu':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1238 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1239 VimMenuMsg mm;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1240 mm.guiMenu = NULL; /* in case no pointer in msg */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1241 m->FindPointer("VimMenu", (void **)&mm.guiMenu);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1242
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1243 write_port(gui.vdcmp, VimMsg::Menu, &mm, sizeof(mm));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1244 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1245 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1246 default:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1247 if (m->WasDropped()) {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1248 BWindow *w = Window();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1249 w->DetachCurrentMessage();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1250 w->Minimize(false);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1251 VimApp::SendRefs(m, (modifiers() & B_SHIFT_KEY) != 0);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1252 } else {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1253 Inherited::MessageReceived(m);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1254 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1255 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1256 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1257 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1258
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1259 int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1260 VimTextAreaView::mchInitFont(char_u *name)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1261 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1262 VimFont *newFont = (VimFont *)gui_mch_get_font(name, 0);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1263
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1264 gui.norm_font = (GuiFont)newFont;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1265 gui_mch_set_font((GuiFont)newFont);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1266 if (name)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1267 hl_set_font_name(name);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1268
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1269 SetDrawingMode(B_OP_COPY);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1270
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1271 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1272 * Try to load other fonts for bold, italic, and bold-italic.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1273 * We should also try to work out what font to use for these when they are
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1274 * not specified by X resources, but we don't yet.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1275 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1276
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1277 return OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1278 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1279
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1280 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1281 VimTextAreaView::mchDrawString(int row, int col, char_u *s, int len, int flags)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1282 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1283 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1284 * First we must erase the area, because DrawString won't do
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1285 * that for us. XXX Most of the time this is a waste of effort
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1286 * since the bachground has been erased already... DRAW_TRANSP
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1287 * should be set when appropriate!!!
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1288 * (Rectangles include the bottom and right edge)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1289 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1290 if (!(flags & DRAW_TRANSP)) {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1291 BRect r(FILL_X(col), FILL_Y(row),
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1292 FILL_X(col + len) - PEN_WIDTH, FILL_Y(row + 1) - PEN_WIDTH);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1293 FillRect(r, B_SOLID_LOW);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1294 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1295 BPoint where(TEXT_X(col), TEXT_Y(row));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1296 DrawString((char *)s, len, where);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1297
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1298 if (flags & DRAW_BOLD) {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1299 where.x += 1.0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1300 SetDrawingMode(B_OP_BLEND);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1301 DrawString((char *)s, len, where);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1302 SetDrawingMode(B_OP_COPY);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1303 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1304 if (flags & DRAW_UNDERL) {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1305 BPoint start(FILL_X(col), FILL_Y(row + 1) - PEN_WIDTH);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1306 BPoint end(FILL_X(col + len) - PEN_WIDTH, start.y);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1307
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1308 StrokeLine(start, end);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1309 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1310 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1311
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1312 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1313 VimTextAreaView::mchClearBlock(
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1314 int row1,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1315 int col1,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1316 int row2,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1317 int col2)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1318 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1319 BRect r(FILL_X(col1), FILL_Y(row1),
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1320 FILL_X(col2 + 1) - PEN_WIDTH, FILL_Y(row2 + 1) - PEN_WIDTH);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1321 gui_mch_set_bg_color(gui.back_pixel);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1322 FillRect(r, B_SOLID_LOW);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1323 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1324
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1325 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1326 VimTextAreaView::mchClearAll()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1327 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1328 gui_mch_set_bg_color(gui.back_pixel);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1329 FillRect(Bounds(), B_SOLID_LOW);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1330 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1331
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1332 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1333 * mchDeleteLines() Lock()s the window by itself.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1334 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1335 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1336 VimTextAreaView::mchDeleteLines(int row, int num_lines)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1337 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1338 if (row + num_lines > gui.scroll_region_bot)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1339 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1340 /* Scrolled out of region, just blank the lines out */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1341 gui_clear_block(row, gui.scroll_region_left,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1342 gui.scroll_region_bot, gui.scroll_region_right);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1343 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1344 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1345 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1346 /* copy one extra pixel, for when bold has spilled over */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1347 int width = gui.char_width * (gui.scroll_region_right
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1348 - gui.scroll_region_left + 1) + 1 - PEN_WIDTH;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1349 int height = gui.char_height *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1350 (gui.scroll_region_bot - row - num_lines + 1) - PEN_WIDTH;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1351
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1352 BRect source, dest;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1353
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1354 source.left = FILL_X(gui.scroll_region_left);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1355 source.top = FILL_Y(row + num_lines);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1356 source.right = source.left + width;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1357 source.bottom = source.top + height;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1358
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1359 dest.left = FILL_X(gui.scroll_region_left);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1360 dest.top = FILL_Y(row);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1361 dest.right = dest.left + width;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1362 dest.bottom = dest.top + height;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1363
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1364 /* XXX Attempt at a hack: */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1365 gui.vimWindow->UpdateIfNeeded();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1366 #if 0
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1367 /* XXX Attempt at a hack: */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1368 if (gui.vimWindow->NeedsUpdate()) {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1369 fprintf(stderr, "mchDeleteLines: NeedsUpdate!\n");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1370 gui.vimWindow->UpdateIfNeeded();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1371 while (gui.vimWindow->NeedsUpdate()) {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1372 if (false && gui.vimWindow->Lock()) {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1373 Sync();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1374 gui.vimWindow->Unlock();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1375 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1376 snooze(2);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1377 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1378 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1379 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1380
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1381 if (gui.vimWindow->Lock()) {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1382 Sync();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1383 CopyBits(source, dest);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1384 //Sync();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1385
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1386 /* Update gui.cursor_row if the cursor scrolled or copied over */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1387 if (gui.cursor_row >= row
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1388 && gui.cursor_col >= gui.scroll_region_left
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1389 && gui.cursor_col <= gui.scroll_region_right)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1390 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1391 if (gui.cursor_row < row + num_lines)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1392 gui.cursor_is_valid = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1393 else if (gui.cursor_row <= gui.scroll_region_bot)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1394 gui.cursor_row -= num_lines;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1395 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1396
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1397 /* Clear one column more for when bold has spilled over */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1398 gui_clear_block(gui.scroll_region_bot - num_lines + 1,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1399 gui.scroll_region_left,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1400 gui.scroll_region_bot, gui.scroll_region_right);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1401
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1402 gui.vimWindow->Unlock();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1403 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1404 * The Draw() callback will be called now if some of the source
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1405 * bits were not in the visible region.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1406 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1407
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1408 //gui_x11_check_copy_area();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1409 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1410 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1411 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1412
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1413 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1414 * mchInsertLines() Lock()s the window by itself.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1415 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1416 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1417 VimTextAreaView::mchInsertLines(int row, int num_lines)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1418 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1419 if (row + num_lines > gui.scroll_region_bot)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1420 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1421 /* Scrolled out of region, just blank the lines out */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1422 gui_clear_block(row, gui.scroll_region_left,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1423 gui.scroll_region_bot, gui.scroll_region_right);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1424 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1425 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1426 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1427 /* copy one extra pixel, for when bold has spilled over */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1428 int width = gui.char_width * (gui.scroll_region_right
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1429 - gui.scroll_region_left + 1) + 1 - PEN_WIDTH;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1430 int height = gui.char_height *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1431 (gui.scroll_region_bot - row - num_lines + 1) - PEN_WIDTH;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1432
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1433 BRect source, dest;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1434
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1435 source.left = FILL_X(gui.scroll_region_left);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1436 source.top = FILL_Y(row);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1437 source.right = source.left + width;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1438 source.bottom = source.top + height;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1439
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1440 dest.left = FILL_X(gui.scroll_region_left);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1441 dest.top = FILL_Y(row + num_lines);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1442 dest.right = dest.left + width;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1443 dest.bottom = dest.top + height;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1444
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1445 /* XXX Attempt at a hack: */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1446 gui.vimWindow->UpdateIfNeeded();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1447 #if 0
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1448 /* XXX Attempt at a hack: */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1449 if (gui.vimWindow->NeedsUpdate())
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1450 fprintf(stderr, "mchInsertLines: NeedsUpdate!\n");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1451 gui.vimWindow->UpdateIfNeeded();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1452 while (gui.vimWindow->NeedsUpdate())
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1453 snooze(2);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1454 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1455
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1456 if (gui.vimWindow->Lock()) {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1457 Sync();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1458 CopyBits(source, dest);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1459 //Sync();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1460
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1461 /* Update gui.cursor_row if the cursor scrolled or copied over */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1462 if (gui.cursor_row >= gui.row
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1463 && gui.cursor_col >= gui.scroll_region_left
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1464 && gui.cursor_col <= gui.scroll_region_right)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1465 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1466 if (gui.cursor_row <= gui.scroll_region_bot - num_lines)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1467 gui.cursor_row += num_lines;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1468 else if (gui.cursor_row <= gui.scroll_region_bot)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1469 gui.cursor_is_valid = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1470 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1471 /* Clear one column more for when bold has spilled over */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1472 gui_clear_block(row, gui.scroll_region_left,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1473 row + num_lines - 1, gui.scroll_region_right);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1474
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1475 gui.vimWindow->Unlock();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1476 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1477 * The Draw() callback will be called now if some of the source
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1478 * bits were not in the visible region.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1479 * However, if we scroll too fast it can't keep up and the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1480 * update region gets messed up. This seems to be because copying
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1481 * un-Draw()n bits does not generate Draw() calls for the copy...
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1482 * I moved the hack to before the CopyBits() to reduce the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1483 * amount of additional waiting needed.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1484 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1485
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1486 //gui_x11_check_copy_area();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1487 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1488 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1489
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1490 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1491
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1492 /* ---------------- VimScrollBar ---------------- */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1493
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1494 /* BUG: XXX
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1495 * It seems that BScrollBar determine their direction not from
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1496 * "posture" but from if they are "tall" or "wide" in shape...
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1497 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1498 * Also, place them out of sight, because Vim enables them before
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1499 * they are positioned.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1500 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1501 VimScrollBar::VimScrollBar(scrollbar_T *g, orientation posture):
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1502 BScrollBar(posture == B_HORIZONTAL ? BRect(-100,-100,-10,-90) :
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1503 BRect(-100,-100,-90,-10),
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1504 "vim scrollbar", (BView *)NULL,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1505 0.0, 10.0, posture),
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1506 ignoreValue(-1),
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1507 scrollEventCount(0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1508 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1509 gsb = g;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1510 SetResizingMode(B_FOLLOW_NONE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1511 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1512
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1513 VimScrollBar::~VimScrollBar()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1514 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1515 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1516
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1517 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1518 VimScrollBar::ValueChanged(float newValue)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1519 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1520 if (ignoreValue >= 0.0 && newValue == ignoreValue) {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1521 ignoreValue = -1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1522 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1523 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1524 ignoreValue = -1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1525 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1526 * We want to throttle the amount of scroll messages generated.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1527 * Normally I presume you won't get a new message before we've
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1528 * handled the previous one, but because we're passing them on this
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1529 * happens very quickly. So instead we keep a counter of how many
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1530 * scroll events there are (or will be) in the VDCMP, and the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1531 * throttling happens at the receiving end.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1532 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1533 atomic_add(&scrollEventCount, 1);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1534
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1535 struct VimScrollBarMsg sm;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1536
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1537 sm.sb = this;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1538 sm.value = (long) newValue;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1539 sm.stillDragging = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1540
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1541 write_port(gui.vdcmp, VimMsg::ScrollBar, &sm, sizeof(sm));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1542
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1543 // calls gui_drag_scrollbar(sb, newValue, TRUE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1544 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1545
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1546 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1547 * When the mouse goes up, report that scrolling has stopped.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1548 * MouseUp() is NOT called when the mouse-up occurs outside
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1549 * the window, even though the thumb does move while the mouse
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1550 * is outside... This has some funny effects... XXX
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1551 * So we do special processing when the window de/activates.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1552 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1553 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1554 VimScrollBar::MouseUp(BPoint where)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1555 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1556 //BMessage *m = Window()->CurrentMessage();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1557 //m->PrintToStream();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1558
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1559 atomic_add(&scrollEventCount, 1);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1560
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1561 struct VimScrollBarMsg sm;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1562
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1563 sm.sb = this;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1564 sm.value = (long) Value();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1565 sm.stillDragging = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1566
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1567 write_port(gui.vdcmp, VimMsg::ScrollBar, &sm, sizeof(sm));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1568
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1569 // calls gui_drag_scrollbar(sb, newValue, FALSE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1570
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1571 Inherited::MouseUp(where);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1572 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1573
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1574 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1575 VimScrollBar::SetValue(float newValue)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1576 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1577 if (newValue == Value())
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1578 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1579
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1580 ignoreValue = newValue;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1581 Inherited::SetValue(newValue);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1582 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1583
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1584 /* ---------------- VimFont ---------------- */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1585
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1586 VimFont::VimFont(): BFont()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1587 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1588 init();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1589 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1590
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1591 VimFont::VimFont(const VimFont *rhs): BFont(rhs)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1592 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1593 init();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1594 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1595
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1596 VimFont::VimFont(const BFont *rhs): BFont(rhs)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1597 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1598 init();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1599 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1600
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1601 VimFont::VimFont(const VimFont &rhs): BFont(rhs)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1602 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1603 init();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1604 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1605
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1606 VimFont::~VimFont()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1607 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1608 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1609
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1610 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1611 VimFont::init()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1612 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1613 next = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1614 refcount = 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1615 name = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1616 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1617
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1618 /* ---------------- ---------------- */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1619
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1620 // some global variables
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1621 static char appsig[] = "application/x-vnd.Rhialto-Vim-5";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1622 key_map *keyMap;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1623 char *keyMapChars;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1624 int main_exitcode = 127;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1625
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1626 status_t
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1627 gui_beos_process_event(bigtime_t timeout)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1628 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1629 struct VimMsg vm;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1630 long what;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1631 ssize_t size;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1632
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1633 size = read_port_etc(gui.vdcmp, &what, &vm, sizeof(vm),
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1634 B_TIMEOUT, timeout);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1635
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1636 if (size >= 0) {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1637 switch (what) {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1638 case VimMsg::Key:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1639 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1640 char_u *string = vm.u.Key.chars;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1641 int len = vm.u.Key.length;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1642 if (len == 1 && string[0] == Ctrl_chr('C')) {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1643 trash_input_buf();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1644 got_int = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1645 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1646 add_to_input_buf(string, len);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1647 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1648 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1649 case VimMsg::Resize:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1650 gui_resize_shell(vm.u.NewSize.width, vm.u.NewSize.height);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1651 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1652 case VimMsg::ScrollBar:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1653 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1654 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1655 * If loads of scroll messages queue up, use only the last
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1656 * one. Always report when the scrollbar stops dragging.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1657 * This is not perfect yet anyway: these events are queued
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1658 * yet again, this time in the keyboard input buffer.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1659 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1660 int32 oldCount =
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1661 atomic_add(&vm.u.Scroll.sb->scrollEventCount, -1);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1662 if (oldCount <= 1 || !vm.u.Scroll.stillDragging)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1663 gui_drag_scrollbar(vm.u.Scroll.sb->getGsb(),
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1664 vm.u.Scroll.value, vm.u.Scroll.stillDragging);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1665 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1666 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1667 case VimMsg::Menu:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1668 gui_menu_cb(vm.u.Menu.guiMenu);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1669 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1670 case VimMsg::Mouse:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1671 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1672 int32 oldCount;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1673 if (vm.u.Mouse.button == MOUSE_DRAG)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1674 oldCount =
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1675 atomic_add(&gui.vimTextArea->mouseDragEventCount, -1);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1676 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1677 oldCount = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1678 if (oldCount <= 1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1679 gui_send_mouse_event(vm.u.Mouse.button, vm.u.Mouse.x,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1680 vm.u.Mouse.y, vm.u.Mouse.repeated_click,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1681 vm.u.Mouse.modifiers);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1682 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1683 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1684 case VimMsg::Focus:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1685 gui.in_focus = vm.u.Focus.active;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1686 /* XXX Signal that scrollbar dragging has stopped?
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1687 * This is needed because we don't get a MouseUp if
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1688 * that happens while outside the window... :-(
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1689 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1690 if (gui.dragged_sb) {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1691 gui.dragged_sb = SBAR_NONE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1692 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1693 gui_update_cursor(TRUE, FALSE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1694 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1695 case VimMsg::Refs:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1696 ::RefsReceived(vm.u.Refs.message, vm.u.Refs.changedir);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1697 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1698 default:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1699 // unrecognised message, ignore it
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1700 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1701 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1702 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1703
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1704 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1705 * If size < B_OK, it is an error code.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1706 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1707 return size;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1708 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1709
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1710 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1711 * Here are some functions to protect access to ScreenLines[] and
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1712 * LineOffset[]. These are used from the window thread to respond
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1713 * to a Draw() callback. When that occurs, the window is already
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1714 * locked by the system.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1715 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1716 * Other code that needs to lock is any code that changes these
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1717 * variables. Other read-only access, or access merely to the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1718 * contents of the screen buffer, need not be locked.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1719 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1720 * If there is no window, don't call Lock() but do succeed.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1721 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1722
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1723 int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1724 vim_lock_screen()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1725 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1726 return !gui.vimWindow || gui.vimWindow->Lock();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1727 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1728
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1729 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1730 vim_unlock_screen()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1731 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1732 if (gui.vimWindow)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1733 gui.vimWindow->Unlock();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1734 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1735
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1736 #define RUN_BAPPLICATION_IN_NEW_THREAD 0
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1737
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1738 #if RUN_BAPPLICATION_IN_NEW_THREAD
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1739
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1740 int32
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1741 run_vimapp(void *args)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1742 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1743 VimApp app(appsig);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1744
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1745 gui.vimApp = &app;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1746 app.Run(); /* Run until Quit() called */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1747
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1748 return 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1749 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1750
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1751 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1752
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1753 int32
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1754 call_main(void *args)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1755 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1756 struct MainArgs *ma = (MainArgs *)args;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1757
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1758 return main(ma->argc, ma->argv);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1759 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1760 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1761
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1762 extern "C" {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1763
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1764 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1765 * Parse the GUI related command-line arguments. Any arguments used are
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1766 * deleted from argv, and *argc is decremented accordingly. This is called
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1767 * when vim is started, whether or not the GUI has been started.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1768 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1769 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1770 gui_mch_prepare(
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1771 int *argc,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1772 char **argv)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1773 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1774 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1775 * We don't have any command line arguments for the BeOS GUI yet,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1776 * but this is an excellent place to create our Application object.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1777 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1778 if (!gui.vimApp) {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1779 thread_info tinfo;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1780 get_thread_info(find_thread(NULL), &tinfo);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1781
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1782 /* May need the port very early on to process RefsReceived() */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1783 gui.vdcmp = create_port(B_MAX_PORT_COUNT, "vim VDCMP");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1784
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1785 #if RUN_BAPPLICATION_IN_NEW_THREAD
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1786 thread_id tid = spawn_thread(run_vimapp, "vim VimApp",
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1787 tinfo.priority, NULL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1788 if (tid >= B_OK) {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1789 resume_thread(tid);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1790 } else {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1791 getout(1);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1792 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1793 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1794 MainArgs ma = { *argc, argv };
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1795 thread_id tid = spawn_thread(call_main, "vim main()",
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1796 tinfo.priority, &ma);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1797 if (tid >= B_OK) {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1798 VimApp app(appsig);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1799
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1800 gui.vimApp = &app;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1801 resume_thread(tid);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1802 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1803 * This is rather horrible.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1804 * call_main will call main() again...
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1805 * There will be no infinite recursion since
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1806 * gui.vimApp is set now.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1807 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1808 app.Run(); /* Run until Quit() called */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1809 //fprintf(stderr, "app.Run() returned...\n");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1810 status_t dummy_exitcode;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1811 (void)wait_for_thread(tid, &dummy_exitcode);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1812
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1813 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1814 * This path should be the normal one taken to exit Vim.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1815 * The main() thread calls mch_exit() which calls
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1816 * gui_mch_exit() which terminates its thread.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1817 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1818 exit(main_exitcode);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1819 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1820 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1821 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1822 /* Don't fork() when starting the GUI. Spawned threads are not
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1823 * duplicated with a fork(). The result is a mess.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1824 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1825 gui.dofork = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1826 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1827 * XXX Try to determine whether we were started from
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1828 * the Tracker or the terminal.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1829 * It would be nice to have this work, because the Tracker
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1830 * follows symlinks, so even if you double-click on gvim,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1831 * when it is a link to vim it will still pass a command name
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1832 * of vim...
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1833 * We try here to see if stdin comes from /dev/null. If so,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1834 * (or if there is an error, which should never happen) start the GUI.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1835 * This does the wrong thing for vim - </dev/null, and we're
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1836 * too early to see the command line parsing. Tough.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1837 * On the other hand, it starts the gui for vim file & which is nice.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1838 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1839 if (!isatty(0)) {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1840 struct stat stat_stdin, stat_dev_null;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1841
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1842 if (fstat(0, &stat_stdin) == -1 ||
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1843 stat("/dev/null", &stat_dev_null) == -1 ||
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1844 (stat_stdin.st_dev == stat_dev_null.st_dev &&
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1845 stat_stdin.st_ino == stat_dev_null.st_ino))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1846 gui.starting = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1847 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1848 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1849
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1850 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1851 * Check if the GUI can be started. Called before gvimrc is sourced.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1852 * Return OK or FAIL.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1853 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1854 int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1855 gui_mch_init_check(void)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1856 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1857 return OK; /* TODO: GUI can always be started? */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1858 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1859
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1860 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1861 * Initialise the GUI. Create all the windows, set up all the call-backs
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1862 * etc.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1863 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1864 int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1865 gui_mch_init()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1866 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1867 gui.def_norm_pixel = RGB(0x00, 0x00, 0x00); // black
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1868 gui.def_back_pixel = RGB(0xFF, 0xFF, 0xFF); // white
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1869 gui.norm_pixel = gui.def_norm_pixel;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1870 gui.back_pixel = gui.def_back_pixel;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1871
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1872 gui.scrollbar_width = (int) B_V_SCROLL_BAR_WIDTH;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1873 gui.scrollbar_height = (int) B_H_SCROLL_BAR_HEIGHT;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1874 #ifdef FEAT_MENU
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1875 gui.menu_height = 19; // initial guess -
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1876 // correct for my default settings
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1877 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1878 gui.border_offset = 3; // coordinates are inside window borders
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1879
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1880 if (gui.vdcmp < B_OK)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1881 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1882 get_key_map(&keyMap, &keyMapChars);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1883
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1884 gui.vimWindow = new VimWindow(); /* hidden and locked */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1885 if (!gui.vimWindow)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1886 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1887
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1888 gui.vimWindow->Run(); /* Run() unlocks but does not show */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1889
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1890 /* Get the colors from the "Normal" group (set in syntax.c or in a vimrc
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1891 * file) */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1892 set_normal_colors();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1893
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1894 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1895 * Check that none of the colors are the same as the background color
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1896 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1897 gui_check_colors();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1898
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1899 /* Get the colors for the highlight groups (gui_check_colors() might have
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1900 * changed them) */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1901 highlight_gui_started(); /* re-init colors and fonts */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1902
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1903 gui_mch_new_colors(); /* window must exist for this */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1904
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1905 return OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1906 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1907
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1908 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1909 * Called when the foreground or background color has been changed.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1910 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1911 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1912 gui_mch_new_colors()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1913 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1914 rgb_color rgb = GUI_TO_RGB(gui.back_pixel);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1915
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1916 if (gui.vimWindow->Lock()) {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1917 gui.vimForm->SetViewColor(rgb);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1918 // Does this not have too much effect for those small rectangles?
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1919 gui.vimForm->Invalidate();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1920 gui.vimWindow->Unlock();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1921 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1922 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1923
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1924 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1925 * Open the GUI window which was created by a call to gui_mch_init().
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1926 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1927 int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1928 gui_mch_open()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1929 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1930 if (gui_win_x != -1 && gui_win_y != -1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1931 gui_mch_set_winpos(gui_win_x, gui_win_y);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1932
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1933 /* Actually open the window */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1934 if (gui.vimWindow->Lock()) {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1935 gui.vimWindow->Show();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1936 gui.vimWindow->Unlock();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1937
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1938 #if USE_THREAD_FOR_INPUT_WITH_TIMEOUT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1939 /* Kill the thread that may have been created for the Terminal */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1940 beos_cleanup_read_thread();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1941 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1942
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1943 return OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1944 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1945
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1946 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1947 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1948
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1949 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1950 gui_mch_exit(int vim_exitcode)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1951 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1952 if (gui.vimWindow) {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1953 thread_id tid = gui.vimWindow->Thread();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1954 gui.vimWindow->Lock();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1955 gui.vimWindow->Quit();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1956 /* Wait until it is truely gone */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1957 int32 exitcode;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1958 wait_for_thread(tid, &exitcode);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1959 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1960 delete_port(gui.vdcmp);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1961 #if !RUN_BAPPLICATION_IN_NEW_THREAD
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1962 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1963 * We are in the main() thread - quit the App thread and
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1964 * quit ourselves (passing on the exitcode). Use a global since the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1965 * value from exit_thread() is only used if wait_for_thread() is
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1966 * called in time (race condition).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1967 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1968 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1969 if (gui.vimApp) {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1970 VimTextAreaView::guiBlankMouse(false);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1971
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1972 main_exitcode = vim_exitcode;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1973 #if RUN_BAPPLICATION_IN_NEW_THREAD
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1974 thread_id tid = gui.vimApp->Thread();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1975 int32 exitcode;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1976 gui.vimApp->Lock();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1977 gui.vimApp->Quit();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1978 gui.vimApp->Unlock();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1979 wait_for_thread(tid, &exitcode);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1980 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1981 gui.vimApp->Lock();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1982 gui.vimApp->Quit();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1983 gui.vimApp->Unlock();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1984 /* suicide */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1985 exit_thread(vim_exitcode);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1986 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1987 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1988 /* If we are somehow still here, let mch_exit() handle things. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1989 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1990
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1991 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1992 * Get the position of the top left corner of the window.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1993 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1994 int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1995 gui_mch_get_winpos(int *x, int *y)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1996 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1997 /* TODO */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1998 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1999 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2000
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2001 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2002 * Set the position of the top left corner of the window to the given
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2003 * coordinates.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2004 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2005 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2006 gui_mch_set_winpos(int x, int y)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2007 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2008 /* TODO */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2009 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2010
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2011 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2012 * Set the size of the window to the given width and height in pixels.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2013 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2014 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2015 gui_mch_set_shellsize(
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2016 int width,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2017 int height,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2018 int min_width,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2019 int min_height,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2020 int base_width,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2021 int base_height)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2022 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2023 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2024 * We are basically given the size of the VimForm, if I understand
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2025 * correctly. Since it fills the window completely, this will also
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2026 * be the size of the window.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2027 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2028 if (gui.vimWindow->Lock()) {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2029 gui.vimWindow->ResizeTo(width - PEN_WIDTH, height - PEN_WIDTH);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2030
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2031 /* set size limits */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2032 float minWidth, maxWidth, minHeight, maxHeight;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2033
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2034 gui.vimWindow->GetSizeLimits(&minWidth, &maxWidth,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2035 &minHeight, &maxHeight);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2036 gui.vimWindow->SetSizeLimits(min_width, maxWidth,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2037 min_height, maxHeight);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2038
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2039 #if HAVE_R3_OR_LATER
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2040 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2041 * Set the resizing alignment depending on font size.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2042 * XXX This is untested, since I don't have R3 yet.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2043 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2044 SetWindowAlignment(
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2045 B_PIXEL_ALIGNMENT, // window_alignment mode,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2046 1, // int32 h,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2047 0, // int32 hOffset = 0,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2048 gui.char_width, // int32 width = 0,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2049 base_width, // int32 widthOffset = 0,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2050 1, // int32 v = 0,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2051 0, // int32 vOffset = 0,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2052 gui.char_height, // int32 height = 0,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2053 base_height // int32 heightOffset = 0
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2054 );
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2055 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2056 /* don't know what to do with base_{width,height}. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2057 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2058
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2059 gui.vimWindow->Unlock();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2060 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2061 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2062
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2063 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2064 gui_mch_get_screen_dimensions(
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2065 int *screen_w,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2066 int *screen_h)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2067 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2068 BRect frame;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2069
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2070 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2071 BScreen screen(gui.vimWindow);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2072
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2073 if (screen.IsValid()) {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2074 frame = screen.Frame();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2075 } else {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2076 frame.right = 640;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2077 frame.bottom = 480;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2078 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2079 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2080
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2081 /* XXX approximations... */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2082 *screen_w = (int) frame.right - 2 * gui.scrollbar_width - 20;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2083 *screen_h = (int) frame.bottom - gui.scrollbar_height
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2084 #ifdef FEAT_MENU
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2085 - gui.menu_height
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2086 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2087 - 30;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2088 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2089
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2090 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2091 gui_mch_set_text_area_pos(
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2092 int x,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2093 int y,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2094 int w,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2095 int h)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2096 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2097 if (!gui.vimTextArea)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2098 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2099
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2100 if (gui.vimWindow->Lock()) {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2101 gui.vimTextArea->MoveTo(x, y);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2102 gui.vimTextArea->ResizeTo(w - PEN_WIDTH, h - PEN_WIDTH);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2103 gui.vimWindow->Unlock();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2104 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2105 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2106
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2107
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2108 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2109 * Scrollbar stuff:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2110 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2111
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2112 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2113 gui_mch_enable_scrollbar(
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2114 scrollbar_T *sb,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2115 int flag)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2116 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2117 VimScrollBar *vsb = sb->id;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2118 if (gui.vimWindow->Lock()) {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2119 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2120 * This function is supposed to be idempotent, but Show()/Hide()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2121 * is not. Therefore we test if they are needed.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2122 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2123 if (flag) {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2124 if (vsb->IsHidden()) {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2125 vsb->Show();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2126 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2127 } else {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2128 if (!vsb->IsHidden()) {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2129 vsb->Hide();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2130 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2131 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2132 gui.vimWindow->Unlock();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2133 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2134 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2135
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2136 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2137 gui_mch_set_scrollbar_thumb(
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2138 scrollbar_T *sb,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2139 int val,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2140 int size,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2141 int max)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2142 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2143 if (gui.vimWindow->Lock()) {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2144 VimScrollBar *s = sb->id;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2145 if (max == 0) {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2146 s->SetValue(0);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2147 s->SetRange(0.0, 0.0);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2148 } else {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2149 s->SetProportion((float)size / (max + 1.0));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2150 s->SetSteps(1.0, size > 5 ? size - 2 : size);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2151 #ifndef SCROLL_PAST_END // really only defined in gui.c...
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2152 max = max + 1 - size;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2153 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2154 if (max < s->Value()) {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2155 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2156 * If the new maximum is lower than the current value,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2157 * setting it would cause the value to be clipped and
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2158 * therefore a ValueChanged() call.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2159 * We avoid this by setting the value first, because
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2160 * it presumably is <= max.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2161 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2162 s->SetValue(val);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2163 s->SetRange(0.0, max);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2164 } else {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2165 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2166 * In the other case, set the range first, since the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2167 * new value might be higher than the current max.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2168 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2169 s->SetRange(0.0, max);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2170 s->SetValue(val);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2171 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2172 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2173 gui.vimWindow->Unlock();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2174 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2175 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2176
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2177 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2178 gui_mch_set_scrollbar_pos(
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2179 scrollbar_T *sb,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2180 int x,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2181 int y,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2182 int w,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2183 int h)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2184 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2185 if (gui.vimWindow->Lock()) {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2186 VimScrollBar *vsb = sb->id;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2187 vsb->MoveTo(x, y);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2188 vsb->ResizeTo(w - PEN_WIDTH, h - PEN_WIDTH);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2189 gui.vimWindow->Unlock();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2190 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2191 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2192
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2193 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2194 gui_mch_create_scrollbar(
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2195 scrollbar_T *sb,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2196 int orient) /* SBAR_VERT or SBAR_HORIZ */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2197 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2198 orientation posture =
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2199 (orient == SBAR_HORIZ) ? B_HORIZONTAL : B_VERTICAL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2200
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2201 VimScrollBar *vsb = sb->id = new VimScrollBar(sb, posture);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2202 if (gui.vimWindow->Lock()) {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2203 vsb->SetTarget(gui.vimTextArea);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2204 vsb->Hide();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2205 gui.vimForm->AddChild(vsb);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2206 gui.vimWindow->Unlock();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2207 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2208 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2209
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2210 #if defined(FEAT_WINDOWS) || defined(PROTO)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2211 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2212 gui_mch_destroy_scrollbar(
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2213 scrollbar_T *sb)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2214 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2215 if (gui.vimWindow->Lock()) {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2216 sb->id->RemoveSelf();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2217 delete sb->id;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2218 gui.vimWindow->Unlock();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2219 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2220 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2221 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2222
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2223 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2224 * Cursor blink functions.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2225 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2226 * This is a simple state machine:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2227 * BLINK_NONE not blinking at all
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2228 * BLINK_OFF blinking, cursor is not shown
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2229 * BLINK_ON blinking, cursor is shown
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2230 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2231
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2232 #define BLINK_NONE 0
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2233 #define BLINK_OFF 1
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2234 #define BLINK_ON 2
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2235
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2236 static int blink_state = BLINK_NONE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2237 static long_u blink_waittime = 700;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2238 static long_u blink_ontime = 400;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2239 static long_u blink_offtime = 250;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2240 static int blink_timer = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2241
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2242 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2243 gui_mch_set_blinking(
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2244 long waittime,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2245 long on,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2246 long off)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2247 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2248 /* TODO */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2249 blink_waittime = waittime;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2250 blink_ontime = on;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2251 blink_offtime = off;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2252 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2253
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2254 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2255 * Stop the cursor blinking. Show the cursor if it wasn't shown.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2256 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2257 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2258 gui_mch_stop_blink()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2259 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2260 /* TODO */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2261 if (blink_timer != 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2262 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2263 //XtRemoveTimeOut(blink_timer);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2264 blink_timer = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2265 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2266 if (blink_state == BLINK_OFF)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2267 gui_update_cursor(TRUE, FALSE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2268 blink_state = BLINK_NONE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2269 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2270
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2271 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2272 * Start the cursor blinking. If it was already blinking, this restarts the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2273 * waiting time and shows the cursor.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2274 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2275 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2276 gui_mch_start_blink()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2277 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2278 /* TODO */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2279 if (blink_timer != 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2280 ;//XtRemoveTimeOut(blink_timer);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2281 /* Only switch blinking on if none of the times is zero */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2282 if (blink_waittime && blink_ontime && blink_offtime && gui.in_focus)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2283 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2284 blink_timer = 1; //XtAppAddTimeOut(app_context, blink_waittime,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2285 blink_state = BLINK_ON;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2286 gui_update_cursor(TRUE, FALSE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2287 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2288 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2289
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2290 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2291 * Initialise vim to use the font with the given name. Return FAIL if the font
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2292 * could not be loaded, OK otherwise.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2293 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2294 int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2295 gui_mch_init_font(
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2296 char_u *font_name,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2297 int fontset)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2298 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2299 if (gui.vimWindow->Lock())
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2300 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2301 int rc = gui.vimTextArea->mchInitFont(font_name);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2302 gui.vimWindow->Unlock();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2303
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2304 return rc;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2305 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2306
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2307 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2308 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2309
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2310 int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2311 gui_mch_adjust_charsize()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2312 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2313 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2314 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2315
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2316 GuiFont
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2317 gui_mch_get_font(
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2318 char_u *name,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2319 int giveErrorIfMissing)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2320 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2321 VimFont *font = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2322 static VimFont *fontList = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2323
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2324 if (!gui.in_use) /* can't do this when GUI not running */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2325 return NOFONT;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2326
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2327 if (!name)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2328 name = (char_u *)"be_fixed_font";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2329
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2330 VimFont *flp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2331 for (flp = fontList; flp; flp = flp->next) {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2332 if (STRCMP(name, flp->name) == 0) {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2333 flp->refcount++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2334 return (GuiFont)flp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2335 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2336 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2337
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2338 font = new VimFont(be_fixed_font);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2339
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2340 /* Set some universal features: */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2341 font->SetSpacing(B_FIXED_SPACING);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2342 font->SetEncoding(B_ISO_8859_1);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2343
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2344 /* Remember font for later use */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2345 font->name = vim_strsave(name);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2346 font->next = fontList;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2347 fontList = font;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2348
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2349 font_family family;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2350 font_style style;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2351 int size;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2352 int len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2353 char_u *end;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2354
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2355 #ifdef never
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2356 // This leads to SEGV/BUS on R4+
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2357 // Replace underscores with spaces, and I can't see why ?
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2358 // richard@whitequeen.com jul 99
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2359 while (end = (char_u *)strchr((char *)name, '_'))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2360 *end = ' ';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2361 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2362 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2363 * Parse font names as Family/Style/Size.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2364 * On errors, just keep the be_fixed_font.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2365 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2366 end = (char_u *)strchr((char *)name, '/');
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2367 if (!end)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2368 goto error;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2369 strncpy(family, (char *)name, len = end - name);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2370 family[len] = '\0';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2371
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2372 name = end + 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2373 end = (char_u *)strchr((char *)name, '/');
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2374 if (!end)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2375 goto error;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2376 strncpy(style, (char *)name, len = end - name);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2377 style[len] = '\0';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2378
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2379 name = end + 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2380 size = atoi((char *)name);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2381 if (size <= 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2382 goto error;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2383
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2384 font->SetFamilyAndStyle(family, style);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2385 font->SetSize(size);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2386 font->SetSpacing(B_FIXED_SPACING);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2387 font->SetEncoding(B_ISO_8859_1);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2388 //font->PrintToStream();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2389
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2390 return (GuiFont)font;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2391
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2392 error:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2393 if (giveErrorIfMissing)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2394 EMSG2("(fe0) Unknown font: %s", name);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2395
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2396 return (GuiFont)font;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2397 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2398
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2399 /*
37
fdf55076c53f updated for version 7.0022
vimboss
parents: 7
diff changeset
2400 * Return the name of font "font" in allocated memory.
fdf55076c53f updated for version 7.0022
vimboss
parents: 7
diff changeset
2401 */
fdf55076c53f updated for version 7.0022
vimboss
parents: 7
diff changeset
2402 char_u *
fdf55076c53f updated for version 7.0022
vimboss
parents: 7
diff changeset
2403 gui_mch_get_fontname(GuiFont font, char_u *name)
fdf55076c53f updated for version 7.0022
vimboss
parents: 7
diff changeset
2404 {
fdf55076c53f updated for version 7.0022
vimboss
parents: 7
diff changeset
2405 return vim_strsave(((VimFont *)font)->name);
fdf55076c53f updated for version 7.0022
vimboss
parents: 7
diff changeset
2406 }
fdf55076c53f updated for version 7.0022
vimboss
parents: 7
diff changeset
2407
fdf55076c53f updated for version 7.0022
vimboss
parents: 7
diff changeset
2408 /*
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2409 * Set the current text font.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2410 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2411 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2412 gui_mch_set_font(
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2413 GuiFont font)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2414 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2415 if (gui.vimWindow->Lock()) {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2416 VimFont *vf = (VimFont *)font;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2417
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2418 gui.vimTextArea->SetFont(vf);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2419
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2420 gui.char_width = (int) vf->StringWidth("n");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2421 font_height fh;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2422 vf->GetHeight(&fh);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2423 gui.char_height = (int)(fh.ascent + 0.9999)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2424 + (int)(fh.descent + 0.9999) + (int)(fh.leading + 0.9999);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2425 gui.char_ascent = (int)(fh.ascent + 0.9999);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2426
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2427 gui.vimWindow->Unlock();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2428 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2429 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2430
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2431 #if 0 /* not used */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2432 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2433 * Return TRUE if the two fonts given are equivalent.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2434 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2435 int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2436 gui_mch_same_font(
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2437 GuiFont f1,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2438 GuiFont f2)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2439 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2440 VimFont *vf1 = (VimFont *)f1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2441 VimFont *vf2 = (VimFont *)f2;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2442
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2443 return f1 == f2 ||
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2444 (vf1->FamilyAndStyle() == vf2->FamilyAndStyle() &&
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2445 vf1->Size() == vf2->Size());
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2446 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2447 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2448
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2449 /* XXX TODO This is apparently never called... */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2450 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2451 gui_mch_free_font(
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2452 GuiFont font)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2453 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2454 VimFont *f = (VimFont *)font;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2455 if (--f->refcount <= 0) {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2456 if (f->refcount < 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2457 fprintf(stderr, "VimFont: refcount < 0\n");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2458 delete f;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2459 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2460 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2461
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2462 static int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2463 hex_digit(int c)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2464 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2465 if (isdigit(c))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2466 return c - '0';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2467 c = TOLOWER_ASC(c);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2468 if (c >= 'a' && c <= 'f')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2469 return c - 'a' + 10;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2470 return -1000;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2471 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2472
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2473 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2474 * This function has been lifted from gui_w32.c and extended a bit.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2475 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2476 * Return the Pixel value (color) for the given color name.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2477 * Return INVALCOLOR for error.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2478 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2479 guicolor_T
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2480 gui_mch_get_color(
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2481 char_u *name)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2482 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2483 typedef struct GuiColourTable
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2484 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2485 char *name;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2486 guicolor_T colour;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2487 } GuiColourTable;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2488
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2489 #define NSTATIC_COLOURS 32
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2490 #define NDYNAMIC_COLOURS 33
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2491 #define NCOLOURS (NSTATIC_COLOURS + NDYNAMIC_COLOURS)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2492
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2493 static GuiColourTable table[NCOLOURS] =
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2494 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2495 {"Black", RGB(0x00, 0x00, 0x00)},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2496 {"DarkGray", RGB(0x80, 0x80, 0x80)},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2497 {"DarkGrey", RGB(0x80, 0x80, 0x80)},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2498 {"Gray", RGB(0xC0, 0xC0, 0xC0)},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2499 {"Grey", RGB(0xC0, 0xC0, 0xC0)},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2500 {"LightGray", RGB(0xD3, 0xD3, 0xD3)},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2501 {"LightGrey", RGB(0xD3, 0xD3, 0xD3)},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2502 {"White", RGB(0xFF, 0xFF, 0xFF)},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2503 {"DarkRed", RGB(0x80, 0x00, 0x00)},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2504 {"Red", RGB(0xFF, 0x00, 0x00)},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2505 {"LightRed", RGB(0xFF, 0xA0, 0xA0)},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2506 {"DarkBlue", RGB(0x00, 0x00, 0x80)},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2507 {"Blue", RGB(0x00, 0x00, 0xFF)},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2508 {"LightBlue", RGB(0xA0, 0xA0, 0xFF)},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2509 {"DarkGreen", RGB(0x00, 0x80, 0x00)},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2510 {"Green", RGB(0x00, 0xFF, 0x00)},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2511 {"LightGreen", RGB(0xA0, 0xFF, 0xA0)},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2512 {"DarkCyan", RGB(0x00, 0x80, 0x80)},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2513 {"Cyan", RGB(0x00, 0xFF, 0xFF)},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2514 {"LightCyan", RGB(0xA0, 0xFF, 0xFF)},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2515 {"DarkMagenta", RGB(0x80, 0x00, 0x80)},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2516 {"Magenta", RGB(0xFF, 0x00, 0xFF)},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2517 {"LightMagenta", RGB(0xFF, 0xA0, 0xFF)},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2518 {"Brown", RGB(0x80, 0x40, 0x40)},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2519 {"Yellow", RGB(0xFF, 0xFF, 0x00)},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2520 {"LightYellow", RGB(0xFF, 0xFF, 0xA0)},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2521 {"DarkYellow", RGB(0xBB, 0xBB, 0x00)},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2522 {"SeaGreen", RGB(0x2E, 0x8B, 0x57)},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2523 {"Orange", RGB(0xFF, 0xA5, 0x00)},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2524 {"Purple", RGB(0xA0, 0x20, 0xF0)},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2525 {"SlateBlue", RGB(0x6A, 0x5A, 0xCD)},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2526 {"Violet", RGB(0xEE, 0x82, 0xEE)},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2527 };
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2528
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2529 static int endColour = NSTATIC_COLOURS;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2530 static int newColour = NSTATIC_COLOURS;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2531
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2532 int r, g, b;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2533 int i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2534
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2535 if (name[0] == '#' && STRLEN(name) == 7)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2536 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2537 /* Name is in "#rrggbb" format */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2538 r = hex_digit(name[1]) * 16 + hex_digit(name[2]);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2539 g = hex_digit(name[3]) * 16 + hex_digit(name[4]);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2540 b = hex_digit(name[5]) * 16 + hex_digit(name[6]);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2541 if (r < 0 || g < 0 || b < 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2542 return INVALCOLOR;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2543 return RGB(r, g, b);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2544 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2545 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2546 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2547 /* Check if the name is one of the colours we know */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2548 for (i = 0; i < endColour; i++)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2549 if (STRICMP(name, table[i].name) == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2550 return table[i].colour;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2551 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2552
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2553 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2554 * Last attempt. Look in the file "$VIM/rgb.txt".
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2555 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2556 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2557 #define LINE_LEN 100
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2558 FILE *fd;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2559 char line[LINE_LEN];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2560 char_u *fname;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2561
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2562 fname = expand_env_save((char_u *)"$VIM/rgb.txt");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2563 if (fname == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2564 return INVALCOLOR;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2565
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2566 fd = fopen((char *)fname, "rt");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2567 vim_free(fname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2568 if (fd == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2569 return INVALCOLOR;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2570
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2571 while (!feof(fd))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2572 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2573 int len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2574 int pos;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2575 char *colour;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2576
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2577 fgets(line, LINE_LEN, fd);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2578 len = strlen(line);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2579
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2580 if (len <= 1 || line[len-1] != '\n')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2581 continue;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2582
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2583 line[len-1] = '\0';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2584
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2585 i = sscanf(line, "%d %d %d %n", &r, &g, &b, &pos);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2586 if (i != 3)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2587 continue;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2588
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2589 colour = line + pos;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2590
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2591 if (STRICMP(colour, name) == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2592 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2593 fclose(fd);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2594 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2595 * Now remember this colour in the table.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2596 * A LRU scheme might be better but this is simpler.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2597 * Or could use a growing array.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2598 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2599 guicolor_T gcolour = RGB(r,g,b);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2600
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2601 vim_free(table[newColour].name);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2602 table[newColour].name = (char *)vim_strsave((char_u *)colour);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2603 table[newColour].colour = gcolour;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2604
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2605 newColour++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2606 if (newColour >= NCOLOURS)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2607 newColour = NSTATIC_COLOURS;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2608 if (endColour < NCOLOURS)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2609 endColour = newColour;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2610
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2611 return gcolour;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2612 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2613 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2614
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2615 fclose(fd);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2616 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2617
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2618 return INVALCOLOR;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2619 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2620
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2621 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2622 * Set the current text foreground color.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2623 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2624 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2625 gui_mch_set_fg_color(
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2626 guicolor_T color)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2627 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2628 rgb_color rgb = GUI_TO_RGB(color);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2629 if (gui.vimWindow->Lock()) {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2630 gui.vimTextArea->SetHighColor(rgb);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2631 gui.vimWindow->Unlock();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2632 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2633 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2634
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2635 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2636 * Set the current text background color.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2637 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2638 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2639 gui_mch_set_bg_color(
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2640 guicolor_T color)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2641 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2642 rgb_color rgb = GUI_TO_RGB(color);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2643 if (gui.vimWindow->Lock()) {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2644 gui.vimTextArea->SetLowColor(rgb);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2645 gui.vimWindow->Unlock();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2646 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2647 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2648
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2649 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2650 gui_mch_draw_string(
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2651 int row,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2652 int col,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2653 char_u *s,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2654 int len,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2655 int flags)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2656 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2657 if (gui.vimWindow->Lock()) {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2658 gui.vimTextArea->mchDrawString(row, col, s, len, flags);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2659 gui.vimWindow->Unlock();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2660 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2661 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2662
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2663 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2664 * Return OK if the key with the termcap name "name" is supported.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2665 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2666 int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2667 gui_mch_haskey(
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2668 char_u *name)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2669 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2670 int i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2671
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2672 for (i = 0; special_keys[i].BeKeys != 0; i++)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2673 if (name[0] == special_keys[i].vim_code0 &&
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2674 name[1] == special_keys[i].vim_code1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2675 return OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2676 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2677 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2678
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2679 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2680 gui_mch_beep()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2681 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2682 ::beep();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2683 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2684
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2685 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2686 gui_mch_flash(int msec)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2687 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2688 /* Do a visual beep by reversing the foreground and background colors */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2689
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2690 if (gui.vimWindow->Lock()) {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2691 BRect rect = gui.vimTextArea->Bounds();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2692
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2693 gui.vimTextArea->SetDrawingMode(B_OP_INVERT);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2694 gui.vimTextArea->FillRect(rect);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2695 gui.vimTextArea->Sync();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2696 snooze(msec * 1000); /* wait for a few msec */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2697 gui.vimTextArea->FillRect(rect);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2698 gui.vimTextArea->SetDrawingMode(B_OP_COPY);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2699 gui.vimTextArea->Flush();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2700 gui.vimWindow->Unlock();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2701 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2702 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2703
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2704 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2705 * Invert a rectangle from row r, column c, for nr rows and nc columns.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2706 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2707 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2708 gui_mch_invert_rectangle(
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2709 int r,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2710 int c,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2711 int nr,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2712 int nc)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2713 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2714 BRect rect;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2715 rect.left = FILL_X(c);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2716 rect.top = FILL_Y(r);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2717 rect.right = rect.left + nc * gui.char_width - PEN_WIDTH;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2718 rect.bottom = rect.top + nr * gui.char_height - PEN_WIDTH;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2719
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2720 if (gui.vimWindow->Lock()) {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2721 gui.vimTextArea->SetDrawingMode(B_OP_INVERT);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2722 gui.vimTextArea->FillRect(rect);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2723 gui.vimTextArea->SetDrawingMode(B_OP_COPY);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2724 gui.vimWindow->Unlock();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2725 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2726 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2727
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2728 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2729 * Iconify the GUI window.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2730 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2731 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2732 gui_mch_iconify()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2733 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2734 if (gui.vimWindow->Lock()) {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2735 gui.vimWindow->Minimize(true);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2736 gui.vimWindow->Unlock();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2737 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2738 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2739
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2740 #if defined(FEAT_EVAL) || defined(PROTO)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2741 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2742 * Bring the Vim window to the foreground.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2743 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2744 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2745 gui_mch_set_foreground()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2746 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2747 /* TODO */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2748 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2749 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2750
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2751 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2752 * Set the window title
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2753 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2754 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2755 gui_mch_settitle(
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2756 char_u *title,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2757 char_u *icon)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2758 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2759 if (gui.vimWindow->Lock()) {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2760 gui.vimWindow->SetTitle((char *)title);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2761 gui.vimWindow->Unlock();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2762 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2763 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2764
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2765 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2766 * Draw a cursor without focus.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2767 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2768 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2769 gui_mch_draw_hollow_cursor(guicolor_T color)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2770 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2771 gui_mch_set_fg_color(color);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2772
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2773 BRect r;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2774 r.left = FILL_X(gui.col);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2775 r.top = FILL_Y(gui.row);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2776 r.right = r.left + gui.char_width - PEN_WIDTH;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2777 r.bottom = r.top + gui.char_height - PEN_WIDTH;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2778
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2779 if (gui.vimWindow->Lock()) {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2780 gui.vimTextArea->StrokeRect(r);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2781 gui.vimWindow->Unlock();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2782 //gui_mch_flush();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2783 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2784 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2785
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2786 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2787 * Draw part of a cursor, only w pixels wide, and h pixels high.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2788 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2789 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2790 gui_mch_draw_part_cursor(
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2791 int w,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2792 int h,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2793 guicolor_T color)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2794 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2795 gui_mch_set_fg_color(color);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2796
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2797 BRect r;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2798 r.left =
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2799 #ifdef FEAT_RIGHTLEFT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2800 /* vertical line should be on the right of current point */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2801 CURSOR_BAR_RIGHT ? FILL_X(gui.col + 1) - w :
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2802 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2803 FILL_X(gui.col);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2804 r.right = r.left + w - PEN_WIDTH;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2805 r.bottom = FILL_Y(gui.row + 1) - PEN_WIDTH;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2806 r.top = r.bottom - h + PEN_WIDTH;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2807
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2808 if (gui.vimWindow->Lock()) {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2809 gui.vimTextArea->FillRect(r);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2810 gui.vimWindow->Unlock();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2811 //gui_mch_flush();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2812 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2813 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2814
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2815 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2816 * Catch up with any queued events. This may put keyboard input into the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2817 * input buffer, call resize call-backs, trigger timers etc. If there is
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2818 * nothing in the event queue (& no timers pending), then we return
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2819 * immediately.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2820 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2821 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2822 gui_mch_update()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2823 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2824 gui_mch_flush();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2825 while (port_count(gui.vdcmp) > 0 &&
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2826 !vim_is_input_buf_full() &&
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2827 gui_beos_process_event(0) >= B_OK)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2828 /* nothing */ ;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2829 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2830
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2831 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2832 * GUI input routine called by gui_wait_for_chars(). Waits for a character
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2833 * from the keyboard.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2834 * wtime == -1 Wait forever.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2835 * wtime == 0 This should never happen.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2836 * wtime > 0 Wait wtime milliseconds for a character.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2837 * Returns OK if a character was found to be available within the given time,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2838 * or FAIL otherwise.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2839 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2840 int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2841 gui_mch_wait_for_chars(
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2842 int wtime)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2843 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2844 int focus;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2845 bigtime_t until, timeout;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2846 status_t st;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2847
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2848 if (wtime >= 0) {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2849 timeout = wtime * 1000;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2850 until = system_time() + timeout;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2851 } else {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2852 timeout = B_INFINITE_TIMEOUT;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2853 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2854
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2855 focus = gui.in_focus;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2856 for (;;)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2857 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2858 /* Stop or start blinking when focus changes */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2859 if (gui.in_focus != focus)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2860 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2861 if (gui.in_focus)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2862 gui_mch_start_blink();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2863 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2864 gui_mch_stop_blink();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2865 focus = gui.in_focus;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2866 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2867
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2868 gui_mch_flush();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2869 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2870 * Don't use gui_mch_update() because then we will spin-lock until a
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2871 * char arrives, instead we use gui_beos_process_event() to hang until
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2872 * an event arrives. No need to check for input_buf_full because we
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2873 * are returning as soon as it contains a single char.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2874 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2875 st = gui_beos_process_event(timeout);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2876
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2877 if (input_available())
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2878 return OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2879 if (st < B_OK) /* includes B_TIMED_OUT */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2880 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2881
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2882 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2883 * Calculate how much longer we're willing to wait for the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2884 * next event.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2885 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2886 if (wtime >= 0) {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2887 timeout = until - system_time();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2888 if (timeout < 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2889 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2890 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2891 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2892 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2893
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2894 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2895
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2896 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2897 * Output routines.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2898 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2899
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2900 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2901 * Flush any output to the screen. This is typically called before
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2902 * the app goes to sleep.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2903 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2904 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2905 gui_mch_flush()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2906 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2907 // does this need to lock the window? Apparently not but be safe.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2908 if (gui.vimWindow->Lock()) {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2909 gui.vimWindow->Flush();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2910 gui.vimWindow->Unlock();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2911 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2912 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2913 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2914
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2915 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2916 * Clear a rectangular region of the screen from text pos (row1, col1) to
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2917 * (row2, col2) inclusive.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2918 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2919 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2920 gui_mch_clear_block(
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2921 int row1,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2922 int col1,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2923 int row2,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2924 int col2)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2925 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2926 if (gui.vimWindow->Lock()) {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2927 gui.vimTextArea->mchClearBlock(row1, col1, row2, col2);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2928 gui.vimWindow->Unlock();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2929 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2930 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2931
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2932 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2933 gui_mch_clear_all()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2934 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2935 if (gui.vimWindow->Lock()) {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2936 gui.vimTextArea->mchClearAll();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2937 gui.vimWindow->Unlock();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2938 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2939 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2940
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2941 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2942 * Delete the given number of lines from the given row, scrolling up any
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2943 * text further down within the scroll region.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2944 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2945 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2946 gui_mch_delete_lines(
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2947 int row,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2948 int num_lines)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2949 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2950 gui.vimTextArea->mchDeleteLines(row, num_lines);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2951 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2952
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2953 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2954 * Insert the given number of lines before the given row, scrolling down any
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2955 * following text within the scroll region.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2956 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2957 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2958 gui_mch_insert_lines(
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2959 int row,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2960 int num_lines)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2961 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2962 gui.vimTextArea->mchInsertLines(row, num_lines);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2963 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2964
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2965 #if defined(FEAT_MENU) || defined(PROTO)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2966 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2967 * Menu stuff.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2968 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2969
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2970 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2971 gui_mch_enable_menu(
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2972 int flag)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2973 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2974 if (gui.vimWindow->Lock())
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2975 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2976 BMenuBar *menubar = gui.vimForm->MenuBar();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2977 menubar->SetEnabled(flag);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2978 gui.vimWindow->Unlock();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2979 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2980 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2981
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2982 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2983 gui_mch_set_menu_pos(
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2984 int x,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2985 int y,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2986 int w,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2987 int h)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2988 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2989 /* It will be in the right place anyway */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2990 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2991
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2992 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2993 * Add a sub menu to the menu bar.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2994 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2995 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2996 gui_mch_add_menu(
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2997 vimmenu_T *menu,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2998 int idx)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2999 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3000 vimmenu_T *parent = menu->parent;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3001
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3002 if (!menu_is_menubar(menu->name)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3003 || (parent != NULL && parent->submenu_id == NULL))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3004 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3005
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3006 if (gui.vimWindow->Lock())
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3007 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3008 /* Major re-write of the menu code, it was failing with memory corruption when
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3009 * we started loading multiple files (the Buffer menu)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3010 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3011 * Note we don't use the preference values yet, all are inserted into the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3012 * menubar on a first come-first served basis...
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3013 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3014 * richard@whitequeen.com jul 99
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3015 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3016
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3017 BMenu *tmp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3018
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3019 if ( parent )
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3020 tmp = parent->submenu_id;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3021 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3022 tmp = gui.vimForm->MenuBar();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3023 // make sure we don't try and add the same menu twice. The Buffers menu tries to
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3024 // do this and Be starts to crash...
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3025
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3026 if ( ! tmp->FindItem((const char *) menu->dname)) {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3027
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3028 BMenu *bmenu = new BMenu((char *)menu->dname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3029
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3030 menu->submenu_id = bmenu;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3031
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3032 // when we add a BMenu to another Menu, it creates the interconnecting BMenuItem
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3033 tmp->AddItem(bmenu);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3034
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3035 // Now its safe to query the menu for the associated MenuItem....
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3036 menu->id = tmp->FindItem((const char *) menu->dname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3037
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3038 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3039 gui.vimWindow->Unlock();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3040 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3041 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3042
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3043 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3044 gui_mch_toggle_tearoffs(int enable)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3045 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3046 /* no tearoff menus */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3047 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3048
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3049 static BMessage *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3050 MenuMessage(vimmenu_T *menu)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3051 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3052 BMessage *m = new BMessage('menu');
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3053 m->AddPointer("VimMenu", (void *)menu);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3054
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3055 return m;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3056 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3057
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3058 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3059 * Add a menu item to a menu
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3060 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3061 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3062 gui_mch_add_menu_item(
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3063 vimmenu_T *menu,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3064 int idx)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3065 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3066 int mnemonic = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3067 vimmenu_T *parent = menu->parent;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3068
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3069 if (parent->submenu_id == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3070 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3071
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3072 #ifdef never
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3073 /* why not add separators ?
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3074 * richard
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3075 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3076 /* Don't add menu separator */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3077 if (menu_is_separator(menu->name))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3078 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3079 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3080
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3081 /* TODO: use menu->actext */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3082 /* This is difficult, since on Be, an accelerator must be a single char
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3083 * and a lot of Vim ones are the standard VI commands.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3084 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3085 * Punt for Now...
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3086 * richard@whiequeen.com jul 99
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3087 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3088 if (gui.vimWindow->Lock())
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3089 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3090 if ( menu_is_separator(menu->name)) {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3091 BSeparatorItem *item = new BSeparatorItem();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3092 parent->submenu_id->AddItem(item);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3093 menu->id = item;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3094 menu->submenu_id = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3095 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3096 else {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3097 BMenuItem *item = new BMenuItem((char *)menu->dname,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3098 MenuMessage(menu));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3099 item->SetTarget(gui.vimTextArea);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3100 item->SetTrigger((char) menu->mnemonic);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3101 parent->submenu_id->AddItem(item);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3102 menu->id = item;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3103 menu->submenu_id = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3104 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3105 gui.vimWindow->Unlock();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3106 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3107 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3108
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3109 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3110 * Destroy the machine specific menu widget.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3111 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3112 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3113 gui_mch_destroy_menu(
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3114 vimmenu_T *menu)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3115 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3116 if (gui.vimWindow->Lock())
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3117 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3118 assert(menu->submenu_id == NULL || menu->submenu_id->CountItems() == 0);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3119 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3120 * Detach this menu from its parent, so that it is not deleted
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3121 * twice once we get to delete that parent.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3122 * Deleting a BMenuItem also deletes the associated BMenu, if any
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3123 * (which does not have any items anymore since they were
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3124 * removed and deleted before).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3125 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3126 BMenu *bmenu = menu->id->Menu();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3127 if (bmenu)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3128 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3129 bmenu->RemoveItem(menu->id);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3130 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3131 * If we removed the last item from the menu bar,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3132 * resize it out of sight.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3133 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3134 if (bmenu == gui.vimForm->MenuBar() && bmenu->CountItems() == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3135 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3136 bmenu->ResizeTo(-MENUBAR_MARGIN, -MENUBAR_MARGIN);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3137 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3138 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3139 delete menu->id;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3140 menu->id = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3141 menu->submenu_id = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3142
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3143 gui.menu_height = (int) gui.vimForm->MenuHeight();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3144 gui.vimWindow->Unlock();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3145 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3146 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3147
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3148 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3149 * Make a menu either grey or not grey.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3150 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3151 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3152 gui_mch_menu_grey(
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3153 vimmenu_T *menu,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3154 int grey)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3155 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3156 if (menu->id != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3157 menu->id->SetEnabled(!grey);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3158 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3159
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3160 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3161 * Make menu item hidden or not hidden
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3162 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3163 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3164 gui_mch_menu_hidden(
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3165 vimmenu_T *menu,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3166 int hidden)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3167 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3168 if (menu->id != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3169 menu->id->SetEnabled(!hidden);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3170 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3171
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3172 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3173 * This is called after setting all the menus to grey/hidden or not.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3174 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3175 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3176 gui_mch_draw_menubar()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3177 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3178 /* Nothing to do in BeOS */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3179 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3180
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3181 #endif /* FEAT_MENU */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3182
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3183 /* Mouse stuff */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3184
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3185 #ifdef FEAT_CLIPBOARD
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3186 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3187 * Clipboard stuff, for cutting and pasting text to other windows.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3188 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3189 char textplain[] = "text/plain";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3190 char vimselectiontype[] = "application/x-vnd.Rhialto-Vim-selectiontype";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3191
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3192 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3193 * Get the current selection and put it in the clipboard register.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3194 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3195 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3196 clip_mch_request_selection(VimClipboard *cbd)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3197 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3198 if (be_clipboard->Lock())
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3199 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3200 BMessage *m = be_clipboard->Data();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3201 //m->PrintToStream();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3202
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3203 char_u *string = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3204 ssize_t stringlen = -1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3205
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3206 if (m->FindData(textplain, B_MIME_TYPE,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3207 (const void **)&string, &stringlen) == B_OK
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3208 || m->FindString("text", (const char **)&string) == B_OK)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3209 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3210 if (stringlen == -1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3211 stringlen = STRLEN(string);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3212
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3213 int type;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3214 char *seltype;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3215 ssize_t seltypelen;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3216
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3217 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3218 * Try to get the special vim selection type first
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3219 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3220 if (m->FindData(vimselectiontype, B_MIME_TYPE,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3221 (const void **)&seltype, &seltypelen) == B_OK)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3222 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3223 switch (*seltype)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3224 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3225 default:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3226 case 'L': type = MLINE; break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3227 case 'C': type = MCHAR; break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3228 #ifdef FEAT_VISUAL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3229 case 'B': type = MBLOCK; break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3230 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3231 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3232 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3233 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3234 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3235 /* Otherwise use heuristic as documented */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3236 type = memchr(string, stringlen, '\n') ? MLINE : MCHAR;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3237 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3238 clip_yank_selection(type, string, (long)stringlen, cbd);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3239 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3240 be_clipboard->Unlock();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3241 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3242 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3243 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3244 * Make vim the owner of the current selection.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3245 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3246 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3247 clip_mch_lose_selection(VimClipboard *cbd)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3248 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3249 /* Nothing needs to be done here */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3250 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3251
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3252 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3253 * Make vim the owner of the current selection. Return OK upon success.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3254 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3255 int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3256 clip_mch_own_selection(VimClipboard *cbd)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3257 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3258 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3259 * Never actually own the clipboard. If another application sets the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3260 * clipboard, we don't want to think that we still own it.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3261 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3262 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3263 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3264
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3265 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3266 * Send the current selection to the clipboard.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3267 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3268 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3269 clip_mch_set_selection(VimClipboard *cbd)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3270 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3271 if (be_clipboard->Lock())
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3272 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3273 be_clipboard->Clear();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3274 BMessage *m = be_clipboard->Data();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3275 assert(m);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3276
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3277 /* If the '*' register isn't already filled in, fill it in now */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3278 cbd->owned = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3279 clip_get_selection(cbd);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3280 cbd->owned = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3281
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3282 char_u *str = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3283 long_u count;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3284 int type;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3285
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3286 type = clip_convert_selection(&str, &count, cbd);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3287
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3288 if (type < 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3289 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3290
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3291 m->AddData(textplain, B_MIME_TYPE, (void *)str, count);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3292
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3293 /* Add type of selection */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3294 char vtype;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3295 switch (type)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3296 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3297 default:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3298 case MLINE: vtype = 'L'; break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3299 case MCHAR: vtype = 'C'; break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3300 #ifdef FEAT_VISUAL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3301 case MBLOCK: vtype = 'B'; break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3302 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3303 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3304 m->AddData(vimselectiontype, B_MIME_TYPE, (void *)&vtype, 1);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3305
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3306 vim_free(str);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3307
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3308 be_clipboard->Commit();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3309 be_clipboard->Unlock();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3310 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3311 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3312
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3313 #endif /* FEAT_CLIPBOARD */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3314
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3315 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3316 * Return the RGB value of a pixel as long.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3317 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3318 long_u
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3319 gui_mch_get_rgb(guicolor_T pixel)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3320 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3321 rgb_color rgb = GUI_TO_RGB(pixel);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3322
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3323 return ((rgb.red & 0xff) << 16) + ((rgb.green & 0xff) << 8)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3324 + (rgb.blue & 0xff);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3325 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3326
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3327 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3328 gui_mch_setmouse(int x, int y)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3329 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3330 TRACE();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3331 /* TODO */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3332 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3333
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3334 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3335 gui_mch_show_popupmenu(vimmenu_T *menu)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3336 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3337 TRACE();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3338 /* TODO */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3339 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3340
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3341 int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3342 gui_mch_get_mouse_x()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3343 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3344 TRACE();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3345 return 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3346 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3347
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3348
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3349 int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3350 gui_mch_get_mouse_y()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3351 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3352 TRACE();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3353 return 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3354 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3355
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3356 } /* extern "C" */