有任何 C 函数可以模拟双击文件吗?

有任何 C 函数可以模拟双击文件吗?

我有一些 .desktop 文件,正在寻找使用户像双击 .desktop 文件一样的 c 函数。

这是我的桌面文件:https://www.youtube.com/watch?v=Yc19BzLTnDE

谢谢

答案1

此解决方案使用 Gio,它使用方法g_app_info_launch_uris。它使用应用于 .desktop 文件的图标来启动 .desktop:

这是 js-ctypes 代码,可以从 fiefox 扩展运行。或者启用了开发首选项的 Firefox Scratchpad。我从此处的解决方案中改编了它:https://askubuntu.com/a/239883/321266

Cu.import('resource://gre/modules/ctypes.jsm');

var gio = ctypes.open('libgio-2.0.so.0');

// BASIC TYPES
var TYPES = {
    gchar: ctypes.char,
    gint: ctypes.int,
    GAppInfo: ctypes.StructType('GAppInfo'),
    GAppLaunchContext: ctypes.StructType('GAppLaunchContext'),
    GDesktopAppInfo: ctypes.StructType('GDesktopAppInfo'),
    GList: new ctypes.StructType('GList', [
        {'data': ctypes.voidptr_t},
        {'next': ctypes.voidptr_t},
        {'prev': ctypes.voidptr_t}
    ]),
    GQuark: ctypes.uint32_t
};

// ADVANCED TYPES
TYPES.gboolean = TYPES.gint;
TYPES.GError = new ctypes.StructType('GError', [
    {'domain': TYPES.GQuark},
    {'code': ctypes.int},
    {'message': ctypes.char.ptr}
]);

// FUNCTIONS
/* https://developer.gnome.org/gio/unstable/gio-Desktop-file-based-GAppInfo.html#g-desktop-app-info-new-from-filename
 * GDesktopAppInfo * g_desktop_app_info_new_from_filename(
 *   const char *filename
 * );
 */
var new_from_filename = gio.declare('g_desktop_app_info_new_from_filename', ctypes.default_abi,
    TYPES.GDesktopAppInfo.ptr,  // return
    TYPES.gchar.ptr             // *filename
);

/* https://developer.gnome.org/gio/unstable/GAppInfo.html#g-app-info-launch-uris
 * gboolean g_app_info_launch_uris (
 *   GAppInfo *appinfo,
 *   GList *uris,
 *   GAppLaunchContext *launch_context,
 *   GError **error
 * );
 */
var launch_uris = gio.declare('g_app_info_launch_uris', ctypes.default_abi,
    TYPES.gboolean,                 // return
    TYPES.GAppInfo.ptr,             // *appinfo
    TYPES.GList.ptr,                // *uris
    TYPES.GAppLaunchContext.ptr,    // *launch_context
    TYPES.GError.ptr.ptr            // **error
);

// start - helper functions

// end - helper functions

var shutdown = function() {

    gio.close();
    console.log('succesfully shutdown');
}

function main() {
    var jsStr_pathToDesktopFile = OS.Path.join(OS.Constants.Path.desktopDir, 'Firefox - Profile Manager.desktop');
    var launcher = new_from_filename(OS.Path.join(OS.Constants.Path.desktopDir, jsStr_pathToDesktopFile));
    console.info('launcher:', launcher, launcher.toString(), uneval(launcher));

    if (launcher.isNull()) {
        throw new Error('No file exists at path: "' + jsStr_pathToDesktopFile + '"');
    }

    launcher = ctypes.cast(launcher, TYPES.GAppInfo.ptr);
    var uris = new TYPES.GList(); // can use `null`
    var launch_context = null; // have to use null due o this explanation here: // cannot use `var launch_context = new TYPES.GAppLaunchContext();` //throws `Error: cannot construct an opaque StructType` so i have to get launch_context from something like `gdk_display_get_app_launch_context` because i dont know he structure to it, and i obviously cannto create opaque structures
    var error = new TYPES.GError.ptr(); // can use `null`

    var rez_launch_uris = launch_uris(launcher, uris.address(), launch_context/*launch_context.address()*/, error.address());
    console.info('rez_launch_uris:', rez_launch_uris, rez_launch_uris.toString(), uneval(rez_launch_uris));
    console.info('error:', error, error.toString(), uneval(error));
}

try {
    main();
} catch (ex) {
    console.error('Error Occured:', ex);
} finally {
    shutdown();
}

相关内容