Page 2 of 3

Re: libkmenu

Posted: Tue Aug 04, 2015 1:16 am
by Veliant
С отрисовкой с краю экрана точно бага. Тк не совпадают координаты по которым запрашивается рисовать окно меню с фактическими.
По поводу первого скорей архитектурный баг и придется переводить на IPC. При вызове отрисовки меню оно сохраняет ид активного окна, и потом при клике делает его активным и отправляет сообщение. Полагаю проблема в том что неправильно с самого начала получает ид окна родительского

Re: libkmenu

Posted: Tue Aug 04, 2015 1:48 am
by GerdtR
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));
	}
	


Re: libkmenu

Posted: Tue Aug 04, 2015 3:33 am
by GerdtR
Не надо ничего добавлять. Вызов mcall 18,3,1(сделать активном окно в слоте 1) действительно не работает. Все окна активируются, рабочий стол - нет. Варианта 2: либо правим ядро, либо информируем через IPC. Если ядро, то надо в файле kernel.asm строки 2316 и 2317 (r5668) убрать:

Code: Select all

sysfn_activate: 	; 18.3 = ACTIVATE WINDOW
	cmp	ecx, 2                    ;эту и следующую строку убрать
	jb	.nowindowactivate
	cmp	ecx, [TASK_COUNT]
	ja	.nowindowactivate
Тогда окно слота 1 будет активироваться успешно. Я опробовал сей патч, всё работает как положено (бывают же чудеса :) ). Ну кто c svn работает, поправьте пожалуйста, если возражений нет(мне наново ставить тортоис, качать репизиторий... потом как-нибудь сделаю). Ну или у кого идеи получше.

Re: libkmenu

Posted: Tue Aug 04, 2015 12:57 pm
by Leency
Неплохо бы увеличить расстояния между пунктами меню

Image

Re: libkmenu

Posted: Tue Aug 04, 2015 1:05 pm
by Leency
GerdtR
Закомиттил rev 5672.

Code: Select all

   cmp   ecx, 2                    ;эту и следующую строку убрать
   jb   .nowindowactivate

Re: libkmenu

Posted: Tue Aug 04, 2015 3:20 pm
by GerdtR
Увы, но помогло. И вот в чём дело: моя прога имеет TID больший 4. Рабочий стол принадлежит TID 1. Что ни сделай, а очередь сообщений для TID 1 icon не прочитает. А кнопки приходят в TID 1. Вариант решения такой: добавляем сисфункцию, которая сможет прочитать из чужой очереди сообщений(ну или только активного окна). Некий mcall 72,2. Это самое простое решение(мне так кажется). Можно уже наконец научить Колибри рисовать окна, которые "всегда позади" и уже оно сменит рабочий стол. Или добавить механизм хуков, перехватывать сообщения кнопок для TID 1 и пересылать их в icon. Короче.. идеи, предложения?
PS: или меню перевести на IPC. Интересно, сильно код для рядовых программ усложнится?

Re: libkmenu

Posted: Tue Aug 04, 2015 10:12 pm
by Pathoswithin
А может сделать icon частью рабочего стола?

Re: libkmenu

Posted: Tue Aug 04, 2015 10:39 pm
by punk_joker
Pathoswithin wrote:А может сделать icon частью рабочего стола?
icon это и есть рабочий стол

Re: libkmenu

Posted: Tue Sep 01, 2015 11:20 am
by Veliant
Исправления выложу позже с новыми фишками, а пока хидер для 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:

Re: libkmenu

Posted: Thu Sep 03, 2015 12:05 pm
by Veliant
Обновилась до версии 1.2.

По большей части исправлено поведение выпадения вложенных меню возле краев экрана. Теперь выпадающие меню рисуются с свободной стороны от родительского меню.
Безымянный.png
Безымянный.png (13.52 KiB)
Viewed 8421 times
Изменения в API:
  • параметр для kmenu_init стал необязательным -- используется стандартная палитра;
  • добавлена функция kmenu_set_font, позволяющая задавать шрифт во всех создаваемых меню;
    Безымянный.png
    Безымянный.png (6.21 KiB)
    Viewed 8421 times
  • добавлена функция kmainmenu_get_height, позволяющая узнать высоту основного меню для корректной отрисовки остальных элементов интерфейса;
  • добавлены функции ksubmenu_set_items_padding и ksubmenu_set_items_margin позволяющие задавать внешние и внутренние отступы элементов конкретного меню. Неизменяемые значения необходимо установить в -1.

Re: libkmenu

Posted: Thu Sep 03, 2015 12:31 pm
by Veliant
Заголовочный файл C-- для новой версии

Re: libkmenu

Posted: Sun Oct 11, 2015 9:02 pm
by Pathoswithin
Поизучал Textedit, пункты меню не всегда срабатывают. В частности, если открыть одно меню, а потом перевести курсор на соседнее и выбрать пункт оттуда.

Re: libkmenu

Posted: Wed Oct 28, 2015 3:53 pm
by XProger
Посмотрел TextEdit, нормально то что при открытии пункта меню перерисовывается весь рабочий стол?

Re: libkmenu

Posted: Wed Oct 28, 2015 4:49 pm
by Veliant
XProger wrote:Посмотрел TextEdit, нормально то что при открытии пункта меню перерисовывается весь рабочий стол?
Это связано с тем, что окно меню перекрывает родительское окно и система начинает снова перерисовывать все окна лежащие под окном меню. Увы, рисование меню без нового окна приведет к еще большим графическим артефактам

Re: libkmenu

Posted: Wed Oct 28, 2015 9:17 pm
by GerdtR
XProger, весь рабочий стол? Или окна, которые под меню? Рабочий стол должен перерисовываться только там, где его перекрывало меню.
PS: Надо ещё добавить в ядро дочерние окна как-то, чтоб в панели не показывались.