Mercurial > vim
changeset 28303:9849df834f1d v8.2.4677
patch 8.2.4677: the Athena GUI support is outdated
Commit: https://github.com/vim/vim/commit/0b962e5685edd41b55d5427b894797e725707639
Author: Bram Moolenaar <Bram@vim.org>
Date: Sun Apr 3 18:02:37 2022 +0100
patch 8.2.4677: the Athena GUI support is outdated
Problem: The Athena GUI support is outdated.
Solution: Remove the Athena GUI code.
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Sun, 03 Apr 2022 19:15:04 +0200 |
parents | d81a8f2db704 |
children | 8462f16d2e7f |
files | Filelist runtime/doc/gui.txt runtime/doc/gui_x11.txt src/Makefile src/clipboard.c src/evalfunc.c src/feature.h src/gui.c src/gui.h src/gui_at_fs.c src/gui_at_sb.c src/gui_at_sb.h src/gui_athena.c src/gui_beval.c src/gui_motif.c src/gui_x11.c src/if_mzsch.c src/main.c src/menu.c src/mouse.c src/proto.h src/proto/gui_athena.pro src/structs.h src/testdir/gui_init.vim src/testdir/setup_gui.vim src/testdir/test_clientserver.vim src/testdir/test_edit.vim src/testdir/test_gui.vim src/testdir/test_highlight.vim src/testdir/test_quotestar.vim src/testdir/test_startup.vim src/version.c src/vim.h |
diffstat | 33 files changed, 102 insertions(+), 6823 deletions(-) [+] |
line wrap: on
line diff
--- a/Filelist +++ b/Filelist @@ -446,10 +446,6 @@ SRC_UNIX = \ src/create_cmdidxs.vim \ src/create_nvcmdidxs.c \ src/create_nvcmdidxs.vim \ - src/gui_at_fs.c \ - src/gui_at_sb.c \ - src/gui_at_sb.h \ - src/gui_athena.c \ src/gui_gtk.c \ src/gui_gtk_f.c \ src/gui_gtk_f.h \ @@ -474,7 +470,6 @@ SRC_UNIX = \ src/osdef1.h.in \ src/osdef2.h.in \ src/pathdef.sh \ - src/proto/gui_athena.pro \ src/proto/gui_gtk.pro \ src/proto/gui_gtk_x11.pro \ src/proto/gui_gtk_gresources.pro \
--- a/runtime/doc/gui.txt +++ b/runtime/doc/gui.txt @@ -25,7 +25,7 @@ 1. Starting the GUI *gui-start* *E229 First you must make sure you actually have a version of Vim with the GUI code included. You can check this with the ":version" command, it says "with xxx -GUI", where "xxx" is X11-Motif, X11-Athena, Photon, GTK2, GTK3, etc., or +GUI", where "xxx" is X11-Motif, Photon, GTK2, GTK3, etc., or "MS-Windows 32 bit GUI version". How to start the GUI depends on the system used. Mostly you can run the @@ -108,7 +108,7 @@ There are a number of options which only Vim. These are 'guicursor', 'guifont', 'guipty' and 'guioptions'. They are documented in |options.txt| with all the other options. -If using the Motif or Athena version of the GUI (but not for the GTK+ or +If using the Motif version of the GUI (but not for the GTK+ or Win32 version), a number of X resources are available. See |gui-resources|. Another way to set the colors for different occasions is with highlight @@ -236,7 +236,7 @@ takes too much time or you don't like th include the 'h' flag in 'guioptions'. Then the scrolling is limited by the text of the current cursor line. - *athena-intellimouse* + *motif-intellimouse* If you have an Intellimouse and an X server that supports using the wheel, then you can use the wheel to scroll the text up and down in gvim. This works with XFree86 4.0 and later, and with some older versions when you add patches. @@ -746,7 +746,7 @@ because the item will never be selected. simple. *gui-toolbar* -The toolbar is currently available in the Win32, Athena, Motif, GTK+ (X11), +The toolbar is currently available in the Win32, Motif, GTK+ (X11), and Photon GUI. It should turn up in other GUIs in due course. The default toolbar is setup in menu.vim. The display of the toolbar is controlled by the 'guioptions' letter 'T'. You @@ -862,7 +862,7 @@ The window toolbar uses the ToolbarLine When splitting the window the window toolbar is not copied to the new window. *popup-menu* -In the Win32, GTK+, Motif, Athena and Photon GUI, you can define the +In the Win32, GTK+, Motif and Photon GUI, you can define the special menu "PopUp". This is the menu that is displayed when the right mouse button is pressed, if 'mousemodel' is set to popup or popup_setpos. Example: >
--- a/runtime/doc/gui_x11.txt +++ b/runtime/doc/gui_x11.txt @@ -1,11 +1,11 @@ -*gui_x11.txt* For Vim version 8.2. Last change: 2020 Jun 05 +*gui_x11.txt* For Vim version 8.2. Last change: 2022 Apr 03 VIM REFERENCE MANUAL by Bram Moolenaar Vim's Graphical User Interface *gui-x11* *GUI-X11* - *Athena* *Motif* + *Motif* 1. Starting the X11 GUI |gui-x11-start| 2. GUI Resources |gui-resources| 3. Shell Commands |gui-pty| @@ -64,7 +64,7 @@ flag in 'guioptions'. |-f|. ============================================================================== 2. GUI Resources *gui-resources* *.Xdefaults* -If using the Motif or Athena version of the GUI (not for the KDE, GTK+ or Win32 +If using the Motif version of the GUI (not for the KDE, GTK+ or Win32 version), a number of X resources are available. You should use Vim's class "Vim" when setting these. They are as follows: @@ -96,7 +96,6 @@ version), a number of X resources are av is same size as terminal that started it). scrollbarWidth Thickness of scrollbars. borderWidth Thickness of border around text area. - menuHeight Height of the menu bar (only for Athena). A special font for italic, bold, and italic-bold text will only be used if the user has specified one via a resource. No attempt is made to guess what @@ -135,12 +134,9 @@ which make Motif applications look even The "Vim*fontList" is to set the menu font for Motif. Example: > Vim*menuBar*fontList: -*-courier-medium-r-*-*-10-*-*-*-*-*-*-* -With Athena: > - Vim*menuBar*SmeBSB*font: -*-courier-medium-r-*-*-10-*-*-*-*-*-*-* - Vim*menuBar*MenuButton*font: -*-courier-medium-r-*-*-10-*-*-*-*-*-*-* NOTE: A more portable, and indeed more correct, way to specify the menu font -in either Motif or Athena is through the resource: > +in Motif is through the resource: > Vim.menuFont: -*-courier-medium-r-*-*-10-*-*-*-*-*-*-* Or, when compiled with the |+xfontset| feature: > Vim.menuFontSet: -*-courier-medium-r-*-*-10-*-*-*-*-*-*-* @@ -255,7 +251,7 @@ For example: > :10vmenu File.Print :w !lpr -Php3 < *X11-icon* -Vim uses a black&white icon by default when compiled with Motif or Athena. A +Vim uses a black&white icon by default when compiled with Motif. A colored Vim icon is included as $VIMRUNTIME/vim32x32.xpm. For GTK+, this is the builtin icon used. Unfortunately, how you should install it depends on your window manager. When you use this, remove the 'i' flag from @@ -594,8 +590,7 @@ GTK+ files on your system. When both GT will be chosen unless --enable-gui=gtk3 is passed explicitly to configure. If the GTK+ files cannot be found, then the Motif files will be searched for. -Finally, if this fails, the Athena files will be searched for. If all three -fail, the GUI will be disabled. +If both fail, the GUI will be disabled. For GTK+, Vim's configuration process uses pkg-config(1) to check if the GTK+ required for a specified build is properly installed and usable. @@ -621,10 +616,10 @@ explicitly to configure, and avoid passi the functionality of the GNOME 2 support has already been consolidated in GTK+ 3. -Otherwise, if you are using Motif or Athena, when you have the Motif or Athena -files in a directory where configure doesn't look, edit the Makefile to enter -the names of the directories. Search for "GUI_INC_LOC" for an example to set -the Motif directories, "CONF_OPT_X" for Athena. +Otherwise, if you are using Motif, when you have the Motif files in a +directory where configure doesn't look, edit the Makefile to enter the names +of the directories. Search for "GUI_INC_LOC" for an example to set +the Motif directories. *gui-x11-gtk* Currently, Vim supports both GTK+ 2 and GTK+ 3. @@ -643,18 +638,11 @@ few problems, but you might make it comp send me the patches if you do). The newest releases of LessTif have been reported to work fine too. - *gui-x11-athena* -The Athena version uses the Xaw widget set by default. If you have the 3D -version, you might want to link with Xaw3d instead. This will make the -menus look a bit better. Edit the Makefile and look for "XAW_LIB". The -scrollbars will remain the same, because Vim has its own, which are already -3D (in fact, they look more like Motif). - - *gui-x11-neXtaw* -The neXtaw version is mostly like Athena, but uses different widgets. + *gui-x11-athena* *gui-x11-neXtaw* +Support for the Athena GUI and neXtaw was removed in patch 8.2.4677. *gui-x11-misc* -In general, do not try to mix files from different GTK+, Motif, Athena and X11 +In general, do not try to mix files from different GTK+, Motif and X11 versions. This will cause problems. For example, using header files for X11R5 with a library for X11R6 probably doesn't work (although the linking won't give an error message, Vim will crash later).
--- a/src/Makefile +++ b/src/Makefile @@ -182,10 +182,7 @@ #Irix 6.5 cc ? 6.0 (S) David Harrison #Irix 64 bit 4.5 (K) Jon Wright #Linux 2.0 gcc-2.7.2 Infomagic Motif 4.3 (3) Ronald Rietman -#Linux 2.0.31 gcc +X11 +GUI Athena 5.0w (U) Darren Hiebert -#LynxOS 3.0.1 2.9-gnupro-98r2 +X11 +GUI Athena 5.7.1(O) Lorenz Hahn -#LynxOS 3.1.0 2.9-gnupro-98r2 +X11 +GUI Athena 5.7.1(O) Lorenz Hahn -#NEC UP4800 UNIX_SV 4.2MP cc +X11R6 Motif,Athena4.6b (Q) Lennart Schultz +#NEC UP4800 UNIX_SV 4.2MP cc +X11R6 Motif 4.6b (Q) Lennart Schultz #NetBSD 1.0A gcc-2.4.5 -X11 -GUI 3.21 (X) Juergen Weigert #QNX 4.2 wcc386-10.6 -X11 4.2 (D) G.F. Desrochers #QNX 4.23 Watcom -X11 4.2 (F) John Oleynick @@ -199,14 +196,12 @@ #Solaris 2.4 (Sparc) cc +X11 +GUI 3.29 (9) Glauber #Solaris 2.4/2.5 clcc +X11 -GUI openwin 3.20 (7) Robert Colon #Solaris 2.5 (sun4m) cc (SC4.0) +X11R6 +GUI (CDE) 4.6b (E) Andrew Large -#Solaris 2.5 cc +X11 +GUI Athena 4.2 (9) Sonia Heimann #Solaris 2.5 gcc 2.5.6 +X11 Motif 5.0m (R) Ant. Colombo #Solaris 2.6 gcc 2.8.1 ncurses 5.3 (G) Larry W. Virden #Solaris with -lthread 5.5 (W) K. Nagano #Solaris gcc (b) Riccardo #SunOS 4.1.x +X11 -GUI 5.1b (J) Bram Moolenaar -#SunOS 4.1.3_U1 (sun4c) gcc +X11 +GUI Athena 5.0w (J) Darren Hiebert -#SUPER-UX 6.2 (NEC SX-4) cc +X11R6 Motif,Athena4.6b (P) Lennart Schultz +#SUPER-UX 6.2 (NEC SX-4) cc +X11R6 Motif 4.6b (P) Lennart Schultz #Tandem/NSK (c) Matthew Woehlke #Unisys 6035 cc +X11 Motif 5.3 (8) Glauber Ribeiro #ESIX V4.2 cc +X11 6.0 (a) Reinhard Wobst @@ -1342,8 +1337,8 @@ HAIKUGUI_TESTTARGET = gui HAIKUGUI_BUNDLE = # All GUI files -ALL_GUI_SRC = gui.c gui_gtk.c gui_gtk_f.c gui_motif.c gui_xmdlg.c gui_xmebw.c gui_athena.c gui_gtk_x11.c gui_x11.c gui_at_sb.c gui_at_fs.c gui_haiku.cc -ALL_GUI_PRO = gui.pro gui_gtk.pro gui_motif.pro gui_xmdlg.pro gui_athena.pro gui_gtk_x11.pro gui_x11.pro gui_w32.pro gui_photon.pro gui_haiku.pro +ALL_GUI_SRC = gui.c gui_gtk.c gui_gtk_f.c gui_motif.c gui_xmdlg.c gui_xmebw.c gui_gtk_x11.c gui_x11.c gui_haiku.cc +ALL_GUI_PRO = gui.pro gui_gtk.pro gui_motif.pro gui_xmdlg.pro gui_gtk_x11.pro gui_x11.pro gui_w32.pro gui_photon.pro gui_haiku.pro # }}} @@ -3245,15 +3240,6 @@ objects/help.o: help.c objects/gui.o: gui.c $(CCC) -o $@ gui.c -objects/gui_at_fs.o: gui_at_fs.c - $(CCC) -o $@ gui_at_fs.c - -objects/gui_at_sb.o: gui_at_sb.c - $(CCC) -o $@ gui_at_sb.c - -objects/gui_athena.o: gui_athena.c - $(CCC) -o $@ gui_athena.c - objects/beval.o: beval.c $(CCC) -o $@ beval.c @@ -4182,25 +4168,6 @@ objects/gui_xmebw.o: gui_xmebw.c vim.h p os_unix.h auto/osdef.h ascii.h keymap.h termdefs.h macros.h option.h beval.h \ proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \ proto.h globals.h errors.h gui_xmebwp.h gui_xmebw.h -objects/gui_athena.o: gui_athena.c vim.h protodef.h auto/config.h feature.h \ - os_unix.h auto/osdef.h ascii.h keymap.h termdefs.h macros.h option.h beval.h \ - proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \ - proto.h globals.h errors.h gui_at_sb.h gui_x11_pm.h \ - ../pixmaps/tb_new.xpm ../pixmaps/tb_open.xpm ../pixmaps/tb_close.xpm \ - ../pixmaps/tb_save.xpm ../pixmaps/tb_print.xpm ../pixmaps/tb_cut.xpm \ - ../pixmaps/tb_copy.xpm ../pixmaps/tb_paste.xpm ../pixmaps/tb_find.xpm \ - ../pixmaps/tb_find_next.xpm ../pixmaps/tb_find_prev.xpm \ - ../pixmaps/tb_find_help.xpm ../pixmaps/tb_exit.xpm \ - ../pixmaps/tb_undo.xpm ../pixmaps/tb_redo.xpm ../pixmaps/tb_help.xpm \ - ../pixmaps/tb_macro.xpm ../pixmaps/tb_make.xpm \ - ../pixmaps/tb_save_all.xpm ../pixmaps/tb_jump.xpm \ - ../pixmaps/tb_ctags.xpm ../pixmaps/tb_load_session.xpm \ - ../pixmaps/tb_save_session.xpm ../pixmaps/tb_new_session.xpm \ - ../pixmaps/tb_blank.xpm ../pixmaps/tb_maximize.xpm \ - ../pixmaps/tb_split.xpm ../pixmaps/tb_minimize.xpm \ - ../pixmaps/tb_shell.xpm ../pixmaps/tb_replace.xpm \ - ../pixmaps/tb_vsplit.xpm ../pixmaps/tb_maxwidth.xpm \ - ../pixmaps/tb_minwidth.xpm objects/gui_gtk_x11.o: gui_gtk_x11.c vim.h protodef.h auto/config.h feature.h \ os_unix.h auto/osdef.h ascii.h keymap.h termdefs.h macros.h option.h beval.h \ proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \ @@ -4211,14 +4178,6 @@ objects/gui_x11.o: gui_x11.c vim.h proto proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \ proto.h globals.h errors.h ../runtime/vim32x32.xpm \ ../runtime/vim16x16.xpm ../runtime/vim48x48.xpm -objects/gui_at_sb.o: gui_at_sb.c vim.h protodef.h auto/config.h feature.h \ - os_unix.h auto/osdef.h ascii.h keymap.h termdefs.h macros.h option.h beval.h \ - proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \ - proto.h globals.h errors.h gui_at_sb.h -objects/gui_at_fs.o: gui_at_fs.c vim.h protodef.h auto/config.h feature.h \ - os_unix.h auto/osdef.h ascii.h keymap.h termdefs.h macros.h option.h beval.h \ - proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \ - proto.h globals.h errors.h gui_at_sb.h objects/gui_haiku.o: gui_haiku.cc vim.h protodef.h auto/config.h feature.h \ os_unix.h ascii.h keymap.h termdefs.h macros.h option.h beval.h \ proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \
--- a/src/clipboard.c +++ b/src/clipboard.c @@ -1354,7 +1354,7 @@ check_clipboard_option(void) /* * Open the application context (if it hasn't been opened yet). - * Used for Motif and Athena GUI and the xterm clipboard. + * Used for Motif GUI and the xterm clipboard. */ void open_app_context(void)
--- a/src/evalfunc.c +++ b/src/evalfunc.c @@ -5619,20 +5619,8 @@ f_has(typval_T *argvars, typval_T *rettv 0 #endif }, - {"gui_neXtaw", -#if defined(FEAT_GUI_ATHENA) && defined(FEAT_GUI_NEXTAW) - 1 -#else - 0 -#endif - }, - {"gui_athena", -#if defined(FEAT_GUI_ATHENA) && !defined(FEAT_GUI_NEXTAW) - 1 -#else - 0 -#endif - }, + {"gui_neXtaw", 0 }, + {"gui_athena", 0 }, {"gui_gtk", #ifdef FEAT_GUI_GTK 1
--- a/src/feature.h +++ b/src/feature.h @@ -583,8 +583,7 @@ #if defined(FEAT_NORMAL) && defined(FEAT_MENU) \ && (defined(FEAT_GUI_GTK) \ || defined(FEAT_GUI_MSWIN) \ - || ((defined(FEAT_GUI_MOTIF) || defined(FEAT_GUI_ATHENA)) \ - && defined(HAVE_XPM)) \ + || (defined(FEAT_GUI_MOTIF) && defined(HAVE_XPM)) \ || defined(FEAT_GUI_PHOTON) \ || defined(FEAT_GUI_HAIKU)) @@ -620,7 +619,7 @@ */ #if defined(FEAT_NORMAL) # define FEAT_BROWSE_CMD -# if defined(FEAT_GUI_MSWIN) || defined(FEAT_GUI_MOTIF) || defined(FEAT_GUI_ATHENA) \ +# if defined(FEAT_GUI_MSWIN) || defined(FEAT_GUI_MOTIF) \ || defined(FEAT_GUI_GTK) || defined(FEAT_GUI_HAIKU) || defined(FEAT_GUI_PHOTON) # define FEAT_BROWSE # endif @@ -641,8 +640,7 @@ * When none of these defined there is no dialog support. */ #ifdef FEAT_NORMAL -# if ((defined(FEAT_GUI_ATHENA) || defined(FEAT_GUI_MOTIF)) \ - && defined(HAVE_X11_XPM_H)) \ +# if (defined(FEAT_GUI_MOTIF) && defined(HAVE_X11_XPM_H)) \ || defined(FEAT_GUI_GTK) \ || defined(FEAT_GUI_PHOTON) \ || defined(FEAT_GUI_HAIKU) \ @@ -654,13 +652,13 @@ # endif #endif #if !defined(FEAT_GUI_DIALOG) && (defined(FEAT_GUI_MOTIF) \ - || defined(FEAT_GUI_ATHENA) || defined(FEAT_GUI_GTK) \ + || defined(FEAT_GUI_GTK) \ || defined(FEAT_GUI_MSWIN)) // need a dialog to show error messages when starting from the desktop # define FEAT_GUI_DIALOG #endif #if defined(FEAT_GUI_DIALOG) && \ - (defined(FEAT_GUI_MOTIF) || defined(FEAT_GUI_ATHENA) \ + (defined(FEAT_GUI_MOTIF) \ || defined(FEAT_GUI_GTK) || defined(FEAT_GUI_MSWIN) \ || defined(FEAT_GUI_PHOTON) \ || defined(FEAT_GUI_HAIKU)) @@ -881,7 +879,7 @@ * +X11 Unix only. Include code for xterm title saving and X * clipboard. Only works if HAVE_X11 is also defined. */ -#if (defined(FEAT_NORMAL) || defined(FEAT_GUI_MOTIF) || defined(FEAT_GUI_ATHENA)) +#if defined(FEAT_NORMAL) || defined(FEAT_GUI_MOTIF) # define WANT_X11 #endif @@ -1047,7 +1045,7 @@ # define MCH_CURSOR_SHAPE # endif # if defined(FEAT_GUI_MSWIN) || defined(FEAT_GUI_MOTIF) \ - || defined(FEAT_GUI_ATHENA) || defined(FEAT_GUI_GTK) \ + || defined(FEAT_GUI_GTK) \ || defined(FEAT_GUI_PHOTON) # define FEAT_MOUSESHAPE # endif @@ -1064,7 +1062,7 @@ #endif #if defined(FEAT_MZSCHEME) && (defined(FEAT_GUI_MSWIN) || defined(FEAT_GUI_GTK) \ - || defined(FEAT_GUI_MOTIF) || defined(FEAT_GUI_ATHENA)) + || defined(FEAT_GUI_MOTIF)) # define MZSCHEME_GUI_THREADS #endif @@ -1090,7 +1088,6 @@ * +tcl TCL interface: "--enable-tclinterp" * +netbeans_intg Netbeans integration * +channel Inter process communication - * +GUI_Athena Athena GUI * +GUI_Motif Motif GUI */ @@ -1154,8 +1151,7 @@ */ #if defined(FEAT_BIG) || defined(FEAT_NETBEANS_INTG) || defined(FEAT_PROP_POPUP) # define FEAT_SIGNS -# if ((defined(FEAT_GUI_MOTIF) || defined(FEAT_GUI_ATHENA)) \ - && defined(HAVE_X11_XPM_H)) \ +# if (defined(FEAT_GUI_MOTIF) && defined(HAVE_X11_XPM_H)) \ || defined(FEAT_GUI_GTK) \ || (defined(MSWIN) && defined(FEAT_GUI)) # define FEAT_SIGN_ICONS @@ -1167,7 +1163,7 @@ * debugger and for tooltips. * Only for GUIs where it was implemented. */ -#if (defined(FEAT_GUI_MOTIF) || defined(FEAT_GUI_ATHENA) \ +#if (defined(FEAT_GUI_MOTIF) \ || defined(FEAT_GUI_GTK) || defined(FEAT_GUI_MSWIN)) \ && ( ((defined(FEAT_TOOLBAR) || defined(FEAT_GUI_TABLINE)) \ && !defined(FEAT_GUI_GTK) && !defined(FEAT_GUI_MSWIN)) \ @@ -1179,7 +1175,7 @@ # endif #endif -#if defined(FEAT_BEVAL_GUI) && (defined(FEAT_GUI_MOTIF) || defined(FEAT_GUI_ATHENA)) +#if defined(FEAT_BEVAL_GUI) && defined(FEAT_GUI_MOTIF) # define FEAT_BEVAL_TIP // balloon eval used for toolbar tooltip #endif @@ -1196,8 +1192,8 @@ # define FEAT_BEVAL #endif -// both Motif and Athena are X11 and share some code -#if defined(FEAT_GUI_MOTIF) || defined(FEAT_GUI_ATHENA) +// Motif is X11 +#if defined(FEAT_GUI_MOTIF) # define FEAT_GUI_X11 #endif
--- a/src/gui.c +++ b/src/gui.c @@ -53,15 +53,6 @@ static int can_update_cursor = TRUE; // static int disable_flush = 0; // If > 0, gui_mch_flush() is disabled. /* - * The Athena scrollbars can move the thumb to after the end of the scrollbar, - * this makes the thumb indicate the part of the text that is shown. Motif - * can't do this. - */ -#if defined(FEAT_GUI_ATHENA) -# define SCROLL_PAST_END -#endif - -/* * gui_start -- Called when user wants to start the GUI. * * Careful: This function can be called recursively when there is a ":gui" @@ -445,8 +436,7 @@ gui_init_check(void) gui.menu_width = 0; # endif #endif -#if defined(FEAT_TOOLBAR) && (defined(FEAT_GUI_MOTIF) || defined(FEAT_GUI_ATHENA) \ - || defined(FEAT_GUI_HAIKU)) +#if defined(FEAT_TOOLBAR) && (defined(FEAT_GUI_MOTIF) || defined(FEAT_GUI_HAIKU)) gui.toolbar_height = 0; #endif #if defined(FEAT_FOOTER) && defined(FEAT_GUI_MOTIF) @@ -789,7 +779,7 @@ gui_init(void) balloonEval = gui_mch_create_beval_area(gui.drawarea, NULL, &general_beval_cb, NULL); # else -# if defined(FEAT_GUI_MOTIF) || defined(FEAT_GUI_ATHENA) +# if defined(FEAT_GUI_MOTIF) { extern Widget textArea; balloonEval = gui_mch_create_beval_area(textArea, NULL, @@ -1441,11 +1431,11 @@ gui_position_components(int total_width text_area_y += gui.tabline_height; #endif -#if defined(FEAT_TOOLBAR) && (defined(FEAT_GUI_MOTIF) || defined(FEAT_GUI_ATHENA) \ +#if defined(FEAT_TOOLBAR) && (defined(FEAT_GUI_MOTIF) \ || defined(FEAT_GUI_HAIKU) || defined(FEAT_GUI_MSWIN)) if (vim_strchr(p_go, GO_TOOLBAR) != NULL) { -# if defined(FEAT_GUI_ATHENA) || defined(FEAT_GUI_HAIKU) +# if defined(FEAT_GUI_HAIKU) gui_mch_set_toolbar_pos(0, text_area_y, gui.menu_width, gui.toolbar_height); # endif @@ -2043,10 +2033,10 @@ gui_write( old_curwin = curwin; /* - * We need to make sure this is cleared since Athena doesn't tell us when - * he is done dragging. Do the same for GTK. + * We need to make sure this is cleared since GTK doesn't tell us when + * the user is done dragging. */ -#if defined(FEAT_GUI_ATHENA) || defined(FEAT_GUI_GTK) +#if defined(FEAT_GUI_GTK) gui.dragged_sb = SBAR_NONE; #endif @@ -3410,10 +3400,10 @@ button_set: prev_col = col; /* - * We need to make sure this is cleared since Athena doesn't tell us when - * he is done dragging. Neither does GTK+ 2 -- at least for now. + * We need to make sure this is cleared since GTK doesn't tell us when + * the user is done dragging. */ -#if defined(FEAT_GUI_ATHENA) || defined(FEAT_GUI_GTK) +#if defined(FEAT_GUI_GTK) gui.dragged_sb = SBAR_NONE; #endif } @@ -3952,9 +3942,6 @@ gui_create_scrollbar(scrollbar_T *sb, in sb->wp = wp; sb->type = type; sb->value = 0; -#ifdef FEAT_GUI_ATHENA - sb->pixval = 0; -#endif sb->size = 1; sb->max = 1; sb->top = 0; @@ -4336,7 +4323,7 @@ gui_update_scrollbars( y += gui.menu_height; #endif -#if defined(FEAT_TOOLBAR) && (defined(FEAT_GUI_MSWIN) || defined(FEAT_GUI_ATHENA) \ +#if defined(FEAT_TOOLBAR) && (defined(FEAT_GUI_MSWIN) \ || defined(FEAT_GUI_HAIKU)) if (vim_strchr(p_go, GO_TOOLBAR) != NULL) y += gui.toolbar_height; @@ -4369,25 +4356,10 @@ gui_update_scrollbars( } } - // Reduce the number of calls to gui_mch_set_scrollbar_thumb() by - // checking if the thumb moved at least a pixel. Only do this for - // Athena, most other GUIs require the update anyway to make the - // arrows work. -#ifdef FEAT_GUI_ATHENA - if (max == 0) - y = 0; - else - y = (val * (sb->height + 2) * gui.char_height + max / 2) / max; - if (force || sb->pixval != y || sb->size != size || sb->max != max) -#else if (force || sb->value != val || sb->size != size || sb->max != max) -#endif { // Thumb of scrollbar has moved sb->value = val; -#ifdef FEAT_GUI_ATHENA - sb->pixval = y; -#endif sb->size = size; sb->max = max; if (gui.which_scrollbars[SBAR_LEFT] @@ -5122,7 +5094,7 @@ ex_gui(exarg_T *eap) || defined(FEAT_GUI_HAIKU)) \ && defined(FEAT_TOOLBAR)) || defined(PROTO) /* - * This is shared between Athena, Haiku, Motif, and GTK. + * This is shared between Haiku, Motif, and GTK. */ /*
--- a/src/gui.h +++ b/src/gui.h @@ -11,11 +11,6 @@ # include <Xm/Xm.h> #endif -#ifdef FEAT_GUI_ATHENA -# include <X11/Intrinsic.h> -# include <X11/StringDefs.h> -#endif - #ifdef FEAT_GUI_GTK # ifdef VMS // undef MIN and MAX because Intrinsic.h redefines them anyway # ifdef MAX @@ -36,7 +31,7 @@ // Needed when generating prototypes, since FEAT_GUI is always defined then. #if defined(FEAT_XCLIPBOARD) && !defined(FEAT_GUI_MOTIF) \ - && !defined(FEAT_GUI_ATHENA) && !defined(FEAT_GUI_GTK) + && !defined(FEAT_GUI_GTK) # include <X11/Intrinsic.h> #endif @@ -160,9 +155,6 @@ typedef struct GuiScrollbar win_T *wp; // Scrollbar's window, NULL for bottom int type; // one of SBAR_{LEFT,RIGHT,BOTTOM} long value; // Represents top line number visible -#ifdef FEAT_GUI_ATHENA - int pixval; // pixel count of value -#endif long size; // Size of scrollbar thumb long max; // Number of lines in buffer @@ -277,9 +269,6 @@ typedef struct Gui int menu_width; // Width of the menu bar # endif char menu_is_active; // TRUE if menu is present -# ifdef FEAT_GUI_ATHENA - char menu_height_fixed; // TRUE if menu height fixed -# endif #endif scrollbar_T bottom_sbar; // Bottom scrollbar @@ -418,7 +407,7 @@ typedef struct Gui #endif #if defined(FEAT_TOOLBAR) \ - && (defined(FEAT_GUI_ATHENA) || defined(FEAT_GUI_MOTIF) || defined(FEAT_GUI_HAIKU) || defined(FEAT_GUI_MSWIN)) + && (defined(FEAT_GUI_MOTIF) || defined(FEAT_GUI_HAIKU) || defined(FEAT_GUI_MSWIN)) int toolbar_height; // height of the toolbar #endif
deleted file mode 100644 --- a/src/gui_at_fs.c +++ /dev/null @@ -1,2753 +0,0 @@ -/* vi:set ts=8 sts=4 sw=4 noet: */ - -/* - * Copyright 1989 Software Research Associates, Inc., Tokyo, Japan - * - * Permission to use, copy, modify, and distribute this software and its - * documentation for any purpose and without fee is hereby granted, provided - * that the above copyright notice appear in all copies and that both that - * copyright notice and this permission notice appear in supporting - * documentation, and that the name of Software Research Associates not be used - * in advertising or publicity pertaining to distribution of the software - * without specific, written prior permission. Software Research Associates - * makes no representations about the suitability of this software for any - * purpose. It is provided "as is" without express or implied warranty. - * - * SOFTWARE RESEARCH ASSOCIATES DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS - * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, - * IN NO EVENT SHALL SOFTWARE RESEARCH ASSOCIATES BE LIABLE FOR ANY SPECIAL, - * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM - * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE - * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - * PERFORMANCE OF THIS SOFTWARE. - * - * Author: Erik M. van der Poel - * Software Research Associates, Inc., Tokyo, Japan - * erik@sra.co.jp - */ -/* - * Author's addresses: - * erik@sra.co.jp - * erik%sra.co.jp@uunet.uu.net - * erik%sra.co.jp@mcvax.uucp - * try junet instead of co.jp - * Erik M. van der Poel - * Software Research Associates, Inc. - * 1-1-1 Hirakawa-cho, Chiyoda-ku - * Tokyo 102 Japan. TEL +81-3-234-2692 - */ - -/* - * Heavely modified for Vim by Bram Moolenaar - */ - -#include "vim.h" - -// Only include this when using the file browser - -#ifdef FEAT_BROWSE - -// Weird complication: for "make lint" Text.h doesn't combine with Xm.h -#if defined(FEAT_GUI_MOTIF) && defined(FMT8BIT) -# undef FMT8BIT -#endif - -#ifndef FEAT_GUI_NEXTAW -# include "gui_at_sb.h" -#endif - -////////////////// SFinternal.h - -#include <X11/Intrinsic.h> -#include <X11/StringDefs.h> -#include <X11/Xos.h> -#ifdef FEAT_GUI_NEXTAW -# include <X11/neXtaw/Text.h> -# include <X11/neXtaw/AsciiText.h> -# include <X11/neXtaw/Scrollbar.h> -#else -# include <X11/Xaw/Text.h> -# include <X11/Xaw/AsciiText.h> -#endif - -#define SEL_FILE_CANCEL -1 -#define SEL_FILE_OK 0 -#define SEL_FILE_NULL 1 -#define SEL_FILE_TEXT 2 - -#define SF_DO_SCROLL 1 -#define SF_DO_NOT_SCROLL 0 - -typedef struct -{ - int statDone; - char *real; - char *shown; -} SFEntry; - -typedef struct -{ - char *dir; - char *path; - SFEntry *entries; - int nEntries; - int vOrigin; - int nChars; - int hOrigin; - int changed; - int beginSelection; - int endSelection; - time_t mtime; -} SFDir; - -static char SFstartDir[MAXPATHL], - SFcurrentPath[MAXPATHL], - SFcurrentDir[MAXPATHL]; - -static Widget selFile, - selFileField, - selFileForm, - selFileHScroll, - selFileHScrolls[3], - selFileLists[3], - selFileOK, - selFileCancel, - selFilePrompt, - selFileVScrolls[3]; - -static Display *SFdisplay; - -static int SFcharWidth, SFcharAscent, SFcharHeight; - -static SFDir *SFdirs = NULL; - -static int SFdirEnd; -static int SFdirPtr; - -static Pixel SFfore, SFback; - -static Atom SFwmDeleteWindow; - -static XSegment SFsegs[2], SFcompletionSegs[2]; - -static XawTextPosition SFtextPos; - -static int SFupperX, SFlowerY, SFupperY; - -static int SFtextX, SFtextYoffset; - -static int SFentryWidth, SFentryHeight; - -static int SFlineToTextH = 3; -static int SFlineToTextV = 3; - -static int SFbesideText = 3; -static int SFaboveAndBelowText = 2; - -static int SFcharsPerEntry = 15; - -static int SFlistSize = 10; - -static int SFcurrentInvert[3] = { -1, -1, -1 }; - -static int SFworkProcAdded = 0; - -static XtAppContext SFapp; - -static int SFpathScrollWidth, SFvScrollHeight, SFhScrollWidth; - -#ifdef FEAT_XFONTSET -static char SFtextBuffer[MAXPATHL*sizeof(wchar_t)]; -#else -static char SFtextBuffer[MAXPATHL]; -#endif - -static int SFbuttonPressed = 0; - -static XtIntervalId SFdirModTimerId; - -static int (*SFfunc)(); - -static int SFstatus = SEL_FILE_NULL; - -///////////////// forward declare static functions - -static void SFsetText(char *path); -static void SFtextChanged(void); -static int SFgetDir(SFDir *dir); -static void SFdrawLists(int doScroll); -static void SFdrawList(int n, int doScroll); -static void SFclearList(int n, int doScroll); -static char SFstatChar(stat_T *statBuf); -static void SFmotionList(Widget w, XtPointer np, XMotionEvent *event, Boolean *cont); -static void SFvSliderMovedCallback(Widget w, int n, int nw); -static Boolean SFworkProc(void *); -static int SFcompareEntries(const void *p, const void *q); - -////////////////// xstat.h - -#ifndef S_IXUSR -# define S_IXUSR 0100 -#endif -#ifndef S_IXGRP -# define S_IXGRP 0010 -#endif -#ifndef S_IXOTH -# define S_IXOTH 0001 -#endif - -#define S_ISXXX(m) ((m) & (S_IXUSR | S_IXGRP | S_IXOTH)) - -////////////////// Path.c - -#include <pwd.h> - -typedef struct -{ - char *name; - char *dir; -} SFLogin; - -static int SFdoNotTouchDirPtr = 0; - -static int SFdoNotTouchVorigin = 0; - -static SFDir SFrootDir, SFhomeDir; - -static SFLogin *SFlogins; - -static int SFtwiddle = 0; - - static int -SFchdir(char *path) -{ - int result; - - result = 0; - - if (strcmp(path, SFcurrentDir)) - { - result = mch_chdir(path); - if (!result) - (void) strcpy(SFcurrentDir, path); - } - - return result; -} - - static void -SFfree(int i) -{ - SFDir *dir; - int j; - - dir = &(SFdirs[i]); - - for (j = dir->nEntries - 1; j >= 0; j--) - { - if (dir->entries[j].shown != dir->entries[j].real) - XtFree(dir->entries[j].shown); - XtFree(dir->entries[j].real); - } - - XtFree((char *)dir->entries); - XtFree(dir->dir); - - dir->dir = NULL; -} - - static void -SFstrdup(char **s1, char *s2) -{ - *s1 = strcpy(XtMalloc((unsigned)(strlen(s2) + 1)), s2); -} - - static void -SFunreadableDir(SFDir *dir) -{ - char *cannotOpen = _("<cannot open> "); - - dir->entries = (SFEntry *) XtMalloc(sizeof(SFEntry)); - dir->entries[0].statDone = 1; - SFstrdup(&dir->entries[0].real, cannotOpen); - dir->entries[0].shown = dir->entries[0].real; - dir->nEntries = 1; - dir->nChars = strlen(cannotOpen); -} - - static void -SFreplaceText(SFDir *dir, char *str) -{ - int len; - - *(dir->path) = 0; - len = strlen(str); - if (str[len - 1] == '/') - (void) strcat(SFcurrentPath, str); - else - (void) strncat(SFcurrentPath, str, len - 1); - if (strncmp(SFcurrentPath, SFstartDir, strlen(SFstartDir))) - SFsetText(SFcurrentPath); - else - SFsetText(&(SFcurrentPath[strlen(SFstartDir)])); - - SFtextChanged(); -} - - static void -SFexpand(char *str) -{ - int len; - int cmp; - char *name, *growing; - SFDir *dir; - SFEntry *entry, *max; - - len = strlen(str); - - dir = &(SFdirs[SFdirEnd - 1]); - - if (dir->beginSelection == -1) - { - SFstrdup(&str, str); - SFreplaceText(dir, str); - XtFree(str); - return; - } - else if (dir->beginSelection == dir->endSelection) - { - SFreplaceText(dir, dir->entries[dir->beginSelection].shown); - return; - } - - max = &(dir->entries[dir->endSelection + 1]); - - name = dir->entries[dir->beginSelection].shown; - SFstrdup(&growing, name); - - cmp = 0; - while (!cmp) - { - entry = &(dir->entries[dir->beginSelection]); - while (entry < max) - { - if ((cmp = strncmp(growing, entry->shown, len))) - break; - entry++; - } - len++; - } - - /* - * SFreplaceText() expects filename - */ - growing[len - 2] = ' '; - - growing[len - 1] = 0; - SFreplaceText(dir, growing); - XtFree(growing); -} - - static int -SFfindFile(SFDir *dir, char *str) -{ - int i, last, max; - char *name, save; - SFEntry *entries; - int len; - int begin, end; - int result; - - len = strlen(str); - - if (str[len - 1] == ' ') - { - SFexpand(str); - return 1; - } - else if (str[len - 1] == '/') - len--; - - max = dir->nEntries; - - entries = dir->entries; - - i = 0; - while (i < max) - { - name = entries[i].shown; - last = strlen(name) - 1; - save = name[last]; - name[last] = 0; - - result = strncmp(str, name, len); - - name[last] = save; - if (result <= 0) - break; - i++; - } - begin = i; - while (i < max) - { - name = entries[i].shown; - last = strlen(name) - 1; - save = name[last]; - name[last] = 0; - - result = strncmp(str, name, len); - - name[last] = save; - if (result) - break; - i++; - } - end = i; - - if (begin != end) - { - if ((dir->beginSelection != begin) || (dir->endSelection != end - 1)) - { - dir->changed = 1; - dir->beginSelection = begin; - if (str[strlen(str) - 1] == '/') - dir->endSelection = begin; - else - dir->endSelection = end - 1; - } - } - else if (dir->beginSelection != -1) - { - dir->changed = 1; - dir->beginSelection = -1; - dir->endSelection = -1; - } - - if (SFdoNotTouchVorigin - || ((begin > dir->vOrigin) && (end < dir->vOrigin + SFlistSize))) - { - SFdoNotTouchVorigin = 0; - return 0; - } - - i = begin - 1; - if (i > max - SFlistSize) - i = max - SFlistSize; - if (i < 0) - i = 0; - - if (dir->vOrigin != i) - { - dir->vOrigin = i; - dir->changed = 1; - } - - return 0; -} - - static void -SFunselect(void) -{ - SFDir *dir; - - dir = &(SFdirs[SFdirEnd - 1]); - if (dir->beginSelection != -1) - dir->changed = 1; - dir->beginSelection = -1; - dir->endSelection = -1; -} - - static int -SFcompareLogins(const void *p, const void *q) -{ - return strcmp(((SFLogin *)p)->name, ((SFLogin *)q)->name); -} - - static void -SFgetHomeDirs(void) -{ - struct passwd *pw; - int Alloc; - int i; - SFEntry *entries = NULL; - int len; - int maxChars; - - Alloc = 1; - i = 1; - entries = (SFEntry *)XtMalloc(sizeof(SFEntry)); - SFlogins = (SFLogin *)XtMalloc(sizeof(SFLogin)); - entries[0].real = XtMalloc(3); - (void) strcpy(entries[0].real, "~"); - entries[0].shown = entries[0].real; - entries[0].statDone = 1; - SFlogins[0].name = ""; - pw = getpwuid((int) getuid()); - SFstrdup(&SFlogins[0].dir, pw ? pw->pw_dir : "/"); - maxChars = 0; - - (void) setpwent(); - - while ((pw = getpwent()) && (*(pw->pw_name))) - { - if (i >= Alloc) - { - Alloc *= 2; - entries = (SFEntry *) XtRealloc((char *)entries, - (unsigned)(Alloc * sizeof(SFEntry))); - SFlogins = (SFLogin *) XtRealloc((char *)SFlogins, - (unsigned)(Alloc * sizeof(SFLogin))); - } - len = strlen(pw->pw_name); - entries[i].real = XtMalloc((unsigned)(len + 3)); - (void) strcat(strcpy(entries[i].real, "~"), pw->pw_name); - entries[i].shown = entries[i].real; - entries[i].statDone = 1; - if (len > maxChars) - maxChars = len; - SFstrdup(&SFlogins[i].name, pw->pw_name); - SFstrdup(&SFlogins[i].dir, pw->pw_dir); - i++; - } - - SFhomeDir.dir = XtMalloc(1); - SFhomeDir.dir[0] = 0; - SFhomeDir.path = SFcurrentPath; - SFhomeDir.entries = entries; - SFhomeDir.nEntries = i; - SFhomeDir.vOrigin = 0; // :-) - SFhomeDir.nChars = maxChars + 2; - SFhomeDir.hOrigin = 0; - SFhomeDir.changed = 1; - SFhomeDir.beginSelection = -1; - SFhomeDir.endSelection = -1; - - qsort((char *)entries, (size_t)i, sizeof(SFEntry), SFcompareEntries); - qsort((char *)SFlogins, (size_t)i, sizeof(SFLogin), SFcompareLogins); - - for (i--; i >= 0; i--) - (void)strcat(entries[i].real, "/"); -} - - static int -SFfindHomeDir(char *begin, char *end) -{ - char save; - char *theRest; - int i; - - save = *end; - *end = 0; - - for (i = SFhomeDir.nEntries - 1; i >= 0; i--) - { - if (!strcmp(SFhomeDir.entries[i].real, begin)) - { - *end = save; - SFstrdup(&theRest, end); - (void) strcat(strcat(strcpy(SFcurrentPath, - SFlogins[i].dir), "/"), theRest); - XtFree(theRest); - SFsetText(SFcurrentPath); - SFtextChanged(); - return 1; - } - } - - *end = save; - - return 0; -} - - static void -SFupdatePath(void) -{ - static int Alloc; - static int wasTwiddle = 0; - char *begin, *end; - int i, j; - int prevChange; - int SFdirPtrSave, SFdirEndSave; - SFDir *dir; - - if (!SFdirs) - { - SFdirs = (SFDir *) XtMalloc((Alloc = 10) * sizeof(SFDir)); - dir = &(SFdirs[0]); - SFstrdup(&dir->dir, "/"); - (void) SFchdir("/"); - (void) SFgetDir(dir); - for (j = 1; j < Alloc; j++) - SFdirs[j].dir = NULL; - dir->path = SFcurrentPath + 1; - dir->vOrigin = 0; - dir->hOrigin = 0; - dir->changed = 1; - dir->beginSelection = -1; - dir->endSelection = -1; - SFhomeDir.dir = NULL; - } - - SFdirEndSave = SFdirEnd; - SFdirEnd = 1; - - SFdirPtrSave = SFdirPtr; - SFdirPtr = 0; - - begin = NULL; - - if (SFcurrentPath[0] == '~') - { - if (!SFtwiddle) - { - SFtwiddle = 1; - dir = &(SFdirs[0]); - SFrootDir = *dir; - if (!SFhomeDir.dir) - SFgetHomeDirs(); - *dir = SFhomeDir; - dir->changed = 1; - } - end = SFcurrentPath; - SFdoNotTouchDirPtr = 1; - wasTwiddle = 1; - } - else - { - if (SFtwiddle) - { - SFtwiddle = 0; - dir = &(SFdirs[0]); - *dir = SFrootDir; - dir->changed = 1; - } - end = SFcurrentPath + 1; - } - - i = 0; - - prevChange = 0; - - while (*end) - { - while (*end++ == '/') - ; - end--; - begin = end; - while ((*end) && (*end++ != '/')) - ; - if ((end - SFcurrentPath <= SFtextPos) && (*(end - 1) == '/')) - { - SFdirPtr = i - 1; - if (SFdirPtr < 0) - SFdirPtr = 0; - } - if (*begin) - { - if (*(end - 1) == '/') - { - char save = *end; - - if (SFtwiddle) - { - if (SFfindHomeDir(begin, end)) - return; - } - *end = 0; - i++; - SFdirEnd++; - if (i >= Alloc) - { - SFdirs = (SFDir *) XtRealloc((char *) SFdirs, - (unsigned)((Alloc *= 2) * sizeof(SFDir))); - for (j = Alloc / 2; j < Alloc; j++) - SFdirs[j].dir = NULL; - } - dir = &(SFdirs[i]); - if ((!(dir->dir)) || prevChange || strcmp(dir->dir, begin)) - { - if (dir->dir) - SFfree(i); - prevChange = 1; - SFstrdup(&dir->dir, begin); - dir->path = end; - dir->vOrigin = 0; - dir->hOrigin = 0; - dir->changed = 1; - dir->beginSelection = -1; - dir->endSelection = -1; - (void)SFfindFile(dir - 1, begin); - if (SFchdir(SFcurrentPath) || SFgetDir(dir)) - { - SFunreadableDir(dir); - break; - } - } - *end = save; - if (!save) - SFunselect(); - } - else - { - if (SFfindFile(&(SFdirs[SFdirEnd-1]), begin)) - return; - } - } - else - SFunselect(); - } - - if ((end == SFcurrentPath + 1) && (!SFtwiddle)) - SFunselect(); - - for (i = SFdirEnd; i < Alloc; i++) - if (SFdirs[i].dir) - SFfree(i); - - if (SFdoNotTouchDirPtr) - { - if (wasTwiddle) - { - wasTwiddle = 0; - SFdirPtr = SFdirEnd - 2; - if (SFdirPtr < 0) - SFdirPtr = 0; - } - else - SFdirPtr = SFdirPtrSave; - SFdoNotTouchDirPtr = 0; - } - - if ((SFdirPtr != SFdirPtrSave) || (SFdirEnd != SFdirEndSave)) - { -#ifdef FEAT_GUI_NEXTAW - XawScrollbarSetThumb( selFileHScroll, - (float) (((double) SFdirPtr) / SFdirEnd), - (float) (((double) ((SFdirEnd < 3) ? SFdirEnd : 3)) / - SFdirEnd)); -#else - vim_XawScrollbarSetThumb( selFileHScroll, - (float) (((double) SFdirPtr) / SFdirEnd), - (float) (((double) ((SFdirEnd < 3) ? SFdirEnd : 3)) / - SFdirEnd), - (double)SFdirEnd); -#endif - } - - if (SFdirPtr != SFdirPtrSave) - SFdrawLists(SF_DO_SCROLL); - else - for (i = 0; i < 3; i++) - { - if (SFdirPtr + i < SFdirEnd) - { - if (SFdirs[SFdirPtr + i].changed) - { - SFdirs[SFdirPtr + i].changed = 0; - SFdrawList(i, SF_DO_SCROLL); - } - } - else - SFclearList(i, SF_DO_SCROLL); - } -} - -#ifdef XtNinternational - static int -WcsLen(wchar_t *p) -{ - int i = 0; - while (*p++ != 0) - i++; - return i; -} -#endif - - static void -SFsetText(char *path) -{ - XawTextBlock text; - - text.firstPos = 0; - text.length = strlen(path); - text.ptr = path; - text.format = FMT8BIT; - -#ifdef XtNinternational - if ((unsigned long)_XawTextFormat((TextWidget)selFileField) == XawFmtWide) - { - XawTextReplace(selFileField, (XawTextPosition)0, - (XawTextPosition)WcsLen((wchar_t *)&SFtextBuffer[0]), &text); - XawTextSetInsertionPoint(selFileField, - (XawTextPosition)WcsLen((wchar_t *)&SFtextBuffer[0])); - } - else - { - XawTextReplace(selFileField, (XawTextPosition)0, - (XawTextPosition)strlen(SFtextBuffer), &text); - XawTextSetInsertionPoint(selFileField, - (XawTextPosition)strlen(SFtextBuffer)); - } -#else - XawTextReplace(selFileField, (XawTextPosition)0, - (XawTextPosition)strlen(SFtextBuffer), &text); - XawTextSetInsertionPoint(selFileField, - (XawTextPosition)strlen(SFtextBuffer)); -#endif -} - - static void -SFbuttonPressList( - Widget w UNUSED, - XtPointer np UNUSED, - XEvent *event UNUSED, - Boolean *cont UNUSED) -{ - SFbuttonPressed = 1; -} - - static void -SFbuttonReleaseList( - Widget w UNUSED, - XtPointer np, - XEvent *event UNUSED, - Boolean *cont UNUSED) -{ - long n = (long)np; - SFDir *dir; - - SFbuttonPressed = 0; - - if (SFcurrentInvert[n] != -1) - { - if (n < 2) - SFdoNotTouchDirPtr = 1; - SFdoNotTouchVorigin = 1; - dir = &(SFdirs[SFdirPtr + n]); - SFreplaceText(dir, - dir->entries[dir->vOrigin + SFcurrentInvert[n]].shown); - SFmotionList(w, (XtPointer)(long)n, (XMotionEvent *)event, 0); - } -} - - static int -SFcheckDir(int n, SFDir *dir) -{ - stat_T statBuf; - int i; - - if ((!mch_stat(".", &statBuf)) && (statBuf.st_mtime != dir->mtime)) - { - /* - * If the pointer is currently in the window that we are about - * to update, we must warp it to prevent the user from - * accidentally selecting the wrong file. - */ - if (SFcurrentInvert[n] != -1) - { - XWarpPointer( - SFdisplay, - None, - XtWindow(selFileLists[n]), - 0, - 0, - 0, - 0, - 0, - 0); - } - - for (i = dir->nEntries - 1; i >= 0; i--) - { - if (dir->entries[i].shown != dir->entries[i].real) - XtFree(dir->entries[i].shown); - XtFree(dir->entries[i].real); - } - XtFree((char *) dir->entries); - if (SFgetDir(dir)) - SFunreadableDir(dir); - if (dir->vOrigin > dir->nEntries - SFlistSize) - dir->vOrigin = dir->nEntries - SFlistSize; - if (dir->vOrigin < 0) - dir->vOrigin = 0; - if (dir->hOrigin > dir->nChars - SFcharsPerEntry) - dir->hOrigin = dir->nChars - SFcharsPerEntry; - if (dir->hOrigin < 0) - dir->hOrigin = 0; - dir->beginSelection = -1; - dir->endSelection = -1; - SFdoNotTouchVorigin = 1; - if ((dir + 1)->dir) - (void) SFfindFile(dir, (dir + 1)->dir); - else - (void) SFfindFile(dir, dir->path); - - if (!SFworkProcAdded) - { - (void) XtAppAddWorkProc(SFapp, (XtWorkProc)SFworkProc, NULL); - SFworkProcAdded = 1; - } - return 1; - } - return 0; -} - - static int -SFcheckFiles(SFDir *dir) -{ - int from, to; - int result; - char oldc, newc; - int i; - char *str; - int last; - stat_T statBuf; - - result = 0; - - from = dir->vOrigin; - to = dir->vOrigin + SFlistSize; - if (to > dir->nEntries) - to = dir->nEntries; - - for (i = from; i < to; i++) - { - str = dir->entries[i].real; - last = strlen(str) - 1; - oldc = str[last]; - str[last] = 0; - if (mch_stat(str, &statBuf)) - newc = ' '; - else - newc = SFstatChar(&statBuf); - str[last] = newc; - if (newc != oldc) - result = 1; - } - - return result; -} - - static void -SFdirModTimer(XtPointer cl UNUSED, XtIntervalId *id UNUSED) -{ - static int n = -1; - static int f = 0; - char save; - SFDir *dir; - - if ((!SFtwiddle) && (SFdirPtr < SFdirEnd)) - { - n++; - if ((n > 2) || (SFdirPtr + n >= SFdirEnd)) - { - n = 0; - f++; - if ((f > 2) || (SFdirPtr + f >= SFdirEnd)) - f = 0; - } - dir = &(SFdirs[SFdirPtr + n]); - save = *(dir->path); - *(dir->path) = 0; - if (SFchdir(SFcurrentPath)) - { - *(dir->path) = save; - - /* - * force a re-read - */ - *(dir->dir) = 0; - - SFupdatePath(); - } - else - { - *(dir->path) = save; - if (SFcheckDir(n, dir) || ((f == n) && SFcheckFiles(dir))) - SFdrawList(n, SF_DO_SCROLL); - } - } - - SFdirModTimerId = XtAppAddTimeOut(SFapp, (unsigned long) 1000, - SFdirModTimer, (XtPointer) NULL); -} - -// Return a single character describing what kind of file STATBUF is. - - static char -SFstatChar(stat_T *statBuf) -{ - if (S_ISDIR (statBuf->st_mode)) - return '/'; - if (S_ISREG (statBuf->st_mode)) - return S_ISXXX (statBuf->st_mode) ? '*' : ' '; -#ifdef S_ISSOCK - if (S_ISSOCK (statBuf->st_mode)) - return '='; -#endif // S_ISSOCK - return ' '; -} - -////////////////// Draw.c - -#ifdef FEAT_GUI_NEXTAW -# include <X11/neXtaw/Cardinals.h> -#else -# include <X11/Xaw/Cardinals.h> -#endif - -#ifdef FEAT_XFONTSET -# define SF_DEFAULT_FONT "-misc-fixed-medium-r-normal--14-*" -#else -# define SF_DEFAULT_FONT "9x15" -#endif - -#ifdef ABS -# undef ABS -#endif -#define ABS(x) (((x) < 0) ? (-(x)) : (x)) - -typedef struct -{ - char *fontname; -} TextData; - -static GC SFlineGC, SFscrollGC, SFinvertGC, SFtextGC; - -static XtResource textResources[] = -{ -#ifdef FEAT_XFONTSET - {XtNfontSet, XtCFontSet, XtRString, sizeof (char *), - XtOffsetOf(TextData, fontname), XtRString, SF_DEFAULT_FONT}, -#else - {XtNfont, XtCFont, XtRString, sizeof (char *), - XtOffsetOf(TextData, fontname), XtRString, SF_DEFAULT_FONT}, -#endif -}; - -#ifdef FEAT_XFONTSET -static XFontSet SFfont; -#else -static XFontStruct *SFfont; -#endif - -static int SFcurrentListY; - -static XtIntervalId SFscrollTimerId; - - static void -SFinitFont(void) -{ - TextData *data; -#ifdef FEAT_XFONTSET - XFontSetExtents *extents; - char **missing, *def_str; - int num_missing; -#endif - - data = XtNew(TextData); - - XtGetApplicationResources(selFileForm, (XtPointer) data, textResources, - XtNumber(textResources), (Arg *) NULL, ZERO); - -#ifdef FEAT_XFONTSET - SFfont = XCreateFontSet(SFdisplay, data->fontname, - &missing, &num_missing, &def_str); -#else - SFfont = XLoadQueryFont(SFdisplay, data->fontname); -#endif - if (!SFfont) - { -#ifdef FEAT_XFONTSET - SFfont = XCreateFontSet(SFdisplay, SF_DEFAULT_FONT, - &missing, &num_missing, &def_str); -#else - SFfont = XLoadQueryFont(SFdisplay, SF_DEFAULT_FONT); -#endif - if (!SFfont) - { - semsg(_(e_vim_selfile_cant_get_font_str), SF_DEFAULT_FONT); - SFstatus = SEL_FILE_CANCEL; - return; - } - } - -#ifdef FEAT_XFONTSET - extents = XExtentsOfFontSet(SFfont); - SFcharWidth = extents->max_logical_extent.width; - SFcharAscent = -extents->max_logical_extent.y; - SFcharHeight = extents->max_logical_extent.height; -#else - SFcharWidth = (SFfont->max_bounds.width + SFfont->min_bounds.width) / 2; - SFcharAscent = SFfont->max_bounds.ascent; - SFcharHeight = SFcharAscent + SFfont->max_bounds.descent; -#endif -} - - static void -SFcreateGC(void) -{ - XGCValues gcValues; - XRectangle rectangles[1]; - - gcValues.foreground = SFfore; - - SFlineGC = XtGetGC( - selFileLists[0], - (XtGCMask)GCForeground, - &gcValues); - - SFscrollGC = XtGetGC( - selFileLists[0], - (XtGCMask)0, - &gcValues); - - gcValues.function = GXxor; - gcValues.foreground = SFfore ^ SFback; - gcValues.background = SFfore ^ SFback; - - SFinvertGC = XtGetGC( - selFileLists[0], - (XtGCMask)GCFunction | GCForeground | GCBackground, - &gcValues); - - gcValues.foreground = SFfore; - gcValues.background = SFback; -#ifndef FEAT_XFONTSET - gcValues.font = SFfont->fid; -#endif - - SFtextGC = XCreateGC( - SFdisplay, - XtWindow(selFileLists[0]), -#ifdef FEAT_XFONTSET - (unsigned long)GCForeground | GCBackground, -#else - (unsigned long)GCForeground | GCBackground | GCFont, -#endif - &gcValues); - - rectangles[0].x = SFlineToTextH + SFbesideText; - rectangles[0].y = 0; - rectangles[0].width = SFcharsPerEntry * SFcharWidth; - rectangles[0].height = SFupperY + 1; - - XSetClipRectangles( - SFdisplay, - SFtextGC, - 0, - 0, - rectangles, - 1, - Unsorted); -} - - static void -SFclearList(int n, int doScroll) -{ - SFDir *dir; - - SFcurrentInvert[n] = -1; - - XClearWindow(SFdisplay, XtWindow(selFileLists[n])); - - XDrawSegments(SFdisplay, XtWindow(selFileLists[n]), SFlineGC, SFsegs, 2); - - if (doScroll) - { - dir = &(SFdirs[SFdirPtr + n]); - - if ((SFdirPtr + n < SFdirEnd) && dir->nEntries && dir->nChars) - { -#ifdef FEAT_GUI_NEXTAW - XawScrollbarSetThumb( - selFileVScrolls[n], - (float) (((double) dir->vOrigin) / - dir->nEntries), - (float) (((double) ((dir->nEntries < SFlistSize) - ? dir->nEntries : SFlistSize)) / - dir->nEntries)); -#else - vim_XawScrollbarSetThumb( - selFileVScrolls[n], - (float) (((double) dir->vOrigin) / - dir->nEntries), - (float) (((double) ((dir->nEntries < SFlistSize) - ? dir->nEntries : SFlistSize)) / - dir->nEntries), - (double)dir->nEntries); -#endif - -#ifdef FEAT_GUI_NEXTAW - XawScrollbarSetThumb( - selFileHScrolls[n], - (float) (((double) dir->hOrigin) / dir->nChars), - (float) (((double) ((dir->nChars < - SFcharsPerEntry) ? dir->nChars : - SFcharsPerEntry)) / dir->nChars)); -#else - vim_XawScrollbarSetThumb( - selFileHScrolls[n], - (float) (((double) dir->hOrigin) / dir->nChars), - (float) (((double) ((dir->nChars < - SFcharsPerEntry) ? dir->nChars : - SFcharsPerEntry)) / dir->nChars), - (double)dir->nChars); -#endif - } - else - { -#ifdef FEAT_GUI_NEXTAW - XawScrollbarSetThumb(selFileVScrolls[n], (float) 0.0, - (float) 1.0); -#else - vim_XawScrollbarSetThumb(selFileVScrolls[n], (float) 0.0, - (float) 1.0, 1.0); -#endif -#ifdef FEAT_GUI_NEXTAW - XawScrollbarSetThumb(selFileHScrolls[n], (float) 0.0, - (float) 1.0); -#else - vim_XawScrollbarSetThumb(selFileHScrolls[n], (float) 0.0, - (float) 1.0, 1.0); -#endif - } - } -} - - static void -SFdeleteEntry(SFDir *dir, SFEntry *entry) -{ - SFEntry *e; - SFEntry *end; - int n; - int idx; - - idx = entry - dir->entries; - - if (idx < dir->beginSelection) - dir->beginSelection--; - if (idx <= dir->endSelection) - dir->endSelection--; - if (dir->beginSelection > dir->endSelection) - dir->beginSelection = dir->endSelection = -1; - - if (idx < dir->vOrigin) - dir->vOrigin--; - - XtFree(entry->real); - - end = &(dir->entries[dir->nEntries - 1]); - - for (e = entry; e < end; e++) - *e = *(e + 1); - - if (!(--dir->nEntries)) - return; - - n = dir - &(SFdirs[SFdirPtr]); - if ((n < 0) || (n > 2)) - return; - -#ifdef FEAT_GUI_NEXTAW - XawScrollbarSetThumb( - selFileVScrolls[n], - (float) (((double) dir->vOrigin) / dir->nEntries), - (float) (((double) ((dir->nEntries < SFlistSize) ? - dir->nEntries : SFlistSize)) / dir->nEntries)); -#else - vim_XawScrollbarSetThumb( - selFileVScrolls[n], - (float) (((double) dir->vOrigin) / dir->nEntries), - (float) (((double) ((dir->nEntries < SFlistSize) ? - dir->nEntries : SFlistSize)) / dir->nEntries), - (double)dir->nEntries); -#endif -} - - static void -SFwriteStatChar( - char *name, - int last, - stat_T *statBuf) -{ - name[last] = SFstatChar(statBuf); -} - - static int -SFstatAndCheck(SFDir *dir, SFEntry *entry) -{ - stat_T statBuf; - char save; - int last; - - /* - * must be restored before returning - */ - save = *(dir->path); - *(dir->path) = 0; - - if (!SFchdir(SFcurrentPath)) - { - last = strlen(entry->real) - 1; - entry->real[last] = 0; - entry->statDone = 1; - if ((!mch_stat(entry->real, &statBuf)) -#ifdef S_IFLNK - || (!mch_lstat(entry->real, &statBuf)) -#endif - ) - { - if (SFfunc) - { - char *shown; - - shown = NULL; - if (SFfunc(entry->real, &shown, &statBuf)) - { - if (shown) - { - int len; - - len = strlen(shown); - entry->shown = XtMalloc((unsigned)(len + 2)); - (void) strcpy(entry->shown, shown); - SFwriteStatChar(entry->shown, len, &statBuf); - entry->shown[len + 1] = 0; - } - } - else - { - SFdeleteEntry(dir, entry); - - *(dir->path) = save; - return 1; - } - } - SFwriteStatChar(entry->real, last, &statBuf); - } - else - entry->real[last] = ' '; - } - - *(dir->path) = save; - return 0; -} - - - static void -SFdrawStrings( - Window w, - SFDir *dir, - int from, - int to) -{ - int i; - SFEntry *entry; - int x; - - x = SFtextX - dir->hOrigin * SFcharWidth; - - if (dir->vOrigin + to >= dir->nEntries) - to = dir->nEntries - dir->vOrigin - 1; - for (i = from; i <= to; i++) - { - entry = &(dir->entries[dir->vOrigin + i]); - if (!(entry->statDone)) - { - if (SFstatAndCheck(dir, entry)) - { - if (dir->vOrigin + to >= dir->nEntries) - to = dir->nEntries - dir->vOrigin - 1; - i--; - continue; - } - } -#ifdef FEAT_XFONTSET - XmbDrawImageString( - SFdisplay, - w, - SFfont, - SFtextGC, - x, - SFtextYoffset + i * SFentryHeight, - entry->shown, - strlen(entry->shown)); -#else - XDrawImageString( - SFdisplay, - w, - SFtextGC, - x, - SFtextYoffset + i * SFentryHeight, - entry->shown, - strlen(entry->shown)); -#endif - if (dir->vOrigin + i == dir->beginSelection) - { - XDrawLine( - SFdisplay, - w, - SFlineGC, - SFlineToTextH + 1, - SFlowerY + i * SFentryHeight, - SFlineToTextH + SFentryWidth - 2, - SFlowerY + i * SFentryHeight); - } - if ((dir->vOrigin + i >= dir->beginSelection) && - (dir->vOrigin + i <= dir->endSelection)) - { - SFcompletionSegs[0].y1 = SFcompletionSegs[1].y1 = - SFlowerY + i * SFentryHeight; - SFcompletionSegs[0].y2 = SFcompletionSegs[1].y2 = - SFlowerY + (i + 1) * SFentryHeight - 1; - XDrawSegments( - SFdisplay, - w, - SFlineGC, - SFcompletionSegs, - 2); - } - if (dir->vOrigin + i == dir->endSelection) - { - XDrawLine( - SFdisplay, - w, - SFlineGC, - SFlineToTextH + 1, - SFlowerY + (i + 1) * SFentryHeight - 1, - SFlineToTextH + SFentryWidth - 2, - SFlowerY + (i + 1) * SFentryHeight - 1); - } - } -} - - static void -SFdrawList(int n, int doScroll) -{ - SFDir *dir; - Window w; - - SFclearList(n, doScroll); - - if (SFdirPtr + n < SFdirEnd) - { - dir = &(SFdirs[SFdirPtr + n]); - w = XtWindow(selFileLists[n]); -#ifdef FEAT_XFONTSET - XmbDrawImageString( - SFdisplay, - w, - SFfont, - SFtextGC, - SFtextX - dir->hOrigin * SFcharWidth, - SFlineToTextV + SFaboveAndBelowText + SFcharAscent, - dir->dir, - strlen(dir->dir)); -#else - XDrawImageString( - SFdisplay, - w, - SFtextGC, - SFtextX - dir->hOrigin * SFcharWidth, - SFlineToTextV + SFaboveAndBelowText + SFcharAscent, - dir->dir, - strlen(dir->dir)); -#endif - SFdrawStrings(w, dir, 0, SFlistSize - 1); - } -} - - static void -SFdrawLists(int doScroll) -{ - int i; - - for (i = 0; i < 3; i++) - SFdrawList(i, doScroll); -} - - static void -SFinvertEntry(int n) -{ - XFillRectangle( - SFdisplay, - XtWindow(selFileLists[n]), - SFinvertGC, - SFlineToTextH, - SFcurrentInvert[n] * SFentryHeight + SFlowerY, - SFentryWidth, - SFentryHeight); -} - - static unsigned long -SFscrollTimerInterval(void) -{ - static int maxVal = 200; - static int varyDist = 50; - static int minDist = 50; - int t; - int dist; - - if (SFcurrentListY < SFlowerY) - dist = SFlowerY - SFcurrentListY; - else if (SFcurrentListY > SFupperY) - dist = SFcurrentListY - SFupperY; - else - return (unsigned long) 1; - - t = maxVal - ((maxVal / varyDist) * (dist - minDist)); - - if (t < 1) - t = 1; - - if (t > maxVal) - t = maxVal; - - return (unsigned long)t; -} - - static void -SFscrollTimer(XtPointer p, XtIntervalId *id UNUSED) -{ - SFDir *dir; - int save; - int n; - - n = (long)p; - - dir = &(SFdirs[SFdirPtr + n]); - save = dir->vOrigin; - - if (SFcurrentListY < SFlowerY) - { - if (dir->vOrigin > 0) - SFvSliderMovedCallback(selFileVScrolls[n], n, dir->vOrigin - 1); - } - else if (SFcurrentListY > SFupperY) - { - if (dir->vOrigin < dir->nEntries - SFlistSize) - SFvSliderMovedCallback(selFileVScrolls[n], n, dir->vOrigin + 1); - } - - if (dir->vOrigin != save) - { - if (dir->nEntries) - { -#ifdef FEAT_GUI_NEXTAW - XawScrollbarSetThumb( - selFileVScrolls[n], - (float) (((double) dir->vOrigin) / dir->nEntries), - (float) (((double) ((dir->nEntries < SFlistSize) ? - dir->nEntries : SFlistSize)) / dir->nEntries)); -#else - vim_XawScrollbarSetThumb( - selFileVScrolls[n], - (float) (((double) dir->vOrigin) / dir->nEntries), - (float) (((double) ((dir->nEntries < SFlistSize) ? - dir->nEntries : SFlistSize)) / dir->nEntries), - (double)dir->nEntries); -#endif - } - } - - if (SFbuttonPressed) - SFscrollTimerId = XtAppAddTimeOut(SFapp, - SFscrollTimerInterval(), SFscrollTimer, - (XtPointer)(long_u)n); -} - - static int -SFnewInvertEntry(int n, XMotionEvent *event) -{ - int x, y; - int nw; - static int SFscrollTimerAdded = 0; - - x = event->x; - y = event->y; - - if (SFdirPtr + n >= SFdirEnd) - return -1; - - if ((x >= 0) && (x <= SFupperX) && (y >= SFlowerY) && (y <= SFupperY)) - { - SFDir *dir = &(SFdirs[SFdirPtr + n]); - - if (SFscrollTimerAdded) - { - SFscrollTimerAdded = 0; - XtRemoveTimeOut(SFscrollTimerId); - } - - nw = (y - SFlowerY) / SFentryHeight; - if (dir->vOrigin + nw >= dir->nEntries) - return -1; - return nw; - } - else - { - if (SFbuttonPressed) - { - SFcurrentListY = y; - if (!SFscrollTimerAdded) - { - SFscrollTimerAdded = 1; - SFscrollTimerId = XtAppAddTimeOut(SFapp, - SFscrollTimerInterval(), SFscrollTimer, - (XtPointer)(long_u)n); - } - } - return -1; - } -} - - static void -SFenterList( - Widget w UNUSED, - XtPointer np, - XEvent *event, - Boolean *cont UNUSED) -{ - long n = (long)np; - int nw; - - // sanity - if (SFcurrentInvert[n] != -1) - { - SFinvertEntry(n); - SFcurrentInvert[n] = -1; - } - - nw = SFnewInvertEntry(n, (XMotionEvent *) event); - if (nw != -1) - { - SFcurrentInvert[n] = nw; - SFinvertEntry(n); - } -} - - static void -SFleaveList( - Widget w UNUSED, - XtPointer np, - XEvent *event UNUSED, - Boolean *cont UNUSED) -{ - long n = (long)np; - - if (SFcurrentInvert[n] != -1) - { - SFinvertEntry(n); - SFcurrentInvert[n] = -1; - } -} - - static void -SFmotionList( - Widget w UNUSED, - XtPointer np, - XMotionEvent *event UNUSED, - Boolean *cont UNUSED) -{ - long n = (long)np; - int nw; - - nw = SFnewInvertEntry(n, event); - - if (nw != SFcurrentInvert[n]) - { - if (SFcurrentInvert[n] != -1) - SFinvertEntry(n); - SFcurrentInvert[n] = nw; - if (nw != -1) - SFinvertEntry(n); - } -} - - static void -SFvFloatSliderMovedCallback(Widget w, XtPointer n, XtPointer fnew) -{ - int nw; - - nw = (*(float *)fnew) * SFdirs[SFdirPtr + (int)(long)n].nEntries; - SFvSliderMovedCallback(w, (int)(long)n, nw); -} - - static void -SFvSliderMovedCallback(Widget w UNUSED, int n, int nw) -{ - int old; - Window win; - SFDir *dir; - - dir = &(SFdirs[SFdirPtr + n]); - - old = dir->vOrigin; - dir->vOrigin = nw; - - if (old == nw) - return; - - win = XtWindow(selFileLists[n]); - - if (ABS(nw - old) < SFlistSize) - { - if (nw > old) - { - XCopyArea( - SFdisplay, - win, - win, - SFscrollGC, - SFlineToTextH, - SFlowerY + (nw - old) * SFentryHeight, - SFentryWidth + SFlineToTextH, - (SFlistSize - (nw - old)) * SFentryHeight, - SFlineToTextH, - SFlowerY); - XClearArea( - SFdisplay, - win, - SFlineToTextH, - SFlowerY + (SFlistSize - (nw - old)) * - SFentryHeight, - SFentryWidth + SFlineToTextH, - (nw - old) * SFentryHeight, - False); - SFdrawStrings(win, dir, SFlistSize - (nw - old), - SFlistSize - 1); - } - else - { - XCopyArea( - SFdisplay, - win, - win, - SFscrollGC, - SFlineToTextH, - SFlowerY, - SFentryWidth + SFlineToTextH, - (SFlistSize - (old - nw)) * SFentryHeight, - SFlineToTextH, - SFlowerY + (old - nw) * SFentryHeight); - XClearArea( - SFdisplay, - win, - SFlineToTextH, - SFlowerY, - SFentryWidth + SFlineToTextH, - (old - nw) * SFentryHeight, - False); - SFdrawStrings(win, dir, 0, old - nw); - } - } - else - { - XClearArea( - SFdisplay, - win, - SFlineToTextH, - SFlowerY, - SFentryWidth + SFlineToTextH, - SFlistSize * SFentryHeight, - False); - SFdrawStrings(win, dir, 0, SFlistSize - 1); - } -} - - static void -SFvAreaSelectedCallback(Widget w, XtPointer n, XtPointer pnew) -{ - SFDir *dir; - int nw = (int)(long)pnew; - - dir = &(SFdirs[SFdirPtr + (int)(long)n]); - -#ifdef FEAT_GUI_NEXTAW - if (nw < 0) - { - if (nw > -SFvScrollHeight) - nw = -1; - else - nw = -SFlistSize; - } - else if (nw > 0) - { - if (nw < SFvScrollHeight) - nw = 1; - else - nw = SFlistSize; - } -#endif - nw += dir->vOrigin; - - if (nw > dir->nEntries - SFlistSize) - nw = dir->nEntries - SFlistSize; - - if (nw < 0) - nw = 0; - - if (dir->nEntries) - { - float f; - - f = ((double) nw) / dir->nEntries; - -#ifdef FEAT_GUI_NEXTAW - XawScrollbarSetThumb( - w, - f, - (float) (((double) ((dir->nEntries < SFlistSize) ? - dir->nEntries : SFlistSize)) / dir->nEntries)); -#else - vim_XawScrollbarSetThumb( - w, - f, - (float) (((double) ((dir->nEntries < SFlistSize) ? - dir->nEntries : SFlistSize)) / dir->nEntries), - (double)dir->nEntries); -#endif - } - - SFvSliderMovedCallback(w, (int)(long)n, nw); -} - - static void -SFhSliderMovedCallback(Widget w UNUSED, XtPointer n, XtPointer nw) -{ - SFDir *dir; - int save; - - dir = &(SFdirs[SFdirPtr + (int)(long)n]); - save = dir->hOrigin; - dir->hOrigin = (*(float *)nw) * dir->nChars; - if (dir->hOrigin == save) - return; - - SFdrawList((int)(long)n, SF_DO_NOT_SCROLL); -} - - static void -SFhAreaSelectedCallback(Widget w, XtPointer n, XtPointer pnew) -{ - SFDir *dir; - int nw = (int)(long)pnew; - - dir = &(SFdirs[SFdirPtr + (int)(long)n]); - -#ifdef FEAT_GUI_NEXTAW - if (nw < 0) - { - if (nw > -SFhScrollWidth) - nw = -1; - else - nw = -SFcharsPerEntry; - } - else if (nw > 0) - { - if (nw < SFhScrollWidth) - nw = 1; - else - nw = SFcharsPerEntry; - } -#endif - nw += dir->hOrigin; - - if (nw > dir->nChars - SFcharsPerEntry) - nw = dir->nChars - SFcharsPerEntry; - - if (nw < 0) - nw = 0; - - if (dir->nChars) - { - float f; - - f = ((double) nw) / dir->nChars; - -#ifdef FEAT_GUI_NEXTAW - XawScrollbarSetThumb( - w, - f, - (float) (((double) ((dir->nChars < SFcharsPerEntry) ? - dir->nChars : SFcharsPerEntry)) / dir->nChars)); -#else - vim_XawScrollbarSetThumb( - w, - f, - (float) (((double) ((dir->nChars < SFcharsPerEntry) ? - dir->nChars : SFcharsPerEntry)) / dir->nChars), - (double)dir->nChars); -#endif - - SFhSliderMovedCallback(w, n, (XtPointer)&f); - } -} - - static void -SFpathSliderMovedCallback( - Widget w UNUSED, - XtPointer client_data UNUSED, - XtPointer nw) -{ - SFDir *dir; - int n; - XawTextPosition pos; - int SFdirPtrSave; - - SFdirPtrSave = SFdirPtr; - SFdirPtr = (*(float *)nw) * SFdirEnd; - if (SFdirPtr == SFdirPtrSave) - return; - - SFdrawLists(SF_DO_SCROLL); - - n = 2; - while (SFdirPtr + n >= SFdirEnd) - n--; - - dir = &(SFdirs[SFdirPtr + n]); - - pos = dir->path - SFcurrentPath; - - if (!strncmp(SFcurrentPath, SFstartDir, strlen(SFstartDir))) - { - pos -= strlen(SFstartDir); - if (pos < 0) - pos = 0; - } - - XawTextSetInsertionPoint(selFileField, pos); -} - - static void -SFpathAreaSelectedCallback( - Widget w, - XtPointer client_data UNUSED, - XtPointer pnew) -{ - int nw = (int)(long)pnew; - float f; - -#ifdef FEAT_GUI_NEXTAW - if (nw < 0) - { - if (nw > -SFpathScrollWidth) - nw = -1; - else - nw = -3; - } - else if (nw > 0) - { - if (nw < SFpathScrollWidth) - nw = 1; - else - nw = 3; - } -#endif - nw += SFdirPtr; - - if (nw > SFdirEnd - 3) - nw = SFdirEnd - 3; - - if (nw < 0) - nw = 0; - - f = ((double) nw) / SFdirEnd; - -#ifdef FEAT_GUI_NEXTAW - XawScrollbarSetThumb( - w, - f, - (float) (((double) ((SFdirEnd < 3) ? SFdirEnd : 3)) / SFdirEnd)); -#else - vim_XawScrollbarSetThumb( - w, - f, - (float) (((double) ((SFdirEnd < 3) ? SFdirEnd : 3)) / SFdirEnd), - (double)SFdirEnd); -#endif - - SFpathSliderMovedCallback(w, (XtPointer) NULL, (XtPointer)&f); -} - - static Boolean -SFworkProc(void *arg UNUSED) -{ - SFDir *dir; - SFEntry *entry; - - for (dir = &(SFdirs[SFdirEnd - 1]); dir >= SFdirs; dir--) - { - if (!(dir->nEntries)) - continue; - for (entry = &(dir->entries[dir->nEntries - 1]); - entry >= dir->entries; - entry--) - { - if (!(entry->statDone)) - { - (void)SFstatAndCheck(dir, entry); - return False; - } - } - } - - SFworkProcAdded = 0; - - return True; -} - -////////////////// Dir.c - - static int -SFcompareEntries(const void *p, const void *q) -{ - return strcmp(((SFEntry *)p)->real, ((SFEntry *)q)->real); -} - - static int -SFgetDir( - SFDir *dir) -{ - SFEntry *result = NULL; - int Alloc = 0; - int i; - DIR *dirp; - struct dirent *dp; - char *str; - int len; - int maxChars; - stat_T statBuf; - - maxChars = strlen(dir->dir) - 1; - - dir->entries = NULL; - dir->nEntries = 0; - dir->nChars = 0; - - result = NULL; - i = 0; - - dirp = opendir("."); - if (!dirp) - return 1; - - (void)mch_stat(".", &statBuf); - dir->mtime = statBuf.st_mtime; - - while ((dp = readdir(dirp))) - { - // Ignore "." and ".." - if (strcmp(dp->d_name, ".") == 0 || strcmp(dp->d_name, "..") == 0) - continue; - if (i >= Alloc) - { - Alloc = 2 * (Alloc + 1); - result = (SFEntry *) XtRealloc((char *) result, - (unsigned) (Alloc * sizeof(SFEntry))); - } - result[i].statDone = 0; - str = dp->d_name; - len = strlen(str); - result[i].real = XtMalloc((unsigned)(len + 2)); - (void) strcat(strcpy(result[i].real, str), " "); - if (len > maxChars) - maxChars = len; - result[i].shown = result[i].real; - i++; - } - - qsort((char *) result, (size_t) i, sizeof(SFEntry), SFcompareEntries); - - dir->entries = result; - dir->nEntries = i; - dir->nChars = maxChars + 1; - - closedir(dirp); - - return 0; -} - -////////////////// SFinternal.h - -#include <sys/param.h> -#include <X11/cursorfont.h> -#include <X11/Composite.h> -#include <X11/Shell.h> -#ifdef FEAT_GUI_NEXTAW -# include <X11/neXtaw/Form.h> -# include <X11/neXtaw/Command.h> -# include <X11/neXtaw/Label.h> -#else -#include <X11/Xaw/Form.h> -#include <X11/Xaw/Command.h> -#include <X11/Xaw/Label.h> -#endif - -static char *oneLineTextEditTranslations = "\ - <Key>Return: redraw-display()\n\ - Ctrl<Key>M: redraw-display()\n\ -"; - - static void -SFexposeList( - Widget w UNUSED, - XtPointer n, - XEvent *event, - Boolean *cont UNUSED) -{ - if ((event->type == NoExpose) || event->xexpose.count) - return; - - SFdrawList((int)(long)n, SF_DO_NOT_SCROLL); -} - - static void -SFmodVerifyCallback( - Widget w UNUSED, - XtPointer client_data UNUSED, - XEvent *event, - Boolean *cont UNUSED) -{ - char buf[2]; - - if ((XLookupString(&(event->xkey), buf, 2, NULL, NULL) == 1) && - ((*buf) == '\r')) - SFstatus = SEL_FILE_OK; - else - SFstatus = SEL_FILE_TEXT; -} - - static void -SFokCallback(Widget w UNUSED, XtPointer cl UNUSED, XtPointer cd UNUSED) -{ - SFstatus = SEL_FILE_OK; -} - -static XtCallbackRec SFokSelect[] = -{ - { SFokCallback, (XtPointer) NULL }, - { NULL, (XtPointer) NULL }, -}; - - static void -SFcancelCallback(Widget w UNUSED, XtPointer cl UNUSED, XtPointer cd UNUSED) -{ - SFstatus = SEL_FILE_CANCEL; -} - -static XtCallbackRec SFcancelSelect[] = -{ - { SFcancelCallback, (XtPointer) NULL }, - { NULL, (XtPointer) NULL }, -}; - - static void -SFdismissAction( - Widget w UNUSED, - XEvent *event, - String *params UNUSED, - Cardinal *num_params UNUSED) -{ - if (event->type == ClientMessage - && (Atom)event->xclient.data.l[0] != SFwmDeleteWindow) - return; - - SFstatus = SEL_FILE_CANCEL; -} - -static char *wmDeleteWindowTranslation = "\ - <Message>WM_PROTOCOLS: SelFileDismiss()\n\ -"; - -static XtActionsRec actions[] = -{ - {"SelFileDismiss", SFdismissAction}, -}; - - static void -SFsetColors( - guicolor_T bg, - guicolor_T fg, - guicolor_T scroll_bg, - guicolor_T scroll_fg) -{ - if (selFileForm) - { - XtVaSetValues(selFileForm, XtNbackground, bg, - XtNforeground, fg, - XtNborderColor, bg, - NULL); - } - { - int i; - - for (i = 0; i < 3; ++i) - { - if (selFileLists[i]) - { - XtVaSetValues(selFileLists[i], XtNbackground, bg, - XtNforeground, fg, - XtNborderColor, fg, - NULL); - } - } - } - if (selFileOK) - { - XtVaSetValues(selFileOK, XtNbackground, bg, - XtNforeground, fg, - XtNborderColor, fg, - NULL); - } - if (selFileCancel) - { - XtVaSetValues(selFileCancel, XtNbackground, bg, - XtNforeground, fg, - XtNborderColor, fg, - NULL); - } - if (selFilePrompt) - { - XtVaSetValues(selFilePrompt, XtNbackground, bg, - XtNforeground, fg, - NULL); - } - if (gui.dpy) - { - XSetBackground(gui.dpy, SFtextGC, bg); - XSetForeground(gui.dpy, SFtextGC, fg); - XSetForeground(gui.dpy, SFlineGC, fg); - - // This is an xor GC, so combine the fg and background - XSetBackground(gui.dpy, SFinvertGC, fg ^ bg); - XSetForeground(gui.dpy, SFinvertGC, fg ^ bg); - } - if (selFileHScroll) - { - XtVaSetValues(selFileHScroll, XtNbackground, scroll_bg, - XtNforeground, scroll_fg, - XtNborderColor, fg, - NULL); - } - { - int i; - - for (i = 0; i < 3; i++) - { - XtVaSetValues(selFileVScrolls[i], XtNbackground, scroll_bg, - XtNforeground, scroll_fg, - XtNborderColor, fg, - NULL); - XtVaSetValues(selFileHScrolls[i], XtNbackground, scroll_bg, - XtNforeground, scroll_fg, - XtNborderColor, fg, - NULL); - } - } -} - - static void -SFcreateWidgets( - Widget toplevel, - char *prompt, - char *ok, - char *cancel) -{ - Cardinal n; - int listWidth, listHeight; - int listSpacing = 10; - int scrollThickness = 15; - int hScrollX, hScrollY; - int vScrollX, vScrollY; - - selFile = XtVaAppCreateShell("selFile", "SelFile", - transientShellWidgetClass, SFdisplay, - XtNtransientFor, toplevel, - XtNtitle, prompt, - NULL); - - // Add WM_DELETE_WINDOW protocol - XtAppAddActions(XtWidgetToApplicationContext(selFile), - actions, XtNumber(actions)); - XtOverrideTranslations(selFile, - XtParseTranslationTable(wmDeleteWindowTranslation)); - - selFileForm = XtVaCreateManagedWidget("selFileForm", - formWidgetClass, selFile, - XtNdefaultDistance, 30, - XtNforeground, SFfore, - XtNbackground, SFback, - XtNborderColor, SFback, - NULL); - - selFilePrompt = XtVaCreateManagedWidget("selFilePrompt", - labelWidgetClass, selFileForm, - XtNlabel, prompt, - XtNresizable, True, - XtNtop, XtChainTop, - XtNbottom, XtChainTop, - XtNleft, XtChainLeft, - XtNright, XtChainLeft, - XtNborderWidth, 0, - XtNforeground, SFfore, - XtNbackground, SFback, - NULL); - - /* - XtVaGetValues(selFilePrompt, - XtNforeground, &SFfore, - XtNbackground, &SFback, - NULL); - */ - - SFinitFont(); - - SFentryWidth = SFbesideText + SFcharsPerEntry * SFcharWidth + - SFbesideText; - SFentryHeight = SFaboveAndBelowText + SFcharHeight + - SFaboveAndBelowText; - - listWidth = SFlineToTextH + SFentryWidth + SFlineToTextH + 1 + - scrollThickness; - listHeight = SFlineToTextV + SFentryHeight + SFlineToTextV + 1 + - SFlineToTextV + SFlistSize * SFentryHeight + - SFlineToTextV + 1 + scrollThickness; - - SFpathScrollWidth = 3 * listWidth + 2 * listSpacing + 4; - - hScrollX = -1; - hScrollY = SFlineToTextV + SFentryHeight + SFlineToTextV + 1 + - SFlineToTextV + SFlistSize * SFentryHeight + - SFlineToTextV; - SFhScrollWidth = SFlineToTextH + SFentryWidth + SFlineToTextH; - - vScrollX = SFlineToTextH + SFentryWidth + SFlineToTextH; - vScrollY = SFlineToTextV + SFentryHeight + SFlineToTextV; - SFvScrollHeight = SFlineToTextV + SFlistSize * SFentryHeight + - SFlineToTextV; - - SFupperX = SFlineToTextH + SFentryWidth + SFlineToTextH - 1; - SFlowerY = SFlineToTextV + SFentryHeight + SFlineToTextV + 1 + - SFlineToTextV; - SFupperY = SFlineToTextV + SFentryHeight + SFlineToTextV + 1 + - SFlineToTextV + SFlistSize * SFentryHeight - 1; - - SFtextX = SFlineToTextH + SFbesideText; - SFtextYoffset = SFlowerY + SFaboveAndBelowText + SFcharAscent; - - SFsegs[0].x1 = 0; - SFsegs[0].y1 = vScrollY; - SFsegs[0].x2 = vScrollX - 1; - SFsegs[0].y2 = vScrollY; - SFsegs[1].x1 = vScrollX; - SFsegs[1].y1 = 0; - SFsegs[1].x2 = vScrollX; - SFsegs[1].y2 = vScrollY - 1; - - SFcompletionSegs[0].x1 = SFcompletionSegs[0].x2 = SFlineToTextH; - SFcompletionSegs[1].x1 = SFcompletionSegs[1].x2 = - SFlineToTextH + SFentryWidth - 1; - - selFileField = XtVaCreateManagedWidget("selFileField", - asciiTextWidgetClass, selFileForm, - XtNwidth, 3 * listWidth + 2 * listSpacing + 4, - XtNborderColor, SFfore, - XtNfromVert, selFilePrompt, - XtNvertDistance, 10, - XtNresizable, True, - XtNtop, XtChainTop, - XtNbottom, XtChainTop, - XtNleft, XtChainLeft, - XtNright, XtChainLeft, - XtNstring, SFtextBuffer, - XtNlength, MAXPATHL, - XtNeditType, XawtextEdit, - XtNwrap, XawtextWrapWord, - XtNresize, XawtextResizeHeight, - XtNuseStringInPlace, True, - NULL); - - XtOverrideTranslations(selFileField, - XtParseTranslationTable(oneLineTextEditTranslations)); - XtSetKeyboardFocus(selFileForm, selFileField); - - selFileHScroll = XtVaCreateManagedWidget("selFileHScroll", -#ifdef FEAT_GUI_NEXTAW - scrollbarWidgetClass, selFileForm, -#else - vim_scrollbarWidgetClass, selFileForm, -#endif - XtNorientation, XtorientHorizontal, - XtNwidth, SFpathScrollWidth, - XtNheight, scrollThickness, - XtNborderColor, SFfore, - XtNfromVert, selFileField, - XtNvertDistance, 30, - XtNtop, XtChainTop, - XtNbottom, XtChainTop, - XtNleft, XtChainLeft, - XtNright, XtChainLeft, - XtNforeground, gui.scroll_fg_pixel, - XtNbackground, gui.scroll_bg_pixel, -#ifndef FEAT_GUI_NEXTAW - XtNlimitThumb, 1, -#endif - NULL); - - XtAddCallback(selFileHScroll, XtNjumpProc, - (XtCallbackProc) SFpathSliderMovedCallback, (XtPointer)NULL); - XtAddCallback(selFileHScroll, XtNscrollProc, - (XtCallbackProc) SFpathAreaSelectedCallback, (XtPointer)NULL); - - selFileLists[0] = XtVaCreateManagedWidget("selFileList1", - compositeWidgetClass, selFileForm, - XtNwidth, listWidth, - XtNheight, listHeight, - XtNforeground, SFfore, - XtNbackground, SFback, - XtNborderColor, SFfore, - XtNfromVert, selFileHScroll, - XtNvertDistance, 10, - XtNtop, XtChainTop, - XtNbottom, XtChainTop, - XtNleft, XtChainLeft, - XtNright, XtChainLeft, - NULL); - - selFileLists[1] = XtVaCreateManagedWidget("selFileList2", - compositeWidgetClass, selFileForm, - XtNwidth, listWidth, - XtNheight, listHeight, - XtNforeground, SFfore, - XtNbackground, SFback, - XtNborderColor, SFfore, - XtNfromHoriz, selFileLists[0], - XtNfromVert, selFileHScroll, - XtNhorizDistance, listSpacing, - XtNvertDistance, 10, - XtNtop, XtChainTop, - XtNbottom, XtChainTop, - XtNleft, XtChainLeft, - XtNright, XtChainLeft, - NULL); - - selFileLists[2] = XtVaCreateManagedWidget("selFileList3", - compositeWidgetClass, selFileForm, - XtNwidth, listWidth, - XtNheight, listHeight, - XtNforeground, SFfore, - XtNbackground, SFback, - XtNborderColor, SFfore, - XtNfromHoriz, selFileLists[1], - XtNfromVert, selFileHScroll, - XtNhorizDistance, listSpacing, - XtNvertDistance, 10, - XtNtop, XtChainTop, - XtNbottom, XtChainTop, - XtNleft, XtChainLeft, - XtNright, XtChainLeft, - NULL); - - for (n = 0; n < 3; n++) - { - selFileVScrolls[n] = XtVaCreateManagedWidget("selFileVScroll", -#ifdef FEAT_GUI_NEXTAW - scrollbarWidgetClass, selFileLists[n], -#else - vim_scrollbarWidgetClass, selFileLists[n], -#endif - XtNx, vScrollX, - XtNy, vScrollY, - XtNwidth, scrollThickness, - XtNheight, SFvScrollHeight, - XtNborderColor, SFfore, - XtNforeground, gui.scroll_fg_pixel, - XtNbackground, gui.scroll_bg_pixel, -#ifndef FEAT_GUI_NEXTAW - XtNlimitThumb, 1, -#endif - NULL); - - XtAddCallback(selFileVScrolls[n], XtNjumpProc, - (XtCallbackProc)SFvFloatSliderMovedCallback, - (XtPointer)(long_u)n); - XtAddCallback(selFileVScrolls[n], XtNscrollProc, - (XtCallbackProc)SFvAreaSelectedCallback, (XtPointer)(long_u)n); - - selFileHScrolls[n] = XtVaCreateManagedWidget("selFileHScroll", -#ifdef FEAT_GUI_NEXTAW - scrollbarWidgetClass, selFileLists[n], -#else - vim_scrollbarWidgetClass, selFileLists[n], -#endif - XtNorientation, XtorientHorizontal, - XtNx, hScrollX, - XtNy, hScrollY, - XtNwidth, SFhScrollWidth, - XtNheight, scrollThickness, - XtNborderColor, SFfore, - XtNforeground, gui.scroll_fg_pixel, - XtNbackground, gui.scroll_bg_pixel, -#ifndef FEAT_GUI_NEXTAW - XtNlimitThumb, 1, -#endif - NULL); - - XtAddCallback(selFileHScrolls[n], XtNjumpProc, - (XtCallbackProc)SFhSliderMovedCallback, - (XtPointer)(long_u)n); - XtAddCallback(selFileHScrolls[n], XtNscrollProc, - (XtCallbackProc)SFhAreaSelectedCallback, (XtPointer)(long_u)n); - } - - selFileOK = XtVaCreateManagedWidget("selFileOK", - commandWidgetClass, selFileForm, - XtNlabel, ok, - XtNresizable, True, - XtNcallback, SFokSelect, - XtNforeground, SFfore, - XtNbackground, SFback, - XtNborderColor, SFfore, - XtNfromHoriz, selFileLists[0], - XtNfromVert, selFileLists[0], - XtNvertDistance, 30, - XtNtop, XtChainTop, - XtNbottom, XtChainTop, - XtNleft, XtChainLeft, - XtNright, XtChainLeft, - NULL); - - selFileCancel = XtVaCreateManagedWidget("selFileCancel", - commandWidgetClass, selFileForm, - XtNlabel, cancel, - XtNresizable, True, - XtNcallback, SFcancelSelect, - XtNforeground, SFfore, - XtNbackground, SFback, - XtNborderColor, SFfore, - XtNfromHoriz, selFileOK, - XtNfromVert, selFileLists[0], - XtNhorizDistance, 30, - XtNvertDistance, 30, - XtNtop, XtChainTop, - XtNbottom, XtChainTop, - XtNleft, XtChainLeft, - XtNright, XtChainLeft, - NULL); - - XtSetMappedWhenManaged(selFile, False); - XtRealizeWidget(selFile); - - // Add WM_DELETE_WINDOW protocol - SFwmDeleteWindow = XInternAtom(SFdisplay, "WM_DELETE_WINDOW", False); - XSetWMProtocols(SFdisplay, XtWindow(selFile), &SFwmDeleteWindow, 1); - - SFcreateGC(); - - for (n = 0; n < 3; n++) - { - XtAddEventHandler(selFileLists[n], ExposureMask, True, - (XtEventHandler)SFexposeList, (XtPointer)(long_u)n); - XtAddEventHandler(selFileLists[n], EnterWindowMask, False, - (XtEventHandler)SFenterList, (XtPointer)(long_u)n); - XtAddEventHandler(selFileLists[n], LeaveWindowMask, False, - (XtEventHandler)SFleaveList, (XtPointer)(long_u)n); - XtAddEventHandler(selFileLists[n], PointerMotionMask, False, - (XtEventHandler)SFmotionList, (XtPointer)(long_u)n); - XtAddEventHandler(selFileLists[n], ButtonPressMask, False, - (XtEventHandler)SFbuttonPressList, (XtPointer)(long_u)n); - XtAddEventHandler(selFileLists[n], ButtonReleaseMask, False, - (XtEventHandler)SFbuttonReleaseList, (XtPointer)(long_u)n); - } - - XtAddEventHandler(selFileField, KeyPressMask, False, - SFmodVerifyCallback, (XtPointer)NULL); - - SFapp = XtWidgetToApplicationContext(selFile); -} - - static void -SFtextChanged(void) -{ -#if defined(FEAT_XFONTSET) && defined(XtNinternational) - if ((unsigned long)_XawTextFormat((TextWidget)selFileField) == XawFmtWide) - { - wchar_t *wcbuf=(wchar_t *)SFtextBuffer; - - if ((wcbuf[0] == L'/') || (wcbuf[0] == L'~')) - { - (void) wcstombs(SFcurrentPath, wcbuf, MAXPATHL); - SFtextPos = XawTextGetInsertionPoint(selFileField); - } - else - { - strcpy(SFcurrentPath, SFstartDir); - (void) wcstombs(SFcurrentPath + strlen(SFcurrentPath), wcbuf, MAXPATHL); - - SFtextPos = XawTextGetInsertionPoint(selFileField) + strlen(SFstartDir); - } - } - else -#endif - if ((SFtextBuffer[0] == '/') || (SFtextBuffer[0] == '~')) - { - (void) strcpy(SFcurrentPath, SFtextBuffer); - SFtextPos = XawTextGetInsertionPoint(selFileField); - } - else - { - (void) strcat(strcpy(SFcurrentPath, SFstartDir), SFtextBuffer); - - SFtextPos = XawTextGetInsertionPoint(selFileField) + strlen(SFstartDir); - } - - if (!SFworkProcAdded) - { - (void) XtAppAddWorkProc(SFapp, (XtWorkProc)SFworkProc, NULL); - SFworkProcAdded = 1; - } - - SFupdatePath(); -} - - static char * -SFgetText(void) -{ -#if defined(FEAT_XFONTSET) && defined(XtNinternational) - char *buf; - - if ((unsigned long)_XawTextFormat((TextWidget)selFileField) == XawFmtWide) - { - wchar_t *wcbuf; - int mbslength; - - XtVaGetValues(selFileField, - XtNstring, &wcbuf, - NULL); - mbslength = wcstombs(NULL, wcbuf, 0); - // Hack: some broken wcstombs() returns zero, just get a large buffer - if (mbslength == 0 && wcbuf != NULL && wcbuf[0] != 0) - mbslength = MAXPATHL; - buf=(char *)XtMalloc(mbslength + 1); - wcstombs(buf, wcbuf, mbslength +1); - return buf; - } -#endif - return (char *)vim_strsave((char_u *)SFtextBuffer); -} - - static void -SFprepareToReturn(void) -{ - SFstatus = SEL_FILE_NULL; - XtRemoveGrab(selFile); - XtUnmapWidget(selFile); - XtRemoveTimeOut(SFdirModTimerId); - if (SFchdir(SFstartDir)) - { - emsg(_(e_vim_selfile_cant_return_to_current_directory)); - SFstatus = SEL_FILE_CANCEL; - } -} - - char * -vim_SelFile( - Widget toplevel, - char *prompt, - char *init_path, - int (*show_entry)(), - int x, - int y, - guicolor_T fg, - guicolor_T bg, - guicolor_T scroll_fg, - guicolor_T scroll_bg) // The "Scrollbar" group colors -{ - static int firstTime = 1; - XEvent event; - char *name_return; - - if (prompt == NULL) - prompt = _("Pathname:"); - SFfore = fg; - SFback = bg; - - if (mch_dirname((char_u *)SFstartDir, MAXPATHL) == FAIL) - { - emsg(_(e_vim_selfile_cant_get_current_directory)); - return NULL; - } - - if (firstTime) - { - firstTime = 0; - SFdisplay = XtDisplay(toplevel); - SFcreateWidgets(toplevel, prompt, _("OK"), _("Cancel")); - } - else - { - XtVaSetValues(selFilePrompt, XtNlabel, prompt, NULL); - XtVaSetValues(selFile, XtNtitle, prompt, NULL); - SFsetColors(bg, fg, scroll_bg, scroll_fg); - } - - XtVaSetValues(selFile, XtNx, x, XtNy, y, NULL); - XtMapWidget(selFile); - - (void)strcat(SFstartDir, "/"); - (void)strcpy(SFcurrentDir, SFstartDir); - - if (init_path) - { - if (init_path[0] == '/') - { - (void)strcpy(SFcurrentPath, init_path); - if (strncmp(SFcurrentPath, SFstartDir, strlen(SFstartDir))) - SFsetText(SFcurrentPath); - else - SFsetText(&(SFcurrentPath[strlen(SFstartDir)])); - } - else - { - (void)strcat(strcpy(SFcurrentPath, SFstartDir), init_path); - SFsetText(&(SFcurrentPath[strlen(SFstartDir)])); - } - } - else - (void)strcpy(SFcurrentPath, SFstartDir); - - SFfunc = show_entry; - - SFtextChanged(); - - XtAddGrab(selFile, True, True); - - SFdirModTimerId = XtAppAddTimeOut(SFapp, (unsigned long) 1000, - SFdirModTimer, (XtPointer) NULL); - - for (;;) - { - XtAppNextEvent(SFapp, &event); - XtDispatchEvent(&event); - switch (SFstatus) - { - case SEL_FILE_TEXT: - SFstatus = SEL_FILE_NULL; - SFtextChanged(); - break; - case SEL_FILE_OK: - name_return = SFgetText(); - SFprepareToReturn(); - return name_return; - case SEL_FILE_CANCEL: - SFprepareToReturn(); - return NULL; - case SEL_FILE_NULL: - break; - } - } -} -#endif // FEAT_BROWSE
deleted file mode 100644 --- a/src/gui_at_sb.c +++ /dev/null @@ -1,1192 +0,0 @@ -/* vi:set ts=8 sts=4 sw=4 noet: */ -/* - * MODIFIED ATHENA SCROLLBAR (USING ARROWHEADS AT ENDS OF TRAVEL) - * Modifications Copyright 1992 by Mitch Trachtenberg - * Rights, permissions, and disclaimer of warranty are as in the DEC and MIT - * notice below. - * $XConsortium: Scrollbar.c,v 1.72 94/04/17 20:12:40 kaleb Exp $ - */ - -/* - * Modified for Vim by Bill Foster and Bram Moolenaar - */ - -/* - -Copyright (c) 1987, 1988, 1994 X Consortium - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE X -CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN -ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -Except as contained in this notice, the name of the X Consortium shall not be -used in advertising or otherwise to promote the sale, use or other dealings in -this Software without prior written authorization from the X Consortium. - -Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts. - - All Rights Reserved - -Permission to use, copy, modify, and distribute this software and its -documentation for any purpose and without fee is hereby granted, provided that -the above copyright notice appear in all copies and that both that copyright -notice and this permission notice appear in supporting documentation, and that -the name of Digital not be used in advertising or publicity pertaining to -distribution of the software without specific, written prior permission. - -DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL DIGITAL -BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION -OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -*/ - -// ScrollBar.c -// created by weissman, Mon Jul 7 13:20:03 1986 -// converted by swick, Thu Aug 27 1987 - -#include "vim.h" - -#include <X11/IntrinsicP.h> -#include <X11/StringDefs.h> - -#include <X11/Xaw/XawInit.h> -#include "gui_at_sb.h" - -#include <X11/Xmu/Drawing.h> - -// Private definitions. - -static char defaultTranslations[] = - "<Btn1Down>: NotifyScroll()\n\ - <Btn2Down>: MoveThumb() NotifyThumb()\n\ - <Btn3Down>: NotifyScroll()\n\ - <Btn4Down>: ScrollOneLineUp()\n\ - Shift<Btn4Down>: ScrollPageUp()\n\ - <Btn5Down>: ScrollOneLineDown()\n\ - Shift<Btn5Down>: ScrollPageDown()\n\ - <Btn1Motion>: HandleThumb()\n\ - <Btn3Motion>: HandleThumb()\n\ - <Btn2Motion>: MoveThumb() NotifyThumb()\n\ - <BtnUp>: EndScroll()"; - -static float floatZero = 0.0; - -#define Offset(field) XtOffsetOf(ScrollbarRec, field) - -static XtResource resources[] = -{ - {XtNlength, XtCLength, XtRDimension, sizeof(Dimension), - Offset(scrollbar.length), XtRImmediate, (XtPointer) 1}, - {XtNthickness, XtCThickness, XtRDimension, sizeof(Dimension), - Offset(scrollbar.thickness), XtRImmediate, (XtPointer) 14}, - {XtNorientation, XtCOrientation, XtROrientation, sizeof(XtOrientation), - Offset(scrollbar.orientation), XtRImmediate, (XtPointer) XtorientVertical}, - {XtNscrollProc, XtCCallback, XtRCallback, sizeof(XtPointer), - Offset(scrollbar.scrollProc), XtRCallback, NULL}, - {XtNthumbProc, XtCCallback, XtRCallback, sizeof(XtPointer), - Offset(scrollbar.thumbProc), XtRCallback, NULL}, - {XtNjumpProc, XtCCallback, XtRCallback, sizeof(XtPointer), - Offset(scrollbar.jumpProc), XtRCallback, NULL}, - {XtNthumb, XtCThumb, XtRBitmap, sizeof(Pixmap), - Offset(scrollbar.thumb), XtRImmediate, (XtPointer) XtUnspecifiedPixmap}, - {XtNforeground, XtCForeground, XtRPixel, sizeof(Pixel), - Offset(scrollbar.foreground), XtRString, XtDefaultForeground}, - {XtNshown, XtCShown, XtRFloat, sizeof(float), - Offset(scrollbar.shown), XtRFloat, (XtPointer)&floatZero}, - {XtNtopOfThumb, XtCTopOfThumb, XtRFloat, sizeof(float), - Offset(scrollbar.top), XtRFloat, (XtPointer)&floatZero}, - {XtNmaxOfThumb, XtCMaxOfThumb, XtRFloat, sizeof(float), - Offset(scrollbar.max), XtRFloat, (XtPointer)&floatZero}, - {XtNminimumThumb, XtCMinimumThumb, XtRDimension, sizeof(Dimension), - Offset(scrollbar.min_thumb), XtRImmediate, (XtPointer) 7}, - {XtNshadowWidth, XtCShadowWidth, XtRDimension, sizeof(Dimension), - Offset(scrollbar.shadow_width), XtRImmediate, (XtPointer) 1}, - {XtNtopShadowPixel, XtCTopShadowPixel, XtRPixel, sizeof(Pixel), - Offset(scrollbar.top_shadow_pixel), XtRString, XtDefaultBackground}, - {XtNbottomShadowPixel, XtCBottomShadowPixel, XtRPixel, sizeof(Pixel), - Offset(scrollbar.bot_shadow_pixel), XtRString, XtDefaultForeground}, - {XtNlimitThumb, XtCLimitThumb, XtRBool, sizeof(Bool), - Offset(scrollbar.limit_thumb), XtRImmediate, (XtPointer)0} -}; -#undef Offset - -static void ClassInitialize(void); -static void Initialize(Widget, Widget, ArgList, Cardinal *); -static void Destroy(Widget); -static void Realize(Widget, Mask *, XSetWindowAttributes *); -static void Resize(Widget); -static void Redisplay(Widget, XEvent *, Region); -static Boolean SetValues(Widget, Widget, Widget, ArgList, Cardinal *); - -static void HandleThumb(Widget, XEvent *, String *, Cardinal *); -static void MoveThumb(Widget, XEvent *, String *, Cardinal *); -static void NotifyThumb(Widget, XEvent *, String *, Cardinal *); -static void NotifyScroll(Widget, XEvent *, String *, Cardinal *); -static void EndScroll(Widget, XEvent *, String *, Cardinal *); -static void ScrollOneLineUp(Widget, XEvent *, String *, Cardinal *); -static void ScrollOneLineDown(Widget, XEvent *, String *, Cardinal *); -static void ScrollPageUp(Widget, XEvent *, String *, Cardinal *); -static void ScrollPageDown(Widget, XEvent *, String *, Cardinal *); -static void ScrollSome(Widget w, XEvent *event, int call_data); -static void _Xaw3dDrawShadows(Widget, XEvent *, Region, int); -static void AllocTopShadowGC(Widget); -static void AllocBotShadowGC(Widget); - -static XtActionsRec actions[] = -{ - {"HandleThumb", HandleThumb}, - {"MoveThumb", MoveThumb}, - {"NotifyThumb", NotifyThumb}, - {"NotifyScroll", NotifyScroll}, - {"EndScroll", EndScroll}, - {"ScrollOneLineUp", ScrollOneLineUp}, - {"ScrollOneLineDown", ScrollOneLineDown}, - {"ScrollPageUp", ScrollPageUp}, - {"ScrollPageDown", ScrollPageDown} -}; - - -ScrollbarClassRec vim_scrollbarClassRec = -{ - { // core fields - /* superclass */ (WidgetClass) &simpleClassRec, - /* class_name */ "Scrollbar", - /* size */ sizeof(ScrollbarRec), - /* class_initialize */ ClassInitialize, - /* class_part_init */ NULL, - /* class_inited */ FALSE, - /* initialize */ Initialize, - /* initialize_hook */ NULL, - /* realize */ Realize, - /* actions */ actions, - /* num_actions */ XtNumber(actions), - /* resources */ resources, - /* num_resources */ XtNumber(resources), - /* xrm_class */ NULLQUARK, - /* compress_motion */ TRUE, - /* compress_exposure*/ TRUE, - /* compress_enterleave*/ TRUE, - /* visible_interest */ FALSE, - /* destroy */ Destroy, - /* resize */ Resize, - /* expose */ Redisplay, - /* set_values */ SetValues, - /* set_values_hook */ NULL, - /* set_values_almost */ XtInheritSetValuesAlmost, - /* get_values_hook */ NULL, - /* accept_focus */ NULL, - /* version */ XtVersion, - /* callback_private */ NULL, - /* tm_table */ defaultTranslations, - /* query_geometry */ XtInheritQueryGeometry, - /* display_accelerator*/ XtInheritDisplayAccelerator, - /* extension */ NULL - }, - { // simple fields - /* change_sensitive */ XtInheritChangeSensitive, -#ifndef OLDXAW - /* extension */ NULL -#endif - }, - { // scrollbar fields - /* empty */ 0 - } -}; - -WidgetClass vim_scrollbarWidgetClass = (WidgetClass)&vim_scrollbarClassRec; - -#define NoButton -1 -#define PICKLENGTH(widget, x, y) \ - ((widget->scrollbar.orientation == XtorientHorizontal) ? (x) : (y)) -#define AT_MIN(x,y) ((x) < (y) ? (x) : (y)) -#define AT_MAX(x,y) ((x) > (y) ? (x) : (y)) - -#define LINE_DELAY 300 -#define PAGE_DELAY 300 -#define LINE_REPEAT 50 -#define PAGE_REPEAT 250 - - static void -ClassInitialize(void) -{ - XawInitializeWidgetSet(); - XtAddConverter( XtRString, XtROrientation, XmuCvtStringToOrientation, - (XtConvertArgList)NULL, (Cardinal)0 ); -} - -#define MARGIN(sbw) (sbw)->scrollbar.thickness + (sbw)->scrollbar.shadow_width - - static void -FillArea( - ScrollbarWidget sbw, - Position top, - Position bottom, - int fill, - int draw_shadow) -{ - int tlen = bottom - top; // length of thumb in pixels - int sw, margin, floor; - int lx, ly, lw, lh; - - if (bottom <= 0 || bottom <= top) - return; - sw = sbw->scrollbar.shadow_width; - if (sw < 0) - sw = 0; - margin = MARGIN (sbw); - floor = sbw->scrollbar.length - margin + 2; - - if (sbw->scrollbar.orientation == XtorientHorizontal) - { - lx = ((top < margin) ? margin : top); - ly = sw; - lw = (((top + tlen) > floor) ? floor - top : tlen); - lh = sbw->core.height - 2 * sw; - } - else - { - lx = sw; - ly = ((top < margin) ? margin : top); - lw = sbw->core.width - 2 * sw; - lh = (((top + tlen) > floor) ? floor - top : tlen); - } - if (lh <= 0 || lw <= 0) - return; - - if (draw_shadow) - { - if (!(sbw->scrollbar.orientation == XtorientHorizontal)) - { - // Top border - XDrawLine (XtDisplay ((Widget) sbw), XtWindow ((Widget) sbw), - sbw->scrollbar.top_shadow_GC, - lx, ly, lx + lw - 1, ly); - - // Bottom border - XDrawLine (XtDisplay ((Widget) sbw), XtWindow ((Widget) sbw), - sbw->scrollbar.bot_shadow_GC, - lx, ly + lh - 1, lx + lw - 1, ly + lh - 1); - } - else - { - // Left border - XDrawLine (XtDisplay ((Widget) sbw), XtWindow ((Widget) sbw), - sbw->scrollbar.top_shadow_GC, - lx, ly, lx, ly + lh - 1); - - // Right border - XDrawLine (XtDisplay ((Widget) sbw), XtWindow ((Widget) sbw), - sbw->scrollbar.bot_shadow_GC, - lx + lw - 1, ly, lx + lw - 1, ly + lh - 1); - } - return; - } - - if (fill) - { - XFillRectangle(XtDisplay((Widget) sbw), XtWindow((Widget) sbw), - sbw->scrollbar.gc, - lx, ly, (unsigned int) lw, (unsigned int) lh); - - if (!(sbw->scrollbar.orientation == XtorientHorizontal)) - { - // Left border - XDrawLine(XtDisplay ((Widget) sbw), XtWindow ((Widget) sbw), - sbw->scrollbar.top_shadow_GC, - lx, ly, lx, ly + lh - 1); - - // Right border - XDrawLine(XtDisplay ((Widget) sbw), XtWindow ((Widget) sbw), - sbw->scrollbar.bot_shadow_GC, - lx + lw - 1, ly, lx + lw - 1, ly + lh - 1); - } - else - { - // Top border - XDrawLine(XtDisplay ((Widget) sbw), XtWindow ((Widget) sbw), - sbw->scrollbar.top_shadow_GC, - lx, ly, lx + lw - 1, ly); - - // Bottom border - XDrawLine(XtDisplay ((Widget) sbw), XtWindow ((Widget) sbw), - sbw->scrollbar.bot_shadow_GC, - lx, ly + lh - 1, lx + lw - 1, ly + lh - 1); - } - } - else - { - XClearArea(XtDisplay((Widget) sbw), XtWindow((Widget) sbw), - lx, ly, (unsigned int) lw, (unsigned int) lh, FALSE); - } -} - -/* - * Paint the thumb in the area specified by sbw->top and - * sbw->shown. The old area is erased. The painting and - * erasing is done cleverly so that no flickering will occur. - */ - static void -PaintThumb(ScrollbarWidget sbw) -{ - Position oldtop, oldbot, newtop, newbot; - Dimension margin, tzl; - - margin = MARGIN (sbw); - tzl = sbw->scrollbar.length - 2 * margin; - newtop = margin + (int)(tzl * sbw->scrollbar.top); - newbot = newtop + (int)(tzl * sbw->scrollbar.shown) + 1; - if (newbot < newtop + (int)sbw->scrollbar.min_thumb) - newbot = newtop + sbw->scrollbar.min_thumb; - - oldtop = sbw->scrollbar.topLoc; - oldbot = oldtop + sbw->scrollbar.shownLength; - sbw->scrollbar.topLoc = newtop; - sbw->scrollbar.shownLength = newbot - newtop; - if (XtIsRealized ((Widget) sbw)) - { - if (newtop < oldtop) - FillArea(sbw, newtop, AT_MIN(newbot, oldtop+1),1,0); - if (newtop > oldtop) - FillArea(sbw, oldtop, AT_MIN(newtop, oldbot ),0,0); - if (newbot < oldbot) - FillArea(sbw, AT_MAX(newbot, oldtop), oldbot, 0,0); - if (newbot > oldbot) - FillArea(sbw, AT_MAX(newtop, oldbot-1), newbot, 1,0); - - // Only draw the missing shadows - FillArea(sbw, newtop, newbot, 0, 1); - } -} - - static void -PaintArrows(ScrollbarWidget sbw) -{ - XPoint point[6]; - Dimension thickness = sbw->scrollbar.thickness - 1; - Dimension size; - Dimension off; - - if (XtIsRealized((Widget) sbw)) - { - if ((int)thickness * 2 > (int)sbw->scrollbar.length) - { - size = sbw->scrollbar.length / 2; - off = (int)(thickness - size) / 2; - } - else - { - size = thickness; - off = 0; - } - point[0].x = off + sbw->scrollbar.shadow_width; - point[0].y = size; - point[1].x = thickness - off - sbw->scrollbar.shadow_width; - point[1].y = size; - point[2].x = thickness / 2; - point[2].y = sbw->scrollbar.shadow_width; - - point[3].x = off + sbw->scrollbar.shadow_width; - point[3].y = sbw->scrollbar.length - size; - point[4].x = thickness - off - sbw->scrollbar.shadow_width; - point[4].y = sbw->scrollbar.length - size; - point[5].x = thickness / 2; - point[5].y = sbw->scrollbar.length - sbw->scrollbar.shadow_width - 1; - - // horizontal arrows require that x and y coordinates be swapped - if (sbw->scrollbar.orientation == XtorientHorizontal) - { - int n; - int swap; - for (n = 0; n < 6; n++) - { - swap = point[n].x; - point[n].x = point[n].y; - point[n].y = swap; - } - } - // draw the up/left arrow - XFillPolygon (XtDisplay ((Widget) sbw), XtWindow ((Widget) sbw), - sbw->scrollbar.gc, - point, 3, - Convex, CoordModeOrigin); - XDrawLines (XtDisplay ((Widget) sbw), XtWindow ((Widget) sbw), - sbw->scrollbar.bot_shadow_GC, - point, 3, - CoordModeOrigin); - XDrawLine (XtDisplay ((Widget) sbw), XtWindow ((Widget) sbw), - sbw->scrollbar.top_shadow_GC, - point[0].x, point[0].y, - point[2].x, point[2].y); - // draw the down/right arrow - XFillPolygon (XtDisplay ((Widget) sbw), XtWindow ((Widget) sbw), - sbw->scrollbar.gc, - point+3, 3, - Convex, CoordModeOrigin); - XDrawLine (XtDisplay ((Widget) sbw), XtWindow ((Widget) sbw), - sbw->scrollbar.top_shadow_GC, - point[3].x, point[3].y, - point[4].x, point[4].y); - XDrawLine (XtDisplay ((Widget) sbw), XtWindow ((Widget) sbw), - sbw->scrollbar.top_shadow_GC, - point[3].x, point[3].y, - point[5].x, point[5].y); - XDrawLine (XtDisplay ((Widget) sbw), XtWindow ((Widget) sbw), - sbw->scrollbar.bot_shadow_GC, - point[4].x, point[4].y, - point[5].x, point[5].y); - } -} - - static void -Destroy(Widget w) -{ - ScrollbarWidget sbw = (ScrollbarWidget) w; - if (sbw->scrollbar.timer_id != (XtIntervalId) 0) - XtRemoveTimeOut (sbw->scrollbar.timer_id); - XtReleaseGC(w, sbw->scrollbar.gc); - XtReleaseGC(w, sbw->scrollbar.top_shadow_GC); - XtReleaseGC(w, sbw->scrollbar.bot_shadow_GC); -} - - static void -CreateGC(Widget w) -{ - ScrollbarWidget sbw = (ScrollbarWidget) w; - XGCValues gcValues; - XtGCMask mask; - unsigned int depth = 1; - - if (sbw->scrollbar.thumb == XtUnspecifiedPixmap) - { - sbw->scrollbar.thumb = XmuCreateStippledPixmap (XtScreen(w), - (Pixel) 1, (Pixel) 0, depth); - } - else if (sbw->scrollbar.thumb != None) - { - Window root; - int x, y; - unsigned int width, height, bw; - - if (XGetGeometry (XtDisplay(w), sbw->scrollbar.thumb, &root, &x, &y, - &width, &height, &bw, &depth) == 0) - emsg(_("Scrollbar Widget: Could not get geometry of thumb pixmap.")); - } - - gcValues.foreground = sbw->scrollbar.foreground; - gcValues.background = sbw->core.background_pixel; - mask = GCForeground | GCBackground; - - if (sbw->scrollbar.thumb != None) - { - gcValues.fill_style = FillSolid; - mask |= GCFillStyle; - } - // the creation should be non-caching, because - // we now set and clear clip masks on the gc returned - sbw->scrollbar.gc = XtGetGC (w, mask, &gcValues); -} - - static void -SetDimensions(ScrollbarWidget sbw) -{ - if (sbw->scrollbar.orientation == XtorientVertical) - { - sbw->scrollbar.length = sbw->core.height; - sbw->scrollbar.thickness = sbw->core.width; - } - else - { - sbw->scrollbar.length = sbw->core.width; - sbw->scrollbar.thickness = sbw->core.height; - } -} - - static void -Initialize( - Widget request UNUSED, // what the client asked for - Widget new, // what we're going to give him - ArgList args UNUSED, - Cardinal *num_args UNUSED) -{ - ScrollbarWidget sbw = (ScrollbarWidget) new; - - CreateGC(new); - AllocTopShadowGC(new); - AllocBotShadowGC(new); - - if (sbw->core.width == 0) - sbw->core.width = (sbw->scrollbar.orientation == XtorientVertical) - ? sbw->scrollbar.thickness : sbw->scrollbar.length; - - if (sbw->core.height == 0) - sbw->core.height = (sbw->scrollbar.orientation == XtorientHorizontal) - ? sbw->scrollbar.thickness : sbw->scrollbar.length; - - SetDimensions(sbw); - sbw->scrollbar.scroll_mode = SMODE_NONE; - sbw->scrollbar.timer_id = (XtIntervalId)0; - sbw->scrollbar.topLoc = 0; - sbw->scrollbar.shownLength = sbw->scrollbar.min_thumb; -} - - static void -Realize( - Widget w, - Mask *valueMask, - XSetWindowAttributes *attributes) -{ - // The Simple widget actually stuffs the value in the valuemask. - (*vim_scrollbarWidgetClass->core_class.superclass->core_class.realize) - (w, valueMask, attributes); -} - - static Boolean -SetValues( - Widget current, // what I am - Widget request UNUSED, // what he wants me to be - Widget desired, // what I will become - ArgList args UNUSED, - Cardinal *num_args UNUSED) -{ - ScrollbarWidget sbw = (ScrollbarWidget) current; - ScrollbarWidget dsbw = (ScrollbarWidget) desired; - Boolean redraw = FALSE; - -/* - * If these values are outside the acceptable range ignore them... - */ - if (dsbw->scrollbar.top < 0.0 || dsbw->scrollbar.top > 1.0) - dsbw->scrollbar.top = sbw->scrollbar.top; - - if (dsbw->scrollbar.shown < 0.0 || dsbw->scrollbar.shown > 1.0) - dsbw->scrollbar.shown = sbw->scrollbar.shown; - -/* - * Change colors and stuff... - */ - if (XtIsRealized(desired)) - { - if (sbw->scrollbar.foreground != dsbw->scrollbar.foreground || - sbw->core.background_pixel != dsbw->core.background_pixel || - sbw->scrollbar.thumb != dsbw->scrollbar.thumb) - { - XtReleaseGC(desired, sbw->scrollbar.gc); - CreateGC (desired); - redraw = TRUE; - } - if (sbw->scrollbar.top != dsbw->scrollbar.top || - sbw->scrollbar.shown != dsbw->scrollbar.shown) - redraw = TRUE; - } - return redraw; -} - - static void -Resize(Widget w) -{ - // ForgetGravity has taken care of background, but thumb may - // have to move as a result of the new size. - SetDimensions ((ScrollbarWidget) w); - Redisplay(w, (XEvent*) NULL, (Region)NULL); -} - - - static void -Redisplay(Widget w, XEvent *event, Region region) -{ - ScrollbarWidget sbw = (ScrollbarWidget) w; - int x, y; - unsigned int width, height; - - _Xaw3dDrawShadows(w, event, region, FALSE); - - if (sbw->scrollbar.orientation == XtorientHorizontal) - { - x = sbw->scrollbar.topLoc; - y = 1; - width = sbw->scrollbar.shownLength; - height = sbw->core.height - 2; - } - else - { - x = 1; - y = sbw->scrollbar.topLoc; - width = sbw->core.width - 2; - height = sbw->scrollbar.shownLength; - } - if (region == NULL || - XRectInRegion (region, x, y, width, height) != RectangleOut) - { - // Forces entire thumb to be painted. - sbw->scrollbar.topLoc = -(sbw->scrollbar.length + 1); - PaintThumb (sbw); - } - // we'd like to be region aware here!!!! - PaintArrows(sbw); -} - - - static Boolean -CompareEvents(XEvent *oldEvent, XEvent *newEvent) -{ -#define Check(field) \ - do { \ - if (newEvent->field != oldEvent->field) \ - return False; \ - } while (0) - - Check(xany.display); - Check(xany.type); - Check(xany.window); - - switch (newEvent->type) - { - case MotionNotify: - Check(xmotion.state); - break; - case ButtonPress: - case ButtonRelease: - Check(xbutton.state); - Check(xbutton.button); - break; - case KeyPress: - case KeyRelease: - Check(xkey.state); - Check(xkey.keycode); - break; - case EnterNotify: - case LeaveNotify: - Check(xcrossing.mode); - Check(xcrossing.detail); - Check(xcrossing.state); - break; - } -#undef Check - - return True; -} - -struct EventData -{ - XEvent *oldEvent; - int count; -}; - - static Bool -PeekNotifyEvent(Display *dpy, XEvent *event, char *args) -{ - struct EventData *eventData = (struct EventData*)args; - - return ((++eventData->count == QLength(dpy)) // since PeekIf blocks - || CompareEvents(event, eventData->oldEvent)); -} - - - static Boolean -LookAhead(Widget w, XEvent *event) -{ - XEvent newEvent; - struct EventData eventData; - - if (QLength (XtDisplay (w)) == 0) - return False; - - eventData.count = 0; - eventData.oldEvent = event; - - XPeekIfEvent (XtDisplay (w), &newEvent, PeekNotifyEvent, (char*)&eventData); - - return CompareEvents (event, &newEvent); -} - - - static void -ExtractPosition( - XEvent *event, - Position *x, // RETURN - Position *y, // RETURN - unsigned int *state) // RETURN -{ - switch (event->type) - { - case MotionNotify: - *x = event->xmotion.x; - *y = event->xmotion.y; - if (state != NULL) - *state = event->xmotion.state; - break; - case ButtonPress: - case ButtonRelease: - *x = event->xbutton.x; - *y = event->xbutton.y; - if (state != NULL) - *state = event->xbutton.state; - break; - case KeyPress: - case KeyRelease: - *x = event->xkey.x; - *y = event->xkey.y; - if (state != NULL) - *state = event->xkey.state; - break; - case EnterNotify: - case LeaveNotify: - *x = event->xcrossing.x; - *y = event->xcrossing.y; - if (state != NULL) - *state = event->xcrossing.state; - break; - default: - *x = 0; *y = 0; - if (state != NULL) - *state = 0; - } -} - - static void -HandleThumb( - Widget w, - XEvent *event, - String *params, - Cardinal *num_params) -{ - Position x, y, loc; - ScrollbarWidget sbw = (ScrollbarWidget) w; - - ExtractPosition(event, &x, &y, (unsigned int *)NULL); - loc = PICKLENGTH(sbw, x, y); - // if the motion event puts the pointer in thumb, call Move and Notify - // also call Move and Notify if we're already in continuous scroll mode - if (sbw->scrollbar.scroll_mode == SMODE_CONT || - (loc >= sbw->scrollbar.topLoc && - loc <= sbw->scrollbar.topLoc + (int)sbw->scrollbar.shownLength)) - { - XtCallActionProc(w, "MoveThumb", event, params, *num_params); - XtCallActionProc(w, "NotifyThumb", event, params, *num_params); - } -} - - static void -RepeatNotify(XtPointer client_data, XtIntervalId *idp UNUSED) -{ - ScrollbarWidget sbw = (ScrollbarWidget) client_data; - int call_data; - char mode = sbw->scrollbar.scroll_mode; - unsigned long rep; - - if (mode == SMODE_NONE || mode == SMODE_CONT) - { - sbw->scrollbar.timer_id = (XtIntervalId)0; - return; - } - - if (mode == SMODE_LINE_DOWN || mode == SMODE_LINE_UP) - { - call_data = ONE_LINE_DATA; - rep = LINE_REPEAT; - } - else - { - call_data = ONE_PAGE_DATA; - rep = PAGE_REPEAT; - } - - if (mode == SMODE_PAGE_UP || mode == SMODE_LINE_UP) - call_data = -call_data; - - XtCallCallbacks((Widget)sbw, XtNscrollProc, (XtPointer)(long_u)call_data); - - sbw->scrollbar.timer_id = - XtAppAddTimeOut(XtWidgetToApplicationContext((Widget)sbw), - rep, - RepeatNotify, - client_data); -} - -/* - * Same as above, but for floating numbers. - */ - static float -FloatInRange(float num, float small, float big) -{ - return (num < small) ? small : ((num > big) ? big : num); -} - - static void -ScrollOneLineUp( - Widget w, - XEvent *event, - String *params UNUSED, - Cardinal *num_params UNUSED) -{ - ScrollSome(w, event, -ONE_LINE_DATA); -} - - static void -ScrollOneLineDown( - Widget w, - XEvent *event, - String *params UNUSED, - Cardinal *num_params UNUSED) -{ - ScrollSome(w, event, ONE_LINE_DATA); -} - - static void -ScrollPageDown( - Widget w, - XEvent *event, - String *params UNUSED, - Cardinal *num_params UNUSED) -{ - ScrollSome(w, event, ONE_PAGE_DATA); -} - - static void -ScrollPageUp( - Widget w, - XEvent *event, - String *params UNUSED, - Cardinal *num_params UNUSED) -{ - ScrollSome(w, event, -ONE_PAGE_DATA); -} - - static void -ScrollSome( - Widget w, - XEvent *event, - int call_data) -{ - ScrollbarWidget sbw = (ScrollbarWidget) w; - - if (sbw->scrollbar.scroll_mode == SMODE_CONT) // if scroll continuous - return; - - if (LookAhead(w, event)) - return; - - sbw->scrollbar.scroll_mode = SMODE_LINE_UP; - XtCallCallbacks(w, XtNscrollProc, (XtPointer)(long_u)call_data); -} - - static void -NotifyScroll( - Widget w, - XEvent *event, - String *params UNUSED, - Cardinal *num_params UNUSED) -{ - ScrollbarWidget sbw = (ScrollbarWidget) w; - Position x, y, loc; - Dimension arrow_size; - unsigned long delay = 0; - int call_data = 0; - unsigned int state; - - if (sbw->scrollbar.scroll_mode == SMODE_CONT) // if scroll continuous - return; - - if (LookAhead (w, event)) - return; - - ExtractPosition(event, &x, &y, &state); - loc = PICKLENGTH(sbw, x, y); - - if ((int)sbw->scrollbar.thickness * 2 > (int)sbw->scrollbar.length) - arrow_size = sbw->scrollbar.length / 2; - else - arrow_size = sbw->scrollbar.thickness; - - /* - * handle CTRL modifier - */ - if (state & ControlMask) - { - if (loc > sbw->scrollbar.topLoc + (Position)sbw->scrollbar.shownLength) - call_data = END_PAGE_DATA; - else - call_data = -END_PAGE_DATA; - sbw->scrollbar.scroll_mode = SMODE_NONE; - } - /* - * handle first arrow zone - */ - else if (loc < (Position)arrow_size) - { - call_data = -ONE_LINE_DATA; - sbw->scrollbar.scroll_mode = SMODE_LINE_UP; - delay = LINE_DELAY; - } - - /* - * handle last arrow zone - */ - else if (loc > (Position)(sbw->scrollbar.length - arrow_size)) - { - call_data = ONE_LINE_DATA; - sbw->scrollbar.scroll_mode = SMODE_LINE_DOWN; - delay = LINE_DELAY; - } - - /* - * handle zone "above" the thumb - */ - else if (loc < sbw->scrollbar.topLoc) - { - call_data = -ONE_PAGE_DATA; - sbw->scrollbar.scroll_mode = SMODE_PAGE_UP; - delay = PAGE_DELAY; - } - - /* - * handle zone "below" the thumb - */ - else if (loc > sbw->scrollbar.topLoc + (Position)sbw->scrollbar.shownLength) - { - call_data = ONE_PAGE_DATA; - sbw->scrollbar.scroll_mode = SMODE_PAGE_DOWN; - delay = PAGE_DELAY; - } - - if (call_data) - XtCallCallbacks(w, XtNscrollProc, (XtPointer)(long_u)call_data); - - // establish autoscroll - if (delay) - sbw->scrollbar.timer_id = - XtAppAddTimeOut(XtWidgetToApplicationContext(w), - delay, RepeatNotify, (XtPointer)w); -} - - static void -EndScroll( - Widget w, - XEvent *event UNUSED, - String *params UNUSED, - Cardinal *num_params UNUSED) -{ - ScrollbarWidget sbw = (ScrollbarWidget) w; - - sbw->scrollbar.scroll_mode = SMODE_NONE; - // no need to remove any autoscroll timeout; it will no-op - // because the scroll_mode is SMODE_NONE - // but be sure to remove timeout in destroy proc -} - - static float -FractionLoc(ScrollbarWidget sbw, int x, int y) -{ - int margin; - float height, width; - - margin = MARGIN(sbw); - x -= margin; - y -= margin; - height = (float)sbw->core.height - 2 * margin; - width = (float)sbw->core.width - 2 * margin; - return PICKLENGTH(sbw, x / width, y / height); -} - - static void -MoveThumb( - Widget w, - XEvent *event, - String *params UNUSED, - Cardinal *num_params UNUSED) -{ - ScrollbarWidget sbw = (ScrollbarWidget)w; - Position x, y; - float top; - char old_mode = sbw->scrollbar.scroll_mode; - - sbw->scrollbar.scroll_mode = SMODE_CONT; // indicate continuous scroll - - if (LookAhead(w, event)) - return; - - if (!event->xmotion.same_screen) - return; - - ExtractPosition(event, &x, &y, (unsigned int *)NULL); - - top = FractionLoc(sbw, x, y); - - if (old_mode != SMODE_CONT) // start dragging: set offset - { - if (event->xbutton.button == Button2) - sbw->scrollbar.scroll_off = sbw->scrollbar.shown / 2.; - else - sbw->scrollbar.scroll_off = top - sbw->scrollbar.top; - } - - top -= sbw->scrollbar.scroll_off; - if (sbw->scrollbar.limit_thumb) - top = FloatInRange(top, 0.0, - sbw->scrollbar.max - sbw->scrollbar.shown + 0.000001); - else - top = FloatInRange(top, 0.0, sbw->scrollbar.max); - - sbw->scrollbar.top = top; - PaintThumb(sbw); - XFlush(XtDisplay(w)); // re-draw it before Notifying -} - - - static void -NotifyThumb( - Widget w, - XEvent *event, - String *params UNUSED, - Cardinal *num_params UNUSED) -{ - ScrollbarWidget sbw = (ScrollbarWidget)w; - // Use a union to avoid a warning for the weird conversion from float to - // XtPointer. Comes from Xaw/Scrollbar.c. - union { - XtPointer xtp; - float xtf; - } xtpf; - - if (LookAhead(w, event)) - return; - - // thumbProc is not pretty, but is necessary for backwards - // compatibility on those architectures for which it work{s,ed}; - // the intent is to pass a (truncated) float by value. - xtpf.xtf = sbw->scrollbar.top; - XtCallCallbacks(w, XtNthumbProc, xtpf.xtp); - XtCallCallbacks(w, XtNjumpProc, (XtPointer)&sbw->scrollbar.top); -} - - static void -AllocTopShadowGC(Widget w) -{ - ScrollbarWidget sbw = (ScrollbarWidget) w; - XtGCMask valuemask; - XGCValues myXGCV; - - valuemask = GCForeground; - myXGCV.foreground = sbw->scrollbar.top_shadow_pixel; - sbw->scrollbar.top_shadow_GC = XtGetGC(w, valuemask, &myXGCV); -} - - static void -AllocBotShadowGC(Widget w) -{ - ScrollbarWidget sbw = (ScrollbarWidget) w; - XtGCMask valuemask; - XGCValues myXGCV; - - valuemask = GCForeground; - myXGCV.foreground = sbw->scrollbar.bot_shadow_pixel; - sbw->scrollbar.bot_shadow_GC = XtGetGC(w, valuemask, &myXGCV); -} - - static void -_Xaw3dDrawShadows( - Widget gw, - XEvent *event UNUSED, - Region region, - int out) -{ - XPoint pt[6]; - ScrollbarWidget sbw = (ScrollbarWidget) gw; - Dimension s = sbw->scrollbar.shadow_width; - /* - * draw the shadows using the core part width and height, - * and the scrollbar part shadow_width. - * - * no point to do anything if the shadow_width is 0 or the - * widget has not been realized. - */ - if (s > 0 && XtIsRealized(gw)) - { - Dimension h = sbw->core.height; - Dimension w = sbw->core.width; - Dimension wms = w - s; - Dimension hms = h - s; - Display *dpy = XtDisplay (gw); - Window win = XtWindow (gw); - GC top, bot; - - if (out) - { - top = sbw->scrollbar.top_shadow_GC; - bot = sbw->scrollbar.bot_shadow_GC; - } - else - { - top = sbw->scrollbar.bot_shadow_GC; - bot = sbw->scrollbar.top_shadow_GC; - } - - // top-left shadow - if ((region == NULL) || - (XRectInRegion (region, 0, 0, w, s) != RectangleOut) || - (XRectInRegion (region, 0, 0, s, h) != RectangleOut)) - { - pt[0].x = 0; pt[0].y = h; - pt[1].x = pt[1].y = 0; - pt[2].x = w; pt[2].y = 0; - pt[3].x = wms; pt[3].y = s; - pt[4].x = pt[4].y = s; - pt[5].x = s; pt[5].y = hms; - XFillPolygon (dpy, win, top, pt, 6, Complex, CoordModeOrigin); - } - - // bottom-right shadow - if ((region == NULL) || - (XRectInRegion (region, 0, hms, w, s) != RectangleOut) || - (XRectInRegion (region, wms, 0, s, h) != RectangleOut)) - { - pt[0].x = 0; pt[0].y = h; - pt[1].x = w; pt[1].y = h; - pt[2].x = w; pt[2].y = 0; - pt[3].x = wms; pt[3].y = s; - pt[4].x = wms; pt[4].y = hms; - pt[5].x = s; pt[5].y = hms; - XFillPolygon (dpy, win, bot, pt, 6, Complex, CoordModeOrigin); - } - } -} - - -/* - * Set the scroll bar to the given location. - */ - void -vim_XawScrollbarSetThumb(Widget w, double top, double shown, double max) -{ - ScrollbarWidget sbw = (ScrollbarWidget) w; - - if (sbw->scrollbar.scroll_mode == SMODE_CONT) // if still thumbing - return; - - sbw->scrollbar.max = (max > 1.0) ? 1.0 : - (max >= 0.0) ? max : sbw->scrollbar.max; - - sbw->scrollbar.top = (top > sbw->scrollbar.max) ? sbw->scrollbar.max : - (top >= 0.0) ? top : sbw->scrollbar.top; - - sbw->scrollbar.shown = (shown > 1.0) ? 1.0 : - (shown >= 0.0) ? shown : sbw->scrollbar.shown; - - PaintThumb(sbw); -}
deleted file mode 100644 --- a/src/gui_at_sb.h +++ /dev/null @@ -1,161 +0,0 @@ -// vi:set ts=8 sts=4 sw=4 noet: -// MODIFIED ATHENA SCROLLBAR (USING ARROWHEADS AT ENDS OF TRAVEL) -// Modifications Copyright 1992 by Mitch Trachtenberg -// Rights, permissions, and disclaimer of warranty are as in the -// DEC and MIT notice below. See usage warning in .c file. -/* - * $XConsortium: ScrollbarP.h,v 1.3 94/04/17 20:12:42 jim Exp $ - */ - - -/*********************************************************** - -Copyright (c) 1987, 1988 X Consortium - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN -AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -Except as contained in this notice, the name of the X Consortium shall not be -used in advertising or otherwise to promote the sale, use or other dealings -in this Software without prior written authorization from the X Consortium. - - -Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts. - - All Rights Reserved - -Permission to use, copy, modify, and distribute this software and its -documentation for any purpose and without fee is hereby granted, -provided that the above copyright notice appear in all copies and that -both that copyright notice and this permission notice appear in -supporting documentation, and that the name of Digital not be -used in advertising or publicity pertaining to distribution of the -software without specific, written prior permission. - -DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING -ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL -DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR -ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, -WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, -ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS -SOFTWARE. - -******************************************************************/ - -#ifndef _Scrollbar_h -#define _Scrollbar_h - -/**************************************************************** - * - * Scrollbar Widget - * - ****************************************************************/ - -#include <X11/IntrinsicP.h> -#include <X11/Xaw/SimpleP.h> -#include <X11/Xmu/Converters.h> - -/* - * Most things we need are in StringDefs.h - */ -#define XtCMinimumThumb "MinimumThumb" -#define XtCShown "Shown" -#define XtCTopOfThumb "TopOfThumb" -#define XtCMaxOfThumb "MaxOfThumb" -#define XtCShadowWidth "ShadowWidth" -#define XtCTopShadowPixel "TopShadowPixel" -#define XtCBottomShadowPixel "BottomShadowPixel" -#define XtCLimitThumb "LimitThumb" - -#define XtNminimumThumb "minimumThumb" -#define XtNtopOfThumb "topOfThumb" -#define XtNmaxOfThumb "maxOfThumb" -#define XtNshadowWidth "shadowWidth" -#define XtNtopShadowPixel "topShadowPixel" -#define XtNbottomShadowPixel "bottomShadowPixel" -#define XtNlimitThumb "limitThumb" - -typedef struct _ScrollbarRec *ScrollbarWidget; -typedef struct _ScrollbarClassRec *ScrollbarWidgetClass; - -extern WidgetClass vim_scrollbarWidgetClass; - -extern void vim_XawScrollbarSetThumb(Widget, double, double, double); - -typedef struct -{ - // public - Pixel foreground; // thumb foreground color - XtOrientation orientation; // horizontal or vertical - XtCallbackList scrollProc; // proportional scroll - XtCallbackList thumbProc; // jump (to position) scroll - XtCallbackList jumpProc; // same as thumbProc but pass data by ref - Pixmap thumb; // thumb color - float top; // What percent is above the win's top - float shown; // What percent is shown in the win - float max; // Maximum value for top - Dimension length; // either height or width - Dimension thickness; // either width or height - Dimension min_thumb; // minimum size for the thumb. - - // private - XtIntervalId timer_id; // autorepeat timer; remove on destruction - char scroll_mode; // see below - float scroll_off; // offset from event to top of thumb - GC gc; // a (shared) gc - Position topLoc; // Pixel that corresponds to top - Dimension shownLength; // Num pixels corresponding to shown - - // From 3d widget - Dimension shadow_width; - Pixel top_shadow_pixel; - Pixel bot_shadow_pixel; - Bool limit_thumb; // limit thumb to inside scrollbar - int top_shadow_contrast; - int bot_shadow_contrast; - GC top_shadow_GC; - GC bot_shadow_GC; -} ScrollbarPart; - -#define SMODE_NONE 0 -#define SMODE_CONT 1 -#define SMODE_PAGE_UP 2 -#define SMODE_PAGE_DOWN 3 -#define SMODE_LINE_UP 4 -#define SMODE_LINE_DOWN 5 - -#define ONE_LINE_DATA 1 -#define ONE_PAGE_DATA 10 -#define END_PAGE_DATA 9999 - -typedef struct _ScrollbarRec { - CorePart core; - SimplePart simple; - ScrollbarPart scrollbar; -} ScrollbarRec; - -typedef struct {int empty;} ScrollbarClassPart; - -typedef struct _ScrollbarClassRec { - CoreClassPart core_class; - SimpleClassPart simple_class; - ScrollbarClassPart scrollbar_class; -} ScrollbarClassRec; - -extern ScrollbarClassRec vim_scrollbarClassRec; - -#endif // _Scrollbar_h
deleted file mode 100644 --- a/src/gui_athena.c +++ /dev/null @@ -1,2303 +0,0 @@ -/* vi:set ts=8 sts=4 sw=4 noet: - * - * VIM - Vi IMproved by Bram Moolenaar - * GUI/Motif support by Robert Webb - * Athena port by Bill Foster - * - * Do ":help uganda" in Vim to read copying and usage conditions. - * Do ":help credits" in Vim to see a list of people who contributed. - * See README.txt for an overview of the Vim source code. - */ - -#include "vim.h" - -#include <X11/StringDefs.h> -#include <X11/Intrinsic.h> -#ifdef FEAT_GUI_NEXTAW -# include <X11/neXtaw/Form.h> -# include <X11/neXtaw/SimpleMenu.h> -# include <X11/neXtaw/MenuButton.h> -# include <X11/neXtaw/SmeBSB.h> -# include <X11/neXtaw/SmeLine.h> -# include <X11/neXtaw/Box.h> -# include <X11/neXtaw/Dialog.h> -# include <X11/neXtaw/Text.h> -# include <X11/neXtaw/AsciiText.h> -# include <X11/neXtaw/Scrollbar.h> -#else -# include <X11/Xaw/Form.h> -# include <X11/Xaw/SimpleMenu.h> -# include <X11/Xaw/MenuButton.h> -# include <X11/Xaw/SmeBSB.h> -# include <X11/Xaw/SmeLine.h> -# include <X11/Xaw/Box.h> -# include <X11/Xaw/Dialog.h> -# include <X11/Xaw/Text.h> -# include <X11/Xaw/AsciiText.h> -#endif // FEAT_GUI_NEXTAW - -#ifndef FEAT_GUI_NEXTAW -# include "gui_at_sb.h" -#endif - -extern Widget vimShell; - -static Widget vimForm = (Widget)0; -Widget textArea = (Widget)0; -#ifdef FEAT_MENU -static Widget menuBar = (Widget)0; -static XtIntervalId timer = 0; // 0 = expired, otherwise active - -// Used to figure out menu ordering -static vimmenu_T *a_cur_menu = NULL; -static Cardinal athena_calculate_ins_pos(Widget); - -static void gui_athena_popup_callback(Widget, XtPointer, XtPointer); -static void gui_athena_delayed_arm_action(Widget, XEvent *, String *, - Cardinal *); -static void gui_athena_popdown_submenus_action(Widget, XEvent *, - String *, Cardinal *); -static XtActionsRec pullAction[2] = { - { "menu-delayedpopup", (XtActionProc)gui_athena_delayed_arm_action}, - { "menu-popdownsubmenus", (XtActionProc)gui_athena_popdown_submenus_action} -}; -#endif - -#ifdef FEAT_TOOLBAR -static void gui_mch_reset_focus(void); -static Widget toolBar = (Widget)0; -#endif - -#if defined(FEAT_GUI_DIALOG) || defined(FEAT_MENU) -static void gui_athena_menu_colors(Widget id); -#endif -static void gui_athena_scroll_colors(Widget id); - -#ifdef FEAT_MENU -static XtTranslations popupTrans, parentTrans, menuTrans, supermenuTrans; -static Pixmap pullerBitmap = None; -static int puller_width = 0; -#endif - -/* - * Scrollbar callback (XtNjumpProc) for when the scrollbar is dragged with the - * left or middle mouse button. - */ - static void -gui_athena_scroll_cb_jump( - Widget w UNUSED, - XtPointer client_data, - XtPointer call_data) -{ - scrollbar_T *sb, *sb_info; - long value; - - sb = gui_find_scrollbar((long)client_data); - - if (sb == NULL) - return; - else if (sb->wp != NULL) // Left or right scrollbar - { - /* - * Careful: need to get scrollbar info out of first (left) scrollbar - * for window, but keep real scrollbar too because we must pass it to - * gui_drag_scrollbar(). - */ - sb_info = &sb->wp->w_scrollbars[0]; - } - else // Bottom scrollbar - sb_info = sb; - - value = (long)(*((float *)call_data) * (float)(sb_info->max + 1) + 0.001); - if (value > sb_info->max) - value = sb_info->max; - - gui_drag_scrollbar(sb, value, TRUE); -} - -/* - * Scrollbar callback (XtNscrollProc) for paging up or down with the left or - * right mouse buttons. - */ - static void -gui_athena_scroll_cb_scroll( - Widget w UNUSED, - XtPointer client_data, - XtPointer call_data) -{ - scrollbar_T *sb, *sb_info; - long value; - int data = (int)(long)call_data; - int page; - - sb = gui_find_scrollbar((long)client_data); - - if (sb == NULL) - return; - if (sb->wp != NULL) // Left or right scrollbar - { - /* - * Careful: need to get scrollbar info out of first (left) scrollbar - * for window, but keep real scrollbar too because we must pass it to - * gui_drag_scrollbar(). - */ - sb_info = &sb->wp->w_scrollbars[0]; - - if (sb_info->size > 5) - page = sb_info->size - 2; // use two lines of context - else - page = sb_info->size; -#ifdef FEAT_GUI_NEXTAW - if (data < 0) - { - data = (data - gui.char_height + 1) / gui.char_height; - if (data > -sb_info->size) - data = -1; - else - data = -page; - } - else if (data > 0) - { - data = (data + gui.char_height - 1) / gui.char_height; - if (data < sb_info->size) - data = 1; - else - data = page; - } -#else - switch (data) - { - case ONE_LINE_DATA: data = 1; break; - case -ONE_LINE_DATA: data = -1; break; - case ONE_PAGE_DATA: data = page; break; - case -ONE_PAGE_DATA: data = -page; break; - case END_PAGE_DATA: data = sb_info->max; break; - case -END_PAGE_DATA: data = -sb_info->max; break; - default: data = 0; break; - } -#endif - } - else // Bottom scrollbar - { - sb_info = sb; -#ifdef FEAT_GUI_NEXTAW - if (data < 0) - { - data = (data - gui.char_width + 1) / gui.char_width; - if (data > -sb->size) - data = -1; - } - else if (data > 0) - { - data = (data + gui.char_width - 1) / gui.char_width; - if (data < sb->size) - data = 1; - } -#endif - if (data < -1) // page-width left - { - if (sb->size > 8) - data = -(sb->size - 5); - else - data = -sb->size; - } - else if (data > 1) // page-width right - { - if (sb->size > 8) - data = (sb->size - 5); - else - data = sb->size; - } - } - - value = sb_info->value + data; - if (value > sb_info->max) - value = sb_info->max; - else if (value < 0) - value = 0; - - // Update the bottom scrollbar an extra time (why is this needed??) - if (sb->wp == NULL) // Bottom scrollbar - gui_mch_set_scrollbar_thumb(sb, value, sb->size, sb->max); - - gui_drag_scrollbar(sb, value, FALSE); -} - -/* - * Create all the Athena widgets necessary. - */ - void -gui_x11_create_widgets(void) -{ - /* - * We don't have any borders handled internally by the textArea to worry - * about so only skip over the configured border width. - */ - gui.border_offset = gui.border_width; - - // The form containing all the other widgets - vimForm = XtVaCreateManagedWidget("vimForm", - formWidgetClass, vimShell, - XtNborderWidth, 0, - NULL); - gui_athena_scroll_colors(vimForm); - -#ifdef FEAT_MENU - // The top menu bar - menuBar = XtVaCreateManagedWidget("menuBar", - boxWidgetClass, vimForm, - XtNresizable, True, - XtNtop, XtChainTop, - XtNbottom, XtChainTop, - XtNleft, XtChainLeft, - XtNright, XtChainRight, - XtNinsertPosition, athena_calculate_ins_pos, - NULL); - gui_athena_menu_colors(menuBar); - if (gui.menu_fg_pixel != INVALCOLOR) - XtVaSetValues(menuBar, XtNborderColor, gui.menu_fg_pixel, NULL); -#endif - -#ifdef FEAT_TOOLBAR - // Don't create it Managed, it will be managed when creating the first - // item. Otherwise an empty toolbar shows up. - toolBar = XtVaCreateWidget("toolBar", - boxWidgetClass, vimForm, - XtNresizable, True, - XtNtop, XtChainTop, - XtNbottom, XtChainTop, - XtNleft, XtChainLeft, - XtNright, XtChainRight, - XtNorientation, XtorientHorizontal, - XtNhSpace, 1, - XtNvSpace, 3, - XtNinsertPosition, athena_calculate_ins_pos, - NULL); - gui_athena_menu_colors(toolBar); -#endif - - // The text area. - textArea = XtVaCreateManagedWidget("textArea", - coreWidgetClass, vimForm, - XtNresizable, True, - XtNtop, XtChainTop, - XtNbottom, XtChainTop, - XtNleft, XtChainLeft, - XtNright, XtChainLeft, - XtNbackground, gui.back_pixel, - XtNborderWidth, 0, - NULL); - - /* - * Install the callbacks. - */ - gui_x11_callbacks(textArea, vimForm); - -#ifdef FEAT_MENU - popupTrans = XtParseTranslationTable( - "<EnterWindow>: menu-popdownsubmenus() highlight() menu-delayedpopup()\n" - "<LeaveWindow>: unhighlight()\n" - "<BtnUp>: menu-popdownsubmenus() XtMenuPopdown() notify() unhighlight()\n" - "<Motion>: highlight() menu-delayedpopup()"); - parentTrans = XtParseTranslationTable("<LeaveWindow>: unhighlight()"); - menuTrans = XtParseTranslationTable( - "<EnterWindow>: menu-popdownsubmenus() highlight() menu-delayedpopup()\n" - "<LeaveWindow>: menu-popdownsubmenus() XtMenuPopdown() unhighlight()\n" - "<BtnUp>: notify() unhighlight()\n" - "<BtnMotion>: highlight() menu-delayedpopup()"); - supermenuTrans = XtParseTranslationTable( - "<EnterWindow>: menu-popdownsubmenus() highlight() menu-delayedpopup()\n" - "<LeaveWindow>: unhighlight()\n" - "<BtnUp>: menu-popdownsubmenus() XtMenuPopdown() notify() unhighlight()\n" - "<BtnMotion>: highlight() menu-delayedpopup()"); - - XtAppAddActions(XtWidgetToApplicationContext(vimForm), pullAction, - XtNumber(pullAction)); -#endif - - // Pretend we don't have input focus, we will get an event if we do. - gui.in_focus = FALSE; -} - -#ifdef FEAT_MENU -/* - * Calculates the Pixmap based on the size of the current menu font. - */ - static Pixmap -gui_athena_create_pullright_pixmap(Widget w) -{ - Pixmap retval; -#ifdef FONTSET_ALWAYS - XFontSet font = None; -#else - XFontStruct *font = NULL; -#endif - -#ifdef FONTSET_ALWAYS - if (gui.menu_fontset == NOFONTSET) -#else - if (gui.menu_font == NOFONT) -#endif - { - XrmValue from, to; - WidgetList children; - Cardinal num_children; - -#ifdef FONTSET_ALWAYS - from.size = strlen(from.addr = XtDefaultFontSet); - to.addr = (XtPointer)&font; - to.size = sizeof(XFontSet); -#else - from.size = strlen(from.addr = XtDefaultFont); - to.addr = (XtPointer)&font; - to.size = sizeof(XFontStruct *); -#endif - // Assumption: The menuBar children will use the same font as the - // pulldown menu items AND they will all be of type - // XtNfont. - XtVaGetValues(menuBar, XtNchildren, &children, - XtNnumChildren, &num_children, - NULL); - if (XtConvertAndStore(w ? w : - (num_children > 0) ? children[0] : menuBar, - XtRString, &from, -#ifdef FONTSET_ALWAYS - XtRFontSet, &to -#else - XtRFontStruct, &to -#endif - ) == False) - return None; - // "font" should now contain data - } - else -#ifdef FONTSET_ALWAYS - font = (XFontSet)gui.menu_fontset; -#else - font = (XFontStruct *)gui.menu_font; -#endif - - { - int width, height; - GC draw_gc, undraw_gc; - XGCValues gc_values; - XPoint points[3]; - -#ifdef FONTSET_ALWAYS - height = fontset_height2(font); -#else - height = font->max_bounds.ascent + font->max_bounds.descent; -#endif - width = height - 2; - puller_width = width + 4; - retval = XCreatePixmap(gui.dpy,DefaultRootWindow(gui.dpy),width, - height, 1); - gc_values.foreground = 1; - gc_values.background = 0; - draw_gc = XCreateGC(gui.dpy, retval, - GCForeground | GCBackground, - &gc_values); - gc_values.foreground = 0; - gc_values.background = 1; - undraw_gc = XCreateGC(gui.dpy, retval, - GCForeground | GCBackground, - &gc_values); - points[0].x = 0; - points[0].y = 0; - points[1].x = width - 1; - points[1].y = (height - 1) / 2; - points[2].x = 0; - points[2].y = height - 1; - XFillRectangle(gui.dpy, retval, undraw_gc, 0, 0, height, height); - XFillPolygon(gui.dpy, retval, draw_gc, points, XtNumber(points), - Convex, CoordModeOrigin); - XFreeGC(gui.dpy, draw_gc); - XFreeGC(gui.dpy, undraw_gc); - } - return retval; -} -#endif - -/* - * Called when the GUI is not going to start after all. - */ - void -gui_x11_destroy_widgets(void) -{ - textArea = NULL; -#ifdef FEAT_MENU - menuBar = NULL; -#endif -#ifdef FEAT_TOOLBAR - toolBar = NULL; -#endif -} - -#if defined(FEAT_TOOLBAR) || defined(PROTO) -# include "gui_x11_pm.h" -# ifdef HAVE_X11_XPM_H -# include <X11/xpm.h> -# endif - -static void createXpmImages(char_u *path, char **xpm, Pixmap *sen); - -/* - * Allocated a pixmap for toolbar menu "menu". - * Return in "sen". - */ - static void -get_toolbar_pixmap(vimmenu_T *menu, Pixmap *sen) -{ - char_u buf[MAXPATHL]; // buffer storing expanded pathname - char **xpm = NULL; // xpm array - - buf[0] = NUL; // start with NULL path - - if (menu->iconfile != NULL) - { - // Use the "icon=" argument. - gui_find_iconfile(menu->iconfile, buf, "xpm"); - createXpmImages(buf, NULL, sen); - - // If it failed, try using the menu name. - if (*sen == (Pixmap)0 && gui_find_bitmap(menu->name, buf, "xpm") == OK) - createXpmImages(buf, NULL, sen); - if (*sen != (Pixmap)0) - return; - } - - if (menu->icon_builtin || gui_find_bitmap(menu->name, buf, "xpm") == FAIL) - { - if (menu->iconidx >= 0 && menu->iconidx - < (int)ARRAY_LENGTH(built_in_pixmaps)) - xpm = built_in_pixmaps[menu->iconidx]; - else - xpm = tb_blank_xpm; - } - - if (xpm != NULL || buf[0] != NUL) - createXpmImages(buf, xpm, sen); -} - -/* - * Read an Xpm file, doing color substitutions for the foreground and - * background colors. If there is an error reading a color xpm file, - * drop back and read the monochrome file. If successful, create the - * insensitive Pixmap too. - */ - static void -createXpmImages(char_u *path, char **xpm, Pixmap *sen) -{ - Window rootWindow; - XpmAttributes attrs; - XpmColorSymbol color[5] = - { - {"none", "none", 0}, - {"iconColor1", NULL, 0}, - {"bottomShadowColor", NULL, 0}, - {"topShadowColor", NULL, 0}, - {"selectColor", NULL, 0} - }; - int screenNum; - int status; - Pixmap mask; - Pixmap map; - - gui_mch_get_toolbar_colors( - &color[BACKGROUND].pixel, - &color[FOREGROUND].pixel, - &color[BOTTOM_SHADOW].pixel, - &color[TOP_SHADOW].pixel, - &color[HIGHLIGHT].pixel); - - // Setup the color substitution table - attrs.valuemask = XpmColorSymbols; - attrs.colorsymbols = color; - attrs.numsymbols = 5; - - screenNum = DefaultScreen(gui.dpy); - rootWindow = RootWindow(gui.dpy, screenNum); - - // Create the "sensitive" pixmap - if (xpm != NULL) - status = XpmCreatePixmapFromData(gui.dpy, rootWindow, xpm, - &map, &mask, &attrs); - else - status = XpmReadFileToPixmap(gui.dpy, rootWindow, (char *)path, - &map, &mask, &attrs); - if (status == XpmSuccess && map != 0) - { - XGCValues gcvalues; - GC back_gc; - GC mask_gc; - - // Need to create new Pixmaps with the mask applied. - gcvalues.foreground = color[BACKGROUND].pixel; - back_gc = XCreateGC(gui.dpy, map, GCForeground, &gcvalues); - mask_gc = XCreateGC(gui.dpy, map, GCForeground, &gcvalues); - XSetClipMask(gui.dpy, mask_gc, mask); - - // Create the "sensitive" pixmap. - *sen = XCreatePixmap(gui.dpy, rootWindow, - attrs.width, attrs.height, - DefaultDepth(gui.dpy, screenNum)); - XFillRectangle(gui.dpy, *sen, back_gc, 0, 0, - attrs.width, attrs.height); - XCopyArea(gui.dpy, map, *sen, mask_gc, 0, 0, - attrs.width, attrs.height, 0, 0); - - XFreeGC(gui.dpy, back_gc); - XFreeGC(gui.dpy, mask_gc); - XFreePixmap(gui.dpy, map); - } - else - *sen = 0; - - XpmFreeAttributes(&attrs); -} - - void -gui_mch_set_toolbar_pos( - int x, - int y, - int w, - int h) -{ - Dimension border; - int height; - - if (!XtIsManaged(toolBar)) // nothing to do - return; - XtUnmanageChild(toolBar); - XtVaGetValues(toolBar, - XtNborderWidth, &border, - NULL); - height = h - 2 * border; - if (height < 0) - height = 1; - XtVaSetValues(toolBar, - XtNhorizDistance, x, - XtNvertDistance, y, - XtNwidth, w - 2 * border, - XtNheight, height, - NULL); - XtManageChild(toolBar); -} -#endif - - void -gui_mch_set_text_area_pos( - int x, - int y, - int w, - int h) -{ - XtUnmanageChild(textArea); - XtVaSetValues(textArea, - XtNhorizDistance, x, - XtNvertDistance, y, - XtNwidth, w, - XtNheight, h, - NULL); - XtManageChild(textArea); -#ifdef FEAT_TOOLBAR - // Give keyboard focus to the textArea instead of the toolbar. - gui_mch_reset_focus(); -#endif -} - -#ifdef FEAT_TOOLBAR -/* - * A toolbar button has been pushed; now reset the input focus - * such that the user can type page up/down etc. and have the - * input go to the editor window, not the button - */ - static void -gui_mch_reset_focus(void) -{ - XtSetKeyboardFocus(vimForm, textArea); -} -#endif - - - void -gui_x11_set_back_color(void) -{ - if (textArea != NULL) - XtVaSetValues(textArea, - XtNbackground, gui.back_pixel, - NULL); -} - -#if defined(FEAT_MENU) || defined(PROTO) -/* - * Menu stuff. - */ - -static char_u *make_pull_name(char_u * name); -static Widget get_popup_entry(Widget w); -static Widget submenu_widget(Widget); -static Boolean has_submenu(Widget); -static void gui_mch_submenu_change(vimmenu_T *mp, int colors); -static void gui_athena_menu_font(Widget id); - - void -gui_mch_enable_menu(int flag) -{ - if (flag) - { - XtManageChild(menuBar); -# ifdef FEAT_TOOLBAR - if (XtIsManaged(toolBar)) - { - XtVaSetValues(toolBar, - XtNvertDistance, gui.menu_height, - NULL); - XtVaSetValues(textArea, - XtNvertDistance, gui.menu_height + gui.toolbar_height, - NULL); - } -# endif - } - else - { - XtUnmanageChild(menuBar); -# ifdef FEAT_TOOLBAR - if (XtIsManaged(toolBar)) - { - XtVaSetValues(toolBar, - XtNvertDistance, 0, - NULL); - } -# endif - } -} - - void -gui_mch_set_menu_pos( - int x, - int y, - int w, - int h) -{ - Dimension border; - int height; - - XtUnmanageChild(menuBar); - XtVaGetValues(menuBar, XtNborderWidth, &border, NULL); - // avoid trouble when there are no menu items, and h is 1 - height = h - 2 * border; - if (height < 0) - height = 1; - XtVaSetValues(menuBar, - XtNhorizDistance, x, - XtNvertDistance, y, - XtNwidth, w - 2 * border, - XtNheight, height, - NULL); - XtManageChild(menuBar); -} - -/* - * Used to calculate the insertion position of a widget with respect to its - * neighbors. - * - * Valid range of return values is: 0 (beginning of children) to - * numChildren (end of children). - */ - static Cardinal -athena_calculate_ins_pos(Widget widget) -{ - // Assume that if the parent of the vimmenu_T is NULL, then we can get - // to this menu by traversing "next", starting at "root_menu". - // - // This holds true for popup menus, toolbar, and toplevel menu items. - - // Popup menus: "id" is NULL. Only submenu_id is valid - - // Menus that are not toplevel: "parent" will be non-NULL, "id" & - // "submenu_id" will be non-NULL. - - // Toplevel menus: "parent" is NULL, id is the widget of the menu item - - WidgetList children; - Cardinal num_children = 0; - int retval; - Arg args[2]; - int n = 0; - int i; - - XtSetArg(args[n], XtNchildren, &children); n++; - XtSetArg(args[n], XtNnumChildren, &num_children); n++; - XtGetValues(XtParent(widget), args, n); - - retval = num_children; - for (i = 0; i < (int)num_children; ++i) - { - Widget current = children[i]; - vimmenu_T *menu = NULL; - - for (menu = (a_cur_menu->parent == NULL) - ? root_menu : a_cur_menu->parent->children; - menu != NULL; - menu = menu->next) - if (current == menu->id - && a_cur_menu->priority < menu->priority - && i < retval) - retval = i; - } - return retval; -} - - void -gui_mch_add_menu(vimmenu_T *menu, int idx UNUSED) -{ - char_u *pullright_name; - Dimension height, space, border; - vimmenu_T *parent = menu->parent; - - a_cur_menu = menu; - if (parent == NULL) - { - if (menu_is_popup(menu->dname)) - { - menu->submenu_id = XtVaCreatePopupShell((char *)menu->dname, - simpleMenuWidgetClass, vimShell, - XtNinsertPosition, athena_calculate_ins_pos, - XtNtranslations, popupTrans, - NULL); - gui_athena_menu_colors(menu->submenu_id); - } - else if (menu_is_menubar(menu->dname)) - { - menu->id = XtVaCreateManagedWidget((char *)menu->dname, - menuButtonWidgetClass, menuBar, - XtNmenuName, menu->dname, -#ifdef FONTSET_ALWAYS - XtNinternational, True, -#endif - NULL); - if (menu->id == (Widget)0) - return; - gui_athena_menu_colors(menu->id); - gui_athena_menu_font(menu->id); - - menu->submenu_id = XtVaCreatePopupShell((char *)menu->dname, - simpleMenuWidgetClass, menu->id, - XtNinsertPosition, athena_calculate_ins_pos, - XtNtranslations, supermenuTrans, - NULL); - gui_athena_menu_colors(menu->submenu_id); - gui_athena_menu_font(menu->submenu_id); - - // Don't update the menu height when it was set at a fixed value - if (!gui.menu_height_fixed) - { - /* - * When we add a top-level item to the menu bar, we can figure - * out how high the menu bar should be. - */ - XtVaGetValues(menuBar, - XtNvSpace, &space, - XtNborderWidth, &border, - NULL); - XtVaGetValues(menu->id, - XtNheight, &height, - NULL); - gui.menu_height = height + 2 * (space + border); - } - } - } - else if (parent->submenu_id != (Widget)0) - { - menu->id = XtVaCreateManagedWidget((char *)menu->dname, - smeBSBObjectClass, parent->submenu_id, - XtNlabel, menu->dname, -#ifdef FONTSET_ALWAYS - XtNinternational, True, -#endif - NULL); - if (menu->id == (Widget)0) - return; - if (pullerBitmap == None) - pullerBitmap = gui_athena_create_pullright_pixmap(menu->id); - - XtVaSetValues(menu->id, XtNrightBitmap, pullerBitmap, - NULL); - // If there are other menu items that are not pulldown menus, - // we need to adjust the right margins of those, too. - { - WidgetList children; - Cardinal num_children; - int i; - - XtVaGetValues(parent->submenu_id, XtNchildren, &children, - XtNnumChildren, &num_children, - NULL); - for (i = 0; i < (int)num_children; ++i) - { - XtVaSetValues(children[i], - XtNrightMargin, puller_width, - NULL); - } - } - gui_athena_menu_colors(menu->id); - gui_athena_menu_font(menu->id); - - pullright_name = make_pull_name(menu->dname); - menu->submenu_id = XtVaCreatePopupShell((char *)pullright_name, - simpleMenuWidgetClass, parent->submenu_id, - XtNtranslations, menuTrans, - NULL); - gui_athena_menu_colors(menu->submenu_id); - gui_athena_menu_font(menu->submenu_id); - vim_free(pullright_name); - XtAddCallback(menu->submenu_id, XtNpopupCallback, - gui_athena_popup_callback, (XtPointer)menu); - - if (parent->parent != NULL) - XtOverrideTranslations(parent->submenu_id, parentTrans); - } - a_cur_menu = NULL; -} - -// Used to determine whether a SimpleMenu has pulldown entries. -// -// "id" is the parent of the menu items. -// Ignore widget "ignore" in the pane. - static Boolean -gui_athena_menu_has_submenus(Widget id, Widget ignore) -{ - WidgetList children; - Cardinal num_children; - int i; - - XtVaGetValues(id, XtNchildren, &children, - XtNnumChildren, &num_children, - NULL); - for (i = 0; i < (int)num_children; ++i) - { - if (children[i] == ignore) - continue; - if (has_submenu(children[i])) - return True; - } - return False; -} - - static void -gui_athena_menu_font(Widget id) -{ -#ifdef FONTSET_ALWAYS - if (gui.menu_fontset != NOFONTSET) - { - if (XtIsManaged(id)) - { - XtUnmanageChild(id); - XtVaSetValues(id, XtNfontSet, gui.menu_fontset, NULL); - // We should force the widget to recalculate its - // geometry now. - XtManageChild(id); - } - else - XtVaSetValues(id, XtNfontSet, gui.menu_fontset, NULL); - if (has_submenu(id)) - XtVaSetValues(id, XtNrightBitmap, pullerBitmap, NULL); - } -#else - int managed = FALSE; - - if (gui.menu_font != NOFONT) - { - if (XtIsManaged(id)) - { - XtUnmanageChild(id); - managed = TRUE; - } - -# ifdef FEAT_XFONTSET - if (gui.fontset != NOFONTSET) - XtVaSetValues(id, XtNfontSet, gui.menu_font, NULL); - else -# endif - XtVaSetValues(id, XtNfont, gui.menu_font, NULL); - if (has_submenu(id)) - XtVaSetValues(id, XtNrightBitmap, pullerBitmap, NULL); - - // Force the widget to recalculate its geometry now. - if (managed) - XtManageChild(id); - } -#endif -} - - - void -gui_mch_new_menu_font(void) -{ - Pixmap oldpuller = None; - - if (menuBar == (Widget)0) - return; - - if (pullerBitmap != None) - { - oldpuller = pullerBitmap; - pullerBitmap = gui_athena_create_pullright_pixmap(NULL); - } - gui_mch_submenu_change(root_menu, FALSE); - - { - // Iterate through the menubar menu items and get the height of - // each one. The menu bar height is set to the maximum of all - // the heights. - vimmenu_T *mp; - int max_height = 9999; - - FOR_ALL_MENUS(mp) - { - if (menu_is_menubar(mp->dname)) - { - Dimension height; - - XtVaGetValues(mp->id, - XtNheight, &height, - NULL); - if (height < max_height) - max_height = height; - } - } - if (max_height != 9999) - { - // Don't update the menu height when it was set at a fixed value - if (!gui.menu_height_fixed) - { - Dimension space, border; - - XtVaGetValues(menuBar, - XtNvSpace, &space, - XtNborderWidth, &border, - NULL); - gui.menu_height = max_height + 2 * (space + border); - } - } - } - // Now, to simulate the window being resized. Only, this - // will resize the window to its current state. - // - // There has to be a better way, but I do not see one at this time. - // (David Harrison) - { - Position w, h; - - XtVaGetValues(vimShell, - XtNwidth, &w, - XtNheight, &h, - NULL); - gui_resize_shell(w, h -#ifdef FEAT_XIM - - xim_get_status_area_height() -#endif - ); - } - gui_set_shellsize(FALSE, TRUE, RESIZE_VERT); - ui_new_shellsize(); - if (oldpuller != None) - XFreePixmap(gui.dpy, oldpuller); -} - -#if defined(FEAT_BEVAL_GUI) || defined(PROTO) - void -gui_mch_new_tooltip_font(void) -{ -# ifdef FEAT_TOOLBAR - vimmenu_T *menu; - - if (toolBar == (Widget)0) - return; - - menu = gui_find_menu((char_u *)"ToolBar"); - if (menu != NULL) - gui_mch_submenu_change(menu, FALSE); -# endif -} - - void -gui_mch_new_tooltip_colors(void) -{ -# ifdef FEAT_TOOLBAR - vimmenu_T *menu; - - if (toolBar == (Widget)0) - return; - - menu = gui_find_menu((char_u *)"ToolBar"); - if (menu != NULL) - gui_mch_submenu_change(menu, TRUE); -# endif -} -#endif - - static void -gui_mch_submenu_change( - vimmenu_T *menu, - int colors) // TRUE for colors, FALSE for font -{ - vimmenu_T *mp; - - for (mp = menu; mp != NULL; mp = mp->next) - { - if (mp->id != (Widget)0) - { - if (colors) - { - gui_athena_menu_colors(mp->id); -#ifdef FEAT_TOOLBAR - // For a toolbar item: Free the pixmap and allocate a new one, - // so that the background color is right. - if (mp->image != (Pixmap)0) - { - XFreePixmap(gui.dpy, mp->image); - get_toolbar_pixmap(mp, &mp->image); - if (mp->image != (Pixmap)0) - XtVaSetValues(mp->id, XtNbitmap, mp->image, NULL); - } - -# ifdef FEAT_BEVAL_GUI - // If we have a tooltip, then we need to change its colors - if (mp->tip != NULL) - { - Arg args[2]; - - args[0].name = XtNbackground; - args[0].value = gui.tooltip_bg_pixel; - args[1].name = XtNforeground; - args[1].value = gui.tooltip_fg_pixel; - XtSetValues(mp->tip->balloonLabel, &args[0], XtNumber(args)); - } -# endif -#endif - } - else - { - gui_athena_menu_font(mp->id); -#ifdef FEAT_BEVAL_GUI - // If we have a tooltip, then we need to change its font - // Assume XtNinternational == True (in createBalloonEvalWindow) - if (mp->tip != NULL) - { - Arg args[1]; - - args[0].name = XtNfontSet; - args[0].value = (XtArgVal)gui.tooltip_fontset; - XtSetValues(mp->tip->balloonLabel, &args[0], XtNumber(args)); - } -#endif - } - } - - if (mp->children != NULL) - { - // Set the colors/font for the tear off widget - if (mp->submenu_id != (Widget)0) - { - if (colors) - gui_athena_menu_colors(mp->submenu_id); - else - gui_athena_menu_font(mp->submenu_id); - } - // Set the colors for the children - gui_mch_submenu_change(mp->children, colors); - } - } -} - -/* - * Make a submenu name into a pullright name. - * Replace '.' by '_', can't include '.' in the submenu name. - */ - static char_u * -make_pull_name(char_u * name) -{ - char_u *pname; - char_u *p; - - pname = vim_strnsave(name, STRLEN(name) + strlen("-pullright")); - if (pname != NULL) - { - strcat((char *)pname, "-pullright"); - while ((p = vim_strchr(pname, '.')) != NULL) - *p = '_'; - } - return pname; -} - - void -gui_mch_add_menu_item(vimmenu_T *menu, int idx UNUSED) -{ - vimmenu_T *parent = menu->parent; - - a_cur_menu = menu; -# ifdef FEAT_TOOLBAR - if (menu_is_toolbar(parent->name)) - { - WidgetClass type; - int n; - Arg args[21]; - - n = 0; - if (menu_is_separator(menu->name)) - { - XtSetArg(args[n], XtNlabel, ""); n++; - XtSetArg(args[n], XtNborderWidth, 0); n++; - } - else - { - get_toolbar_pixmap(menu, &menu->image); - XtSetArg(args[n], XtNlabel, menu->dname); n++; - XtSetArg(args[n], XtNinternalHeight, 1); n++; - XtSetArg(args[n], XtNinternalWidth, 1); n++; - XtSetArg(args[n], XtNborderWidth, 1); n++; - if (menu->image != 0) - { - XtSetArg(args[n], XtNbitmap, menu->image); n++; - } - } - XtSetArg(args[n], XtNhighlightThickness, 0); n++; - type = commandWidgetClass; - // TODO: figure out the position in the toolbar? - // This currently works fine for the default toolbar, but - // what if we add/remove items during later runtime? - - // NOTE: "idx" isn't used here. The position is calculated by - // athena_calculate_ins_pos(). The position it calculates - // should be equal to "idx". - // TODO: Could we just store "idx" and use that as the child - // placement? - - if (menu->id == NULL) - { - menu->id = XtCreateManagedWidget((char *)menu->dname, - type, toolBar, args, n); - XtAddCallback(menu->id, - XtNcallback, gui_x11_menu_cb, menu); - } - else - XtSetValues(menu->id, args, n); - gui_athena_menu_colors(menu->id); - -#ifdef FEAT_BEVAL_GUI - gui_mch_menu_set_tip(menu); -#endif - - menu->parent = parent; - menu->submenu_id = (Widget)0; - if (!XtIsManaged(toolBar) - && vim_strchr(p_go, GO_TOOLBAR) != NULL) - gui_mch_show_toolbar(TRUE); - gui.toolbar_height = gui_mch_compute_toolbar_height(); - return; - } // toolbar menu item -# endif - - // Add menu separator - if (menu_is_separator(menu->name)) - { - menu->submenu_id = (Widget)0; - menu->id = XtVaCreateManagedWidget((char *)menu->dname, - smeLineObjectClass, parent->submenu_id, - NULL); - if (menu->id == (Widget)0) - return; - gui_athena_menu_colors(menu->id); - } - else - { - if (parent != NULL && parent->submenu_id != (Widget)0) - { - menu->submenu_id = (Widget)0; - menu->id = XtVaCreateManagedWidget((char *)menu->dname, - smeBSBObjectClass, parent->submenu_id, - XtNlabel, menu->dname, -#ifdef FONTSET_ALWAYS - XtNinternational, True, -#endif - NULL); - if (menu->id == (Widget)0) - return; - - // If there are other "pulldown" items in this pane, then adjust - // the right margin to accommodate the arrow pixmap, otherwise - // the right margin will be the same as the left margin. - { - Dimension left_margin; - - XtVaGetValues(menu->id, XtNleftMargin, &left_margin, NULL); - XtVaSetValues(menu->id, XtNrightMargin, - gui_athena_menu_has_submenus(parent->submenu_id, NULL) ? - puller_width : - left_margin, - NULL); - } - - gui_athena_menu_colors(menu->id); - gui_athena_menu_font(menu->id); - XtAddCallback(menu->id, XtNcallback, gui_x11_menu_cb, - (XtPointer)menu); - } - } - a_cur_menu = NULL; -} - -#if defined(FEAT_TOOLBAR) || defined(PROTO) - void -gui_mch_show_toolbar(int showit) -{ - Cardinal numChildren; // how many children toolBar has - - if (toolBar == (Widget)0) - return; - XtVaGetValues(toolBar, XtNnumChildren, &numChildren, NULL); - if (showit && numChildren > 0) - { - // Assume that we want to show the toolbar if p_toolbar contains valid - // option settings, therefore p_toolbar must not be NULL. - WidgetList children; - - XtVaGetValues(toolBar, XtNchildren, &children, NULL); - { - void (*action)(BalloonEval *); - int text = 0; - - if (strstr((const char *)p_toolbar, "tooltips")) - action = &gui_mch_enable_beval_area; - else - action = &gui_mch_disable_beval_area; - if (strstr((const char *)p_toolbar, "text")) - text = 1; - else if (strstr((const char *)p_toolbar, "icons")) - text = -1; - if (text != 0) - { - vimmenu_T *toolbar; - vimmenu_T *cur; - - FOR_ALL_MENUS(toolbar) - if (menu_is_toolbar(toolbar->dname)) - break; - // Assumption: toolbar is NULL if there is no toolbar, - // otherwise it contains the toolbar menu structure. - // - // Assumption: "numChildren" == the number of items in the list - // of items beginning with toolbar->children. - if (toolbar) - { - for (cur = toolbar->children; cur; cur = cur->next) - { - Arg args[2]; - int n = 0; - - // Enable/Disable tooltip (OK to enable while currently - // enabled) - if (cur->tip != NULL) - (*action)(cur->tip); - if (text == 1) - { - XtSetArg(args[n], XtNbitmap, None); - n++; - XtSetArg(args[n], XtNlabel, - menu_is_separator(cur->name) ? "" : - (char *)cur->dname); - n++; - } - else - { - XtSetArg(args[n], XtNbitmap, cur->image); - n++; - XtSetArg(args[n], XtNlabel, (cur->image == None) ? - menu_is_separator(cur->name) ? - "" : - (char *)cur->dname - : - (char *)None); - n++; - } - if (cur->id != NULL) - { - XtUnmanageChild(cur->id); - XtSetValues(cur->id, args, n); - XtManageChild(cur->id); - } - } - } - } - } - gui.toolbar_height = gui_mch_compute_toolbar_height(); - XtManageChild(toolBar); - if (XtIsManaged(menuBar)) - { - XtVaSetValues(textArea, - XtNvertDistance, gui.toolbar_height + gui.menu_height, - NULL); - XtVaSetValues(toolBar, - XtNvertDistance, gui.menu_height, - NULL); - } - else - { - XtVaSetValues(textArea, - XtNvertDistance, gui.toolbar_height, - NULL); - XtVaSetValues(toolBar, - XtNvertDistance, 0, - NULL); - } - } - else - { - gui.toolbar_height = 0; - if (XtIsManaged(menuBar)) - XtVaSetValues(textArea, - XtNvertDistance, gui.menu_height, - NULL); - else - XtVaSetValues(textArea, - XtNvertDistance, 0, - NULL); - - XtUnmanageChild(toolBar); - } - gui_set_shellsize(FALSE, FALSE, RESIZE_VERT); -} - - - int -gui_mch_compute_toolbar_height(void) -{ - Dimension height; // total Toolbar height - Dimension whgt; // height of each widget - Dimension marginHeight; // XmNmarginHeight of toolBar - Dimension shadowThickness; // thickness of Xtparent(toolBar) - WidgetList children; // list of toolBar's children - Cardinal numChildren; // how many children toolBar has - int i; - - height = 0; - shadowThickness = 0; - marginHeight = 0; - if (toolBar != (Widget)0) - { - XtVaGetValues(toolBar, - XtNborderWidth, &shadowThickness, - XtNvSpace, &marginHeight, - XtNchildren, &children, - XtNnumChildren, &numChildren, - NULL); - for (i = 0; i < (int)numChildren; i++) - { - whgt = 0; - - XtVaGetValues(children[i], XtNheight, &whgt, NULL); - if (height < whgt) - height = whgt; - } - } - - return (int)(height + (marginHeight << 1) + (shadowThickness << 1)); -} - - void -gui_mch_get_toolbar_colors( - Pixel *bgp, - Pixel *fgp, - Pixel *bsp, - Pixel *tsp, - Pixel *hsp) -{ - XtVaGetValues(toolBar, XtNbackground, bgp, XtNborderColor, fgp, NULL); - *bsp = *bgp; - *tsp = *fgp; - *hsp = *tsp; -} -#endif - - - void -gui_mch_toggle_tearoffs(int enable UNUSED) -{ - // no tearoff menus -} - - void -gui_mch_new_menu_colors(void) -{ - if (menuBar == (Widget)0) - return; - if (gui.menu_fg_pixel != INVALCOLOR) - XtVaSetValues(menuBar, XtNborderColor, gui.menu_fg_pixel, NULL); - gui_athena_menu_colors(menuBar); -#ifdef FEAT_TOOLBAR - gui_athena_menu_colors(toolBar); -#endif - - gui_mch_submenu_change(root_menu, TRUE); -} - -/* - * Destroy the machine specific menu widget. - */ - void -gui_mch_destroy_menu(vimmenu_T *menu) -{ - Widget parent; - - // There is no item for the toolbar. - if (menu->id == (Widget)0) - return; - - parent = XtParent(menu->id); - - // When removing the last "pulldown" menu item from a pane, adjust the - // right margins of the remaining widgets. - if (menu->submenu_id != (Widget)0) - { - // Go through the menu items in the parent of this item and - // adjust their margins, if necessary. - // This takes care of the case when we delete the last menu item in a - // pane that has a submenu. In this case, there will be no arrow - // pixmaps shown anymore. - { - WidgetList children; - Cardinal num_children; - int i; - Dimension right_margin = 0; - Boolean get_left_margin = False; - - XtVaGetValues(parent, XtNchildren, &children, - XtNnumChildren, &num_children, - NULL); - if (gui_athena_menu_has_submenus(parent, menu->id)) - right_margin = puller_width; - else - get_left_margin = True; - - for (i = 0; i < (int)num_children; ++i) - { - if (children[i] == menu->id) - continue; - if (get_left_margin == True) - { - Dimension left_margin; - - XtVaGetValues(children[i], XtNleftMargin, &left_margin, - NULL); - XtVaSetValues(children[i], XtNrightMargin, left_margin, - NULL); - } - else - XtVaSetValues(children[i], XtNrightMargin, right_margin, - NULL); - } - } - } - // Please be sure to destroy the parent widget first (i.e. menu->id). - // - // This code should be basically identical to that in the file gui_motif.c - // because they are both Xt based. - if (menu->id != (Widget)0) - { - Cardinal num_children; - Dimension height, space, border; - - XtVaGetValues(menuBar, - XtNvSpace, &space, - XtNborderWidth, &border, - NULL); - XtVaGetValues(menu->id, - XtNheight, &height, - NULL); -#if defined(FEAT_TOOLBAR) && defined(FEAT_BEVAL_GUI) - if (parent == toolBar && menu->tip != NULL) - { - // We try to destroy this before the actual menu, because there are - // callbacks, etc. that will be unregistered during the tooltip - // destruction. - // - // If you call "gui_mch_destroy_beval_area()" after destroying - // menu->id, then the tooltip's window will have already been - // deallocated by Xt, and unknown behaviour will ensue (probably - // a core dump). - gui_mch_destroy_beval_area(menu->tip); - menu->tip = NULL; - } -#endif - /* - * This is a hack to stop the Athena simpleMenuWidget from getting a - * BadValue error when a menu's last child is destroyed. We check to - * see if this is the last child and if so, don't delete it. The parent - * will be deleted soon anyway, and it will delete its children like - * all good widgets do. - */ - // NOTE: The cause of the BadValue X Protocol Error is because when the - // last child is destroyed, it is first unmanaged, thus causing a - // geometry resize request from the parent Shell widget. - // Since the Shell widget has no more children, it is resized to have - // width/height of 0. XConfigureWindow() is then called with the - // width/height of 0, which generates the BadValue. - // - // This happens in phase two of the widget destruction process. - { - if (parent != menuBar -#ifdef FEAT_TOOLBAR - && parent != toolBar -#endif - ) - { - XtVaGetValues(parent, XtNnumChildren, &num_children, NULL); - if (num_children > 1) - XtDestroyWidget(menu->id); - } - else - XtDestroyWidget(menu->id); - menu->id = (Widget)0; - } - - if (parent == menuBar) - { - if (!gui.menu_height_fixed) - gui.menu_height = height + 2 * (space + border); - } -#ifdef FEAT_TOOLBAR - else if (parent == toolBar) - { - // When removing last toolbar item, don't display the toolbar. - XtVaGetValues(toolBar, XtNnumChildren, &num_children, NULL); - if (num_children == 0) - gui_mch_show_toolbar(FALSE); - else - gui.toolbar_height = gui_mch_compute_toolbar_height(); - } -#endif - } - if (menu->submenu_id != (Widget)0) - { - XtDestroyWidget(menu->submenu_id); - menu->submenu_id = (Widget)0; - } -} - - static void -gui_athena_menu_timeout( - XtPointer client_data, - XtIntervalId *id UNUSED) -{ - Widget w = (Widget)client_data; - Widget popup; - - timer = 0; - if (XtIsSubclass(w,smeBSBObjectClass)) - { - Pixmap p; - - XtVaGetValues(w, XtNrightBitmap, &p, NULL); - if ((p != None) && (p != XtUnspecifiedPixmap)) - { - // We are dealing with an item that has a submenu - popup = get_popup_entry(XtParent(w)); - if (popup == (Widget)0) - return; - XtPopup(popup, XtGrabNonexclusive); - } - } -} - -/* - * This routine is used to calculate the position (in screen coordinates) - * where a submenu should appear relative to the menu entry that popped it - * up. It should appear even with and just slightly to the left of the - * rightmost end of the menu entry that caused the popup. - * - * This is called when XtPopup() is called. - */ - static void -gui_athena_popup_callback( - Widget w, - XtPointer client_data, - XtPointer call_data UNUSED) -{ - // Assumption: XtIsSubclass(XtParent(w),simpleMenuWidgetClass) - vimmenu_T *menu = (vimmenu_T *)client_data; - Dimension width; - Position root_x, root_y; - - // First, popdown any siblings that may have menus popped up - { - vimmenu_T *i; - - FOR_ALL_CHILD_MENUS(menu->parent, i) - { - if (i->submenu_id != NULL && XtIsManaged(i->submenu_id)) - XtPopdown(i->submenu_id); - } - } - XtVaGetValues(XtParent(w), - XtNwidth, &width, - NULL); - // Assumption: XawSimpleMenuGetActiveEntry(XtParent(w)) == menu->id - // i.e. This IS the active entry - XtTranslateCoords(menu->id,width - 5, 0, &root_x, &root_y); - XtVaSetValues(w, XtNx, root_x, - XtNy, root_y, - NULL); -} - - static void -gui_athena_popdown_submenus_action( - Widget w, - XEvent *event, - String *args, - Cardinal *nargs) -{ - WidgetList children; - Cardinal num_children; - - XtVaGetValues(w, XtNchildren, &children, - XtNnumChildren, &num_children, - NULL); - for (; num_children > 0; --num_children) - { - Widget child = children[num_children - 1]; - - if (has_submenu(child)) - { - Widget temp_w; - - temp_w = submenu_widget(child); - gui_athena_popdown_submenus_action(temp_w,event,args,nargs); - XtPopdown(temp_w); - } - } -} - -/* - * Used to determine if the given widget has a submenu that can be popped up. - */ - static Boolean -has_submenu(Widget widget) -{ - if ((widget != NULL) && XtIsSubclass(widget,smeBSBObjectClass)) - { - Pixmap p; - - XtVaGetValues(widget, XtNrightBitmap, &p, NULL); - if ((p != None) && (p != XtUnspecifiedPixmap)) - return True; - } - return False; -} - - static void -gui_athena_delayed_arm_action( - Widget w, - XEvent *event, - String *args, - Cardinal *nargs) -{ - Dimension width, height; - - if (event->type != MotionNotify) - return; - - XtVaGetValues(w, - XtNwidth, &width, - XtNheight, &height, - NULL); - - if (event->xmotion.x >= (int)width || event->xmotion.y >= (int)height) - return; - - { - static Widget previous_active_widget = NULL; - Widget current; - - current = XawSimpleMenuGetActiveEntry(w); - if (current != previous_active_widget) - { - if (timer) - { - // If the timeout hasn't been triggered, remove it - XtRemoveTimeOut(timer); - } - gui_athena_popdown_submenus_action(w,event,args,nargs); - if (has_submenu(current)) - { - XtAppAddTimeOut(XtWidgetToApplicationContext(w), 600L, - gui_athena_menu_timeout, - (XtPointer)current); - } - previous_active_widget = current; - } - } -} - - static Widget -get_popup_entry(Widget w) -{ - Widget menuw; - - // Get the active entry for the current menu - if ((menuw = XawSimpleMenuGetActiveEntry(w)) == (Widget)0) - return NULL; - - return submenu_widget(menuw); -} - -/* - * Given the widget that has been determined to have a submenu, return the - * submenu widget that is to be popped up. - */ - static Widget -submenu_widget(Widget widget) -{ - // Precondition: has_submenu(widget) == True - // XtIsSubclass(XtParent(widget),simpleMenuWidgetClass) == True - - char_u *pullright_name; - Widget popup; - - pullright_name = make_pull_name((char_u *)XtName(widget)); - popup = XtNameToWidget(XtParent(widget), (char *)pullright_name); - vim_free(pullright_name); - - return popup; - // Postcondition: (popup != NULL) implies - // (XtIsSubclass(popup,simpleMenuWidgetClass) == True) -} - - void -gui_mch_show_popupmenu(vimmenu_T *menu) -{ - int rootx, rooty, winx, winy; - Window root, child; - unsigned int mask; - - if (menu->submenu_id == (Widget)0) - return; - - // Position the popup menu at the pointer - if (XQueryPointer(gui.dpy, XtWindow(vimShell), &root, &child, - &rootx, &rooty, &winx, &winy, &mask)) - { - rootx -= 30; - if (rootx < 0) - rootx = 0; - rooty -= 5; - if (rooty < 0) - rooty = 0; - XtVaSetValues(menu->submenu_id, - XtNx, rootx, - XtNy, rooty, - NULL); - } - - XtOverrideTranslations(menu->submenu_id, popupTrans); - XtPopupSpringLoaded(menu->submenu_id); -} - -#endif // FEAT_MENU - -/* - * Set the menu and scrollbar colors to their default values. - */ - void -gui_mch_def_colors(void) -{ - /* - * Get the colors ourselves. Using the automatic conversion doesn't - * handle looking for approximate colors. - */ - if (gui.in_use) - { - gui.menu_fg_pixel = gui_get_color((char_u *)gui.rsrc_menu_fg_name); - gui.menu_bg_pixel = gui_get_color((char_u *)gui.rsrc_menu_bg_name); - gui.scroll_fg_pixel = gui_get_color((char_u *)gui.rsrc_scroll_fg_name); - gui.scroll_bg_pixel = gui_get_color((char_u *)gui.rsrc_scroll_bg_name); -#ifdef FEAT_BEVAL_GUI - gui.tooltip_fg_pixel = gui_get_color((char_u *)gui.rsrc_tooltip_fg_name); - gui.tooltip_bg_pixel = gui_get_color((char_u *)gui.rsrc_tooltip_bg_name); -#endif - } -} - - -/* - * Scrollbar stuff. - */ - - void -gui_mch_set_scrollbar_thumb( - scrollbar_T *sb, - long val, - long size, - long max) -{ - double v, s; - - if (sb->id == (Widget)0) - return; - - /* - * Athena scrollbar must go from 0.0 to 1.0. - */ - if (max == 0) - { - // So you can't scroll it at all (normally it scrolls past end) -#ifdef FEAT_GUI_NEXTAW - XawScrollbarSetThumb(sb->id, 0.0, 1.0); -#else - vim_XawScrollbarSetThumb(sb->id, 0.0, 1.0, 0.0); -#endif - } - else - { - v = (double)val / (double)(max + 1); - s = (double)size / (double)(max + 1); -#ifdef FEAT_GUI_NEXTAW - XawScrollbarSetThumb(sb->id, v, s); -#else - vim_XawScrollbarSetThumb(sb->id, v, s, 1.0); -#endif - } -} - - void -gui_mch_set_scrollbar_pos( - scrollbar_T *sb, - int x, - int y, - int w, - int h) -{ - if (sb->id == (Widget)0) - return; - - XtUnmanageChild(sb->id); - XtVaSetValues(sb->id, - XtNhorizDistance, x, - XtNvertDistance, y, - XtNwidth, w, - XtNheight, h, - NULL); - XtManageChild(sb->id); -} - - int -gui_mch_get_scrollbar_xpadding(void) -{ - int xpad; - Dimension tw, ww; - Position tx; - - XtVaGetValues(textArea, XtNwidth, &tw, XtNx, &tx, NULL); - XtVaGetValues(vimShell, XtNwidth, &ww, NULL); - xpad = ww - tw - tx - gui.scrollbar_width; - return (xpad < 0) ? 0 : xpad; -} - - int -gui_mch_get_scrollbar_ypadding(void) -{ - int ypad; - Dimension th, wh; - Position ty; - - XtVaGetValues(textArea, XtNheight, &th, XtNy, &ty, NULL); - XtVaGetValues(vimShell, XtNheight, &wh, NULL); - ypad = wh - th - ty - gui.scrollbar_height; - return (ypad < 0) ? 0 : ypad; -} - - void -gui_mch_enable_scrollbar(scrollbar_T *sb, int flag) -{ - if (sb->id != (Widget)0) - { - if (flag) - XtManageChild(sb->id); - else - XtUnmanageChild(sb->id); - } -} - - void -gui_mch_create_scrollbar( - scrollbar_T *sb, - int orient) // SBAR_VERT or SBAR_HORIZ -{ - sb->id = XtVaCreateWidget("scrollBar", -#ifdef FEAT_GUI_NEXTAW - scrollbarWidgetClass, vimForm, -#else - vim_scrollbarWidgetClass, vimForm, -#endif - XtNresizable, True, - XtNtop, XtChainTop, - XtNbottom, XtChainTop, - XtNleft, XtChainLeft, - XtNright, XtChainLeft, - XtNborderWidth, 0, - XtNorientation, (orient == SBAR_VERT) ? XtorientVertical - : XtorientHorizontal, - XtNforeground, gui.scroll_fg_pixel, - XtNbackground, gui.scroll_bg_pixel, - NULL); - if (sb->id == (Widget)0) - return; - - XtAddCallback(sb->id, XtNjumpProc, - gui_athena_scroll_cb_jump, (XtPointer)sb->ident); - XtAddCallback(sb->id, XtNscrollProc, - gui_athena_scroll_cb_scroll, (XtPointer)sb->ident); - -#ifdef FEAT_GUI_NEXTAW - XawScrollbarSetThumb(sb->id, 0.0, 1.0); -#else - vim_XawScrollbarSetThumb(sb->id, 0.0, 1.0, 0.0); -#endif -} - - void -gui_mch_destroy_scrollbar(scrollbar_T *sb) -{ - if (sb->id != (Widget)0) - XtDestroyWidget(sb->id); -} - - void -gui_mch_set_scrollbar_colors(scrollbar_T *sb) -{ - if (sb->id != (Widget)0) - XtVaSetValues(sb->id, - XtNforeground, gui.scroll_fg_pixel, - XtNbackground, gui.scroll_bg_pixel, - NULL); - - // This is needed for the rectangle below the vertical scrollbars. - if (sb == &gui.bottom_sbar && vimForm != (Widget)0) - gui_athena_scroll_colors(vimForm); -} - -/* - * Miscellaneous stuff: - */ - Window -gui_x11_get_wid(void) -{ - return XtWindow(textArea); -} - -#if defined(FEAT_BROWSE) || defined(PROTO) -/* - * Put up a file requester. - * Returns the selected name in allocated memory, or NULL for Cancel. - */ - char_u * -gui_mch_browse( - int saving UNUSED, // select file to write - char_u *title, // title for the window - char_u *dflt, // default name - char_u *ext UNUSED, // extension added - char_u *initdir, // initial directory, NULL for current dir - char_u *filter UNUSED) // file name filter -{ - Position x, y; - char_u dirbuf[MAXPATHL]; - - // Concatenate "initdir" and "dflt". - if (initdir == NULL || *initdir == NUL) - mch_dirname(dirbuf, MAXPATHL); - else if (STRLEN(initdir) + 2 < MAXPATHL) - STRCPY(dirbuf, initdir); - else - dirbuf[0] = NUL; - if (dflt != NULL && *dflt != NUL - && STRLEN(dirbuf) + 2 + STRLEN(dflt) < MAXPATHL) - { - add_pathsep(dirbuf); - STRCAT(dirbuf, dflt); - } - - // Position the file selector just below the menubar - XtTranslateCoords(vimShell, (Position)0, (Position) -#ifdef FEAT_MENU - gui.menu_height -#else - 0 -#endif - , &x, &y); - return (char_u *)vim_SelFile(vimShell, (char *)title, (char *)dirbuf, - NULL, (int)x, (int)y, gui.menu_fg_pixel, gui.menu_bg_pixel, - gui.scroll_fg_pixel, gui.scroll_bg_pixel); -} -#endif - -#if defined(FEAT_GUI_DIALOG) || defined(PROTO) - -static int dialogStatus; -static Atom dialogatom; - -/* - * Callback function for the textfield. When CR is hit this works like - * hitting the "OK" button, ESC like "Cancel". - */ - static void -keyhit_callback( - Widget w UNUSED, - XtPointer client_data UNUSED, - XEvent *event, - Boolean *cont UNUSED) -{ - char buf[2]; - - if (XLookupString(&(event->xkey), buf, 2, NULL, NULL) == 1) - { - if (*buf == CAR) - dialogStatus = 1; - else if (*buf == ESC) - dialogStatus = 0; - } -} - - static void -butproc( - Widget w UNUSED, - XtPointer client_data, - XtPointer call_data UNUSED) -{ - dialogStatus = (int)(long)client_data + 1; -} - -/* - * Function called when dialog window closed. - */ - static void -dialog_wm_handler( - Widget w UNUSED, - XtPointer client_data UNUSED, - XEvent *event, - Boolean *dum UNUSED) -{ - if (event->type == ClientMessage - && (Atom)((XClientMessageEvent *)event)->data.l[0] == dialogatom) - dialogStatus = 0; -} - - int -gui_mch_dialog( - int type UNUSED, - char_u *title, - char_u *message, - char_u *buttons, - int dfltbutton UNUSED, - char_u *textfield, - int ex_cmd UNUSED) -{ - char_u *buts; - char_u *p, *next; - XtAppContext app; - XEvent event; - Position wd, hd; - Position wv, hv; - Position x, y; - Widget dialog; - Widget dialogshell; - Widget dialogmessage; - Widget dialogtextfield = 0; - Widget dialogButton; - Widget prev_dialogButton = NULL; - int butcount; - int vertical; - - if (title == NULL) - title = (char_u *)_("Vim dialog"); - dialogStatus = -1; - - // if our pointer is currently hidden, then we should show it. - gui_mch_mousehide(FALSE); - - // Check 'v' flag in 'guioptions': vertical button placement. - vertical = (vim_strchr(p_go, GO_VERTICAL) != NULL); - - // The shell is created each time, to make sure it is resized properly - dialogshell = XtVaCreatePopupShell("dialogShell", - transientShellWidgetClass, vimShell, - XtNtitle, title, - NULL); - if (dialogshell == (Widget)0) - goto error; - - dialog = XtVaCreateManagedWidget("dialog", - formWidgetClass, dialogshell, - XtNdefaultDistance, 20, - NULL); - if (dialog == (Widget)0) - goto error; - gui_athena_menu_colors(dialog); - dialogmessage = XtVaCreateManagedWidget("dialogMessage", - labelWidgetClass, dialog, - XtNlabel, message, - XtNtop, XtChainTop, - XtNbottom, XtChainTop, - XtNleft, XtChainLeft, - XtNright, XtChainLeft, - XtNresizable, True, - XtNborderWidth, 0, - NULL); - gui_athena_menu_colors(dialogmessage); - - if (textfield != NULL) - { - dialogtextfield = XtVaCreateManagedWidget("textfield", - asciiTextWidgetClass, dialog, - XtNwidth, 400, - XtNtop, XtChainTop, - XtNbottom, XtChainTop, - XtNleft, XtChainLeft, - XtNright, XtChainRight, - XtNfromVert, dialogmessage, - XtNresizable, True, - XtNstring, textfield, - XtNlength, IOSIZE, - XtNuseStringInPlace, True, - XtNeditType, XawtextEdit, - XtNwrap, XawtextWrapNever, - XtNresize, XawtextResizeHeight, - NULL); - XtManageChild(dialogtextfield); - XtAddEventHandler(dialogtextfield, KeyPressMask, False, - (XtEventHandler)keyhit_callback, (XtPointer)NULL); - XawTextSetInsertionPoint(dialogtextfield, - (XawTextPosition)STRLEN(textfield)); - XtSetKeyboardFocus(dialog, dialogtextfield); - } - - // make a copy, so that we can insert NULs - buts = vim_strsave(buttons); - if (buts == NULL) - return -1; - - p = buts; - for (butcount = 0; *p; ++butcount) - { - for (next = p; *next; ++next) - { - if (*next == DLG_HOTKEY_CHAR) - STRMOVE(next, next + 1); - if (*next == DLG_BUTTON_SEP) - { - *next++ = NUL; - break; - } - } - dialogButton = XtVaCreateManagedWidget("button", - commandWidgetClass, dialog, - XtNlabel, p, - XtNtop, XtChainBottom, - XtNbottom, XtChainBottom, - XtNleft, XtChainLeft, - XtNright, XtChainLeft, - XtNfromVert, textfield == NULL ? dialogmessage : dialogtextfield, - XtNvertDistance, vertical ? 4 : 20, - XtNresizable, False, - NULL); - gui_athena_menu_colors(dialogButton); - if (butcount > 0) - XtVaSetValues(dialogButton, - vertical ? XtNfromVert : XtNfromHoriz, prev_dialogButton, - NULL); - - XtAddCallback(dialogButton, XtNcallback, butproc, (XtPointer)(long_u)butcount); - p = next; - prev_dialogButton = dialogButton; - } - vim_free(buts); - - XtRealizeWidget(dialogshell); - - // Setup for catching the close-window event, don't let it close Vim! - dialogatom = XInternAtom(gui.dpy, "WM_DELETE_WINDOW", False); - XSetWMProtocols(gui.dpy, XtWindow(dialogshell), &dialogatom, 1); - XtAddEventHandler(dialogshell, NoEventMask, True, dialog_wm_handler, NULL); - - XtVaGetValues(dialogshell, - XtNwidth, &wd, - XtNheight, &hd, - NULL); - XtVaGetValues(vimShell, - XtNwidth, &wv, - XtNheight, &hv, - NULL); - XtTranslateCoords(vimShell, - (Position)((wv - wd) / 2), - (Position)((hv - hd) / 2), - &x, &y); - if (x < 0) - x = 0; - if (y < 0) - y = 0; - XtVaSetValues(dialogshell, XtNx, x, XtNy, y, NULL); - - // Position the mouse pointer in the dialog, required for when focus - // follows mouse. - XWarpPointer(gui.dpy, (Window)0, XtWindow(dialogshell), 0, 0, 0, 0, 20, 40); - - - app = XtWidgetToApplicationContext(dialogshell); - - XtPopup(dialogshell, XtGrabNonexclusive); - - for (;;) - { - XtAppNextEvent(app, &event); - XtDispatchEvent(&event); - if (dialogStatus >= 0) - break; - } - - XtPopdown(dialogshell); - - if (textfield != NULL && dialogStatus < 0) - *textfield = NUL; - -error: - XtDestroyWidget(dialogshell); - - return dialogStatus; -} -#endif - -#if defined(FEAT_GUI_DIALOG) || defined(FEAT_MENU) -/* - * Set the colors of Widget "id" to the menu colors. - */ - static void -gui_athena_menu_colors(Widget id) -{ - if (gui.menu_bg_pixel != INVALCOLOR) - XtVaSetValues(id, XtNbackground, gui.menu_bg_pixel, NULL); - if (gui.menu_fg_pixel != INVALCOLOR) - XtVaSetValues(id, XtNforeground, gui.menu_fg_pixel, NULL); -} -#endif - -/* - * Set the colors of Widget "id" to the scroll colors. - */ - static void -gui_athena_scroll_colors(Widget id) -{ - if (gui.scroll_bg_pixel != INVALCOLOR) - XtVaSetValues(id, XtNbackground, gui.scroll_bg_pixel, NULL); - if (gui.scroll_fg_pixel != INVALCOLOR) - XtVaSetValues(id, XtNforeground, gui.scroll_fg_pixel, NULL); -}
--- a/src/gui_beval.c +++ b/src/gui_beval.c @@ -24,22 +24,12 @@ # include <gtk/gtk.h> #else # include <X11/keysym.h> -# ifdef FEAT_GUI_MOTIF -# include <Xm/PushB.h> -# include <Xm/Separator.h> -# include <Xm/List.h> -# include <Xm/Label.h> -# include <Xm/AtomMgr.h> -# include <Xm/Protocols.h> -# else - // Assume Athena -# include <X11/Shell.h> -# ifdef FEAT_GUI_NEXTAW -# include <X11/neXtaw/Label.h> -# else -# include <X11/Xaw/Label.h> -# endif -# endif +# include <Xm/PushB.h> +# include <Xm/Separator.h> +# include <Xm/List.h> +# include <Xm/Label.h> +# include <Xm/AtomMgr.h> +# include <Xm/Protocols.h> #endif #ifndef FEAT_GUI_GTK @@ -618,7 +608,7 @@ pointerEvent(BalloonEval *beval, XEvent break; /* - * Motif and Athena version: Keystrokes will be caught by the + * Motif version: Keystrokes will be caught by the * "textArea" widget, and handled in gui_x11_key_hit_cb(). */ case KeyPress: @@ -1072,11 +1062,10 @@ drawBalloon(BalloonEval *beval) if (beval->msg != NULL) { + XmString s; // Show the Balloon // Calculate the label's width and height -#ifdef FEAT_GUI_MOTIF - XmString s; // For the callback function we parse NL characters to create a // multi-line label. This doesn't work for all languages, but @@ -1101,21 +1090,6 @@ drawBalloon(BalloonEval *beval) h += gui.border_offset << 1; XtVaSetValues(beval->balloonLabel, XmNlabelString, s, NULL); XmStringFree(s); -#else // Athena - // Assume XtNinternational == True - XFontSet fset; - XFontSetExtents *ext; - - XtVaGetValues(beval->balloonLabel, XtNfontSet, &fset, NULL); - ext = XExtentsOfFontSet(fset); - h = ext->max_ink_extent.height; - w = XmbTextEscapement(fset, - (char *)beval->msg, - (int)STRLEN(beval->msg)); - w += gui.border_offset << 1; - h += gui.border_offset << 1; - XtVaSetValues(beval->balloonLabel, XtNlabel, beval->msg, NULL); -#endif // Compute position of the balloon area tx = beval->x_root + EVAL_OFFSET_X; @@ -1124,33 +1098,18 @@ drawBalloon(BalloonEval *beval) tx = beval->screen_width - w; if ((ty + h) > beval->screen_height) ty = beval->screen_height - h; -#ifdef FEAT_GUI_MOTIF XtVaSetValues(beval->balloonShell, XmNx, tx, XmNy, ty, NULL); -#else - // Athena - XtVaSetValues(beval->balloonShell, - XtNx, tx, - XtNy, ty, - NULL); -#endif // Set tooltip colors { Arg args[2]; -#ifdef FEAT_GUI_MOTIF args[0].name = XmNbackground; args[0].value = gui.tooltip_bg_pixel; args[1].name = XmNforeground; args[1].value = gui.tooltip_fg_pixel; -#else // Athena - args[0].name = XtNbackground; - args[0].value = gui.tooltip_bg_pixel; - args[1].name = XtNforeground; - args[1].value = gui.tooltip_fg_pixel; -#endif XtSetValues(beval->balloonLabel, &args[0], XtNumber(args)); } @@ -1198,22 +1157,14 @@ createBalloonEvalWindow(BalloonEval *bev int n; n = 0; -#ifdef FEAT_GUI_MOTIF XtSetArg(args[n], XmNallowShellResize, True); n++; beval->balloonShell = XtAppCreateShell("balloonEval", "BalloonEval", overrideShellWidgetClass, gui.dpy, args, n); -#else - // Athena - XtSetArg(args[n], XtNallowShellResize, True); n++; - beval->balloonShell = XtAppCreateShell("balloonEval", "BalloonEval", - overrideShellWidgetClass, gui.dpy, args, n); -#endif - n = 0; -#ifdef FEAT_GUI_MOTIF { XmFontList fl; + n = 0; fl = gui_motif_fontset2fontlist(&gui.tooltip_fontset); XtSetArg(args[n], XmNforeground, gui.tooltip_fg_pixel); n++; XtSetArg(args[n], XmNbackground, gui.tooltip_bg_pixel); n++; @@ -1222,14 +1173,6 @@ createBalloonEvalWindow(BalloonEval *bev beval->balloonLabel = XtCreateManagedWidget("balloonLabel", xmLabelWidgetClass, beval->balloonShell, args, n); } -#else // FEAT_GUI_ATHENA - XtSetArg(args[n], XtNforeground, gui.tooltip_fg_pixel); n++; - XtSetArg(args[n], XtNbackground, gui.tooltip_bg_pixel); n++; - XtSetArg(args[n], XtNinternational, True); n++; - XtSetArg(args[n], XtNfontSet, gui.tooltip_fontset); n++; - beval->balloonLabel = XtCreateManagedWidget("balloonLabel", - labelWidgetClass, beval->balloonShell, args, n); -#endif } #endif // !FEAT_GUI_GTK
--- a/src/gui_motif.c +++ b/src/gui_motif.c @@ -641,8 +641,7 @@ gui_x11_set_back_color(void) } /* - * Manage dialog centered on pointer. This could be used by the Athena code as - * well. + * Manage dialog centered on pointer. */ void manage_centered(Widget dialog_child) @@ -1596,9 +1595,6 @@ gui_mch_destroy_menu(vimmenu_T *menu) // Please be sure to destroy the parent widget first (i.e. menu->id). // On the other hand, problems have been reported that the submenu must be // deleted first... - // - // This code should be basically identical to that in the file gui_athena.c - // because they are both Xt based. if (menu->submenu_id != (Widget)0) { XtDestroyWidget(menu->submenu_id);
--- a/src/gui_x11.c +++ b/src/gui_x11.c @@ -8,7 +8,7 @@ * See README.txt for an overview of the Vim source code. */ /* - * Common code for the Motif and Athena GUI. + * Code for the Motif GUI. * Not used for GTK. */ @@ -66,22 +66,13 @@ #endif #define DFLT_TOOLTIP_FONT XtDefaultFontSet -#ifdef FEAT_GUI_ATHENA -# define DFLT_MENU_BG_COLOR "gray77" -# define DFLT_MENU_FG_COLOR "black" -# define DFLT_SCROLL_BG_COLOR "gray60" -# define DFLT_SCROLL_FG_COLOR "gray77" -# define DFLT_TOOLTIP_BG_COLOR "#ffff91" -# define DFLT_TOOLTIP_FG_COLOR "#000000" -#else // use the default (CDE) colors -# define DFLT_MENU_BG_COLOR "" -# define DFLT_MENU_FG_COLOR "" -# define DFLT_SCROLL_BG_COLOR "" -# define DFLT_SCROLL_FG_COLOR "" -# define DFLT_TOOLTIP_BG_COLOR "#ffff91" -# define DFLT_TOOLTIP_FG_COLOR "#000000" -#endif +#define DFLT_MENU_BG_COLOR "" +#define DFLT_MENU_FG_COLOR "" +#define DFLT_SCROLL_BG_COLOR "" +#define DFLT_SCROLL_FG_COLOR "" +#define DFLT_TOOLTIP_BG_COLOR "#ffff91" +#define DFLT_TOOLTIP_FG_COLOR "#000000" Widget vimShell = (Widget)0; @@ -385,17 +376,6 @@ static XtResource vim_resources[] = (XtPointer)SB_DEFAULT_WIDTH }, #ifdef FEAT_MENU -# ifdef FEAT_GUI_ATHENA // with Motif the height is always computed - { - XtNmenuHeight, - XtCMenuHeight, - XtRInt, - sizeof(int), - XtOffsetOf(gui_T, menu_height), - XtRImmediate, - (XtPointer)MENU_DEFAULT_HEIGHT // Should figure out at run time - }, -# endif { # ifdef FONTSET_ALWAYS XtNmenuFontSet, @@ -1275,8 +1255,6 @@ gui_mch_init(void) * Get the colors ourselves. Using the automatic conversion doesn't * handle looking for approximate colors. */ - // NOTE: These next few lines are an exact duplicate of gui_athena.c's - // gui_mch_def_colors(). Why? gui.menu_fg_pixel = gui_get_color((char_u *)gui.rsrc_menu_fg_name); gui.menu_bg_pixel = gui_get_color((char_u *)gui.rsrc_menu_bg_name); gui.scroll_fg_pixel = gui_get_color((char_u *)gui.rsrc_scroll_fg_name); @@ -1286,12 +1264,6 @@ gui_mch_init(void) gui.tooltip_bg_pixel = gui_get_color((char_u *)gui.rsrc_tooltip_bg_name); #endif -#if defined(FEAT_MENU) && defined(FEAT_GUI_ATHENA) - // If the menu height was set, don't change it at runtime - if (gui.menu_height != MENU_DEFAULT_HEIGHT) - gui.menu_height_fixed = TRUE; -#endif - // Set default foreground and background colours gui.norm_pixel = gui.def_norm_pixel; gui.back_pixel = gui.def_back_pixel; @@ -1454,11 +1426,7 @@ gui_mch_init(void) XpmFreeAttributes(&attr); } -# ifdef FEAT_GUI_ATHENA - XtVaSetValues(vimShell, XtNiconPixmap, icon, XtNiconMask, icon_mask, NULL); -# else XtVaSetValues(vimShell, XmNiconPixmap, icon, XmNiconMask, icon_mask, NULL); -# endif #endif } @@ -1578,16 +1546,6 @@ gui_mch_open(void) gui_x11_send_event_handler, NULL); #endif - -#if defined(FEAT_MENU) && defined(FEAT_GUI_ATHENA) - // The Athena GUI needs this again after opening the window - gui_position_menu(); -# ifdef FEAT_TOOLBAR - gui_mch_set_toolbar_pos(0, gui.menu_height, gui.menu_width, - gui.toolbar_height); -# endif -#endif - // Get the colors for the highlight groups (gui_check_colors() might have // changed them) highlight_gui_started(); // re-init colors and fonts @@ -2154,22 +2112,6 @@ fontset_height( return extents->max_logical_extent.height; } -#if (defined(FONTSET_ALWAYS) && defined(FEAT_GUI_ATHENA) \ - && defined(FEAT_MENU)) || defined(PROTO) -/* - * Returns the bounding box height around the actual glyph image of all - * characters in all fonts of the fontset. - */ - int -fontset_height2(XFontSet fs) -{ - XFontSetExtents *extents; - - extents = XExtentsOfFontSet(fs); - return extents->max_ink_extent.height; -} -#endif - #if 0 // NOT USED YET static int
--- a/src/if_mzsch.c +++ b/src/if_mzsch.c @@ -809,7 +809,7 @@ static UINT timer_id = 0; #elif defined(FEAT_GUI_GTK) static gboolean timer_proc(gpointer); static guint timer_id = 0; -#elif defined(FEAT_GUI_MOTIF) || defined(FEAT_GUI_ATHENA) +#elif defined(FEAT_GUI_MOTIF) static void timer_proc(XtPointer, XtIntervalId *); static XtIntervalId timer_id = (XtIntervalId)0; #endif @@ -845,7 +845,7 @@ timer_proc(HWND hwnd UNUSED, UINT uMsg U # elif defined(FEAT_GUI_GTK) static gboolean timer_proc(gpointer data UNUSED) -# elif defined(FEAT_GUI_MOTIF) || defined(FEAT_GUI_ATHENA) +# elif defined(FEAT_GUI_MOTIF) static void timer_proc(XtPointer timed_out UNUSED, XtIntervalId *interval_id UNUSED) # endif @@ -853,7 +853,7 @@ timer_proc(XtPointer timed_out UNUSED, X scheme_check_threads(); # if defined(FEAT_GUI_GTK) return TRUE; // continue receiving notifications -# elif defined(FEAT_GUI_MOTIF) || defined(FEAT_GUI_ATHENA) +# elif defined(FEAT_GUI_MOTIF) // renew timeout if (mz_threads_allow && p_mzq > 0) timer_id = XtAppAddTimeOut(app_context, p_mzq, @@ -868,7 +868,7 @@ setup_timer(void) timer_id = SetTimer(NULL, 0, p_mzq, timer_proc); # elif defined(FEAT_GUI_GTK) timer_id = g_timeout_add((guint)p_mzq, (GSourceFunc)timer_proc, NULL); -# elif defined(FEAT_GUI_MOTIF) || defined(FEAT_GUI_ATHENA) +# elif defined(FEAT_GUI_MOTIF) timer_id = XtAppAddTimeOut(app_context, p_mzq, timer_proc, NULL); # endif } @@ -880,7 +880,7 @@ remove_timer(void) KillTimer(NULL, timer_id); # elif defined(FEAT_GUI_GTK) g_source_remove(timer_id); -# elif defined(FEAT_GUI_MOTIF) || defined(FEAT_GUI_ATHENA) +# elif defined(FEAT_GUI_MOTIF) XtRemoveTimeOut(timer_id); # endif timer_id = 0;
--- a/src/main.c +++ b/src/main.c @@ -3541,14 +3541,6 @@ usage(void) #ifdef FEAT_GUI_X11 # ifdef FEAT_GUI_MOTIF mch_msg(_("\nArguments recognised by gvim (Motif version):\n")); -# else -# ifdef FEAT_GUI_ATHENA -# ifdef FEAT_GUI_NEXTAW - mch_msg(_("\nArguments recognised by gvim (neXtaw version):\n")); -# else - mch_msg(_("\nArguments recognised by gvim (Athena version):\n")); -# endif -# endif # endif main_msg(_("-display <display>\tRun Vim on <display>")); main_msg(_("-iconic\t\tStart Vim iconified")); @@ -3560,9 +3552,6 @@ usage(void) main_msg(_("-geometry <geom>\tUse <geom> for initial geometry (also: -geom)")); main_msg(_("-borderwidth <width>\tUse a border width of <width> (also: -bw)")); main_msg(_("-scrollbarwidth <width> Use a scrollbar width of <width> (also: -sw)")); -# ifdef FEAT_GUI_ATHENA - main_msg(_("-menuheight <height>\tUse a menu bar height of <height> (also: -mh)")); -# endif main_msg(_("-reverse\t\tUse reverse video (also: -rv)")); main_msg(_("+reverse\t\tDon't use reverse video (also: +rv)")); main_msg(_("-xrm <resource>\tSet the specified resource"));
--- a/src/menu.c +++ b/src/menu.c @@ -609,10 +609,6 @@ add_menu_path( #ifdef FEAT_BEVAL_TIP menu->tip = NULL; #endif -#ifdef FEAT_GUI_ATHENA - menu->image = None; // X-Windows definition for NULL -#endif - /* * Add after menu that has lower priority. */ @@ -2072,10 +2068,7 @@ gui_update_menus_recurse(vimmenu_T *menu grey = FALSE; else grey = TRUE; -# ifdef FEAT_GUI_ATHENA - // Hiding menus doesn't work for Athena, it can cause a crash. - gui_mch_menu_grey(menu, grey); -# else + // Never hide a toplevel menu, it may make the menubar resize or // disappear. Same problem for ToolBar items. if (vim_strchr(p_go, GO_GREY) != NULL || menu->parent == NULL @@ -2086,7 +2079,6 @@ gui_update_menus_recurse(vimmenu_T *menu gui_mch_menu_grey(menu, grey); else gui_mch_menu_hidden(menu, grey); -# endif gui_update_menus_recurse(menu->children, mode); menu = menu->next; }
--- a/src/mouse.c +++ b/src/mouse.c @@ -115,7 +115,7 @@ find_end_of_word(pos_T *pos) } #if defined(FEAT_GUI_MOTIF) || defined(FEAT_GUI_GTK) \ - || defined(FEAT_GUI_ATHENA) || defined(FEAT_GUI_MSWIN) \ + || defined(FEAT_GUI_MSWIN) \ || defined(FEAT_GUI_PHOTON) \ || defined(FEAT_TERM_POPUP_MENU) # define USE_POPUP_SETPOS @@ -539,7 +539,7 @@ do_mouse( // menu on the button down event. return FALSE; # endif -# if defined(FEAT_GUI_ATHENA) || defined(FEAT_GUI_MSWIN) || defined(FEAT_GUI_HAIKU) +# if defined(FEAT_GUI_MSWIN) || defined(FEAT_GUI_HAIKU) if (is_click || is_drag) // Ignore right button down and drag mouse events. Windows // only shows the popup menu on the button up event.
--- a/src/proto.h +++ b/src/proto.h @@ -293,12 +293,6 @@ extern char_u *vimpty_getenv(const char_ # include "gui_motif.pro" # include "gui_xmdlg.pro" # endif -# ifdef FEAT_GUI_ATHENA -# include "gui_athena.pro" -# ifdef FEAT_BROWSE -extern char *vim_SelFile(Widget toplevel, char *prompt, char *init_path, int (*show_entry)(), int x, int y, guicolor_T fg, guicolor_T bg, guicolor_T scroll_fg, guicolor_T scroll_bg); -# endif -# endif # ifdef FEAT_GUI_HAIKU # include "gui_haiku.pro" # endif
deleted file mode 100644 --- a/src/proto/gui_athena.pro +++ /dev/null @@ -1,33 +0,0 @@ -/* gui_athena.c */ -void gui_x11_create_widgets(void); -void gui_x11_destroy_widgets(void); -void gui_mch_set_toolbar_pos(int x, int y, int w, int h); -void gui_mch_set_text_area_pos(int x, int y, int w, int h); -void gui_x11_set_back_color(void); -void gui_mch_enable_menu(int flag); -void gui_mch_set_menu_pos(int x, int y, int w, int h); -void gui_mch_add_menu(vimmenu_T *menu, int idx); -void gui_mch_new_menu_font(void); -void gui_mch_new_tooltip_font(void); -void gui_mch_new_tooltip_colors(void); -void gui_mch_add_menu_item(vimmenu_T *menu, int idx); -void gui_mch_show_toolbar(int showit); -int gui_mch_compute_toolbar_height(void); -void gui_mch_get_toolbar_colors(Pixel *bgp, Pixel *fgp, Pixel *bsp, Pixel *tsp, Pixel *hsp); -void gui_mch_toggle_tearoffs(int enable); -void gui_mch_new_menu_colors(void); -void gui_mch_destroy_menu(vimmenu_T *menu); -void gui_mch_show_popupmenu(vimmenu_T *menu); -void gui_mch_def_colors(void); -void gui_mch_set_scrollbar_thumb(scrollbar_T *sb, long val, long size, long max); -void gui_mch_set_scrollbar_pos(scrollbar_T *sb, int x, int y, int w, int h); -int gui_mch_get_scrollbar_xpadding(void); -int gui_mch_get_scrollbar_ypadding(void); -void gui_mch_enable_scrollbar(scrollbar_T *sb, int flag); -void gui_mch_create_scrollbar(scrollbar_T *sb, int orient); -void gui_mch_destroy_scrollbar(scrollbar_T *sb); -void gui_mch_set_scrollbar_colors(scrollbar_T *sb); -Window gui_x11_get_wid(void); -char_u *gui_mch_browse(int saving, char_u *title, char_u *dflt, char_u *ext, char_u *initdir, char_u *filter); -int gui_mch_dialog(int type, char_u *title, char_u *message, char_u *buttons, int dfltbutton, char_u *textfield, int ex_cmd); -/* vim: set ft=c : */
--- a/src/structs.h +++ b/src/structs.h @@ -4003,9 +4003,6 @@ struct VimMenu char **xpm; // pixmap data char *xpm_fname; // file with pixmap data #endif -#ifdef FEAT_GUI_ATHENA - Pixmap image; // Toolbar image -#endif #ifdef FEAT_BEVAL_TIP BalloonEval *tip; // tooltip for this menu item #endif
--- a/src/testdir/gui_init.vim +++ b/src/testdir/gui_init.vim @@ -1,6 +1,6 @@ " gvimrc for test_gui_init.vim -if has('gui_athena') || has('gui_motif') || has('gui_gtk2') || has('gui_gtk3') +if has('gui_motif') || has('gui_gtk2') || has('gui_gtk3') set guiheadroom=0 set guioptions+=p endif
--- a/src/testdir/setup_gui.vim +++ b/src/testdir/setup_gui.vim @@ -1,6 +1,6 @@ " Common preparations for running GUI tests. -let g:x11_based_gui = has('gui_athena') || has('gui_motif') +let g:x11_based_gui = has('gui_motif') \ || has('gui_gtk2') || has('gui_gnome') || has('gui_gtk3') " Reasons for 'skipped'.
--- a/src/testdir/test_clientserver.vim +++ b/src/testdir/test_clientserver.vim @@ -63,8 +63,8 @@ func Test_client_server() " the GUI and check that the remote command still works. " Need to wait for the GUI to start up, otherwise the send hangs in trying " to send to the terminal window. - if has('gui_athena') || has('gui_motif') - " For those GUIs, ignore the 'failed to create input context' error. + if has('gui_motif') + " For this GUI ignore the 'failed to create input context' error. call remote_send(name, ":call test_ignore_error('E285') | gui -f\<CR>") else call remote_send(name, ":gui -f\<CR>")
--- a/src/testdir/test_edit.vim +++ b/src/testdir/test_edit.vim @@ -2094,7 +2094,7 @@ endfunc func Test_edit_CTRL_hat() CheckFeature xim - " FIXME: test fails with Athena and Motif GUI. + " FIXME: test fails with Motif GUI. " test also fails when running in the GUI. CheckFeature gui_gtk CheckNotGui
--- a/src/testdir/test_gui.vim +++ b/src/testdir/test_gui.vim @@ -63,7 +63,7 @@ endfunc func Test_getfontname_with_arg() CheckX11BasedGui - if has('gui_athena') || has('gui_motif') + if has('gui_motif') " Invalid font name. The result should be an empty string. call assert_equal('', getfontname('notexist')) @@ -90,7 +90,7 @@ func Test_getfontname_without_arg() if has('gui_kde') " 'expected' is the value specified by SetUp() above. call assert_equal('Courier 10 Pitch/8/-1/5/50/0/0/0/0/0', fname) - elseif has('gui_athena') || has('gui_motif') + elseif has('gui_motif') " 'expected' is DFLT_FONT of gui_x11.c or its real name. let pat = '\(7x13\)\|\(\c-Misc-Fixed-Medium-R-Normal--13-120-75-75-C-70-ISO8859-1\)' call assert_match(pat, fname) @@ -376,7 +376,7 @@ func Test_set_guifont() set guifontset= endif - if has('gui_athena') || has('gui_motif') + if has('gui_motif') " Non-empty font list with invalid font names. " " This test is twofold: (1) It checks if the command fails as expected @@ -514,7 +514,7 @@ func Test_set_guifontwide() let &guifontwide = guifontwide_saved let &guifont = guifont_saved - elseif has('gui_athena') || has('gui_motif') + elseif has('gui_motif') " guifontwide is premised upon the xfontset feature. if !has('xfontset') let skipped = g:not_supported . 'xfontset' @@ -1280,8 +1280,6 @@ func TestGuiTabToolTip() endfunc func Test_gui_tablabel_tooltip() - CheckNotFeature gui_athena - %bw! " Removing the tabline at the end of this test, reduces the window height by " one. Save and restore it after the test. @@ -1436,10 +1434,6 @@ endfunc " Test for generating a GUI tabline event to select a tab page func Test_gui_tabline_event() - if has('gui_athena') - throw 'Skipped: tabline is not supported in Athena GUI' - endif - %bw! edit Xfile1 tabedit Xfile2 @@ -1467,9 +1461,6 @@ endfunc " Test for generating a GUI tabline menu event to execute an action func Test_gui_tabmenu_event() - if has('gui_athena') - throw 'Skipped: tabmenu is not supported in Athena GUI' - endif %bw! " Try to close the last tab page
--- a/src/testdir/test_highlight.vim +++ b/src/testdir/test_highlight.vim @@ -759,7 +759,7 @@ func Test_1_highlight_Normalgroup_exists elseif has('gui_gtk2') || has('gui_gnome') || has('gui_gtk3') " expect is DEFAULT_FONT of gui_gtk_x11.c call assert_match('hi Normal\s*font=Monospace 10', hlNormal) - elseif has('gui_motif') || has('gui_athena') + elseif has('gui_motif') " expect is DEFAULT_FONT of gui_x11.c call assert_match('hi Normal\s*font=7x13', hlNormal) elseif has('win32')
--- a/src/testdir/test_quotestar.vim +++ b/src/testdir/test_quotestar.vim @@ -98,7 +98,7 @@ func Do_test_quotestar_for_x11() " Running in a terminal and the GUI is available: Tell the server to open " the GUI and check that the remote command still works. - if has('gui_athena') || has('gui_motif') + if has('gui_motif') " For those GUIs, ignore the 'failed to create input context' error. call remote_send(name, ":call test_ignore_error('E285') | gui -f\<CR>") else
--- a/src/testdir/test_startup.vim +++ b/src/testdir/test_startup.vim @@ -441,7 +441,7 @@ endfunction " Test the -reverse and +reverse arguments (for GUI only). func Test_reverse() CheckCanRunGui - CheckAnyOf Feature:gui_gtk Feature:gui_motif Feature:gui_athena + CheckAnyOf Feature:gui_gtk Feature:gui_motif let after =<< trim [CODE] call writefile([&background], "Xtest_reverse") @@ -462,7 +462,7 @@ endfunc " Test the -background and -foreground arguments (for GUI only). func Test_background_foreground() CheckCanRunGui - CheckAnyOf Feature:gui_gtk Feature:gui_motif Feature:gui_athena + CheckAnyOf Feature:gui_gtk Feature:gui_motif " Is there a better way to check the effect of -background & -foreground " other than merely looking at &background (dark or light)? @@ -489,7 +489,7 @@ func Test_font() if has('gui_gtk') let font = 'Courier 14' - elseif has('gui_motif') || has('gui_athena') + elseif has('gui_motif') let font = '-misc-fixed-bold-*' else throw 'Skipped: test does not set a valid font for this GUI' @@ -511,10 +511,10 @@ endfunc " Test the -geometry argument (for GUI only). func Test_geometry() CheckCanRunGui - CheckAnyOf Feature:gui_gtk Feature:gui_motif Feature:gui_athena + CheckAnyOf Feature:gui_gtk Feature:gui_motif - if has('gui_motif') || has('gui_athena') - " FIXME: With GUI Athena or Motif, the value of getwinposx(), + if has('gui_motif') + " FIXME: With GUI Motif the value of getwinposx(), " getwinposy() and getwinpos() do not match exactly the " value given in -geometry. Why? " So only check &columns and &lines for those GUIs. @@ -550,7 +550,7 @@ endfunc " Test the -iconic argument (for GUI only). func Test_iconic() CheckCanRunGui - CheckAnyOf Feature:gui_gtk Feature:gui_motif Feature:gui_athena + CheckAnyOf Feature:gui_gtk Feature:gui_motif call RunVim([], [], '-f -g -iconic -cq')
--- a/src/version.c +++ b/src/version.c @@ -751,6 +751,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 4677, +/**/ 4676, /**/ 4675, @@ -10454,22 +10456,14 @@ list_version(void) # ifdef FEAT_GUI_MOTIF msg_puts(_("with X11-Motif GUI.")); # else -# ifdef FEAT_GUI_ATHENA -# ifdef FEAT_GUI_NEXTAW - msg_puts(_("with X11-neXtaw GUI.")); -# else - msg_puts(_("with X11-Athena GUI.")); -# endif +# ifdef FEAT_GUI_HAIKU + msg_puts(_("with Haiku GUI.")); # else -# ifdef FEAT_GUI_HAIKU - msg_puts(_("with Haiku GUI.")); -# else -# ifdef FEAT_GUI_PHOTON +# ifdef FEAT_GUI_PHOTON msg_puts(_("with Photon GUI.")); -# else -# if defined(MSWIN) +# else +# if defined(MSWIN) msg_puts(_("with GUI.")); -# endif # endif # endif # endif
--- a/src/vim.h +++ b/src/vim.h @@ -116,7 +116,6 @@ #if defined(FEAT_GUI_MOTIF) \ || defined(FEAT_GUI_GTK) \ - || defined(FEAT_GUI_ATHENA) \ || defined(FEAT_GUI_HAIKU) \ || defined(FEAT_GUI_MSWIN) \ || defined(FEAT_GUI_PHOTON) @@ -190,9 +189,6 @@ # ifdef FEAT_GUI_MOTIF # undef FEAT_GUI_MOTIF # endif -# ifdef FEAT_GUI_ATHENA -# undef FEAT_GUI_ATHENA -# endif # ifdef FEAT_GUI_GTK # undef FEAT_GUI_GTK # endif