libkmenu

Discussing libraries simplifying applications development
  • 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) убрать:

    Code: Select all

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

    Image
    Из хаоса в космос
  • GerdtR
    Закомиттил 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. Интересно, сильно код для рядовых программ усложнится?
    Чем больше сыра, тем больше в нём дыр. Чем больше дыр, тем меньше в нём собственно сыра. Значит, чем больше сыра, тем меньше сыра!
  • А может сделать icon частью рабочего стола?
  • Pathoswithin wrote:А может сделать icon частью рабочего стола?
    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 309 times
  • Обновилась до версии 1.2.

    По большей части исправлено поведение выпадения вложенных меню возле краев экрана. Теперь выпадающие меню рисуются с свободной стороны от родительского меню.
    Безымянный.png
    Безымянный.png (13.52 KiB)
    Viewed 8230 times
    Изменения в API:
    • параметр для kmenu_init стал необязательным -- используется стандартная палитра;
    • добавлена функция kmenu_set_font, позволяющая задавать шрифт во всех создаваемых меню;
      Безымянный.png
      Безымянный.png (6.21 KiB)
      Viewed 8230 times
    • добавлена функция kmainmenu_get_height, позволяющая узнать высоту основного меню для корректной отрисовки остальных элементов интерфейса;
    • добавлены функции ksubmenu_set_items_padding и ksubmenu_set_items_margin позволяющие задавать внешние и внутренние отступы элементов конкретного меню. Неизменяемые значения необходимо установить в -1.
    Attachments
    kmenu.h (3 KiB)
    Downloaded 316 times
    kmenu.obj (9.16 KiB)
    Downloaded 310 times
  • Заголовочный файл C-- для новой версии
    Attachments
    kmenu.h (3.48 KiB)
    Downloaded 293 times
  • Поизучал Textedit, пункты меню не всегда срабатывают. В частности, если открыть одно меню, а потом перевести курсор на соседнее и выбрать пункт оттуда.
  • Посмотрел TextEdit, нормально то что при открытии пункта меню перерисовывается весь рабочий стол?
  • XProger wrote:Посмотрел TextEdit, нормально то что при открытии пункта меню перерисовывается весь рабочий стол?
    Это связано с тем, что окно меню перекрывает родительское окно и система начинает снова перерисовывать все окна лежащие под окном меню. Увы, рисование меню без нового окна приведет к еще большим графическим артефактам
  • XProger, весь рабочий стол? Или окна, которые под меню? Рабочий стол должен перерисовываться только там, где его перекрывало меню.
    PS: Надо ещё добавить в ядро дочерние окна как-то, чтоб в панели не показывались.
    Чем больше сыра, тем больше в нём дыр. Чем больше дыр, тем меньше в нём собственно сыра. Значит, чем больше сыра, тем меньше сыра!
  • Who is online

    Users browsing this forum: No registered users and 4 guests