Merge trunk changes.
git-svn-id: https://geany.svn.sourceforge.net/svnroot/geany/branches/custom-filetypes@4142 ea778897-0a13-0410-b9d1-a72fbfd435f5
This commit is contained in:
commit
89a708bd11
25
HACKING
25
HACKING
@ -72,7 +72,7 @@ the existing elements stay in place - this will keep the ABI stable.
|
|||||||
|
|
||||||
.. warning::
|
.. warning::
|
||||||
|
|
||||||
Some structs like GeanyKeyGroup and GeanyCallback cannot be
|
Some structs like GeanyKeyGroupInfo and GeanyCallback cannot be
|
||||||
appended to without breaking the ABI because they are used to declare
|
appended to without breaking the ABI because they are used to declare
|
||||||
structs by plugins, not just for accessing struct members through
|
structs by plugins, not just for accessing struct members through
|
||||||
a pointer.
|
a pointer.
|
||||||
@ -82,7 +82,7 @@ even the API can change. An ABI change just means that all plugins will
|
|||||||
not load and they must be rebuilt. An API change means that some plugins
|
not load and they must be rebuilt. An API change means that some plugins
|
||||||
might not build correctly.
|
might not build correctly.
|
||||||
|
|
||||||
When reordering or changing existing elements of structs that are
|
If you're reordering or changing existing elements of structs that are
|
||||||
used as part of the plugin API, you should increment GEANY_ABI_VERSION
|
used as part of the plugin API, you should increment GEANY_ABI_VERSION
|
||||||
in plugindata.h. This is usually not needed if you're just appending
|
in plugindata.h. This is usually not needed if you're just appending
|
||||||
fields to structs. The GEANY_API_VERSION value should be incremented
|
fields to structs. The GEANY_API_VERSION value should be incremented
|
||||||
@ -90,6 +90,15 @@ for any changes to the plugin API, including appending elements.
|
|||||||
|
|
||||||
If you're in any doubt when making changes to plugin API code, just ask us.
|
If you're in any doubt when making changes to plugin API code, just ask us.
|
||||||
|
|
||||||
|
Plugin API/ABI design
|
||||||
|
---------------------
|
||||||
|
You should not make plugins rely on the size of a struct. This means:
|
||||||
|
|
||||||
|
* Don't let plugins allocate any structs (stack or heap).
|
||||||
|
* Don't let plugins index any arrays of structs.
|
||||||
|
* Don't add any array fields to structs in case we want to change the
|
||||||
|
array size later.
|
||||||
|
|
||||||
Glade
|
Glade
|
||||||
-----
|
-----
|
||||||
Use the code generation features of Glade instead of editing interface.c
|
Use the code generation features of Glade instead of editing interface.c
|
||||||
@ -192,17 +201,7 @@ check to see if those features have been written in other projects first.
|
|||||||
* Add GEANY_FILETYPES_FOO to filetypes.h.
|
* Add GEANY_FILETYPES_FOO to filetypes.h.
|
||||||
* Initialize GEANY_FILETYPES_FOO in init_builtin_filetypes() of
|
* Initialize GEANY_FILETYPES_FOO in init_builtin_filetypes() of
|
||||||
filetypes.c.
|
filetypes.c.
|
||||||
* Rebuild Geany.
|
* Update data/filetype_extensions.conf.
|
||||||
* From your geany/ directory, run::
|
|
||||||
|
|
||||||
src/geany --generate-data-files
|
|
||||||
|
|
||||||
(The src/ prefix may be different, depending on where the binary is
|
|
||||||
generated.)
|
|
||||||
This will update data/filetype_extensions.conf. Note that
|
|
||||||
you need GEANY_DEBUG to be defined when building Geany for the
|
|
||||||
--generate-data-files argument to work - this is always defined in the
|
|
||||||
SVN version. Alternatively, edit the file by hand.
|
|
||||||
|
|
||||||
filetypes.* configuration file
|
filetypes.* configuration file
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
97
NEWS
97
NEWS
@ -1,3 +1,96 @@
|
|||||||
|
Geany 0.18 (August 16, 2009)
|
||||||
|
|
||||||
|
General:
|
||||||
|
* Fix scrolling horizontally after finding a search match with the
|
||||||
|
search bar or Find Next/Previous which is off-screen.
|
||||||
|
* Remove relative/untidy path elements from filenames when opening
|
||||||
|
documents (#2823998).
|
||||||
|
* Create initial template files with proper platform-specific line
|
||||||
|
ending characters.
|
||||||
|
* Improve inserting of comment templates like File header or licence
|
||||||
|
notices.
|
||||||
|
|
||||||
|
Interface:
|
||||||
|
* Add 'Show Paths' documents list popup item.
|
||||||
|
* Add filetypes.common to 'Configuration Files' menu.
|
||||||
|
* Implement a graphical toolbar editor.
|
||||||
|
* Add 'Build' toolbar button to the default layout.
|
||||||
|
* Add 'Replace' toolbar button (closes #2798225).
|
||||||
|
* Use a more Tango like icon for 'Save All' (by Jesse Mayes, thanks).
|
||||||
|
* Add a popup menu for the keybinding list in the preferences dialog
|
||||||
|
to easily expand and collapse all groups.
|
||||||
|
|
||||||
|
Keybindings:
|
||||||
|
* Implement Most-Recently-Used document switching when pressing
|
||||||
|
'Switch to last used document' keybinding (Ctrl-Tab).
|
||||||
|
* Add 'Mark All' keybinding (Ctrl-Shift-M).
|
||||||
|
* Add 'Reflow lines/block' keybinding, (Ctrl-J; thanks to
|
||||||
|
Eugene Arshinov).
|
||||||
|
* Make the Scintilla keybindings 'Delete to end of line' and
|
||||||
|
'Go to end of display line' configurable.
|
||||||
|
* Switching notebook tabs now works for the currently used notebook
|
||||||
|
widget instead of always using the documents notebook.
|
||||||
|
|
||||||
|
Editor:
|
||||||
|
* Fix a redraw when documents were first drawn uncolourised.
|
||||||
|
* Delay highlighting matching braces by 100ms to speed up scrolling
|
||||||
|
with the arrow keys.
|
||||||
|
* Support 'tab indents, space aligns' style when indenting (#2789109).
|
||||||
|
* Add 'Autocomplete all words in document' pref; also used when forcing
|
||||||
|
autocompletion and there's no symbol names to show.
|
||||||
|
* Add 'Drop rest of word on completion' pref.
|
||||||
|
* Update Scintilla to version 1.79.
|
||||||
|
* Improve displaying and reshowing of calltips.
|
||||||
|
|
||||||
|
Syntax highlighting:
|
||||||
|
* Reload color schemes via Tools menu (thanks to Eugene Arshinov).
|
||||||
|
* Implement named styles support for filetypes.* using a
|
||||||
|
filetypes.common [named_styles] section; used as
|
||||||
|
"style=named_style,bold". (See the manual for details).
|
||||||
|
* Allow style definitions with missing fields to use the
|
||||||
|
filetypes.common default style's fields.
|
||||||
|
* Make C-like filetype styles use named styles & default background
|
||||||
|
color. (Anyone who wants to likewise update any other filetype's
|
||||||
|
styles, please let us know ;-)).
|
||||||
|
* Allow indentation of wrapped lines (see style 'line_wrap_indent').
|
||||||
|
* Add new styles 'line_height' and 'marker_mark'.
|
||||||
|
|
||||||
|
Filetypes:
|
||||||
|
* Add Markdown filetype (thanks to Jon Strait).
|
||||||
|
* Highlight D WYSIWYG backtick `strings` and r"strings" (#1895745).
|
||||||
|
* Minor improvements for filetypes: Fortran, Haxe, HTML, Lua,
|
||||||
|
Matlab, Pascal, Python, Tcl.
|
||||||
|
|
||||||
|
Tags:
|
||||||
|
* Read custom system global tags files from $prefix/share/geany/tags
|
||||||
|
(#2778923).
|
||||||
|
* Autocomplete scoped fields like struct members when typing '.' (and
|
||||||
|
also '->' or '::' in C/C++) if the language's tag parser supports it.
|
||||||
|
* Save field tags for C/C++ when generating a global tags file (you may
|
||||||
|
want to regenerate your tag files).
|
||||||
|
* Parse Python calltips.
|
||||||
|
* Show relative paths in Diff filename tags.
|
||||||
|
* Group reStructuredText symbol list items by scope level.
|
||||||
|
|
||||||
|
Plugin API:
|
||||||
|
* Add geanyplugin.h single include.
|
||||||
|
* Add plugin_signal_connect() for connecting plugin signals at
|
||||||
|
runtime and also for connecting to any GObject signal.
|
||||||
|
* Add documents_foreach(), filetypes[], documents[], utils_strdupa()
|
||||||
|
and various foreach_type() macros.
|
||||||
|
* Make GeanyDocument::file_type always be non-NULL.
|
||||||
|
|
||||||
|
Windows:
|
||||||
|
* Fix quoting the build command string on Windows (closes #2791769).
|
||||||
|
* Fix LaTeX view commands on Windows (part of #2807688).
|
||||||
|
* Expand system environment variables (%variableName%) on Windows when
|
||||||
|
running Build commands.
|
||||||
|
|
||||||
|
Internationalisation:
|
||||||
|
* Added translations: lb, sl, pt_PT
|
||||||
|
* Updated translations: ca, cs, de, en_GB, fi, fr, ja, pt_BR, ru, tr
|
||||||
|
|
||||||
|
|
||||||
Geany 0.17 (May 02, 2009)
|
Geany 0.17 (May 02, 2009)
|
||||||
|
|
||||||
Bug fixes:
|
Bug fixes:
|
||||||
@ -299,7 +392,7 @@ Geany 0.14 (April 19, 2008)
|
|||||||
* Add translucency settings to filetypes.common for semi-transparency.
|
* Add translucency settings to filetypes.common for semi-transparency.
|
||||||
* Add HTML parser to get h1, h2, h3 symbols as well as link anchors and
|
* Add HTML parser to get h1, h2, h3 symbols as well as link anchors and
|
||||||
JavaScript functions (fixes #1896068).
|
JavaScript functions (fixes #1896068).
|
||||||
* Update Javascript, TCL and Assembler parser.
|
* Update Javascript, Tcl and Assembler parser.
|
||||||
|
|
||||||
Interface:
|
Interface:
|
||||||
* When closing a tab when using left-to-right tabs, focus the next
|
* When closing a tab when using left-to-right tabs, focus the next
|
||||||
@ -613,7 +706,7 @@ Geany 0.11 (May 21, 2007)
|
|||||||
Tab.
|
Tab.
|
||||||
* Add MimeType associatiations for: C++ header, Pascal, Perl,
|
* Add MimeType associatiations for: C++ header, Pascal, Perl,
|
||||||
Python, httpd-PHP and XML files (thanks to Iñaki Rodriguez).
|
Python, httpd-PHP and XML files (thanks to Iñaki Rodriguez).
|
||||||
* Add brace indenting support for Perl and TCL.
|
* Add brace indenting support for Perl and Tcl.
|
||||||
* Make backspace unindent when using spaces for indentation.
|
* Make backspace unindent when using spaces for indentation.
|
||||||
* Wrap notebook pages when switching tabs.
|
* Wrap notebook pages when switching tabs.
|
||||||
* Speed up loading multiple C-like files slightly.
|
* Speed up loading multiple C-like files slightly.
|
||||||
|
@ -2,7 +2,7 @@ dnl Process this file with autoconf to produce a configure script.
|
|||||||
dnl $Id$
|
dnl $Id$
|
||||||
|
|
||||||
AC_INIT(configure.in)
|
AC_INIT(configure.in)
|
||||||
AM_INIT_AUTOMAKE(geany, 0.18)
|
AM_INIT_AUTOMAKE(geany, 0.19)
|
||||||
|
|
||||||
AM_CONFIG_HEADER(config.h)
|
AM_CONFIG_HEADER(config.h)
|
||||||
|
|
||||||
|
@ -1,13 +1,11 @@
|
|||||||
#*** This file generated by: geany --generate-data-files ***
|
# Filetype extension configuration file for Geany
|
||||||
|
# Insert as many items as you want, seperate them with a ";".
|
||||||
#Filetype extension configuration file for Geany
|
# See Geany's main documentation for details.
|
||||||
#Insert as many items as you want, seperate them with a ";".
|
|
||||||
#See Geany's main documentation for details.
|
|
||||||
[Extensions]
|
[Extensions]
|
||||||
ASM=*.asm;
|
ASM=*.asm;
|
||||||
Ada=*.adb;*.ads;
|
Ada=*.adb;*.ads;
|
||||||
C=*.c;*.h;
|
C=*.c;*.h;
|
||||||
C++=*.cpp;*.cxx;*.c++;*.cc;*.h;*.hpp;*.hxx;*.h++;*.hh;*.C;
|
C++=*.cpp;*.cxx;*.c++;*.cc;*.h;*.hpp;*.hxx;*.h++;*.hh;*.C;*.H;
|
||||||
C#=*.cs;
|
C#=*.cs;
|
||||||
CAML=*.ml;*.mli;
|
CAML=*.ml;*.mli;
|
||||||
D=*.d;*.di;
|
D=*.d;*.di;
|
||||||
|
@ -43,3 +43,17 @@ compiler=latex --file-line-error-style "%f"
|
|||||||
linker=pdflatex --file-line-error-style "%f"
|
linker=pdflatex --file-line-error-style "%f"
|
||||||
run_cmd=xdvi "%f"
|
run_cmd=xdvi "%f"
|
||||||
run_cmd2=xpdf "%f"
|
run_cmd2=xpdf "%f"
|
||||||
|
|
||||||
|
[build-menu]
|
||||||
|
FT_00_LB=LaTeX -> _DVI
|
||||||
|
FT_00_CM=latex --file-line-error-style "%f"
|
||||||
|
FT_00_BD=false
|
||||||
|
FT_01_LB=LaTeX -> _PDF
|
||||||
|
FT_01_CM=pdflatex --file-line-error-style "%f"
|
||||||
|
FT_01_BD=false
|
||||||
|
EX_00_LB=V_iew PDF File
|
||||||
|
EX_00_CM=xpdf "%f"
|
||||||
|
EX_00_BD=false
|
||||||
|
EX_01_LB=_View DVI File
|
||||||
|
EX_01_CM=xdvi "%f"
|
||||||
|
EX_01_BD=false
|
||||||
|
26
data/filetypes.markdown
Normal file
26
data/filetypes.markdown
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
# For complete documentation of this file, please see Geany's main documentation
|
||||||
|
[styling]
|
||||||
|
# foreground;background;bold;italic
|
||||||
|
# default=0x000000;0xffffff;false;false
|
||||||
|
# strong=0xff0000;0xffffff;false;false
|
||||||
|
# emphasis=0xff0000;0xffffff;false;false
|
||||||
|
# header1=0x0000bb;0xffffff;false;false
|
||||||
|
# header2=0x0000bb;0xffffff;false;false
|
||||||
|
# header3=0x0000bb;0xffffff;false;false
|
||||||
|
# header4=0x0000bb;0xffffff;false;false
|
||||||
|
# header5=0x0000bb;0xffffff;false;false
|
||||||
|
# header6=0x0000bb;0xffffff;false;false
|
||||||
|
# ulist_item=0x007f00;0xffffff;false;false
|
||||||
|
# olist_item=0x007f00;0xffffff;false;false
|
||||||
|
# blockquote=0xff0000;0xffffff;false;false
|
||||||
|
# strikeout=0xaa00ff;0xffffff;false;false
|
||||||
|
# hrule=0xff901e;0xffffff;false;false
|
||||||
|
# link=0x0000ff;0xffffff;false;false
|
||||||
|
# code=0x009f00;0xffffff;false;false
|
||||||
|
# codebk=0x005f00;0xffffff;false;false
|
||||||
|
|
||||||
|
[settings]
|
||||||
|
# default extension used when saving files
|
||||||
|
extension=mdml
|
||||||
|
|
||||||
|
|
@ -94,7 +94,8 @@ WARN_LOGFILE =
|
|||||||
#---------------------------------------------------------------------------
|
#---------------------------------------------------------------------------
|
||||||
# configuration options related to the input files
|
# configuration options related to the input files
|
||||||
#---------------------------------------------------------------------------
|
#---------------------------------------------------------------------------
|
||||||
INPUT = ../src/ ./ ../plugins/pluginmacros.h ../plugins/geanyplugin.h \
|
INPUT = ../src/ ./ \
|
||||||
|
../plugins/pluginmacros.h ../plugins/geanyplugin.h ../plugins/geanyfunctions.h \
|
||||||
../tagmanager/tm_source_file.c ../tagmanager/include/tm_source_file.h \
|
../tagmanager/tm_source_file.c ../tagmanager/include/tm_source_file.h \
|
||||||
../tagmanager/tm_work_object.c ../tagmanager/include/tm_work_object.h \
|
../tagmanager/tm_work_object.c ../tagmanager/include/tm_work_object.h \
|
||||||
../tagmanager/tm_workspace.c ../tagmanager/include/tm_workspace.h
|
../tagmanager/tm_workspace.c ../tagmanager/include/tm_workspace.h
|
||||||
@ -228,7 +229,7 @@ SEARCH_INCLUDES = NO
|
|||||||
INCLUDE_PATH =
|
INCLUDE_PATH =
|
||||||
INCLUDE_FILE_PATTERNS =
|
INCLUDE_FILE_PATTERNS =
|
||||||
# make G_GNUC_PRINTF a no-op unless doxygen would ignore functions with varargs
|
# make G_GNUC_PRINTF a no-op unless doxygen would ignore functions with varargs
|
||||||
PREDEFINED = "G_GNUC_PRINTF(x,y)=" GEANY_DISABLE_DEPRECATED HAVE_PLUGINS
|
PREDEFINED = "G_GNUC_PRINTF(x,y)=" GEANY_DISABLE_DEPRECATED HAVE_PLUGINS GEANY_FUNCTIONS_H
|
||||||
EXPAND_AS_DEFINED =
|
EXPAND_AS_DEFINED =
|
||||||
SKIP_FUNCTION_MACROS = NO
|
SKIP_FUNCTION_MACROS = NO
|
||||||
#---------------------------------------------------------------------------
|
#---------------------------------------------------------------------------
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
.TH "GEANY" "1" "May 02, 2009" "geany @VERSION@" ""
|
.TH "GEANY" "1" "August 16, 2009" "geany @VERSION@" ""
|
||||||
.SH "NAME"
|
.SH "NAME"
|
||||||
Geany \(em a small and lightweight IDE
|
Geany \(em a small and lightweight IDE
|
||||||
.SH "SYNOPSIS"
|
.SH "SYNOPSIS"
|
||||||
|
1520
doc/geany.html
1520
doc/geany.html
File diff suppressed because it is too large
Load Diff
665
doc/geany.txt
665
doc/geany.txt
@ -1,4 +1,4 @@
|
|||||||
.. |(version)| replace:: 0.18
|
.. |(version)| replace:: 0.19
|
||||||
|
|
||||||
=======
|
=======
|
||||||
Geany
|
Geany
|
||||||
@ -44,10 +44,10 @@ Some basic features of Geany:
|
|||||||
|
|
||||||
* Syntax highlighting
|
* Syntax highlighting
|
||||||
* Code folding
|
* Code folding
|
||||||
* Symbol name autocompletion
|
* Autocompletion of symbols/words
|
||||||
* Construct completion/snippets
|
* Construct completion/snippets
|
||||||
* Auto-closing of XML and HTML tags
|
* Auto-closing of XML and HTML tags
|
||||||
* Call tips
|
* Calltips
|
||||||
* Many supported filetypes including C, Java, PHP, HTML, Python, Perl,
|
* Many supported filetypes including C, Java, PHP, HTML, Python, Perl,
|
||||||
Pascal, and others
|
Pascal, and others
|
||||||
* Symbol lists
|
* Symbol lists
|
||||||
@ -865,6 +865,24 @@ word on completion* preference is set (in `Editor Completions tab in
|
|||||||
preferences dialog`_) then any characters after the cursor that match
|
preferences dialog`_) then any characters after the cursor that match
|
||||||
a symbol or word are deleted.
|
a symbol or word are deleted.
|
||||||
|
|
||||||
|
Scope autocompletion
|
||||||
|
````````````````````
|
||||||
|
E.g.::
|
||||||
|
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
char c;
|
||||||
|
} foo;
|
||||||
|
|
||||||
|
When you type ``foo.`` it will show an autocompletion list with 'i' and
|
||||||
|
'c' symbols.
|
||||||
|
|
||||||
|
It only works for languages that set parent scope names for e.g. struct
|
||||||
|
members. Currently this means C-like languages. The C tag parser only
|
||||||
|
parses global scopes, so this won't work for structs or objects declared
|
||||||
|
in local scope.
|
||||||
|
|
||||||
|
|
||||||
User-definable snippets
|
User-definable snippets
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
@ -1588,10 +1606,6 @@ Show documents list
|
|||||||
change between documents (see `Switching between documents`_) and
|
change between documents (see `Switching between documents`_) and
|
||||||
to perform some common operations such as saving, closing and reloading.
|
to perform some common operations such as saving, closing and reloading.
|
||||||
|
|
||||||
Show full path name in documents list
|
|
||||||
Show the full directory path of the files you are editing in the
|
|
||||||
*Documents* list.
|
|
||||||
|
|
||||||
Fonts
|
Fonts
|
||||||
`````
|
`````
|
||||||
|
|
||||||
@ -1996,9 +2010,6 @@ Tools tab in preferences dialog
|
|||||||
Tool paths
|
Tool paths
|
||||||
``````````
|
``````````
|
||||||
|
|
||||||
Make
|
|
||||||
The location of the make executable.
|
|
||||||
|
|
||||||
Terminal
|
Terminal
|
||||||
The location of your terminal executable.
|
The location of your terminal executable.
|
||||||
|
|
||||||
@ -2158,7 +2169,8 @@ Follow path of the current file
|
|||||||
|
|
||||||
Execute programs in VTE
|
Execute programs in VTE
|
||||||
Execute programs in the virtual terminal instead of using the external
|
Execute programs in the virtual terminal instead of using the external
|
||||||
terminal tool.
|
terminal tool. Note that if you run multiple execute commands at once
|
||||||
|
the output may become mixed together in the VTE.
|
||||||
|
|
||||||
Don't use run script
|
Don't use run script
|
||||||
Don't use the simple run script which is usually used to display
|
Don't use the simple run script which is usually used to display
|
||||||
@ -2173,22 +2185,21 @@ Project Management
|
|||||||
Project Management is optional in Geany. Currently it can be used for:
|
Project Management is optional in Geany. Currently it can be used for:
|
||||||
|
|
||||||
* Storing and opening session files on a project basis.
|
* Storing and opening session files on a project basis.
|
||||||
* Running *Make* from the project's base directory.
|
* Configuring the Build menu on a project basis.
|
||||||
* Setting a custom *Run* command specific to the project.
|
|
||||||
|
|
||||||
A list of session files can be stored and opened with the project
|
A list of session files can be stored and opened with the project
|
||||||
when the *Use project-based session files* preference is enabled,
|
when the *Use project-based session files* preference is enabled,
|
||||||
in the *Project* group of the `Preferences`_ dialog.
|
in the *Project* group of the `Preferences`_ dialog.
|
||||||
|
|
||||||
As long as a project is open, the Make and Run commands will use
|
As long as a project is open, the Build menu will use
|
||||||
the project's settings, instead of the defaults. These will be used
|
the items defined in project's settings, instead of the defaults.
|
||||||
whichever document is currently displayed.
|
See `Build Menu Configuration` for information on configuring the menu.
|
||||||
|
|
||||||
The current project's settings are saved when it is closed, or when
|
The current project's settings are saved when it is closed, or when
|
||||||
Geany is shutdown. When restarting Geany, the previously opened project
|
Geany is shutdown. When restarting Geany, the previously opened project
|
||||||
file that was in use at the end of the last session will be reopened.
|
file that was in use at the end of the last session will be reopened.
|
||||||
|
|
||||||
Below are the commands used to create, modify, open and close projects.
|
The project menu items are detailed below.
|
||||||
|
|
||||||
|
|
||||||
New Project
|
New Project
|
||||||
@ -2210,34 +2221,20 @@ Project Properties
|
|||||||
You can set an optional description for the project, but it is not
|
You can set an optional description for the project, but it is not
|
||||||
used elsewhere by Geany.
|
used elsewhere by Geany.
|
||||||
|
|
||||||
The *Base path* field is used as the directory to run the Make and Make
|
The *Base path* field is used as the directory to run the Build menu commands.
|
||||||
custom commands in. It is also used as working directory for the project
|
The specified path can be an absolute path or it is considered to be
|
||||||
specific *Run command*.
|
relative to the project's file name.
|
||||||
The specified path can be an absolute path or relative to the project's
|
|
||||||
file name.
|
|
||||||
|
|
||||||
|
|
||||||
Make in base path
|
Set Base Path Button
|
||||||
`````````````````
|
````````````````````
|
||||||
|
|
||||||
This setting makes the *Build->Make* command use the project's base
|
This button is a convenience to set the working directory fields
|
||||||
path. Uncheck this if you want to use the current file's directory
|
in the non-filetype Build menu items to %p to use the project base path.
|
||||||
instead.
|
|
||||||
|
|
||||||
|
.. note::
|
||||||
Run command
|
Pressing the 'set' button will overright any working directories
|
||||||
```````````
|
you have configured for the project.
|
||||||
|
|
||||||
The *Run command* overrides the default run command. You can set this
|
|
||||||
to the executable or main script file for the project, and append
|
|
||||||
any command-line arguments.
|
|
||||||
|
|
||||||
The following variables can be used:
|
|
||||||
|
|
||||||
* %f -- complete filename without path
|
|
||||||
* %e -- filename without path and without extension
|
|
||||||
|
|
||||||
See `[build_settings] Section`_ for details.
|
|
||||||
|
|
||||||
|
|
||||||
Open Project
|
Open Project
|
||||||
@ -2260,27 +2257,48 @@ When project session support is enabled, Geany will close the project
|
|||||||
session files and open any previously closed default session files.
|
session files and open any previously closed default session files.
|
||||||
|
|
||||||
|
|
||||||
Build system
|
Build Menu
|
||||||
------------
|
----------
|
||||||
|
After editing code with Geany, the next step is to compile, link, build,
|
||||||
|
interpret, run etc. As Geany supports many languages each with a different
|
||||||
|
approach to such operations, and as there are also many language independant
|
||||||
|
software building systems, Geany does not have a built in build system, nor
|
||||||
|
does it limit which system you can use. Instead the build menu provides
|
||||||
|
a configurable and flexible means of running any external commands.
|
||||||
|
|
||||||
Geany has an integrated build system. Firstly this means that the
|
This section provides a description of the default configuration of the
|
||||||
current source file will be saved before it is processed. This is
|
build menu and then covers how to configure it, and where the defaults fit in.
|
||||||
for convenience so that you don't need to keep saving small changes
|
|
||||||
to the current file before building.
|
|
||||||
|
|
||||||
Secondly the output for Compile, Build and Make actions will be captured
|
Running the commands from within Geany has two benefits:
|
||||||
in the Compiler notebook tab of the messages window. If there are
|
|
||||||
any warnings or errors with line numbers shown in red in the Compiler
|
* the current file is automatically saved before the command is run
|
||||||
output tab, you can click on them and Geany will switch to the relevant
|
* the output is captured in the Compiler notebook tab and parsed for
|
||||||
source file (or open it) and mark the line number so the problem can be
|
warnings or errors
|
||||||
corrected. Geany will also set indicators for warnings or errors with
|
|
||||||
line numbers.
|
Warnings and errors that can be parsed for line numbers will be shown in
|
||||||
|
red in the Compiler tab and you can click on them to switch to the relevant
|
||||||
|
source file (or open it) and mark the line number. Also lines with
|
||||||
|
warnings or errors are marked in the source, see `Indicators`_ below.
|
||||||
|
|
||||||
.. tip::
|
.. tip::
|
||||||
If Geany's default error message parsing does not parse errors for
|
If Geany's default error message parsing does not parse errors for
|
||||||
the tool you're using, you can set a custom regex. See `Filetype
|
the tool you're using, you can set a custom regex in the Build Commands
|
||||||
definition files`_ and the `[build_settings] Section`_.
|
Dialog, see `Build Menu Configuration`
|
||||||
|
|
||||||
|
Indicators
|
||||||
|
^^^^^^^^^^
|
||||||
|
|
||||||
|
Indicators are red squiggly underlines which are used to highlight
|
||||||
|
errors which occurred while compiling the current file. So you can
|
||||||
|
easily see where your code failed to compile. To remove the indicators,
|
||||||
|
just select "Remove all indicators" in the document file menu.
|
||||||
|
|
||||||
|
If you do not like this feature, you can disable it in the preferences
|
||||||
|
dialog.
|
||||||
|
|
||||||
|
|
||||||
|
Default Build Menu Items
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
Depending on the current file's filetype, the Build menu will contain
|
Depending on the current file's filetype, the Build menu will contain
|
||||||
the following items:
|
the following items:
|
||||||
|
|
||||||
@ -2289,26 +2307,29 @@ the following items:
|
|||||||
* Make All
|
* Make All
|
||||||
* Make Custom Target
|
* Make Custom Target
|
||||||
* Make Object
|
* Make Object
|
||||||
|
* Next Error
|
||||||
|
* Previous Error
|
||||||
* Execute
|
* Execute
|
||||||
* Set Includes and Arguments
|
* Set Build Menu Commands
|
||||||
|
|
||||||
|
|
||||||
Compile
|
Compile
|
||||||
^^^^^^^
|
```````
|
||||||
|
|
||||||
The Compile command has different uses for different kinds of files.
|
The Compile command has different uses for different kinds of files.
|
||||||
|
|
||||||
For compilable languages such as C and C++, the Compile command is
|
For compilable languages such as C and C++, the Compile command is
|
||||||
setup to compile the current source file into a binary object file.
|
setup to compile the current source file into a binary object file.
|
||||||
|
|
||||||
Java source files will be compiled to class file bytecode. Interpreted
|
Java source files will be compiled to class file bytecode.
|
||||||
languages such as Perl, Python, Ruby will compile to bytecode if the
|
|
||||||
language supports it, or will run a syntax check, or failing that
|
Interpreted languages such as Perl, Python, Ruby will compile to
|
||||||
will run the file in its language interpreter.
|
bytecode if the language supports it, or will run a syntax check,
|
||||||
|
or if that is not available will run the file in its language interpreter.
|
||||||
|
|
||||||
|
|
||||||
Build
|
Build
|
||||||
^^^^^
|
`````
|
||||||
|
|
||||||
For compilable languages such as C and C++, the Build command will link
|
For compilable languages such as C and C++, the Build command will link
|
||||||
the current source file's equivalent object file into an executable. If
|
the current source file's equivalent object file into an executable. If
|
||||||
@ -2318,62 +2339,70 @@ in one step, producing just the executable binary.
|
|||||||
Interpreted languages do not use the Build command.
|
Interpreted languages do not use the Build command.
|
||||||
|
|
||||||
|
|
||||||
Make all
|
Make
|
||||||
^^^^^^^^
|
````
|
||||||
|
|
||||||
This effectively runs "make all" in the same directory as the
|
This runs "make" in the same directory as the
|
||||||
current file.
|
current file.
|
||||||
|
|
||||||
.. note::
|
|
||||||
For each of the Make commands, The Make tool path must be correctly
|
|
||||||
set in the Tools tab of the Preferences dialog.
|
|
||||||
|
|
||||||
|
|
||||||
Make custom target
|
Make custom target
|
||||||
^^^^^^^^^^^^^^^^^^
|
``````````````````
|
||||||
|
|
||||||
This is similar to running 'Make all' but you will be prompted for
|
This is similar to running 'Make' but you will be prompted for
|
||||||
the make target name to be passed to the Make tool. For example,
|
the make target name to be passed to the Make tool. For example,
|
||||||
typing 'clean' in the dialog prompt will run "make clean".
|
typing 'clean' in the dialog prompt will run "make clean".
|
||||||
|
|
||||||
|
|
||||||
Make object
|
Make object
|
||||||
^^^^^^^^^^^
|
```````````
|
||||||
|
|
||||||
Make object will run "make current_file.o" in the same directory as
|
Make object will run "make current_file.o" in the same directory as
|
||||||
the current file, using its prefix for 'current_file'. It is useful
|
the current file, using the filename for 'current_file'. It is useful
|
||||||
for compiling just the current file without building the whole project.
|
for building just the current file without building the whole project.
|
||||||
|
|
||||||
|
Next Error
|
||||||
|
``````````
|
||||||
|
|
||||||
|
The next error item will move to the next detected error in the file.
|
||||||
|
|
||||||
|
Previous Error
|
||||||
|
``````````````
|
||||||
|
The previous error item will move to the previous detected error in the file.
|
||||||
|
|
||||||
Execute
|
Execute
|
||||||
^^^^^^^
|
```````
|
||||||
|
|
||||||
Execute will run the corresponding executable file, shell script or
|
Execute will run the corresponding executable file, shell script or
|
||||||
interpreted script in a terminal window. Note that the Terminal tool
|
interpreted script in a terminal window. Note that the Terminal tool
|
||||||
path must be correctly set in the Tools tab of the Preferences dialog -
|
path must be correctly set in the Tools tab of the Preferences dialog -
|
||||||
you can use any terminal program that runs a Bourne compatible shell
|
you can use any terminal program that runs a Bourne compatible shell
|
||||||
and accept the "-e" command line argument to start a command.
|
and accept the "-e" command line argument to start a command or can be
|
||||||
|
selected to us the build-in VTE if it is available, see
|
||||||
|
`Virtual terminal emulator widget (VTE)`_.
|
||||||
|
|
||||||
After your program or script has finished executing, you will be
|
After your program or script has finished executing, you will be
|
||||||
prompted to press the return key. This allows you to review any text
|
prompted to press the return key. This allows you to review any text
|
||||||
output from the program before the terminal window is closed.
|
output from the program before the terminal window is closed.
|
||||||
|
|
||||||
|
The execute command output is not parsed for errors.
|
||||||
|
|
||||||
|
|
||||||
Stopping running processes
|
Stopping running processes
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^^
|
``````````````````````````
|
||||||
|
|
||||||
When there is a running program, the Run button in the toolbar
|
When there is a running program, the Execute menu item in the menu and
|
||||||
becomes a stop button and you can stop the current action. This
|
the Run button in the toolbar
|
||||||
|
becomes a stop button and you can stop the current running program. This
|
||||||
works by sending a signal to the process (and its child process(es))
|
works by sending a signal to the process (and its child process(es))
|
||||||
to stop the process. The used signal is SIGQUIT.
|
to stop the process. The signal used is SIGQUIT.
|
||||||
|
|
||||||
Depending on the process you started it might occur that the process
|
Depending on the process you started it is possible that the process
|
||||||
cannot be stopped. This can happen when the process creates more than
|
cannot be stopped. For example this can happen when the process creates
|
||||||
one child process.
|
more than one child process.
|
||||||
|
|
||||||
|
|
||||||
Terminal emulators
|
Terminal emulators
|
||||||
``````````````````
|
******************
|
||||||
|
|
||||||
Xterm is known to work properly. If you are using "Terminal"
|
Xterm is known to work properly. If you are using "Terminal"
|
||||||
(the terminal program of Xfce), you should add the command line
|
(the terminal program of Xfce), you should add the command line
|
||||||
@ -2382,15 +2411,17 @@ stopped. Just add this option in the preferences dialog on the Tools
|
|||||||
tab in the terminal field.
|
tab in the terminal field.
|
||||||
|
|
||||||
|
|
||||||
Set Includes and Arguments
|
Set Build Commands
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^^
|
``````````````````
|
||||||
|
|
||||||
By default the Compile and Build commands invoke the compiler and
|
By default the Compile and Build commands invoke the GCC compiler and
|
||||||
linker with only the basic arguments needed by all programs. Using
|
linker with only the basic arguments needed by all programs. Using
|
||||||
Set Includes and Arguments you can add any include paths and compile
|
Set Build Commands you can add any include paths and compile
|
||||||
flags for the compiler, any library names and paths for the linker,
|
flags for the compiler, any library names and paths for the linker,
|
||||||
and any arguments you want to use when running Execute.
|
and any arguments you want to use when running Execute.
|
||||||
|
|
||||||
|
For details of configuration see `Build Menu Configuration`_ below.
|
||||||
|
|
||||||
.. note::
|
.. note::
|
||||||
If you need complex settings for your build system, or several
|
If you need complex settings for your build system, or several
|
||||||
different settings, then writing a Makefile and using the Make
|
different settings, then writing a Makefile and using the Make
|
||||||
@ -2399,35 +2430,195 @@ and any arguments you want to use when running Execute.
|
|||||||
|
|
||||||
These settings are saved automatically when Geany is shut down.
|
These settings are saved automatically when Geany is shut down.
|
||||||
|
|
||||||
The following variables can be used:
|
Build Menu Configuration
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
* %f -- complete filename without path
|
The build menu has considerable flexibility and configurability, allowing
|
||||||
* %e -- filename without path and without extension
|
both menu labels the commands they execute and the directory they execute
|
||||||
|
in to be configured.
|
||||||
|
|
||||||
See `[build_settings] Section`_ for details.
|
For example, if you change one of the default make commands to run say 'waf'
|
||||||
|
you can also change the label to match.
|
||||||
|
|
||||||
|
Underlines in the labels set mnemonic characters.
|
||||||
|
|
||||||
|
The build menu is divided into four groups of items each with different
|
||||||
|
behaviors:
|
||||||
|
|
||||||
One step compilation
|
* file items - are configurable and depend on the filetype of the current
|
||||||
````````````````````
|
document, put the output in the compiler tab and parse it for errors
|
||||||
|
* non-file items - are configurable and mostly don't depend on the filetype
|
||||||
|
of the current document, put the output in the compiler tab and parse
|
||||||
|
it for errors
|
||||||
|
* execute items - are configurable and intended for executing your
|
||||||
|
program or other long running programs. The output is not parsed for errors
|
||||||
|
and is directed to the terminal selected in preferences.
|
||||||
|
* fixed items - are not configurable because they perform the Geany built in actions,
|
||||||
|
go to the next error, go to the previous error and show the build menu
|
||||||
|
commands dialog
|
||||||
|
|
||||||
If you are using the Build command to compile and link in one step,
|
The maximum numbers of items in each of the configurable groups can be
|
||||||
you will need to set both the compiler arguments and the linker
|
configured when Geany starts using hidden settings(see `Preferences File Format`).
|
||||||
arguments in the linker command setting.
|
Even though the maximum number of items may have been increased, only
|
||||||
|
those menu items that have values configured are shown in the menu.
|
||||||
|
|
||||||
|
The groups of menu items obtain their configuration from four potential
|
||||||
|
sources. The highest pririty source that has the menu item defined will
|
||||||
|
be used. The sources in decreasing priority are:
|
||||||
|
|
||||||
Indicators
|
* a project file if open
|
||||||
^^^^^^^^^^
|
* the user preferences
|
||||||
|
* the system filetype definitions
|
||||||
|
* the defaults
|
||||||
|
|
||||||
Indicators are red squiggly underlines which are used to highlight
|
The detailed relationships between sources and the configurable menu item groups
|
||||||
errors which occurred while compiling the current file. So you can
|
is shown in the following table.
|
||||||
easily see where your code failed to compile. To remove the indicators,
|
|
||||||
just click on "Remove all indicators" in the document file menu.
|
|
||||||
|
|
||||||
If you do not like this feature, you can disable it in the preferences
|
+--------------+---------------------+--------------------------+-------------------+-------------------------------+
|
||||||
dialog.
|
| Group | Project File | Preferences | System Filetype | Defaults |
|
||||||
|
+==============+=====================+==========================+===================+===============================+
|
||||||
|
| Filetype | Loads From: project | Loads From: | Loads From: | None |
|
||||||
|
| | file | filetype.xxx file in | filetype.xxx in | |
|
||||||
|
| | | ~/.config/geany/filedefs | Geany install | |
|
||||||
|
| | Saves To: project | | | |
|
||||||
|
| | file | Saves to: as above, | Saves to: as user | |
|
||||||
|
| | | creating if needed. | preferences left. | |
|
||||||
|
+--------------+---------------------+--------------------------+-------------------+-------------------------------+
|
||||||
|
| Non-Filetype | Loads From: project | Loads From: | Loads From: | 1: |
|
||||||
|
| | file | geany.conf file in | filetype.xxx in | Label: _Make |
|
||||||
|
| | | ~/.config/geany | Geany install | Command: make |
|
||||||
|
| | Saves To: project | | | |
|
||||||
|
| | file | Saves to: as above, | Saves to: as user | 2: |
|
||||||
|
| | | creating if needed. | preferences left. | Label: Make Custom _Target |
|
||||||
|
| | | | | Command: make |
|
||||||
|
| | | | | |
|
||||||
|
| | | | | 3: |
|
||||||
|
| | | | | Label: Make _Object |
|
||||||
|
| | | | | Command: make %e.o |
|
||||||
|
+--------------+---------------------+--------------------------+-------------------+-------------------------------+
|
||||||
|
| Execute | Loads From: project | Loads From: | Loads From: | Label: _Execute Command: ./%e |
|
||||||
|
| | file or else | geany.conf file in | filetype.xxx in | |
|
||||||
|
| | filetype defined in | ~/.config/geany or else | Geany install | |
|
||||||
|
| | project file | filetype.xxx file in | | |
|
||||||
|
| | | ~/.config/geany/filedefs | Saves To: as user | |
|
||||||
|
| | Saves To: | | preferences left | |
|
||||||
|
| | project file | Saves To: | | |
|
||||||
|
| | | geany.conf file in | | |
|
||||||
|
| | | ~/.config/geany | | |
|
||||||
|
+--------------+---------------------+--------------------------+-------------------+-------------------------------+
|
||||||
|
|
||||||
|
The following notes on the table reference cells by coordinate as (group,source):
|
||||||
|
|
||||||
|
* General - for filetype.xxx substitute the appropriate extension for the
|
||||||
|
current document for xxx.
|
||||||
|
|
||||||
|
* System Filetypes - Labels loaded from these sources are locale sensitive
|
||||||
|
and can contain translations.
|
||||||
|
|
||||||
|
* (Filetype, Project File) and (Filetype, Preferences) - preferences use a full
|
||||||
|
filetype file so that users can configure all other filetype preferences
|
||||||
|
as well. Projects can only configure menu items per filetype. Saving
|
||||||
|
in the project file means that there is only one file per project not
|
||||||
|
a whole directory.
|
||||||
|
|
||||||
|
* (Non-Filetype, System Filetype) - although conceptually strange, defining
|
||||||
|
non-filetype commands in a filetype file, this provides the ability to
|
||||||
|
define filetype dependent default menu items.
|
||||||
|
|
||||||
|
* (Execute, Project File) and (Execute, Preferences) - the filetype based execute
|
||||||
|
configuration can only be set by hand editing the appropriate file, see
|
||||||
|
`Preferences File Format` and `Project File Format`.
|
||||||
|
|
||||||
|
Build Menu Commands Dialog
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
Most of the configuration of the build menu is done through the Build Menu
|
||||||
|
Commands Dialog. You edit the configuration sourced from preferences in the
|
||||||
|
dialog opened from the Build->Build Menu Commands item and you edit the
|
||||||
|
configuration from the project in the build tab of the project preferences
|
||||||
|
dialog. Both use the same form shown below.
|
||||||
|
|
||||||
|
.. image:: ./images/build_menu_commands_dialog.png
|
||||||
|
|
||||||
|
The dialog is divided into three sections:
|
||||||
|
|
||||||
|
* Filetype menu items which will be selected based on the filetype of the
|
||||||
|
currently open document,
|
||||||
|
|
||||||
|
* Non-filetype menu items, and
|
||||||
|
|
||||||
|
* Execute menu items.
|
||||||
|
|
||||||
|
The filetype and non-filetype sections also contain a field for the regular
|
||||||
|
expression used for parsing command output for error and warning messages.
|
||||||
|
|
||||||
|
The columns in the first three sections allow setting of the label, command,
|
||||||
|
and working directory to run the command in.
|
||||||
|
|
||||||
|
An item with an empty label will not be shown in the menu.
|
||||||
|
|
||||||
|
An empty working directory will default to the directory of the current document.
|
||||||
|
If there is no current document then the command will not run.
|
||||||
|
|
||||||
|
The dialog will always show the command selected by priority, not just the
|
||||||
|
commands configured in this configuration source. This ensures that you always
|
||||||
|
see what the menu item is going to do if activated.
|
||||||
|
|
||||||
|
If the current source of the menu item is higher priority than the
|
||||||
|
configuration source you are editing then the command will be shown
|
||||||
|
in the dialog but will be insensitive (greyed out). This can't happen
|
||||||
|
with the project source but can with the preferences source dialog.
|
||||||
|
|
||||||
|
The clear buttons remove the definition from the configuration source you are editing.
|
||||||
|
When you do this the command from the next lower priority source will be shown.
|
||||||
|
To hide lower priority menu items without having anything show in the menu
|
||||||
|
configure with a nothing in the label but at least one character in the command.
|
||||||
|
|
||||||
|
Substitutions in Commands and Working Directories
|
||||||
|
`````````````````````````````````````````````````
|
||||||
|
|
||||||
|
The first occurance of each of the following character sequences in each of the
|
||||||
|
command and working directory fields is substituted by the items specified below
|
||||||
|
before the command is run.
|
||||||
|
|
||||||
|
* %d - substituted by the absolute path to the directory of the current file.
|
||||||
|
* %e - substituted by the name of the current file without the extension or path.
|
||||||
|
* %f - substituted by the name of the current file without the path.
|
||||||
|
* %p - if a project is open, substituted by the base path from the project.
|
||||||
|
|
||||||
|
.. note::
|
||||||
|
If the basepath set in the project preferences is not an absolute path , then it is
|
||||||
|
taken as relative to the directory of the project file. This allows a project file
|
||||||
|
stored in the source tree to specify all commands and working directories relative
|
||||||
|
to the tree itself, so that the whole tree including the project file, can be moved
|
||||||
|
and even checked into and out of version control without having to re-configure the
|
||||||
|
build menu.
|
||||||
|
|
||||||
|
Build Menu Keyboard Shortcuts
|
||||||
|
`````````````````````````````
|
||||||
|
|
||||||
|
Keyboard shortcuts can be defiend for the first two filetype menu items, the first three
|
||||||
|
non-filetype menu items, the first two execute menu items and the fixed menu items.
|
||||||
|
In the keybindings configuration dialog (see `Keybinding tab in preferences dialog`_)
|
||||||
|
these items are identified by the default labels shown in the `Build Menu`_ section above.
|
||||||
|
|
||||||
|
It is currently not possible to bind keyboard shortcuts to more than these menu items.
|
||||||
|
|
||||||
|
Configuration Files
|
||||||
|
```````````````````
|
||||||
|
|
||||||
|
The configurable Build Menu capability was introduced in Geany V0.19 and
|
||||||
|
required a new section to be added to the configuration files (See
|
||||||
|
`Preferences File Format`_). Geany will still load older format project,
|
||||||
|
preferences and filetype file settings and will attempt to map them into the new
|
||||||
|
configuration format. There is not a simple clean mapping between the formats.
|
||||||
|
The mapping used produces the most sensible results for the majority of cases.
|
||||||
|
However, if they do not map the way you want, you may have to manually
|
||||||
|
configure some settings using the Build Commands
|
||||||
|
Dialog or the Build tab of the project preferences dialog.
|
||||||
|
|
||||||
|
Any setting configured in either of these dialogs will override settings mapped from
|
||||||
|
older format configuration files.
|
||||||
|
|
||||||
Printing support
|
Printing support
|
||||||
----------------
|
----------------
|
||||||
@ -2710,7 +2901,8 @@ Send Selection to Terminal Sends the current sele
|
|||||||
line (if there is no selection) to the
|
line (if there is no selection) to the
|
||||||
embedded Terminal (VTE).
|
embedded Terminal (VTE).
|
||||||
|
|
||||||
Reflow lines/paragraph Reformat selected lines or current paragraph,
|
Reflow lines/block Reformat selected lines or current
|
||||||
|
(indented) text block,
|
||||||
breaking lines at the long line marker.
|
breaking lines at the long line marker.
|
||||||
|
|
||||||
|
|
||||||
@ -2746,6 +2938,11 @@ Find Document Usage Finds all occurrences
|
|||||||
document and displays them in the messages
|
document and displays them in the messages
|
||||||
window.
|
window.
|
||||||
|
|
||||||
|
Mark All Highlight all matches of the current
|
||||||
|
word/selection in the current document
|
||||||
|
with a colored box. If there's nothing to
|
||||||
|
find, highlighted matches will be cleared.
|
||||||
|
|
||||||
**Go to**
|
**Go to**
|
||||||
|
|
||||||
Navigate forward a location Switches to the next location in the navigation
|
Navigate forward a location Switches to the next location in the navigation
|
||||||
@ -2916,6 +3113,27 @@ Configuration files
|
|||||||
===================
|
===================
|
||||||
|
|
||||||
|
|
||||||
|
Tools menu items
|
||||||
|
----------------
|
||||||
|
There's a *Configuration files* submenu in the *Tools* menu that
|
||||||
|
contains items for some of the available user configuration files.
|
||||||
|
Clicking on one opens it in the editor for you to update. Geany will
|
||||||
|
reload the file after you have saved it.
|
||||||
|
|
||||||
|
.. note::
|
||||||
|
Other configuration files are not shown here and you will need to open
|
||||||
|
them manually and usually restart Geany to see any changes.
|
||||||
|
|
||||||
|
There's also a *Reload Configuration* item which can be used if you
|
||||||
|
updated a configuration file outside of the current instance. This
|
||||||
|
item is also necessary to update syntax highlighting colors.
|
||||||
|
|
||||||
|
.. note::
|
||||||
|
Syntax highlighting colors aren't updated after saving
|
||||||
|
filetypes.common as this can take a short while depending on which
|
||||||
|
documents are open.
|
||||||
|
|
||||||
|
|
||||||
Global configuration file
|
Global configuration file
|
||||||
-------------------------
|
-------------------------
|
||||||
|
|
||||||
@ -2974,6 +3192,8 @@ configuration directory. Alternatively, you can create a file
|
|||||||
to change. All missing settings will be read from the corresponding
|
to change. All missing settings will be read from the corresponding
|
||||||
global definition file in ``$prefix/share/geany``.
|
global definition file in ``$prefix/share/geany``.
|
||||||
|
|
||||||
|
As well as the sections listed below, each filetype file can contain
|
||||||
|
a [build-menu] section as described in `[build-menu] Section`_.
|
||||||
|
|
||||||
Format
|
Format
|
||||||
^^^^^^
|
^^^^^^
|
||||||
@ -3106,6 +3326,9 @@ context_action_cmd
|
|||||||
|
|
||||||
[build_settings] Section
|
[build_settings] Section
|
||||||
````````````````````````
|
````````````````````````
|
||||||
|
|
||||||
|
As of Geany v0.19 this section is supplemented by the `[build-menu] Section`_.
|
||||||
|
|
||||||
error_regex
|
error_regex
|
||||||
This is a GNU-style extended regular expression to parse a filename
|
This is a GNU-style extended regular expression to parse a filename
|
||||||
and line number from build output. If undefined, Geany will fall
|
and line number from build output. If undefined, Geany will fall
|
||||||
@ -3122,8 +3345,10 @@ error_regex
|
|||||||
|
|
||||||
**Build commands**
|
**Build commands**
|
||||||
|
|
||||||
The build commands are all configurable using the `Set Includes and
|
If any build menu item settings have been configured in the Build Menu Commands
|
||||||
Arguments`_ dialog.
|
dialog or the Build tab of the project preferences dialog then these
|
||||||
|
settings are stored in the [build-menu] section and override the settings in
|
||||||
|
this section for that item.
|
||||||
|
|
||||||
compiler
|
compiler
|
||||||
This item specifies the command to compile source code files. But
|
This item specifies the command to compile source code files. But
|
||||||
@ -3439,6 +3664,144 @@ look like::
|
|||||||
[Extensions]
|
[Extensions]
|
||||||
Make=Makefile*;*.mk;Buildfile;
|
Make=Makefile*;*.mk;Buildfile;
|
||||||
|
|
||||||
|
Preferences File Format
|
||||||
|
-----------------------
|
||||||
|
|
||||||
|
The preferences file ``~/.config/geany/geany.conf`` holds settings for all the items configured
|
||||||
|
in the preferences dialog. These are not detailed as they should not be edited
|
||||||
|
as they are overwritten by Geany.
|
||||||
|
|
||||||
|
|
||||||
|
Hidden preferences
|
||||||
|
^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
There are some uncommon preferences that are not shown in the Preferences
|
||||||
|
dialog. These can be set by editing the preferences file, then
|
||||||
|
restarting Geany. Search for the key name, then edit the value. Example:
|
||||||
|
|
||||||
|
``brace_match_ltgt=true``
|
||||||
|
|
||||||
|
The table below show the key names of hidden preferences in the
|
||||||
|
configuration file.
|
||||||
|
|
||||||
|
================================ =========================================== ==================
|
||||||
|
Key Description Default
|
||||||
|
================================ =========================================== ==================
|
||||||
|
**Editor related**
|
||||||
|
brace_match_ltgt Whether to highlight <, > angle brackets. false
|
||||||
|
show_editor_scrollbars Whether to display scrollbars. If set to true
|
||||||
|
false, the horizontal and vertical
|
||||||
|
scrollbars are hidden completely.
|
||||||
|
use_gtk_word_boundaries Whether to look for the end of a word when true
|
||||||
|
using word-boundary related Scintilla
|
||||||
|
commands (see `Scintilla keyboard
|
||||||
|
commands`_).
|
||||||
|
complete_snippets_whilst_editing Whether to allow completion of snippets false
|
||||||
|
when editing an existing line (i.e. there
|
||||||
|
is some text after the current cursor
|
||||||
|
position on the line). Only used when the
|
||||||
|
keybinding ``Complete snippet`` is set to
|
||||||
|
``Space``.
|
||||||
|
**Interface related**
|
||||||
|
show_symbol_list_expanders Whether to show or hide the small expander true
|
||||||
|
icons on the symbol list treeview (only
|
||||||
|
available with GTK 2.12 or above).
|
||||||
|
allow_always_save Whether files can be saved always, even if false
|
||||||
|
they don't have any changes. By default,
|
||||||
|
the Save buttons and menu items are
|
||||||
|
disabled when a file is unchanged. When
|
||||||
|
setting this option to true, the Save
|
||||||
|
buttons and menu items are always active
|
||||||
|
and files can be saved.
|
||||||
|
**VTE related**
|
||||||
|
emulation Terminal emulation mode. Only change this xterm
|
||||||
|
if you have VTE termcap files other than
|
||||||
|
``vte/termcap/xterm``.
|
||||||
|
**File related**
|
||||||
|
use_safe_file_saving Defines the mode how Geany saves files to false
|
||||||
|
disk. If disabled, Geany directly writes
|
||||||
|
the content of the document to disk. This
|
||||||
|
might cause in loss of data when there is
|
||||||
|
no more free space on disk to save the
|
||||||
|
file. When set to true, Geany first saves
|
||||||
|
the contents into a temporary file and if
|
||||||
|
this succeeded, the temporary file is
|
||||||
|
moved to the real file to save.
|
||||||
|
This gives better error checking in case of
|
||||||
|
no more free disk space. But it also
|
||||||
|
destroys hard links of the original file
|
||||||
|
and its permissions (e.g. executable flags
|
||||||
|
are reset). Use this with care as it can
|
||||||
|
break things seriously.
|
||||||
|
The better approach would be to ensure your
|
||||||
|
disk won't run out of free space.
|
||||||
|
**Build Menu related**
|
||||||
|
number_ft_menu_items The maximum number of menu items in the 2
|
||||||
|
filetype section of the Build menu.
|
||||||
|
number_non_ft_menu_items The maximum number of menu items in the 3
|
||||||
|
non-filetype section of the Build menu.
|
||||||
|
number_exec_menu_items The maximum number of menu items in the 2
|
||||||
|
execute section of the Build menu.
|
||||||
|
================================ =========================================== ==================
|
||||||
|
|
||||||
|
[build-menu] Section
|
||||||
|
^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
The [build-menu] section contains the configuration of the build menu.
|
||||||
|
This section can occur in filetype, preferences and project files and
|
||||||
|
always has the format described here. Different menu items are loaded
|
||||||
|
from different files, see the table in the `Build Menu Configuration`
|
||||||
|
section for details. All the settings can be configured from the dialogs
|
||||||
|
except the execute command in filetype files and filetype definitions in
|
||||||
|
the project file, so these are the only ones which need hand editing.
|
||||||
|
|
||||||
|
The build-menu section stores one entry for each setting for each menu item that
|
||||||
|
is configured. The keys for these settings have the format:
|
||||||
|
|
||||||
|
``GG_NN_FF``
|
||||||
|
|
||||||
|
where:
|
||||||
|
|
||||||
|
* GG - is the menu item group,
|
||||||
|
|
||||||
|
- FT for filetype
|
||||||
|
- NF for non-filetype
|
||||||
|
- EX for execute
|
||||||
|
|
||||||
|
* NN - is a two decimal digit number of the item within the group,
|
||||||
|
starting at 00
|
||||||
|
* FF - is the field,
|
||||||
|
|
||||||
|
- LB for label
|
||||||
|
- CM for command
|
||||||
|
- WD for working directory
|
||||||
|
|
||||||
|
|
||||||
|
Project File Format
|
||||||
|
-------------------
|
||||||
|
|
||||||
|
The project file contains project related settings and possibly a
|
||||||
|
record of the current session files.
|
||||||
|
|
||||||
|
|
||||||
|
[build-menu] Additions
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
The project file also can have extra fields in the [build-menu] section
|
||||||
|
in addition to those listed in `[build-menu] Section`_ above.
|
||||||
|
|
||||||
|
When filetype menu items are configured for the project they are stored
|
||||||
|
in the project file.
|
||||||
|
|
||||||
|
The ``filetypes`` entry is a list of the filetypes which exist in the
|
||||||
|
project file.
|
||||||
|
|
||||||
|
For each filetype the entries for that filetype have the format defined in
|
||||||
|
`[build-menu] Section` but the key is prefixed by the name of the filetype
|
||||||
|
as it appears in the ``filetypes`` entry, eg the entry for the label of
|
||||||
|
filetype menu item 0 for the C filetype would be
|
||||||
|
|
||||||
|
``CFT_00_LB=Label``
|
||||||
|
|
||||||
|
|
||||||
Templates
|
Templates
|
||||||
@ -3836,71 +4199,6 @@ them on Windows):
|
|||||||
position without having to drag it.
|
position without having to drag it.
|
||||||
|
|
||||||
|
|
||||||
Hidden preferences
|
|
||||||
==================
|
|
||||||
|
|
||||||
There are some uncommon preferences that are not shown in the Preferences
|
|
||||||
dialog. These can be set by editing ``~/.config/geany/geany.conf``, then
|
|
||||||
restarting Geany. Search for the key name, then edit the value. Example:
|
|
||||||
|
|
||||||
``brace_match_ltgt=true``
|
|
||||||
|
|
||||||
The table below show the key names of hidden preferences in the
|
|
||||||
configuration file.
|
|
||||||
|
|
||||||
================================ =========================================== ==================
|
|
||||||
Key Description Default
|
|
||||||
================================ =========================================== ==================
|
|
||||||
**Editor related**
|
|
||||||
brace_match_ltgt Whether to highlight <, > angle brackets. false
|
|
||||||
show_editor_scrollbars Whether to display scrollbars. If set to true
|
|
||||||
false, the horizontal and vertical
|
|
||||||
scrollbars are hidden completely.
|
|
||||||
use_gtk_word_boundaries Whether to look for the end of a word when true
|
|
||||||
using word-boundary related Scintilla
|
|
||||||
commands (see `Scintilla keyboard
|
|
||||||
commands`_).
|
|
||||||
complete_snippets_whilst_editing Whether to allow completion of snippets false
|
|
||||||
when editing an existing line (i.e. there
|
|
||||||
is some text after the current cursor
|
|
||||||
position on the line). Only used when the
|
|
||||||
keybinding ``Complete snippet`` is set to
|
|
||||||
``Space``.
|
|
||||||
**Interface related**
|
|
||||||
show_symbol_list_expanders Whether to show or hide the small expander true
|
|
||||||
icons on the symbol list treeview (only
|
|
||||||
available with GTK 2.12 or above).
|
|
||||||
allow_always_save Whether files can be saved always, even if false
|
|
||||||
they don't have any changes. By default,
|
|
||||||
the Save buttons and menu items are
|
|
||||||
disabled when a file is unchanged. When
|
|
||||||
setting this option to true, the Save
|
|
||||||
buttons and menu items are always active
|
|
||||||
and files can be saved.
|
|
||||||
**VTE related**
|
|
||||||
emulation Terminal emulation mode. Only change this xterm
|
|
||||||
if you have VTE termcap files other than
|
|
||||||
``vte/termcap/xterm``.
|
|
||||||
**File related**
|
|
||||||
use_safe_file_saving Defines the mode how Geany saves files to false
|
|
||||||
disk. If disabled, Geany directly writes
|
|
||||||
the content of the document to disk. This
|
|
||||||
might cause in loss of data when there is
|
|
||||||
no more free space on disk to save the
|
|
||||||
file. When set to true, Geany first saves
|
|
||||||
the contents into a temporary file and if
|
|
||||||
this succeeded, the temporary file is
|
|
||||||
moved to the real file to save.
|
|
||||||
This gives better error checking in case of
|
|
||||||
no more free disk space. But it also
|
|
||||||
destroys hard links of the original file
|
|
||||||
and its permissions (e.g. executable flags
|
|
||||||
are reset). Use this with care as it can
|
|
||||||
break things seriously.
|
|
||||||
The better approach would be to ensure your
|
|
||||||
disk won't run out of free space.
|
|
||||||
================================ =========================================== ==================
|
|
||||||
|
|
||||||
|
|
||||||
Compile-time options
|
Compile-time options
|
||||||
====================
|
====================
|
||||||
@ -4014,6 +4312,23 @@ GEANY_BUILD_ERR_HIGHLIGHT_MAX Amount of build error messages which should 10
|
|||||||
just aftereffects.
|
just aftereffects.
|
||||||
============================== ============================================ ==================
|
============================== ============================================ ==================
|
||||||
|
|
||||||
|
build.c
|
||||||
|
-------
|
||||||
|
|
||||||
|
============================== ============================================ ==================
|
||||||
|
Option Description Default
|
||||||
|
============================== ============================================ ==================
|
||||||
|
PRINTBUILDCMDS Every time a build menu item priority FALSE
|
||||||
|
calculation is run, print the state of the
|
||||||
|
menu item table in the form of the table
|
||||||
|
in `Build Menu Configuration`_. May be
|
||||||
|
useful to debug configuration file
|
||||||
|
overloading. Warning produces a lot of
|
||||||
|
output. Can also be enabled/disabled by the
|
||||||
|
debugger by setting printbuildcmds to 1/0
|
||||||
|
overriding the compile setting.
|
||||||
|
============================== ============================================ ==================
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
GNU General Public License
|
GNU General Public License
|
||||||
|
Binary file not shown.
Before Width: | Height: | Size: 24 KiB After Width: | Height: | Size: 26 KiB |
Binary file not shown.
Before Width: | Height: | Size: 20 KiB After Width: | Height: | Size: 19 KiB |
@ -29,26 +29,30 @@
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @mainpage Geany Plugin API Documentation
|
* @mainpage Geany Plugin API Documentation
|
||||||
*
|
*
|
||||||
* @author Enrico Tröger, Nick Treleaven, Frank Lanitz
|
* @author Enrico Tröger, Nick Treleaven, Frank Lanitz
|
||||||
* @date $Date$
|
* @date $Date$
|
||||||
*
|
*
|
||||||
* @section Intro
|
* @section Intro
|
||||||
* This is the Geany API documentation. It is far from being complete and should be
|
* This is the Geany API documentation. It should be considered work in progress.
|
||||||
* considered as a work in progress.
|
* We will try to document as many functions and structs as possible.
|
||||||
* We will try to document as many functions and structs as possible.
|
|
||||||
*
|
*
|
||||||
* To get started, see the @link howto Plugin Howto @endlink.
|
* To get started, see the @link howto Plugin Howto @endlink.
|
||||||
*
|
*
|
||||||
* Other pages:
|
* Other pages:
|
||||||
* - @link pluginsymbols.c Plugin Symbols @endlink
|
* - @link pluginsymbols.c Plugin Symbols @endlink
|
||||||
* - @link plugindata.h Main Datatypes and Macros @endlink
|
* - @link plugindata.h Main Datatypes and Macros @endlink
|
||||||
* - @link signals Plugin Signals @endlink
|
* - @link signals Plugin Signals @endlink
|
||||||
* - @link pluginutils.c Plugin Utility Functions @endlink
|
* - @link pluginutils.c Plugin Utility Functions @endlink
|
||||||
* - @link guidelines Plugin Writing Guidelines @endlink
|
* - @link guidelines Plugin Writing Guidelines @endlink
|
||||||
|
* - <b>plugins/demoplugin.c</b> - in Geany's source, bigger than the howto example
|
||||||
|
* - Header files for functions and types - see <b>Files</b> link at the top
|
||||||
|
* - Deprecated symbols - see <b>Related Pages</b> link at the top
|
||||||
*
|
*
|
||||||
* @note Some of these pages are also listed in Related Pages.
|
* @warning Do not use any symbol not in the documentation - it may change.
|
||||||
|
* @note See the HACKING file for information about developing the plugin API and
|
||||||
|
* other useful notes.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -70,16 +70,10 @@ PluginFields *plugin_fields;
|
|||||||
* @see plugin_signal_connect(). */
|
* @see plugin_signal_connect(). */
|
||||||
PluginCallback plugin_callbacks[];
|
PluginCallback plugin_callbacks[];
|
||||||
|
|
||||||
/** Most plugins should use the PLUGIN_KEY_GROUP() macro to define it. However,
|
/** Plugins must use the PLUGIN_KEY_GROUP() macro to define it.
|
||||||
* its fields are not read until after plugin_init() is called for the plugin, so it
|
* To setup a variable number of keybindings, e.g. based on the
|
||||||
* is possible to setup a variable number of keybindings, e.g. based on the
|
* plugin's configuration file settings, use plugin_set_key_group() instead. */
|
||||||
* plugin's configuration file settings.
|
KeyBindingGroup *plugin_key_group;
|
||||||
* - The @c name field must not be empty or match Geany's default group name.
|
|
||||||
* - The @c label field is set by Geany after plugin_init() is called to the name of the
|
|
||||||
* plugin.
|
|
||||||
* @note This is a single element array for implementation reasons,
|
|
||||||
* but you can treat it like a pointer. */
|
|
||||||
KeyBindingGroup plugin_key_group[1];
|
|
||||||
|
|
||||||
|
|
||||||
/** Called before showing the plugin preferences dialog to let the user set some basic
|
/** Called before showing the plugin preferences dialog to let the user set some basic
|
||||||
|
79
geany.glade
79
geany.glade
@ -7706,34 +7706,6 @@ Match braces</property>
|
|||||||
<property name="row_spacing">3</property>
|
<property name="row_spacing">3</property>
|
||||||
<property name="column_spacing">6</property>
|
<property name="column_spacing">6</property>
|
||||||
|
|
||||||
<child>
|
|
||||||
<widget class="GtkLabel" id="label11">
|
|
||||||
<property name="visible">True</property>
|
|
||||||
<property name="label" translatable="yes">Make:</property>
|
|
||||||
<property name="use_underline">False</property>
|
|
||||||
<property name="use_markup">False</property>
|
|
||||||
<property name="justify">GTK_JUSTIFY_LEFT</property>
|
|
||||||
<property name="wrap">False</property>
|
|
||||||
<property name="selectable">False</property>
|
|
||||||
<property name="xalign">0</property>
|
|
||||||
<property name="yalign">0.5</property>
|
|
||||||
<property name="xpad">0</property>
|
|
||||||
<property name="ypad">0</property>
|
|
||||||
<property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
|
|
||||||
<property name="width_chars">-1</property>
|
|
||||||
<property name="single_line_mode">False</property>
|
|
||||||
<property name="angle">0</property>
|
|
||||||
</widget>
|
|
||||||
<packing>
|
|
||||||
<property name="left_attach">0</property>
|
|
||||||
<property name="right_attach">1</property>
|
|
||||||
<property name="top_attach">0</property>
|
|
||||||
<property name="bottom_attach">1</property>
|
|
||||||
<property name="x_options">fill</property>
|
|
||||||
<property name="y_options"></property>
|
|
||||||
</packing>
|
|
||||||
</child>
|
|
||||||
|
|
||||||
<child>
|
<child>
|
||||||
<widget class="GtkLabel" id="label97">
|
<widget class="GtkLabel" id="label97">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
@ -7790,28 +7762,6 @@ Match braces</property>
|
|||||||
</packing>
|
</packing>
|
||||||
</child>
|
</child>
|
||||||
|
|
||||||
<child>
|
|
||||||
<widget class="GtkEntry" id="entry_com_make">
|
|
||||||
<property name="visible">True</property>
|
|
||||||
<property name="tooltip" translatable="yes">Path and options for the make tool</property>
|
|
||||||
<property name="can_focus">True</property>
|
|
||||||
<property name="editable">True</property>
|
|
||||||
<property name="visibility">True</property>
|
|
||||||
<property name="max_length">0</property>
|
|
||||||
<property name="text" translatable="yes"></property>
|
|
||||||
<property name="has_frame">True</property>
|
|
||||||
<property name="invisible_char">*</property>
|
|
||||||
<property name="activates_default">False</property>
|
|
||||||
</widget>
|
|
||||||
<packing>
|
|
||||||
<property name="left_attach">1</property>
|
|
||||||
<property name="right_attach">2</property>
|
|
||||||
<property name="top_attach">0</property>
|
|
||||||
<property name="bottom_attach">1</property>
|
|
||||||
<property name="y_options"></property>
|
|
||||||
</packing>
|
|
||||||
</child>
|
|
||||||
|
|
||||||
<child>
|
<child>
|
||||||
<widget class="GtkEntry" id="entry_com_term">
|
<widget class="GtkEntry" id="entry_com_term">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
@ -7856,35 +7806,6 @@ Match braces</property>
|
|||||||
</packing>
|
</packing>
|
||||||
</child>
|
</child>
|
||||||
|
|
||||||
<child>
|
|
||||||
<widget class="GtkButton" id="button_make">
|
|
||||||
<property name="visible">True</property>
|
|
||||||
<property name="can_focus">True</property>
|
|
||||||
<property name="relief">GTK_RELIEF_NORMAL</property>
|
|
||||||
<property name="focus_on_click">True</property>
|
|
||||||
|
|
||||||
<child>
|
|
||||||
<widget class="GtkImage" id="image285">
|
|
||||||
<property name="visible">True</property>
|
|
||||||
<property name="stock">gtk-open</property>
|
|
||||||
<property name="icon_size">4</property>
|
|
||||||
<property name="xalign">0.5</property>
|
|
||||||
<property name="yalign">0.5</property>
|
|
||||||
<property name="xpad">0</property>
|
|
||||||
<property name="ypad">0</property>
|
|
||||||
</widget>
|
|
||||||
</child>
|
|
||||||
</widget>
|
|
||||||
<packing>
|
|
||||||
<property name="left_attach">2</property>
|
|
||||||
<property name="right_attach">3</property>
|
|
||||||
<property name="top_attach">0</property>
|
|
||||||
<property name="bottom_attach">1</property>
|
|
||||||
<property name="x_options">fill</property>
|
|
||||||
<property name="y_options"></property>
|
|
||||||
</packing>
|
|
||||||
</child>
|
|
||||||
|
|
||||||
<child>
|
<child>
|
||||||
<widget class="GtkButton" id="button_term">
|
<widget class="GtkButton" id="button_term">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
|
@ -33,8 +33,8 @@ RequestExecutionLevel user ; set execution level for Windows Vista
|
|||||||
; helper defines ;
|
; helper defines ;
|
||||||
;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;
|
||||||
!define PRODUCT_NAME "Geany"
|
!define PRODUCT_NAME "Geany"
|
||||||
!define PRODUCT_VERSION "0.18"
|
!define PRODUCT_VERSION "0.19"
|
||||||
!define PRODUCT_VERSION_ID "0.18.0.0"
|
!define PRODUCT_VERSION_ID "0.19.0.0"
|
||||||
!define PRODUCT_PUBLISHER "The Geany developer team"
|
!define PRODUCT_PUBLISHER "The Geany developer team"
|
||||||
!define PRODUCT_WEB_SITE "http://www.geany.org/"
|
!define PRODUCT_WEB_SITE "http://www.geany.org/"
|
||||||
!define PRODUCT_DIR_REGKEY "Software\Geany"
|
!define PRODUCT_DIR_REGKEY "Software\Geany"
|
||||||
@ -54,7 +54,7 @@ VIAddVersionKey "ProductVersion" "${PRODUCT_VERSION}"
|
|||||||
VIAddVersionKey "LegalCopyright" "Copyright 2005-2009 by the Geany developer team"
|
VIAddVersionKey "LegalCopyright" "Copyright 2005-2009 by the Geany developer team"
|
||||||
VIAddVersionKey "FileDescription" "${PRODUCT_NAME} Installer"
|
VIAddVersionKey "FileDescription" "${PRODUCT_NAME} Installer"
|
||||||
|
|
||||||
BrandingText "$(^NAME) installer (NSIS 2.44)"
|
BrandingText "$(^NAME) installer (NSIS 2.45)"
|
||||||
InstallDir "$PROGRAMFILES\Geany"
|
InstallDir "$PROGRAMFILES\Geany"
|
||||||
Name "${PRODUCT_NAME} ${PRODUCT_VERSION}"
|
Name "${PRODUCT_NAME} ${PRODUCT_VERSION}"
|
||||||
SetCompressor /SOLID lzma
|
SetCompressor /SOLID lzma
|
||||||
|
@ -5,8 +5,8 @@
|
|||||||
A ICON MOVEABLE PURE LOADONCALL DISCARDABLE "../icons/geany.ico"
|
A ICON MOVEABLE PURE LOADONCALL DISCARDABLE "../icons/geany.ico"
|
||||||
|
|
||||||
1 VERSIONINFO
|
1 VERSIONINFO
|
||||||
FILEVERSION 0,18,0,0
|
FILEVERSION 0,19,0,0
|
||||||
PRODUCTVERSION 0,18,0,0
|
PRODUCTVERSION 0,19,0,0
|
||||||
FILETYPE VFT_APP
|
FILETYPE VFT_APP
|
||||||
{
|
{
|
||||||
BLOCK "StringFileInfo"
|
BLOCK "StringFileInfo"
|
||||||
@ -14,14 +14,14 @@ FILETYPE VFT_APP
|
|||||||
BLOCK "040704E4"
|
BLOCK "040704E4"
|
||||||
{
|
{
|
||||||
VALUE "CompanyName", ""
|
VALUE "CompanyName", ""
|
||||||
VALUE "FileVersion", "0.18"
|
VALUE "FileVersion", "0.19"
|
||||||
VALUE "FileDescription", "Geany"
|
VALUE "FileDescription", "Geany"
|
||||||
VALUE "InternalName", "geany"
|
VALUE "InternalName", "geany"
|
||||||
VALUE "LegalCopyright", "Copyright 2005-2009 by the Geany developers"
|
VALUE "LegalCopyright", "Copyright 2005-2009 by the Geany developers"
|
||||||
VALUE "LegalTrademarks", ""
|
VALUE "LegalTrademarks", ""
|
||||||
VALUE "OriginalFilename", "geany"
|
VALUE "OriginalFilename", "geany"
|
||||||
VALUE "ProductName", "geany"
|
VALUE "ProductName", "geany"
|
||||||
VALUE "ProductVersion", "0.18"
|
VALUE "ProductVersion", "0.19"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,10 +1,16 @@
|
|||||||
/* This file is generated automatically by genapi.py - do not edit.
|
/* This file is generated automatically by genapi.py - do not edit. */
|
||||||
|
|
||||||
|
/** @file geanyfunctions.h @ref geany_functions wrappers.
|
||||||
|
* This allows the use of normal API function names in plugins by defining macros.
|
||||||
|
*
|
||||||
|
* E.g.:@code
|
||||||
|
* #define plugin_add_toolbar_item \
|
||||||
|
* geany_functions->p_plugin->add_toolbar_item @endcode
|
||||||
*
|
*
|
||||||
* @file geanyfunctions.h @ref geany_functions wrappers.
|
|
||||||
* This allows the use of normal API function names in plugins.
|
|
||||||
* You need to declare the @ref geany_functions symbol yourself.
|
* You need to declare the @ref geany_functions symbol yourself.
|
||||||
*
|
*
|
||||||
* Note: This must be included after all other API headers.
|
* Note: This must be included after all other API headers to prevent conflicts with
|
||||||
|
* other header's function prototypes - this is done for you when using geanyplugin.h.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef GEANY_FUNCTIONS_H
|
#ifndef GEANY_FUNCTIONS_H
|
||||||
@ -16,6 +22,8 @@
|
|||||||
geany_functions->p_plugin->module_make_resident
|
geany_functions->p_plugin->module_make_resident
|
||||||
#define plugin_signal_connect \
|
#define plugin_signal_connect \
|
||||||
geany_functions->p_plugin->signal_connect
|
geany_functions->p_plugin->signal_connect
|
||||||
|
#define plugin_set_key_group \
|
||||||
|
geany_functions->p_plugin->set_key_group
|
||||||
#define document_new_file \
|
#define document_new_file \
|
||||||
geany_functions->p_document->new_file
|
geany_functions->p_document->new_file
|
||||||
#define document_get_current \
|
#define document_get_current \
|
||||||
@ -246,6 +254,8 @@
|
|||||||
geany_functions->p_keybindings->send_command
|
geany_functions->p_keybindings->send_command
|
||||||
#define keybindings_set_item \
|
#define keybindings_set_item \
|
||||||
geany_functions->p_keybindings->set_item
|
geany_functions->p_keybindings->set_item
|
||||||
|
#define keybindings_get_item \
|
||||||
|
geany_functions->p_keybindings->get_item
|
||||||
#define tm_get_real_path \
|
#define tm_get_real_path \
|
||||||
geany_functions->p_tm->get_real_path
|
geany_functions->p_tm->get_real_path
|
||||||
#define tm_source_file_new \
|
#define tm_source_file_new \
|
||||||
|
@ -26,7 +26,7 @@ r"""
|
|||||||
Creates macros for each plugin API function pointer, e.g.:
|
Creates macros for each plugin API function pointer, e.g.:
|
||||||
|
|
||||||
#define plugin_add_toolbar_item \
|
#define plugin_add_toolbar_item \
|
||||||
p_plugin->add_toolbar_item
|
geany_functions->p_plugin->add_toolbar_item
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
|
||||||
@ -56,13 +56,19 @@ def get_api_tuple(str):
|
|||||||
|
|
||||||
|
|
||||||
header = \
|
header = \
|
||||||
'''/* This file is generated automatically by genapi.py - do not edit.
|
r'''/* This file is generated automatically by genapi.py - do not edit. */
|
||||||
|
|
||||||
|
/** @file %s @ref geany_functions wrappers.
|
||||||
|
* This allows the use of normal API function names in plugins by defining macros.
|
||||||
|
*
|
||||||
|
* E.g.:@code
|
||||||
|
* #define plugin_add_toolbar_item \
|
||||||
|
* geany_functions->p_plugin->add_toolbar_item @endcode
|
||||||
*
|
*
|
||||||
* @file %s @ref geany_functions wrappers.
|
|
||||||
* This allows the use of normal API function names in plugins.
|
|
||||||
* You need to declare the @ref geany_functions symbol yourself.
|
* You need to declare the @ref geany_functions symbol yourself.
|
||||||
*
|
*
|
||||||
* Note: This must be included after all other API headers.
|
* Note: This must be included after all other API headers to prevent conflicts with
|
||||||
|
* other header's function prototypes - this is done for you when using geanyplugin.h.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef GEANY_FUNCTIONS_H
|
#ifndef GEANY_FUNCTIONS_H
|
||||||
|
@ -39,6 +39,7 @@ PLUGIN_SET_INFO(_("Split Window"), _("Splits the editor view into two windows.")
|
|||||||
|
|
||||||
GeanyData *geany_data;
|
GeanyData *geany_data;
|
||||||
GeanyFunctions *geany_functions;
|
GeanyFunctions *geany_functions;
|
||||||
|
GeanyPlugin *geany_plugin;
|
||||||
|
|
||||||
|
|
||||||
/* Keybinding(s) */
|
/* Keybinding(s) */
|
||||||
@ -50,9 +51,6 @@ enum
|
|||||||
KB_COUNT
|
KB_COUNT
|
||||||
};
|
};
|
||||||
|
|
||||||
PLUGIN_KEY_GROUP(split_window, KB_COUNT);
|
|
||||||
|
|
||||||
|
|
||||||
enum State
|
enum State
|
||||||
{
|
{
|
||||||
STATE_SPLIT_HORIZONTAL,
|
STATE_SPLIT_HORIZONTAL,
|
||||||
@ -97,11 +95,10 @@ static gint sci_get_value(ScintillaObject *sci, gint message_id, gint param)
|
|||||||
static void set_styles(ScintillaObject *oldsci, ScintillaObject *newsci)
|
static void set_styles(ScintillaObject *oldsci, ScintillaObject *newsci)
|
||||||
{
|
{
|
||||||
gint style_id;
|
gint style_id;
|
||||||
|
gint val;
|
||||||
|
|
||||||
for (style_id = 0; style_id <= 127; style_id++)
|
for (style_id = 0; style_id <= 127; style_id++)
|
||||||
{
|
{
|
||||||
gint val;
|
|
||||||
|
|
||||||
val = sci_get_value(oldsci, SCI_STYLEGETFORE, style_id);
|
val = sci_get_value(oldsci, SCI_STYLEGETFORE, style_id);
|
||||||
scintilla_send_message(newsci, SCI_STYLESETFORE, style_id, val);
|
scintilla_send_message(newsci, SCI_STYLESETFORE, style_id, val);
|
||||||
val = sci_get_value(oldsci, SCI_STYLEGETBACK, style_id);
|
val = sci_get_value(oldsci, SCI_STYLEGETBACK, style_id);
|
||||||
@ -111,6 +108,8 @@ static void set_styles(ScintillaObject *oldsci, ScintillaObject *newsci)
|
|||||||
val = sci_get_value(oldsci, SCI_STYLEGETITALIC, style_id);
|
val = sci_get_value(oldsci, SCI_STYLEGETITALIC, style_id);
|
||||||
scintilla_send_message(newsci, SCI_STYLESETITALIC, style_id, val);
|
scintilla_send_message(newsci, SCI_STYLESETITALIC, style_id, val);
|
||||||
}
|
}
|
||||||
|
val = sci_get_value(oldsci, SCI_GETCARETFORE, 0);
|
||||||
|
scintilla_send_message(newsci, SCI_SETCARETFORE, val, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -395,6 +394,7 @@ static void kb_activate(guint key_id)
|
|||||||
void plugin_init(GeanyData *data)
|
void plugin_init(GeanyData *data)
|
||||||
{
|
{
|
||||||
GtkWidget *item, *menu;
|
GtkWidget *item, *menu;
|
||||||
|
GeanyKeyGroup *key_group;
|
||||||
|
|
||||||
menu_items.main = item = gtk_menu_item_new_with_mnemonic(_("_Split Window"));
|
menu_items.main = item = gtk_menu_item_new_with_mnemonic(_("_Split Window"));
|
||||||
gtk_menu_shell_append(GTK_MENU_SHELL(geany_data->main_widgets->tools_menu), item);
|
gtk_menu_shell_append(GTK_MENU_SHELL(geany_data->main_widgets->tools_menu), item);
|
||||||
@ -423,11 +423,12 @@ void plugin_init(GeanyData *data)
|
|||||||
set_state(STATE_UNSPLIT);
|
set_state(STATE_UNSPLIT);
|
||||||
|
|
||||||
/* setup keybindings */
|
/* setup keybindings */
|
||||||
keybindings_set_item(plugin_key_group, KB_SPLIT_HORIZONTAL, kb_activate,
|
key_group = plugin_set_key_group(geany_plugin, "split_window", KB_COUNT, NULL);
|
||||||
|
keybindings_set_item(key_group, KB_SPLIT_HORIZONTAL, kb_activate,
|
||||||
0, 0, "split_horizontal", _("Split Horizontally"), menu_items.horizontal);
|
0, 0, "split_horizontal", _("Split Horizontally"), menu_items.horizontal);
|
||||||
keybindings_set_item(plugin_key_group, KB_SPLIT_VERTICAL, kb_activate,
|
keybindings_set_item(key_group, KB_SPLIT_VERTICAL, kb_activate,
|
||||||
0, 0, "split_vertical", _("Split Vertically"), menu_items.vertical);
|
0, 0, "split_vertical", _("Split Vertically"), menu_items.vertical);
|
||||||
keybindings_set_item(plugin_key_group, KB_SPLIT_UNSPLIT, kb_activate,
|
keybindings_set_item(key_group, KB_SPLIT_UNSPLIT, kb_activate,
|
||||||
0, 0, "split_unsplit", _("Unsplit"), menu_items.unsplit);
|
0, 0, "split_unsplit", _("Unsplit"), menu_items.unsplit);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
#!/usr/bin/env perl
|
#!/usr/bin/env perl
|
||||||
# Copyright: 2008, Nick Treleaven
|
# Copyright: 2008-2009, Nick Treleaven
|
||||||
# License: GNU GPL V2 or later
|
# License: GNU GPL V2 or later
|
||||||
# Warranty: NONE
|
# Warranty: NONE
|
||||||
|
|
||||||
@ -8,6 +8,18 @@
|
|||||||
# repeats until all matching blocks of text are found.
|
# repeats until all matching blocks of text are found.
|
||||||
# Results are printed in reverse, hence in chronological order (as ChangeLogs
|
# Results are printed in reverse, hence in chronological order (as ChangeLogs
|
||||||
# are usually written in reverse date order).
|
# are usually written in reverse date order).
|
||||||
|
#
|
||||||
|
# The resulting lines are then formatted to be easier to read and edit into a
|
||||||
|
# NEWS file.
|
||||||
|
|
||||||
|
# Example ChangeLog format:
|
||||||
|
#2009-04-03 Joe Author <joe@example.net>
|
||||||
|
#
|
||||||
|
# * src/file.c, src/file.h,
|
||||||
|
# src/another.c:
|
||||||
|
# Some change description,
|
||||||
|
# spanning several lines.
|
||||||
|
# * foo.c: Combined line.
|
||||||
|
|
||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
@ -15,8 +27,12 @@ use warnings;
|
|||||||
my $scriptname = "changelist.pl";
|
my $scriptname = "changelist.pl";
|
||||||
my $argc = $#ARGV + 1;
|
my $argc = $#ARGV + 1;
|
||||||
|
|
||||||
($argc == 2)
|
($argc == 2) or die <<END;
|
||||||
or die "Usage:\n$scriptname matchstring changelogfile\n";
|
Usage:
|
||||||
|
$scriptname matchstring changelogfile >outfile
|
||||||
|
|
||||||
|
matchstring is not case sensitive.
|
||||||
|
END
|
||||||
|
|
||||||
my ($matchstr, $infile) = @ARGV;
|
my ($matchstr, $infile) = @ARGV;
|
||||||
|
|
||||||
@ -24,7 +40,10 @@ open(INPUT, $infile)
|
|||||||
or die "Couldn't open $infile for reading: $!\n";
|
or die "Couldn't open $infile for reading: $!\n";
|
||||||
|
|
||||||
my $entry; # the current matching block of text
|
my $entry; # the current matching block of text
|
||||||
my @entries;
|
my @entries; # changelog entries, one per date
|
||||||
|
|
||||||
|
# first parse each ChangeLog entry into an array
|
||||||
|
|
||||||
my $found = 0; # if we're in a matching block of text
|
my $found = 0; # if we're in a matching block of text
|
||||||
my $blank = 0; # whether the last line was empty
|
my $blank = 0; # whether the last line was empty
|
||||||
|
|
||||||
@ -34,8 +53,7 @@ while (<INPUT>) {
|
|||||||
if (! $found) {
|
if (! $found) {
|
||||||
($line =~ m/$matchstr/) and $found = 1;
|
($line =~ m/$matchstr/) and $found = 1;
|
||||||
} else {
|
} else {
|
||||||
if (length($line) <= 1) # current line is empty
|
if (length($line) <= 1) { # current line is empty
|
||||||
{
|
|
||||||
if ($blank > 0) { # previous line was also empty
|
if ($blank > 0) { # previous line was also empty
|
||||||
push(@entries, $entry); # append entry
|
push(@entries, $entry); # append entry
|
||||||
$entry = "";
|
$entry = "";
|
||||||
@ -47,10 +65,61 @@ while (<INPUT>) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
$found and $entry .= $line;
|
if ($found) {
|
||||||
|
$entry .= $line;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
close(INPUT);
|
close(INPUT);
|
||||||
|
|
||||||
|
# reformat entries
|
||||||
foreach $entry (reverse @entries) {
|
foreach $entry (reverse @entries) {
|
||||||
print "$entry\n\n";
|
my @lines = split(/\n/, $entry);
|
||||||
|
my $fl = 0; # in file list lines
|
||||||
|
my $cm = 0; # in commit message lines
|
||||||
|
|
||||||
|
foreach my $line (@lines){
|
||||||
|
my $flset = $fl;
|
||||||
|
|
||||||
|
# strip trailing space
|
||||||
|
$line =~ s/\s+$//g;
|
||||||
|
|
||||||
|
if (!$cm){
|
||||||
|
# check if in filelist
|
||||||
|
($line =~ m/ \* /) and $fl = 1;
|
||||||
|
# join filelist together on one line
|
||||||
|
$fl and ($line =~ s/^ / /);
|
||||||
|
if ($fl and ($line =~ m/:/)){
|
||||||
|
$fl = 0;
|
||||||
|
# separate ' * foo.c: Some edit.' messages:
|
||||||
|
if (!($line =~ m/:$/)) {
|
||||||
|
($line =~ s/:/:\n*/);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$fl and ($line =~ m/,$/) or $fl = 0;
|
||||||
|
}
|
||||||
|
if (!$flset){
|
||||||
|
# Asterisk commit messages
|
||||||
|
if (!$cm and ($line =~ m/^ /)){
|
||||||
|
$cm = 1;
|
||||||
|
$line =~ s/^( )/$1* /;
|
||||||
|
} else {
|
||||||
|
$cm and ($line =~ s/^( )/$1 /); # indent continuing lines
|
||||||
|
}
|
||||||
|
$cm and ($line =~ m/\.$/) and $cm = 0;
|
||||||
|
}
|
||||||
|
#~ print $fl.','.$cm.','.$line."\n"; next; # debug
|
||||||
|
|
||||||
|
# change file list start char to easily distinguish between file list and commit messages
|
||||||
|
$line =~ s/^ \* /@ /g;
|
||||||
|
# strip <email> from date line
|
||||||
|
$line =~ s/^([0-9-]+.*?)\s+<.+>$/$1/g;
|
||||||
|
# remove indent
|
||||||
|
$line =~ s/^ //g;
|
||||||
|
|
||||||
|
if ($line ne ""){
|
||||||
|
print $line;
|
||||||
|
(!$fl) and print "\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
print "\n";
|
||||||
}
|
}
|
||||||
|
@ -73,10 +73,12 @@ geany_include_HEADERS = \
|
|||||||
templates.h \
|
templates.h \
|
||||||
toolbar.h \
|
toolbar.h \
|
||||||
ui_utils.h \
|
ui_utils.h \
|
||||||
utils.h
|
utils.h \
|
||||||
|
build.h
|
||||||
|
|
||||||
|
|
||||||
INCLUDES = -I$(srcdir)/../scintilla/include -I$(srcdir)/../tagmanager/include @GTK_CFLAGS@ @GIO_CFLAGS@
|
INCLUDES = -I$(top_srcdir) -I$(srcdir)/../scintilla/include -I$(srcdir)/../tagmanager/include \
|
||||||
|
@GTK_CFLAGS@ @GIO_CFLAGS@
|
||||||
|
|
||||||
# tell automake we have a C++ file so it uses the C++ linker we need for Scintilla
|
# tell automake we have a C++ file so it uses the C++ linker we need for Scintilla
|
||||||
nodist_EXTRA_geany_SOURCES = dummy.cxx
|
nodist_EXTRA_geany_SOURCES = dummy.cxx
|
||||||
@ -94,7 +96,8 @@ AM_CFLAGS = -DGEANY_DATADIR=\"data\" \
|
|||||||
-DGEANY_DOCDIR=\"\" \
|
-DGEANY_DOCDIR=\"\" \
|
||||||
-DGEANY_LIBDIR=\"\" \
|
-DGEANY_LIBDIR=\"\" \
|
||||||
-DGEANY_LOCALEDIR=\"\" \
|
-DGEANY_LOCALEDIR=\"\" \
|
||||||
-DGEANY_PREFIX=\"\"
|
-DGEANY_PREFIX=\"\" \
|
||||||
|
-DGEANY_PRIVATE
|
||||||
|
|
||||||
geany_LDFLAGS = -mwindows -mms-bitfields
|
geany_LDFLAGS = -mwindows -mms-bitfields
|
||||||
|
|
||||||
@ -117,7 +120,8 @@ AM_CFLAGS = -DGEANY_DATADIR=\""$(datadir)"\" \
|
|||||||
-DGEANY_DOCDIR=\""$(docdir)"\" \
|
-DGEANY_DOCDIR=\""$(docdir)"\" \
|
||||||
-DGEANY_LIBDIR=\""$(libdir)"\" \
|
-DGEANY_LIBDIR=\""$(libdir)"\" \
|
||||||
-DGEANY_LOCALEDIR=\""$(localedir)"\" \
|
-DGEANY_LOCALEDIR=\""$(localedir)"\" \
|
||||||
-DGEANY_PREFIX=\""$(prefix)"\"
|
-DGEANY_PREFIX=\""$(prefix)"\" \
|
||||||
|
-DGEANY_PRIVATE
|
||||||
|
|
||||||
clean-local:
|
clean-local:
|
||||||
|
|
||||||
|
2961
src/build.c
2961
src/build.c
File diff suppressed because it is too large
Load Diff
221
src/build.h
221
src/build.h
@ -21,24 +21,96 @@
|
|||||||
* $Id$
|
* $Id$
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/* * @file build.h Interface to the Build menu functionality. */
|
||||||
|
|
||||||
#ifndef GEANY_BUILD_H
|
#ifndef GEANY_BUILD_H
|
||||||
#define GEANY_BUILD_H 1
|
#define GEANY_BUILD_H 1
|
||||||
|
|
||||||
#define GEANY_BUILD_ERR_HIGHLIGHT_MAX 100
|
#define GEANY_BUILD_ERR_HIGHLIGHT_MAX 100
|
||||||
|
|
||||||
typedef enum /* Geany Build Options */
|
/* Order is important (see GBO_TO_GBG, GBO_TO_CMD below) */
|
||||||
|
/** Geany Known Build Commands.
|
||||||
|
* These commands are named after their default use.
|
||||||
|
* Only these commands can currently have keybindings.
|
||||||
|
**/
|
||||||
|
typedef enum
|
||||||
{
|
{
|
||||||
GBO_COMPILE,
|
GEANY_GBO_COMPILE, /**< default compile file */
|
||||||
GBO_BUILD,
|
GEANY_GBO_BUILD, /**< default build file */
|
||||||
GBO_MAKE_ALL,
|
GEANY_GBO_MAKE_ALL, /**< default make */
|
||||||
GBO_MAKE_CUSTOM,
|
GEANY_GBO_CUSTOM, /**< default make user specified target */
|
||||||
GBO_MAKE_OBJECT
|
GEANY_GBO_MAKE_OBJECT, /**< default make object, make %e.o */
|
||||||
|
GEANY_GBO_EXEC, /**< default execute ./%e */
|
||||||
|
GEANY_GBO_COUNT /**< count of how many */
|
||||||
} GeanyBuildType;
|
} GeanyBuildType;
|
||||||
|
|
||||||
|
/** Groups of Build menu items. */
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
GEANY_GBG_FT, /**< filetype items */
|
||||||
|
GEANY_GBG_NON_FT, /**< non filetype items.*/
|
||||||
|
GEANY_GBG_EXEC, /**< execute items */
|
||||||
|
GEANY_GBG_COUNT /**< count of groups. */
|
||||||
|
} GeanyBuildGroup;
|
||||||
|
|
||||||
|
/* include the fixed widgets in an array indexed by groups */
|
||||||
|
#define GBG_FIXED GEANY_GBG_COUNT
|
||||||
|
|
||||||
|
/** Convert @c GeanyBuildType to @c GeanyBuildGroup.
|
||||||
|
*
|
||||||
|
* This macro converts @c GeanyBuildType enum values (the "known" commands)
|
||||||
|
* to the group they are part of.
|
||||||
|
*
|
||||||
|
* @param gbo the @c GeanyBuildType value.
|
||||||
|
*
|
||||||
|
* @return the @c GeanyBuildGroup group that @a gbo is in.
|
||||||
|
*
|
||||||
|
* Note this is a macro so that it can be used in static initialisers.
|
||||||
|
**/
|
||||||
|
#define GBO_TO_GBG(gbo) ((gbo)>GEANY_GBO_EXEC?GEANY_GBG_COUNT:((gbo)>=GEANY_GBO_EXEC?GEANY_GBG_EXEC: \
|
||||||
|
((gbo)>=GEANY_GBO_MAKE_ALL?GEANY_GBG_NON_FT:GEANY_GBG_FT)))
|
||||||
|
|
||||||
|
/** Convert @c GeanyBuildType to command index.
|
||||||
|
*
|
||||||
|
* This macro converts @c GeanyBuildType enum values (the "known" commands)
|
||||||
|
* to the index within the group.
|
||||||
|
*
|
||||||
|
* @param gbo the @c GeanyBuildType value.
|
||||||
|
*
|
||||||
|
* @return the index of the @a gbo command in its group.
|
||||||
|
*
|
||||||
|
* Note this is a macro so that it can be used in static initialisers.
|
||||||
|
**/
|
||||||
|
#define GBO_TO_CMD(gbo) ((gbo)>=GEANY_GBO_COUNT?(gbo)-GEANY_GBO_COUNT:((gbo)>=GEANY_GBO_EXEC?(gbo)-GEANY_GBO_EXEC: \
|
||||||
|
((gbo)>=GEANY_GBO_MAKE_ALL?(gbo)-GEANY_GBO_MAKE_ALL:(gbo))))
|
||||||
|
|
||||||
|
enum GeanyBuildFixedMenuItems
|
||||||
|
{
|
||||||
|
GBF_NEXT_ERROR,
|
||||||
|
GBF_PREV_ERROR,
|
||||||
|
GBF_COMMANDS,
|
||||||
|
GBF_SEP_1,
|
||||||
|
GBF_SEP_2,
|
||||||
|
GBF_SEP_3,
|
||||||
|
GBF_SEP_4,
|
||||||
|
GBF_COUNT
|
||||||
|
};
|
||||||
|
|
||||||
|
/** Build menu item sources in increasing priority */
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
GEANY_BCS_DEF, /**< Default values. */
|
||||||
|
GEANY_BCS_FT, /**< System filetype values. */
|
||||||
|
GEANY_BCS_HOME_FT, /**< Filetypes in ~/.config/geany/filedefs */
|
||||||
|
GEANY_BCS_PREF, /**< Preferences file ~/.config/geany/geany.conf */
|
||||||
|
GEANY_BCS_PROJ, /**< Project file if open. */
|
||||||
|
GEANY_BCS_COUNT /**< Count of sources. */
|
||||||
|
} GeanyBuildSource;
|
||||||
|
|
||||||
typedef struct GeanyBuildInfo
|
typedef struct GeanyBuildInfo
|
||||||
{
|
{
|
||||||
GeanyBuildType type; /* current action(one of the above enumeration) */
|
GeanyBuildGroup grp;
|
||||||
|
gint cmd;
|
||||||
GPid pid; /* process id of the spawned process */
|
GPid pid; /* process id of the spawned process */
|
||||||
gchar *dir;
|
gchar *dir;
|
||||||
guint file_type_id;
|
guint file_type_id;
|
||||||
@ -48,37 +120,150 @@ typedef struct GeanyBuildInfo
|
|||||||
|
|
||||||
extern GeanyBuildInfo build_info;
|
extern GeanyBuildInfo build_info;
|
||||||
|
|
||||||
|
/** The entries of a command for a menu item */
|
||||||
|
typedef enum GeanyBuildCmdEntries
|
||||||
|
{
|
||||||
|
GEANY_BC_LABEL, /**< The menu item label, _ marks mnemonic */
|
||||||
|
GEANY_BC_COMMAND, /**< The command to run. */
|
||||||
|
GEANY_BC_WORKING_DIR, /**< The directory to run in */
|
||||||
|
GEANY_BC_CMDENTRIES_COUNT, /**< Count of entries */
|
||||||
|
} GeanyBuildCmdEntries;
|
||||||
|
|
||||||
|
/** The command for a menu item. */
|
||||||
|
typedef struct GeanyBuildCommand
|
||||||
|
{
|
||||||
|
/** Pointers to g_string values of the command entries.
|
||||||
|
* Must be freed if the pointer is changed. */
|
||||||
|
gchar *entries[GEANY_BC_CMDENTRIES_COUNT];
|
||||||
|
gboolean exists; /**< If the entries have valid values. */
|
||||||
|
gboolean changed; /**< Save on exit if @c changed, remove if not @c exist. */
|
||||||
|
gboolean old; /**< Converted from old format. */
|
||||||
|
} GeanyBuildCommand;
|
||||||
|
|
||||||
|
extern GeanyBuildCommand *non_ft_proj, *exec_proj; /* project command array pointers */
|
||||||
|
extern gchar *regex_proj; /* project non-fileregex string */
|
||||||
|
|
||||||
typedef struct BuildMenuItems
|
typedef struct BuildMenuItems
|
||||||
{
|
{
|
||||||
GtkWidget *menu;
|
GtkWidget *menu;
|
||||||
GtkWidget *item_compile;
|
GtkWidget **menu_item[GEANY_GBG_COUNT+1]; /* +1 for fixed items */
|
||||||
GtkWidget *item_link;
|
|
||||||
GtkWidget *item_make_all;
|
|
||||||
GtkWidget *item_make_custom;
|
|
||||||
GtkWidget *item_make_object;
|
|
||||||
GtkWidget *item_next_error;
|
|
||||||
GtkWidget *item_previous_error;
|
|
||||||
GtkWidget *item_exec;
|
|
||||||
GtkWidget *item_exec2;
|
|
||||||
GtkWidget *item_set_args;
|
|
||||||
} BuildMenuItems;
|
} BuildMenuItems;
|
||||||
|
|
||||||
|
/* a structure defining the destinations for a set of groups of commands & regex */
|
||||||
|
typedef struct BuildDestination
|
||||||
|
{
|
||||||
|
GeanyBuildCommand **dst[GEANY_GBG_COUNT];
|
||||||
|
gchar **fileregexstr;
|
||||||
|
gchar **nonfileregexstr;
|
||||||
|
} BuildDestination;
|
||||||
|
|
||||||
|
/* opaque pointers returned from build functions and passed back to them */
|
||||||
|
typedef struct TableFields *TableData;
|
||||||
|
|
||||||
void build_init(void);
|
void build_init(void);
|
||||||
|
|
||||||
void build_finalize(void);
|
void build_finalize(void);
|
||||||
|
|
||||||
|
/* menu configuration dialog functions */
|
||||||
|
GtkWidget *build_commands_table( GeanyDocument *doc, GeanyBuildSource dst, TableData *data, GeanyFiletype *ft );
|
||||||
|
|
||||||
|
gboolean build_read_commands( BuildDestination *dst, TableData data, gint response );
|
||||||
|
|
||||||
|
void build_free_fields( TableData data );
|
||||||
|
|
||||||
|
void build_set_non_ft_wd_to_proj(TableData table_data);
|
||||||
|
|
||||||
|
/* build response decode assistance function */
|
||||||
gboolean build_parse_make_dir(const gchar *string, gchar **prefix);
|
gboolean build_parse_make_dir(const gchar *string, gchar **prefix);
|
||||||
|
|
||||||
|
/* build menu functions */
|
||||||
|
|
||||||
|
/** Update the build menu to reflect changes in configuration or status.
|
||||||
|
*
|
||||||
|
* Sets the labels and number of visible items to match the highest
|
||||||
|
* priority configured commands. Also sets sensitivity if build commands are
|
||||||
|
* running and switches executes to stop when commands are running.
|
||||||
|
*
|
||||||
|
* @param doc The current document, if available, to save looking it up.
|
||||||
|
* If @c NULL it will be looked up.
|
||||||
|
*
|
||||||
|
* Call this after modifying any fields of a GeanyBuildCommand structure.
|
||||||
|
*
|
||||||
|
* @see Build Menu Configuration section of the Manual.
|
||||||
|
*
|
||||||
|
**/
|
||||||
|
|
||||||
void build_menu_update(GeanyDocument *doc);
|
void build_menu_update(GeanyDocument *doc);
|
||||||
|
|
||||||
BuildMenuItems *build_get_menu_items(gint filetype_idx);
|
|
||||||
|
|
||||||
void build_toolbutton_build_clicked(GtkAction *action, gpointer user_data);
|
void build_toolbutton_build_clicked(GtkAction *action, gpointer user_data);
|
||||||
|
|
||||||
|
/** Remove the specified Build menu item.
|
||||||
|
*
|
||||||
|
* Makes the specified menu item configuration no longer exist. This
|
||||||
|
* is different to setting fields to blank because the menu item
|
||||||
|
* will be deleted from the configuration file on saving
|
||||||
|
* (except the system filetypes settings @see Build Menu Configuration
|
||||||
|
* section of the Manual).
|
||||||
|
*
|
||||||
|
* @param src the source of the menu item to remove.
|
||||||
|
* @param grp the group of the command to remove.
|
||||||
|
* @param cmd the index (from 0) of the command within the group. A negative
|
||||||
|
* value will remove the whole group.
|
||||||
|
*
|
||||||
|
* If any parameter is out of range does nothing.
|
||||||
|
*
|
||||||
|
* @see build_menu_update
|
||||||
|
**/
|
||||||
|
|
||||||
|
void build_remove_menu_item(GeanyBuildSource src, GeanyBuildGroup grp, gint cmd);
|
||||||
|
|
||||||
|
/** Get the @a GeanyBuildCommand structure for the specified Build menu item.
|
||||||
|
*
|
||||||
|
* Get the command for any menu item specified by @a src, @a grp and @a cmd even if it is
|
||||||
|
* hidden by higher priority commands.
|
||||||
|
*
|
||||||
|
* @param src the source of the specified menu item.
|
||||||
|
* @param grp the group of the specified menu item.
|
||||||
|
* @param cmd the index of the command within the group.
|
||||||
|
*
|
||||||
|
* @return a pointer to the @a GeanyBuildCommand structure or @a NULL if it doesn't exist.
|
||||||
|
* This is a pointer to an internal structure and must not be freed.
|
||||||
|
*
|
||||||
|
* @see build_menu_update
|
||||||
|
**/
|
||||||
|
|
||||||
|
GeanyBuildCommand *build_get_menu_item(GeanyBuildSource src, GeanyBuildGroup grp, gint cmd);
|
||||||
|
|
||||||
|
/** Get the @a GeanyBuildCommand structure for the menu item.
|
||||||
|
*
|
||||||
|
* Get the current highest priority command specified by @a grp and @a cmd. This is the one
|
||||||
|
* that the menu item will use if activated.
|
||||||
|
*
|
||||||
|
* @param grp the group of the specified menu item.
|
||||||
|
* @param cmd the index of the command within the group.
|
||||||
|
* @param src pointer to @a gint to return which source provided the command. Ignored if @a NULL.
|
||||||
|
* Values are one of @a GeanyBuildSource but returns a signed type not the enum.
|
||||||
|
*
|
||||||
|
* @return a pointer to the @a GeanyBuildCommand structure or @a NULL if it doesn't exist.
|
||||||
|
* This is a pointer to an internal structure and must not be freed.
|
||||||
|
*
|
||||||
|
* @see build_menu_update
|
||||||
|
**/
|
||||||
|
|
||||||
|
GeanyBuildCommand *build_get_current_menu_item(GeanyBuildGroup grp, gint cmd, gint *src);
|
||||||
|
|
||||||
|
BuildMenuItems *build_get_menu_items(gint filetype_idx);
|
||||||
|
|
||||||
|
/* load and store menu configuration */
|
||||||
|
void build_load_menu( GKeyFile *config, GeanyBuildSource dst, gpointer ptr);
|
||||||
|
|
||||||
|
void build_save_menu( GKeyFile *config, gpointer ptr, GeanyBuildSource src);
|
||||||
|
|
||||||
|
void build_set_group_count(GeanyBuildGroup grp, gint count);
|
||||||
|
|
||||||
|
gint build_get_group_count(GeanyBuildGroup grp);
|
||||||
|
|
||||||
|
gchar **build_get_regex(GeanyBuildGroup grp, GeanyFiletype *ft, gint *from);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -1466,11 +1466,18 @@ on_insert_date_activate (GtkMenuItem *menuitem,
|
|||||||
gpointer user_data)
|
gpointer user_data)
|
||||||
{
|
{
|
||||||
GeanyDocument *doc = document_get_current();
|
GeanyDocument *doc = document_get_current();
|
||||||
gchar *format;
|
gchar *format = NULL;
|
||||||
gchar *time_str;
|
gchar *time_str;
|
||||||
|
|
||||||
g_return_if_fail(doc != NULL);
|
g_return_if_fail(doc != NULL);
|
||||||
|
|
||||||
|
/* set default value */
|
||||||
|
if (utils_str_equal("", ui_prefs.custom_date_format))
|
||||||
|
{
|
||||||
|
g_free(ui_prefs.custom_date_format);
|
||||||
|
ui_prefs.custom_date_format = g_strdup("%d.%m.%Y");
|
||||||
|
}
|
||||||
|
|
||||||
if (utils_str_equal(_("dd.mm.yyyy"), (gchar*) user_data))
|
if (utils_str_equal(_("dd.mm.yyyy"), (gchar*) user_data))
|
||||||
format = "%d.%m.%Y";
|
format = "%d.%m.%Y";
|
||||||
else if (utils_str_equal(_("mm.dd.yyyy"), (gchar*) user_data))
|
else if (utils_str_equal(_("mm.dd.yyyy"), (gchar*) user_data))
|
||||||
@ -1487,13 +1494,6 @@ on_insert_date_activate (GtkMenuItem *menuitem,
|
|||||||
format = ui_prefs.custom_date_format;
|
format = ui_prefs.custom_date_format;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* set default value */
|
|
||||||
if (utils_str_equal("", ui_prefs.custom_date_format))
|
|
||||||
{
|
|
||||||
g_free(ui_prefs.custom_date_format);
|
|
||||||
ui_prefs.custom_date_format = g_strdup("%d.%m.%Y");
|
|
||||||
}
|
|
||||||
|
|
||||||
dialogs_show_input(_("Custom Date Format"),
|
dialogs_show_input(_("Custom Date Format"),
|
||||||
_("Enter here a custom date and time format. You can use any conversion specifiers which can be used with the ANSI C strftime function."),
|
_("Enter here a custom date and time format. You can use any conversion specifiers which can be used with the ANSI C strftime function."),
|
||||||
ui_prefs.custom_date_format, FALSE, &on_custom_date_input_response);
|
ui_prefs.custom_date_format, FALSE, &on_custom_date_input_response);
|
||||||
@ -1866,7 +1866,7 @@ on_menu_open_selected_file1_activate (GtkMenuItem *menuitem,
|
|||||||
|
|
||||||
if (sel != NULL)
|
if (sel != NULL)
|
||||||
{
|
{
|
||||||
gchar *locale_filename, *filename;
|
gchar *locale_filename, *filename = NULL;
|
||||||
|
|
||||||
if (g_path_is_absolute(sel))
|
if (g_path_is_absolute(sel))
|
||||||
filename = g_strdup(sel);
|
filename = g_strdup(sel);
|
||||||
@ -1874,7 +1874,10 @@ on_menu_open_selected_file1_activate (GtkMenuItem *menuitem,
|
|||||||
{ /* relative filename, add the path of the current file */
|
{ /* relative filename, add the path of the current file */
|
||||||
gchar *path;
|
gchar *path;
|
||||||
|
|
||||||
path = g_path_get_dirname(doc->file_name);
|
path = utils_get_current_file_dir_utf8();
|
||||||
|
if (!path)
|
||||||
|
path = g_get_current_dir();
|
||||||
|
|
||||||
filename = g_build_path(G_DIR_SEPARATOR_S, path, sel, NULL);
|
filename = g_build_path(G_DIR_SEPARATOR_S, path, sel, NULL);
|
||||||
|
|
||||||
if (! g_file_test(filename, G_FILE_TEST_EXISTS) &&
|
if (! g_file_test(filename, G_FILE_TEST_EXISTS) &&
|
||||||
|
@ -1308,6 +1308,9 @@ GeanyDocument *document_open_file_full(GeanyDocument *doc, const gchar *filename
|
|||||||
if (reload)
|
if (reload)
|
||||||
ui_set_statusbar(TRUE, _("File %s reloaded."), display_filename);
|
ui_set_statusbar(TRUE, _("File %s reloaded."), display_filename);
|
||||||
else
|
else
|
||||||
|
/* For translators: this is the status window message for opening a file. %d is the number
|
||||||
|
* of the newly opened file, %s indicates whether the file is opened read-only
|
||||||
|
* (it is replaced with the string ", read-only"). */
|
||||||
msgwin_status_add(_("File %s opened(%d%s)."),
|
msgwin_status_add(_("File %s opened(%d%s)."),
|
||||||
display_filename, gtk_notebook_get_n_pages(GTK_NOTEBOOK(main_widgets.notebook)),
|
display_filename, gtk_notebook_get_n_pages(GTK_NOTEBOOK(main_widgets.notebook)),
|
||||||
(readonly) ? _(", read-only") : "");
|
(readonly) ? _(", read-only") : "");
|
||||||
|
@ -657,8 +657,12 @@ static void on_char_added(GeanyEditor *editor, SCNotification *nt)
|
|||||||
case ':': /* C/C++ class:: syntax */
|
case ':': /* C/C++ class:: syntax */
|
||||||
/* tag autocompletion */
|
/* tag autocompletion */
|
||||||
default:
|
default:
|
||||||
|
#if 0
|
||||||
if (! editor_start_auto_complete(editor, pos, FALSE))
|
if (! editor_start_auto_complete(editor, pos, FALSE))
|
||||||
request_reshowing_calltip(nt);
|
request_reshowing_calltip(nt);
|
||||||
|
#else
|
||||||
|
editor_start_auto_complete(editor, pos, FALSE);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
check_line_breaking(editor, pos, nt->ch);
|
check_line_breaking(editor, pos, nt->ch);
|
||||||
}
|
}
|
||||||
@ -4563,7 +4567,7 @@ static void setup_sci_keys(ScintillaObject *sci)
|
|||||||
sci_clear_cmdkey(sci, '\\' | (SCMOD_CTRL << 16)); /* Next word part */
|
sci_clear_cmdkey(sci, '\\' | (SCMOD_CTRL << 16)); /* Next word part */
|
||||||
sci_clear_cmdkey(sci, SCK_UP | (SCMOD_CTRL << 16)); /* scroll line up */
|
sci_clear_cmdkey(sci, SCK_UP | (SCMOD_CTRL << 16)); /* scroll line up */
|
||||||
sci_clear_cmdkey(sci, SCK_DOWN | (SCMOD_CTRL << 16)); /* scroll line down */
|
sci_clear_cmdkey(sci, SCK_DOWN | (SCMOD_CTRL << 16)); /* scroll line down */
|
||||||
sci_clear_cmdkey(sci, SCK_HOME); /* line start */
|
sci_clear_cmdkey(sci, SCK_HOME); /* line start */
|
||||||
sci_clear_cmdkey(sci, SCK_END); /* line end */
|
sci_clear_cmdkey(sci, SCK_END); /* line end */
|
||||||
sci_clear_cmdkey(sci, SCK_END | (SCMOD_ALT << 16)); /* visual line end */
|
sci_clear_cmdkey(sci, SCK_END | (SCMOD_ALT << 16)); /* visual line end */
|
||||||
|
|
||||||
|
105
src/filetypes.c
105
src/filetypes.c
@ -63,6 +63,7 @@ typedef struct GeanyFiletypePrivate
|
|||||||
#ifdef HAVE_REGCOMP
|
#ifdef HAVE_REGCOMP
|
||||||
regex_t error_regex;
|
regex_t error_regex;
|
||||||
gboolean error_regex_compiled;
|
gboolean error_regex_compiled;
|
||||||
|
gchar *last_string; /* last one compiled */
|
||||||
#endif
|
#endif
|
||||||
gboolean custom;
|
gboolean custom;
|
||||||
}
|
}
|
||||||
@ -624,8 +625,9 @@ static GeanyFiletype *filetype_new(void)
|
|||||||
GeanyFiletype *ft = g_new0(GeanyFiletype, 1);
|
GeanyFiletype *ft = g_new0(GeanyFiletype, 1);
|
||||||
|
|
||||||
ft->lang = -2; /* assume no tagmanager parser */
|
ft->lang = -2; /* assume no tagmanager parser */
|
||||||
ft->programs = g_new0(struct build_programs, 1);
|
/* ft->programs = g_new0(struct build_programs, 1);
|
||||||
ft->actions = g_new0(struct build_actions, 1);
|
ft->actions = g_new0(struct build_actions, 1);*/
|
||||||
|
ft->project_list_entry = -1; /* no entry */
|
||||||
|
|
||||||
ft->priv = g_new0(GeanyFiletypePrivate, 1);
|
ft->priv = g_new0(GeanyFiletypePrivate, 1);
|
||||||
return ft;
|
return ft;
|
||||||
@ -1142,12 +1144,9 @@ static void filetype_free(gpointer data, G_GNUC_UNUSED gpointer user_data)
|
|||||||
g_free(ft->comment_open);
|
g_free(ft->comment_open);
|
||||||
g_free(ft->comment_close);
|
g_free(ft->comment_close);
|
||||||
g_free(ft->context_action_cmd);
|
g_free(ft->context_action_cmd);
|
||||||
g_free(ft->programs->compiler);
|
g_free(ft->filecmds);
|
||||||
g_free(ft->programs->linker);
|
g_free(ft->ftdefcmds);
|
||||||
g_free(ft->programs->run_cmd);
|
g_free(ft->execcmds);
|
||||||
g_free(ft->programs->run_cmd2);
|
|
||||||
g_free(ft->programs);
|
|
||||||
g_free(ft->actions);
|
|
||||||
set_error_regex(ft, NULL);
|
set_error_regex(ft, NULL);
|
||||||
|
|
||||||
g_strfreev(ft->pattern);
|
g_strfreev(ft->pattern);
|
||||||
@ -1220,44 +1219,9 @@ static void load_settings(gint ft_id, GKeyFile *config, GKeyFile *configh)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* read build settings */
|
/* read build settings */
|
||||||
result = g_key_file_get_string(configh, "build_settings", "compiler", NULL);
|
build_load_menu( config, GEANY_BCS_FT, (gpointer)ft );
|
||||||
if (result == NULL) result = g_key_file_get_string(config, "build_settings", "compiler", NULL);
|
build_load_menu( configh, GEANY_BCS_HOME_FT, (gpointer)ft );
|
||||||
if (G_LIKELY(result != NULL))
|
|
||||||
{
|
|
||||||
filetypes[ft_id]->programs->compiler = result;
|
|
||||||
filetypes[ft_id]->actions->can_compile = TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
result = g_key_file_get_string(configh, "build_settings", "linker", NULL);
|
|
||||||
if (result == NULL) result = g_key_file_get_string(config, "build_settings", "linker", NULL);
|
|
||||||
if (result != NULL)
|
|
||||||
{
|
|
||||||
filetypes[ft_id]->programs->linker = result;
|
|
||||||
filetypes[ft_id]->actions->can_link = TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
result = g_key_file_get_string(configh, "build_settings", "run_cmd", NULL);
|
|
||||||
if (result == NULL) result = g_key_file_get_string(config, "build_settings", "run_cmd", NULL);
|
|
||||||
if (G_LIKELY(result != NULL))
|
|
||||||
{
|
|
||||||
filetypes[ft_id]->programs->run_cmd = result;
|
|
||||||
filetypes[ft_id]->actions->can_exec = TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
result = g_key_file_get_string(configh, "build_settings", "run_cmd2", NULL);
|
|
||||||
if (result == NULL) result = g_key_file_get_string(config, "build_settings", "run_cmd2", NULL);
|
|
||||||
if (result != NULL)
|
|
||||||
{
|
|
||||||
filetypes[ft_id]->programs->run_cmd2 = result;
|
|
||||||
filetypes[ft_id]->actions->can_exec = TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
result = g_key_file_get_string(configh, "build_settings", "error_regex", NULL);
|
|
||||||
if (result == NULL) result = g_key_file_get_string(config, "build_settings", "error_regex", NULL);
|
|
||||||
if (result != NULL)
|
|
||||||
{
|
|
||||||
set_error_regex(ft, result);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -1356,29 +1320,15 @@ void filetypes_save_commands(void)
|
|||||||
|
|
||||||
for (i = 1; i < filetypes_array->len; i++)
|
for (i = 1; i < filetypes_array->len; i++)
|
||||||
{
|
{
|
||||||
struct build_programs *bp = filetypes[i]->programs;
|
|
||||||
GKeyFile *config_home;
|
GKeyFile *config_home;
|
||||||
gchar *fname, *ext, *data;
|
gchar *fname, *ext, *data;
|
||||||
|
|
||||||
if (! bp->modified)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
ext = filetypes_get_conf_extension(i);
|
ext = filetypes_get_conf_extension(i);
|
||||||
fname = g_strconcat(conf_prefix, ext, NULL);
|
fname = g_strconcat(conf_prefix, ext, NULL);
|
||||||
g_free(ext);
|
g_free(ext);
|
||||||
|
|
||||||
config_home = g_key_file_new();
|
config_home = g_key_file_new();
|
||||||
g_key_file_load_from_file(config_home, fname, G_KEY_FILE_KEEP_COMMENTS, NULL);
|
g_key_file_load_from_file(config_home, fname, G_KEY_FILE_KEEP_COMMENTS, NULL);
|
||||||
|
build_save_menu(config_home, (gpointer)(filetypes[i]), GEANY_BCS_HOME_FT);
|
||||||
if (NZV(bp->compiler))
|
|
||||||
g_key_file_set_string(config_home, "build_settings", "compiler", bp->compiler);
|
|
||||||
if (NZV(bp->linker))
|
|
||||||
g_key_file_set_string(config_home, "build_settings", "linker", bp->linker);
|
|
||||||
if (NZV(bp->run_cmd))
|
|
||||||
g_key_file_set_string(config_home, "build_settings", "run_cmd", bp->run_cmd);
|
|
||||||
if (NZV(bp->run_cmd2))
|
|
||||||
g_key_file_set_string(config_home, "build_settings", "run_cmd2", bp->run_cmd2);
|
|
||||||
|
|
||||||
data = g_key_file_to_data(config_home, NULL, NULL);
|
data = g_key_file_to_data(config_home, NULL, NULL);
|
||||||
utils_write_file(fname, data);
|
utils_write_file(fname, data);
|
||||||
g_free(data);
|
g_free(data);
|
||||||
@ -1469,9 +1419,9 @@ static gchar *get_regex_match_string(const gchar *message, regmatch_t *pmatch, g
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void compile_regex(GeanyFiletype *ft, regex_t *regex)
|
static void compile_regex(GeanyFiletype *ft, regex_t *regex, gchar *regstr)
|
||||||
{
|
{
|
||||||
gint retval = regcomp(regex, ft->error_regex_string, REG_EXTENDED);
|
gint retval = regcomp(regex, regstr, REG_EXTENDED);
|
||||||
|
|
||||||
ft->priv->error_regex_compiled = (retval == 0); /* prevent recompilation */
|
ft->priv->error_regex_compiled = (retval == 0); /* prevent recompilation */
|
||||||
|
|
||||||
@ -1490,22 +1440,41 @@ static void compile_regex(GeanyFiletype *ft, regex_t *regex)
|
|||||||
gboolean filetypes_parse_error_message(GeanyFiletype *ft, const gchar *message,
|
gboolean filetypes_parse_error_message(GeanyFiletype *ft, const gchar *message,
|
||||||
gchar **filename, gint *line)
|
gchar **filename, gint *line)
|
||||||
{
|
{
|
||||||
|
gchar *regstr;
|
||||||
|
gchar **tmp;
|
||||||
|
GeanyDocument *doc;
|
||||||
|
#ifdef HAVE_REGCOMP
|
||||||
|
regex_t *regex;
|
||||||
|
regmatch_t pmatch[3];
|
||||||
|
#endif
|
||||||
|
if (ft == NULL)
|
||||||
|
{
|
||||||
|
doc = document_get_current();
|
||||||
|
if (doc != NULL)
|
||||||
|
ft = doc->file_type;
|
||||||
|
}
|
||||||
|
tmp = build_get_regex(build_info.grp, ft, NULL);
|
||||||
|
if (tmp == NULL)
|
||||||
|
return FALSE;
|
||||||
|
regstr = *tmp;
|
||||||
#ifndef HAVE_REGCOMP
|
#ifndef HAVE_REGCOMP
|
||||||
if (!NZV(ft->error_regex_string))
|
if (!NZV(regstr))
|
||||||
geany_debug("No regex support - maybe you should configure with --enable-gnu-regex!");
|
geany_debug("No regex support - maybe you should configure with --enable-gnu-regex!");
|
||||||
return FALSE;
|
return FALSE;
|
||||||
#else
|
#else
|
||||||
regex_t *regex = &ft->priv->error_regex;
|
regex = &ft->priv->error_regex;
|
||||||
regmatch_t pmatch[3];
|
|
||||||
|
|
||||||
*filename = NULL;
|
*filename = NULL;
|
||||||
*line = -1;
|
*line = -1;
|
||||||
|
|
||||||
if (!NZV(ft->error_regex_string))
|
if (!NZV(regstr))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
if (!ft->priv->error_regex_compiled)
|
if (!ft->priv->error_regex_compiled || regstr!=ft->priv->last_string)
|
||||||
compile_regex(ft, regex);
|
{
|
||||||
|
compile_regex(ft, regex, regstr);
|
||||||
|
ft->priv->last_string=regstr;
|
||||||
|
}
|
||||||
if (!ft->priv->error_regex_compiled) /* regex error */
|
if (!ft->priv->error_regex_compiled) /* regex error */
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
|
@ -27,11 +27,12 @@
|
|||||||
|
|
||||||
#include "Scintilla.h"
|
#include "Scintilla.h"
|
||||||
#include "ScintillaWidget.h"
|
#include "ScintillaWidget.h"
|
||||||
|
#include "build.h"
|
||||||
|
|
||||||
|
|
||||||
typedef enum
|
typedef enum
|
||||||
{
|
{
|
||||||
GEANY_FILETYPES_NONE = 0, /* first filetype is always None */
|
GEANY_FILETYPES_NONE = 0, /* first filetype is always None & must be 0 */
|
||||||
|
|
||||||
GEANY_FILETYPES_PHP,
|
GEANY_FILETYPES_PHP,
|
||||||
GEANY_FILETYPES_BASIC, /* FreeBasic */
|
GEANY_FILETYPES_BASIC, /* FreeBasic */
|
||||||
@ -99,23 +100,6 @@ GeanyFiletypeGroupID;
|
|||||||
#define FILETYPE_ID(filetype_ptr) \
|
#define FILETYPE_ID(filetype_ptr) \
|
||||||
(((filetype_ptr) != NULL) ? (filetype_ptr)->id : GEANY_FILETYPES_NONE)
|
(((filetype_ptr) != NULL) ? (filetype_ptr)->id : GEANY_FILETYPES_NONE)
|
||||||
|
|
||||||
|
|
||||||
struct build_actions
|
|
||||||
{
|
|
||||||
gboolean can_compile;
|
|
||||||
gboolean can_link;
|
|
||||||
gboolean can_exec;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct build_programs
|
|
||||||
{
|
|
||||||
gchar *compiler;
|
|
||||||
gchar *linker;
|
|
||||||
gchar *run_cmd;
|
|
||||||
gchar *run_cmd2;
|
|
||||||
gboolean modified;
|
|
||||||
};
|
|
||||||
|
|
||||||
/** Represents a filetype. */
|
/** Represents a filetype. */
|
||||||
struct GeanyFiletype
|
struct GeanyFiletype
|
||||||
{
|
{
|
||||||
@ -131,12 +115,22 @@ struct GeanyFiletype
|
|||||||
gchar *comment_open;
|
gchar *comment_open;
|
||||||
gchar *comment_close;
|
gchar *comment_close;
|
||||||
gboolean comment_use_indent;
|
gboolean comment_use_indent;
|
||||||
struct build_programs *programs;
|
GeanyFiletypeGroupID group;
|
||||||
struct build_actions *actions; /* TODO: make private */
|
|
||||||
GeanyFiletypeGroupID group;
|
|
||||||
gchar *error_regex_string;
|
gchar *error_regex_string;
|
||||||
|
|
||||||
struct GeanyFiletypePrivate *priv; /* must be last, append fields before this item */
|
struct GeanyFiletypePrivate *priv; /* must be last, append fields before this item */
|
||||||
|
#ifdef GEANY_PRIVATE
|
||||||
|
/* Do not use following fields in plugins */
|
||||||
|
GeanyBuildCommand *filecmds; /* these need to be visible since used in build.c so not in private part */
|
||||||
|
GeanyBuildCommand *ftdefcmds; /* filetype dependent defaults for non_ft commands */
|
||||||
|
GeanyBuildCommand *execcmds;
|
||||||
|
GeanyBuildCommand *homefilecmds;
|
||||||
|
GeanyBuildCommand *homeexeccmds;
|
||||||
|
GeanyBuildCommand *projfilecmds;
|
||||||
|
gint project_list_entry;
|
||||||
|
gchar *projerror_regex_string;
|
||||||
|
gchar *homeerror_regex_string;
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
extern GPtrArray *filetypes_array;
|
extern GPtrArray *filetypes_array;
|
||||||
|
@ -47,7 +47,7 @@
|
|||||||
* listed in the documentation should not be changed */
|
* listed in the documentation should not be changed */
|
||||||
#define GEANY_FILEDEFS_SUBDIR "filedefs"
|
#define GEANY_FILEDEFS_SUBDIR "filedefs"
|
||||||
#define GEANY_TEMPLATES_SUBDIR "templates"
|
#define GEANY_TEMPLATES_SUBDIR "templates"
|
||||||
#define GEANY_CODENAME "Kaine"
|
#define GEANY_CODENAME "Vellam"
|
||||||
#define GEANY_HOMEPAGE "http://www.geany.org/"
|
#define GEANY_HOMEPAGE "http://www.geany.org/"
|
||||||
#define GEANY_USE_WIN32_DIALOG 0
|
#define GEANY_USE_WIN32_DIALOG 0
|
||||||
#define GEANY_STRING_UNTITLED _("untitled")
|
#define GEANY_STRING_UNTITLED _("untitled")
|
||||||
@ -91,4 +91,9 @@ extern gboolean ignore_callback;
|
|||||||
/* prototype is here so that all files can use it. */
|
/* prototype is here so that all files can use it. */
|
||||||
void geany_debug(gchar const *format, ...) G_GNUC_PRINTF (1, 2);
|
void geany_debug(gchar const *format, ...) G_GNUC_PRINTF (1, 2);
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef G_GNUC_WARN_UNUSED_RESULT
|
||||||
|
#define G_GNUC_WARN_UNUSED_RESULT
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -2571,14 +2571,10 @@ create_prefs_dialog (void)
|
|||||||
GtkWidget *vbox2;
|
GtkWidget *vbox2;
|
||||||
GtkWidget *vbox33;
|
GtkWidget *vbox33;
|
||||||
GtkWidget *table1;
|
GtkWidget *table1;
|
||||||
GtkWidget *label11;
|
|
||||||
GtkWidget *label97;
|
GtkWidget *label97;
|
||||||
GtkWidget *label117;
|
GtkWidget *label117;
|
||||||
GtkWidget *entry_com_make;
|
|
||||||
GtkWidget *entry_com_term;
|
GtkWidget *entry_com_term;
|
||||||
GtkWidget *entry_browser;
|
GtkWidget *entry_browser;
|
||||||
GtkWidget *button_make;
|
|
||||||
GtkWidget *image285;
|
|
||||||
GtkWidget *button_term;
|
GtkWidget *button_term;
|
||||||
GtkWidget *image286;
|
GtkWidget *image286;
|
||||||
GtkWidget *button_browser;
|
GtkWidget *button_browser;
|
||||||
@ -4161,13 +4157,6 @@ create_prefs_dialog (void)
|
|||||||
gtk_table_set_row_spacings (GTK_TABLE (table1), 3);
|
gtk_table_set_row_spacings (GTK_TABLE (table1), 3);
|
||||||
gtk_table_set_col_spacings (GTK_TABLE (table1), 6);
|
gtk_table_set_col_spacings (GTK_TABLE (table1), 6);
|
||||||
|
|
||||||
label11 = gtk_label_new (_("Make:"));
|
|
||||||
gtk_widget_show (label11);
|
|
||||||
gtk_table_attach (GTK_TABLE (table1), label11, 0, 1, 0, 1,
|
|
||||||
(GtkAttachOptions) (GTK_FILL),
|
|
||||||
(GtkAttachOptions) (0), 0, 0);
|
|
||||||
gtk_misc_set_alignment (GTK_MISC (label11), 0, 0.5);
|
|
||||||
|
|
||||||
label97 = gtk_label_new (_("Terminal:"));
|
label97 = gtk_label_new (_("Terminal:"));
|
||||||
gtk_widget_show (label97);
|
gtk_widget_show (label97);
|
||||||
gtk_table_attach (GTK_TABLE (table1), label97, 0, 1, 1, 2,
|
gtk_table_attach (GTK_TABLE (table1), label97, 0, 1, 1, 2,
|
||||||
@ -4182,13 +4171,6 @@ create_prefs_dialog (void)
|
|||||||
(GtkAttachOptions) (0), 0, 0);
|
(GtkAttachOptions) (0), 0, 0);
|
||||||
gtk_misc_set_alignment (GTK_MISC (label117), 0, 0.5);
|
gtk_misc_set_alignment (GTK_MISC (label117), 0, 0.5);
|
||||||
|
|
||||||
entry_com_make = gtk_entry_new ();
|
|
||||||
gtk_widget_show (entry_com_make);
|
|
||||||
gtk_table_attach (GTK_TABLE (table1), entry_com_make, 1, 2, 0, 1,
|
|
||||||
(GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
|
|
||||||
(GtkAttachOptions) (0), 0, 0);
|
|
||||||
gtk_tooltips_set_tip (tooltips, entry_com_make, _("Path and options for the make tool"), NULL);
|
|
||||||
|
|
||||||
entry_com_term = gtk_entry_new ();
|
entry_com_term = gtk_entry_new ();
|
||||||
gtk_widget_show (entry_com_term);
|
gtk_widget_show (entry_com_term);
|
||||||
gtk_table_attach (GTK_TABLE (table1), entry_com_term, 1, 2, 1, 2,
|
gtk_table_attach (GTK_TABLE (table1), entry_com_term, 1, 2, 1, 2,
|
||||||
@ -4203,16 +4185,6 @@ create_prefs_dialog (void)
|
|||||||
(GtkAttachOptions) (0), 0, 0);
|
(GtkAttachOptions) (0), 0, 0);
|
||||||
gtk_tooltips_set_tip (tooltips, entry_browser, _("Path (and possibly additional arguments) to your favorite browser"), NULL);
|
gtk_tooltips_set_tip (tooltips, entry_browser, _("Path (and possibly additional arguments) to your favorite browser"), NULL);
|
||||||
|
|
||||||
button_make = gtk_button_new ();
|
|
||||||
gtk_widget_show (button_make);
|
|
||||||
gtk_table_attach (GTK_TABLE (table1), button_make, 2, 3, 0, 1,
|
|
||||||
(GtkAttachOptions) (GTK_FILL),
|
|
||||||
(GtkAttachOptions) (0), 0, 0);
|
|
||||||
|
|
||||||
image285 = gtk_image_new_from_stock ("gtk-open", GTK_ICON_SIZE_BUTTON);
|
|
||||||
gtk_widget_show (image285);
|
|
||||||
gtk_container_add (GTK_CONTAINER (button_make), image285);
|
|
||||||
|
|
||||||
button_term = gtk_button_new ();
|
button_term = gtk_button_new ();
|
||||||
gtk_widget_show (button_term);
|
gtk_widget_show (button_term);
|
||||||
gtk_table_attach (GTK_TABLE (table1), button_term, 2, 3, 1, 2,
|
gtk_table_attach (GTK_TABLE (table1), button_term, 2, 3, 1, 2,
|
||||||
@ -4912,14 +4884,10 @@ create_prefs_dialog (void)
|
|||||||
GLADE_HOOKUP_OBJECT (prefs_dialog, vbox2, "vbox2");
|
GLADE_HOOKUP_OBJECT (prefs_dialog, vbox2, "vbox2");
|
||||||
GLADE_HOOKUP_OBJECT (prefs_dialog, vbox33, "vbox33");
|
GLADE_HOOKUP_OBJECT (prefs_dialog, vbox33, "vbox33");
|
||||||
GLADE_HOOKUP_OBJECT (prefs_dialog, table1, "table1");
|
GLADE_HOOKUP_OBJECT (prefs_dialog, table1, "table1");
|
||||||
GLADE_HOOKUP_OBJECT (prefs_dialog, label11, "label11");
|
|
||||||
GLADE_HOOKUP_OBJECT (prefs_dialog, label97, "label97");
|
GLADE_HOOKUP_OBJECT (prefs_dialog, label97, "label97");
|
||||||
GLADE_HOOKUP_OBJECT (prefs_dialog, label117, "label117");
|
GLADE_HOOKUP_OBJECT (prefs_dialog, label117, "label117");
|
||||||
GLADE_HOOKUP_OBJECT (prefs_dialog, entry_com_make, "entry_com_make");
|
|
||||||
GLADE_HOOKUP_OBJECT (prefs_dialog, entry_com_term, "entry_com_term");
|
GLADE_HOOKUP_OBJECT (prefs_dialog, entry_com_term, "entry_com_term");
|
||||||
GLADE_HOOKUP_OBJECT (prefs_dialog, entry_browser, "entry_browser");
|
GLADE_HOOKUP_OBJECT (prefs_dialog, entry_browser, "entry_browser");
|
||||||
GLADE_HOOKUP_OBJECT (prefs_dialog, button_make, "button_make");
|
|
||||||
GLADE_HOOKUP_OBJECT (prefs_dialog, image285, "image285");
|
|
||||||
GLADE_HOOKUP_OBJECT (prefs_dialog, button_term, "button_term");
|
GLADE_HOOKUP_OBJECT (prefs_dialog, button_term, "button_term");
|
||||||
GLADE_HOOKUP_OBJECT (prefs_dialog, image286, "image286");
|
GLADE_HOOKUP_OBJECT (prefs_dialog, image286, "image286");
|
||||||
GLADE_HOOKUP_OBJECT (prefs_dialog, button_browser, "button_browser");
|
GLADE_HOOKUP_OBJECT (prefs_dialog, button_browser, "button_browser");
|
||||||
|
@ -25,9 +25,12 @@
|
|||||||
* Configurable keyboard shortcuts.
|
* Configurable keyboard shortcuts.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <gdk/gdkkeysyms.h>
|
|
||||||
|
|
||||||
#include "geany.h"
|
#include "geany.h"
|
||||||
|
|
||||||
|
#include <gdk/gdkkeysyms.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
#include "keybindings.h"
|
#include "keybindings.h"
|
||||||
#include "support.h"
|
#include "support.h"
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
@ -107,37 +110,55 @@ static void cb_func_switch_tablastused(guint key_id);
|
|||||||
static void cb_func_move_tab(guint key_id);
|
static void cb_func_move_tab(guint key_id);
|
||||||
|
|
||||||
static void add_popup_menu_accels(void);
|
static void add_popup_menu_accels(void);
|
||||||
static void apply_kb_accel(GeanyKeyGroup *group, GeanyKeyBinding *kb, gpointer user_data);
|
|
||||||
|
|
||||||
|
|
||||||
/* This is used to set default keybindings on startup but at this point we don't want to
|
/** Lookup a keybinding item.
|
||||||
* assign the keybinding to the menu_item (apply_kb_accel) otherwise it can't be overridden
|
* @param group Group.
|
||||||
* by user keybindings anymore */
|
* @param key_id Keybinding index for the group.
|
||||||
|
* @return The keybinding.
|
||||||
|
* @since 0.19. */
|
||||||
|
GeanyKeyBinding *keybindings_get_item(GeanyKeyGroup *group, gsize key_id)
|
||||||
|
{
|
||||||
|
g_assert(key_id < group->count);
|
||||||
|
|
||||||
|
return &group->keys[key_id];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* This is used to set default keybindings on startup.
|
||||||
|
* Menu accels are set in apply_kb_accel(). */
|
||||||
/** Simple convenience function to fill a GeanyKeyBinding struct item.
|
/** Simple convenience function to fill a GeanyKeyBinding struct item.
|
||||||
* @param group Group.
|
* @param group Group.
|
||||||
* @param key_id Keybinding index for the group.
|
* @param key_id Keybinding index for the group.
|
||||||
* @param callback Function to call when activated.
|
* @param callback Function to call when activated, or @c NULL.
|
||||||
* @param key (Lower case) default key, e.g. @c GDK_j, but usually 0 for unset.
|
* @param key (Lower case) default key, e.g. @c GDK_j, but usually 0 for unset.
|
||||||
* @param mod Default modifier, e.g. @c GDK_CONTROL_MASK, but usually 0 for unset.
|
* @param mod Default modifier, e.g. @c GDK_CONTROL_MASK, but usually 0 for unset.
|
||||||
* @param name Not duplicated - use a static string.
|
* @param kf_name Key name for the configuration file, such as @c "menu_new".
|
||||||
* @param label Currently not duplicated - use a static or heap-allocated (e.g. translated) string.
|
* @param label Label used in the preferences dialog keybindings tab.
|
||||||
* @param menu_item Optional widget to set an accelerator for, or @c NULL. */
|
* @param menu_item Optional widget to set an accelerator for, or @c NULL.
|
||||||
void keybindings_set_item(GeanyKeyGroup *group, gsize key_id,
|
* @return The keybinding - normally this is ignored. */
|
||||||
|
GeanyKeyBinding *keybindings_set_item(GeanyKeyGroup *group, gsize key_id,
|
||||||
GeanyKeyCallback callback, guint key, GdkModifierType mod,
|
GeanyKeyCallback callback, guint key, GdkModifierType mod,
|
||||||
gchar *name, gchar *label, GtkWidget *menu_item)
|
gchar *kf_name, gchar *label, GtkWidget *menu_item)
|
||||||
{
|
{
|
||||||
GeanyKeyBinding *kb;
|
GeanyKeyBinding *kb = keybindings_get_item(group, key_id);
|
||||||
|
|
||||||
g_assert(key_id < group->count);
|
if (group->plugin)
|
||||||
|
{
|
||||||
kb = &group->keys[key_id];
|
/* some plugins e.g. GeanyLua need these fields duplicated */
|
||||||
|
setptr(kb->name, g_strdup(kf_name));
|
||||||
kb->name = name;
|
setptr(kb->label, g_strdup(label));
|
||||||
kb->label = label;
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
kb->name = kf_name;
|
||||||
|
kb->label = label;
|
||||||
|
}
|
||||||
kb->key = key;
|
kb->key = key;
|
||||||
kb->mods = mod;
|
kb->mods = mod;
|
||||||
kb->callback = callback;
|
kb->callback = callback;
|
||||||
kb->menu_item = menu_item;
|
kb->menu_item = menu_item;
|
||||||
|
return kb;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -488,8 +509,6 @@ static void init_default_kb(void)
|
|||||||
0, 0, "build_previouserror", _("Previous error"), NULL);
|
0, 0, "build_previouserror", _("Previous error"), NULL);
|
||||||
keybindings_set_item(group, GEANY_KEYS_BUILD_RUN, cb_func_build_action,
|
keybindings_set_item(group, GEANY_KEYS_BUILD_RUN, cb_func_build_action,
|
||||||
GDK_F5, 0, "build_run", _("Run"), NULL);
|
GDK_F5, 0, "build_run", _("Run"), NULL);
|
||||||
keybindings_set_item(group, GEANY_KEYS_BUILD_RUN2, cb_func_build_action,
|
|
||||||
0, 0, "build_run2", _("Run (alternative command)"), NULL);
|
|
||||||
keybindings_set_item(group, GEANY_KEYS_BUILD_OPTIONS, cb_func_build_action,
|
keybindings_set_item(group, GEANY_KEYS_BUILD_OPTIONS, cb_func_build_action,
|
||||||
0, 0, "build_options", _("Build options"), NULL);
|
0, 0, "build_options", _("Build options"), NULL);
|
||||||
|
|
||||||
@ -568,16 +587,6 @@ void keybindings_init(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void apply_kb_accel(GeanyKeyGroup *group, GeanyKeyBinding *kb, gpointer user_data)
|
|
||||||
{
|
|
||||||
if (kb->key != 0 && kb->menu_item)
|
|
||||||
{
|
|
||||||
gtk_widget_add_accelerator(kb->menu_item, "activate", kb_accel_group,
|
|
||||||
kb->key, kb->mods, GTK_ACCEL_VISIBLE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
typedef void (*KBItemCallback) (GeanyKeyGroup *group, GeanyKeyBinding *kb, gpointer user_data);
|
typedef void (*KBItemCallback) (GeanyKeyGroup *group, GeanyKeyBinding *kb, gpointer user_data);
|
||||||
|
|
||||||
static void keybindings_foreach(KBItemCallback cb, gpointer user_data)
|
static void keybindings_foreach(KBItemCallback cb, gpointer user_data)
|
||||||
@ -632,36 +641,42 @@ static void load_user_kb(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void apply_kb_accel(GeanyKeyGroup *group, GeanyKeyBinding *kb, gpointer user_data)
|
||||||
|
{
|
||||||
|
if (kb->key != 0 && kb->menu_item)
|
||||||
|
{
|
||||||
|
gtk_widget_add_accelerator(kb->menu_item, "activate", kb_accel_group,
|
||||||
|
kb->key, kb->mods, GTK_ACCEL_VISIBLE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void keybindings_load_keyfile(void)
|
void keybindings_load_keyfile(void)
|
||||||
{
|
{
|
||||||
load_user_kb();
|
load_user_kb();
|
||||||
add_popup_menu_accels();
|
add_popup_menu_accels();
|
||||||
|
|
||||||
/* set menu accels now, after user keybindings have been read and processed
|
/* set menu accels now, after user keybindings have been read */
|
||||||
* if we would set it before, user keybindings could not override menu item's default
|
|
||||||
* keybindings */
|
|
||||||
keybindings_foreach(apply_kb_accel, NULL);
|
keybindings_foreach(apply_kb_accel, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void add_menu_accel(GeanyKeyGroup *group, guint kb_id,
|
static void add_menu_accel(GeanyKeyGroup *group, guint kb_id, GtkWidget *menuitem)
|
||||||
GtkAccelGroup *accel_group, GtkWidget *menuitem)
|
|
||||||
{
|
{
|
||||||
GeanyKeyBinding *kb = &group->keys[kb_id];
|
GeanyKeyBinding *kb = &group->keys[kb_id];
|
||||||
|
|
||||||
if (kb->key != 0)
|
if (kb->key != 0)
|
||||||
gtk_widget_add_accelerator(menuitem, "activate", accel_group,
|
gtk_widget_add_accelerator(menuitem, "activate", kb_accel_group,
|
||||||
kb->key, kb->mods, GTK_ACCEL_VISIBLE);
|
kb->key, kb->mods, GTK_ACCEL_VISIBLE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#define GEANY_ADD_POPUP_ACCEL(kb_id, wid) \
|
#define GEANY_ADD_POPUP_ACCEL(kb_id, wid) \
|
||||||
add_menu_accel(group, kb_id, accel_group, ui_lookup_widget(main_widgets.editor_menu, G_STRINGIFY(wid)))
|
add_menu_accel(group, kb_id, ui_lookup_widget(main_widgets.editor_menu, G_STRINGIFY(wid)))
|
||||||
|
|
||||||
/* set the menu item accelerator shortcuts (just for visibility, they are handled anyway) */
|
/* set the menu item accelerator shortcuts (just for visibility, they are handled anyway) */
|
||||||
static void add_popup_menu_accels(void)
|
static void add_popup_menu_accels(void)
|
||||||
{
|
{
|
||||||
GtkAccelGroup *accel_group = gtk_accel_group_new();
|
|
||||||
GeanyKeyGroup *group;
|
GeanyKeyGroup *group;
|
||||||
|
|
||||||
group = g_ptr_array_index(keybinding_groups, GEANY_KEY_GROUP_EDITOR);
|
group = g_ptr_array_index(keybinding_groups, GEANY_KEY_GROUP_EDITOR);
|
||||||
@ -698,8 +713,6 @@ static void add_popup_menu_accels(void)
|
|||||||
GEANY_ADD_POPUP_ACCEL(GEANY_KEYS_FORMAT_SENDTOVTE, send_selection_to_vte2);
|
GEANY_ADD_POPUP_ACCEL(GEANY_KEYS_FORMAT_SENDTOVTE, send_selection_to_vte2);
|
||||||
|
|
||||||
/* the build menu items are set if the build menus are created */
|
/* the build menu items are set if the build menus are created */
|
||||||
|
|
||||||
gtk_window_add_accel_group(GTK_WINDOW(main_widgets.window), accel_group);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -1077,6 +1090,37 @@ static gboolean check_vte(GdkModifierType state, guint keyval)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* Map the keypad keys to their equivalent functions (taken from ScintillaGTK.cxx) */
|
||||||
|
static guint key_kp_translate(guint key_in)
|
||||||
|
{
|
||||||
|
switch (key_in)
|
||||||
|
{
|
||||||
|
case GDK_KP_Down:
|
||||||
|
return GDK_Down;
|
||||||
|
case GDK_KP_Up:
|
||||||
|
return GDK_Up;
|
||||||
|
case GDK_KP_Left:
|
||||||
|
return GDK_Left;
|
||||||
|
case GDK_KP_Right:
|
||||||
|
return GDK_Right;
|
||||||
|
case GDK_KP_Home:
|
||||||
|
return GDK_Home;
|
||||||
|
case GDK_KP_End:
|
||||||
|
return GDK_End;
|
||||||
|
case GDK_KP_Page_Up:
|
||||||
|
return GDK_Page_Up;
|
||||||
|
case GDK_KP_Page_Down:
|
||||||
|
return GDK_Page_Down;
|
||||||
|
case GDK_KP_Delete:
|
||||||
|
return GDK_Delete;
|
||||||
|
case GDK_KP_Insert:
|
||||||
|
return GDK_Insert;
|
||||||
|
default:
|
||||||
|
return key_in;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* central keypress event handler, almost all keypress events go to this function */
|
/* central keypress event handler, almost all keypress events go to this function */
|
||||||
static gboolean on_key_press_event(GtkWidget *widget, GdkEventKey *ev, gpointer user_data)
|
static gboolean on_key_press_event(GtkWidget *widget, GdkEventKey *ev, gpointer user_data)
|
||||||
{
|
{
|
||||||
@ -1095,12 +1139,14 @@ static gboolean on_key_press_event(GtkWidget *widget, GdkEventKey *ev, gpointer
|
|||||||
|
|
||||||
keyval = ev->keyval;
|
keyval = ev->keyval;
|
||||||
state = ev->state & gtk_accelerator_get_default_mod_mask();
|
state = ev->state & gtk_accelerator_get_default_mod_mask();
|
||||||
|
|
||||||
/* hack to get around that CTRL+Shift+r results in GDK_R not GDK_r */
|
/* hack to get around that CTRL+Shift+r results in GDK_R not GDK_r */
|
||||||
if ((ev->state & GDK_SHIFT_MASK) || (ev->state & GDK_LOCK_MASK))
|
if ((ev->state & GDK_SHIFT_MASK) || (ev->state & GDK_LOCK_MASK))
|
||||||
if (keyval >= GDK_A && keyval <= GDK_Z)
|
if (keyval >= GDK_A && keyval <= GDK_Z)
|
||||||
keyval += GDK_a - GDK_A;
|
keyval += GDK_a - GDK_A;
|
||||||
|
|
||||||
|
if (keyval >= GDK_KP_Space && keyval < GDK_KP_Equal)
|
||||||
|
keyval = key_kp_translate(keyval);
|
||||||
|
|
||||||
/*geany_debug("%d (%d) %d (%d)", keyval, ev->keyval, state, ev->state);*/
|
/*geany_debug("%d (%d) %d (%d)", keyval, ev->keyval, state, ev->state);*/
|
||||||
|
|
||||||
/* special cases */
|
/* special cases */
|
||||||
@ -1112,7 +1158,6 @@ static gboolean on_key_press_event(GtkWidget *widget, GdkEventKey *ev, gpointer
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
if (check_menu_key(doc, keyval, state, ev->time))
|
if (check_menu_key(doc, keyval, state, ev->time))
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
ignore_keybinding = FALSE;
|
ignore_keybinding = FALSE;
|
||||||
for (g = 0; g < keybinding_groups->len; g++)
|
for (g = 0; g < keybinding_groups->len; g++)
|
||||||
{
|
{
|
||||||
@ -1368,38 +1413,35 @@ static void cb_func_build_action(guint key_id)
|
|||||||
if (!GTK_WIDGET_IS_SENSITIVE(ui_lookup_widget(main_widgets.window, "menu_build1")))
|
if (!GTK_WIDGET_IS_SENSITIVE(ui_lookup_widget(main_widgets.window, "menu_build1")))
|
||||||
return;
|
return;
|
||||||
menu_items = build_get_menu_items(doc->file_type->id);
|
menu_items = build_get_menu_items(doc->file_type->id);
|
||||||
|
/* TODO make it a table??*/
|
||||||
switch (key_id)
|
switch (key_id)
|
||||||
{
|
{
|
||||||
case GEANY_KEYS_BUILD_COMPILE:
|
case GEANY_KEYS_BUILD_COMPILE:
|
||||||
item = menu_items->item_compile;
|
item = menu_items->menu_item[GEANY_GBG_FT][GBO_TO_CMD(GEANY_GBO_COMPILE)];
|
||||||
break;
|
break;
|
||||||
case GEANY_KEYS_BUILD_LINK:
|
case GEANY_KEYS_BUILD_LINK:
|
||||||
item = menu_items->item_link;
|
item = menu_items->menu_item[GEANY_GBG_FT][GBO_TO_CMD(GEANY_GBO_BUILD)];
|
||||||
break;
|
break;
|
||||||
case GEANY_KEYS_BUILD_MAKE:
|
case GEANY_KEYS_BUILD_MAKE:
|
||||||
item = menu_items->item_make_all;
|
item = menu_items->menu_item[GEANY_GBG_NON_FT][GBO_TO_CMD(GEANY_GBO_MAKE_ALL)];
|
||||||
break;
|
break;
|
||||||
case GEANY_KEYS_BUILD_MAKEOWNTARGET:
|
case GEANY_KEYS_BUILD_MAKEOWNTARGET:
|
||||||
item = menu_items->item_make_custom;
|
item = menu_items->menu_item[GEANY_GBG_NON_FT][GBO_TO_CMD(GEANY_GBO_CUSTOM)];
|
||||||
break;
|
break;
|
||||||
case GEANY_KEYS_BUILD_MAKEOBJECT:
|
case GEANY_KEYS_BUILD_MAKEOBJECT:
|
||||||
item = menu_items->item_make_object;
|
item = menu_items->menu_item[GEANY_GBG_NON_FT][GBO_TO_CMD(GEANY_GBO_MAKE_OBJECT)];
|
||||||
break;
|
break;
|
||||||
case GEANY_KEYS_BUILD_NEXTERROR:
|
case GEANY_KEYS_BUILD_NEXTERROR:
|
||||||
item = menu_items->item_next_error;
|
item = menu_items->menu_item[GBG_FIXED][GBF_NEXT_ERROR];
|
||||||
break;
|
break;
|
||||||
case GEANY_KEYS_BUILD_PREVIOUSERROR:
|
case GEANY_KEYS_BUILD_PREVIOUSERROR:
|
||||||
item = menu_items->item_previous_error;
|
item = menu_items->menu_item[GBG_FIXED][GBF_PREV_ERROR];
|
||||||
break;
|
break;
|
||||||
case GEANY_KEYS_BUILD_RUN:
|
case GEANY_KEYS_BUILD_RUN:
|
||||||
item = menu_items->item_exec;
|
item = menu_items->menu_item[GEANY_GBG_EXEC][GBO_TO_CMD(GEANY_GBO_EXEC)];
|
||||||
break;
|
|
||||||
case GEANY_KEYS_BUILD_RUN2:
|
|
||||||
item = menu_items->item_exec2;
|
|
||||||
break;
|
break;
|
||||||
case GEANY_KEYS_BUILD_OPTIONS:
|
case GEANY_KEYS_BUILD_OPTIONS:
|
||||||
item = menu_items->item_set_args;
|
item = menu_items->menu_item[GBG_FIXED][GBF_COMMANDS];
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
item = NULL;
|
item = NULL;
|
||||||
@ -2235,3 +2277,63 @@ static void cb_func_insert_action(guint key_id)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* update key combination */
|
||||||
|
void keybindings_update_combo(GeanyKeyBinding *kb, guint key, GdkModifierType mods)
|
||||||
|
{
|
||||||
|
GtkWidget *widget = kb->menu_item;
|
||||||
|
|
||||||
|
if (widget && kb->key)
|
||||||
|
gtk_widget_remove_accelerator(widget, kb_accel_group, kb->key, kb->mods);
|
||||||
|
|
||||||
|
kb->key = key;
|
||||||
|
kb->mods = mods;
|
||||||
|
|
||||||
|
if (widget && kb->key)
|
||||||
|
gtk_widget_add_accelerator(widget, "activate", kb_accel_group,
|
||||||
|
kb->key, kb->mods, GTK_ACCEL_VISIBLE);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* used for plugins */
|
||||||
|
GeanyKeyGroup *keybindings_set_group(GeanyKeyGroup *group, const gchar *section_name,
|
||||||
|
const gchar *label, gsize count, GeanyKeyGroupCallback callback)
|
||||||
|
{
|
||||||
|
g_return_val_if_fail(section_name, NULL);
|
||||||
|
g_return_val_if_fail(count, NULL);
|
||||||
|
g_return_val_if_fail(!callback, NULL);
|
||||||
|
|
||||||
|
/* prevent conflict with core bindings */
|
||||||
|
g_return_val_if_fail(!g_str_equal(section_name, keybindings_keyfile_group_name), NULL);
|
||||||
|
|
||||||
|
if (!group)
|
||||||
|
group = g_new0(GeanyKeyGroup, 1);
|
||||||
|
|
||||||
|
if (!group->keys || count > group->count)
|
||||||
|
{
|
||||||
|
/* allow resizing existing array of keys */
|
||||||
|
group->keys = g_renew(GeanyKeyBinding, group->keys, count);
|
||||||
|
memset(group->keys + group->count, 0, (count - group->count) * sizeof(GeanyKeyBinding));
|
||||||
|
}
|
||||||
|
group->plugin = TRUE;
|
||||||
|
add_kb_group(group, section_name, label, count, group->keys);
|
||||||
|
return group;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* used for plugins */
|
||||||
|
void keybindings_free_group(GeanyKeyGroup *group)
|
||||||
|
{
|
||||||
|
GeanyKeyBinding *kb;
|
||||||
|
|
||||||
|
g_assert(group->plugin);
|
||||||
|
|
||||||
|
foreach_c_array(kb, group->keys, group->count)
|
||||||
|
{
|
||||||
|
g_free(kb->name);
|
||||||
|
g_free(kb->label);
|
||||||
|
}
|
||||||
|
g_free(group->keys);
|
||||||
|
g_ptr_array_remove_fast(keybinding_groups, group);
|
||||||
|
g_free(group);
|
||||||
|
}
|
||||||
|
@ -31,32 +31,37 @@
|
|||||||
#define GEANY_KEYBINDINGS_H 1
|
#define GEANY_KEYBINDINGS_H 1
|
||||||
|
|
||||||
|
|
||||||
/** Function pointer type used for keybinding callbacks */
|
/** Function pointer type used for keybinding callbacks. */
|
||||||
typedef void (*GeanyKeyCallback) (guint key_id);
|
typedef void (*GeanyKeyCallback) (guint key_id);
|
||||||
|
|
||||||
/** Represents a single keybinding action */
|
/** Represents a single keybinding action.
|
||||||
/* Note: name and label are not const strings so plugins can set them to malloc'd strings
|
* Use keybindings_set_item() to set. */
|
||||||
* and free them in cleanup(). */
|
|
||||||
typedef struct GeanyKeyBinding
|
typedef struct GeanyKeyBinding
|
||||||
{
|
{
|
||||||
guint key; /**< Key value in lower-case, such as @c GDK_a */
|
guint key; /**< Key value in lower-case, such as @c GDK_a or 0 */
|
||||||
GdkModifierType mods; /**< Modifier keys, such as @c GDK_CONTROL_MASK */
|
GdkModifierType mods; /**< Modifier keys, such as @c GDK_CONTROL_MASK or 0 */
|
||||||
gchar *name; /**< Key name for the configuration file, such as @c "menu_new" */
|
gchar *name; /**< Key name for the configuration file, such as @c "menu_new" */
|
||||||
gchar *label; /**< Label used in the preferences dialog keybindings tab */
|
gchar *label; /**< Label used in the preferences dialog keybindings tab */
|
||||||
GeanyKeyCallback callback; /**< Callback function called when the key combination is pressed */
|
GeanyKeyCallback callback; /**< Function called when the key combination is pressed, or @c NULL */
|
||||||
GtkWidget *menu_item; /**< Menu item widget for setting the menu accelerator */
|
GtkWidget *menu_item; /**< Optional widget to set an accelerator for, or @c NULL */
|
||||||
} GeanyKeyBinding;
|
}
|
||||||
|
GeanyKeyBinding;
|
||||||
|
|
||||||
/** A collection of keybindings grouped together. */
|
/** A collection of keybindings grouped together. */
|
||||||
typedef struct GeanyKeyGroup
|
typedef struct GeanyKeyGroup GeanyKeyGroup;
|
||||||
|
|
||||||
|
/* Plugins should not set these fields. */
|
||||||
|
#ifdef GEANY_PRIVATE
|
||||||
|
struct GeanyKeyGroup
|
||||||
{
|
{
|
||||||
const gchar *name; /**< Group name used in the configuration file, such as @c "html_chars" */
|
const gchar *name; /* Group name used in the configuration file, such as @c "html_chars" */
|
||||||
const gchar *label; /**< Group label used in the preferences dialog keybindings tab */
|
const gchar *label; /* Group label used in the preferences dialog keybindings tab */
|
||||||
gsize count; /**< Count of GeanyKeyBinding structs in @c keys */
|
gsize count; /* number of keybindings the group holds */
|
||||||
GeanyKeyBinding *keys; /**< Fixed array of GeanyKeyBinding structs */
|
GeanyKeyBinding *keys; /* array of GeanyKeyBinding structs */
|
||||||
}
|
gboolean plugin; /* used by plugin */
|
||||||
GeanyKeyGroup;
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
extern GPtrArray *keybinding_groups; /* array of GeanyKeyGroup pointers */
|
extern GPtrArray *keybinding_groups; /* array of GeanyKeyGroup pointers */
|
||||||
|
|
||||||
@ -293,7 +298,6 @@ enum
|
|||||||
GEANY_KEYS_BUILD_NEXTERROR,
|
GEANY_KEYS_BUILD_NEXTERROR,
|
||||||
GEANY_KEYS_BUILD_PREVIOUSERROR,
|
GEANY_KEYS_BUILD_PREVIOUSERROR,
|
||||||
GEANY_KEYS_BUILD_RUN,
|
GEANY_KEYS_BUILD_RUN,
|
||||||
GEANY_KEYS_BUILD_RUN2,
|
|
||||||
GEANY_KEYS_BUILD_OPTIONS,
|
GEANY_KEYS_BUILD_OPTIONS,
|
||||||
GEANY_KEYS_BUILD_COUNT
|
GEANY_KEYS_BUILD_COUNT
|
||||||
};
|
};
|
||||||
@ -319,10 +323,22 @@ void keybindings_load_keyfile(void);
|
|||||||
|
|
||||||
void keybindings_free(void);
|
void keybindings_free(void);
|
||||||
|
|
||||||
void keybindings_set_item(GeanyKeyGroup *group, gsize key_id,
|
/** Function pointer type used for keybinding group callbacks. */
|
||||||
|
typedef gboolean (*GeanyKeyGroupCallback) (guint key_id);
|
||||||
|
|
||||||
|
GeanyKeyGroup *keybindings_set_group(GeanyKeyGroup *group, const gchar *section_name,
|
||||||
|
const gchar *label, gsize count, GeanyKeyGroupCallback callback) G_GNUC_WARN_UNUSED_RESULT;
|
||||||
|
|
||||||
|
void keybindings_free_group(GeanyKeyGroup *group);
|
||||||
|
|
||||||
|
GeanyKeyBinding *keybindings_set_item(GeanyKeyGroup *group, gsize key_id,
|
||||||
GeanyKeyCallback callback, guint key, GdkModifierType mod,
|
GeanyKeyCallback callback, guint key, GdkModifierType mod,
|
||||||
gchar *name, gchar *label, GtkWidget *menu_item);
|
gchar *name, gchar *label, GtkWidget *menu_item);
|
||||||
|
|
||||||
|
GeanyKeyBinding *keybindings_get_item(GeanyKeyGroup *group, gsize key_id);
|
||||||
|
|
||||||
|
void keybindings_update_combo(GeanyKeyBinding *kb, guint key, GdkModifierType mods);
|
||||||
|
|
||||||
void keybindings_send_command(guint group_id, guint key_id);
|
void keybindings_send_command(guint group_id, guint key_id);
|
||||||
|
|
||||||
GeanyKeyBinding *keybindings_lookup_item(guint group_id, guint key_id);
|
GeanyKeyBinding *keybindings_lookup_item(guint group_id, guint key_id);
|
||||||
|
@ -401,12 +401,14 @@ static void save_dialog_prefs(GKeyFile *config)
|
|||||||
g_key_file_set_string(config, PACKAGE, "pref_template_datetime", template_prefs.datetime_format);
|
g_key_file_set_string(config, PACKAGE, "pref_template_datetime", template_prefs.datetime_format);
|
||||||
|
|
||||||
/* tools settings */
|
/* tools settings */
|
||||||
g_key_file_set_string(config, "tools", "make_cmd", tool_prefs.make_cmd ? tool_prefs.make_cmd : "");
|
|
||||||
g_key_file_set_string(config, "tools", "term_cmd", tool_prefs.term_cmd ? tool_prefs.term_cmd : "");
|
g_key_file_set_string(config, "tools", "term_cmd", tool_prefs.term_cmd ? tool_prefs.term_cmd : "");
|
||||||
g_key_file_set_string(config, "tools", "browser_cmd", tool_prefs.browser_cmd ? tool_prefs.browser_cmd : "");
|
g_key_file_set_string(config, "tools", "browser_cmd", tool_prefs.browser_cmd ? tool_prefs.browser_cmd : "");
|
||||||
g_key_file_set_string(config, "tools", "grep_cmd", tool_prefs.grep_cmd ? tool_prefs.grep_cmd : "");
|
g_key_file_set_string(config, "tools", "grep_cmd", tool_prefs.grep_cmd ? tool_prefs.grep_cmd : "");
|
||||||
g_key_file_set_string(config, PACKAGE, "context_action_cmd", tool_prefs.context_action_cmd);
|
g_key_file_set_string(config, PACKAGE, "context_action_cmd", tool_prefs.context_action_cmd);
|
||||||
|
|
||||||
|
/* build menu */
|
||||||
|
build_save_menu( config, NULL, GEANY_BCS_PREF );
|
||||||
|
|
||||||
/* printing */
|
/* printing */
|
||||||
g_key_file_set_string(config, "printing", "print_cmd", printing_prefs.external_print_cmd ? printing_prefs.external_print_cmd : "");
|
g_key_file_set_string(config, "printing", "print_cmd", printing_prefs.external_print_cmd ? printing_prefs.external_print_cmd : "");
|
||||||
g_key_file_set_boolean(config, "printing", "use_gtk_printing", printing_prefs.use_gtk_printing);
|
g_key_file_set_boolean(config, "printing", "use_gtk_printing", printing_prefs.use_gtk_printing);
|
||||||
@ -764,13 +766,18 @@ static void load_dialog_prefs(GKeyFile *config)
|
|||||||
template_prefs.datetime_format = utils_get_setting_string(config, PACKAGE, "pref_template_datetime", "%d.%m.%Y %H:%M:%S %Z");
|
template_prefs.datetime_format = utils_get_setting_string(config, PACKAGE, "pref_template_datetime", "%d.%m.%Y %H:%M:%S %Z");
|
||||||
|
|
||||||
/* tools */
|
/* tools */
|
||||||
tool_prefs.make_cmd = utils_get_setting_string(config, "tools", "make_cmd", GEANY_DEFAULT_TOOLS_MAKE);
|
|
||||||
tool_prefs.term_cmd = utils_get_setting_string(config, "tools", "term_cmd", GEANY_DEFAULT_TOOLS_TERMINAL);
|
tool_prefs.term_cmd = utils_get_setting_string(config, "tools", "term_cmd", GEANY_DEFAULT_TOOLS_TERMINAL);
|
||||||
tool_prefs.browser_cmd = utils_get_setting_string(config, "tools", "browser_cmd", GEANY_DEFAULT_TOOLS_BROWSER);
|
tool_prefs.browser_cmd = utils_get_setting_string(config, "tools", "browser_cmd", GEANY_DEFAULT_TOOLS_BROWSER);
|
||||||
tool_prefs.grep_cmd = utils_get_setting_string(config, "tools", "grep_cmd", GEANY_DEFAULT_TOOLS_GREP);
|
tool_prefs.grep_cmd = utils_get_setting_string(config, "tools", "grep_cmd", GEANY_DEFAULT_TOOLS_GREP);
|
||||||
|
|
||||||
tool_prefs.context_action_cmd = utils_get_setting_string(config, PACKAGE, "context_action_cmd", "");
|
tool_prefs.context_action_cmd = utils_get_setting_string(config, PACKAGE, "context_action_cmd", "");
|
||||||
|
|
||||||
|
/* build menu */
|
||||||
|
build_set_group_count( GEANY_GBG_FT, utils_get_setting_integer( config, "build-menu", "number_ft_menu_items", 0 ));
|
||||||
|
build_set_group_count( GEANY_GBG_NON_FT, utils_get_setting_integer( config, "build-menu", "number_non_ft_menu_items", 0 ));
|
||||||
|
build_set_group_count( GEANY_GBG_EXEC, utils_get_setting_integer( config, "build-menu", "number_exec_menu_items", 0 ));
|
||||||
|
build_load_menu( config, GEANY_BCS_PREF, NULL );
|
||||||
|
|
||||||
/* printing */
|
/* printing */
|
||||||
tmp_string2 = g_find_program_in_path(GEANY_DEFAULT_TOOLS_PRINTCMD);
|
tmp_string2 = g_find_program_in_path(GEANY_DEFAULT_TOOLS_PRINTCMD);
|
||||||
#ifdef G_OS_WIN32
|
#ifdef G_OS_WIN32
|
||||||
@ -1061,74 +1068,6 @@ void configuration_apply_settings(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#ifdef GEANY_DEBUG
|
|
||||||
/* Geany data file generation is only available with a debug build of Geany. */
|
|
||||||
|
|
||||||
static void generate_filetype_extensions(const gchar *output_dir);
|
|
||||||
|
|
||||||
|
|
||||||
/* Generate the config files in "data/" from defaults */
|
|
||||||
void configuration_generate_data_files(void)
|
|
||||||
{
|
|
||||||
gchar *cur_dir, *gen_dir;
|
|
||||||
|
|
||||||
cur_dir = g_get_current_dir();
|
|
||||||
gen_dir = g_strconcat(cur_dir, G_DIR_SEPARATOR_S, "data", NULL);
|
|
||||||
g_free(cur_dir);
|
|
||||||
|
|
||||||
if (! g_file_test(gen_dir, G_FILE_TEST_IS_DIR))
|
|
||||||
{
|
|
||||||
g_print("%s does not exist!\n", gen_dir);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
g_print("Generating system files in %s:\n", gen_dir);
|
|
||||||
/* currently only filetype extensions are auto-generated. */
|
|
||||||
generate_filetype_extensions(gen_dir);
|
|
||||||
g_free(gen_dir);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* This will write the default settings for the system filetype_extensions.conf */
|
|
||||||
static void generate_filetype_extensions(const gchar *output_dir)
|
|
||||||
{
|
|
||||||
guint i;
|
|
||||||
gchar *configfile = g_strconcat(output_dir, G_DIR_SEPARATOR_S, "filetype_extensions.conf", NULL);
|
|
||||||
gchar *data, *basename;
|
|
||||||
GKeyFile *config;
|
|
||||||
|
|
||||||
config = g_key_file_new();
|
|
||||||
g_key_file_set_comment(config, NULL, NULL,
|
|
||||||
"*** This file generated by: geany --generate-data-files ***", NULL);
|
|
||||||
/* add filetype keys */
|
|
||||||
for (i = 0; i < filetypes_array->len; i++)
|
|
||||||
{
|
|
||||||
g_key_file_set_string_list(config, "Extensions", filetypes[i]->name,
|
|
||||||
(const gchar**) filetypes[i]->pattern, g_strv_length(filetypes[i]->pattern));
|
|
||||||
}
|
|
||||||
/* add comment */
|
|
||||||
g_key_file_set_comment(config, "Extensions", NULL,
|
|
||||||
"Filetype extension configuration file for Geany\n"
|
|
||||||
"Insert as many items as you want, seperate them with a \";\".\n"
|
|
||||||
"See Geany's main documentation for details.", NULL);
|
|
||||||
|
|
||||||
/* write the file */
|
|
||||||
g_print("%s: ", G_STRFUNC);
|
|
||||||
data = g_key_file_to_data(config, NULL, NULL);
|
|
||||||
basename = g_path_get_basename(configfile);
|
|
||||||
|
|
||||||
if (utils_write_file(configfile, data) == 0)
|
|
||||||
g_print("wrote file %s.\n", basename);
|
|
||||||
else
|
|
||||||
g_print("*** ERROR: error writing file %s\n", basename);
|
|
||||||
g_free(basename);
|
|
||||||
|
|
||||||
g_free(data);
|
|
||||||
g_key_file_free(config);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
void configuration_init(void)
|
void configuration_init(void)
|
||||||
{
|
{
|
||||||
keyfile_groups = g_ptr_array_new();
|
keyfile_groups = g_ptr_array_new();
|
||||||
|
@ -55,9 +55,4 @@ void configuration_save_session_files(GKeyFile *config);
|
|||||||
* realisation of the main window */
|
* realisation of the main window */
|
||||||
void configuration_apply_settings(void);
|
void configuration_apply_settings(void);
|
||||||
|
|
||||||
#ifdef GEANY_DEBUG
|
|
||||||
/* Generate the config files in "data/" from defaults */
|
|
||||||
void configuration_generate_data_files(void);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
13
src/main.c
13
src/main.c
@ -108,7 +108,6 @@ static gchar *alternate_config = NULL;
|
|||||||
static gboolean no_vte = FALSE;
|
static gboolean no_vte = FALSE;
|
||||||
static gchar *lib_vte = NULL;
|
static gchar *lib_vte = NULL;
|
||||||
#endif
|
#endif
|
||||||
static gboolean generate_datafiles = FALSE;
|
|
||||||
static gboolean generate_tags = FALSE;
|
static gboolean generate_tags = FALSE;
|
||||||
static gboolean no_preprocessing = FALSE;
|
static gboolean no_preprocessing = FALSE;
|
||||||
static gboolean ft_names = FALSE;
|
static gboolean ft_names = FALSE;
|
||||||
@ -127,7 +126,6 @@ static GOptionEntry entries[] =
|
|||||||
{ "ft-names", 0, 0, G_OPTION_ARG_NONE, &ft_names, N_("Print internal filetype names"), NULL },
|
{ "ft-names", 0, 0, G_OPTION_ARG_NONE, &ft_names, N_("Print internal filetype names"), NULL },
|
||||||
{ "generate-tags", 'g', 0, G_OPTION_ARG_NONE, &generate_tags, N_("Generate global tags file (see documentation)"), NULL },
|
{ "generate-tags", 'g', 0, G_OPTION_ARG_NONE, &generate_tags, N_("Generate global tags file (see documentation)"), NULL },
|
||||||
{ "no-preprocessing", 'P', 0, G_OPTION_ARG_NONE, &no_preprocessing, N_("Don't preprocess C/C++ files when generating tags"), NULL },
|
{ "no-preprocessing", 'P', 0, G_OPTION_ARG_NONE, &no_preprocessing, N_("Don't preprocess C/C++ files when generating tags"), NULL },
|
||||||
{ "generate-data-files", 0, G_OPTION_FLAG_HIDDEN, G_OPTION_ARG_NONE, &generate_datafiles, NULL, NULL },
|
|
||||||
#ifdef HAVE_SOCKET
|
#ifdef HAVE_SOCKET
|
||||||
{ "new-instance", 'i', 0, G_OPTION_ARG_NONE, &cl_options.new_instance, N_("Don't open files in a running instance, force opening a new instance"), NULL },
|
{ "new-instance", 'i', 0, G_OPTION_ARG_NONE, &cl_options.new_instance, N_("Don't open files in a running instance, force opening a new instance"), NULL },
|
||||||
#endif
|
#endif
|
||||||
@ -138,7 +136,7 @@ static GOptionEntry entries[] =
|
|||||||
{ "no-plugins", 'p', 0, G_OPTION_ARG_NONE, &no_plugins, N_("Don't load plugins"), NULL },
|
{ "no-plugins", 'p', 0, G_OPTION_ARG_NONE, &no_plugins, N_("Don't load plugins"), NULL },
|
||||||
#endif
|
#endif
|
||||||
{ "print-prefix", 0, 0, G_OPTION_ARG_NONE, &print_prefix, N_("Print Geany's installation prefix"), NULL },
|
{ "print-prefix", 0, 0, G_OPTION_ARG_NONE, &print_prefix, N_("Print Geany's installation prefix"), NULL },
|
||||||
{ "no-session", 's', G_OPTION_FLAG_REVERSE, G_OPTION_ARG_NONE, &cl_options.load_session, N_("don't load the previous session's files"), NULL },
|
{ "no-session", 's', G_OPTION_FLAG_REVERSE, G_OPTION_ARG_NONE, &cl_options.load_session, N_("Don't load the previous session's files"), NULL },
|
||||||
#ifdef HAVE_VTE
|
#ifdef HAVE_VTE
|
||||||
{ "no-terminal", 't', 0, G_OPTION_ARG_NONE, &no_vte, N_("Don't load terminal support"), NULL },
|
{ "no-terminal", 't', 0, G_OPTION_ARG_NONE, &no_vte, N_("Don't load terminal support"), NULL },
|
||||||
{ "vte-lib", 0, 0, G_OPTION_ARG_FILENAME, &lib_vte, N_("Filename of libvte.so"), NULL },
|
{ "vte-lib", 0, 0, G_OPTION_ARG_FILENAME, &lib_vte, N_("Filename of libvte.so"), NULL },
|
||||||
@ -523,14 +521,6 @@ static void parse_command_line_options(gint *argc, gchar ***argv)
|
|||||||
app->configdir = g_build_filename(g_get_user_config_dir(), "geany", NULL);
|
app->configdir = g_build_filename(g_get_user_config_dir(), "geany", NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef GEANY_DEBUG
|
|
||||||
if (generate_datafiles)
|
|
||||||
{
|
|
||||||
filetypes_init_types();
|
|
||||||
configuration_generate_data_files(); /* currently only filetype_extensions.conf */
|
|
||||||
exit(0);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
if (generate_tags)
|
if (generate_tags)
|
||||||
{
|
{
|
||||||
gboolean ret;
|
gboolean ret;
|
||||||
@ -1123,7 +1113,6 @@ void main_quit()
|
|||||||
g_free(template_prefs.mail);
|
g_free(template_prefs.mail);
|
||||||
g_free(template_prefs.initials);
|
g_free(template_prefs.initials);
|
||||||
g_free(template_prefs.version);
|
g_free(template_prefs.version);
|
||||||
g_free(tool_prefs.make_cmd);
|
|
||||||
g_free(tool_prefs.term_cmd);
|
g_free(tool_prefs.term_cmd);
|
||||||
g_free(tool_prefs.browser_cmd);
|
g_free(tool_prefs.browser_cmd);
|
||||||
g_free(tool_prefs.grep_cmd);
|
g_free(tool_prefs.grep_cmd);
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
# Note: PACKAGE_DATA_DIR and PACKAGE_LOCALE_DIR are no longer used on Windows.
|
# Note: PACKAGE_DATA_DIR and PACKAGE_LOCALE_DIR are no longer used on Windows.
|
||||||
|
|
||||||
DEFINES = -DHAVE_CONFIG_H \
|
DEFINES = -DHAVE_CONFIG_H \
|
||||||
|
-DGEANY_PRIVATE \
|
||||||
-DGEANY_DATADIR=\"data\" \
|
-DGEANY_DATADIR=\"data\" \
|
||||||
-DGEANY_LOCALEDIR=\"\" \
|
-DGEANY_LOCALEDIR=\"\" \
|
||||||
-DGEANY_LIBDIR=\"\" \
|
-DGEANY_LIBDIR=\"\" \
|
||||||
|
@ -267,9 +267,9 @@ void msgwin_compiler_add_string(gint msg_color, const gchar *msg)
|
|||||||
gtk_tree_path_free(path);
|
gtk_tree_path_free(path);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* calling build_menu_update for every build message would be overkill */
|
/* calling build_menu_update for every build message would be overkill, TODO really should call it once when all done */
|
||||||
gtk_widget_set_sensitive(build_get_menu_items(-1)->item_next_error, TRUE);
|
gtk_widget_set_sensitive(build_get_menu_items(-1)->menu_item[GBG_FIXED][GBF_NEXT_ERROR], TRUE);
|
||||||
gtk_widget_set_sensitive(build_get_menu_items(-1)->item_previous_error, TRUE);
|
gtk_widget_set_sensitive(build_get_menu_items(-1)->menu_item[GBG_FIXED][GBF_PREV_ERROR], TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -50,13 +50,13 @@
|
|||||||
enum {
|
enum {
|
||||||
/** The Application Programming Interface (API) version, incremented
|
/** The Application Programming Interface (API) version, incremented
|
||||||
* whenever any plugin data types are modified or appended to. */
|
* whenever any plugin data types are modified or appended to. */
|
||||||
GEANY_API_VERSION = 150,
|
GEANY_API_VERSION = 153,
|
||||||
|
|
||||||
/** The Application Binary Interface (ABI) version, incremented whenever
|
/** The Application Binary Interface (ABI) version, incremented whenever
|
||||||
* existing fields in the plugin data types have to be changed or reordered. */
|
* existing fields in the plugin data types have to be changed or reordered. */
|
||||||
/* This should usually stay the same if fields are only appended, assuming only pointers to
|
/* This should usually stay the same if fields are only appended, assuming only pointers to
|
||||||
* structs and not structs themselves are declared by plugins. */
|
* structs and not structs themselves are declared by plugins. */
|
||||||
GEANY_ABI_VERSION = 63
|
GEANY_ABI_VERSION = 65
|
||||||
};
|
};
|
||||||
|
|
||||||
/** Check the plugin can be loaded by Geany.
|
/** Check the plugin can be loaded by Geany.
|
||||||
@ -119,23 +119,32 @@ GeanyPlugin;
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** @see PLUGIN_KEY_GROUP() macro. */
|
||||||
|
typedef struct GeanyKeyGroupInfo
|
||||||
|
{
|
||||||
|
const gchar *name; /**< Group name used in the configuration file, such as @c "html_chars" */
|
||||||
|
gsize count; /**< The number of keybindings the group will hold */
|
||||||
|
}
|
||||||
|
GeanyKeyGroupInfo;
|
||||||
|
|
||||||
/** Declare and initialise a keybinding group.
|
/** Declare and initialise a keybinding group.
|
||||||
* @code GeanyKeyGroup plugin_key_group[1]; @endcode
|
* @code GeanyKeyGroup *plugin_key_group; @endcode
|
||||||
* You must then set the @c plugin_key_group::keys[] entries for the group in plugin_init().
|
* You must then set the @c plugin_key_group::keys[] entries for the group in plugin_init(),
|
||||||
|
* normally using keybindings_set_item().
|
||||||
* The @c plugin_key_group::label field is set by Geany after @c plugin_init()
|
* The @c plugin_key_group::label field is set by Geany after @c plugin_init()
|
||||||
* is called, to the name of the plugin.
|
* is called, to the name of the plugin.
|
||||||
* @param group_name A unique group name (without quotes) to be used in the
|
* @param group_name A unique group name (without quotes) to be used in the
|
||||||
* configuration file, such as @c html_chars.
|
* configuration file, such as @c html_chars.
|
||||||
* @param key_count The number of keybindings the group will hold. */
|
* @param key_count The number of keybindings the group will hold.
|
||||||
|
* @see plugin_set_key_group() to set the group size dynamically. */
|
||||||
#define PLUGIN_KEY_GROUP(group_name, key_count) \
|
#define PLUGIN_KEY_GROUP(group_name, key_count) \
|
||||||
static GeanyKeyBinding plugin_keys[key_count]; \
|
/* We have to declare this as a single element array.
|
||||||
\
|
|
||||||
/* We have to declare plugin_key_group as a single element array.
|
|
||||||
* Declaring as a pointer to a struct doesn't work with g_module_symbol(). */ \
|
* Declaring as a pointer to a struct doesn't work with g_module_symbol(). */ \
|
||||||
GeanyKeyGroup plugin_key_group[1] = \
|
GeanyKeyGroupInfo plugin_key_group_info[1] = \
|
||||||
{ \
|
{ \
|
||||||
{G_STRINGIFY(group_name), NULL, key_count, plugin_keys} \
|
{G_STRINGIFY(group_name), key_count} \
|
||||||
};
|
};\
|
||||||
|
GeanyKeyGroup *plugin_key_group = NULL;
|
||||||
|
|
||||||
|
|
||||||
/** Callback array entry type used with the @ref plugin_callbacks symbol. */
|
/** Callback array entry type used with the @ref plugin_callbacks symbol. */
|
||||||
@ -225,7 +234,7 @@ typedef struct GeanyFunctions
|
|||||||
struct NavQueueFuncs *p_navqueue; /**< See navqueue.h */
|
struct NavQueueFuncs *p_navqueue; /**< See navqueue.h */
|
||||||
struct EditorFuncs *p_editor; /**< See editor.h */
|
struct EditorFuncs *p_editor; /**< See editor.h */
|
||||||
struct MainFuncs *p_main; /**< See main.h */
|
struct MainFuncs *p_main; /**< See main.h */
|
||||||
struct PluginFuncs *p_plugin; /**< See plugins.c */
|
struct PluginFuncs *p_plugin; /**< See pluginutils.c */
|
||||||
struct ScintillaFuncs *p_scintilla; /**< See ScintillaFuncs */
|
struct ScintillaFuncs *p_scintilla; /**< See ScintillaFuncs */
|
||||||
struct MsgWinFuncs *p_msgwin; /**< See msgwindow.h */
|
struct MsgWinFuncs *p_msgwin; /**< See msgwindow.h */
|
||||||
}
|
}
|
||||||
@ -462,9 +471,11 @@ typedef void (*_GeanyKeyCallback) (guint key_id);
|
|||||||
typedef struct KeybindingFuncs
|
typedef struct KeybindingFuncs
|
||||||
{
|
{
|
||||||
void (*send_command) (guint group_id, guint key_id);
|
void (*send_command) (guint group_id, guint key_id);
|
||||||
void (*set_item) (struct GeanyKeyGroup *group, gsize key_id,
|
struct GeanyKeyBinding* (*set_item) (struct GeanyKeyGroup *group, gsize key_id,
|
||||||
_GeanyKeyCallback callback, guint key, GdkModifierType mod,
|
_GeanyKeyCallback callback, guint key, GdkModifierType mod,
|
||||||
gchar *name, gchar *label, GtkWidget *menu_item);
|
gchar *name, gchar *label, GtkWidget *menu_item);
|
||||||
|
struct GeanyKeyBinding* (*get_item)(struct GeanyKeyGroup *group, gsize key_id);
|
||||||
|
|
||||||
}
|
}
|
||||||
KeybindingFuncs;
|
KeybindingFuncs;
|
||||||
|
|
||||||
@ -541,7 +552,10 @@ typedef struct EditorFuncs
|
|||||||
EditorFuncs;
|
EditorFuncs;
|
||||||
|
|
||||||
|
|
||||||
/* See plugins.c */
|
/* avoid including keybindings.h */
|
||||||
|
typedef gboolean (*_GeanyKeyGroupCallback) (guint key_id);
|
||||||
|
|
||||||
|
/* See pluginutils.c */
|
||||||
typedef struct PluginFuncs
|
typedef struct PluginFuncs
|
||||||
{
|
{
|
||||||
void (*add_toolbar_item)(GeanyPlugin *plugin, GtkToolItem *item);
|
void (*add_toolbar_item)(GeanyPlugin *plugin, GtkToolItem *item);
|
||||||
@ -549,6 +563,8 @@ typedef struct PluginFuncs
|
|||||||
void (*signal_connect) (GeanyPlugin *plugin,
|
void (*signal_connect) (GeanyPlugin *plugin,
|
||||||
GObject *object, gchar *signal_name, gboolean after,
|
GObject *object, gchar *signal_name, gboolean after,
|
||||||
GCallback callback, gpointer user_data);
|
GCallback callback, gpointer user_data);
|
||||||
|
struct GeanyKeyGroup* (*set_key_group)(GeanyPlugin *plugin,
|
||||||
|
const gchar *section_name, gsize count, _GeanyKeyGroupCallback callback);
|
||||||
}
|
}
|
||||||
PluginFuncs;
|
PluginFuncs;
|
||||||
|
|
||||||
@ -556,7 +572,8 @@ PluginFuncs;
|
|||||||
/* Deprecated aliases */
|
/* Deprecated aliases */
|
||||||
#ifndef GEANY_DISABLE_DEPRECATED
|
#ifndef GEANY_DISABLE_DEPRECATED
|
||||||
|
|
||||||
/** @c NULL-safe way to get the index of @a doc_ptr in the documents array. */
|
/** @deprecated - copy into your plugin code if needed.
|
||||||
|
* @c NULL-safe way to get the index of @a doc_ptr in the documents array. */
|
||||||
#define DOC_IDX(doc_ptr) \
|
#define DOC_IDX(doc_ptr) \
|
||||||
(doc_ptr ? doc_ptr->index : -1)
|
(doc_ptr ? doc_ptr->index : -1)
|
||||||
#define DOC_IDX_VALID(doc_idx) \
|
#define DOC_IDX_VALID(doc_idx) \
|
||||||
|
@ -26,7 +26,9 @@
|
|||||||
#ifndef PLUGINPRIVATE_H
|
#ifndef PLUGINPRIVATE_H
|
||||||
#define PLUGINPRIVATE_H
|
#define PLUGINPRIVATE_H
|
||||||
|
|
||||||
#include "ui_utils.h"
|
#include "ui_utils.h" /* GeanyAutoSeparator */
|
||||||
|
#include "keybindings.h" /* GeanyKeyGroup */
|
||||||
|
|
||||||
|
|
||||||
typedef struct SignalConnection
|
typedef struct SignalConnection
|
||||||
{
|
{
|
||||||
@ -35,11 +37,24 @@ typedef struct SignalConnection
|
|||||||
}
|
}
|
||||||
SignalConnection;
|
SignalConnection;
|
||||||
|
|
||||||
|
|
||||||
typedef struct GeanyPluginPrivate
|
typedef struct GeanyPluginPrivate
|
||||||
{
|
{
|
||||||
|
GModule *module;
|
||||||
|
gchar *filename; /* plugin filename (/path/libname.so) */
|
||||||
|
PluginInfo info; /* plugin name, description, etc */
|
||||||
|
GeanyPlugin public; /* fields the plugin can read */
|
||||||
|
|
||||||
|
void (*init) (GeanyData *data); /* Called when the plugin is enabled */
|
||||||
|
GtkWidget* (*configure) (GtkDialog *dialog); /* plugin configure dialog, optional */
|
||||||
|
void (*help) (void); /* Called when the plugin should show some help, optional */
|
||||||
|
void (*cleanup) (void); /* Called when the plugin is disabled or when Geany exits */
|
||||||
|
|
||||||
|
/* extra stuff */
|
||||||
|
PluginFields fields;
|
||||||
|
GeanyKeyGroup *key_group;
|
||||||
GeanyAutoSeparator toolbar_separator;
|
GeanyAutoSeparator toolbar_separator;
|
||||||
gboolean resident;
|
GArray *signal_ids; /* SignalConnection's to disconnect when unloading */
|
||||||
GArray *signal_ids; /* SignalConnection's to disconnect when unloading */
|
|
||||||
}
|
}
|
||||||
GeanyPluginPrivate;
|
GeanyPluginPrivate;
|
||||||
|
|
||||||
|
@ -62,24 +62,7 @@
|
|||||||
#include "pluginutils.h"
|
#include "pluginutils.h"
|
||||||
#include "pluginprivate.h"
|
#include "pluginprivate.h"
|
||||||
|
|
||||||
|
typedef GeanyPluginPrivate Plugin; /* shorter alias */
|
||||||
typedef struct Plugin
|
|
||||||
{
|
|
||||||
GModule *module;
|
|
||||||
gchar *filename; /* plugin filename (/path/libname.so) */
|
|
||||||
PluginInfo info; /* plugin name, description, etc */
|
|
||||||
PluginFields fields;
|
|
||||||
GeanyPlugin public; /* fields the plugin can read */
|
|
||||||
GeanyPluginPrivate priv; /* GeanyPlugin type private data, same as (*public.priv) */
|
|
||||||
|
|
||||||
GeanyKeyGroup *key_group;
|
|
||||||
|
|
||||||
void (*init) (GeanyData *data); /* Called when the plugin is enabled */
|
|
||||||
GtkWidget* (*configure) (GtkDialog *dialog); /* plugin configure dialog, optional */
|
|
||||||
void (*help) (void); /* Called when the plugin should show some help, optional */
|
|
||||||
void (*cleanup) (void); /* Called when the plugin is disabled or when Geany exits */
|
|
||||||
}
|
|
||||||
Plugin;
|
|
||||||
|
|
||||||
|
|
||||||
static gboolean want_plugins = FALSE;
|
static gboolean want_plugins = FALSE;
|
||||||
@ -99,7 +82,8 @@ static void pm_show_dialog(GtkMenuItem *menuitem, gpointer user_data);
|
|||||||
static PluginFuncs plugin_funcs = {
|
static PluginFuncs plugin_funcs = {
|
||||||
&plugin_add_toolbar_item,
|
&plugin_add_toolbar_item,
|
||||||
&plugin_module_make_resident,
|
&plugin_module_make_resident,
|
||||||
&plugin_signal_connect
|
&plugin_signal_connect,
|
||||||
|
&plugin_set_key_group
|
||||||
};
|
};
|
||||||
|
|
||||||
static DocumentFuncs doc_funcs = {
|
static DocumentFuncs doc_funcs = {
|
||||||
@ -259,7 +243,8 @@ static EncodingFuncs encoding_funcs = {
|
|||||||
|
|
||||||
static KeybindingFuncs keybindings_funcs = {
|
static KeybindingFuncs keybindings_funcs = {
|
||||||
&keybindings_send_command,
|
&keybindings_send_command,
|
||||||
&keybindings_set_item
|
&keybindings_set_item,
|
||||||
|
&keybindings_get_item
|
||||||
};
|
};
|
||||||
|
|
||||||
static TagManagerFuncs tagmanager_funcs = {
|
static TagManagerFuncs tagmanager_funcs = {
|
||||||
@ -464,42 +449,40 @@ static void add_callbacks(Plugin *plugin, PluginCallback *callbacks)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void read_key_group(Plugin *plugin)
|
||||||
add_kb_group(Plugin *plugin)
|
|
||||||
{
|
{
|
||||||
guint i;
|
GeanyKeyGroupInfo *p_key_info;
|
||||||
|
GeanyKeyGroup **p_key_group;
|
||||||
|
|
||||||
if (!NZV(plugin->key_group->name))
|
g_module_symbol(plugin->module, "plugin_key_group_info", (void *) &p_key_info);
|
||||||
|
g_module_symbol(plugin->module, "plugin_key_group", (void *) &p_key_group);
|
||||||
|
if (p_key_info && p_key_group)
|
||||||
{
|
{
|
||||||
geany_debug("Plugin \"%s\" has not set a name for its keybinding group"
|
GeanyKeyGroupInfo *key_info = p_key_info;
|
||||||
" - ignoring all keybindings!",
|
|
||||||
plugin->info.name);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
g_return_if_fail(! g_str_equal(plugin->key_group->name, keybindings_keyfile_group_name));
|
|
||||||
|
|
||||||
for (i = 0; i < plugin->key_group->count; i++)
|
if (*p_key_group)
|
||||||
{
|
geany_debug("Ignoring plugin_key_group symbol for plugin '%s' - "
|
||||||
GeanyKeyBinding *kb = &plugin->key_group->keys[i];
|
"use plugin_set_key_group() instead to allocate keybindings dynamically.",
|
||||||
|
plugin->info.name);
|
||||||
if (!NZV(kb->name))
|
else
|
||||||
{
|
{
|
||||||
geany_debug("Plugin \"%s\" has not set a name for keybinding %d"
|
if (key_info->count)
|
||||||
" - ignoring all keybindings!",
|
{
|
||||||
plugin->info.name, i);
|
GeanyKeyGroup *key_group =
|
||||||
plugin->key_group->count = 0;
|
plugin_set_key_group(&plugin->public, key_info->name, key_info->count, NULL);
|
||||||
break;
|
if (key_group)
|
||||||
|
*p_key_group = key_group;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
geany_debug("Ignoring plugin_key_group_info symbol for plugin '%s' - "
|
||||||
|
"count field is zero. Maybe use plugin_set_key_group() instead?",
|
||||||
|
plugin->info.name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (plugin->key_group->count == 0)
|
else if (p_key_info || p_key_group)
|
||||||
{
|
geany_debug("Ignoring only one of plugin_key_group[_info] symbols defined for plugin '%s'. "
|
||||||
plugin->key_group = NULL; /* Ignore the group (maybe the plugin has optional KB) */
|
"Maybe use plugin_set_key_group() instead?",
|
||||||
return;
|
plugin->info.name);
|
||||||
}
|
|
||||||
|
|
||||||
plugin->key_group->label = plugin->info.name;
|
|
||||||
|
|
||||||
g_ptr_array_add(keybinding_groups, plugin->key_group);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -529,14 +512,12 @@ plugin_init(Plugin *plugin)
|
|||||||
g_module_symbol(plugin->module, "plugin_fields", (void *) &plugin_fields);
|
g_module_symbol(plugin->module, "plugin_fields", (void *) &plugin_fields);
|
||||||
if (plugin_fields)
|
if (plugin_fields)
|
||||||
*plugin_fields = &plugin->fields;
|
*plugin_fields = &plugin->fields;
|
||||||
|
read_key_group(plugin);
|
||||||
|
|
||||||
/* start the plugin */
|
/* start the plugin */
|
||||||
g_return_if_fail(plugin->init);
|
g_return_if_fail(plugin->init);
|
||||||
plugin->init(&geany_data);
|
plugin->init(&geany_data);
|
||||||
|
|
||||||
if (p_geany_plugin && (*p_geany_plugin)->priv->resident)
|
|
||||||
g_module_make_resident(plugin->module);
|
|
||||||
|
|
||||||
/* store some function pointers for later use */
|
/* store some function pointers for later use */
|
||||||
g_module_symbol(plugin->module, "plugin_configure", (void *) &plugin->configure);
|
g_module_symbol(plugin->module, "plugin_configure", (void *) &plugin->configure);
|
||||||
g_module_symbol(plugin->module, "plugin_help", (void *) &plugin->help);
|
g_module_symbol(plugin->module, "plugin_help", (void *) &plugin->help);
|
||||||
@ -559,10 +540,6 @@ plugin_init(Plugin *plugin)
|
|||||||
if (callbacks)
|
if (callbacks)
|
||||||
add_callbacks(plugin, callbacks);
|
add_callbacks(plugin, callbacks);
|
||||||
|
|
||||||
g_module_symbol(plugin->module, "plugin_key_group", (void *) &plugin->key_group);
|
|
||||||
if (plugin->key_group)
|
|
||||||
add_kb_group(plugin);
|
|
||||||
|
|
||||||
/* remember which plugins are active */
|
/* remember which plugins are active */
|
||||||
active_plugin_list = g_list_append(active_plugin_list, plugin);
|
active_plugin_list = g_list_append(active_plugin_list, plugin);
|
||||||
|
|
||||||
@ -667,7 +644,7 @@ plugin_new(const gchar *fname, gboolean init_plugin, gboolean add_to_list)
|
|||||||
plugin->filename = g_strdup(fname);
|
plugin->filename = g_strdup(fname);
|
||||||
plugin->module = module;
|
plugin->module = module;
|
||||||
plugin->public.info = &plugin->info;
|
plugin->public.info = &plugin->info;
|
||||||
plugin->public.priv = &plugin->priv;
|
plugin->public.priv = plugin;
|
||||||
|
|
||||||
if (init_plugin)
|
if (init_plugin)
|
||||||
plugin_init(plugin);
|
plugin_init(plugin);
|
||||||
@ -681,7 +658,7 @@ plugin_new(const gchar *fname, gboolean init_plugin, gboolean add_to_list)
|
|||||||
|
|
||||||
static void remove_callbacks(Plugin *plugin)
|
static void remove_callbacks(Plugin *plugin)
|
||||||
{
|
{
|
||||||
GArray *signal_ids = plugin->priv.signal_ids;
|
GArray *signal_ids = plugin->signal_ids;
|
||||||
SignalConnection *sc;
|
SignalConnection *sc;
|
||||||
|
|
||||||
if (signal_ids == NULL)
|
if (signal_ids == NULL)
|
||||||
@ -712,9 +689,9 @@ plugin_cleanup(Plugin *plugin)
|
|||||||
remove_callbacks(plugin);
|
remove_callbacks(plugin);
|
||||||
|
|
||||||
if (plugin->key_group)
|
if (plugin->key_group)
|
||||||
g_ptr_array_remove_fast(keybinding_groups, plugin->key_group);
|
keybindings_free_group(plugin->key_group);
|
||||||
|
|
||||||
widget = plugin->priv.toolbar_separator.widget;
|
widget = plugin->toolbar_separator.widget;
|
||||||
if (widget)
|
if (widget)
|
||||||
gtk_widget_destroy(widget);
|
gtk_widget_destroy(widget);
|
||||||
|
|
||||||
|
@ -27,11 +27,13 @@
|
|||||||
* These functions all take the @ref geany_plugin symbol as their first argument. */
|
* These functions all take the @ref geany_plugin symbol as their first argument. */
|
||||||
|
|
||||||
#include "geany.h"
|
#include "geany.h"
|
||||||
|
|
||||||
#include "pluginutils.h"
|
#include "pluginutils.h"
|
||||||
#include "pluginprivate.h"
|
#include "pluginprivate.h"
|
||||||
|
|
||||||
#include "ui_utils.h"
|
#include "ui_utils.h"
|
||||||
#include "toolbar.h"
|
#include "toolbar.h"
|
||||||
|
#include "utils.h"
|
||||||
|
|
||||||
|
|
||||||
/** Insert a toolbar item before the Quit button, or after the previous plugin toolbar item.
|
/** Insert a toolbar item before the Quit button, or after the previous plugin toolbar item.
|
||||||
@ -88,7 +90,7 @@ void plugin_module_make_resident(GeanyPlugin *plugin)
|
|||||||
{
|
{
|
||||||
g_return_if_fail(plugin);
|
g_return_if_fail(plugin);
|
||||||
|
|
||||||
plugin->priv->resident = TRUE;
|
g_module_make_resident(plugin->priv->module);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -125,3 +127,22 @@ void plugin_signal_connect(GeanyPlugin *plugin,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** Setup or resize a keybinding group for the plugin.
|
||||||
|
* You should then call keybindings_set_item() for each keybinding in the group.
|
||||||
|
* @param plugin Must be @ref geany_plugin.
|
||||||
|
* @param section_name Name used in the configuration file, such as @c "html_chars".
|
||||||
|
* @param count Number of keybindings for the group.
|
||||||
|
* @param callback Unused, must be @c NULL.
|
||||||
|
* @return The plugin's keybinding group.
|
||||||
|
* @since 0.19. */
|
||||||
|
GeanyKeyGroup *plugin_set_key_group(GeanyPlugin *plugin,
|
||||||
|
const gchar *section_name, gsize count, GeanyKeyGroupCallback callback)
|
||||||
|
{
|
||||||
|
GeanyPluginPrivate *priv = plugin->priv;
|
||||||
|
|
||||||
|
priv->key_group = keybindings_set_group(priv->key_group, section_name,
|
||||||
|
priv->info.name, count, callback);
|
||||||
|
return priv->key_group;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -26,7 +26,9 @@
|
|||||||
#ifndef PLUGINUTILS_H
|
#ifndef PLUGINUTILS_H
|
||||||
#define PLUGINUTILS_H
|
#define PLUGINUTILS_H
|
||||||
|
|
||||||
#include "plugindata.h"
|
#include "plugindata.h" /* GeanyPlugin */
|
||||||
|
#include "keybindings.h" /* GeanyKeyGroupCallback */
|
||||||
|
|
||||||
|
|
||||||
void plugin_add_toolbar_item(GeanyPlugin *plugin, GtkToolItem *item);
|
void plugin_add_toolbar_item(GeanyPlugin *plugin, GtkToolItem *item);
|
||||||
|
|
||||||
@ -36,4 +38,7 @@ void plugin_signal_connect(GeanyPlugin *plugin,
|
|||||||
GObject *object, gchar *signal_name, gboolean after,
|
GObject *object, gchar *signal_name, gboolean after,
|
||||||
GCallback callback, gpointer user_data);
|
GCallback callback, gpointer user_data);
|
||||||
|
|
||||||
|
struct GeanyKeyGroup *plugin_set_key_group(GeanyPlugin *plugin,
|
||||||
|
const gchar *section_name, gsize count, GeanyKeyGroupCallback callback);
|
||||||
|
|
||||||
#endif /* PLUGINUTILS_H */
|
#endif /* PLUGINUTILS_H */
|
||||||
|
22
src/prefs.c
22
src/prefs.c
@ -587,8 +587,6 @@ static void prefs_init_dialog(void)
|
|||||||
(editor_prefs.autoclose_chars & GEANY_AC_DQUOTE));
|
(editor_prefs.autoclose_chars & GEANY_AC_DQUOTE));
|
||||||
|
|
||||||
/* Tools Settings */
|
/* Tools Settings */
|
||||||
if (tool_prefs.make_cmd)
|
|
||||||
gtk_entry_set_text(GTK_ENTRY(ui_lookup_widget(ui_widgets.prefs_dialog, "entry_com_make")), tool_prefs.make_cmd);
|
|
||||||
|
|
||||||
if (tool_prefs.term_cmd)
|
if (tool_prefs.term_cmd)
|
||||||
gtk_entry_set_text(GTK_ENTRY(ui_lookup_widget(ui_widgets.prefs_dialog, "entry_com_term")), tool_prefs.term_cmd);
|
gtk_entry_set_text(GTK_ENTRY(ui_lookup_widget(ui_widgets.prefs_dialog, "entry_com_term")), tool_prefs.term_cmd);
|
||||||
@ -979,9 +977,6 @@ on_prefs_button_clicked(GtkDialog *dialog, gint response, gpointer user_data)
|
|||||||
| (autoclose_brackets[4] ? GEANY_AC_DQUOTE : 0);
|
| (autoclose_brackets[4] ? GEANY_AC_DQUOTE : 0);
|
||||||
|
|
||||||
/* Tools Settings */
|
/* Tools Settings */
|
||||||
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "entry_com_make");
|
|
||||||
g_free(tool_prefs.make_cmd);
|
|
||||||
tool_prefs.make_cmd = g_strdup(gtk_entry_get_text(GTK_ENTRY(widget)));
|
|
||||||
|
|
||||||
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "entry_com_term");
|
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "entry_com_term");
|
||||||
g_free(tool_prefs.term_cmd);
|
g_free(tool_prefs.term_cmd);
|
||||||
@ -1109,6 +1104,8 @@ on_prefs_button_clicked(GtkDialog *dialog, gint response, gpointer user_data)
|
|||||||
toolbar_apply_settings();
|
toolbar_apply_settings();
|
||||||
toolbar_update_ui();
|
toolbar_update_ui();
|
||||||
toolbar_show_hide();
|
toolbar_show_hide();
|
||||||
|
if (interface_prefs.sidebar_openfiles_visible || interface_prefs.sidebar_symbol_visible)
|
||||||
|
ui_prefs.sidebar_visible = TRUE;
|
||||||
ui_sidebar_show_hide();
|
ui_sidebar_show_hide();
|
||||||
gtk_notebook_set_show_tabs(GTK_NOTEBOOK(main_widgets.notebook), interface_prefs.show_notebook_tabs);
|
gtk_notebook_set_show_tabs(GTK_NOTEBOOK(main_widgets.notebook), interface_prefs.show_notebook_tabs);
|
||||||
|
|
||||||
@ -1270,8 +1267,7 @@ static void kb_cell_edited_cb(GtkCellRendererText *cellrenderertext, gchar *path
|
|||||||
|
|
||||||
/* set the values here, because of the above check, setting it in
|
/* set the values here, because of the above check, setting it in
|
||||||
* gtk_accelerator_parse would return a wrong key combination if it is duplicate */
|
* gtk_accelerator_parse would return a wrong key combination if it is duplicate */
|
||||||
kb->key = lkey;
|
keybindings_update_combo(kb, lkey, lmods);
|
||||||
kb->mods = lmods;
|
|
||||||
|
|
||||||
gtk_tree_store_set(store, &iter, KB_TREE_SHORTCUT, new_text, -1);
|
gtk_tree_store_set(store, &iter, KB_TREE_SHORTCUT, new_text, -1);
|
||||||
|
|
||||||
@ -1316,8 +1312,7 @@ static void kb_dialog_response_cb(GtkWidget *dialog, gint response, G_GNUC_UNUSE
|
|||||||
|
|
||||||
/* set the values here, because of the above check, setting it in
|
/* set the values here, because of the above check, setting it in
|
||||||
* gtk_accelerator_parse would return a wrong key combination if it is duplicate */
|
* gtk_accelerator_parse would return a wrong key combination if it is duplicate */
|
||||||
kb->key = lkey;
|
keybindings_update_combo(kb, lkey, lmods);
|
||||||
kb->mods = lmods;
|
|
||||||
|
|
||||||
gtk_tree_store_set(store, &g_iter,
|
gtk_tree_store_set(store, &g_iter,
|
||||||
KB_TREE_SHORTCUT, gtk_label_get_text(GTK_LABEL(dialog_label)), -1);
|
KB_TREE_SHORTCUT, gtk_label_get_text(GTK_LABEL(dialog_label)), -1);
|
||||||
@ -1400,8 +1395,7 @@ static gboolean kb_find_duplicate(GeanyKeyBinding *search_kb,
|
|||||||
_("The combination '%s' is already used for \"%s\"."),
|
_("The combination '%s' is already used for \"%s\"."),
|
||||||
action, kb->label))
|
action, kb->label))
|
||||||
{
|
{
|
||||||
kb->key = 0;
|
keybindings_update_combo(kb, 0, 0);
|
||||||
kb->mods = 0;
|
|
||||||
kb_clear_tree_shortcut(g, i);
|
kb_clear_tree_shortcut(g, i);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -1549,7 +1543,7 @@ void prefs_show_dialog(void)
|
|||||||
ui_entry_add_clear_icon(ui_lookup_widget(ui_widgets.prefs_dialog, "project_file_path_entry"));
|
ui_entry_add_clear_icon(ui_lookup_widget(ui_widgets.prefs_dialog, "project_file_path_entry"));
|
||||||
ui_entry_add_clear_icon(ui_lookup_widget(ui_widgets.prefs_dialog, "extra_plugin_path_entry"));
|
ui_entry_add_clear_icon(ui_lookup_widget(ui_widgets.prefs_dialog, "extra_plugin_path_entry"));
|
||||||
ui_entry_add_clear_icon(ui_lookup_widget(ui_widgets.prefs_dialog, "entry_toggle_mark"));
|
ui_entry_add_clear_icon(ui_lookup_widget(ui_widgets.prefs_dialog, "entry_toggle_mark"));
|
||||||
ui_entry_add_clear_icon(ui_lookup_widget(ui_widgets.prefs_dialog, "entry_com_make"));
|
/* ui_entry_add_clear_icon(ui_lookup_widget(ui_widgets.prefs_dialog, "entry_com_make")); */
|
||||||
ui_entry_add_clear_icon(ui_lookup_widget(ui_widgets.prefs_dialog, "entry_com_term"));
|
ui_entry_add_clear_icon(ui_lookup_widget(ui_widgets.prefs_dialog, "entry_com_term"));
|
||||||
ui_entry_add_clear_icon(ui_lookup_widget(ui_widgets.prefs_dialog, "entry_browser"));
|
ui_entry_add_clear_icon(ui_lookup_widget(ui_widgets.prefs_dialog, "entry_browser"));
|
||||||
ui_entry_add_clear_icon(ui_lookup_widget(ui_widgets.prefs_dialog, "entry_grep"));
|
ui_entry_add_clear_icon(ui_lookup_widget(ui_widgets.prefs_dialog, "entry_grep"));
|
||||||
@ -1587,9 +1581,9 @@ void prefs_show_dialog(void)
|
|||||||
"font-set", G_CALLBACK(on_prefs_font_choosed), GINT_TO_POINTER(3));
|
"font-set", G_CALLBACK(on_prefs_font_choosed), GINT_TO_POINTER(3));
|
||||||
g_signal_connect(ui_lookup_widget(ui_widgets.prefs_dialog, "long_line_color"),
|
g_signal_connect(ui_lookup_widget(ui_widgets.prefs_dialog, "long_line_color"),
|
||||||
"color-set", G_CALLBACK(on_prefs_color_choosed), GINT_TO_POINTER(1));
|
"color-set", G_CALLBACK(on_prefs_color_choosed), GINT_TO_POINTER(1));
|
||||||
/* file chooser buttons in the tools tab */
|
/* file chooser buttons in the tools tab
|
||||||
g_signal_connect(ui_lookup_widget(ui_widgets.prefs_dialog, "button_make"),
|
g_signal_connect(ui_lookup_widget(ui_widgets.prefs_dialog, "button_make"),
|
||||||
"clicked", G_CALLBACK(on_prefs_tools_button_clicked), ui_lookup_widget(ui_widgets.prefs_dialog, "entry_com_make"));
|
"clicked", G_CALLBACK(on_prefs_tools_button_clicked), ui_lookup_widget(ui_widgets.prefs_dialog, "entry_com_make")); */
|
||||||
g_signal_connect(ui_lookup_widget(ui_widgets.prefs_dialog, "button_term"),
|
g_signal_connect(ui_lookup_widget(ui_widgets.prefs_dialog, "button_term"),
|
||||||
"clicked", G_CALLBACK(on_prefs_tools_button_clicked), ui_lookup_widget(ui_widgets.prefs_dialog, "entry_com_term"));
|
"clicked", G_CALLBACK(on_prefs_tools_button_clicked), ui_lookup_widget(ui_widgets.prefs_dialog, "entry_com_term"));
|
||||||
g_signal_connect(ui_lookup_widget(ui_widgets.prefs_dialog, "button_browser"),
|
g_signal_connect(ui_lookup_widget(ui_widgets.prefs_dialog, "button_browser"),
|
||||||
|
@ -46,7 +46,6 @@ extern GeanyPrefs prefs;
|
|||||||
typedef struct GeanyToolPrefs
|
typedef struct GeanyToolPrefs
|
||||||
{
|
{
|
||||||
gchar *browser_cmd;
|
gchar *browser_cmd;
|
||||||
gchar *make_cmd;
|
|
||||||
gchar *term_cmd;
|
gchar *term_cmd;
|
||||||
gchar *grep_cmd;
|
gchar *grep_cmd;
|
||||||
gchar *context_action_cmd;
|
gchar *context_action_cmd;
|
||||||
|
188
src/project.c
188
src/project.c
@ -49,6 +49,7 @@
|
|||||||
#include "editor.h"
|
#include "editor.h"
|
||||||
#include "stash.h"
|
#include "stash.h"
|
||||||
#include "treeviews.h"
|
#include "treeviews.h"
|
||||||
|
#include "filetypes.h"
|
||||||
|
|
||||||
|
|
||||||
ProjectPrefs project_prefs = { NULL, FALSE, FALSE };
|
ProjectPrefs project_prefs = { NULL, FALSE, FALSE };
|
||||||
@ -75,16 +76,14 @@ typedef struct _PropertyDialogElements
|
|||||||
GtkWidget *description;
|
GtkWidget *description;
|
||||||
GtkWidget *file_name;
|
GtkWidget *file_name;
|
||||||
GtkWidget *base_path;
|
GtkWidget *base_path;
|
||||||
GtkWidget *make_in_base_path;
|
|
||||||
GtkWidget *run_cmd;
|
|
||||||
GtkWidget *patterns;
|
GtkWidget *patterns;
|
||||||
|
TableData build_properties;
|
||||||
} PropertyDialogElements;
|
} PropertyDialogElements;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static gboolean update_config(const PropertyDialogElements *e);
|
static gboolean update_config(const PropertyDialogElements *e);
|
||||||
static void on_file_save_button_clicked(GtkButton *button, PropertyDialogElements *e);
|
static void on_file_save_button_clicked(GtkButton *button, PropertyDialogElements *e);
|
||||||
static void on_file_open_button_clicked(GtkButton *button, PropertyDialogElements *e);
|
|
||||||
static gboolean load_config(const gchar *filename);
|
static gboolean load_config(const gchar *filename);
|
||||||
static gboolean write_config(gboolean emit_signal);
|
static gboolean write_config(gboolean emit_signal);
|
||||||
static void on_name_entry_changed(GtkEditable *editable, PropertyDialogElements *e);
|
static void on_name_entry_changed(GtkEditable *editable, PropertyDialogElements *e);
|
||||||
@ -322,6 +321,17 @@ static void update_ui(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void remove_foreach_project_filetype( gpointer data, gpointer user_data )
|
||||||
|
{
|
||||||
|
GeanyFiletype *ft = (GeanyFiletype*)data;
|
||||||
|
if (ft!=NULL)
|
||||||
|
{
|
||||||
|
setptr( ft->projfilecmds, NULL);
|
||||||
|
setptr(ft->projerror_regex_string, NULL);
|
||||||
|
ft->project_list_entry = -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* open_default will make function reload default session files on close */
|
/* open_default will make function reload default session files on close */
|
||||||
void project_close(gboolean open_default)
|
void project_close(gboolean open_default)
|
||||||
{
|
{
|
||||||
@ -332,11 +342,24 @@ void project_close(gboolean open_default)
|
|||||||
/* use write_config() to save project session files */
|
/* use write_config() to save project session files */
|
||||||
write_config(FALSE);
|
write_config(FALSE);
|
||||||
|
|
||||||
|
/* remove project filetypes build entries */
|
||||||
|
if (app->project->build_filetypes_list!=NULL)
|
||||||
|
{
|
||||||
|
g_ptr_array_foreach( app->project->build_filetypes_list, remove_foreach_project_filetype, NULL );
|
||||||
|
g_ptr_array_free(app->project->build_filetypes_list, FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* remove project non filetype build menu items */
|
||||||
|
build_remove_menu_item( GEANY_BCS_PROJ, GEANY_GBG_NON_FT, -1 );
|
||||||
|
build_remove_menu_item( GEANY_BCS_PROJ, GEANY_GBG_EXEC, -1 );
|
||||||
|
|
||||||
|
/* remove project regexen */
|
||||||
|
setptr(regex_proj, NULL);
|
||||||
|
|
||||||
g_free(app->project->name);
|
g_free(app->project->name);
|
||||||
g_free(app->project->description);
|
g_free(app->project->description);
|
||||||
g_free(app->project->file_name);
|
g_free(app->project->file_name);
|
||||||
g_free(app->project->base_path);
|
g_free(app->project->base_path);
|
||||||
g_free(app->project->run_cmd);
|
|
||||||
|
|
||||||
g_free(app->project);
|
g_free(app->project);
|
||||||
app->project = NULL;
|
app->project = NULL;
|
||||||
@ -360,15 +383,22 @@ void project_close(gboolean open_default)
|
|||||||
update_ui();
|
update_ui();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void on_set_use_base_path_clicked( GtkWidget *unused1, gpointer user_data )
|
||||||
|
{
|
||||||
|
TableData td = (TableData)user_data;
|
||||||
|
|
||||||
|
build_set_non_ft_wd_to_proj(td);
|
||||||
|
}
|
||||||
|
|
||||||
static void create_properties_dialog(PropertyDialogElements *e)
|
static void create_properties_dialog(PropertyDialogElements *e)
|
||||||
{
|
{
|
||||||
GtkWidget *table, *notebook;
|
GtkWidget *table, *notebook, *build_table;
|
||||||
GtkWidget *image;
|
|
||||||
GtkWidget *button;
|
GtkWidget *button;
|
||||||
GtkWidget *bbox;
|
GtkWidget *bbox;
|
||||||
GtkWidget *label;
|
GtkWidget *label;
|
||||||
GtkWidget *swin;
|
GtkWidget *swin;
|
||||||
|
GeanyDocument *doc = document_get_current();
|
||||||
|
GeanyFiletype *ft;
|
||||||
|
|
||||||
e->dialog = create_project_dialog();
|
e->dialog = create_project_dialog();
|
||||||
gtk_window_set_transient_for(GTK_WINDOW(e->dialog), GTK_WINDOW(main_widgets.window));
|
gtk_window_set_transient_for(GTK_WINDOW(e->dialog), GTK_WINDOW(main_widgets.window));
|
||||||
@ -387,7 +417,7 @@ static void create_properties_dialog(PropertyDialogElements *e)
|
|||||||
gtk_table_attach(GTK_TABLE(table), label, 0, 1, 0, 1,
|
gtk_table_attach(GTK_TABLE(table), label, 0, 1, 0, 1,
|
||||||
(GtkAttachOptions) (GTK_FILL),
|
(GtkAttachOptions) (GTK_FILL),
|
||||||
(GtkAttachOptions) (0), 0, 0);
|
(GtkAttachOptions) (0), 0, 0);
|
||||||
gtk_misc_set_alignment(GTK_MISC(label), -1, 0);
|
gtk_misc_set_alignment(GTK_MISC(label), 0, 0);
|
||||||
|
|
||||||
e->name = gtk_entry_new();
|
e->name = gtk_entry_new();
|
||||||
ui_entry_add_clear_icon(e->name);
|
ui_entry_add_clear_icon(e->name);
|
||||||
@ -400,7 +430,7 @@ static void create_properties_dialog(PropertyDialogElements *e)
|
|||||||
gtk_table_attach(GTK_TABLE(table), label, 0, 1, 1, 2,
|
gtk_table_attach(GTK_TABLE(table), label, 0, 1, 1, 2,
|
||||||
(GtkAttachOptions) (GTK_FILL),
|
(GtkAttachOptions) (GTK_FILL),
|
||||||
(GtkAttachOptions) (0), 0, 0);
|
(GtkAttachOptions) (0), 0, 0);
|
||||||
gtk_misc_set_alignment(GTK_MISC(label), -1, 0);
|
gtk_misc_set_alignment(GTK_MISC(label), 0, 0);
|
||||||
|
|
||||||
e->file_name = gtk_entry_new();
|
e->file_name = gtk_entry_new();
|
||||||
ui_entry_add_clear_icon(e->file_name);
|
ui_entry_add_clear_icon(e->file_name);
|
||||||
@ -413,7 +443,7 @@ static void create_properties_dialog(PropertyDialogElements *e)
|
|||||||
gtk_table_attach(GTK_TABLE(table), label, 0, 1, 2, 3,
|
gtk_table_attach(GTK_TABLE(table), label, 0, 1, 2, 3,
|
||||||
(GtkAttachOptions) (GTK_FILL),
|
(GtkAttachOptions) (GTK_FILL),
|
||||||
(GtkAttachOptions) (GTK_FILL), 0, 0);
|
(GtkAttachOptions) (GTK_FILL), 0, 0);
|
||||||
gtk_misc_set_alignment(GTK_MISC(label), -1, 0);
|
gtk_misc_set_alignment(GTK_MISC(label), 0, 0);
|
||||||
|
|
||||||
e->description = gtk_text_view_new();
|
e->description = gtk_text_view_new();
|
||||||
gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(e->description), GTK_WRAP_WORD);
|
gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(e->description), GTK_WRAP_WORD);
|
||||||
@ -430,7 +460,7 @@ static void create_properties_dialog(PropertyDialogElements *e)
|
|||||||
gtk_table_attach(GTK_TABLE(table), label, 0, 1, 3, 4,
|
gtk_table_attach(GTK_TABLE(table), label, 0, 1, 3, 4,
|
||||||
(GtkAttachOptions) (GTK_FILL),
|
(GtkAttachOptions) (GTK_FILL),
|
||||||
(GtkAttachOptions) (0), 0, 0);
|
(GtkAttachOptions) (0), 0, 0);
|
||||||
gtk_misc_set_alignment(GTK_MISC(label), -1, 0);
|
gtk_misc_set_alignment(GTK_MISC(label), 0, 0);
|
||||||
|
|
||||||
e->base_path = gtk_entry_new();
|
e->base_path = gtk_entry_new();
|
||||||
ui_entry_add_clear_icon(e->base_path);
|
ui_entry_add_clear_icon(e->base_path);
|
||||||
@ -444,33 +474,27 @@ static void create_properties_dialog(PropertyDialogElements *e)
|
|||||||
(GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
|
(GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
|
||||||
(GtkAttachOptions) (0), 0, 0);
|
(GtkAttachOptions) (0), 0, 0);
|
||||||
|
|
||||||
e->make_in_base_path = gtk_check_button_new_with_label(_("Make in base path"));
|
if (doc!=NULL) ft=doc->file_type;
|
||||||
gtk_table_attach(GTK_TABLE(table), e->make_in_base_path, 0, 3, 4, 5,
|
build_table = build_commands_table( doc, GEANY_BCS_PROJ, &(e->build_properties), ft );
|
||||||
(GtkAttachOptions) (GTK_FILL),
|
label = gtk_label_new(_("Build"));
|
||||||
(GtkAttachOptions) (0), 0, 0);
|
notebook = ui_lookup_widget(e->dialog, "project_notebook");
|
||||||
|
gtk_notebook_insert_page(GTK_NOTEBOOK(notebook), build_table, label, 2);
|
||||||
|
|
||||||
label = gtk_label_new(_("Run command:"));
|
label = gtk_label_new(_("Set the non-filetype working directories on build tab to use base path:"));
|
||||||
gtk_table_attach(GTK_TABLE(table), label, 0, 1, 5, 6,
|
gtk_misc_set_alignment(GTK_MISC(label), 0, 0);
|
||||||
(GtkAttachOptions) (GTK_FILL),
|
|
||||||
(GtkAttachOptions) (0), 0, 0);
|
|
||||||
gtk_misc_set_alignment(GTK_MISC(label), -1, 0);
|
|
||||||
|
|
||||||
e->run_cmd = gtk_entry_new();
|
button = gtk_button_new_with_label(_("Set"));
|
||||||
ui_entry_add_clear_icon(e->run_cmd);
|
ui_widget_set_tooltip_text(button,
|
||||||
ui_widget_set_tooltip_text(e->run_cmd,
|
_("Set the working directories (on the Build tab) "
|
||||||
_("Command-line to run in the project base directory. "
|
"for the non-filetype build commands to use the base path"));
|
||||||
"Options can be appended to the command. "
|
gtk_misc_set_alignment(GTK_MISC(label), 0, 0);
|
||||||
"Leave blank to use the default run command."));
|
g_signal_connect(button, "clicked", G_CALLBACK(on_set_use_base_path_clicked), e->build_properties);
|
||||||
button = gtk_button_new();
|
|
||||||
g_signal_connect(button, "clicked", G_CALLBACK(on_file_open_button_clicked), e);
|
|
||||||
image = gtk_image_new_from_stock("gtk-open", GTK_ICON_SIZE_BUTTON);
|
|
||||||
gtk_container_add(GTK_CONTAINER(button), image);
|
|
||||||
bbox = gtk_hbox_new(FALSE, 6);
|
bbox = gtk_hbox_new(FALSE, 6);
|
||||||
gtk_box_pack_start_defaults(GTK_BOX(bbox), e->run_cmd);
|
gtk_box_pack_start(GTK_BOX(bbox), label, TRUE, TRUE, 0);
|
||||||
gtk_box_pack_start(GTK_BOX(bbox), button, FALSE, FALSE, 0);
|
gtk_box_pack_start(GTK_BOX(bbox), button, FALSE, FALSE, 0);
|
||||||
gtk_table_attach(GTK_TABLE(table), bbox, 1, 2, 5, 6,
|
gtk_table_attach(GTK_TABLE(table), bbox, 0, 2, 4, 5,
|
||||||
(GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
|
(GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
|
||||||
(GtkAttachOptions) (0), 0, 0);
|
(GtkAttachOptions) (GTK_FILL), 0, 0);
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
label = gtk_label_new(_("File patterns:"));
|
label = gtk_label_new(_("File patterns:"));
|
||||||
@ -478,7 +502,7 @@ static void create_properties_dialog(PropertyDialogElements *e)
|
|||||||
gtk_table_attach(GTK_TABLE(table), label, 0, 1, 6, 7,
|
gtk_table_attach(GTK_TABLE(table), label, 0, 1, 6, 7,
|
||||||
(GtkAttachOptions) (GTK_FILL),
|
(GtkAttachOptions) (GTK_FILL),
|
||||||
(GtkAttachOptions) (GTK_FILL), 0, 0);
|
(GtkAttachOptions) (GTK_FILL), 0, 0);
|
||||||
gtk_misc_set_alignment(GTK_MISC(label), -1, 0);
|
gtk_misc_set_alignment(GTK_MISC(label), 0, 0);
|
||||||
|
|
||||||
e->patterns = gtk_text_view_new();
|
e->patterns = gtk_text_view_new();
|
||||||
swin = gtk_scrolled_window_new(NULL, NULL);
|
swin = gtk_scrolled_window_new(NULL, NULL);
|
||||||
@ -491,7 +515,6 @@ static void create_properties_dialog(PropertyDialogElements *e)
|
|||||||
(GtkAttachOptions) (0), 0, 0);
|
(GtkAttachOptions) (0), 0, 0);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
notebook = ui_lookup_widget(e->dialog, "project_notebook");
|
|
||||||
label = gtk_label_new(_("Project"));
|
label = gtk_label_new(_("Project"));
|
||||||
gtk_widget_show(table); /* needed to switch current page */
|
gtk_widget_show(table); /* needed to switch current page */
|
||||||
gtk_notebook_insert_page(GTK_NOTEBOOK(notebook), table, label, 0);
|
gtk_notebook_insert_page(GTK_NOTEBOOK(notebook), table, label, 0);
|
||||||
@ -545,11 +568,6 @@ void project_properties(void)
|
|||||||
|
|
||||||
gtk_entry_set_text(GTK_ENTRY(e->file_name), p->file_name);
|
gtk_entry_set_text(GTK_ENTRY(e->file_name), p->file_name);
|
||||||
gtk_entry_set_text(GTK_ENTRY(e->base_path), p->base_path);
|
gtk_entry_set_text(GTK_ENTRY(e->base_path), p->base_path);
|
||||||
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(e->make_in_base_path),
|
|
||||||
p->make_in_base_path);
|
|
||||||
if (p->run_cmd != NULL)
|
|
||||||
gtk_entry_set_text(GTK_ENTRY(e->run_cmd), p->run_cmd);
|
|
||||||
|
|
||||||
gtk_widget_show_all(e->dialog);
|
gtk_widget_show_all(e->dialog);
|
||||||
|
|
||||||
retry:
|
retry:
|
||||||
@ -562,6 +580,7 @@ void project_properties(void)
|
|||||||
stash_group_update(indent_group, e->dialog);
|
stash_group_update(indent_group, e->dialog);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
build_free_fields( e->build_properties );
|
||||||
gtk_widget_destroy(e->dialog);
|
gtk_widget_destroy(e->dialog);
|
||||||
g_free(e);
|
g_free(e);
|
||||||
}
|
}
|
||||||
@ -700,13 +719,12 @@ static gboolean update_config(const PropertyDialogElements *e)
|
|||||||
|
|
||||||
if (! new_project) /* save properties specific fields */
|
if (! new_project) /* save properties specific fields */
|
||||||
{
|
{
|
||||||
GtkTextIter start, end;
|
GtkTextIter start, end;
|
||||||
/*gchar *tmp;*/
|
GtkTextBuffer *buffer;
|
||||||
GtkTextBuffer *buffer;
|
GeanyDocument *doc = document_get_current();
|
||||||
|
BuildDestination menu_dst;
|
||||||
p->make_in_base_path = gtk_toggle_button_get_active(
|
GeanyBuildCommand *oldvalue;
|
||||||
GTK_TOGGLE_BUTTON(e->make_in_base_path));
|
GeanyFiletype *ft=NULL;
|
||||||
setptr(p->run_cmd, g_strdup(gtk_entry_get_text(GTK_ENTRY(e->run_cmd))));
|
|
||||||
|
|
||||||
/* get and set the project description */
|
/* get and set the project description */
|
||||||
buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(e->description));
|
buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(e->description));
|
||||||
@ -714,6 +732,32 @@ static gboolean update_config(const PropertyDialogElements *e)
|
|||||||
gtk_text_buffer_get_end_iter(buffer, &end);
|
gtk_text_buffer_get_end_iter(buffer, &end);
|
||||||
setptr(p->description, g_strdup(gtk_text_buffer_get_text(buffer, &start, &end, FALSE)));
|
setptr(p->description, g_strdup(gtk_text_buffer_get_text(buffer, &start, &end, FALSE)));
|
||||||
|
|
||||||
|
/* read the project build menu */
|
||||||
|
if ( doc!=NULL )ft=doc->file_type;
|
||||||
|
if ( ft!=NULL )
|
||||||
|
{
|
||||||
|
menu_dst.dst[GEANY_GBG_FT] = &(ft->projfilecmds);
|
||||||
|
oldvalue = ft->projfilecmds;
|
||||||
|
menu_dst.fileregexstr = &(ft->projerror_regex_string);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
menu_dst.dst[GEANY_GBG_FT] = NULL;
|
||||||
|
oldvalue = NULL;
|
||||||
|
menu_dst.fileregexstr = NULL;
|
||||||
|
}
|
||||||
|
menu_dst.dst[GEANY_GBG_NON_FT] = &non_ft_proj;
|
||||||
|
menu_dst.dst[GEANY_GBG_EXEC] = &exec_proj;
|
||||||
|
menu_dst.nonfileregexstr = ®ex_proj;
|
||||||
|
build_read_commands( &menu_dst, e->build_properties, GTK_RESPONSE_ACCEPT );
|
||||||
|
if (ft!=NULL && ft->projfilecmds!=oldvalue && ft->project_list_entry<0)
|
||||||
|
{
|
||||||
|
if (p->build_filetypes_list==NULL)p->build_filetypes_list = g_ptr_array_new();
|
||||||
|
ft->project_list_entry = p->build_filetypes_list->len;
|
||||||
|
g_ptr_array_add(p->build_filetypes_list, ft);
|
||||||
|
}
|
||||||
|
build_menu_update(doc);
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
/* get and set the project file patterns */
|
/* get and set the project file patterns */
|
||||||
buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(e->patterns));
|
buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(e->patterns));
|
||||||
@ -821,35 +865,6 @@ static void on_file_save_button_clicked(GtkButton *button, PropertyDialogElement
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void on_file_open_button_clicked(GtkButton *button, PropertyDialogElements *e)
|
|
||||||
{
|
|
||||||
#ifdef G_OS_WIN32
|
|
||||||
gchar *path = win32_show_project_open_dialog(e->dialog, _("Choose Project Run Command"),
|
|
||||||
gtk_entry_get_text(GTK_ENTRY(e->run_cmd)), FALSE, FALSE);
|
|
||||||
if (path != NULL)
|
|
||||||
{
|
|
||||||
gtk_entry_set_text(GTK_ENTRY(e->run_cmd), path);
|
|
||||||
g_free(path);
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
GtkWidget *dialog;
|
|
||||||
|
|
||||||
/* initialise the dialog */
|
|
||||||
dialog = gtk_file_chooser_dialog_new(_("Choose Project Run Command"), NULL,
|
|
||||||
GTK_FILE_CHOOSER_ACTION_OPEN,
|
|
||||||
GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
|
|
||||||
GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL);
|
|
||||||
gtk_widget_set_name(dialog, "GeanyDialog");
|
|
||||||
gtk_window_set_destroy_with_parent(GTK_WINDOW(dialog), TRUE);
|
|
||||||
gtk_window_set_skip_taskbar_hint(GTK_WINDOW(dialog), TRUE);
|
|
||||||
gtk_window_set_type_hint(GTK_WINDOW(dialog), GDK_WINDOW_TYPE_HINT_DIALOG);
|
|
||||||
gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_ACCEPT);
|
|
||||||
|
|
||||||
run_dialog(dialog, e->run_cmd);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* sets the project base path and the project file name according to the project name */
|
/* sets the project base path and the project file name according to the project name */
|
||||||
static void on_name_entry_changed(GtkEditable *editable, PropertyDialogElements *e)
|
static void on_name_entry_changed(GtkEditable *editable, PropertyDialogElements *e)
|
||||||
{
|
{
|
||||||
@ -948,10 +963,9 @@ static gboolean load_config(const gchar *filename)
|
|||||||
p->description = utils_get_setting_string(config, "project", "description", "");
|
p->description = utils_get_setting_string(config, "project", "description", "");
|
||||||
p->file_name = utils_get_utf8_from_locale(filename);
|
p->file_name = utils_get_utf8_from_locale(filename);
|
||||||
p->base_path = utils_get_setting_string(config, "project", "base_path", "");
|
p->base_path = utils_get_setting_string(config, "project", "base_path", "");
|
||||||
p->make_in_base_path = utils_get_setting_boolean(config, "project", "make_in_base_path", TRUE);
|
|
||||||
p->run_cmd = utils_get_setting_string(config, "project", "run_cmd", "");
|
|
||||||
p->file_patterns = g_key_file_get_string_list(config, "project", "file_patterns", NULL, NULL);
|
p->file_patterns = g_key_file_get_string_list(config, "project", "file_patterns", NULL, NULL);
|
||||||
|
|
||||||
|
build_load_menu( config, GEANY_BCS_PROJ, (gpointer)p );
|
||||||
if (project_prefs.project_session)
|
if (project_prefs.project_session)
|
||||||
{
|
{
|
||||||
/* save current (non-project) session (it could has been changed since program startup) */
|
/* save current (non-project) session (it could has been changed since program startup) */
|
||||||
@ -998,9 +1012,6 @@ static gboolean write_config(gboolean emit_signal)
|
|||||||
|
|
||||||
if (p->description)
|
if (p->description)
|
||||||
g_key_file_set_string(config, "project", "description", p->description);
|
g_key_file_set_string(config, "project", "description", p->description);
|
||||||
g_key_file_set_boolean(config, "project", "make_in_base_path", p->make_in_base_path);
|
|
||||||
if (p->run_cmd)
|
|
||||||
g_key_file_set_string(config, "project", "run_cmd", p->run_cmd);
|
|
||||||
if (p->file_patterns)
|
if (p->file_patterns)
|
||||||
g_key_file_set_string_list(config, "project", "file_patterns",
|
g_key_file_set_string_list(config, "project", "file_patterns",
|
||||||
(const gchar**) p->file_patterns, g_strv_length(p->file_patterns));
|
(const gchar**) p->file_patterns, g_strv_length(p->file_patterns));
|
||||||
@ -1008,7 +1019,7 @@ static gboolean write_config(gboolean emit_signal)
|
|||||||
/* store the session files into the project too */
|
/* store the session files into the project too */
|
||||||
if (project_prefs.project_session)
|
if (project_prefs.project_session)
|
||||||
configuration_save_session_files(config);
|
configuration_save_session_files(config);
|
||||||
|
build_save_menu( config, (gpointer)p, GEANY_BCS_PROJ );
|
||||||
if (emit_signal)
|
if (emit_signal)
|
||||||
{
|
{
|
||||||
g_signal_emit_by_name(geany_object, "project-save", config);
|
g_signal_emit_by_name(geany_object, "project-save", config);
|
||||||
@ -1055,19 +1066,6 @@ gchar *project_get_base_path(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Returns: NULL if the default path should be used, or a UTF-8 path.
|
|
||||||
* Maybe in future this will support a separate project make path from base path. */
|
|
||||||
gchar *project_get_make_dir(void)
|
|
||||||
{
|
|
||||||
GeanyProject *project = app->project;
|
|
||||||
|
|
||||||
if (project && ! project->make_in_base_path)
|
|
||||||
return NULL;
|
|
||||||
else
|
|
||||||
return project_get_base_path();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* This is to save project-related global settings, NOT project file settings. */
|
/* This is to save project-related global settings, NOT project file settings. */
|
||||||
void project_save_prefs(GKeyFile *config)
|
void project_save_prefs(GKeyFile *config)
|
||||||
{
|
{
|
||||||
@ -1110,7 +1108,7 @@ void project_setup_prefs(void)
|
|||||||
static gboolean callback_setup = FALSE;
|
static gboolean callback_setup = FALSE;
|
||||||
|
|
||||||
g_return_if_fail(local_prefs.project_file_path != NULL);
|
g_return_if_fail(local_prefs.project_file_path != NULL);
|
||||||
|
|
||||||
gtk_entry_set_text(GTK_ENTRY(path_entry), local_prefs.project_file_path);
|
gtk_entry_set_text(GTK_ENTRY(path_entry), local_prefs.project_file_path);
|
||||||
if (! callback_setup)
|
if (! callback_setup)
|
||||||
{ /* connect the callback only once */
|
{ /* connect the callback only once */
|
||||||
|
@ -35,14 +35,16 @@ typedef struct GeanyProject
|
|||||||
gchar *description; /**< Short description of the project. */
|
gchar *description; /**< Short description of the project. */
|
||||||
gchar *file_name; /**< Where the project file is stored (in UTF-8). */
|
gchar *file_name; /**< Where the project file is stored (in UTF-8). */
|
||||||
gchar *base_path; /**< Base path of the project directory (in UTF-8, maybe relative). */
|
gchar *base_path; /**< Base path of the project directory (in UTF-8, maybe relative). */
|
||||||
gchar *run_cmd; /**< Project run command (in UTF-8). */
|
|
||||||
/** Identifier whether it is a pure Geany project or modified/extended
|
/** Identifier whether it is a pure Geany project or modified/extended
|
||||||
* by a plugin. */
|
* by a plugin. */
|
||||||
gint type;
|
gint type;
|
||||||
gchar **file_patterns; /**< Array of filename extension patterns. */
|
gchar **file_patterns; /**< Array of filename extension patterns. */
|
||||||
gboolean make_in_base_path;
|
|
||||||
|
|
||||||
struct GeanyProjectPrivate *priv; /* must be last, append fields before this item */
|
struct GeanyProjectPrivate *priv; /* must be last, append fields before this item */
|
||||||
|
#ifdef GEANY_PRIVATE
|
||||||
|
/* Do not use following fields in plugins */
|
||||||
|
GPtrArray *build_filetypes_list; /* *< Project has custom filetype builds for these. */
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
GeanyProject;
|
GeanyProject;
|
||||||
|
|
||||||
@ -79,8 +81,6 @@ gboolean project_load_file_with_session(const gchar *locale_file_name);
|
|||||||
|
|
||||||
gchar *project_get_base_path(void);
|
gchar *project_get_base_path(void);
|
||||||
|
|
||||||
gchar *project_get_make_dir(void);
|
|
||||||
|
|
||||||
|
|
||||||
void project_save_prefs(GKeyFile *config);
|
void project_save_prefs(GKeyFile *config);
|
||||||
|
|
||||||
|
@ -218,14 +218,16 @@ end\n\
|
|||||||
x = StdClass.new\n\
|
x = StdClass.new\n\
|
||||||
";
|
";
|
||||||
|
|
||||||
static const gchar templates_filetype_python[] = "#!/usr/bin/env python\n#\n\
|
static const gchar templates_filetype_python[] = "#!/usr/bin/env python\n\
|
||||||
|
# -*- coding: utf-8 -*-\n#\n\
|
||||||
{fileheader}\n\n\
|
{fileheader}\n\n\
|
||||||
\n\
|
\n\
|
||||||
def main():\n\
|
def main():\n\
|
||||||
\n\
|
\n\
|
||||||
return 0\n\
|
return 0\n\
|
||||||
\n\
|
\n\
|
||||||
if __name__ == '__main__': main()\n\
|
if __name__ == '__main__':\n\
|
||||||
|
main()\n\
|
||||||
";
|
";
|
||||||
|
|
||||||
static const gchar templates_filetype_latex[] = "\
|
static const gchar templates_filetype_latex[] = "\
|
||||||
|
@ -1719,13 +1719,20 @@ void utils_tidy_path(gchar *filename)
|
|||||||
const gchar *c, *needle;
|
const gchar *c, *needle;
|
||||||
gchar *tmp;
|
gchar *tmp;
|
||||||
gssize pos;
|
gssize pos;
|
||||||
|
gboolean preserve_double_backslash = FALSE;
|
||||||
|
|
||||||
g_return_if_fail(g_path_is_absolute(filename));
|
g_return_if_fail(g_path_is_absolute(filename));
|
||||||
|
|
||||||
|
if (str->len >= 2 && strncmp(str->str, "\\\\", 2) == 0)
|
||||||
|
preserve_double_backslash = TRUE;
|
||||||
|
|
||||||
/* replace "/./" and "//" */
|
/* replace "/./" and "//" */
|
||||||
utils_string_replace_all(str, G_DIR_SEPARATOR_S "." G_DIR_SEPARATOR_S, G_DIR_SEPARATOR_S);
|
utils_string_replace_all(str, G_DIR_SEPARATOR_S "." G_DIR_SEPARATOR_S, G_DIR_SEPARATOR_S);
|
||||||
utils_string_replace_all(str, G_DIR_SEPARATOR_S G_DIR_SEPARATOR_S, G_DIR_SEPARATOR_S);
|
utils_string_replace_all(str, G_DIR_SEPARATOR_S G_DIR_SEPARATOR_S, G_DIR_SEPARATOR_S);
|
||||||
|
|
||||||
|
if (preserve_double_backslash)
|
||||||
|
g_string_prepend(str, "\\");
|
||||||
|
|
||||||
/* replace "/.." */
|
/* replace "/.." */
|
||||||
needle = G_DIR_SEPARATOR_S "..";
|
needle = G_DIR_SEPARATOR_S "..";
|
||||||
while (1)
|
while (1)
|
||||||
|
@ -644,8 +644,11 @@ gint win32_message_dialog_unsaved(const gchar *msg)
|
|||||||
void win32_open_browser(const gchar *uri)
|
void win32_open_browser(const gchar *uri)
|
||||||
{
|
{
|
||||||
if (strncmp(uri, "file://", 7) == 0)
|
if (strncmp(uri, "file://", 7) == 0)
|
||||||
|
{
|
||||||
uri += 7;
|
uri += 7;
|
||||||
|
while (*uri == '/')
|
||||||
|
uri++;
|
||||||
|
}
|
||||||
ShellExecute(NULL, "open", uri, NULL, NULL, SW_SHOWNORMAL);
|
ShellExecute(NULL, "open", uri, NULL, NULL, SW_SHOWNORMAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -76,8 +76,8 @@ static void installPHPRegex (const langType language)
|
|||||||
"\\2", "i,interface,interfaces", NULL);
|
"\\2", "i,interface,interfaces", NULL);
|
||||||
addTagRegex(language, "(^|[ \t])define[ \t]*\\([ \t]*['\"]?([" ALPHA "_][" ALNUM "_]*)",
|
addTagRegex(language, "(^|[ \t])define[ \t]*\\([ \t]*['\"]?([" ALPHA "_][" ALNUM "_]*)",
|
||||||
"\\2", "d,macro,constant definitions", NULL);
|
"\\2", "d,macro,constant definitions", NULL);
|
||||||
addTagRegex(language, "(^|[ \t])function[ \t]+&?[ \t]*([" ALPHA "_][" ALNUM "_]*)",
|
addTagRegex(language, "^[ \t]*((public|protected|private|static)[ \t]+)*function[ \t]+&?[ \t]*([" ALPHA "_][" ALNUM "_]*)",
|
||||||
"\\2", "f,function,functions", NULL);
|
"\\3", "f,function,functions", NULL);
|
||||||
addTagRegex(language, "(^|[ \t])(\\$|::\\$|\\$this->)([" ALPHA "_][" ALNUM "_]*)[ \t]*=",
|
addTagRegex(language, "(^|[ \t])(\\$|::\\$|\\$this->)([" ALPHA "_][" ALNUM "_]*)[ \t]*=",
|
||||||
"\\3", "v,variable,variables", NULL);
|
"\\3", "v,variable,variables", NULL);
|
||||||
addTagRegex(language, "(^|[ \t])(var|public|protected|private|static)[ \t]+\\$([" ALPHA "_][" ALNUM "_]*)[ \t]*[=;]",
|
addTagRegex(language, "(^|[ \t])(var|public|protected|private|static)[ \t]+\\$([" ALPHA "_][" ALNUM "_]*)[ \t]*[=;]",
|
||||||
|
@ -166,7 +166,7 @@ static const char *skipEverything (const char *cp)
|
|||||||
{
|
{
|
||||||
for (; *cp; cp++)
|
for (; *cp; cp++)
|
||||||
{
|
{
|
||||||
if (*cp == '"' || *cp == '\'')
|
if (*cp == '"' || *cp == '\'' || *cp == '#')
|
||||||
{
|
{
|
||||||
cp = skipString(cp);
|
cp = skipString(cp);
|
||||||
if (!*cp) break;
|
if (!*cp) break;
|
||||||
|
@ -314,7 +314,7 @@
|
|||||||
/* #undef volatile */
|
/* #undef volatile */
|
||||||
|
|
||||||
/* Version number of package */
|
/* Version number of package */
|
||||||
#define VERSION "0.18"
|
#define VERSION "0.19"
|
||||||
|
|
||||||
#define REVISION "-1"
|
#define REVISION "-1"
|
||||||
|
|
||||||
|
53
wscript
53
wscript
@ -35,17 +35,26 @@ Missing features: --enable-binreloc, make targets: dist, pdf (in doc/)
|
|||||||
Known issues: Dependency handling is buggy, e.g. if src/document.h is
|
Known issues: Dependency handling is buggy, e.g. if src/document.h is
|
||||||
changed, depending source files are not rebuilt (maybe Waf bug).
|
changed, depending source files are not rebuilt (maybe Waf bug).
|
||||||
|
|
||||||
|
The code of this file itself loosely follows PEP 8 with some exceptions
|
||||||
|
(line width 100 characters and some other minor things).
|
||||||
|
|
||||||
Requires WAF 1.5.7 and Python 2.4 (or later).
|
Requires WAF 1.5.7 and Python 2.4 (or later).
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
|
||||||
import Build, Configure, Options, Utils
|
import Build
|
||||||
import sys, os, shutil, tempfile
|
import Configure
|
||||||
|
import Options
|
||||||
|
import Utils
|
||||||
|
import sys
|
||||||
|
import os
|
||||||
|
import shutil
|
||||||
|
import tempfile
|
||||||
from distutils import version
|
from distutils import version
|
||||||
|
|
||||||
|
|
||||||
APPNAME = 'geany'
|
APPNAME = 'geany'
|
||||||
VERSION = '0.18'
|
VERSION = '0.19'
|
||||||
|
|
||||||
srcdir = '.'
|
srcdir = '.'
|
||||||
blddir = '_build_'
|
blddir = '_build_'
|
||||||
@ -263,8 +272,11 @@ def configure(conf):
|
|||||||
conf.env.append_value('CCFLAGS', '-g -DGEANY_DEBUG'.split())
|
conf.env.append_value('CCFLAGS', '-g -DGEANY_DEBUG'.split())
|
||||||
|
|
||||||
conf.env.append_value('CCFLAGS', '-DHAVE_CONFIG_H')
|
conf.env.append_value('CCFLAGS', '-DHAVE_CONFIG_H')
|
||||||
|
# for now define GEANY_PRIVATE for all files, even though it should just be for src/*.
|
||||||
|
conf.env.append_value('CCFLAGS', '-DGEANY_PRIVATE')
|
||||||
# Scintilla flags
|
# Scintilla flags
|
||||||
conf.env.append_value('CXXFLAGS', '-DNDEBUG -DGTK -DGTK2 -DSCI_LEXER -DG_THREADS_IMPL_NONE'.split())
|
conf.env.append_value('CXXFLAGS',
|
||||||
|
'-DNDEBUG -DGTK -DGTK2 -DSCI_LEXER -DG_THREADS_IMPL_NONE'.split())
|
||||||
|
|
||||||
|
|
||||||
def set_options(opt):
|
def set_options(opt):
|
||||||
@ -277,9 +289,11 @@ def set_options(opt):
|
|||||||
opt.add_option('--disable-plugins', action='store_true', default=False,
|
opt.add_option('--disable-plugins', action='store_true', default=False,
|
||||||
help='compile without plugin support [default: No]', dest='no_plugins')
|
help='compile without plugin support [default: No]', dest='no_plugins')
|
||||||
opt.add_option('--disable-socket', action='store_true', default=False,
|
opt.add_option('--disable-socket', action='store_true', default=False,
|
||||||
help='compile without support to detect a running instance [[default: No]', dest='no_socket')
|
help='compile without support to detect a running instance [[default: No]',
|
||||||
|
dest='no_socket')
|
||||||
opt.add_option('--disable-vte', action='store_true', default=target_is_win32(os.environ),
|
opt.add_option('--disable-vte', action='store_true', default=target_is_win32(os.environ),
|
||||||
help='compile without support for an embedded virtual terminal [[default: No]', dest='no_vte')
|
help='compile without support for an embedded virtual terminal [[default: No]',
|
||||||
|
dest='no_vte')
|
||||||
opt.add_option('--enable-gnu-regex', action='store_true', default=False,
|
opt.add_option('--enable-gnu-regex', action='store_true', default=False,
|
||||||
help='compile with included GNU regex library [default: No]', dest='gnu_regex')
|
help='compile with included GNU regex library [default: No]', dest='gnu_regex')
|
||||||
# Paths
|
# Paths
|
||||||
@ -292,6 +306,8 @@ def set_options(opt):
|
|||||||
# Actions
|
# Actions
|
||||||
opt.add_option('--htmldoc', action='store_true', default=False,
|
opt.add_option('--htmldoc', action='store_true', default=False,
|
||||||
help='generate HTML documentation', dest='htmldoc')
|
help='generate HTML documentation', dest='htmldoc')
|
||||||
|
opt.add_option('--hackingdoc', action='store_true', default=False,
|
||||||
|
help='generate HTML documentation from HACKING file', dest='hackingdoc')
|
||||||
opt.add_option('--apidoc', action='store_true', default=False,
|
opt.add_option('--apidoc', action='store_true', default=False,
|
||||||
help='generate API reference documentation', dest='apidoc')
|
help='generate API reference documentation', dest='apidoc')
|
||||||
opt.add_option('--update-po', action='store_true', default=False,
|
opt.add_option('--update-po', action='store_true', default=False,
|
||||||
@ -456,7 +472,7 @@ def build(bld):
|
|||||||
src/highlighting.h src/keybindings.h src/main.h src/msgwindow.h src/plugindata.h
|
src/highlighting.h src/keybindings.h src/main.h src/msgwindow.h src/plugindata.h
|
||||||
src/plugins.h src/prefs.h src/project.h src/sciwrappers.h src/search.h src/support.h
|
src/plugins.h src/prefs.h src/project.h src/sciwrappers.h src/search.h src/support.h
|
||||||
src/templates.h src/toolbar.h src/ui_utils.h src/utils.h plugins/pluginmacros.h
|
src/templates.h src/toolbar.h src/ui_utils.h src/utils.h plugins/pluginmacros.h
|
||||||
plugins/geanyplugin.h plugins/geanyfunctions.h ''')
|
plugins/geanyplugin.h plugins/geanyfunctions.h src/build.h ''')
|
||||||
bld.install_files('${PREFIX}/include/geany/scintilla', '''
|
bld.install_files('${PREFIX}/include/geany/scintilla', '''
|
||||||
scintilla/include/SciLexer.h scintilla/include/Scintilla.h
|
scintilla/include/SciLexer.h scintilla/include/Scintilla.h
|
||||||
scintilla/include/Scintilla.iface scintilla/include/ScintillaWidget.h ''')
|
scintilla/include/Scintilla.iface scintilla/include/ScintillaWidget.h ''')
|
||||||
@ -472,9 +488,9 @@ def build(bld):
|
|||||||
html_dir = '' if is_win32 else 'html/'
|
html_dir = '' if is_win32 else 'html/'
|
||||||
html_name = 'Manual.html' if is_win32 else 'index.html'
|
html_name = 'Manual.html' if is_win32 else 'index.html'
|
||||||
for f in 'AUTHORS ChangeLog COPYING README NEWS THANKS TODO'.split():
|
for f in 'AUTHORS ChangeLog COPYING README NEWS THANKS TODO'.split():
|
||||||
bld.install_as("%s/%s%s" % (base_dir, ucFirst(f, is_win32), ext), f)
|
bld.install_as("%s/%s%s" % (base_dir, uc_first(f, is_win32), ext), f)
|
||||||
bld.install_files('${DOCDIR}/%simages' % html_dir, 'doc/images/*.png')
|
bld.install_files('${DOCDIR}/%simages' % html_dir, 'doc/images/*.png')
|
||||||
bld.install_as('${DOCDIR}/%s' % ucFirst('manual.txt', is_win32), 'doc/geany.txt')
|
bld.install_as('${DOCDIR}/%s' % uc_first('manual.txt', is_win32), 'doc/geany.txt')
|
||||||
bld.install_as('${DOCDIR}/%s%s' % (html_dir, html_name), 'doc/geany.html')
|
bld.install_as('${DOCDIR}/%s%s' % (html_dir, html_name), 'doc/geany.html')
|
||||||
bld.install_as('${DOCDIR}/ScintillaLicense.txt', 'scintilla/License.txt')
|
bld.install_as('${DOCDIR}/ScintillaLicense.txt', 'scintilla/License.txt')
|
||||||
if is_win32:
|
if is_win32:
|
||||||
@ -498,7 +514,8 @@ def build(bld):
|
|||||||
def shutdown():
|
def shutdown():
|
||||||
is_win32 = False if not Build.bld else target_is_win32(Build.bld.env)
|
is_win32 = False if not Build.bld else target_is_win32(Build.bld.env)
|
||||||
# the following code was taken from midori's WAF script, thanks
|
# the following code was taken from midori's WAF script, thanks
|
||||||
if not is_win32 and not Options.options.destdir and (Options.commands['install'] or Options.commands['uninstall']):
|
if not is_win32 and not Options.options.destdir and (Options.commands['install'] or \
|
||||||
|
Options.commands['uninstall']):
|
||||||
dir = Build.bld.get_install_path('${DATADIR}/icons/hicolor')
|
dir = Build.bld.get_install_path('${DATADIR}/icons/hicolor')
|
||||||
icon_cache_updated = False
|
icon_cache_updated = False
|
||||||
try:
|
try:
|
||||||
@ -522,15 +539,23 @@ def shutdown():
|
|||||||
'doxygen could not be found. Please install the doxygen package.')
|
'doxygen could not be found. Please install the doxygen package.')
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
if Options.options.htmldoc:
|
if Options.options.htmldoc or Options.options.hackingdoc:
|
||||||
# first try rst2html.py as it is the upstream default, fall back to rst2html
|
# first try rst2html.py as it is the upstream default, fall back to rst2html
|
||||||
cmd = Configure.find_program_impl(Build.bld.env, 'rst2html.py')
|
cmd = Configure.find_program_impl(Build.bld.env, 'rst2html.py')
|
||||||
if not cmd:
|
if not cmd:
|
||||||
cmd = Configure.find_program_impl(Build.bld.env, 'rst2html')
|
cmd = Configure.find_program_impl(Build.bld.env, 'rst2html')
|
||||||
if cmd:
|
if cmd:
|
||||||
|
if Options.options.hackingdoc:
|
||||||
|
file_in = '../HACKING'
|
||||||
|
file_out = 'hacking.html'
|
||||||
|
msg = 'HACKING HTML'
|
||||||
|
else:
|
||||||
|
file_in = 'geany.txt'
|
||||||
|
file_out = 'geany.html'
|
||||||
|
msg = 'HTML'
|
||||||
os.chdir('doc')
|
os.chdir('doc')
|
||||||
ret = launch(cmd + ' -stg --stylesheet=geany.css geany.txt geany.html',
|
ret = launch(cmd + ' -stg --stylesheet=geany.css %s %s' % (file_in, file_out),
|
||||||
'Generating HTML documentation')
|
'Generating %s documentation' % msg)
|
||||||
else:
|
else:
|
||||||
Utils.pprint('RED',
|
Utils.pprint('RED',
|
||||||
'rst2html.py could not be found. Please install the Python docutils package.')
|
'rst2html.py could not be found. Please install the Python docutils package.')
|
||||||
@ -579,7 +604,7 @@ def print_message(conf, msg, result, color = 'GREEN'):
|
|||||||
conf.check_message_2(result, color)
|
conf.check_message_2(result, color)
|
||||||
|
|
||||||
|
|
||||||
def ucFirst(s, is_win32):
|
def uc_first(s, is_win32):
|
||||||
if is_win32:
|
if is_win32:
|
||||||
return s.title()
|
return s.title()
|
||||||
return s
|
return s
|
||||||
|
Loading…
x
Reference in New Issue
Block a user