- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我目前正在尝试为我的应用程序实现复制和粘贴,问题是我只能根据 Gtk.Clipboard
的文档将纯文本或图像复制到剪贴板:https://valadoc.org/gtk+-3.0/Gtk.Clipboard.html set_text
/set_image
.
但是还有这个方法https://valadoc.org/gtk+-3.0/Gtk.Clipboard.set_with_data.html set_with_data
,我想我可以用它来添加一个 uri 或一个 uris 数组。但我不知道如何做,也没有找到任何好的例子。
更新
使用给定的答案,我可以用一组 uris 填充剪贴板,但我可以读取它们,当我尝试时,它只需再次调用 get_func
并重新填充它。
CTRL C pressed
clipboard get_func called
Received: file:///home/marcel/Downloads/.gitignore
CTRL V pressd
clipboard get_func called
Received: file:///home/marcel/Downloads
Try Pasting: file:///home/marcel/Downloads
这是我用来测试CTRL + V
的代码:
print ("\nCTRL V pressd\n");
clipboard.request_uris ((clipboard, uris) => {
foreach ( string content in uris ) {
print ("Try Pasting: ");
print (content);
print ("\n");
}
});
这是 get_func
的相关部分,用于 CTRL + C
:
clipboard.set_with_owner (
clipboard_targets,
(clipboard, selection_data, info, user_data_or_owner) => {
print ("clipboard get_func called\n");
var w = user_data_or_owner as Window;
File[] files = { w.get_selected_file () };
switch ( info ) {
case ClipboardProtocol.TEXT_URI_LIST:
print ("Received: ");
string[] uris = {};
foreach ( var file in files ) {
print (file.get_uri ());
print ("\n");
uris += file.get_uri ();
}
selection_data.set_uris (uris);
break;
正如您在上面的终端输出中看到的,它只是重新填充剪贴板,丢弃了之前的值。
最佳答案
根据要求,我提供了将 URI 写入剪贴板和从剪贴板获取 URI 的示例。这些示例基本上是立即获取/设置剪贴板的命令行程序。在实际的 GUI 应用程序中,您可能会对按下按钮使用react,或者捕捉 CtrlC/CtrlV事件,使用 Gtk.Widget.add_events()
并在处理 Gtk.Widget.event
信号时获取/设置剪贴板。
您可以使用 Gtk.Clipboard.request_uris ()
从 X11 剪贴板请求 URI。此函数接受一个回调,一旦 URI 可用,该回调将被调用。
例子:
public void main (string[] args) {
Gtk.init (ref args);
Gdk.Display display = Gdk.Display.get_default ();
Gtk.Clipboard clipboard = Gtk.Clipboard.get_for_display (display, Gdk.SELECTION_CLIPBOARD);
clipboard.request_uris (recieved_func);
Gtk.main ();
}
/* Gtk.ClipboardURIRecievedFunc */
private void recieved_func (Gtk.Clipboard clipboard, string[] uris) {
foreach (var uri in uris) {
print (uri + "\n");
}
Gtk.main_quit ();
}
用valac clipget.vala --pkg=gtk+-3.0
编译
Since there is no standard way to copy and paste files between applications on X11, various MIME types and conventions are currently in use. For instance, Nautilus expects files to be supplied with a x-special/gnome-copied-files MIME type with data beginning with the cut/copy action, a newline character, and the URL of the file.
Gtk.Clipboard
没有预先实现设置复制/剪切文件的剪贴板。正如您所说,没有这样的 Gtk.Clipboard.set_uris()
。
相反,您应该通过提供一个回调来设置剪贴板,以便 X11 在收到请求后从中获取剪贴板内容。
这些是所需的步骤:
创建一组 Gtk.TargetEntry
来指定您的应用可以处理的剪贴板协议(protocol)。您需要处理协议(protocol) text/uri-list
、x-special/gnome-copied-files
和 UTF8_STRING
。每个 TargetEntry
都由其 info
字段标识,因此该编号应该是唯一的(参见下面示例中的 enum ClipboardProtocol
)
实现 Gtk.ClipboardGetFunc
类型的方法。此方法应填充与要复制/剪切的文件路径一起传递的 Gtk.SelectionData
对象。检查 info
参数以根据指定的协议(protocol)设置 SelectionData 参数。
使用 Gtk.Clipboard.set_with_owner
或 Gtk.Clipboard.set_with_data
enum ClipboardProtocol {
TEXT_URI_LIST,
GNOME_COPIED_FILES,
UTF8_STRING
}
public void main (string[] args) {
Gtk.init (ref args);
Gdk.Display display = Gdk.Display.get_default ();
Gtk.Clipboard clipboard = Gtk.Clipboard.get_for_display (display, Gdk.SELECTION_CLIPBOARD);
var clipboard_targets = new Gtk.TargetEntry[3];
Gtk.TargetEntry target_entry = { "text/uri-list", 0, ClipboardProtocol.TEXT_URI_LIST };
clipboard_targets[0] = target_entry;
target_entry = { "x-special/gnome-copied-files", 0, ClipboardProtocol.GNOME_COPIED_FILES };
clipboard_targets[1] = target_entry;
target_entry = { "UTF8_STRING", 0, ClipboardProtocol.UTF8_STRING };
clipboard_targets[2] = target_entry;
var owner = new Object ();
var rc = clipboard.set_with_owner (
clipboard_targets,
get_func,
clear_func,
owner
);
assert (rc);
clipboard.store ();
Gtk.main ();
}
/* Gtk.ClipboardGetFunc */
private void get_func (
Gtk.Clipboard clipboard,
Gtk.SelectionData selection_data,
uint info,
void* user_data_or_owner
) {
print ("GET FUNC!\n");
File my_file = File.new_for_path ("/home/lukas/tmp/test.txt");
File my_2nd_file = File.new_for_path ("/home/lukas/tmp/test2.txt");
File[] files = { my_file, my_2nd_file };
switch (info) {
case ClipboardProtocol.TEXT_URI_LIST:
string[] uris = {};
foreach (var file in files) {
uris += file.get_uri ();
}
selection_data.set_uris (uris);
break;
case ClipboardProtocol.GNOME_COPIED_FILES:
var prefix = "copy\n";
//var prefix = "cut\n";
/* use one of the above */
var builder = new StringBuilder (prefix);
for (int i = 0; i < files.length; i++) {
builder.append (files[i].get_uri ());
/* dont put the newline if this is the last file */
if (i != files.length - 1)
builder.append_c ('\n');
}
selection_data.set (
selection_data.get_target (),
8,
builder.data
);
break;
case ClipboardProtocol.UTF8_STRING:
var builder = new StringBuilder ();
foreach (var file in files) {
builder.append (file.get_parse_name ());
}
builder.append_c ('\n');
selection_data.set_text (builder.str, -1);
break;
default:
assert_not_reached ();
}
Gtk.main_quit ();
}
/* Gtk.ClipboardClearFunc */
private void clear_func (Gtk.Clipboard clipboard, void* data) {
;
}
用valac clipset.vala --pkg=gtk+-3.0
编译
一些注意事项:
在我的示例中,我只能测试 x-special/gnome-copied-files
,因为此时我只安装了 Nautilus。我改编了 Thunar 源代码中的所有协议(protocol)(请参阅下面的源代码),但它们可能仍需要进行故障排除*
如果您不想亲自执行此操作,您也可以使用 xclip 命令行工具:https://askubuntu.com/a/210428/345569然而,恕我直言,自己实现这个更优雅一些。
关于linux - 使用 vala 将 uris 插入 Gtk.Clipboard,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50319438/
我尝试使用 Clipboard 类粘贴一些复制的对象。 Public Class DogsZoo Public Property Dogs As List(Of Dog) Pub
每当我按下 Ctrl-Shift-C 时,我已经尝试了多种方法强制 xterm(版本 285 和 292)将选择复制到 CLIPBOARD 剪贴板。到目前为止,最有前途的方法是在 ~/.Xresour
我路过一篇关于 Microsoft 的 Clipboard.SetText() 方法的文章: Clipboard.SetText Method (String) 而且我意识到如果字符串为空 (""),
在我的项目中有一个用例:用户单击一个按钮,然后将一些数据复制到剪贴板以进行下一步。 复制的数据与单击的按钮相关,并存储在组件状态中。 我做了一些搜索,并找到了如下潜在的解决方案: function c
我正在使用我的应用程序在我的应用程序中添加“复制到剪贴板”功能。 我使用以下命令: methods: { copyToClipboard () { if (process.env.
我想将 Keith Hill 的 Get-Clipboard 和 Set-Clipboard 的 C# 实现转换为纯 PowerShell 作为 .PSM1 文件。 有没有办法像他在使用剪贴板时在 C
是否有任何工具可以在 Windows 中拥有更强大的剪贴板类型功能? 我正在使用 vs.net 2008(如果它内置了但我不知道?) 我曾经有这个工具,我在剪贴板中创建了许多可以使用快捷方式访问的项目
我正在通过 MSTSC 从笔记本电脑访问桌面。在 RDC session 中,我选择了允许访问打印机和剪贴板本地资源的选项。 我可以从本地笔记本电脑复制并粘贴到我的远程桌面,但无法从远程复制并粘贴到本
我马上就承认,至少可以说,我缺乏 Pascal 经验。因此,我能得到的任何帮助将不胜感激。 :) 作为较大程序的一部分,我需要将字符串变量写入剪贴板。我在 Lazarus(版本 1.0.12)中创建了
使用Windows的Linux子系统(LSW),可以使用clip.exe将数据复制到Windows剪贴板: $ clip.exe /? CLIP Description: Redirects
当用户单击 elm 0.18 中的按钮时,有没有办法将文本从 div 复制到剪贴板? 我看过Clipboard.elm但我不能让它在 elm 0.18 中编译和工作。那么在 elm 0.18 中是否有
有没有办法通过剪贴板将透明图像粘贴到 photoshop? 我尝试使用已注册的“PNG”格式,但似乎 photoshop 不支持它(与 MSOffice 2007 和 GIMP 相反)。使用 CF_D
我从 Vim 外部复制文本。 ⌘V 在其他应用程序中粘贴文本没有问题。在 MacVim 中,它不起作用。 在插入模式下,什么都不显示。在普通模式下,我得到 E353: Nothing in regis
我使用的是 Visio Professional 2003。它运行良好。但是现在当我复制和粘贴任何形状时,它会显示错误“打开剪贴板失败”。之后,我无法更改任何属性或名称。 当我尝试关闭窗口时,它显示警
我正在建立一个UWP定位: 最低版本:14393 目标版本:18362 我的Windows版本是:10.0.19041内部版本19041 我有下面的代码: using Windows.Applicat
我正在用 C# 制作图像查看器。该功能是在 C# 上使用 Clipboard 类的复制和粘贴功能。 并且我成功获取了 BitmapSource 的图像。但它无法检查图像格式(jpeg、png、bmp)
我想在双击标签时复制 Label: self.text 的内容,但以下内容不起作用: 主文件 #!/usr/bin/kivy # -*- coding: utf-8 -*- from kivy.app
我正在使用 CLPB_IMPORT 功能模块将剪贴板获取到内部表。没关系。我正在复制两列 Excel 数据。所以它用分隔符'#'填充表格,比如; 4448#3000 4449#4000 4441#50
我无法复制到 +或 *登记。 :echo has('clipboard')从 Vim 内部返回 0这意味着我没有那个功能标志,我不想重新编译。 我正在运行 Wayland 所以我不能使用 X11 ba
示例:%y+拖到外部+剪贴板。现在,我希望将诸如^\S\+之类的正则表达式的结果发送到外部+ clipboard。如何? 试用1. [失败] :g@^\S\+@y+ 试用2。[失败] :^\S\+y+
我是一名优秀的程序员,十分优秀!