PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Хочу сделать плаг для Geany


Хочу сделать плаг для Geany

Сообщений 1 страница 6 из 6

1

На оф.форуме тему создал, никто не ответил.

В общем нашёл тему по плагам Geany, там первая ссылка простой плаг как пример.

Переделал его пока так

Код:
; Лицензия будет тут
; #include <geanyplugin.h>
XIncludeFile "geanyplugin.pbi"

; *plugin - структура GeanyPlugin
; pdata - указатель gpointer, возможно на структуру

Procedure.b hello_init(*plugin, gpointer pdata)
; 	printf("Привет мир из плагина!\n");
	MessageRequester("", "Привет мир из плагина!");
;     Выполните расширенную настройку здесь
    Return #True
EndProcedure

Procedure hello_cleanup(*plugin, pdata)
;     printf("Bye World :-(\n");
	MessageRequester("", "Прощай мир  :-(");
EndProcedure

; G_MODULE_EXPORT
ProcedureCDLL geany_load_module(*plugin)
;     Шаг 1: Устанавливает метаданные
    *plugin\nfo\name = "ПриветМир"
    *plugin\info\description = "Просто еще один инструмент, чтобы сказать Привет мир"
    *plugin\info\version = "1.0"
    *plugin\info\author = "John Doe <john.doe@example.org>"
;     Шаг 2: Устанавливает функции
    *plugin\funcs\init = @hello_init()
    *plugin\funcs\cleanup = @hello_cleanup()
;    Шаг 3: Регистрация плагина
    GEANY_PLUGIN_REGISTER(*plugin, 225);
;     В качестве альтернативы:
;     GEANY_PLUGIN_REGISTER_FULL(*plugin, 225, Data, free_func);
EndProcedure

Погуглил geanyplugin.h, но в нём просто куча инклудов, почти 30 штук. Предположим из них мне нужен только plugindata.h. Как я понял функция geany_load_module() как и в AkelPad получает указатель на структуру *plugin, из которого в примере видны некоторые поля, но мне надо лишь получить дескриптор окна Scintilla ну и как обычно указатель на функцию из Scintilla. Также как и в Notepad++ есть функция подключения плага hello_init() и отключения hello_cleanup(). Ищу структуру, возможно она в plugindata.h.

0

2

AZJIO написал(а):

Ищу структуру

GeanyPlugin?
Файл https://github.com/geany/geany/blob/mas … ugindata.h

0

3

Добавил  пару структур, а в них ссылки на ещё более сложные структуры, что то уже сомневаюсь в своих силах.

Код:
; apt install geany-plugin-devhelp

; Структуры
Structure PluginInfo Align #PB_Structure_AlignC
	*name
	*description
	*version
	*author
EndStructure

Structure GeanyPlugin Align #PB_Structure_AlignC
	*info.PluginInfo
	*geany_data.GeanyData
	*funcs.GeanyPluginFuncs
; 	*proxy_funcs.GeanyProxyFuncs
; 	*priv.GeanyPluginPrivate
EndStructure

; Лицензия будет тут
; #include <geanyplugin.h>
; XIncludeFile "geanyplugin.pbi"

; *plugin - структура GeanyPlugin
; pdata - указатель gpointer, возможно на структуру

Procedure.b hello_init(*plugin.GeanyPlugin, gpointer pdata)
; 	printf("Привет мир из плагина!\n");
	MessageRequester("", "Привет мир из плагина!");
;     Выполните расширенную настройку здесь
    Return #True
EndProcedure

Procedure hello_cleanup(*plugin, pdata)
;     printf("Bye World :-(\n");
	MessageRequester("", "Прощай мир  :-(");
EndProcedure

; G_MODULE_EXPORT
ProcedureCDLL geany_load_module(*plugin.GeanyPlugin)
	;     Шаг 1: Устанавливает метаданные
	
; 	*pPluginInfo=AllocateStructure(PluginInfo)
; 	*plugin\nfo=AllocateStructure(PluginInfo)
	
    *plugin\nfo\name = "ПриветМир"
    *plugin\info\description = "Просто еще один инструмент, чтобы сказать Привет мир"
    *plugin\info\version = "1.0"
    *plugin\info\author = "John Doe <john.doe@example.org>"
;     Шаг 2: Устанавливает функции
    *plugin\funcs\init = @hello_init()
    *plugin\funcs\cleanup = @hello_cleanup()
;    Шаг 3: Регистрация плагина
    GEANY_PLUGIN_REGISTER(*plugin, 225);
;     В качестве альтернативы:
;     GEANY_PLUGIN_REGISTER_FULL(*plugin, 225, Data, free_func);
EndProcedure

0

4

AZJIO написал(а):

в них ссылки на ещё более сложные структуры

Нужно перевести на PB все используемые структуры...

0

5

Пётр написал(а):

Нужно перевести на PB все используемые структуры...

Это понятно (конечные можно не прописывать если доступ к ним не нужен). Чтобы получить поля структуры GeanyPluginFuncs мне нужно полностью воссоздать предыдущую стркуктуру GeanyData, начинаем создавать, а там 11 структрур и судя по именам в них находится всё, что есть в Geany. Входим в первую GeanyApp, в ней ссылка на структуру GeanyProject, в GeanyProject  структура GeanyProjectPrivate, в GeanyProjectPrivate структура GeanyIndentPrefs, в ней 2 спец типа данных GeanyIndentType и GeanyAutoIndent. По содержимому которых я понял что идёт перечисление (enum) от 0, до количества элементов, где во второй явно указано 0. И это только я изучал вложения первой из 11 ветвей.
А потом ещё тестировать не было ли где то в средине сдвига структуры из-за неправильно указанной ширины. Наверно стоит написать конвертор структур из С++ в PureBasic., по крайней мере последовательность прослеживается.

Код:
typedef enum
{
	GEANY_INDENT_TYPE_SPACES,	/**< Spaces. */
	GEANY_INDENT_TYPE_TABS,    /**< Tabs. */
	GEANY_INDENT_TYPE_BOTH    /**< Both. */
}
GeanyIndentType;

typedef enum
{
	GEANY_AUTOINDENT_NONE = 0,
	GEANY_AUTOINDENT_BASIC,
	GEANY_AUTOINDENT_CURRENTCHARS,
	GEANY_AUTOINDENT_MATCHBRACES
}
GeanyAutoIndent;
Код:
Structure PluginInfo Align #PB_Structure_AlignC
	*name
	*description
	*version
	*author
EndStructure

Structure GeanyPlugin Align #PB_Structure_AlignC
	*info.PluginInfo
	*geany_data.GeanyData
	*funcs.GeanyPluginFuncs
; 	*proxy_funcs.GeanyProxyFuncs
; 	*priv.GeanyPluginPrivate
EndStructure

Structure GeanyData Align #PB_Structure_AlignC
	*app.GeanyApp
	*main_widgets.GeanyMainWidgets
	*filetypes_array
	*prefs.GeanyPrefs
	*interface_prefs.GeanyInterfacePrefs
	*toolbar_prefs.GeanyToolbarPrefs
	*editor_prefs.GeanyEditorPrefs
	*file_prefs.GeanyFilePrefs
	*search_prefs.GeanySearchPrefs
	*tool_prefs.GeanyToolPrefs
	*template_prefs.GeanyTemplatePrefs
	*interface_prefs.GeanyInterfacePrefs
	*_compat
	*object
EndStructure

Structure GeanyApp Align #PB_Structure_AlignC
	debug_mode.b
	*configdir
	*datadir
	*docdir
	*tm_workspace
	*project.GeanyProject
EndStructure

Structure GeanyProject Align #PB_Structure_AlignC
	*name
	*description
	*file_name
	*base_path
	type.i
	file_patterns
	*priv.GeanyProjectPrivate
EndStructure

Structure GeanyProjectPrivate Align #PB_Structure_AlignC
	final_new_line.b
	strip_trailing_spaces.b
	replace_tabs.b
	ensure_convert_new_lines.b
	*indentation.GeanyIndentPrefs
	line_wrapping.b
	line_break_column.i
	auto_continue_multiline.b
	long_line_behaviour.i
	long_line_column.i
	*build_filetypes_list
EndStructure

Structure GeanyIndentPrefs Align #PB_Structure_AlignC
	width.i
	type
	hard_tab_width.i
	auto_indent_mode
	detect_type.b
	detect_width.b
EndStructure

Отредактировано AZJIO (18.07.2021 18:26:38)

0

6

AZJIO написал(а):

Наверно стоит написать конвертор структур из С++ в PureBasic., по крайней мере последовательность прослеживается.

PureBasic\SDK\Header Converter\Header Converter.exe может сэкономить чуток времени

0


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Хочу сделать плаг для Geany