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
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