; --------------------------------------------------------------------------------------------; Copyright (c) Fantaisie Software. All rights reserved.; Dual licensed under the GPL and Fantaisie Software licenses.; See LICENSE and LICENSE-FANTAISIE in the project root for license information.; --------------------------------------------------------------------------------------------; this file should contain all linux specific extension; functions that are "self contained" ie, do not need anything of the; IDE, so they can be reused by the debugger and such;CompilerIf #CompileLinux; ---------------------------------------------------; Required XLib stuff:; ---------------------------------------------------ImportC "-lX11" ; link with XLib even if no gui commands are usedXOpenDisplay(display_name)XCloseDisplay(display)XInternAtom(display, name.p-ascii, only_if_exists)XFree(pdata)XDefaultRootWindow(display)XGetWindowProperty(display, w, property, long_offset, long_length, delete, req_type, actual_type_return, actual_format_return, nitems_return, bytes_after_return, prop_return)XGetWMName(display, w, text_prop_return)EndImportCompilerIf #CompileLinuxGtkImportC ""gtk_widget_get_window_(window) As "gtk_widget_get_window" ; Gtk 2.14 or newerEndImportCompilerEndIfCompilerIf #CompileLinuxQtImportC "Build/QtHelpers.a"Qt_ScrollEditorToBottom(*Widget)QT_CenterEditor(*Widget)QT_SelectComboBoxText(*Widget)QT_GetListViewScroll(*Widget)QT_SetListViewScroll(*Widget, Value)QT_WindowBackgroundColor(*Window)QT_GetViewPort(*Widget)QT_SetEventFilter(*Widget, *Handler)QT_SendEvent(*Widget, *Event)QT_EventType(*Event)QT_EventKey(*Event)QT_EventButton(*Event)EndImportCompilerEndIf#Success = 0; If there is no window manager that complies to the WM manager hints is present,; the result is an empty string;Procedure.s GetWindowManager()Result$ = ""; uses the default DISPLAY environment variable; can also be a display string, needs to be ascii though!;xdisplay = XOpenDisplay(#Null)If xdisplay_NET_SUPPORTING_WM_CHECK = XInternAtom(xdisplay, "_NET_SUPPORTING_WM_CHECK", #False)_NET_WM_NAME = XInternAtom(xdisplay, "_NET_WM_NAME", #False)WINDOW_PROPERTY = XInternAtom(xdisplay, "WINDOW", #False)UTF8_PROPERTY = XInternAtom(xdisplay, "UTF8_STRING", #False); read the _NET_SUPPORTING_WM_CHECK from the X root window;If XGetWindowProperty(xdisplay, XDefaultRootWindow(xdisplay), _NET_SUPPORTING_WM_CHECK, 0, 32, #False, WINDOW_PROPERTY, @rettype, @retformat, @retitems, @retbytes, @resultdata) = #Success And resultdataIf rettype = WINDOW_PROPERTY And retformat = 32 And retitems >= 1child = PeekL(resultdata); the child must also have a _NET_SUPPORTING_WM_CHECK according to the specification;If XGetWindowProperty(xdisplay, child, _NET_SUPPORTING_WM_CHECK, 0, 32, #False, WINDOW_PROPERTY, @rettype, @retformat, @retitems, @retbytes, @resultdata2) = #Success And resultdata2If rettype = WINDOW_PROPERTY And retformat = 32 And retitems >= 1 And PeekL(resultdata2) = child; read the _NET_WM_NAME which stores the WM name for complying implementations;If XGetWindowProperty(xdisplay, child, _NET_WM_NAME, 0, 6400, #False, UTF8_PROPERTY, @rettype, @retformat, @retitems, @retbytes, @resultstring) = #Success And resultstringIf rettype = UTF8_PROPERTY And retformat = 8 And retitems >= 1Result$ = PeekS(resultstring, -1, #PB_UTF8)EndIfXFree(resultstring)EndIfEndIfXFree(resultdata2)EndIfEndIfXFree(resultdata)EndIfXCloseDisplay(xdisplay) ; if we opened it, close it again!EndIfProcedureReturn Result$EndProcedureCompilerIf #CompileLinuxGtkProcedure GTKSignalConnect(*Widget, Signal,ドル Function, user_data)g_signal_connect_data_(*Widget, Signal,ドル Function, user_data, 0, 0)EndProcedureCompilerEndIfProcedure ShowWindowMaximized(Window); PB4 supports all this now (also gtk1);SetWindowState(Window, #PB_Window_Maximize)HideWindow(Window, 0)EndProcedureProcedure IsWindowMaximized(Window)If GetWindowState(Window) & #PB_Window_MaximizeProcedureReturn 1ElseProcedureReturn 0EndIfEndProcedureProcedure IsWindowMinimized(Window)If GetWindowState(Window) & #PB_Window_MinimizeProcedureReturn 1ElseProcedureReturn 0EndIfEndProcedureProcedure SetWindowForeground(Window)CompilerIf #CompileLinuxGtkgdk_window_raise_(gtk_widget_get_window_(WindowID(Window)))CompilerElseQtScript("window(" + Window + ").raise()")CompilerEndIfSetActiveWindow(Window)EndProcedure; set window to the foreground without giving it the focus (and without a focus event!)Procedure SetWindowForeground_NoActivate(Window)CompilerIf #CompileLinuxGtkgdk_window_raise_(gtk_widget_get_window_(WindowID(Window)))CompilerElseQtScript("window(" + Window + ").raise()")CompilerEndIfEndProcedureProcedure SetWindowStayOnTop(Window, StayOnTop)StickyWindow(Window, StayOnTop)EndProcedureProcedure GetPanelWidth(Gadget)ProcedureReturn GetGadgetAttribute(Gadget, #PB_Panel_ItemWidth)EndProcedureProcedure GetPanelHeight(Gadget)ProcedureReturn GetGadgetAttribute(Gadget, #PB_Panel_ItemHeight)EndProcedureProcedure SelectComboBoxText(Gadget)CompilerIf #CompileLinuxGtk*Entry = gtk_bin_get_child_(GadgetID(Gadget))If *Entrygtk_editable_select_region_(*Entry, 0, -1)gtk_widget_grab_focus_(*Entry)EndIfCompilerElseQT_SelectComboBoxText(GadgetID(Gadget))CompilerEndIfEndProcedureProcedure RedrawGadget(Gadget)CompilerIf #CompileLinuxGtkgtk_widget_queue_draw_(GadgetID(Gadget))CompilerElseQtScript("gadget(" + Gadget + ").update()")CompilerEndIfEndProcedureProcedure GetButtonBackgroundColor()ProcedureReturn $FFFFFF ; TODOEndProcedureProcedure StartFlickerFix(Window)EndProcedureProcedure StopFlickerFix(Window, DoRedraw)EndProcedureProcedure StartGadgetFlickerFix(Gadget)EndProcedureProcedure StopGadgetFlickerFix(Gadget)EndProcedureProcedure ZeroMemory(*Buffer, Size);memset_(*Buffer, 0, Size) ; somehow this causes an assembler errorFor i = 0 To size-1PokeB(*Buffer+i, 0)Next iEndProcedureCompilerIf #CompileLinuxGtkImportC ""; This is a varargs function, so do an import which allows us to set 1 value; Terminator MUST be -1gtk_list_store_set_1(*Store, *Item, Column, *Value, Terminator) As "gtk_list_store_set"gtk_tree_store_set_1(*Store, *Item, Column, *Value, Terminator) As "gtk_tree_store_set"EndImportCompilerEndIfGlobal FileManagerExe$Global FileManagerParameters$Global FileManagerName$Global FileManagerFoundProcedure DetectFileManager()Protected NewList Managers.s()If FileManagerFound = 0;; Try to find a suitable file manager from a list of managers; Check the WindowManager name to try the ones that are usually the default; on a WindowManager first;WindowManager$ = UCase(GetWindowManager()); Window manager names can contain version info etc;If FindString(WindowManager,ドル "METACITY", 1); Gnome desktopAddElement(Managers()): Managers() = "nautilus"AddElement(Managers()): Managers() = "gnome-commander"AddElement(Managers()): Managers() = "dolphin"AddElement(Managers()): Managers() = "konqueror"AddElement(Managers()): Managers() = "krusader"AddElement(Managers()): Managers() = "thunar"AddElement(Managers()): Managers() = "nemo"AddElement(Managers()): Managers() = "pcmanfm"ElseIf FindString(WindowManager,ドル "KWIN", 1); KDEAddElement(Managers()): Managers() = "dolphin" ; kde4 defaultAddElement(Managers()): Managers() = "konqueror" ; kde3 defaultAddElement(Managers()): Managers() = "krusader"AddElement(Managers()): Managers() = "nautilus"AddElement(Managers()): Managers() = "gnome-commander"AddElement(Managers()): Managers() = "thunar"AddElement(Managers()): Managers() = "nemo"AddElement(Managers()): Managers() = "pcmanfm"; ElseIf FindString(WindowManager,ドル "XFWM", 1); Xfce (use the below fallback for that and others)ElseIf FindString(WindowManager,ドル "MUTTER", 1); MutterAddElement(Managers()): Managers() = "nemo"AddElement(Managers()): Managers() = "pcmanfm"AddElement(Managers()): Managers() = "nautilus"AddElement(Managers()): Managers() = "gnome-commander"AddElement(Managers()): Managers() = "dolphin"AddElement(Managers()): Managers() = "konqueror"AddElement(Managers()): Managers() = "krusader"AddElement(Managers()): Managers() = "thunar"Else; fallbackAddElement(Managers()): Managers() = "thunar"AddElement(Managers()): Managers() = "dolphin"AddElement(Managers()): Managers() = "konqueror"AddElement(Managers()): Managers() = "krusader"AddElement(Managers()): Managers() = "nautilus"AddElement(Managers()): Managers() = "gnome-commander"AddElement(Managers()): Managers() = "nemo"AddElement(Managers()): Managers() = "pcmanfm"EndIf; Test which file manager exists;ForEach Managers()CommandLine$ = "which "+Managers()+" > "+TempPath$+"PB_ManagerTest.txt 2>/dev/null"If system_(ToAscii(CommandLine$)) = 0file = ReadFile(#PB_Any, TempPath$+"PB_ManagerTest.txt")If fileFileManagerExe$ = ReadString(file)FileManagerFound = #TrueCloseFile(file)Select Managers()Case "nautilus"FileManagerName$ = "Nautilus"FileManagerParameters$ = ""Case "gnome-commander"FileManagerName$ = "Gnome Commander"FileManagerParameters$ = "-l "Case "konqueror"FileManagerName$ = "Konqueror"FileManagerParameters$ = ""Case "dolphin"FileManagerName$ = "Dolphin"FileManagerParameters$ = ""Case "krusader"FileManagerName$ = "Krusader"FileManagerParameters$ = "--left "Case "thunar"FileManagerName$ = "Thunar"FileManagerParameters$ = ""Case "nemo"FileManagerName$ = "Nemo"FileManagerParameters$ = ""Case "pcmanfm"FileManagerName$ = "PcManFM"FileManagerParameters$ = ""EndSelectBreakEndIfEndIfNext Managers()DeleteFile(TempPath$+"PB_ManagerTest.txt")EndIfEndProcedureProcedure.s GetExplorerName()DetectFileManager()If FileManagerFoundProcedureReturn FileManagerName$ElseProcedureReturn "Filemanager"EndIfEndProcedureProcedure ShowExplorerDirectory(Directory$)DetectFileManager()If FileManagerFoundRunProgram(FileManagerExe,ドル FileManagerParameters$+Chr(34)+Directory$+Chr(34), "")EndIfEndProcedureProcedure ShowExplorerFile(File$); For now, just launch the containing folderShowExplorerDirectory(GetPathPart(File$))EndProcedureProcedure ModifierKeyPressed(Key); Not used on LinuxProcedureReturn 0EndProcedureProcedure OpenWebBrowser(Url$)If RunProgram("xdg-open", Url,ドル "") = #Falsebrowser$ = Trim(GetEnvironmentVariable("BROWSER"))If browser$ = ""If RunProgram("gnome-open", Url,ドル "") = #FalseIf RunProgram("kfmclient","exec " + Url,ドル "") = #FalseIf RunProgram("www-browser", Url,ドル "") = #FalseMessageRequester(#ProductName,ドル "Cannot open WebBrowser!")EndIfEndIfEndIfElseIf RunProgram(browser,ドル Url,ドル "") = #FalseMessageRequester(#ProductName,ドル "Cannot open WebBrowser!")EndIfEndIfEndIfEndProcedureCompilerIf #CompileLinuxGtkImportC ""gtk_adjustment_get_value.d(*Adjustment)gtk_adjustment_set_value(*Adjustment, Position.d)EndImportCompilerEndIfProcedure GetListViewScroll(Gadget)CompilerIf #CompileLinuxGtkProcedureReturn gtk_adjustment_get_value(gtk_tree_view_get_vadjustment_(GadgetID(Gadget)))CompilerElseProcedureReturn QT_GetListViewScroll(GadgetID(Gadget))CompilerEndIfEndProcedureProcedure SetListViewScroll(Gadget, Position)CompilerIf #CompileLinuxGtkgtk_adjustment_set_value(gtk_tree_view_get_vadjustment_(GadgetID(Gadget)), Position)CompilerElseQT_SetListViewScroll(GadgetID(Gadget), Position)CompilerEndIfEndProcedureCompilerEndIf
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。