С отрисовкой с краю экрана точно бага. Тк не совпадают координаты по которым запрашивается рисовать окно меню с фактическими.
По поводу первого скорей архитектурный баг и придется переводить на IPC. При вызове отрисовки меню оно сохраняет ид активного окна, и потом при клике делает его активным и отправляет сообщение. Полагаю проблема в том что неправильно с самого начала получает ид окна родительского
libkmenu
Veliant, можешь добавить в 615 строку код, выводящий на доску отладки menu->parent_wnd? Всё таки IPC - штука более затратная, чем кнопки. Не хотелось бы.
Spoiler:
Code: Select all
kos_SetForegroundWindow(menu->parent_wnd);
// send seleted menu id <-- # вот сюда #
if (menu->return_btnid != -1)
{
/*while (kos_GetForegroundWindow() != menu->parent_wnd)
kos_Sleep(100);*/
switch (menu->return_btnid)
{
case 1:
if (menu->level == 0)
break;
kos_SendMessage(SYSEVENT_BTNPRESS, menu->return_btnid);
kos_ThreadYield();
break;
default:
kos_SendMessage(SYSEVENT_BTNPRESS, menu->return_btnid);
kos_ThreadYield();
break;
}
//kos_IPCSend(menu->parent_tid, &menu->return_btnid, sizeof(menu->return_btnid));
}
Чем больше сыра, тем больше в нём дыр. Чем больше дыр, тем меньше в нём собственно сыра. Значит, чем больше сыра, тем меньше сыра!
Не надо ничего добавлять. Вызов mcall 18,3,1(сделать активном окно в слоте 1) действительно не работает. Все окна активируются, рабочий стол - нет. Варианта 2: либо правим ядро, либо информируем через IPC. Если ядро, то надо в файле kernel.asm строки 2316 и 2317 (r5668) убрать:
Тогда окно слота 1 будет активироваться успешно. Я опробовал сей патч, всё работает как положено (бывают же чудеса ). Ну кто c svn работает, поправьте пожалуйста, если возражений нет(мне наново ставить тортоис, качать репизиторий... потом как-нибудь сделаю). Ну или у кого идеи получше.
Code: Select all
sysfn_activate: ; 18.3 = ACTIVATE WINDOW
cmp ecx, 2 ;эту и следующую строку убрать
jb .nowindowactivate
cmp ecx, [TASK_COUNT]
ja .nowindowactivate
Чем больше сыра, тем больше в нём дыр. Чем больше дыр, тем меньше в нём собственно сыра. Значит, чем больше сыра, тем меньше сыра!
Неплохо бы увеличить расстояния между пунктами меню
Из хаоса в космос
GerdtR
Закомиттил rev 5672.
Закомиттил rev 5672.
Code: Select all
cmp ecx, 2 ;эту и следующую строку убрать
jb .nowindowactivate
Из хаоса в космос
Увы, но помогло. И вот в чём дело: моя прога имеет TID больший 4. Рабочий стол принадлежит TID 1. Что ни сделай, а очередь сообщений для TID 1 icon не прочитает. А кнопки приходят в TID 1. Вариант решения такой: добавляем сисфункцию, которая сможет прочитать из чужой очереди сообщений(ну или только активного окна). Некий mcall 72,2. Это самое простое решение(мне так кажется). Можно уже наконец научить Колибри рисовать окна, которые "всегда позади" и уже оно сменит рабочий стол. Или добавить механизм хуков, перехватывать сообщения кнопок для TID 1 и пересылать их в icon. Короче.. идеи, предложения?
PS: или меню перевести на IPC. Интересно, сильно код для рядовых программ усложнится?
PS: или меню перевести на IPC. Интересно, сильно код для рядовых программ усложнится?
Чем больше сыра, тем больше в нём дыр. Чем больше дыр, тем меньше в нём собственно сыра. Значит, чем больше сыра, тем меньше сыра!
А может сделать icon частью рабочего стола?
icon это и есть рабочий столPathoswithin wrote:А может сделать icon частью рабочего стола?
to infinity and beyond
Исправления выложу позже с новыми фишками, а пока хидер для c--
И пример использования
И пример использования
Spoiler:
Code: Select all
#define MEMSIZE 0x10000
#include "..\lib\kolibri.h"
#include "..\lib\mem.h"
#include "..\lib\dll.h"
#include "..\lib\obj\kmenu.h"
dword GetSystemColors()
{
dword buf = malloc(192);
EAX = 48;
EBX = 3;
ECX = buf;
EDX = 192;
$int 0x40
return buf;
}
dword main_menu;
void main() {
int id, key;
dword colors;
dword sub_menu1;
mem_Init();
if (kmenu_load() != 0)
{
notify("Error while loading GUI library /sys/lib/kmenu.obj");
ExitProcess();
}
colors = GetSystemColors();
if (colors == 0)
{
notify("No enough memory for systemcolors struct");
ExitProcess();
}
kmenu.init(colors);
sub_menu1 = kmenu.subm.create();
kmenu.subm.add(sub_menu1, kmenu.item.create(KMENUITEM_NORMAL, "Open", 101));
kmenu.subm.add(sub_menu1, kmenu.item.create(KMENUITEM_NORMAL, "Save", 102));
kmenu.subm.add(sub_menu1, kmenu.item.create(KMENUITEM_SEPARATOR, 0, 0));
kmenu.subm.add(sub_menu1, kmenu.item.create(KMENUITEM_NORMAL, "Exit", 103));
main_menu = kmenu.subm.create();
kmenu.subm.add(main_menu, kmenu.item.create(KMENUITEM_SUBMENU, "File", sub_menu1));
loop() {
switch(WaitEvent()) {
case evButton:
id = GetButtonID();
if (id == 1)
break;
case evKey:
key = GetKey();
case evReDraw:
draw_window();
break;
case evMouse:
kmenu.mainm.dispatch_cursorevent(main_menu);
break;
}
}
free(colors);
}
void draw_window() {
DefineAndDrawWindow(215,100,500,200,0x34,0xeeeEEE,"Kmenu test");
kmenu.mainm.draw(main_menu);
}
stop:
- Attachments
-
-
kmenu.h (3.05 KiB)Downloaded 312 times
-
Обновилась до версии 1.2.
По большей части исправлено поведение выпадения вложенных меню возле краев экрана. Теперь выпадающие меню рисуются с свободной стороны от родительского меню. Изменения в API:
По большей части исправлено поведение выпадения вложенных меню возле краев экрана. Теперь выпадающие меню рисуются с свободной стороны от родительского меню. Изменения в API:
- параметр для kmenu_init стал необязательным -- используется стандартная палитра;
- добавлена функция kmenu_set_font, позволяющая задавать шрифт во всех создаваемых меню;
- добавлена функция kmainmenu_get_height, позволяющая узнать высоту основного меню для корректной отрисовки остальных элементов интерфейса;
- добавлены функции ksubmenu_set_items_padding и ksubmenu_set_items_margin позволяющие задавать внешние и внутренние отступы элементов конкретного меню. Неизменяемые значения необходимо установить в -1.
Заголовочный файл C-- для новой версии
- Attachments
-
-
kmenu.h (3.48 KiB)Downloaded 299 times
-
Поизучал Textedit, пункты меню не всегда срабатывают. В частности, если открыть одно меню, а потом перевести курсор на соседнее и выбрать пункт оттуда.
Посмотрел TextEdit, нормально то что при открытии пункта меню перерисовывается весь рабочий стол?
Это связано с тем, что окно меню перекрывает родительское окно и система начинает снова перерисовывать все окна лежащие под окном меню. Увы, рисование меню без нового окна приведет к еще большим графическим артефактамXProger wrote:Посмотрел TextEdit, нормально то что при открытии пункта меню перерисовывается весь рабочий стол?
XProger, весь рабочий стол? Или окна, которые под меню? Рабочий стол должен перерисовываться только там, где его перекрывало меню.
PS: Надо ещё добавить в ядро дочерние окна как-то, чтоб в панели не показывались.
PS: Надо ещё добавить в ядро дочерние окна как-то, чтоб в панели не показывались.
Чем больше сыра, тем больше в нём дыр. Чем больше дыр, тем меньше в нём собственно сыра. Значит, чем больше сыра, тем меньше сыра!
Who is online
Users browsing this forum: No registered users and 4 guests