首页 > 编程语言 >zig vs c++:控制x11鼠标移动

zig vs c++:控制x11鼠标移动

时间:2024-07-22 17:19:47浏览次数:7  
标签:std const ++ c++ return zig vs x11 display

zig

Debug输出大小: 2.3MB
ReleaseSmall输出大小:11.3kB

const std = @import("std");
const x11 = @cImport({
    @cInclude("X11/Xlib.h");
});

// Converts between numeric types: .Enum, .Int and .Float.
pub inline fn as(comptime T: type, from: anytype) T {
    switch (@typeInfo(@TypeOf(from))) {
        .Enum => {
            switch (@typeInfo(T)) {
                .Int => return @intFromEnum(from),
                else => @compileError(@typeName(@TypeOf(from)) ++ " can't be converted to " ++ @typeName(T)),
            }
        },
        .Int => {
            switch (@typeInfo(T)) {
                .Enum => return @enumFromInt(from),
                .Int => return @intCast(from),
                .Float => return @floatFromInt(from),
                else => @compileError(@typeName(@TypeOf(from)) ++ " can't be converted to " ++ @typeName(T)),
            }
        },
        .Float => {
            switch (@typeInfo(T)) {
                .Float => return @floatCast(from),
                .Int => return @intFromFloat(from),
                else => @compileError(@typeName(@TypeOf(from)) ++ " can't be converted to " ++ @typeName(T)),
            }
        },
        else => @compileError(@typeName(@TypeOf(from) ++ " is not supported.")),
    }
}

pub fn main() !void {
    // const allocator = std.heap.page_allocator;
    const display = x11.XOpenDisplay(null);
    if (display == null) {
        std.debug.print("Failed to open display\n", .{});
        return;
    }
    defer _ = x11.XCloseDisplay(display);

    const screen = x11.XDefaultScreen(display);
    const root_window = x11.XRootWindow(display, screen);

    const height = x11.DisplayHeight(display, screen);
    const width = x11.DisplayWidth(display, screen);
    std.debug.print("Screen size: {}x{}\n", .{ width, height });

    const m = as(f32, height) / as(f32, width);

    var i: i32 = 0;
    while (i < width) : (i += 1) {
        const j = as(i32, as(f32, i) * m);
        _ = x11.XWarpPointer(display, x11.None, root_window, 0, 0, 0, 0, i, j);
        _ = x11.XFlush(display);
        std.time.sleep(50 * std.time.ns_per_us);
    }
}
// zig build-exe src/x11_control_mouse_cursor.zig -lX11 -lc
// -I .: 添加当前目录作为包含路径,这对于包含项目内的其他文件很有用。

c++

c++ source: https://gist.github.com/aliva/3372331
输出大小:16.8 kB

#include <X11/Xlib.h>
#include <iostream>
#include <unistd.h>

int main(void) {
    Display* dpy = XOpenDisplay(0);
    int scr = XDefaultScreen(dpy);
    Window root_window = XRootWindow(dpy, scr);

    int height = DisplayHeight(dpy, scr);
    int width  = DisplayWidth(dpy, scr);
    std::cout << "Screen size : " << width << "x" << height << std::endl;

    float m = (float)height/(float)width;

    int j;
    for(int i=0; i<width; i++){
        j = m*i;
        XWarpPointer(dpy, None, root_window, 0, 0, 0, 0, i, j);
        XFlush(dpy);
        usleep(50);
    }
}
// g++ x11_control_mouse_cursor.cpp -o x11_ctrl_cursor -lX11

标签:std,const,++,c++,return,zig,vs,x11,display
From: https://www.cnblogs.com/nolca/p/18316478

相关文章

  • C++ 学习笔记十一 封装
    封装4.1.1封装的意义封装是C++面向对象三大特性之一封装的意义:将属性和行为作为一个整体,表现生活中的事物将属性和行为加以权限控制封装意义一:​在设计类的时候,属性和行为写在一起,表现事物语法:class类名{访问权限:属性/行为};**示例1:**设计一个圆类,求圆的周......
  • 手写Kd树(C++模板非递归实现)
    手写Kd树(C++模板非递归实现)1.Kd树1.1Kd树简介1.2Kd树的建立1.3Kd树的查找2.C++完整代码实现3.测试代码3.1代码实现3.2测试结果4.与PCL中的Kd树做对比本文实现的Kd树实现参考了高翔博士的书《自动驾驶与机器人中的slam技术从理论到实践》;高博士原书中是递归......
  • 在linux上操作实现git github vscode的联动工作流(待更新)
    目录一、介绍与要求二、git和github联动2.1git与github的连接2.2git的操作三、vscode与git的方便操作(待更新)总结一、介绍与要求介绍:我刚刚改到linux系统(ubuntu22.04)上进行学习和工作,深感到linux的方便快捷,于是想在此记录以下git和github的学习过程,也权当备忘录。......
  • VScode连接虚拟机运行Python文件的方法
    声明:本文使用Linux发行版本为rocky_9.4目录1.在rocky_9.4最小安装的系统中,默认是没有tar工具的,因此,要先下载tar工具2.在安装好的vscode中下载ssh远程插件工具3.然后连接虚拟机4.查看python是否已经安装5.下载扩展插件6.新建.py文件测试1.在rocky_9.4最小安装......
  • C++:istream、ostream和fstream类
    1、基类istream和ostream(1)istreamA.What输入流的抽象类,是所有输入流类的基类B.Why(输入流的作用)用于从数据源(如文件、标准输入设备等外部设备)读取数据到内存中(2)ostreamA.What输出流的抽象类,是所有输出流类的基类B.Why(输出流的作用)输出流用于将数据从......
  • 在 VSCode 中通过 Python 使用 YouTube API 时如何启用 Intellisense
    我想在使用GoogleYouTubeAPI和Python时在VSCode中获得IntelliSense。但我不知道详细步骤。fromgoogleapiclient.discoveryimportbuildapi_key="****"youtube=build("youtube","v3",developerKey=api_key)request=youtube.channels().list(part......
  • VScode利用EIDE和cortex-debug进行stm32开发(包括配置以及使用)
    目录前言必要准备第一步:安装vscode插件——EIDEEIDE是什么EIDE的下载EIDE的配置(重点)EIDE功能的简单介绍1.项目的建立:新建项目或者导入项目2.为项目选择芯片支持包(不是必须)3.构建配置4.烧录配置5.项目属性和项目设置6.安装实用工具和打开插件设置第二步:安装vscode插件——cortex-......
  • c++中字符串之string和char
    c++string初始化的几种方式相对于C#来说,c++中string的初始化方式真的非常多,比如以下都可以用来初始化string:usingnamespacestd;intmain(){ stringstr1="test01";//直接赋值 stringstr2(5,'c');//结果:str2='ccccc',以length为长度的ch的拷贝(即length个ch) ......
  • 【校招+社招】华为OD机试 - 拼接URL(Java、JavaScript、Python、C、C++)
    鱼弦:公众号【红尘灯塔】,CSDN博客专家、内容合伙人、新星导师、全栈领域优质创作者、51CTO(Top红人+专家博主)、github开源爱好者(go-zero源码二次开发、游戏后端架构https://github.com/Peakchen)算法概述URL拼接(URL拼接)是指将多个URL组件(方案、主机、端口、路径、查询参......
  • 嵌入式C++、FreeRTOS、MySQL、Spring Boot和MQTT协议:智能零售系统详细流程介绍(代码示
    项目概述随着科技的发展,零售行业正经历着一场数字化转型。智能零售系统通过集成嵌入式技术和大数据分析,为商家提供了高效的运营管理工具。该系统的核心目标是提升顾客体验、优化库存管理、降低运营成本以及实现精准营销。本项目将结合多种技术栈,包括嵌入式硬件、嵌入式软件、......