diff --git a/KShare.pro b/KShare.pro index 8e90da5..db8e106 100644 --- a/KShare.pro +++ b/KShare.pro @@ -72,7 +72,26 @@ HEADERS += mainwindow.hpp \ cropeditor/drawing/pathitem.hpp \ cropeditor/drawing/lineitem.hpp \ cropeditor/drawing/textitem.hpp \ - colorpicker/colorpickerscene.hpp + colorpicker/colorpickerscene.hpp \ + platformbackend.hpp +mac { + SOURCES += $$PWD/platformspecifics/mac/macbackend.cpp + HEADERS += $$PWD/platformspecifics/mac/macbackend.hpp + LIBS += -framework Carbon +} else:win32 { + SOURCES += $$PWD/platformspecifics/u32/u32backend.cpp + HEADERS += $$PWD/platformspecifics/u32/u32backend.hpp + LIBS += -luser32 + QT += winextras +} else:unix { + SOURCES += $$PWD/platformspecifics/x11/x11backend.cpp + HEADERS += $$PWD/platformspecifics/x11/x11backend.hpp + QT += x11extras + LIBS += -lxcb-cursor -lxcb-xfixes +} else { + error(Unsupported platform); +} +>>>>>>> feature/platformbackends FORMS += mainwindow.ui \ cropeditor/settings/brushpenselection.ui \ diff --git a/main.cpp b/main.cpp index 5134256..105d7eb 100644 --- a/main.cpp +++ b/main.cpp @@ -56,9 +56,6 @@ int main(int argc, char *argv[]) { verbose = parser.isSet(v); MainWindow w; - w.show(); - QTimer::singleShot(0, [&] { - if (parser.isSet(h)) w.hide(); - }); + if (!parser.isSet(h)) w.show(); return a.exec(); } diff --git a/mainwindow.cpp b/mainwindow.cpp index af2f0da..fa5a59a 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -90,6 +90,7 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWi ui->quickMode->setChecked(settings::settings().value("quickMode", false).toBool()); ui->hideToTray->setChecked(settings::settings().value("hideOnClose", true).toBool()); + ui->captureCursor->setChecked(settings::settings().value("captureCursor", true).toBool()); } MainWindow::~MainWindow() { @@ -189,3 +190,7 @@ void MainWindow::on_hideToTray_clicked(bool checked) { void MainWindow::on_actionColor_Picker_triggered() { ColorPickerScene::showPicker(); } + +void MainWindow::on_captureCursor_clicked(bool checked) { + settings::settings().setValue("captureCursor", checked); +} diff --git a/mainwindow.hpp b/mainwindow.hpp index e729ea5..1c844fe 100644 --- a/mainwindow.hpp +++ b/mainwindow.hpp @@ -30,8 +30,8 @@ class MainWindow : public QMainWindow { void on_settingsButton_clicked(); void on_quickMode_clicked(bool checked); void on_hideToTray_clicked(bool checked); - void on_actionColor_Picker_triggered(); + void on_captureCursor_clicked(bool checked); public: explicit MainWindow(QWidget *parent = 0); diff --git a/platformbackend.hpp b/platformbackend.hpp new file mode 100644 index 0000000..8133ebc --- /dev/null +++ b/platformbackend.hpp @@ -0,0 +1,14 @@ +#ifndef PLATFORMBACKEND_HPP +#define PLATFORMBACKEND_HPP + +#ifdef __APPLE__ +#include +#endif +#ifdef _WIN32 +#include +#endif +#ifdef __unix__ +#include +#endif + +#endif // PLATFORMBACKEND_HPP diff --git a/platformspecifics/mac/macbackend.cpp b/platformspecifics/mac/macbackend.cpp new file mode 100644 index 0000000..0e45ff0 --- /dev/null +++ b/platformspecifics/mac/macbackend.cpp @@ -0,0 +1,9 @@ +#include "macbackend.hpp" + +QPixmap PlatformBackend::getCursor() { +#warning "TODO: Mac backend" + return std::tuple(QPoint(0, 0), QPixmap()); + // Not Monday: https://developer.apple.com/reference/appkit/nscursor/1527062-image + // Some on how to do NSImage -> QPixmap: http://stackoverflow.com/a/2468961/3809164 + // This is gonna be easier than with Windows +} diff --git a/platformspecifics/mac/macbackend.hpp b/platformspecifics/mac/macbackend.hpp new file mode 100644 index 0000000..324e375 --- /dev/null +++ b/platformspecifics/mac/macbackend.hpp @@ -0,0 +1,15 @@ +#ifndef MACBACKEND_HPP +#define MACBACKEND_HPP + +#include + +class PlatformBackend { + public: + QPixmap getCursor(); + static PlatformBackend &inst() { + static PlatformBackend inst; + return inst; + } +}; + +#endif // MACBACKEND_HPP diff --git a/platformspecifics/u32/u32backend.cpp b/platformspecifics/u32/u32backend.cpp new file mode 100644 index 0000000..6bb7819 --- /dev/null +++ b/platformspecifics/u32/u32backend.cpp @@ -0,0 +1,22 @@ +#include "u32backend.hpp" + +#include +#include +#include + +std::tuple PlatformBackend::getCursor() { + CURSORINFO cursorInfo; + cursorInfo.cbSize = sizeof(cursorInfo); + if (GetCursorInfo(&cursorInfo)) { + if (cursorInfo.flags == CURSOR_SHOWING) { + ICONINFO info; // It took me 5 hours to get to here + if (GetIconInfo(cursorInfo.hCursor, &info)) { + return std::tuple(QPoint(info.xHotspot, info.yHotspot), + QtWin::fromHBITMAP(info.hbmColor, QtWin::HBitmapAlpha)); + } else + return std::tuple(QPoint(0, 0), QPixmap()); + } else + return std::tuple(QPoint(0, 0), QPixmap()); + } else + return std::tuple(QPoint(0, 0), QPixmap()); +} diff --git a/platformspecifics/u32/u32backend.hpp b/platformspecifics/u32/u32backend.hpp new file mode 100644 index 0000000..e779fc5 --- /dev/null +++ b/platformspecifics/u32/u32backend.hpp @@ -0,0 +1,15 @@ +#ifndef U32BACKEND_HPP +#define U32BACKEND_HPP + +#include + +class PlatformBackend { + public: + std::tuple getCursor(); + static PlatformBackend &inst() { + static PlatformBackend inst; + return inst; + } +}; + +#endif // U32BACKEND_HPP diff --git a/platformspecifics/x11/x11backend.cpp b/platformspecifics/x11/x11backend.cpp new file mode 100644 index 0000000..2281831 --- /dev/null +++ b/platformspecifics/x11/x11backend.cpp @@ -0,0 +1,24 @@ +#include "x11backend.hpp" + +#include +#include +#include +#include +#include + +std::tuple PlatformBackend::getCursor() { + xcb_connection_t *connection = QX11Info::connection(); + xcb_xfixes_get_cursor_image_cookie_t cursorCookie = xcb_xfixes_get_cursor_image_unchecked(connection); + QScopedPointer cursorReply(xcb_xfixes_get_cursor_image_reply(connection, cursorCookie, NULL)); + if (cursorReply.isNull()) { + return std::tuple(QPoint(0, 0), QPixmap()); + } + + quint32 *pixels = xcb_xfixes_get_cursor_image_cursor_image(cursorReply.data()); + if (!pixels) { + return std::tuple(QPoint(0, 0), QPixmap()); + } + return std::tuple(QPoint(cursorReply->xhot, cursorReply->yhot), + QPixmap::fromImage(QImage((quint8 *)pixels, cursorReply->width, cursorReply->height, + QImage::Format_ARGB32_Premultiplied))); +} diff --git a/platformspecifics/x11/x11backend.hpp b/platformspecifics/x11/x11backend.hpp new file mode 100644 index 0000000..808ad42 --- /dev/null +++ b/platformspecifics/x11/x11backend.hpp @@ -0,0 +1,15 @@ +#ifndef X11BACKEND_HPP +#define X11BACKEND_HPP + +#include + +class PlatformBackend { + public: + std::tuple getCursor(); + static PlatformBackend &inst() { + static PlatformBackend inst; + return inst; + } +}; + +#endif // X11BACKEND_HPP diff --git a/screenshotter.cpp b/screenshotter.cpp index 8cea38b..06eeff8 100644 --- a/screenshotter.cpp +++ b/screenshotter.cpp @@ -5,6 +5,7 @@ #include "uploaders/uploadersingleton.hpp" #include #include +#include void screenshotter::area() { CropEditor *editor = new CropEditor(screenshotutil::fullscreen()); @@ -15,7 +16,7 @@ void screenshotter::area() { } void screenshotter::fullscreen() { - UploaderSingleton::inst().upload(screenshotutil::fullscreen()); + UploaderSingleton::inst().upload(screenshotutil::fullscreen(settings::settings().value("captureCursor", true).toBool())); } void screenshotter::areaDelayed() { diff --git a/screenshotutil.cpp b/screenshotutil.cpp index b052d53..e79d5bb 100644 --- a/screenshotutil.cpp +++ b/screenshotutil.cpp @@ -2,10 +2,22 @@ #include #include +#include #include #include +#include -QPixmap *screenshotutil::fullscreen() { +QPixmap *screenshotutil::fullscreen(bool cursor) { + if (cursor) { + QPixmap *noCursor = window(0); + QScopedPointer p(noCursor); + QPixmap *withCursor = new QPixmap(*noCursor); + QPainter painter(withCursor); + auto cursorData = PlatformBackend::inst().getCursor(); + painter.drawPixmap(QCursor::pos() - std::get<0>(cursorData), std::get<1>(cursorData)); + painter.end(); + return withCursor; + } return window(0); } diff --git a/screenshotutil.hpp b/screenshotutil.hpp index e8778ca..f683bc4 100644 --- a/screenshotutil.hpp +++ b/screenshotutil.hpp @@ -4,7 +4,7 @@ #include namespace screenshotutil { -QPixmap *fullscreen(); +QPixmap *fullscreen(bool cursor = true); QPixmap *window(long wid); void toClipboard(QString value); }