Page 1 of 1

Extended clipboard (?) Linux

Posted: Sat May 22, 2021 7:27 pm
by AZJIO
I found an example of how to assign a hotkey
Found an example of a reaction to copying to the clipboard in the code-archive file "LinuxPB_API-Lib/Misc/Clipboard_OwnChange.pb"
Put them together but it doesn't work.

Code: Select all

EnableExplicit

#ShiftMask = 1
#ControlMask = 4
#AltMask = 8
#WinMask = 64

#GrabModeAsync = 1
#KeyPress = 2
#KeyPressMask = 1

; http://book.itep.ru/10/keys.htm
#XK_C = $0043
#XK_K = $004B
#XK_N = $004E

; Debug #PB_Key_K
; Debug #XK_K

; ShiftMask   |     1 | Shift
; LockMask    |     2 | Caps LOCK
; ControlMask |     4 | Ctrl
; Mod1Mask    |     8 | Alt
; Mod2Mask    |    16 | Num LOCK
; Mod3Mask    |    32 | Scroll LOCK
; Mod4Mask    |    64 | Windows
; Mod5Mask    |   128 | ???

ImportC "-lX11"
	XCloseDisplay(*Display)
	XDefaultRootWindow(*Display)
	XGrabKey(*Display, KeyCode.I, Modifiers.I, GrabWindow.I, OwnerEvents.i, PointerMode.I, KeyboardMode.I)
	XKeysymToKeycode(*Display, KeySym.I)
	XNextEvent(*Display, *XEvent)
	XOpenDisplay(*Display)
	XSelectInput(*Display, Window.I, EventMask.I)
	XUngrabKey(*Display, KeyCode.I, Modifiers.I, GrabWindow.I)
EndImport

ImportC "-lxcb" : EndImport
ImportC "-lXau" : EndImport
ImportC "-lXdmcp" : EndImport

Structure XEvent
	EventType.I
	SendEvent.I
	*Display
	EventWindow.I
	RootWindow.I
	ChildWindow.I
	Time.I
	x.I
	y.I
	x_root.I
	y_root.I
	Mask.I
	KeyCode.I
	SameScreen.I
EndStructure

Define *Display
Define Event.XEvent
Define KeyCode.I
Define RootWindow.I


; из примера реакции на буфер обмена
; =======================================
ImportC ""
	gdk_atom_intern(atom_name.p-utf8, only_if_exists)
	g_signal_connect(*instance, detailed_signal.p-utf8, *c_handler, *pdata, destroy= 0, flags= 0) As "g_signal_connect_data"
EndImport

Enumeration GdkEventType
	#GDK_OWNER_CHANGE  = 34; 2.6+
	#GDK_GRAB_BROKEN   = 35; 2.8+
	#GDK_DAMAGE        = 36; 2.14+
	#GDK_TOUCH_BEGIN   = 37; 3.4+
	#GDK_TOUCH_UPDATE  = 38; 3.4+
	#GDK_TOUCH_END     = 39; 3.4+
	#GDK_TOUCH_CANCEL  = 40; 3.4+
	#GDK_TOUCHPAD_SWIPE= 41; 3.18+
	#GDK_TOUCHPAD_PINCH= 42; 3.18+
	#GDK_EVENT_LAST    = 43; 2.18+
EndEnumeration

Enumeration GdkOwnerChange
	#GDK_OWNER_CHANGE_NEW_OWNER
	#GDK_OWNER_CHANGE_DESTROY
	#GDK_OWNER_CHANGE_CLOSE
EndEnumeration

Structure GdkEventOwnerChange
	type.i;l
	*window.GdkWindow
	send_event.b
	CompilerIf #PB_Compiler_Processor = #PB_Processor_x86
		PB_Alignment1.b[3]
	CompilerElseIf #PB_Compiler_Processor = #PB_Processor_x64
		PB_Alignment1.b[7]
	CompilerEndIf
	*owner.GdkWindow
	reason.i
	selection.i
	time.l
	selection_time.l
EndStructure

#Win_Main  = 0
#btn  = 0
#Menu  = 0

Global gEvent
Global   gClipboard= gtk_clipboard_get_(gdk_atom_intern("CLIPBOARD", #True))

; === мой контент ===

; Declare ForceDirectories(Dir.s)
; Declare Screen_GetWindowStack(id)
; Declare.s GetWinTitle(id)

Global NewList FavList.s()
Global i


Define tmp$, EM

ProcedureC Callback_Clipboard_OwnerChange(*clipboard, *event.GdkEventAny, user_data)
	Protected *eventownerchange.GdkEventOwnerChange

			Debug "да"
	If *event\type = #GDK_OWNER_CHANGE
		*eventownerchange= *event
		If AddElement(FavList())
			FavList() = GetClipboardText()
		EndIf
	EndIf
EndProcedure

If OpenWindow(#Win_Main, 300, 200, 500, 200, "Слежка за буфером обмена", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
	g_signal_connect(gClipboard, "owner-change", @Callback_Clipboard_OwnerChange(), 0)
EndIf
; =======================================

*Display = XOpenDisplay(0)

If *Display
	RootWindow = XDefaultRootWindow(*Display)
	
	If RootWindow
		KeyCode = XKeysymToKeycode(*Display, #XK_K)
		XGrabKey(*Display, KeyCode, #AltMask, RootWindow, #False, #GrabModeAsync, #GrabModeAsync)
		XSelectInput(*Display, RootWindow, #KeyPressMask)
		
		Repeat
			XNextEvent(*Display, @Event)
			Debug Event\EventType
			If Event\EventType = #KeyPress
				If CreatePopupMenu(#Menu)
					i=0
					ForEach FavList()
						MenuItem(i, FavList())
						i+1
					Next
					i-1
				EndIf
				DisplayPopupMenu(#Menu, WindowID(#Win_Main))
; 				DisplayPopupMenu(#Menu, *Display)
				;         MessageRequester("Info", "Global Hotkey <Ctrl> + <Shift> + <K> detected and removed!")
				; 						пока разрегистрируем клавишу
				XUngrabKey(*Display, KeyCode, #AltMask, RootWindow)
				Break
			EndIf
			
			
			Select WaitWindowEvent()
					
				Case #PB_Event_Menu        ; кликнут элемент всплывающего Меню
					
					EM = EventMenu()
					Select EM
						Case 0 To i
							tmp$ = GetMenuItemText(#Menu, EM)
							MessageRequester("", tmp$)
					EndSelect
				Case #PB_Event_CloseWindow
					End
			EndSelect
			
		ForEver
		
		XCloseDisplay(*Display)
	EndIf
EndIf
Callback doesn't work



the simplified version works

Code: Select all

EnableExplicit

ImportC ""
	gdk_atom_intern(atom_name.p-utf8, only_if_exists)
	g_signal_connect(*instance, detailed_signal.p-utf8, *c_handler, *pdata, destroy= 0, flags= 0) As "g_signal_connect_data"
EndImport

Enumeration GdkEventType
	#GDK_OWNER_CHANGE  = 34; 2.6+
	#GDK_GRAB_BROKEN   = 35; 2.8+
	#GDK_DAMAGE        = 36; 2.14+
	#GDK_TOUCH_BEGIN   = 37; 3.4+
	#GDK_TOUCH_UPDATE  = 38; 3.4+
	#GDK_TOUCH_END     = 39; 3.4+
	#GDK_TOUCH_CANCEL  = 40; 3.4+
	#GDK_TOUCHPAD_SWIPE= 41; 3.18+
	#GDK_TOUCHPAD_PINCH= 42; 3.18+
	#GDK_EVENT_LAST    = 43; 2.18+
EndEnumeration

Enumeration GdkOwnerChange
	#GDK_OWNER_CHANGE_NEW_OWNER
	#GDK_OWNER_CHANGE_DESTROY
	#GDK_OWNER_CHANGE_CLOSE
EndEnumeration

Structure GdkEventOwnerChange
	type.i;l
	*window.GdkWindow
	send_event.b
	CompilerIf #PB_Compiler_Processor = #PB_Processor_x86
		PB_Alignment1.b[3]
	CompilerElseIf #PB_Compiler_Processor = #PB_Processor_x64
		PB_Alignment1.b[7]
	CompilerEndIf
	*owner.GdkWindow
	reason.i
	selection.i
	time.l
	selection_time.l
EndStructure

; Object constants
#Win_Main  = 0
#btn  = 0
#Menu  = 0

Global.i gEvent
Global   gClipboard= gtk_clipboard_get_(gdk_atom_intern("CLIPBOARD", #True))

; === мой контент ===

Global NewList FavList.s()
Global i


Define tmp$, EM


ProcedureC Callback_Clipboard_OwnerChange(*clipboard, *event.GdkEventAny, user_data)
	Protected *eventownerchange.GdkEventOwnerChange
; 	Static t = 0
	
	If *event\type = #GDK_OWNER_CHANGE
; 		If t
; 			t - 1
; 			ProcedureReturn
; 		EndIf
; 		t+1
			*eventownerchange= *event
			If AddElement(FavList())
				FavList() = GetClipboardText()
			EndIf
		
	EndIf
EndProcedure

If OpenWindow(#Win_Main, 300, 200, 500, 200, "Слежка за буфером обмена", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
	
	ButtonGadget(#btn, 5, 40, 300, 26, "Показать данные")
	
	g_signal_connect(gClipboard, "owner-change", @Callback_Clipboard_OwnerChange(), 0)
	
	Repeat
		gEvent= WaitWindowEvent()
		
		Select gEvent
				
			Case #PB_Event_Gadget
				Select EventGadget()
					Case #btn
						If CreatePopupMenu(#Menu)
							i=0
							ForEach FavList()
								MenuItem(i, FavList())
								i+1
							Next
							i-1
						EndIf
						DisplayPopupMenu(#Menu, WindowID(#Win_Main))
						
				EndSelect
						
			Case #PB_Event_Menu        ; кликнут элемент всплывающего Меню
				
				EM = EventMenu()
				Select EM
					Case 0 To i
						tmp$ = GetMenuItemText(#Menu, EM)
						MessageRequester("", tmp$)
				EndSelect
			Case #PB_Event_CloseWindow
				End
				
		EndSelect
	ForEver
EndIf

Re: Extended clipboard (?) Linux

Posted: Sun May 23, 2021 3:37 pm
by AZJIO
can I save a pointer to a list to a file and another program can read it?

server

Code: Select all

EnableExplicit

Structure Flist
	List FavList.s()
EndStructure

Global FavList.Flist
Global i
Define tmp$

For i = 1 To 10
	If AddElement(FavList\FavList())
		FavList\FavList() = Str(Random(100000))
	EndIf
Next


; tmp$ = GetPathPart(ProgramFilename()) + GetFilePart(ProgramFilename(), #PB_FileSystem_NoExtension) + ".cfg"
tmp$ = GetPathPart(ProgramFilename()) + "fuf.cfg"
If FileSize(tmp$) < 0
	If CreateFile(0, tmp$)
		; 		 WriteInteger(0, PeekI(FavList()))
		WriteInteger(0, FavList)
		Debug FavList
		CloseFile(0)
	EndIf
Else
	If OpenFile(0, tmp$)
		WriteInteger(0, FavList)
		Debug FavList
		CloseFile(0)
	EndIf
EndIf

Delay(10)
MessageRequester("", "finish")
client

Code: Select all

EnableExplicit

Structure Flist
	List FavList.s()
EndStructure

Define *i, tmp$

; Procedure Exe(*FavList.Flist)
Procedure Exe(*i.Flist)
; 	Protected *FavList.Flist = *i
	Protected *FavList.Flist 
	
	*FavList.Flist = AllocateMemory(SizeOf(Flist))
	InitializeStructure(*FavList.Flist, Flist)
	*FavList.Flist = *i
	
	Debug ListSize(*FavList\FavList())
	ForEach *FavList\FavList()
		Debug *FavList\FavList()
	Next
	ClearStructure(*FavList, Flist)
	FreeMemory(*FavList) 
EndProcedure

tmp$ = GetPathPart(ProgramFilename()) + "fuf.cfg"
If FileSize(tmp$) < 0
	MessageRequester("","файла нет")
Else
	If OpenFile(0, tmp$)
		*i = ReadInteger(0)
		Debug *i
		CloseFile(0)
		Exe(*i)
	EndIf
EndIf

Re: Extended clipboard (?) Linux

Posted: Sun May 23, 2021 4:19 pm
by mk-soft
No !

Each programme has its own virtual address range.
This is possible with server and client.

Edit:
Works only shared memory (not list, arrays)

Link: https://www.purebasic.fr/german/viewtop ... =8&t=16659

Attention! Must still be adapted to X64 (.l > .i)

Re: Extended clipboard (?) Linux

Posted: Sat May 29, 2021 12:42 am
by AZJIO
mk-soft wrote: Sun May 23, 2021 4:19 pm Edit:
shared_memory.pbi

Code: Select all

; Windows only