Linux Programming Tips
From Lazarus wiki
This article applies to Linux only.
See also: Multiplatform Programming Guide
Contents |
Other Interfaces
- Lazarus known issues (things that will never be fixed) - A list of interface compatibility issues
- Win32/64 Interface - The winapi interface for Windows 95/98/Me/2K/XP/Vista, but not CE
- Windows CE Interface - For Pocket PC and Smartphones
- Carbon Interface - The Carbon interface for Mac OS X
- Cocoa Interface - The Cocoa interface for Mac OS X
- Qt Interface - The Qt 4 interface for Unixes, Mac OS X, Windows, and Linux-based PDAs
- GTK1 Interface - The gtk1 interface for Unixes, Mac OS X (X11), Windows
- GTK2 Interface - The gtk2 interface for Unixes, Mac OS X (X11), Windows
- GTK3 Interface - The gtk3 interface for Unixes, Mac OS X (X11), Windows
- fpGUI Interface - Based on the fpGUI library, which is a cross-platform toolkit completely written in Object Pascal
- Custom Drawn Interface - A cross-platform LCL backend written completely in Object Pascal inside Lazarus. The Lazarus interface to Android.
Platform specific Tips
- Windows Programming Tips - Desktop Windows programming tips.
- Linux Programming Tips - How to execute particular programming tasks in Linux
- OS X Programming Tips - Lazarus installation, useful tools, Unix commands, and more...
- WinCE Programming Tips - Using the telephone API, sending SMSes, and more...
- Android Programming - For Android smartphones and tablets
- iPhone/iPod development - About using Objective Pascal to develop iOS applications
Interfaces Development Articles
- Carbon interface internals - If you want to help improving the Carbon interface
- Windows CE Development Notes - For Pocket PC and Smartphones
- Adding a new interface - How to add a new widget set interface
- LCL Defines - Choosing the right options to recompile LCL
- LCL Internals - Some info about the inner workings of the LCL
How to...
Write a daemon
To write a daemon (service application), please see Daemons and Services
Get the list of mounted partitions
Read and parse the file /etc/mtab
An example of such a file:
/dev/sda5 / ext4 rw,commit=0 0 0 none /proc proc rw 0 0 /dev/sda7 /home ext4 rw,commit=0 0 0 none /proc/sys/fs/binfmt_misc binfmt_misc rw 0 0 gvfs-fuse-daemon /home/felipe/.gvfs fuse.gvfs-fuse-daemon rw,nosuid,nodev,user=felipe 0 0 truecrypt /tmp/.truecrypt_aux_mnt1 fuse.truecrypt rw,nosuid,nodev,allow_other 0 0 /dev/mapper/truecrypt1 /media/truecrypt1 vfat rw,uid=500,gid=500,umask=077 0 0
Perform text-to-speech (TTS) or how to let my computer speak
See
- [1] examples for calling espeak
to do: incorporate those examples
Install Lazarus on Raspberry Pi
Test whether an Application is already running
Here's a unit that works under both Windows and Linux
- There's no need to pass the full application path to the function - the ExeName will usually do
unit uappisrunning; {$mode objfpc}{$H+} interface uses Classes, SysUtils {$IFDEF WINDOWS}, Windows, JwaTlHelp32{$ENDIF} {$IFDEF LINUX},process{$ENDIF}; // JwaTlHelp32 is in fpc\packages\winunits-jedi\src\jwatlhelp32.pas // Returns TRUE if EXEName is running under Windows or Linux // Don't pass an .exe extension to Linux! function AppIsRunning(const ExeName: string):Boolean; implementation // These functions return Zero if app is NOT running // Override them if you have a better implementation {$IFDEF WINDOWS} function WindowsAppIsRunning(const ExeName: string): integer; var ContinueLoop: BOOL; FSnapshotHandle: THandle; FProcessEntry32: TProcessEntry32; begin FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); FProcessEntry32.dwSize := SizeOf(FProcessEntry32); ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32); Result := 0; while integer(ContinueLoop) <> 0 do begin if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) = UpperCase(ExeName)) or (UpperCase(FProcessEntry32.szExeFile) = UpperCase(ExeName))) then begin Inc(Result); // SendMessage(Exit-Message) possible? end; ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32); end; CloseHandle(FSnapshotHandle); end; {$ENDIF} {$IFDEF LINUX} function LinuxAppIsRunning(const ExeName: string): integer; var t: TProcess; s: TStringList; begin Result := 0; t := tprocess.Create(nil); t.CommandLine := 'ps -C ' + ExeName; t.Options := [poUsePipes, poWaitonexit]; try t.Execute; s := TStringList.Create; try s.LoadFromStream(t.Output); Result := Pos(ExeName, s.Text); finally s.Free; end; finally t.Free; end; end; {$ENDIF} function AppIsRunning(const ExeName: string):Boolean; begin {$IFDEF WINDOWS} Result:=(WindowsAppIsRunning(ExeName) > 0); {$ENDIF} {$IFDEF LINUX} Result:=(LinuxAppIsRunning(ExeName) > 0); {$ENDIF} end; end.