linux自增窗口状态——KwindowSystem篇

2023-11-17

前言:

之前曾翻译过 X Desktop Group,今天分享一下如何自定义状态;

此篇讲述如何通过kwindowsystem新增状态,以及设置状态的过程;

窗口有不同的属性、状态、允许Action等等信息,以使窗口管理器来确定窗口的装饰、堆叠位置和其他行为,而我们可以通过xprop命令(之前曾讲过xprop)进行查看窗口允许的操作、属性状态等等。

正文:

一个客户端窗口除了自己本身进行UI设置和功能设置外,还需要设置不同的属性来供其他组件进行管理,或者联动,尤其是操作系统本身的组件,肯定需要通过设置property、Actions和status等信息,方便窗口管理器来确定窗口的装饰、堆叠位置和其他行为,更好的管理窗口。今天以_NET_WM_STATE为例,讲述如何增加自定义状态,当然举一反三自定义其他的类型属性,都是差不多的原理,不过还是建议使用已经定义的属性,因为比较规范,后期会分享一下,什么时候定义属性什么时候定义接口。

  • 整体流程

  • 代码部分
  1. KwindowSystem

如果我们想为窗口增加新的属性,可以通过在KwindowSystem的代码中,增加新的属性,进行处理,以下是增加属性的步骤:

1. atoms_p.h
//此文件保存了所有窗口属性用到的枚举变量,当我们需要增加新的自定义属性的时候,需要在此文件中找到自己想要新增属性对应类型的位置,此次我们新增的是应用窗口状态,所以在应用窗口状态下,新增如下代码:
ENUM(_NET_WM_STATE_NEW_TEST)  
//注意全部大写,虽然也可以小写,但最好符合规范;
//NEW_TEST是我自己起的名字,不是固定的可以更换,一般前不同的类型半部分都有对应的固定部分

2. netwm_def.h
//此文件中定义了NETRootInfo 和NETWinInfo的基类NET,用于检索和修改窗口的属性。保持命名空间相对干净,所有枚举都在这里定义。
//我们需要在这里声明好我们先前新增的属性对应的枚举值,这样外部调用的时候,可以直接NET::***,设置窗口状态;
//我们依然找到自己新增的属性对应类型的位置,我新增的是状态,故增加在state中,代码如下:
enum State {
       TestState = 1u << 0 //这里名字没有固定部分,根据自己需要进行起名即可
};

以上准备工作都已经完成,下面是真正进行处理窗口设置了该属性后,KwindowSystem需要做的工作。

3.netwm.cpp
//此文件中定义了NETRootInfo类,主要客户端和窗口管理器提供了一个通用API设置/读取/更改由NET窗口定义的根窗口的属性;
//在这文件中,重载了以下五个函数,为方便起见而提供,它们之间的区别仅在于它接受的参数,第一个参数代表接受的类型,第二个参数on,如果为true则设置相应属性,如果为false,则删除属性:
void setSupported(NET::Property property, bool on = true);
void setSupported(NET::Property2 property, bool on = true);
void setSupported(NET::WindowTypeMask property, bool on = true);
void setSupported(NET::State property, bool on = true);
void setSupported(NET::Action property, bool on = true);
//以上五个函数内部没有复杂的处理逻辑,所有的property、state、Action和mask都是在下面这个函数进行设置的,故我们只需要将新增属性的过滤写在下面的函数中:
void NETRootInfo::setSupported()
{
    //这个函数仅是设置支持什么属性,此函数中处理了所有类型,所以只需要找到自己对应的部分,增加设置即可,我的是state,故代码如下:
     if (p->properties & WMState) {
        atoms[pnum++] = p->atom(_NET_WM_STATE);
        //这里进行判断是否是新增的属性,如果是,则加入atoms中,因为一个窗口会有很多属性状态,所以需要存储在一起在函数尾部xcb_change_property()中设置;
         if (p->states & TestState) {         
            atoms[pnum++] =  p>atom(_NET_WM_STATE_NEW_TEST);
        }
}

****************************************************************
//上面只是设置,因为属性有更新的情况,故我们还需要在以下函数中进行处理:
void NETRootInfo::updateSupportedProperties(xcb_atom_t atom)
{
    //此函数的方式和上一个设置没有区别,只不过判断条件变化了
    if (atom == p->atom(_NET_WM_STATE_NEW_TEST)) {
        p->states |= TestState;
}

****************************************************************
//上面设置完成后,还需要在新增属性对应的处理函数中,增加处理,因为KwindowSystem中会有对外设置状态的接口,如我的是设置状态,故在下面的函数中设置:
void NETWinInfo::setState(NET::States state, NET::States mask)
{
    //此函数设置应用程序窗口的状态
    xcb_client_message_event_t event;
    event.response_type = XCB_CLIENT_MESSAGE;
    event.format = 32;
    event.sequence = 0;
    event.window = p->window;
    event.type = p->atom(_NET_WM_STATE);
    event.data.data32[3] = 0;
    event.data.data32[4] = 0;
    //以上是x下设置窗口状态的流程,指明窗口,设置状态
    //注意:以下代码的外层还有一个if,所以我们在if中增加此部分代码,在else中也要进行判断,此处就不列出了;
    if ((mask & TestState) && ((p->state & TestState) != (state & TestState))) {
        event.data.data32[0] = (state & TestState) ? 1 : 0;
        event.data.data32[1] = p->atom(_NET_WM_STATE_NEW_TEST);
        event.data.data32[2] = 0l;
        xcb_send_event(p->conn, false, p->root, netwm_sendevent_mask, (const char *) &event);
    }
}

****************************************************************
//还需要在以下函数中进行处理:
void NETWinInfo::event(xcb_generic_event_t *event, NET::Properties *properties, NET::Properties2 *properties2)
{
    //此函数接受传入的xcb_generic_event_t,并在传入的参数中返回更新的属性。
    if ((xcb_atom_t) message->data.data32[i] == p->atom(_NET_WM_STATE_NEW_TEST)) {
                    mask |= TestState;
                }
}

void NETWinInfo::update(NET::Properties dirtyProperties, NET::Properties2 dirtyProperties2)
{
    if (_NET_WM_STATE_NEW_TEST) {
                p->state |= TestState;
            }
}
以上便是KwindowSystem中需要做的所有工作;
  1. 设置属性demo
    1. pro文件
QT       += core gui  x11extras //x11extras也一定要添加
QT       += KWindowSystem //这个一定要添加

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

CONFIG += c++11
PKGCONFIG += x11 xext
CONFIG += c++14
CONFIG += qt warn_on
CONFIG += release
CONFIG += link_pkgconfig
# The following define makes your compiler emit warnings if you use
# any Qt feature that has been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

SOURCES += \
    main.cpp \
    utils.cpp \
    widget.cpp

HEADERS += \
    utils.h \
    widget.h

FORMS += \
    widget.ui

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

  1. utils.h
#include <QObject>
//这两个头文件注意
#include <netwm.h>
#include <netwm_def.h>
class Utils : public QObject
{
public:
    static void setProperty(int wid);
};

utils.cpp
#include "utils.h"

#include <QDebug>
#include <QtX11Extras/QX11Info>
#include <X11/extensions/shape.h>
#include <X11/Xatom.h>
#include <X11/Xlib.h>
#include <iostream>
#include <kwindowsystem.h>

void Utils::setProperty(int wid)
{
    //这里直接调用setState接口,即上面提到的接口,传入窗口id和设置的state即可
    KWindowSystem::setState( wid, NET::TestState);
}
  1. widget.h
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

QT_BEGIN_NAMESPACE
class QPushButton;
QT_END_NAMESPACE
namespace Ui { class Widget; }
class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);;
    ~Widget();

private:
    Ui::Widget *ui;
    QPushButton *m_test;
};
#endif // WIDGET_H

    1. widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include "utils.h"
#include <QDebug>
#include <iostream>
#include <QApplication>
#include <QPushButton>
#include <QVBoxLayout>
#include <QDebug>

#include <QtX11Extras/QX11Info>
#include <X11/extensions/shape.h>
#include <X11/Xatom.h>
#include <X11/Xlib.h>
#include <iostream>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    this->resize(500, 700);
    m_test = new QPushButton(this);
    m_test->setText("setProperty");

    QVBoxLayout *m_layout = new QVBoxLayout;
    m_layout->addStretch();
    m_layout->addWidget(m_test, 0 , Qt::AlignHCenter);
    m_layout->addStretch();
    this->setLayout(m_layout);

    connect(m_test, &QPushButton::clicked, this, [=] {
        qDebug() << "this->winId()" <<this->winId();
        Utils::setProperty(this->winId());
    });
}

Widget::~Widget()
{
    delete ui;
}


  1. main.cpp
#include "widget.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();
    return a.exec();
}

  1. 获取属性demo
    1. pro文件
QT       += core gui  x11extras dbus
QT       += KWindowSystem


greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
CONFIG += c++11
PKGCONFIG += x11 xext
CONFIG += c++14
CONFIG += qt warn_on
CONFIG += release
CONFIG += link_pkgconfig
TARGET = getProperty
TEMPLATE = app

# The following define makes your compiler emit warnings if you use
# any feature of Qt which as been marked as deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0


SOURCES += \
        main.cpp \
        widget.cpp \
    utils.cpp

HEADERS += \
        widget.h \
    utils.h

FORMS += \
        widget.ui

    1. utils.h
#include <QObject>
#include <netwm.h>
#include <netwm_def.h>
class Utils : public QObject
{
public:
    static char * getProperty();

};

    1. utils.cpp
#include "utils.h"

#include <QDebug>
#include <QtX11Extras/QX11Info>
#include <X11/extensions/shape.h>
#include <X11/Xatom.h>
#include <X11/Xlib.h>
#include <iostream>
#include <QtDBus/QDBusMessage>
#include <QtDBus/QDBusConnection>
#include <kwindowsystem.h>
char * Utils::getProperty()
{
    // get window id 根据自己的需要获取相应的id
    auto wid = 0;
    
    const auto screen = QX11Info::appScreen();
    Window rootWindow = QX11Info::appRootWindow(screen);
    const NET::Properties properties =
            NET::WMDesktop |
            NET::WMState |
            NET::WMWindowType |
            NET::WMStrut |
            NET::WMName |
            NET::WMIconGeometry |
            NET::WMIcon |
            NET::WMPid |
            NET::WMIconName;
    const NET::Properties2 properties2 =
            NET::WM2BlockCompositing |
            NET::WM2WindowClass |
            NET::WM2WindowRole |
            NET::WM2UserTime |
            NET::WM2StartupId |
            NET::WM2ExtendedStrut |
            NET::WM2Opacity |
            NET::WM2FullscreenMonitors |
            NET::WM2FrameOverlap |
            NET::WM2GroupLeader |
            NET::WM2Urgency |
            NET::WM2Input |
            NET::WM2Protocols |
            NET::WM2InitialMappingState |
            NET::WM2IconPixmap |
            NET::WM2OpaqueRegion |
            NET::WM2DesktopFileName |
            NET::WM2GTKFrameExtents;

    xcb_connection_t *c = QX11Info::connection();
    NETWinInfo* info = new  NETWinInfo(c, wid, rootWindow,properties, properties2, NET::Role::Client);
    if(info->state() & NET::TestState)
    {
        qDebug() << "set is success";
    }
    else
    {
        qDebug() << "set is fail";
    }
    return nullptr;
}
    1. widget.h
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

QT_BEGIN_NAMESPACE
class QPushButton;
QT_END_NAMESPACE
namespace Ui { class Widget; }
class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);;
    ~Widget();

private:
    Ui::Widget *ui;
    QPushButton *m_getProperty;
};
#endif // WIDGET_H

    1. widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include "utils.h"
#include <QDebug>
#include <iostream>
#include <QApplication>
#include <QPushButton>
#include <QVBoxLayout>
#include <QDebug>

#include <QtX11Extras/QX11Info>
#include <X11/extensions/shape.h>
#include <X11/Xatom.h>
#include <X11/Xlib.h>
#include <iostream>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    this->resize(500, 700);
    qDebug() << "this id is " << this->winId();
    m_getProperty = new QPushButton(this);
    m_getProperty->setText("m_getProperty");

    QVBoxLayout *m_layout = new QVBoxLayout;
    m_layout->addStretch();
    m_layout->addWidget(m_getProperty, 0 , Qt::AlignHCenter);
    m_layout->addStretch();
    this->setLayout(m_layout);

    connect(m_getProperty, &QPushButton::clicked, this, [=] {
        qDebug() << "get value";
        Utils::getProperty();
    });
}

Widget::~Widget()
{
    delete ui;
}
    1. main.cpp
#include "widget.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();
    return a.exec();
}

4. 谁获取谁设置

只是执行上面三步,会发现设置新增的属性后,使用xprop获取时看不见,还需要在调用放进行设置一次窗口属性,既可以看见了

以上代码都可以直接运行,可直接验证,当然不要忘记设置自己的属性哦~

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

linux自增窗口状态——KwindowSystem篇 的相关文章

  • 抑制 makefile 中命令调用的回显?

    我为一个作业编写了一个程序 该程序应该将其输出打印到标准输出 分配规范需要创建一个 Makefile 当调用它时make run gt outputFile应该运行该程序并将输出写入一个文件 该文件的 SHA1 指纹与规范中给出的指纹相同
  • 如何使用 bash 锁定文件

    我有一个任务从远程服务器同步目录 rsync av email protected cdn cgi l email protection srv data srv data 为了使其定期运行并避免脚本 reEnter 问题 我使用 rsyn
  • gdb查找行号的内存地址

    假设我已将 gdb 附加到一个进程 并且在其内存布局中有一个文件和行号 我想要其内存地址 如何获取文件x中第n行的内存地址 这是在 Linux x86 上 gdb info line test c 56 Line 56 of test c
  • 如何查明CONFIG_FANOTIFY_ACCESS_PERMISSIONS是否启用?

    我想利用fanotify 7 http man7 org linux man pages man7 fanotify 7 html我遇到的问题是在某些内核上CONFIG FANOTIFY ACCESS PERMISSIONS不起作用 虽然C
  • 为什么内核需要虚拟寻址?

    在Linux中 每个进程都有其虚拟地址空间 例如 32位系统为4GB 其中3GB为进程保留 1GB为内核保留 这种虚拟寻址机制有助于隔离每个进程的地址空间 对于流程来说这是可以理解的 因为有很多流程 但既然我们只有 1 个内核 那么为什么我
  • 无法从 jenkins 作为后台进程运行 nohup 命令

    更新 根据下面的讨论 我编辑了我的答案以获得更准确的描述 我正在尝试从詹金斯运行 nohup 命令 完整的命令是 nohup java jar home jar server process 0 35 jar prod gt gt var
  • chown:不允许操作

    我有问题 我需要通过 php 脚本为系统中的不同用户设置文件所有者权限 所以我通过以下命令执行此操作 其中 1002 是系统的用户 ID file put contents filename content system chown 100
  • 加载数据infile,Windows和Linux的区别

    我有一个需要导入到 MySQL 表的文件 这是我的命令 LOAD DATA LOCAL INFILE C test csv INTO TABLE logs fields terminated by LINES terminated BY n
  • 如何在数组中存储包含双引号的命令参数?

    我有一个 Bash 脚本 它生成 存储和修改数组中的值 这些值稍后用作命令的参数 对于 MCVE 我想到了任意命令bash c echo 0 0 echo 1 1 这解释了我的问题 我将用两个参数调用我的命令 option1 without
  • 如何使用GDB修改内存内容?

    我知道我们可以使用几个命令来访问和读取内存 例如 print p x 但是如何更改任何特定位置的内存内容 在 GDB 中调试时 最简单的是设置程序变量 参见GDB 分配 http sourceware org gdb current onl
  • 添加要在给定命令中运行的 .env 变量

    我有一个 env 文件 其中包含如下变量 HELLO world SOMETHING nothing 前几天我发现了这个很棒的脚本 它将这些变量放入当前会话中 所以当我运行这样的东西时 cat env grep v xargs node t
  • 尝试安装 LESS 时出现“请尝试以 root/管理员身份再次运行此命令”错误

    我正在尝试在我的计算机上安装 LESS 并且已经安装了节点 但是 当我输入 node install g less 时 出现以下错误 并且不知道该怎么办 FPaulMAC bin paul npm install g less npm ER
  • 如何在Linux内核源代码中打印IP地址或MAC地址

    我必须通过修改 Linux 内核源代码来稍微改变 TCP 拥塞控制算法 但为了检查结果是否正确 我需要记录 MAC 或 IP 地址信息 我使用 PRINTK 函数来打印内核消息 但我感觉很难打印出主机的MAC IP地址 printk pM
  • Linux 内核标识符中前导和尾随下划线的含义是什么?

    我不断遇到一些小约定 比如 KERNEL Are the 在这种情况下 是内核开发人员使用的命名约定 还是以这种方式命名宏的语法特定原因 整个代码中有很多这样的例子 例如 某些函数和变量以 甚至 这有什么具体原因吗 它似乎被广泛使用 我只需
  • os.Mkdir 和 os.MkdirAll 权限

    我正在尝试在程序开始时创建一个日志文件 我需要检查是否 log如果不创建目录 则目录存在 然后继续创建日志文件 好吧 我尝试使用os Mkdir 也os MkdirAll 但无论我在第二个参数中输入什么值 我都会得到一个没有权限的锁定文件夹
  • 安装J语言的JQt IDE,出现错误

    我一直按照这里的说明进行操作 http code jsoftware com wiki System Installation Linux http code jsoftware com wiki System Installation L
  • 如何在shell中输出返回码?

    我正在尝试通过调用自定义 shell 脚本sh bin sh c myscript sh gt log txt 2 gt 1 echo 该命令的输出是创建的后台进程的 PID 我想指导 bin sh保存返回码myscript sh到某个文件
  • 如何授予 apache 使用 NTFS 分区上的目录的权限?

    我在一台带有 20GB 硬盘的旧机器上运行 Linux Lubutu 12 10 我有一个 1 TB 外部硬盘 上面有一个 NTFS 分区 在该分区上 有一个 www 目录 用于保存我的网页内容 它在启动时自动安装为 media t515
  • PHP 无法打开流:是一个目录

    非常简单的 PHP 脚本 我在我亲自设置的 Ubuntu Web 服务器上的 EE 模板中运行 我知道这与权限有关 并且我已经将我尝试写入的目录的所有者更改为 Apache 用户 我得到的错误是 遇到 PHP 错误 严重性 警告 消息 fi
  • 如何确保应用程序在 Linux 上持续运行

    我试图确保脚本在开发服务器上保持运行 它会整理统计数据并提供网络服务 因此它应该会持续存在 但一天中有几次 它会因未知原因而消失 当我们注意到时 我们只需再次启动它 但这很麻烦 并且某些用户没有权限 或专有技术 来启动它 作为一名程序员 我

随机推荐

  • MODBUS CRC校验原理及C语言实现

    MODBUS通信协议的CRC校验原理多项式为8005的逆序A001 列01的CRC校验原理 1111111111111111 初始化CRC寄存机 0000000000000001 1111111111111110 异或 0111111111
  • pread介绍

    1 先来介绍pread函数 root bogon mycode cat test c include
  • QT中的事件

    目录 1 QT事件 1 1 事件介绍 1 2 事件的处理 2 键盘事件 2 1 keyPressEvent 2 1 1 判断某个键按下 2 1 2 组合键操作 3 鼠标事件 3 1 鼠标单击事件 3 2 鼠标释放事件 3 3 鼠标双击事件
  • vim 常用命令

    文本替换 s 替换 g global 全部 如果不加g则只会替换每行第一个word1 1 20s hello helloworld g 将1 20行中的 hello 替换为 helloworld 统计字符串出现次数 s pattern gn
  • innerHTML 用法

    用法 比如在中写了如下的代码 div div 现在用top innerHTML 的方法就可以向这个id的位置写入HTML代码了 例如top innerHTML
  • 啊哈c语言 潦草的初步笔记(3)

    第四章 while 当while后面 中的关系表达式为真时 即成立时才执行 种的内容 读作 mod 也称作 取模 作用是获取余数 的左右两边必须是整数 表示除号 作用是获取商 的左右两边可以是整数也可以是小数 等待 语句 Sleep 注意S
  • 20. 异常处理

    Hi 大家好 我是茶桁 在我们日常使用Python或者其他编程语言的时候 不可避免的都会出现报错和异常 那么 我们今天就来谈谈异常 什么是异常 异常异常 根据名字简单理解 那就是非正常 也就是没有达到预期目标 异常呢 其实就是一个事件 并且
  • CAP原理的证明

    CAP概述 C Consistency 一致性 A Availability 可用性 P Partition Tolerance分区容错性 CAP理论的核心是 一个分布式系统不可能同时很好的满足一致性 可用性和分区容错性这三个需求 最多只能
  • 【业务功能118】微服务-springcloud-springboot-Kubernetes集群-k8s集群-KubeSphere-OpenELB部署及应用

    OpenELB部署及应用 一 OpenELB介绍 网址 openelb io OpenELB 是一个开源的云原生负载均衡器实现 可以在基于裸金属服务器 边缘以及虚拟化的 Kubernetes 环境中使用 LoadBalancer 类型的 S
  • jquery子窗体操作父窗体中的元素

    1 在父窗口中操作子窗口中的元素 如 其中 iframe1是iframe的ID 1 选中IFRAME中的所有单选钮 window frames iframe1 document find input type radio attr chec
  • 华为云云耀云服务器L实例评测|云耀云服务器L实例部署paperless-ngx文档管理系统

    华为云云耀云服务器L实例评测 云耀云服务器L实例部署paperless ngx文档管理系统 一 云耀云服务器L实例介绍 1 1 云耀云服务器L实例简介 1 2 云耀云服务器L实例特点 二 paperless ngx介绍 2 1 paperl
  • SWAPIDC服务器销售模板,记录利用swapidc搭建IDC销售网站教程

    现在免空泛滥 所以写这么一篇教程吧 一 准备工作 首先你要准备一台服务器 其中推荐使用国外的Vultr 系统使用Centos6 方便实验 也可以用我的IDC服务器 不推荐使用国内的 因为域名需要备案 容易引起访问错误 使用SSH登陆服务器后
  • CA6140数控化改装设计(论文+CAD图纸)

    摘要 随着我国工业生产的发展 机械工业即将面临着一个十分重要的课题 设备改造 本设计就是对CA6140车床的机械部分 进行数控改造 数控改造主要是简化机械传动机构 缩短传动链 提高自动化程度 也是为了解决复杂的零件加工 精度控制及提高产品质
  • [从零开始学DeepFaceLab-15]: 使用-命令行八大操作步骤-第6步:模型的选择与训练 - 进阶 - 打开Windows的GPU加速开关

    目录 前言 第1章 来自DeepFaceLab模型训练的提醒 第2章 打开该开关的意义
  • 2017校招 360 笔试题 编程题 内存管理

    内存管理 时间限制 C C 语言 1000MS 其他语言 3000MS 内存限制 C C 语言 65536KB 其他语言 589824KB 题目描述 物联网技术的蓬勃发展 各种传感器纷纷出现 小B所在的项目组正在开发一个物联网项目 她们在研
  • 基线检查工具_高效液相色谱法35问35答,鬼峰、基线漂移、拖尾、分叉峰等系列问题一步到位!(上篇)...

    按分离机制的不同 高效液相色谱法可以分为液固吸附色谱法 液液分配色谱法 正相与反相 离子交换色谱法 离子对色谱法及分子排阻色谱法 这些方法在使用的过程中往往会遇到诸如鬼峰 基线漂移 拖尾 分叉峰 保留时间漂移 柱压过高等系列问题 该如何解决
  • 线段树Segment tree(1):单点修改,区间查询

    问题描述 给定数列a 1 a 2 a N 依次进行Q次操作 操作有两类 1 i x 给定i x 将a i 加上x 2 l r 给定i x 求 i l r
  • 两年外包生涯做完,感觉自己废了一半....

    先说一下自己的情况 大专生 17年通过校招进入湖南某软件公司 干了接近2年的点点点 今年年上旬 感觉自己不能够在这样下去了 长时间呆在一个舒适的环境会让一个人堕落 而我已经在一个企业干了五年的功能测试 已经让我变得不思进取 谈了1年的女朋友
  • 国内外自然语言处理(NLP)研究组

    博客地址 http blog csdn net wangxinginnlp article details 44890553 排名不分先后 收集不全 欢迎留言完善 中国大陆地区 腾讯人工智能实验室 Tencent AI Lab https
  • linux自增窗口状态——KwindowSystem篇

    前言 之前曾翻译过 X Desktop Group 今天分享一下如何自定义状态 此篇讲述如何通过kwindowsystem新增状态 以及设置状态的过程 窗口有不同的属性 状态 允许Action等等信息 以使窗口管理器来确定窗口的装饰 堆叠位