; Module/File: Menu_ExtendedItemAccess_Demo.pb ; Function: Extended access and functions on menu elements - Linux gtk2/gtk3 ; Author: Omi ; Date: Dec. 27 2016 ; Version: 0.2, added Menu_SetItemImageFromPixbuf() ; Target Compiler: PureBasic 5.22/5.31/5.40 ; Target OS: Linux: (X/K/L)ubuntu, Mint, 32/64, Ascii/Uni ;-------------------------------------------------------------- ;A little help file see /FilesForCodes/X-Menu+Popup-Workaround.pdf EnableExplicit CompilerIf #PB_Compiler_OS = #PB_OS_Linux CompilerIf #PB_Compiler_Version >= 540 CompilerIf Subsystem("gtk2") #GtkSubSytem= "gtk2" CompilerElse #GtkSubSytem= "gtk3" CompilerEndIf CompilerElse CompilerIf Subsystem("gtk3") #GtkSubSytem= "gtk3" CompilerElse #GtkSubSytem= "gtk2" CompilerEndIf CompilerEndIf CompilerElse #GtkSubSytem= "" CompilerEndIf UsePNGImageDecoder() ImportC "" gtk_container_get_children(*container.GtkContainer) gtk_menu_item_get_label(*menu_item.GtkMenuItem) gtk_widget_get_name(*widget.GtkWidget) gtk_widget_get_sensitive(*widget.GtkWidget) gtk_widget_get_visible(*widget.GtkWidget) gtk_menu_item_set_label(*menu_item.GtkMenuItem, label.p-utf8) gtk_label_set_text(*label.GtkLabel, str.p-utf8) gtk_image_new_from_file(filename.p-utf8) gtk_image_new_from_icon_name(stock_id.p-utf8, size) gtk_icon_theme_load_icon(*icon_theme.GtkIconTheme, icon_name.p-utf8, size, flags, *error.GError) g_list_length(*list_.GList) gdk_pixbuf_new_from_file(filename.p-utf8, *error.GError) gtk_widget_set_tooltip_text(*widget.GtkWidget, text.p-utf8) pango_font_description_from_string(str.p-utf8) CompilerIf #GtkSubSytem = "gtk3" gtk_widget_get_preferred_height(*widget.GtkWidget, *minimum_height, *natural_height) gtk_widget_get_preferred_width (*widget.GtkWidget, *minimum_height, *natural_height) gtk_menu_shell_get_selected_item(*menu_shell.GtkMenuShell) gtk_widget_override_font(*widget.GtkWidget, *font_desc) gdk_rgba_parse(*rgba, spec.p-utf8) gtk_widget_override_color(*widget.GtkWidget, state, *color) gtk_widget_override_background_color(*widget.GtkWidget, state, *color) CompilerElseIf #GtkSubSytem = "gtk2" ; gtk_widget_modify_font(*widget.GtkWidget, *font_desc) ; gdk_color_parse(*spec, *color.GdkColor) CompilerEndIf g_signal_connect(*instance, detailed_signal.p-utf8, *c_handler, *data, destroy= 0, flags= 0) As "g_signal_connect_data" EndImport ; Object constants #Win_Main = 0 Enumeration; Menu #Mn1 #Mn1_Item11 #Mn1_Item12 #Mn1_Item13 #Mn1_Item14 #Mn1_Item15 #Mn1_Item151 #Mn1_Item152 #Mn1_Item153 #Mn1_Item16 #Mn1_Item17 #Mn1_Item18 #Mn1_Item21 #Mn1_Item22 #Mn1_Item23 #Mn1_Item24 #Mn1_Item25 #Mn1_Item31 #Mn1_Item32 EndEnumeration Enumeration #Img1 EndEnumeration Enumeration GtkStateFlags #GTK_STATE_FLAG_NORMAL = 0 EndEnumeration Structure GdkRGBA red.d green.d blue.d alpha.d EndStructure Global.i gEvent, gEvMenu, gQuit Global gMenu, *gTitle, *gFontDescription Global gColorRGBA.GdkRGBA Global gGdkColor.GdkColor Global gErr.GError Declare Menu_ItemID(*MenuID, nthItem) Declare Menu_GetItemMenu(*MenuItemID) Declare.i Menu_GetSize(*Widget, *Width.integer, *Height.integer) ; search file from name in default icon theme and return pixbuf or Null ... Procedure IconDefaultTheme_LoadIconFromName(icon_name.s, icon_size, flags= #Null) Protected *pixbuf Protected *error.GError *pixbuf= gtk_icon_theme_load_icon(gtk_icon_theme_get_default_(), icon_name, icon_size, flags, @*error) If *error : Debug PeekS(*error\message, -1, #PB_UTF8) : EndIf ProcedureReturn *pixbuf EndProcedure Procedure PangoDescriptionFromString(sFontDescription.s) Protected PangoFontDescription= pango_font_description_from_string(sFontDescription) ProcedureReturn PangoFontDescription EndProcedure ProcedureC Callback_MenuActivated(*widget.GtkWidget, user_data) Protected.i NatWidth, NatHeight Protected.s S If *widget = Menu_ItemID(gMenu, 0); title 'File' S= "Title 'File' menu opened: " + Str(gtk_widget_get_visible(Menu_GetItemMenu(*widget))) If Menu_GetSize(Menu_GetItemMenu(*widget), @NatWidth, @NatHeight) S+ ", Menu size: " + Str(NatWidth) + " x " + Str(NatHeight) EndIf ElseIf *widget = Menu_ItemID(gMenu, 1); title 'Edit' S= "Title 'Edit' menu opened: " + Str(gtk_widget_get_visible(Menu_GetItemMenu(*widget))) If Menu_GetSize(Menu_GetItemMenu(*widget), @NatWidth, @NatHeight) S+ ", Menu size: " + Str(NatWidth) + " x " + Str(NatHeight) EndIf ElseIf *widget = Menu_ItemID(gMenu, 2); title 'Help' S= "Title 'Help' menu opened: " + Str(gtk_widget_get_visible(Menu_GetItemMenu(*widget))) If Menu_GetSize(Menu_GetItemMenu(*widget), @NatWidth, @NatHeight) S+ ", Menu size: " + Str(NatWidth) + " x " + Str(NatHeight) EndIf ElseIf *widget = Menu_ItemID(Menu_GetItemMenu(Menu_ItemID(gMenu, 0)), 7); item 'Recent file' with submenu S= "SubMenu 'Recent file' popup: " + Str(gtk_widget_get_visible(*widget)) EndIf Debug S EndProcedure ;-------------------- ;can be the PB-Menu (MenuID()) + TitleIndex, or TitleIndex ((Sub-)Menu) + ItemIndex or ItemIndex (SubMenu-Title) + ItemIndex Procedure Menu_ItemID(*MenuID, nthItem) Protected *MenuItemID.GtkWidget Protected *list.GList= gtk_container_get_children(*MenuID) If nthItem <= g_list_length(*list)- 1 *MenuItemID= g_list_nth_data_(*list, nthItem) EndIf ProcedureReturn *MenuItemID EndProcedure Procedure.i Menu_CountItems(*MenuID) Protected Number Protected.s sName If *MenuID sName= PeekS(gtk_widget_get_name(*MenuID), -1, #PB_UTF8) If sName = "GtkMenu" Or sName = "GtkMenuBar" Protected *list.GList= gtk_container_get_children(*MenuID) Number= g_list_length(*list) Else Debug "*MenuID for " + Str(*MenuID) + " must be a GtkMenu Or GtkMenuBar!" EndIf Else Debug Str(*MenuID) + " is no valid GtkMenu- or GtkMenuBar-pointer!" EndIf ProcedureReturn Number EndProcedure Procedure Menu_GetItemMenu(*MenuItemID) If *MenuItemID *MenuItemID= gtk_menu_item_get_submenu_(*MenuItemID) EndIf ProcedureReturn *MenuItemID EndProcedure Procedure.i Menu_GetItemChecked(*MenuItemID) Protected.i Checked If *MenuItemID If PeekS(gtk_widget_get_name(*MenuItemID), -1, #PB_UTF8) = "GtkCheckMenuItem" Checked= gtk_check_menu_item_get_active_(*MenuItemID) EndIf EndIf ProcedureReturn Checked EndProcedure Procedure.i Menu_GetItemDisabled(*MenuItemID) Protected.i Disabled If *MenuItemID Disabled= gtk_widget_get_sensitive(*MenuItemID) !#True EndIf ProcedureReturn Disabled EndProcedure Procedure.i Menu_GetItemInvisible(*MenuItemID) Protected.i Invisible If *MenuItemID Invisible= gtk_widget_get_visible(*MenuItemID) !1 EndIf ProcedureReturn Invisible EndProcedure Procedure.s Menu_GetItemLabel(*MenuItemID); for item & title Protected.s ItemLabel= "", ItemType Protected *subType.GtkImageMenuItem If *MenuItemID ItemType= PeekS(gtk_widget_get_name(*MenuItemID), -1, #PB_UTF8); Menu item type If #GtkSubSytem= "gtk3" If ItemType <> "GtkSeparatorMenuItem"; gtk_menu_item_get_label-access kills the visibility of MenuBar ItemLabel= PeekS(gtk_menu_item_get_label(*MenuItemID), -1, #PB_UTF8); Label always in item EndIf Else If ItemType = "GtkMenuItem"; Label in item ItemLabel= PeekS(gtk_menu_item_get_label(*MenuItemID), -1, #PB_UTF8) Else; Label in child label *subType= *MenuItemID If ItemType <> "GtkSeparatorMenuItem"; gtk_menu_item_get_label-access kills the visibility of MenuBar ItemLabel= PeekS(gtk_label_get_text_(*subType\menu_item\item\bin\child), -1, #PB_UTF8) EndIf EndIf EndIf EndIf ItemLabel= RemoveString(ItemLabel, "_", #PB_String_CaseSensitive, 1, 1); "_" entfernen ProcedureReturn ItemLabel EndProcedure Procedure.s Menu_GetItemType(*MenuItemID); for item & title Protected.s ItemType If *MenuItemID ItemType= PeekS(gtk_widget_get_name(*MenuItemID), -1, #PB_UTF8); Menu item type EndIf ProcedureReturn ItemType EndProcedure Procedure.i Menu_GetSize(*Widget, *Width.integer, *Height.integer); for menu & item Protected.i Res= #False If gtk_widget_get_visible(*Widget) CompilerIf #GtkSubSytem = "gtk2" Protected requisition.GtkRequisition gtk_widget_size_request_(*Widget, @requisition) If requisition *Width\i = requisition\width *Height\i= requisition\height Res= #True EndIf CompilerElse gtk_widget_get_preferred_width(*Widget, #Null, @*Width\i) gtk_widget_get_preferred_height(*Widget, #Null, @*Height\i) Res= #True CompilerEndIf EndIf ProcedureReturn Res EndProcedure Procedure Menu_SetItemLabel(*MenuItemID, label.s); for item & title Protected.s ItemLabel= "", ItemType Protected *subType.GtkImageMenuItem If *MenuItemID ItemType= PeekS(gtk_widget_get_name(*MenuItemID), -1, #PB_UTF8); Menu item type If #GtkSubSytem= "gtk3" If ItemType <> "GtkSeparatorMenuItem"; gtk_menu_item_get_label-access kills the visibility of MenuBar gtk_menu_item_set_label(*MenuItemID, label); Label always in item EndIf Else If ItemType = "GtkMenuItem"; Label in item gtk_menu_item_set_label(*MenuItemID, label) Else; Label in child label *subType= *MenuItemID If ItemType <> "GtkSeparatorMenuItem"; gtk_menu_item_get_label-access kills the visibility of MenuBar gtk_label_set_text(*subType\menu_item\item\bin\child, label) EndIf EndIf EndIf EndIf EndProcedure Procedure Menu_SetItemDisabled(*MenuItemID, Disabled) If *MenuItemID gtk_widget_set_sensitive_(*MenuItemID, Disabled !#True) EndIf EndProcedure Procedure Menu_SetItemInvisible(*MenuItemID, Invisible) If *MenuItemID If Invisible gtk_widget_hide_(*MenuItemID) Else gtk_widget_show_(*MenuItemID) EndIf EndIf EndProcedure Procedure.i Menu_SetItemImage(*MenuItemID, *Image) Protected.i Ret= #False If *MenuItemID And *Image If Menu_GetItemType(*MenuItemID) = "GtkImageMenuItem" gtk_image_menu_item_set_image_(*MenuItemID, *Image) Ret= #True EndIf EndIf ProcedureReturn Ret EndProcedure Procedure.i Menu_SetItemImageFromPixbuf(*MenuItemID, *Pixbuf) Protected.i *image.GtkImage, Ret= #False If *MenuItemID And *Pixbuf *image= gtk_image_menu_item_get_image_(*MenuItemID) If Menu_GetItemType(*MenuItemID) = "GtkImageMenuItem" If *image gtk_image_set_from_pixbuf_(*image, *Pixbuf); change Else *image= gtk_image_new_from_pixbuf_(*Pixbuf); new EndIf gtk_image_menu_item_set_image_(*MenuItemID, *Image) Ret= #True EndIf EndIf ProcedureReturn Ret EndProcedure ;-------------------- Procedure CreateWindow_Main() OpenWindow(#Win_Main, 0, 0, 400, 400, "API Menu access", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) CreateMenu(#Mn1, WindowID(#Win_Main)) MenuTitle("File") MenuItem(#Mn1_Item11, "&New" + #TAB$ + "Ctrl+N") MenuItem(#Mn1_Item12, "&Open" + #TAB$ + "Ctrl+O") MenuItem(#Mn1_Item13, "&Save" + #TAB$ + "Ctrl+S") MenuBar() MenuItem(#Mn1_Item14, "(en/dis)able next item ⬇") MenuItem(#Mn1_Item15, "&Print" + #TAB$ + "Ctrl+P") MenuBar() OpenSubMenu("Recent files") MenuItem(#Mn1_Item151, "SubItem 1") MenuItem(#Mn1_Item152, "SubItem 2") MenuItem(#Mn1_Item153, "SubItem 3") CloseSubMenu() MenuBar() MenuItem(#Mn1_Item16, "(Un)hide next item ⬇") MenuItem(#Mn1_Item17, "Hide me 😈") MenuBar() MenuItem(#Mn1_Item18, "&Quit") MenuTitle("Edit") MenuItem(#Mn1_Item21, "&Copy" + #TAB$ + "Ctrl+C") MenuItem(#Mn1_Item22, "Cut" + #TAB$ + "Ctrl+X") MenuItem(#Mn1_Item23, "Paste" + #TAB$ + "Ctrl+V") MenuBar() MenuItem(#Mn1_Item24, "&Find" + #TAB$ + "Ctrl+F") MenuBar() MenuItem(#Mn1_Item25, "Select &all" + #TAB$ + "Ctrl+A") MenuTitle("Help") MenuItem(#Mn1_Item31, "Help..." + #TAB$ + "F1") MenuItem(#Mn1_Item32, "About") DisableMenuItem(#Mn1, #Mn1_Item15, #True) SetMenuItemState(#Mn1, #Mn1_Item25, #True); checked EndProcedure Procedure Menu_ExtendedDemo() gMenu= MenuID(#Mn1) ; Menu_SetItemDisabled(Menu_ItemID(gMenu, 1), #True); disable a title + corresponding menu ; MainMenu + Titles ... Debug "Titles: " + Str(Menu_CountItems(gMenu)) Debug "Title: " + Str(Menu_ItemID(gMenu, 0)) + " = " + Menu_GetItemLabel(Menu_ItemID(gMenu, 0)) + ", has Menu: " + Str(Menu_GetItemMenu(Menu_ItemID(gMenu, 0))) Debug "Title: " + Str(Menu_ItemID(gMenu, 1)) + " = " + Menu_GetItemLabel(Menu_ItemID(gMenu, 1)) + ", has Menu: " + Str(Menu_GetItemMenu(Menu_ItemID(gMenu, 1))) Debug "Title: " + Str(Menu_ItemID(gMenu, 2)) + " = " + Menu_GetItemLabel(Menu_ItemID(gMenu, 2)) + ", has Menu: " + Str(Menu_GetItemMenu(Menu_ItemID(gMenu, 2))) Debug "Title: " + Str(Menu_ItemID(gMenu, 3)) + " = " + Menu_GetItemLabel(Menu_ItemID(gMenu, 3)) + ", has Menu: " + Str(Menu_GetItemMenu(Menu_ItemID(gMenu, 3))) Debug "" ; Titles, Menues + number of items ... Debug LSet(Menu_GetItemLabel(Menu_ItemID(gMenu, 0)), 13) + "items: " + Str(Menu_CountItems(Menu_GetItemMenu(Menu_ItemID(gMenu, 0)))) Debug LSet(Menu_GetItemLabel(Menu_ItemID(gMenu, 1)), 13) + "items: " + Str(Menu_CountItems(Menu_GetItemMenu(Menu_ItemID(gMenu, 1)))) Debug LSet(Menu_GetItemLabel(Menu_ItemID(gMenu, 2)), 13) + "items: " + Str(Menu_CountItems(Menu_GetItemMenu(Menu_ItemID(gMenu, 2)))) Debug LSet(Menu_GetItemLabel(Menu_ItemID(Menu_GetItemMenu(Menu_ItemID(gMenu, 0)), 7)), 13) + "items: " + Str(Menu_CountItems(Menu_GetItemMenu(Menu_ItemID(Menu_GetItemMenu(Menu_ItemID(gMenu, 0)), 7)))) Debug "" ;get label from Title 1 (File / ---) / Item 3 (MenuBar) ... ; 1. widget from title 1 (File) ; 2. -> menu from title 1 (File) ; 3. -> widget from item 3 in menu Debug "Item: " + Str(Menu_ItemID(Menu_GetItemMenu(Menu_ItemID(gMenu, 1)), 3)) + " = '" + Menu_GetItemLabel(Menu_ItemID(Menu_GetItemMenu(Menu_ItemID(gMenu, 1)), 3)) + "' in Title: '" + Menu_GetItemLabel(Menu_ItemID(gMenu, 1)) + "', Type= " + Menu_GetItemType(Menu_ItemID(Menu_GetItemMenu(Menu_ItemID(gMenu, 1)), 3)) + ", checked= " + Str(Menu_GetItemChecked(Menu_ItemID(Menu_GetItemMenu(Menu_ItemID(gMenu, 1)), 3))) ;same from title 0 / item 1 (File / Open) Debug "Item: " + Str(Menu_ItemID(Menu_GetItemMenu(Menu_ItemID(gMenu, 0)), 1)) + " = '" + Menu_GetItemLabel(Menu_ItemID(Menu_GetItemMenu(Menu_ItemID(gMenu, 0)), 1)) + "' in Title: '" + Menu_GetItemLabel(Menu_ItemID(gMenu, 0)) + "', Type= " + Menu_GetItemType(Menu_ItemID(Menu_GetItemMenu(Menu_ItemID(gMenu, 0)), 1)) + ", checked= " + Str(Menu_GetItemChecked(Menu_ItemID(Menu_GetItemMenu(Menu_ItemID(gMenu, 0)), 1))) ;same from title 1 / item 6 (Edit / Select All) Debug "Item: " + Str(Menu_ItemID(Menu_GetItemMenu(Menu_ItemID(gMenu, 1)), 6)) + " = '" + Menu_GetItemLabel(Menu_ItemID(Menu_GetItemMenu(Menu_ItemID(gMenu, 1)), 6)) + "' in Title: '" + Menu_GetItemLabel(Menu_ItemID(gMenu, 1)) + "', Type= " + Menu_GetItemType(Menu_ItemID(Menu_GetItemMenu(Menu_ItemID(gMenu, 1)), 6)) + ", checked= " + Str(Menu_GetItemChecked(Menu_ItemID(Menu_GetItemMenu(Menu_ItemID(gMenu, 1)), 6))) ;*** Deprecated since Gtk3.10 ... *** ;Set MenuItem IMAGE from file (in Edit / Copy) ... Menu_SetItemImageFromPixbuf(Menu_ItemID(Menu_GetItemMenu(Menu_ItemID(gMenu, 1)), 0), gdk_pixbuf_new_from_file("/usr/share/icons/default.kde4/16x16/actions/edit-copy.png", @gErr)) ;Set MenuItem IMAGE from stock (in Edit / Cut) ... Menu_SetItemImage(Menu_ItemID(Menu_GetItemMenu(Menu_ItemID(gMenu, 1)), 1), gtk_image_new_from_icon_name("edit-cut", #GTK_ICON_SIZE_MENU)) ;Set MenuItem IMAGE from default-system-icon (in Edit / Paste) ... Menu_SetItemImageFromPixbuf(Menu_ItemID(Menu_GetItemMenu(Menu_ItemID(gMenu, 1)), 2), IconDefaultTheme_LoadIconFromName("edit-paste", 16)) ;Set MenuItem IMAGE embedded (w. ImageDecoder, in Edit / Select All) ... If CatchImage(#Img1, ?Img1) : Menu_SetItemImageFromPixbuf(Menu_ItemID(Menu_GetItemMenu(Menu_ItemID(gMenu, 1)), 4), ImageID(#Img1)) : EndIf Debug "" ;Set Tooltips for items ... gtk_widget_set_tooltip_text(gMenu, "A tooltip on a colored MenuBar.") gtk_widget_set_tooltip_text(Menu_ItemID(gMenu, 1), "A tooltip on Menu title 'Edit'.") gtk_widget_set_tooltip_text(Menu_ItemID(Menu_GetItemMenu(Menu_ItemID(gMenu, 0)), 0), "Changed font and font color.") gtk_widget_set_tooltip_text(Menu_ItemID(Menu_GetItemMenu(Menu_ItemID(gMenu, 0)), 2), "Changed font, font color and label background.") gtk_widget_set_tooltip_text(Menu_ItemID(Menu_GetItemMenu(Menu_ItemID(gMenu, 0)), 4), ~"Select this to enable/disable\nthe 'Print'-item\nA tooltip is set on this MenuItem.") gtk_widget_set_tooltip_text(Menu_ItemID(Menu_GetItemMenu(Menu_ItemID(gMenu, 0)), 9), ~"Select this to hide/unhide\nthe following item\nA tooltip is set on this MenuItem.") gtk_widget_set_tooltip_text(Menu_ItemID(Menu_GetItemMenu(Menu_ItemID(gMenu, 0)), 10), "Hideable item.") gtk_widget_set_tooltip_text(Menu_ItemID(Menu_GetItemMenu(Menu_ItemID(gMenu, 1)), 0), "Loaded png-image w/o decoder.") gtk_widget_set_tooltip_text(Menu_ItemID(Menu_GetItemMenu(Menu_ItemID(gMenu, 1)), 1), "Stock-Image w/o decoder.") gtk_widget_set_tooltip_text(Menu_ItemID(Menu_GetItemMenu(Menu_ItemID(gMenu, 1)), 2), "Auto-searched System-Icon w/o decoder.") gtk_widget_set_tooltip_text(Menu_ItemID(Menu_GetItemMenu(Menu_ItemID(gMenu, 1)), 4), "Embedded Image w. required decoder.") ;Set FONT for items ... *gFontDescription= PangoDescriptionFromString("Monospace bold 11") CompilerIf #GtkSubSytem = "gtk3" ;Set color of MenuBar background ... gdk_rgba_parse(@gColorRGBA, "#FFFFDF") gtk_widget_override_background_color(gMenu, #GTK_STATE_FLAG_NORMAL, gColorRGBA) ;Set color of all title fonts ... gdk_rgba_parse(@gColorRGBA, "#0000DF") gtk_widget_override_color(gMenu, #GTK_STATE_FLAG_NORMAL, gColorRGBA) ;Set color of one title font ... gdk_rgba_parse(@gColorRGBA, "#DF0000") gtk_widget_override_color(Menu_ItemID(gMenu, 2), #GTK_STATE_FLAG_NORMAL, gColorRGBA) ;Set color of menu background (don't work!) ... ; gdk_rgba_parse(@gColorRGBA, "#FFFFDF") ; gtk_widget_override_background_color(Menu_GetItemMenu(Menu_ItemID(gMenu, 2)), #GTK_STATE_FLAG_NORMAL, gColorRGBA) ;Change font of menu title and automatic in all items in corresponding menu ... gtk_widget_override_font(Menu_ItemID(gMenu, 2), *gFontDescription) ;Change font of single menu items ... gtk_widget_override_font(Menu_ItemID(Menu_GetItemMenu(Menu_ItemID(gMenu, 0)), 0), *gFontDescription) gtk_widget_override_font(Menu_ItemID(Menu_GetItemMenu(Menu_ItemID(gMenu, 0)), 1), *gFontDescription) gtk_widget_override_font(Menu_ItemID(Menu_GetItemMenu(Menu_ItemID(gMenu, 0)), 2), *gFontDescription) ;Set COLOR for item font or label-background ... gdk_rgba_parse(@gColorRGBA, "#FF0000") gtk_widget_override_color(Menu_ItemID(Menu_GetItemMenu(Menu_ItemID(gMenu, 0)), 0), #GTK_STATE_FLAG_NORMAL, gColorRGBA) gdk_rgba_parse(@gColorRGBA, "#00CF00") gtk_widget_override_color(Menu_ItemID(Menu_GetItemMenu(Menu_ItemID(gMenu, 0)), 1), #GTK_STATE_FLAG_NORMAL, gColorRGBA) gdk_rgba_parse(@gColorRGBA, "#0000FF") gtk_widget_override_color(Menu_ItemID(Menu_GetItemMenu(Menu_ItemID(gMenu, 0)), 2), #GTK_STATE_FLAG_NORMAL, gColorRGBA) gdk_rgba_parse(@gColorRGBA, "#FFFF00") gtk_widget_override_background_color(gtk_bin_get_child_(Menu_ItemID(Menu_GetItemMenu(Menu_ItemID(gMenu, 0)), 2)), #GTK_STATE_FLAG_NORMAL, gColorRGBA) CompilerElseIf #GtkSubSytem = "gtk2"; doesn't work ... ; gtk_widget_modify_font(Menu_ItemID(Menu_GetItemMenu(Menu_ItemID(gMenu, 0)), 0), *gFontDescription) ; gtk_widget_modify_font(Menu_ItemID(Menu_GetItemMenu(Menu_ItemID(gMenu, 0)), 1), *gFontDescription) ; gtk_widget_modify_font(Menu_ItemID(Menu_GetItemMenu(Menu_ItemID(gMenu, 0)), 2), *gFontDescription) ; ; ;Set COLOR for item font or label-background ... ; gdk_color_parse(@gGdkColor, "#FF0000") ; gtk_widget_modify_fg_(Menu_ItemID(Menu_GetItemMenu(Menu_ItemID(gMenu, 0)), 0), #GTK_STATE_NORMAL, gColorRGBA) ; gdk_color_parse(@gGdkColor, "#00CF00") ; gtk_widget_modify_fg_(Menu_ItemID(Menu_GetItemMenu(Menu_ItemID(gMenu, 0)), 1), #GTK_STATE_NORMAL, gColorRGBA) ; gdk_color_parse(@gGdkColor, "#0000FF") ; gtk_widget_modify_fg_(Menu_ItemID(Menu_GetItemMenu(Menu_ItemID(gMenu, 0)), 2), #GTK_STATE_NORMAL, gColorRGBA) ; gdk_color_parse(@gGdkColor, "#FFFF00") ; gtk_widget_modify_bg_(gtk_bin_get_child_(Menu_ItemID(Menu_GetItemMenu(Menu_ItemID(gMenu, 0)), 2)), #GTK_STATE_NORMAL, gColorRGBA) CompilerEndIf ;Tearoff for Menu from Edit-title (up to Gtk 3.9) ... gtk_menu_set_tearoff_state_(Menu_GetItemMenu(Menu_ItemID(gMenu, 1)), #True) ;MONITOR for menu/submenu popup ... ;Watch 'File', 'Edit', 'Help'-menu popup ... g_signal_connect(Menu_ItemID(gMenu, 0), "activate", @Callback_MenuActivated(), 0) g_signal_connect(Menu_ItemID(gMenu, 1), "activate", @Callback_MenuActivated(), 0) g_signal_connect(Menu_ItemID(gMenu, 2), "activate", @Callback_MenuActivated(), 0) ;Watch 'Recent files'-item submenu popup ... g_signal_connect(Menu_ItemID(Menu_GetItemMenu(Menu_ItemID(gMenu, 0)), 7), "activate", @Callback_MenuActivated(), 0) EndProcedure CreateWindow_Main() Menu_ExtendedDemo() Repeat gEvent= WaitWindowEvent() Select gEvent Case #PB_Event_CloseWindow gQuit= #True Case #PB_Event_Menu gEvMenu= EventMenu() Select gEvMenu Case #Mn1_Item11 Debug "Change label on menu item " + #Mn1_Item11 Menu_SetItemLabel(Menu_ItemID(Menu_GetItemMenu(Menu_ItemID(gMenu, 0)), 0), "New (clicked)") Case #Mn1_Item14; disabling/enabling items ... Debug "Disable/able 'Print'-item" If Menu_GetItemDisabled(Menu_ItemID(Menu_GetItemMenu(Menu_ItemID(gMenu, 0)), 5)) Menu_SetItemDisabled(Menu_ItemID(Menu_GetItemMenu(Menu_ItemID(gMenu, 0)), 5), #False) Else Menu_SetItemDisabled(Menu_ItemID(Menu_GetItemMenu(Menu_ItemID(gMenu, 0)), 5), #True) EndIf Case #Mn1_Item16; hiding/unhiding items ... Debug "Hide/Unhide next item" If Menu_GetItemInvisible(Menu_ItemID(Menu_GetItemMenu(Menu_ItemID(gMenu, 0)), 10)) Menu_SetItemInvisible(Menu_ItemID(Menu_GetItemMenu(Menu_ItemID(gMenu, 0)), 10), #False) Else Menu_SetItemInvisible(Menu_ItemID(Menu_GetItemMenu(Menu_ItemID(gMenu, 0)), 10), #True) EndIf Case #Mn1_Item25 If Menu_GetItemChecked(Menu_ItemID(Menu_GetItemMenu(Menu_ItemID(gMenu, 1)), 6)) SetMenuItemState(#Mn1, #Mn1_Item25, #False); 'checked' only with PB-function -> else endless loop!!! Debug GetMenuItemText(#Mn1, gEvMenu) + " unchecked" Else SetMenuItemState(#Mn1, #Mn1_Item25, #True) Debug GetMenuItemText(#Mn1, gEvMenu) + " checked" EndIf Default Debug "Selected: " + GetMenuItemText(#Mn1, gEvMenu) EndSelect EndSelect Until gQuit DataSection ;Choose your pathes and pics here ... Img1: : IncludeBinary "/usr/share/icons/gnome/16x16/actions/application-exit.png" EndDataSection ; IDE Options = PureBasic 5.44 LTS (Linux - x86) ; CursorPosition = 60 ; FirstLine = 13 ; Folding = +---- ; EnableUnicode ; EnableXP