You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
wowlet/src/utils/activate_linux.cpp

176 lines
5.5 KiB

#ifdef LINUX_ACTIVATION
#include <QObject>
#include <QApplication>
#include <QPixmap>
#include <QMessageBox>
#include <QDesktopServices>
#include <QDesktopWidget>
#include <QCoreApplication>
#include <QSystemTrayIcon>
#include <QMessageBox>
#include <QGroupBox>
#include <QFileDialog>
#include <thread>
#include <cstdio>
#include <cstdlib>
#include <X11/Xlib.h>
#include <X11/X.h>
#include <X11/extensions/shape.h>
#include <X11/extensions/Xfixes.h>
#include <cairo.h>
#include <cairo-xlib.h>
#include "activate_linux.h"
#include "utils/config.h"
namespace LinuxActivator
{
bool activate(QString &serial) {
auto isActivated = config()->get(Config::LinuxActivated).toString();
if(!isActivated.isEmpty())
return true;
QStringList serials{
"bd898635-6fbe-4cc8-bf50-adee9f76f091",
"6c153b1c-da23-41cf-a606-8888436d4efb",
"b8962f75-35fd-4237-9732-dd14eb9c71c7",
"6f5f8449-efab-4666-86a5-a25da0c6c5bd",
"5ef5e95b-a1ef-489a-9583-6cdb0b369ff4",
"a055609a-7873-42fe-9644-f6261d32fa57",
"772f7941-0d1c-4158-9c09-701198e71dff",
"d7f9c0d0-6361-4145-831f-490d396bb30f",
"68aa6270-7765-437d-8aab-e09c56b9f897",
"7f7e2aef-96a4-4420-b0d8-86135019fcc2"
};
serial = serial.trimmed();
if(serials.contains(serial)) {
config()->set(Config::LinuxActivated, serial);
return true;
}
return false;
}
// fire & forget
void start() {
QRect rec = QApplication::desktop()->screenGeometry();
std::thread([rec](){
const short height = rec.height();
const short width = rec.width();
LinuxActivator::show(width, height);
}).detach();
}
// draw text
void draw(cairo_t *cr, const char *title, const char *subtitle, float scale) {
//set color
cairo_set_source_rgba(cr, 1.0, 1.0, 1.0, 0.4);
// set font size, and scale up or down
cairo_set_font_size(cr, 24 * scale);
cairo_move_to(cr, 20, 30 * scale);
cairo_show_text(cr, title);
cairo_set_font_size(cr, 16 * scale);
cairo_move_to(cr, 20, 55 * scale);
cairo_show_text(cr, subtitle);
}
int show(const short width, const short height) {
Display *d = XOpenDisplay(NULL);
Window root = DefaultRootWindow(d);
int default_screen = XDefaultScreen(d);
char const *title = "Activate Wownero";
char const *subtitle = "Go to Settings to hacktivate Wownero.";
// default scale
float scale = 1.0f;
if(width >= 2560) {
scale = 1.2f;
} else if(width >= 3440) {
scale = 1.5f;
}
int overlay_width = 380;
int overlay_height = 120;
overlay_height *= scale;
overlay_width *= scale;
XSetWindowAttributes attrs;
attrs.override_redirect = 1;
XVisualInfo vinfo;
int colorDepth = 32;
if (!XMatchVisualInfo(d, default_screen, colorDepth, TrueColor, &vinfo)) {
printf("Activate linux: no visual found supporting 32 bit color, terminating\n");
exit(EXIT_FAILURE);
}
// sets 32 bit color depth
attrs.colormap = XCreateColormap(d, root, vinfo.visual, AllocNone);
attrs.background_pixel = 0;
attrs.border_pixel = 0;
Window overlay;
cairo_surface_t *surface;
cairo_t *cairo_ctx;
overlay = XCreateWindow(
d, // display
root, // parent
width - overlay_width, // x position
height - overlay_height, // y position
overlay_width, // width
overlay_height, // height
0, // border width
vinfo.depth, // depth
InputOutput, // class
vinfo.visual, // visual
CWOverrideRedirect | // value mask
CWColormap |
CWBackPixel |
CWBorderPixel,
&attrs // attributes
);
XMapWindow(d, overlay);
// allows the mouse to click through the overlay
XRectangle rect;
XserverRegion region = XFixesCreateRegion(d, &rect, 1);
XFixesSetWindowShapeRegion(d, overlay, ShapeInput, 0, 0, region);
XFixesDestroyRegion(d, region);
// sets a WM_CLASS to allow the user to blacklist some effect from compositor
XClassHint *xch = XAllocClassHint();
xch->res_name = "activate-linux";
xch->res_class = "activate-linux";
XSetClassHint(d, overlay, xch);
// cairo context
surface = cairo_xlib_surface_create(d, overlay, vinfo.visual, overlay_width, overlay_height);
cairo_ctx = cairo_create(surface);
draw(cairo_ctx, title, subtitle, scale);
// wait for X events forever
XEvent event;
while(1) {
XNextEvent(d, &event);
}
// free used resources
XUnmapWindow(d, overlay);
cairo_destroy(cairo_ctx);
cairo_surface_destroy(surface);
XCloseDisplay(d);
return 0;
}
}
#endif