Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 1 | /* vi:set ts=8 sts=4 sw=4: |
| 2 | * |
| 3 | * VIM - Vi IMproved by Bram Moolenaar |
| 4 | * |
| 5 | * Do ":help uganda" in Vim to read copying and usage conditions. |
| 6 | * Do ":help credits" in Vim to see a list of people who contributed. |
| 7 | */ |
| 8 | |
| 9 | /* |
| 10 | * Porting to KDE(2) was done by |
| 11 | * |
| 12 | * (C) 2000 by Thomas Capricelli <orzel@freehackers.org> |
| 13 | * |
| 14 | * Please visit http://freehackers.org/kvim for other vim- or |
| 15 | * kde-related coding. |
| 16 | * |
| 17 | * $Id$ |
| 18 | * |
| 19 | */ |
| 20 | |
| 21 | #include <qscrollbar.h> |
| 22 | #include <qcstring.h> |
| 23 | #include <qdatetime.h> |
| 24 | #include <qcursor.h> |
| 25 | #include <qfontmetrics.h> |
| 26 | #include <qpaintdevice.h> |
| 27 | #include <qclipboard.h> |
| 28 | #include <qregexp.h> |
| 29 | #include <kaboutkde.h> |
| 30 | #include <kiconloader.h> |
| 31 | #include <kfontdialog.h> |
| 32 | #include <kmessagebox.h> |
| 33 | #include <dcopclient.h> |
| 34 | #include <kwin.h> |
| 35 | #include <kmenubar.h> |
| 36 | #include <kconfig.h> |
| 37 | #if (QT_VERSION>=300) |
| 38 | #include <qnamespace.h> |
| 39 | #include <ktip.h> |
| 40 | #endif |
| 41 | #include <qpopupmenu.h> |
| 42 | #include <qpainter.h> |
| 43 | #include <qtextcodec.h> |
| 44 | #include <qfontmetrics.h> |
| 45 | #include <qfont.h> |
| 46 | |
| 47 | |
Bram Moolenaar | 5eb86f9 | 2004-07-26 12:53:41 +0000 | [diff] [blame] | 48 | #include "gui_kde_wid.h" |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 49 | |
| 50 | |
| 51 | extern "C" { |
| 52 | #include "vim.h" |
| 53 | #include "version.h" |
| 54 | } |
| 55 | |
| 56 | #include <stdio.h> |
| 57 | |
| 58 | /* |
| 59 | * global variable for KDE, we can't put them in Gui, cause there are C++ types |
| 60 | */ |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 61 | VimMainWindow *vmw = 0; |
| 62 | SBPool *sbpool = 0; |
| 63 | QString *argServerName = 0; |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 64 | |
| 65 | #ifdef FEAT_MOUSESHAPE |
| 66 | /* The last set mouse pointer shape is remembered, to be used when it goes |
| 67 | * from hidden to not hidden. */ |
| 68 | static int last_shape = 0; |
| 69 | #endif |
| 70 | |
| 71 | /* |
| 72 | * Arguments handled by KDE internally. |
| 73 | */ |
| 74 | |
| 75 | #if QT_VERSION>=300 |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 76 | static int tip = 0; // 1 no dialog, 0 use it if enabled in conf, |
| 77 | // 2 force the tip |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 78 | #endif |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 79 | static int reverse = 0; // 0 bg : white, 1 : bg : black |
| 80 | QString *startfont; |
| 81 | QSize *startsize; |
| 82 | static int gui_argc = 0; |
| 83 | static char **gui_argv = NULL; |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 84 | |
| 85 | /* |
| 86 | * Parse the GUI related command-line arguments. Any arguments used are |
| 87 | * deleted from argv, and *argc is decremented accordingly. This is called |
| 88 | * when vim is started, whether or not the GUI has been started. |
| 89 | */ |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 90 | void |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 91 | gui_mch_prepare(int *argc, char **argv)// {{{ |
| 92 | { |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 93 | // copy args for KDE/Qt |
| 94 | gui_argc = 0; |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 95 | |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 96 | // this one is not really good as all options are not for KDE/Qt ... |
| 97 | gui_argv = (char **)lalloc((long_u)(*argc * sizeof(char *)), FALSE); |
| 98 | if (gui_argv == NULL) |
| 99 | return; |
| 100 | gui_argv[gui_argc++] = argv[0]; |
| 101 | |
| 102 | int found = 0; |
| 103 | for (int i = 1; i < *argc ; i++) |
| 104 | { |
| 105 | if (found != 2) |
| 106 | found = 0; |
| 107 | else |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 108 | { |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 109 | found = 0; |
| 110 | // remove from the list of argv |
| 111 | if (--*argc > i) |
| 112 | { |
| 113 | mch_memmove(&argv[i], &argv[i + 1], |
| 114 | (*argc - i) * sizeof(char *)); |
| 115 | } |
| 116 | i--; |
| 117 | continue; |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 118 | } |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 119 | |
| 120 | if (strcmp(argv[i], "--servername") == 0) |
| 121 | { |
| 122 | argServerName = new QString(argv[i+1]); // to get the serverName now |
| 123 | } |
| 124 | #if QT_VERSION>+300 |
| 125 | if (strcmp(argv[i], "-tip") == 0 ) |
| 126 | { |
| 127 | tip = 2; |
| 128 | found = 1; |
| 129 | } |
| 130 | if (strcmp(argv[i], "-notip") == 0 ) |
| 131 | { |
| 132 | tip = 1; |
| 133 | found = 1; |
| 134 | } |
| 135 | #endif |
| 136 | if (strcmp(argv[i], "-black") == 0 ) |
| 137 | { |
| 138 | reverse = 1; |
| 139 | found = 1; |
| 140 | } |
| 141 | /* replaced by -black */ |
| 142 | /* if (strcmp(argv[i], "-rv") == 0 ) |
| 143 | * { |
| 144 | reverse = 1; |
| 145 | found = 1; |
| 146 | }*/ |
| 147 | if (strcmp(argv[i], "-font") == 0 || strcmp(argv[i], "-fn") == 0) |
| 148 | { |
| 149 | startfont = new QString(argv[i+1]); |
| 150 | found = 2; |
| 151 | } |
| 152 | if (strcmp(argv[i], "-geometry") == 0 || strcmp(argv[i], "-geom") == 0) |
| 153 | { |
| 154 | found = 2; |
| 155 | QString text(argv[i + 1]); |
| 156 | QStringList list = QStringList::split(QChar('x'), text); |
| 157 | startsize = new QSize(list[0].toInt(), list[1].toInt()); |
| 158 | } |
| 159 | if (strcmp(argv[i], "-display") == 0) //XXX: this does not work, |
| 160 | // too many -display options in main.c ! |
| 161 | // ask Bram ... |
| 162 | { |
| 163 | gui_argv[gui_argc++] = strdup("--display"); |
| 164 | gui_argv[gui_argc++] = argv[i+1]; |
| 165 | found = 0; |
| 166 | } |
| 167 | if (strcmp(argv[i], "--display") == 0 ) |
| 168 | { |
| 169 | gui_argv[gui_argc++] = argv[i]; |
| 170 | gui_argv[gui_argc++] = argv[i+1]; |
| 171 | found = 2; |
| 172 | } |
| 173 | //KDE/Qt options with no args |
| 174 | if (strcmp(argv[i], "--help-kde") == 0 |
| 175 | || strcmp(argv[i], "--help-qt") == 0 |
| 176 | || strcmp(argv[i], "--help-all") == 0 |
| 177 | || strcmp(argv[i], "--reverse") == 0 |
| 178 | || strcmp(argv[i], "--author") == 0 |
| 179 | // || strcmp(argv[i], "--version") == 0 //disabled we need these for kcmvim |
| 180 | // || strcmp(argv[i], "-v") == 0 |
| 181 | || strcmp(argv[i], "--license") == 0 |
| 182 | || strcmp(argv[i], "--cmap") == 0 |
| 183 | || strcmp(argv[i], "--nograb") == 0 |
| 184 | || strcmp(argv[i], "--dograb") == 0 |
| 185 | || strcmp(argv[i], "--sync") == 0 |
| 186 | || strcmp(argv[i], "--noxim") == 0 |
| 187 | || strcmp(argv[i], "--nocrashhandler") == 0 |
| 188 | || strcmp(argv[i], "--waitforwm") == 0 |
| 189 | ) |
| 190 | { |
| 191 | gui_argv[gui_argc++] = argv[i]; |
| 192 | found = 1; |
| 193 | } |
| 194 | //this outputs KDE and Vim versions :) |
| 195 | if (strcmp(argv[i], "--version") == 0 |
| 196 | || strcmp(argv[i], "-v") == 0) |
| 197 | { |
| 198 | gui_argv[gui_argc++] = argv[i]; |
| 199 | } |
| 200 | |
| 201 | |
| 202 | // KDE/Qt options with one arg |
| 203 | if (strcmp(argv[i], "--session") == 0 |
| 204 | || strcmp(argv[i], "--ncols") == 0 |
| 205 | || strcmp(argv[i], "--bg") == 0 |
| 206 | || strcmp(argv[i], "--background") == 0 |
| 207 | || strcmp(argv[i], "--fg") == 0 |
| 208 | || strcmp(argv[i], "--foreground") == 0 |
| 209 | || strcmp(argv[i], "--btn") == 0 |
| 210 | || strcmp(argv[i], "--name") == 0 |
| 211 | || strcmp(argv[i], "--title") == 0 |
| 212 | || strcmp(argv[i], "--inputstyle") == 0 |
| 213 | || strcmp(argv[i], "--im") == 0 |
| 214 | || strcmp(argv[i], "--caption") == 0 |
| 215 | || strcmp(argv[i], "--icon") == 0 |
| 216 | || strcmp(argv[i], "--miniicon") == 0 |
| 217 | || strcmp(argv[i], "--config") == 0 |
| 218 | || strcmp(argv[i], "--dcopserver") == 0 |
| 219 | || strcmp(argv[i], "--style") == 0 |
| 220 | || strcmp(argv[i], "--geometry") == 0 |
| 221 | || strcmp(argv[i], "--smkey") == 0 |
| 222 | || strcmp(argv[i], "-smkey") == 0 |
| 223 | || strcmp(argv[i], "-session") == 0 |
| 224 | ) |
| 225 | { |
| 226 | gui_argv[gui_argc++] = argv[i]; |
| 227 | gui_argv[gui_argc++] = argv[i + 1]; |
| 228 | found = 2; |
| 229 | } |
| 230 | |
| 231 | // remove from the list of argv |
| 232 | if (found >= 1 && --*argc > i) |
| 233 | { |
| 234 | mch_memmove(&argv[i], &argv[i + 1], (*argc - i) * sizeof(char *)); |
| 235 | i--; |
| 236 | } |
| 237 | } |
Bram Moolenaar | 495de9c | 2005-01-25 22:03:25 +0000 | [diff] [blame] | 238 | KCmdLineArgs::init(gui_argc, gui_argv, argv[0], I18N_NOOP("KVim"), |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 239 | I18N_NOOP("Vim inside KDE"), VIM_VERSION_SHORT); |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 240 | }// }}} |
| 241 | |
| 242 | /**************************************************************************** |
| 243 | * Focus handlers: |
| 244 | */ |
| 245 | |
| 246 | /* |
| 247 | * Initialises time intervals for the cursor blinking |
| 248 | */ |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 249 | void |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 250 | gui_mch_set_blinking(long waittime, long on, long off)//{{{ |
| 251 | { |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 252 | gui.w->set_blink_time(waittime, on, off); |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 253 | }//}}} |
| 254 | |
| 255 | /* |
| 256 | * Stop the cursor blinking. Show the cursor if it wasn't shown. |
| 257 | */ |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 258 | void |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 259 | gui_mch_stop_blink()//{{{ |
| 260 | { |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 261 | gui.w->stop_cursor_blinking(); |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 262 | }//}}} |
| 263 | |
| 264 | /* |
| 265 | * Start the cursor blinking. If it was already blinking, this restarts the |
| 266 | * waiting time and shows the cursor. |
| 267 | */ |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 268 | void |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 269 | gui_mch_start_blink()//{{{ |
| 270 | { |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 271 | gui.w->start_cursor_blinking(); |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 272 | }//}}} |
| 273 | |
Bram Moolenaar | 2df6dcc | 2004-07-12 15:53:54 +0000 | [diff] [blame] | 274 | #ifdef FEAT_MZSCHEME |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 275 | void |
Bram Moolenaar | 2df6dcc | 2004-07-12 15:53:54 +0000 | [diff] [blame] | 276 | mzscheme_kde_start_timer()//{{{ |
| 277 | { |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 278 | gui.w->enable_mzscheme_threads(); |
Bram Moolenaar | 2df6dcc | 2004-07-12 15:53:54 +0000 | [diff] [blame] | 279 | }//}}} |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 280 | void |
Bram Moolenaar | 2df6dcc | 2004-07-12 15:53:54 +0000 | [diff] [blame] | 281 | mzscheme_kde_stop_timer()//{{{ |
| 282 | { |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 283 | gui.w->disable_mzscheme_threads(); |
Bram Moolenaar | 2df6dcc | 2004-07-12 15:53:54 +0000 | [diff] [blame] | 284 | }//}}} |
| 285 | #endif |
| 286 | |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 287 | /* |
| 288 | * Check if the GUI can be started. Called before gvimrc is sourced. |
| 289 | * Return OK or FAIL. |
| 290 | */ |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 291 | int |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 292 | gui_mch_init_check(void)//{{{ |
| 293 | { |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 294 | gui.dpy = qt_xdisplay(); |
| 295 | return OK; |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 296 | }//}}} |
| 297 | |
| 298 | /* |
| 299 | * Initialise the X GUI. Create all the windows, set up all the call-backs etc. |
| 300 | * Returns OK for success, FAIL when the GUI can't be started. |
| 301 | */ |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 302 | int |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 303 | gui_mch_init()//{{{ |
| 304 | { |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 305 | (void) new KApplication(); |
| 306 | KApplication::kApplication()->dcopClient()->registerAs( |
| 307 | KApplication::kApplication()->name(), false); |
| 308 | // dbf("%s %s", KGlobal::locale()->language().latin1(), KLocale::defaultLanguage().latin1()); |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 309 | |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 310 | vmw = new VimMainWindow("KVim", 0); |
| 311 | vmw->setFrameBorderWidth(0); |
| 312 | kapp->setMainWidget(vmw); |
| 313 | kapp->setTopWidget(vmw); |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 314 | |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 315 | sbpool = new SBPool; |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 316 | |
| 317 | #if QT_VERSION>=300 |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 318 | vmw->connect(kapp->clipboard(), SIGNAL(selectionChanged()), |
| 319 | vmw, SLOT(clipboard_selection_update())); |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 320 | #endif |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 321 | vmw->connect(kapp->clipboard(), SIGNAL(dataChanged()), |
| 322 | vmw, SLOT(clipboard_data_update())); |
| 323 | clip_lose_selection(&clip_plus); |
| 324 | clip_lose_selection(&clip_star); |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 325 | |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 326 | gui.in_focus = FALSE; // will be updated |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 327 | |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 328 | if (reverse) |
| 329 | { |
| 330 | gui.def_norm_pixel = gui_get_color((char_u *)"White"); |
| 331 | gui.def_back_pixel = gui_get_color((char_u *)"Black"); |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 332 | #if QT_VERSION>=300 |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 333 | gui.w->setEraseColor(QColor(Qt::black)); |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 334 | #else |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 335 | gui.w->setBackgroundColor(QColor(Qt::black)); |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 336 | #endif |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 337 | } |
| 338 | else |
| 339 | { |
| 340 | gui.def_norm_pixel = gui_get_color((char_u *)"Black"); |
| 341 | gui.def_back_pixel = gui_get_color((char_u *)"White"); |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 342 | #if QT_VERSION>=300 |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 343 | gui.w->setEraseColor(QColor(Qt::white)); |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 344 | #else |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 345 | gui.w->setBackgroundColor(QColor(Qt::white)); |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 346 | #endif |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 347 | } |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 348 | |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 349 | gui.norm_pixel = gui.def_norm_pixel; |
| 350 | gui.back_pixel = gui.def_back_pixel; |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 351 | |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 352 | gui.border_width = 1; |
| 353 | gui.border_offset = 1;//gui.border_width; |
| 354 | gui.scrollbar_width = SB_DEFAULT_WIDTH; |
| 355 | gui.scrollbar_height = SB_DEFAULT_WIDTH; |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 356 | |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 357 | //gui.menu_height = vmw->menuBar()->height()+1; |
| 358 | //gui.toolbar_height = vmw->toolBar()->height(); |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 359 | |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 360 | return OK; |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 361 | }//}}} |
| 362 | |
| 363 | |
| 364 | /* |
| 365 | * Called when the foreground or background color has been changed. |
| 366 | */ |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 367 | void |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 368 | gui_mch_new_colors()//{{{ |
| 369 | { |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 370 | QColor rgb; |
| 371 | rgb.setRgb(gui.back_pixel); |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 372 | #if QT_VERSION>=300 |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 373 | gui.w->setEraseColor(rgb); |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 374 | #else |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 375 | gui.w->setBackgroundColor(rgb); |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 376 | #endif |
| 377 | }//}}} |
| 378 | |
| 379 | /* |
| 380 | * Open the GUI window which was created by a call to gui_mch_init(). |
| 381 | */ |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 382 | int |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 383 | gui_mch_open()//{{{ |
| 384 | { |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 385 | gui.dpy = qt_xdisplay(); |
| 386 | set_normal_colors(); |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 387 | |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 388 | /* Check that none of the colors are the same as the background color */ |
| 389 | gui_check_colors(); |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 390 | |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 391 | /* Get the colors for the highlight groups (gui_check_colors() might have |
| 392 | * changed them). |
| 393 | */ |
| 394 | highlight_gui_started(); /* re-init colors and fonts */ |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 395 | #ifdef FEAT_MENU |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 396 | vmw->w->menu = new QPopupMenu(vmw); |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 397 | |
| 398 | #if QT_VERSION>=300 |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 399 | vmw->w->menu->insertItem(SmallIcon("ktip"), i18n("&Tip of the day..."), |
| 400 | vmw, SLOT(showTipOfTheDay())); |
| 401 | vmw->w->menu->insertSeparator(); |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 402 | #endif |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 403 | if (vmw->have_tearoff) |
| 404 | vmw->w->menu->insertTearOffHandle(0, 0); |
| 405 | vmw->w->menu->insertItem(i18n("&Report Bug ..."), |
| 406 | vmw, SLOT(showBugReport())); |
| 407 | vmw->w->menu->insertSeparator(); |
| 408 | vmw->w->menu->insertItem(SmallIcon("kvim"), i18n("&About KVim..."), |
| 409 | vmw, SLOT(showAboutApplication())); |
| 410 | vmw->w->menu->insertItem(SmallIcon("about_kde"), i18n("About &KDE..."), |
| 411 | vmw, SLOT(showAboutKDE())); |
| 412 | vmw->menuBar()->insertItem("&KVim", vmw->w->menu); |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 413 | #endif |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 414 | if (startfont != NULL) |
| 415 | gui_mch_init_font((char_u*)startfont->latin1(), FALSE); |
Bram Moolenaar | 15d0a8c | 2004-09-06 17:44:46 +0000 | [diff] [blame] | 416 | |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 417 | if (startsize != NULL) |
| 418 | vmw->resize(startsize->width(), startsize->height()); |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 419 | |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 420 | gui_mch_update_codec(); |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 421 | |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 422 | if (kapp->isRestored()) |
| 423 | if (KMainWindow::canBeRestored(1)) |
| 424 | vmw->restore(1); |
Bram Moolenaar | 15d0a8c | 2004-09-06 17:44:46 +0000 | [diff] [blame] | 425 | |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 426 | vmw->show(); |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 427 | #if QT_VERSION>=300 |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 428 | if (tip == 2) |
| 429 | KTipDialog::showTip(vmw, QString::null, true); |
| 430 | else if (tip == 0) |
| 431 | KTipDialog::showTip(vmw); |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 432 | #endif |
| 433 | |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 434 | return OK; |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 435 | }//}}} |
| 436 | |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 437 | void |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 438 | gui_mch_exit(int rc)//{{{ |
| 439 | { |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 440 | kapp->quit(); |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 441 | }//}}} |
| 442 | |
| 443 | /* |
| 444 | * Get the position of the top left corner of the window. |
| 445 | */ |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 446 | int |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 447 | gui_mch_get_winpos(int *x, int *y)//{{{ |
| 448 | { |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 449 | *x = vmw->x(); |
| 450 | *y = vmw->y(); |
| 451 | return OK; |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 452 | }//}}} |
| 453 | |
| 454 | /* |
| 455 | * Set the position of the top left corner of the window to the given |
| 456 | * coordinates. |
| 457 | */ |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 458 | void |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 459 | gui_mch_set_winpos(int x, int y)//{{{ |
| 460 | { |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 461 | vmw->move(x, y); |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 462 | }//}}} |
| 463 | |
| 464 | /* |
| 465 | * Set the windows size. |
| 466 | * ->resize VimWidget |
| 467 | * ->resize vmw (block any events generated from here) |
| 468 | */ |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 469 | void |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 470 | gui_mch_set_shellsize(int width, int height,//{{{ |
| 471 | int min_width, int min_height, |
| 472 | int base_width, int base_height) |
| 473 | { |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 474 | //resize VimWidget |
| 475 | vmw->w->resize(width, height); |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 476 | |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 477 | //resize vmw |
| 478 | int vheight, vwidth; |
| 479 | vheight = height; |
| 480 | vwidth = width; |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 481 | |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 482 | if (gui.which_scrollbars[SBAR_LEFT]) |
| 483 | vwidth += gui.scrollbar_width; |
| 484 | if (gui.which_scrollbars[SBAR_RIGHT]) |
| 485 | vwidth += gui.scrollbar_width; |
| 486 | if (gui.which_scrollbars[SBAR_BOTTOM]) |
| 487 | vheight += gui.scrollbar_height; |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 488 | |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 489 | if (vmw->menuBar()->isVisible() && vmw->menuBar()->isEnabled() |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 490 | #if QT_VERSION>=300 |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 491 | && !vmw->menuBar()->isTopLevelMenu() |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 492 | #endif |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 493 | ) |
| 494 | vheight += vmw->menuBar()->height(); |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 495 | #ifdef FEAT_TOOLBAR |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 496 | if (vmw->toolBar()->isVisible() && vmw->toolBar()->isEnabled() |
| 497 | && (vmw->toolBar()->barPos() == KToolBar::Top |
| 498 | || vmw->toolBar()->barPos() == KToolBar::Bottom)) |
| 499 | vheight += vmw->toolBar()->height(); |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 500 | |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 501 | if (vmw->toolBar()->isVisible() && vmw->toolBar()->isEnabled() |
| 502 | && (vmw->toolBar()->barPos() == KToolBar::Left |
| 503 | || vmw->toolBar()->barPos() == KToolBar::Right)) |
| 504 | vwidth += vmw->toolBar()->width(); |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 505 | #endif |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 506 | vmw->lock(); |
| 507 | vmw->resize(vwidth, vheight); |
| 508 | gui_mch_update(); |
| 509 | //size should be nearly perfect, update baseSize and sizeIncrement |
| 510 | vmw->setBaseSize(base_width, vmw->menuBar()->height() + 1 |
| 511 | + vmw->toolBar()->height() + gui.char_height * 2); |
| 512 | vmw->setSizeIncrement((( int )(gui.char_width / 2) * 2), gui.char_height); |
| 513 | vmw->unlock(); |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 514 | }//}}} |
| 515 | |
| 516 | |
| 517 | /* |
| 518 | * The screen size is used to make sure the initial window doesn't get bigger |
| 519 | * then the screen. This subtracts some room for menubar, toolbar and window |
| 520 | * decorations. |
| 521 | */ |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 522 | void |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 523 | gui_mch_get_screen_dimensions(int *screen_w, int *screen_h)//{{{ |
| 524 | { |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 525 | *screen_w = kapp->desktop()->width(); |
| 526 | *screen_h = kapp->desktop()->height(); |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 527 | }//}}} |
| 528 | |
| 529 | #if defined(FEAT_MENU) || defined(PROTO) |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 530 | void |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 531 | gui_mch_enable_menu(int showit)//{{{ |
| 532 | { |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 533 | if (showit) |
| 534 | vmw->menuBar()->show(); |
| 535 | else |
| 536 | vmw->menuBar()->hide(); |
| 537 | vmw->resize(vmw->width(), vmw->height()); |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 538 | }//}}} |
| 539 | #endif |
| 540 | |
| 541 | |
| 542 | #if defined(FEAT_TOOLBAR) || defined(PROTO) |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 543 | void |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 544 | gui_mch_show_toolbar(int showit)//{{{ |
| 545 | { |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 546 | if (showit) |
| 547 | vmw->toolBar()->show(); |
| 548 | else |
| 549 | vmw->toolBar()->hide(); |
| 550 | vmw->resize(vmw->width(), vmw->height()); |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 551 | }//}}} |
| 552 | #endif |
| 553 | |
| 554 | /* |
| 555 | * Put up a font dialog and return the selected font name in allocated memory. |
| 556 | * "oldval" is the previous value. |
| 557 | * Return NULL when cancelled. |
| 558 | */ |
| 559 | |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 560 | char_u * |
| 561 | gui_mch_font_dialog(char_u *oldval)//{{{ |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 562 | { |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 563 | QFont myFont(vmw->w->font()); |
| 564 | if (gui.fontname) |
| 565 | gui.fontname = NULL; |
| 566 | |
| 567 | int result = KFontDialog::getFont(myFont, true); |
| 568 | if (result != KFontDialog::Accepted) |
| 569 | return NULL; |
| 570 | |
| 571 | // myFont.setFixedPitch(true); |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 572 | #if QT_VERSION>=300 |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 573 | QString n = myFont.toString(); |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 574 | #else |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 575 | QString n = KVimUtils::toString(&myFont); |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 576 | #endif |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 577 | n.replace(QRegExp(","), "/"); |
| 578 | gui.fontname = (char_u *)strdup((const char *)n); |
| 579 | n.replace(QRegExp(" "), "\\ "); |
| 580 | n = QString("To set this font as your default font for KVim, edit your ~/.gvimrc file and add the following lines : \nif has(\"gui_kde\")\nset guifont=")+n+QString("\nendif");// \n OR \n use the control center of KDE and choose the correct fixed font"); |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 581 | |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 582 | //display a message box which explains how to save your font settings |
| 583 | KMessageBox::information(vmw, n, "Font Selection", "kvimselectfont"); |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 584 | |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 585 | return vim_strsave(gui.fontname); |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 586 | }//}}} |
| 587 | |
| 588 | /* |
| 589 | * Initialise vim to use the font with the given name. |
| 590 | * Return FAIL if the font could not be loaded, OK otherwise. |
| 591 | */ |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 592 | int |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 593 | gui_mch_init_font(char_u * font_name, int fontset)//{{{ |
| 594 | { |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 595 | QString fontname; |
| 596 | GuiFont font = NULL; |
Bram Moolenaar | 15d0a8c | 2004-09-06 17:44:46 +0000 | [diff] [blame] | 597 | |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 598 | if (font_name == NULL) |
| 599 | { |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 600 | #if 0 |
| 601 | #if QT_VERSION>=300 |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 602 | KConfig *base = KGlobal::config(); |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 603 | #else |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 604 | KConfigBase *base = KGlobal::config(); |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 605 | #endif |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 606 | base->setGroup("General"); |
| 607 | if (!base->hasKey("fixed")) |
| 608 | { |
| 609 | KMessageBox::error(KApplication::kApplication()->mainWidget(),"Cannot load default fixed font\n\nConfigure fonts in KDE Control Center.\n(Just click 'Choose...', 'OK' and then 'Apply')"); |
| 610 | return FAIL; |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 611 | } |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 612 | #if QT_VERSION>=300 |
| 613 | QString f = base->readEntry("fixed"); |
| 614 | #else |
| 615 | QFont ft = base->readFontEntry("fixed", NULL); |
| 616 | QString f = KVimUtils::toString(&ft); |
| 617 | #endif |
| 618 | font_name = (char_u*)strdup(f.latin1()); //latin1 ? |
| 619 | #else |
| 620 | font_name = (char_u*)strdup("misc-fixed/10/-1/5/50/0/0/0/1/0"); |
| 621 | #endif |
| 622 | } |
| 623 | fontname = (const char *)font_name; |
| 624 | /* fontname.replace(QRegExp("/"), ","); |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 625 | font = new QFont(); |
| 626 | font->fromString( fontname ); |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 627 | */ |
Bram Moolenaar | d8b0cf1 | 2004-12-12 11:33:30 +0000 | [diff] [blame] | 628 | #ifdef FEAT_XFONTSET |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 629 | if (fontset) |
| 630 | font = gui_mch_get_fontset(font_name, TRUE, TRUE); |
| 631 | if (font == NULL) |
Bram Moolenaar | d8b0cf1 | 2004-12-12 11:33:30 +0000 | [diff] [blame] | 632 | #endif |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 633 | font = gui_mch_get_font(font_name, FALSE); |
Bram Moolenaar | d8b0cf1 | 2004-12-12 11:33:30 +0000 | [diff] [blame] | 634 | |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 635 | if (font == NULL) |
| 636 | return FAIL; |
| 637 | if (fontname.contains('*') && fontname.contains('-')) |
| 638 | return FAIL; |
Bram Moolenaar | d8b0cf1 | 2004-12-12 11:33:30 +0000 | [diff] [blame] | 639 | |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 640 | gui_mch_free_font(gui.norm_font); |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 641 | #ifdef FEAT_XFONTSET |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 642 | gui_mch_free_fontset(gui.fontset); |
| 643 | gui.fontset = NOFONTSET; |
| 644 | if (fontset) |
| 645 | { |
| 646 | gui.fontset = font; |
| 647 | gui.norm_font = NOFONT; |
| 648 | } |
| 649 | else |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 650 | #endif |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 651 | gui.norm_font = font; |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 652 | |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 653 | /* Compute the width of the character cell. Some fonts include |
| 654 | * double-width characters. Use the width of ASCII characters to find |
| 655 | * out if this is so. */ |
| 656 | QFontMetrics f(*font); |
| 657 | int width_max = 0; |
| 658 | for (char c = 32; c < 127; c++) |
| 659 | if (width_max < f.width((QChar)c)) |
| 660 | width_max = f.width((QChar)c); |
| 661 | if (width_max <= f.maxWidth() / 2) |
| 662 | width_max = f.maxWidth() / 2; |
| 663 | gui.char_width = width_max; |
| 664 | gui.char_height = f.height() + p_linespace; |
| 665 | gui.char_ascent = f.ascent() + p_linespace; |
Bram Moolenaar | 15d0a8c | 2004-09-06 17:44:46 +0000 | [diff] [blame] | 666 | |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 667 | //check values, just to make sure and avoid a crash |
| 668 | if (gui.char_width <= 0) |
| 669 | gui.char_width = 8; |
| 670 | if (gui.char_height <= 0) |
| 671 | gui.char_height = 1; |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 672 | |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 673 | hl_set_font_name(font_name); |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 674 | |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 675 | vmw->w->setFont(*font); |
| 676 | |
| 677 | return OK; |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 678 | }//}}} |
| 679 | |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 680 | GuiFont |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 681 | gui_mch_get_font(char_u * name, int report_error)//{{{ |
| 682 | { |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 683 | QString fontname((const char *)name); |
| 684 | if (!gui.in_use || name == NULL) |
| 685 | return NOFONT; |
| 686 | if (fontname.contains('*') && fontname.contains('-')) |
| 687 | return NOFONT; // XFLD names not allowed anymore |
| 688 | QFont *myFont = new QFont(); |
| 689 | fontname.replace(QRegExp("/"), ","); |
| 690 | // myFont->setRawMode(TRUE); |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 691 | |
| 692 | #if QT_VERSION>=300 |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 693 | myFont->fromString(fontname); |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 694 | #else |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 695 | KVimUtils::fromString(myFont, fontname); |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 696 | #endif |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 697 | myFont->setFixedPitch(true); |
| 698 | if (!myFont->fixedPitch()) |
| 699 | dbf("Non fixed-width font"); |
| 700 | return (GuiFont) myFont; |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 701 | }//}}} |
| 702 | |
Bram Moolenaar | dfccaf0 | 2004-12-31 20:56:11 +0000 | [diff] [blame] | 703 | #if defined(FEAT_EVAL) || defined(PROTO) |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 704 | /* |
Bram Moolenaar | d8b0cf1 | 2004-12-12 11:33:30 +0000 | [diff] [blame] | 705 | * Return the name of font "font" in allocated memory. |
| 706 | * Don't know how to get the actual name, thus use the provided name. |
| 707 | */ |
| 708 | char_u * |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 709 | gui_mch_get_fontname(GuiFont font, char_u *name)//{{{ |
Bram Moolenaar | d8b0cf1 | 2004-12-12 11:33:30 +0000 | [diff] [blame] | 710 | { |
| 711 | if (name == NULL) |
| 712 | return NULL; |
| 713 | return vim_strsave(name); |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 714 | }//}}} |
Bram Moolenaar | dfccaf0 | 2004-12-31 20:56:11 +0000 | [diff] [blame] | 715 | #endif |
Bram Moolenaar | d8b0cf1 | 2004-12-12 11:33:30 +0000 | [diff] [blame] | 716 | |
| 717 | /* |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 718 | * Set the current text font. |
| 719 | * Since we create all GC on demand, we use just gui.current_font to |
| 720 | * indicate the desired current font. |
| 721 | */ |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 722 | void |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 723 | gui_mch_set_font(GuiFont font)//{{{ |
| 724 | { |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 725 | gui.current_font = font; |
| 726 | gui.w->painter->setFont(*(gui.current_font)); |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 727 | }//}}} |
| 728 | |
| 729 | /* |
| 730 | * If a font is not going to be used, free its structure. |
| 731 | */ |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 732 | void |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 733 | gui_mch_free_font(GuiFont font)//{{{ |
| 734 | { |
| 735 | if (font) |
| 736 | delete font; // this is a QFont , we can delete it :) |
| 737 | }//}}} |
| 738 | |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 739 | GuiFontset |
| 740 | gui_mch_get_fontset(char_u *name, int report_error, int fixed_width) |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 741 | { |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 742 | return (GuiFontset)gui_mch_get_font(name, report_error); |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 743 | } |
| 744 | |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 745 | void |
| 746 | gui_mch_set_fontset(GuiFontset fontset) |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 747 | { |
| 748 | gui_mch_set_font((GuiFont)fontset); |
| 749 | } |
| 750 | |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 751 | void |
| 752 | gui_mch_free_fontset(GuiFontset fontset) |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 753 | { |
| 754 | if (fontset) |
| 755 | delete fontset; |
| 756 | } |
| 757 | |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 758 | void |
| 759 | gui_mch_settitle(char_u *title, char_u *icon)//{{{ |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 760 | { |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 761 | if (!gui.in_use) /* can't do this when GUI not running */ |
| 762 | return; |
| 763 | vmw->setPlainCaption((const char *)title); |
| 764 | QPixmap p((const char *)icon); |
| 765 | vmw->setIcon(p); //FIXME |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 766 | }//}}} |
| 767 | |
| 768 | /* |
| 769 | * Return the Pixel value (color) for the given color name. This routine was |
| 770 | * pretty much taken from example code in the Silicon Graphics OSF/Motif |
| 771 | * Programmer's Guide. |
| 772 | * Return -1 for error. |
| 773 | */ |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 774 | guicolor_T |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 775 | gui_mch_get_color(char_u * name)//{{{ |
| 776 | { |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 777 | int i; |
| 778 | static char *(vimnames[][2]) = |
| 779 | { |
| 780 | /* A number of colors that some X11 systems don't have */ |
| 781 | {"LightRed", "#FFA0A0"}, |
| 782 | {"LightGreen", "#80FF80"}, |
| 783 | {"LightMagenta", "#FFA0FF"}, |
| 784 | {"DarkCyan", "#008080"}, |
| 785 | {"DarkBlue", "#0000C0"}, |
| 786 | {"DarkRed", "#C00000"}, |
| 787 | {"DarkMagenta", "#C000C0"}, |
| 788 | {"DarkGrey", "#C0C0C0"}, |
| 789 | {NULL, NULL} |
| 790 | }; |
| 791 | |
| 792 | if (!gui.in_use) /* can't do this when GUI not running */ |
| 793 | return (guicolor_T)(-1); |
| 794 | |
| 795 | QColor _color((const char *)name); |
| 796 | |
| 797 | if (_color.isValid()) |
| 798 | { |
| 799 | // return (_color.red() << 16) + ((_color.green() << 8)) |
| 800 | // + (_color.blue()); |
| 801 | return _color.rgb(); |
| 802 | // return (guicolor_T) _color.pixel(); |
| 803 | } |
| 804 | |
| 805 | /* add a few builtin names */ |
| 806 | for (i = 0;; ++i) |
| 807 | { |
| 808 | if (vimnames[i][0] == NULL) |
| 809 | return (guicolor_T)(-1); |
| 810 | if (STRICMP(name, vimnames[i][0]) == 0) |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 811 | { |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 812 | name = (char_u *) vimnames[i][1]; |
| 813 | return gui_mch_get_color(name); |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 814 | } |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 815 | } |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 816 | |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 817 | return (guicolor_T)(-1); // dead code, should not be reached.. |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 818 | }//}}} |
| 819 | |
| 820 | /* |
| 821 | * Set the current text foreground color. |
| 822 | */ |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 823 | void |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 824 | gui_mch_set_fg_color(guicolor_T color)//{{{ |
| 825 | { |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 826 | QColor rgb; |
| 827 | rgb.setRgb(color); |
| 828 | gui.w->painter->setPen(rgb); |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 829 | }//}}} |
| 830 | |
| 831 | /* |
| 832 | * Set the current text background color. |
| 833 | */ |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 834 | void |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 835 | gui_mch_set_bg_color(guicolor_T color)//{{{ |
| 836 | { |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 837 | QColor rgb; |
| 838 | rgb.setRgb(color); |
| 839 | gui.w->painter->setBackgroundColor(rgb); |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 840 | }//}}} |
| 841 | |
| 842 | /* |
Bram Moolenaar | e2cc970 | 2005-03-15 22:43:58 +0000 | [diff] [blame] | 843 | * Set the current text special color. |
| 844 | */ |
| 845 | void |
| 846 | gui_mch_set_sp_color(guicolor_T color)//{{{ |
| 847 | { |
| 848 | /* TODO */ |
| 849 | }//}}} |
| 850 | |
| 851 | /* |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 852 | * Use the blank mouse pointer or not. |
| 853 | * |
| 854 | * hide: TRUE = use blank ptr, FALSE = use parent ptr |
| 855 | */ |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 856 | void |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 857 | gui_mch_mousehide(int hide)//{{{ |
| 858 | { |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 859 | if (hide == gui.pointer_hidden) |
| 860 | return; |
| 861 | //#ifdef FEAT_MOUSESHAPE |
| 862 | // if (!hide) mch_set_mouse_shape(last_shape); |
| 863 | //#else |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 864 | # if (QT_VERSION<300) |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 865 | gui.w->setCursor((hide)?BlankCursor:ArrowCursor); |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 866 | # else |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 867 | gui.w->setCursor((hide)?Qt::BlankCursor:Qt::ArrowCursor); |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 868 | # endif |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 869 | //#endif |
| 870 | gui.pointer_hidden = hide; |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 871 | }//}}} |
| 872 | |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 873 | void |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 874 | gui_mch_update_codec() |
| 875 | { |
| 876 | #ifdef FEAT_MBYTE |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 877 | if (!gui.in_use) |
| 878 | return; |
| 879 | vmw->codec = QTextCodec::codecForName((const char *)p_enc); |
| 880 | if (vmw->codec == NULL) |
| 881 | vmw->codec = QTextCodec::codecForName( |
| 882 | KVimUtils::convertEncodingName(QString((const char*)p_enc))); |
| 883 | if (vmw->codec == NULL) |
| 884 | vmw->codec = QTextCodec::codecForLocale(); |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 885 | #else |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 886 | vmw->codec = QTextCodec::codecForLocale(); |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 887 | #endif |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 888 | if (vmw->codec == NULL) |
| 889 | vmw->codec = QTextCodec::codecForName("ISO-8859-1"); //fallback |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 890 | } |
| 891 | |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 892 | void |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 893 | gui_mch_draw_string(int row, int col, char_u * s, int len, int flags)//{{{ |
| 894 | { |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 895 | QString text = vmw->codec->toUnicode((const char *)s, len); |
| 896 | gui.w->draw_string(TEXT_X(col), TEXT_Y(row), text, text.length(), flags); |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 897 | }//}}} |
| 898 | |
| 899 | #if defined(FEAT_TITLE) || defined(PROTO) |
| 900 | /* |
| 901 | * Return the text window-id and display. Only required for X-based GUI's |
| 902 | */ |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 903 | int |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 904 | gui_get_x11_windis(Window * win, Display ** dis)//{{{ |
| 905 | { |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 906 | *win = /*vmw*/gui.w->winId(); |
| 907 | *dis = qt_xdisplay(); |
| 908 | return OK; |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 909 | }//}}} |
| 910 | #endif |
| 911 | |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 912 | void |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 913 | gui_mch_beep()//{{{ |
| 914 | { |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 915 | kapp->beep(); |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 916 | }//}}} |
| 917 | |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 918 | void |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 919 | gui_mch_flash(int msec)//{{{ |
| 920 | { |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 921 | gui.w->flash(); |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 922 | }//}}} |
| 923 | |
| 924 | /* |
| 925 | * Invert a rectangle from row r, column c, for nr rows and nc columns. |
| 926 | */ |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 927 | void |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 928 | gui_mch_invert_rectangle(int r, int c, int nr, int nc)//{{{ |
| 929 | { |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 930 | bitBlt(gui.w, |
| 931 | FILL_X(c), FILL_Y(r), |
| 932 | gui.w, |
| 933 | FILL_X(c), FILL_Y(r), |
| 934 | (nc) * gui.char_width, |
| 935 | (nr) * gui.char_height, |
| 936 | Qt::NotROP, // raster Operation |
| 937 | true); // ignoreMask |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 938 | }//}}} |
| 939 | |
| 940 | /* |
| 941 | * Iconify the GUI window. |
| 942 | */ |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 943 | void |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 944 | gui_mch_iconify()//{{{ |
| 945 | { |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 946 | vmw->showMinimized(); |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 947 | }//}}} |
| 948 | |
| 949 | /* |
| 950 | * Draw a cursor without focus. |
| 951 | */ |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 952 | void |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 953 | gui_mch_draw_hollow_cursor(guicolor_T color)//{{{ |
| 954 | { |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 955 | QPainter p(gui.w); |
| 956 | p.setPen(color); |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 957 | |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 958 | p.drawRect(FILL_X(gui.col), FILL_Y(gui.row), gui.char_width - 1, |
| 959 | gui.char_height - 1); |
| 960 | p.end(); |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 961 | }//}}} |
| 962 | |
| 963 | /* |
| 964 | * Draw part of a cursor, "w" pixels wide, and "h" pixels high, using |
| 965 | * color "color". |
| 966 | */ |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 967 | void |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 968 | gui_mch_draw_part_cursor(int w, int h, guicolor_T color)//{{{ |
| 969 | { |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 970 | QPainter p(gui.w); |
| 971 | p.setPen(color); |
| 972 | p.fillRect( |
Bram Moolenaar | 402d2fe | 2005-04-15 21:00:38 +0000 | [diff] [blame] | 973 | #ifdef FEAT_RIGHTLEFT |
| 974 | /* vertical line should be on the right of current point */ |
| 975 | CURSOR_BAR_RIGHT ? FILL_X(gui.col + 1) - w : |
| 976 | #endif |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 977 | FILL_X(gui.col), |
| 978 | FILL_Y(gui.row) + gui.char_height - h + 1, |
| 979 | w, h - 2, QColor( color, color)); |
Bram Moolenaar | 402d2fe | 2005-04-15 21:00:38 +0000 | [diff] [blame] | 980 | p.drawRect( |
| 981 | #ifdef FEAT_RIGHTLEFT |
| 982 | /* vertical line should be on the right of current point */ |
| 983 | CURSOR_BAR_RIGHT ? FILL_X(gui.col + 1) - w : |
| 984 | #endif |
| 985 | FILL_X(gui.col), |
| 986 | FILL_Y(gui.row) + gui.char_height - h |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 987 | + (int)p_linespace / 2, |
| 988 | w, h - (int)p_linespace); |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 989 | }//}}} |
| 990 | |
| 991 | |
| 992 | /* |
| 993 | * Catch up with any queued X11 events. This may put keyboard input into the |
| 994 | * input buffer, call resize call-backs, trigger timers etc. If there is |
| 995 | * nothing in the X11 event queue (& no timers pending), then we return |
| 996 | * immediately. |
| 997 | */ |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 998 | void |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 999 | gui_mch_update()//{{{ |
| 1000 | { |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 1001 | kapp->processEvents(); |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 1002 | }//}}} |
| 1003 | |
| 1004 | |
| 1005 | /* |
| 1006 | * GUI input routine called by gui_wait_for_chars(). Waits for a character |
| 1007 | * from the keyboard. |
| 1008 | * wtime == -1 Wait forever. |
| 1009 | * wtime == 0 This should never happen. |
| 1010 | * wtime > 0 Wait wtime milliseconds for a character. |
| 1011 | * Returns OK if a character was found to be available within the given time, |
| 1012 | * or FAIL otherwise. |
| 1013 | */ |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 1014 | int |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 1015 | gui_mch_wait_for_chars(long wtime)//{{{ |
| 1016 | { |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 1017 | // malte@kde.org's gift to KVim ;), thanks to him :) for this hard to find bug |
| 1018 | if (wtime > 0) |
| 1019 | { |
| 1020 | gui.w->wait(wtime); |
| 1021 | while (vim_is_input_buf_empty() && !gui.w->wait_done) |
| 1022 | kapp->processOneEvent(); |
| 1023 | return vim_is_input_buf_empty() ? FAIL : OK; |
| 1024 | } |
| 1025 | else |
| 1026 | while (vim_is_input_buf_empty()) |
| 1027 | kapp->processOneEvent(); |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 1028 | |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 1029 | return OK; |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 1030 | }//}}} |
| 1031 | |
| 1032 | |
| 1033 | /**************************************************************************** |
| 1034 | * Output drawing routines. |
| 1035 | ****************************************************************************/ |
| 1036 | |
| 1037 | |
| 1038 | /* Flush any output to the screen */ |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 1039 | void |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 1040 | gui_mch_flush()//{{{ |
| 1041 | { |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 1042 | kapp->flushX(); |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 1043 | }//}}} |
| 1044 | |
| 1045 | /* |
| 1046 | * Clear a rectangular region of the screen from text pos (row1, col1) to |
| 1047 | * (row2, col2) inclusive. |
| 1048 | */ |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 1049 | void |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 1050 | gui_mch_clear_block(int row1, int col1, int row2, int col2)//{{{ |
| 1051 | { |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 1052 | gui.w->erase(FILL_X(col1), FILL_Y(row1), |
| 1053 | (col2 - col1 + 1) * gui.char_width + (col2 == Columns - 1), |
| 1054 | (row2 - row1 + 1) * gui.char_height); |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 1055 | }//}}} |
| 1056 | |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 1057 | void |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 1058 | gui_mch_clear_all(void)//{{{ |
| 1059 | { |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 1060 | gui.w->erase(); |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 1061 | }//}}} |
| 1062 | |
| 1063 | |
| 1064 | /* |
| 1065 | * Delete the given number of lines from the given row, scrolling up any |
| 1066 | * text further down within the scroll region. |
| 1067 | */ |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 1068 | void |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 1069 | gui_mch_delete_lines(int row, int num_lines)//{{{ |
| 1070 | { |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 1071 | if (num_lines <= 0) |
| 1072 | return; |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 1073 | |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 1074 | if (row + num_lines > gui.scroll_region_bot) |
| 1075 | { |
| 1076 | /* Scrolled out of region, just blank the lines out */ |
| 1077 | gui_clear_block(row, gui.scroll_region_left, gui.scroll_region_bot, |
| 1078 | gui.scroll_region_right); |
| 1079 | } |
| 1080 | else |
| 1081 | { |
| 1082 | bitBlt(gui.w, |
| 1083 | FILL_X(gui.scroll_region_left), FILL_Y(row), |
| 1084 | gui.w, |
| 1085 | FILL_X(gui.scroll_region_left), FILL_Y(row + num_lines), |
| 1086 | gui.char_width * (gui.scroll_region_right |
| 1087 | - gui.scroll_region_left + 1) + 1, |
| 1088 | gui.char_height * (gui.scroll_region_bot - row - num_lines + 1), |
| 1089 | Qt::CopyROP, // raster Operation |
| 1090 | true); // ignoreMask |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 1091 | |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 1092 | /* Update gui.cursor_row if the cursor scrolled or copied over */ |
| 1093 | if (gui.cursor_row >= row) |
| 1094 | { |
| 1095 | if (gui.cursor_row < row + num_lines) |
| 1096 | gui.cursor_is_valid = FALSE; |
| 1097 | else if (gui.cursor_row <= gui.scroll_region_bot) |
| 1098 | gui.cursor_row -= num_lines; |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 1099 | } |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 1100 | |
| 1101 | gui_clear_block(gui.scroll_region_bot - num_lines + 1, |
| 1102 | gui.scroll_region_left, |
| 1103 | gui.scroll_region_bot, gui.scroll_region_right); |
| 1104 | } |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 1105 | }//}}} |
| 1106 | |
| 1107 | /* |
| 1108 | * Insert the given number of lines before the given row, scrolling down any |
| 1109 | * following text within the scroll region. |
| 1110 | */ |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 1111 | void |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 1112 | gui_mch_insert_lines(int row, int num_lines)//{{{ |
| 1113 | { |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 1114 | if (num_lines <= 0) |
| 1115 | return; |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 1116 | |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 1117 | if (row + num_lines > gui.scroll_region_bot) |
| 1118 | { |
| 1119 | /* Scrolled out of region, just blank the lines out */ |
| 1120 | gui_clear_block(row, gui.scroll_region_left, gui.scroll_region_bot, |
| 1121 | gui.scroll_region_right - 1); |
| 1122 | } |
| 1123 | else |
| 1124 | { |
| 1125 | bitBlt(gui.w, |
| 1126 | FILL_X(gui.scroll_region_left), FILL_Y(row + num_lines), |
| 1127 | gui.w, |
| 1128 | FILL_X(gui.scroll_region_left), FILL_Y(row), |
| 1129 | gui.char_width * ( gui.scroll_region_right |
| 1130 | - gui.scroll_region_left + 1 ) + 1, |
| 1131 | gui.char_height * (gui.scroll_region_bot - row - num_lines + 1), |
| 1132 | Qt::CopyROP, // raster Operation |
| 1133 | true); // ignoreMask |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 1134 | |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 1135 | /* Update gui.cursor_row if the cursor scrolled or copied over */ |
| 1136 | if (gui.cursor_row >= gui.row) |
| 1137 | { |
| 1138 | if (gui.cursor_row <= gui.scroll_region_bot - num_lines) |
| 1139 | gui.cursor_row += num_lines; |
| 1140 | else if (gui.cursor_row <= gui.scroll_region_bot) |
| 1141 | gui.cursor_is_valid = FALSE; |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 1142 | } |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 1143 | |
| 1144 | gui_clear_block(row, gui.scroll_region_left, row + num_lines - 1, |
| 1145 | gui.scroll_region_right); |
| 1146 | } |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 1147 | }//}}} |
| 1148 | |
| 1149 | /* |
| 1150 | * X Selection stuff, for cutting and pasting text to other windows. |
| 1151 | */ |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 1152 | void |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 1153 | clip_mch_request_selection(VimClipboard *cbd)//{{{ |
| 1154 | { |
| 1155 | #if QT_VERSION>=300 |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 1156 | if (cbd == &clip_star) |
| 1157 | kapp->clipboard()->setSelectionMode(true); |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 1158 | #endif |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 1159 | QString selection = kapp->clipboard()->text(); |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 1160 | |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 1161 | QCString unistring = vmw->codec->fromUnicode(selection); |
| 1162 | clip_yank_selection(MCHAR, (char_u *)(const char*)unistring, |
| 1163 | (long)unistring.length(), cbd); |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 1164 | #if QT_VERSION>=300 |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 1165 | if (cbd == &clip_star) |
| 1166 | kapp->clipboard()->setSelectionMode(false); |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 1167 | #endif |
| 1168 | }//}}} |
| 1169 | |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 1170 | void |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 1171 | clip_mch_lose_selection(VimClipboard *cbd)//{{{ |
| 1172 | { |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 1173 | // Don't need to do anything here |
| 1174 | gui_mch_update(); |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 1175 | }//}}} |
| 1176 | |
| 1177 | /* |
| 1178 | * Check whatever we allready own the selection. |
| 1179 | */ |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 1180 | int |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 1181 | clip_mch_own_selection(VimClipboard *cbd)//{{{ |
| 1182 | { |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 1183 | if (kapp->clipboard()->ownsSelection()) |
| 1184 | return OK; |
| 1185 | else |
| 1186 | { |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 1187 | #if QT_VERSION>=300 |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 1188 | kapp->clipboard()->setSelectionMode(true); |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 1189 | #endif |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 1190 | return OK; |
| 1191 | } |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 1192 | }//}}} |
| 1193 | |
| 1194 | /* |
| 1195 | * Send the current selection to the clipboard. |
| 1196 | */ |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 1197 | void |
| 1198 | clip_mch_set_selection(VimClipboard *cbd)//{{{ |
| 1199 | { |
| 1200 | char_u *data; |
| 1201 | long_u length; |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 1202 | |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 1203 | clip_get_selection(cbd); |
| 1204 | if (clip_convert_selection(&data, &length, cbd) < 0) |
| 1205 | return; |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 1206 | |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 1207 | QString selection((const char *)data); |
| 1208 | // We must turncate the string because it is not |
| 1209 | // null terminated |
| 1210 | selection.truncate((uint) length); |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 1211 | |
| 1212 | #if QT_VERSION>=300 |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 1213 | if (cbd == &clip_star) |
| 1214 | kapp->clipboard()->setSelectionMode(true); |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 1215 | #endif |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 1216 | kapp->clipboard()->setText(selection); |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 1217 | #if QT_VERSION>=300 |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 1218 | kapp->clipboard()->setSelectionMode(false); |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 1219 | #endif |
| 1220 | }//}}} |
| 1221 | |
| 1222 | |
| 1223 | #if defined(FEAT_MENU) || defined(PROTO) |
| 1224 | /* |
| 1225 | * Make a menu item appear either active or not active (grey or not grey). |
| 1226 | */ |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 1227 | void |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 1228 | gui_mch_menu_grey(vimmenu_T * menu, int grey)//{{{ |
| 1229 | { |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 1230 | if (!menu || !menu->parent || !menu->parent->widget) |
| 1231 | return; |
Bram Moolenaar | 1280586 | 2005-01-05 22:16:17 +0000 | [diff] [blame] | 1232 | menu->parent->widget->setItemEnabled((long)menu, !grey); |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 1233 | gui_mch_update(); |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 1234 | }//}}} |
| 1235 | |
| 1236 | /* |
| 1237 | * Make menu item hidden or not hidden. |
| 1238 | */ |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 1239 | void |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 1240 | gui_mch_menu_hidden(vimmenu_T * menu, int hidden)//{{{ |
| 1241 | { |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 1242 | // FIXME: cannot be fixed AFAIK |
| 1243 | // it's hard to remove an item in a QPopupMenu |
| 1244 | gui_mch_menu_grey(menu, hidden); |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 1245 | }//}}} |
| 1246 | |
| 1247 | /* |
| 1248 | * This is called after setting all the menus to grey/hidden or not. |
| 1249 | */ |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 1250 | void |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 1251 | gui_mch_draw_menubar()//{{{ |
| 1252 | { |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 1253 | // nothing to do under kde |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 1254 | }//}}} |
| 1255 | #endif |
| 1256 | |
| 1257 | /* |
| 1258 | * Scrollbar stuff. |
| 1259 | */ |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 1260 | void |
| 1261 | gui_mch_enable_scrollbar(scrollbar_T *sb, int flag)//{{{ |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 1262 | { |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 1263 | if (!sb->w) |
| 1264 | return; |
| 1265 | int width = gui.w->width(); |
| 1266 | int height = gui.w->height(); |
| 1267 | int neww = vmw->width(); |
| 1268 | int newh = vmw->height(); |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 1269 | |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 1270 | if (gui.which_scrollbars[SBAR_LEFT]) |
| 1271 | width += gui.scrollbar_width; |
| 1272 | if (gui.which_scrollbars[SBAR_RIGHT]) |
| 1273 | width += gui.scrollbar_width; |
| 1274 | if (gui.which_scrollbars[SBAR_BOTTOM]) |
| 1275 | height += gui.scrollbar_height; |
Bram Moolenaar | 15d0a8c | 2004-09-06 17:44:46 +0000 | [diff] [blame] | 1276 | |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 1277 | if (vmw->menuBar()->isVisible() && vmw->menuBar()->isEnabled() |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 1278 | #if QT_VERSION>=300 |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 1279 | && !vmw->menuBar()->isTopLevelMenu() |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 1280 | #endif |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 1281 | ) |
| 1282 | height += vmw->menuBar()->height(); |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 1283 | #ifdef FEAT_TOOLBAR |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 1284 | if (vmw->toolBar()->isVisible() && vmw->toolBar()->isEnabled() |
| 1285 | && (vmw->toolBar()->barPos() == KToolBar::Top |
| 1286 | || vmw->toolBar()->barPos() == KToolBar::Bottom)) |
| 1287 | height += vmw->toolBar()->height(); |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 1288 | |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 1289 | if (vmw->toolBar()->isVisible() && vmw->toolBar()->isEnabled() |
| 1290 | && (vmw->toolBar()->barPos() == KToolBar::Left |
| 1291 | || vmw->toolBar()->barPos() == KToolBar::Right)) |
| 1292 | width += vmw->toolBar()->width(); |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 1293 | #endif |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 1294 | if (abs(vmw->width() - width) > 5 |
| 1295 | && (sb->type == SBAR_LEFT || sb->type == SBAR_RIGHT)) |
| 1296 | neww = width; |
| 1297 | if (abs(vmw->height() - height) > 5 && (sb->type == SBAR_BOTTOM)) |
| 1298 | newh = height; |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 1299 | |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 1300 | if (flag) |
| 1301 | sb->w->show(); |
| 1302 | else |
| 1303 | sb->w->hide(); |
| 1304 | gui_mch_update(); |
| 1305 | vmw->lock(); |
| 1306 | vmw->resize(neww, newh); |
| 1307 | vmw->unlock(); |
| 1308 | gui_mch_update(); |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 1309 | }//}}} |
| 1310 | |
| 1311 | /* |
| 1312 | * Return the RGB value of a pixel as "#RRGGBB". |
| 1313 | */ |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 1314 | long_u |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 1315 | gui_mch_get_rgb(guicolor_T pixel)//{{{ |
| 1316 | { |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 1317 | // QColor c(pixel, pixel); |
| 1318 | // return (c.red() << 16) + ((c.green() << 8)) + (c.blue()); |
| 1319 | return pixel; |
| 1320 | // funny no ? it looks like with Qt we can always use directly the rgb |
| 1321 | // value (i hope i don't break colors again ;p) |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 1322 | }//}}} |
| 1323 | |
| 1324 | /* |
Bram Moolenaar | 9588a0f | 2005-01-08 21:45:39 +0000 | [diff] [blame] | 1325 | * Get current mouse coordinates in text window. |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 1326 | */ |
Bram Moolenaar | 9588a0f | 2005-01-08 21:45:39 +0000 | [diff] [blame] | 1327 | void |
| 1328 | gui_mch_getmouse(int *x, int *y)//{{{ |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 1329 | { |
Bram Moolenaar | 9588a0f | 2005-01-08 21:45:39 +0000 | [diff] [blame] | 1330 | *x = vmw->mapFromGlobal(QCursor::pos()).x(); |
| 1331 | *y = vmw->mapFromGlobal(QCursor::pos()).y(); |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 1332 | }//}}} |
| 1333 | |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 1334 | void |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 1335 | gui_mch_setmouse(int x, int y)//{{{ |
| 1336 | { |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 1337 | QCursor::setPos(vmw->mapToGlobal(QPoint(x, y))); |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 1338 | }//}}} |
| 1339 | |
| 1340 | #if defined(FEAT_MOUSESHAPE) || defined(PROTO) |
| 1341 | #if QT_VERSION>=300 |
| 1342 | static int mshape_ids[] = {//{{{ |
| 1343 | Qt::ArrowCursor, /* arrow */ |
| 1344 | Qt::BlankCursor, /* blank */ |
| 1345 | Qt::IbeamCursor, /* beam */ |
| 1346 | Qt::SizeVerCursor, /* updown */ |
| 1347 | Qt::SplitHCursor, /* udsizing */ |
| 1348 | Qt::SizeHorCursor, /* leftright */ |
| 1349 | Qt::SizeHorCursor, /* lrsizing */ |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 1350 | Qt::WaitCursor, /* busy */ |
| 1351 | Qt::ForbiddenCursor, /* no */ |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 1352 | Qt::CrossCursor, /* crosshair */ |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 1353 | Qt::PointingHandCursor, /* hand1 */ |
| 1354 | Qt::PointingHandCursor, /* hand2 */ |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 1355 | Qt::ArrowCursor, /* pencil */ |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 1356 | Qt::WhatsThisCursor, /* question */ |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 1357 | Qt::ArrowCursor, /* right-arrow */ |
| 1358 | Qt::UpArrowCursor, /* up-arrow */ |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 1359 | Qt::ArrowCursor /* last one */ |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 1360 | };//}}} |
| 1361 | #else |
| 1362 | static int mshape_ids[] = {//{{{ |
| 1363 | ArrowCursor, /* arrow */ |
| 1364 | BlankCursor, /* blank */ |
| 1365 | IbeamCursor, /* beam */ |
| 1366 | SizeVerCursor, /* updown */ |
| 1367 | SplitHCursor, /* udsizing */ |
| 1368 | SizeHorCursor, /* leftright */ |
| 1369 | SizeHorCursor, /* lrsizing */ |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 1370 | WaitCursor, /* busy */ |
| 1371 | ForbiddenCursor, /* no */ |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 1372 | CrossCursor, /* crosshair */ |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 1373 | PointingHandCursor, /* hand1 */ |
| 1374 | PointingHandCursor, /* hand2 */ |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 1375 | ArrowCursor, /* pencil */ |
| 1376 | ArrowCursor, /* question */ |
| 1377 | ArrowCursor, /* right-arrow */ |
| 1378 | UpArrowCursor, /* up-arrow */ |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 1379 | ArrowCursor /* last one */ |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 1380 | };//}}} |
| 1381 | #endif |
| 1382 | |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 1383 | void |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 1384 | mch_set_mouse_shape (int shape)//{{{ |
| 1385 | { |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 1386 | int id; |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 1387 | |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 1388 | if (shape == MSHAPE_HIDE || gui.pointer_hidden) |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 1389 | #if QT_VERSION>=300 |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 1390 | gui.w->setCursor(Qt::BlankCursor); |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 1391 | #else |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 1392 | gui.w->setCursor(BlankCursor); |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 1393 | #endif |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 1394 | else |
| 1395 | { |
| 1396 | if (shape >= MSHAPE_NUMBERED) |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 1397 | { |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 1398 | id = shape - MSHAPE_NUMBERED; |
| 1399 | /* if (id >= GDK_NUM_GLYPHS) |
| 1400 | id = GDK_LEFT_PTR; |
| 1401 | else |
| 1402 | id &= ~1;*/ /* they are always even (why?) */ |
| 1403 | id &= -1; |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 1404 | } |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 1405 | else |
| 1406 | id = mshape_ids[shape]; |
| 1407 | |
| 1408 | gui.w->setCursor(id); |
| 1409 | } |
| 1410 | if (shape != MSHAPE_HIDE) |
| 1411 | last_shape = shape; |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 1412 | }//}}} |
| 1413 | #endif |
| 1414 | |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 1415 | int |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 1416 | gui_mch_adjust_charsize ()//{{{ |
| 1417 | { |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 1418 | QFont f(*(gui.current_font)); |
| 1419 | QFontMetrics fm(f); |
| 1420 | gui.char_height = fm.height() + p_linespace; |
| 1421 | //gui.char_height = fm.ascent() + fm.descent() + p_linespace; |
| 1422 | gui.char_ascent = fm.ascent() + p_linespace / 2; |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 1423 | |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 1424 | return OK; |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 1425 | }//}}} |
| 1426 | |
Bram Moolenaar | 8169525 | 2004-12-29 20:58:21 +0000 | [diff] [blame] | 1427 | void |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 1428 | gui_mch_set_foreground ()//{{{ |
| 1429 | { |
Bram Moolenaar | 495de9c | 2005-01-25 22:03:25 +0000 | [diff] [blame] | 1430 | KWin::activateWindow(vmw->winId()); |
Bram Moolenaar | 843ee41 | 2004-06-30 16:16:41 +0000 | [diff] [blame] | 1431 | }//}}} |