aboutsummaryrefslogtreecommitdiff
path: root/src/plugins/General/copypaste/copypastefactory.cpp
blob: 314484cc0d3ee9552ca7b66ad144d81c673d6b84 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
/***************************************************************************
 *   Copyright (C) 2013 by Ilya Kotov                                      *
 *   forkotov02@hotmail.ru                                                 *
 *                                                                         *
 *   This program is free software; you can redistribute it and/or modify  *
 *   it under the terms of the GNU General Public License as published by  *
 *   the Free Software Foundation; either version 2 of the License, or     *
 *   (at your option) any later version.                                   *
 *                                                                         *
 *   This program is distributed in the hope that it will be useful,       *
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
 *   GNU General Public License for more details.                          *
 *                                                                         *
 *   You should have received a copy of the GNU General Public License     *
 *   along with this program; if not, write to the                         *
 *   Free Software Foundation, Inc.,                                       *
 *   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.         *
 ***************************************************************************/

#include <QtGui>
#include "copypaste.h"
#include "copypastefactory.h"

const GeneralProperties CopyPasteFactory::properties() const
{
    GeneralProperties properties;
    properties.name = tr("Copy/Paste Plugin");
    properties.shortName = "copypaste";
    properties.hasAbout = true;
    properties.hasSettings = false;
    properties.visibilityControl = false;
    return properties;
}

QObject *CopyPasteFactory::create(QObject *parent)
{
    return new CopyPaste(parent);
}

QDialog *CopyPasteFactory::createConfigDialog(QWidget *)
{
    return 0;
}

void CopyPasteFactory::showAbout(QWidget *parent)
{
    QMessageBox::about (parent, tr("About Copy/Paste Plugin"),
                        tr("Qmmp Copy/Paste Plugin")+"\n"+
                        tr("This plugin allows to copy selected tracks from one playlist to another")+"\n"+
                        tr("Written by: Ilya Kotov <forkotov02@hotmail.ru>"));
}

QTranslator *CopyPasteFactory::createTranslator(QObject *parent)
{
    QTranslator *translator = new QTranslator(parent);
    QString locale = Qmmp::systemLanguageID();
    translator->load(QString(":/copypaste_plugin_") + locale);
    return translator;
}

Q_EXPORT_PLUGIN2(copypaste, CopyPasteFactory)
hl com"> * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * ***************************************************************************/ #include "windowsystem.h" #include <QCoreApplication> #ifdef QMMP_WS_X11 #include <QX11Info> #include <X11/X.h> #include <X11/Xatom.h> #include <X11/Xlib.h> #include <X11/Xutil.h> #endif #ifdef QMMP_WS_X11 void WindowSystem::ghostWindow(WId win) { if(!QX11Info::isPlatformX11()) return; Display* dsp = QX11Info::display(); Window root = DefaultRootWindow(dsp); Atom win_state = XInternAtom(dsp, "_NET_WM_STATE", False); Atom win_state_add = XInternAtom(dsp, "_NET_WM_STATE_ADD", False); Atom win_state_settings[] = { XInternAtom(dsp, "_NET_WM_STATE_SKIP_TASKBAR", False), XInternAtom(dsp, "_NET_WM_STATE_SKIP_PAGER", False) }; XChangeProperty(dsp, win, win_state, XA_ATOM, 32, PropModeReplace, reinterpret_cast<unsigned char*>(&win_state_settings), 2); XEvent xev; xev.type = ClientMessage; xev.xclient.type = ClientMessage; xev.xclient.display = dsp; xev.xclient.window = win; xev.xclient.message_type = win_state; xev.xclient.format = 32; xev.xclient.data.l[0] = win_state_add; xev.xclient.data.l[1] = win_state_settings[0]; xev.xclient.data.l[2] = win_state_settings[1]; XSendEvent(dsp, root, false, SubstructureRedirectMask | SubstructureNotifyMask, &xev); } QString WindowSystem::netWindowManagerName() { if(!QX11Info::isPlatformX11()) return QString(); Display* dsp = QX11Info::display(); WId root = DefaultRootWindow(dsp); unsigned char* retValue1 = getWindowProperty(root, "_NET_SUPPORTING_WM_CHECK"); if (retValue1 == NULL) return QString(); WId win = *(reinterpret_cast<unsigned long*>(retValue1)); unsigned char* retValue2 = getWindowProperty(win, "_NET_SUPPORTING_WM_CHECK"); if (retValue2 == NULL) { XFree(retValue1); return QString(); } if (win != *(reinterpret_cast<unsigned long*>(retValue2))) { XFree(retValue1); XFree(retValue2); return QString(); } XFree(retValue2); retValue2 = getWindowProperty(win, "_NET_WM_NAME"); XFree(retValue1); if (retValue2 == NULL) return QString(); QString name = QString((char *)retValue2); XFree(retValue2); return name; } void WindowSystem::changeWinSticky(WId win, bool stick) { if(!QX11Info::isPlatformX11()) return; qDebug("WindowSystem: setting sticky state of window 0x%lx to %s.", static_cast<unsigned long>(win), stick ? "true" : "false"); Display* dsp = QX11Info::display(); Window root = DefaultRootWindow(dsp); unsigned long desktop = ~(0UL); if (!stick) { unsigned char* tmp = getWindowProperty(root, "_NET_CURRENT_DESKTOP"); if (tmp == NULL) qWarning("WindowSystem: error reading current desktop property."); else { desktop = *(reinterpret_cast<unsigned long*>(tmp)); XFree(tmp); } } XEvent xev; xev.type = ClientMessage; xev.xclient.type = ClientMessage; xev.xclient.display = dsp; xev.xclient.window = win; xev.xclient.message_type = XInternAtom(dsp, "_NET_WM_DESKTOP", False); xev.xclient.format = 32; xev.xclient.data.l[0] = desktop; XSendEvent(dsp, root, False, SubstructureRedirectMask | SubstructureNotifyMask, &xev); } void WindowSystem::setWinHint(WId win, const char *res_name, const char *res_class) { if(!QX11Info::isPlatformX11()) return; Display* dsp = QX11Info::display(); XClassHint hint; hint.res_name = strdup(res_name); hint.res_class = strdup(res_class); XSetClassHint(dsp, win, &hint); free(hint.res_name); free(hint.res_class); } unsigned char* WindowSystem::getWindowProperty(WId win, const char* prop) { Display* dsp = QX11Info::display(); // We inhibit new Atom creation since if you request for it // then such Atom most probably exists already. // Otherwise, no surprise we return NULL here. Atom reqAtom = XInternAtom(dsp, prop, True); if (reqAtom == None) return NULL; Atom retType = None; int retFormat = 0; unsigned long retItems = 0UL; unsigned long retMoreBytes = 0UL; unsigned char* retValue = NULL; // Check if the property exists and calculate its length. int retCheck = XGetWindowProperty(dsp, win, reqAtom, 0L, 0L, False, AnyPropertyType, &retType, &retFormat, &retItems, &retMoreBytes, &retValue); // The value is most probably empty, since we requested to read // only 0L length, thus, it's just useless... if (retValue != NULL) { XFree(retValue); retValue = NULL; } if (retCheck != Success || retType == None || retMoreBytes == 0) return NULL; // These are not needed for now. retFormat = 0; retItems = 0UL; // Convert the byte length into 32bit multiples. if (retMoreBytes % 4 != 0) retMoreBytes += 4 - retMoreBytes % 4; retMoreBytes /= 4; // Now request the actual property value with correct length and type. retCheck = XGetWindowProperty(dsp, win, reqAtom, 0L, retMoreBytes, False, retType, &retType, &retFormat, &retItems, &retMoreBytes, &retValue); if (retCheck != Success || retMoreBytes != 0) { if (retValue != NULL) XFree(retValue); return NULL; } return retValue; } //On RTL locales Qt sets flag NorthEastGravity for windows. //This function reverts these changes. void WindowSystem::revertGravity(WId win) { if(!QX11Info::isPlatformX11()) return; Display* dsp = QX11Info::display(); XSizeHints sh; memset(&sh, 0, sizeof(sh)); long unused; XGetWMNormalHints(dsp, win, &sh, &unused); sh.flags |= PWinGravity; if(sh.win_gravity == NorthEastGravity) sh.win_gravity = NorthWestGravity; else return; XSetWMNormalHints(dsp, win, &sh); XSetWindowAttributes xs; memset(&xs, 0, sizeof(xs)); xs.bit_gravity = NorthWestGravity; XChangeWindowAttributes(dsp, win, CWBitGravity, &xs);