mirror of
https://github.com/kotatogram/kotatogram-desktop
synced 2025-10-13 14:16:03 +00:00
Build fixed for QtCreator. Linux libs loading order changed.
This commit is contained in:
@@ -18,6 +18,7 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org
|
||||
#include "stdafx.h"
|
||||
#include "pspecific.h"
|
||||
|
||||
#include "platform/linux/linux_libs.h"
|
||||
#include "lang.h"
|
||||
#include "application.h"
|
||||
#include "mainwidget.h"
|
||||
@@ -33,14 +34,7 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org
|
||||
|
||||
#include <iostream>
|
||||
|
||||
extern "C" {
|
||||
#undef signals
|
||||
#include <libappindicator/app-indicator.h>
|
||||
#include <gtk/gtk.h>
|
||||
#define signals public
|
||||
} // extern "C"
|
||||
|
||||
#include <unity/unity/unity.h>
|
||||
using namespace Platform;
|
||||
|
||||
namespace {
|
||||
QByteArray escapeShell(const QByteArray &str) {
|
||||
@@ -66,422 +60,6 @@ namespace {
|
||||
return result;
|
||||
}
|
||||
|
||||
bool frameless = true;
|
||||
bool finished = true;
|
||||
bool noQtTrayIcon = false, noTryUnity = false, tryAppIndicator = false;
|
||||
bool useGtkBase = false, useAppIndicator = false, useStatusIcon = false, trayIconChecked = false, useUnityCount = false;
|
||||
|
||||
AppIndicator *_trayIndicator = 0;
|
||||
GtkStatusIcon *_trayIcon = 0;
|
||||
GtkWidget *_trayMenu = 0;
|
||||
GdkPixbuf *_trayPixbuf = 0;
|
||||
QByteArray _trayPixbufData;
|
||||
QList<QPair<GtkWidget*, QObject*> > _trayItems;
|
||||
|
||||
int32 _trayIconSize = 22;
|
||||
bool _trayIconMuted = true;
|
||||
int32 _trayIconCount = 0;
|
||||
QImage _trayIconImageBack, _trayIconImage;
|
||||
|
||||
typedef gboolean (*f_gtk_init_check)(int *argc, char ***argv);
|
||||
f_gtk_init_check ps_gtk_init_check = 0;
|
||||
|
||||
typedef GtkWidget* (*f_gtk_menu_new)(void);
|
||||
f_gtk_menu_new ps_gtk_menu_new = 0;
|
||||
|
||||
typedef GType (*f_gtk_menu_get_type)(void) G_GNUC_CONST;
|
||||
f_gtk_menu_get_type ps_gtk_menu_get_type = 0;
|
||||
|
||||
typedef GtkWidget* (*f_gtk_menu_item_new_with_label)(const gchar *label);
|
||||
f_gtk_menu_item_new_with_label ps_gtk_menu_item_new_with_label = 0;
|
||||
|
||||
typedef void (*f_gtk_menu_item_set_label)(GtkMenuItem *menu_item, const gchar *label);
|
||||
f_gtk_menu_item_set_label ps_gtk_menu_item_set_label = 0;
|
||||
|
||||
typedef void (*f_gtk_menu_shell_append)(GtkMenuShell *menu_shell, GtkWidget *child);
|
||||
f_gtk_menu_shell_append ps_gtk_menu_shell_append = 0;
|
||||
|
||||
typedef GType (*f_gtk_menu_shell_get_type)(void) G_GNUC_CONST;
|
||||
f_gtk_menu_shell_get_type ps_gtk_menu_shell_get_type = 0;
|
||||
|
||||
typedef void (*f_gtk_widget_show)(GtkWidget *widget);
|
||||
f_gtk_widget_show ps_gtk_widget_show = 0;
|
||||
|
||||
typedef GtkWidget* (*f_gtk_widget_get_toplevel)(GtkWidget *widget);
|
||||
f_gtk_widget_get_toplevel ps_gtk_widget_get_toplevel = 0;
|
||||
|
||||
typedef gboolean (*f_gtk_widget_get_visible)(GtkWidget *widget);
|
||||
f_gtk_widget_get_visible ps_gtk_widget_get_visible = 0;
|
||||
|
||||
typedef void (*f_gtk_widget_set_sensitive)(GtkWidget *widget, gboolean sensitive);
|
||||
f_gtk_widget_set_sensitive ps_gtk_widget_set_sensitive = 0;
|
||||
|
||||
typedef GTypeInstance* (*f_g_type_check_instance_cast)(GTypeInstance *instance, GType iface_type);
|
||||
f_g_type_check_instance_cast ps_g_type_check_instance_cast = 0;
|
||||
|
||||
#define _PS_G_TYPE_CIC(ip, gt, ct) ((ct*)ps_g_type_check_instance_cast((GTypeInstance*) ip, gt))
|
||||
#define PS_G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type) (_PS_G_TYPE_CIC((instance), (g_type), c_type))
|
||||
#define PS_GTK_TYPE_MENU (ps_gtk_menu_get_type())
|
||||
#define PS_GTK_MENU(obj) (PS_G_TYPE_CHECK_INSTANCE_CAST((obj), PS_GTK_TYPE_MENU, GtkMenu))
|
||||
#define PS_GTK_TYPE_MENU_SHELL (ps_gtk_menu_shell_get_type())
|
||||
#define PS_GTK_MENU_SHELL(obj) (PS_G_TYPE_CHECK_INSTANCE_CAST((obj), PS_GTK_TYPE_MENU_SHELL, GtkMenuShell))
|
||||
|
||||
typedef gulong (*f_g_signal_connect_data)(gpointer instance, const gchar *detailed_signal, GCallback c_handler, gpointer data, GClosureNotify destroy_data, GConnectFlags connect_flags);
|
||||
f_g_signal_connect_data ps_g_signal_connect_data = 0;
|
||||
|
||||
#define ps_g_signal_connect(instance, detailed_signal, c_handler, data) ps_g_signal_connect_data((instance), (detailed_signal), (c_handler), (data), NULL, (GConnectFlags)0)
|
||||
|
||||
typedef AppIndicator* (*f_app_indicator_new)(const gchar *id, const gchar *icon_name, AppIndicatorCategory category);
|
||||
f_app_indicator_new ps_app_indicator_new = 0;
|
||||
|
||||
typedef void (*f_app_indicator_set_status)(AppIndicator *self, AppIndicatorStatus status);
|
||||
f_app_indicator_set_status ps_app_indicator_set_status = 0;
|
||||
|
||||
typedef void (*f_app_indicator_set_menu)(AppIndicator *self, GtkMenu *menu);
|
||||
f_app_indicator_set_menu ps_app_indicator_set_menu = 0;
|
||||
|
||||
typedef void (*f_app_indicator_set_icon_full)(AppIndicator *self, const gchar *icon_name, const gchar *icon_desc);
|
||||
f_app_indicator_set_icon_full ps_app_indicator_set_icon_full = 0;
|
||||
|
||||
typedef gboolean (*f_gdk_init_check)(gint *argc, gchar ***argv);
|
||||
f_gdk_init_check ps_gdk_init_check = 0;
|
||||
|
||||
typedef GdkPixbuf* (*f_gdk_pixbuf_new_from_data)(const guchar *data, GdkColorspace colorspace, gboolean has_alpha, int bits_per_sample, int width, int height, int rowstride, GdkPixbufDestroyNotify destroy_fn, gpointer destroy_fn_data);
|
||||
f_gdk_pixbuf_new_from_data ps_gdk_pixbuf_new_from_data = 0;
|
||||
|
||||
typedef GtkStatusIcon* (*f_gtk_status_icon_new_from_pixbuf)(GdkPixbuf *pixbuf);
|
||||
f_gtk_status_icon_new_from_pixbuf ps_gtk_status_icon_new_from_pixbuf = 0;
|
||||
|
||||
typedef void (*f_gtk_status_icon_set_from_pixbuf)(GtkStatusIcon *status_icon, GdkPixbuf *pixbuf);
|
||||
f_gtk_status_icon_set_from_pixbuf ps_gtk_status_icon_set_from_pixbuf = 0;
|
||||
|
||||
typedef void (*f_gtk_status_icon_set_title)(GtkStatusIcon *status_icon, const gchar *title);
|
||||
f_gtk_status_icon_set_title ps_gtk_status_icon_set_title = 0;
|
||||
|
||||
typedef void (*f_gtk_status_icon_set_tooltip_text)(GtkStatusIcon *status_icon, const gchar *title);
|
||||
f_gtk_status_icon_set_tooltip_text ps_gtk_status_icon_set_tooltip_text = 0;
|
||||
|
||||
typedef void (*f_gtk_status_icon_set_visible)(GtkStatusIcon *status_icon, gboolean visible);
|
||||
f_gtk_status_icon_set_visible ps_gtk_status_icon_set_visible = 0;
|
||||
|
||||
typedef gboolean (*f_gtk_status_icon_is_embedded)(GtkStatusIcon *status_icon);
|
||||
f_gtk_status_icon_is_embedded ps_gtk_status_icon_is_embedded = 0;
|
||||
|
||||
typedef gboolean (*f_gtk_status_icon_get_geometry)(GtkStatusIcon *status_icon, GdkScreen **screen, GdkRectangle *area, GtkOrientation *orientation);
|
||||
f_gtk_status_icon_get_geometry ps_gtk_status_icon_get_geometry = 0;
|
||||
|
||||
typedef void (*f_gtk_status_icon_position_menu)(GtkMenu *menu, gint *x, gint *y, gboolean *push_in, gpointer user_data);
|
||||
f_gtk_status_icon_position_menu ps_gtk_status_icon_position_menu = 0;
|
||||
|
||||
typedef void (*f_gtk_menu_popup)(GtkMenu *menu, GtkWidget *parent_menu_shell, GtkWidget *parent_menu_item, GtkMenuPositionFunc func, gpointer data, guint button, guint32 activate_time);
|
||||
f_gtk_menu_popup ps_gtk_menu_popup = 0;
|
||||
|
||||
typedef guint32 (*f_gtk_get_current_event_time)(void);
|
||||
f_gtk_get_current_event_time ps_gtk_get_current_event_time = 0;
|
||||
|
||||
typedef gpointer (*f_g_object_ref_sink)(gpointer object);
|
||||
f_g_object_ref_sink ps_g_object_ref_sink = 0;
|
||||
|
||||
typedef void (*f_g_object_unref)(gpointer object);
|
||||
f_g_object_unref ps_g_object_unref = 0;
|
||||
|
||||
typedef guint (*f_g_idle_add)(GSourceFunc function, gpointer data);
|
||||
f_g_idle_add ps_g_idle_add = 0;
|
||||
|
||||
typedef void (*f_unity_launcher_entry_set_count)(UnityLauncherEntry* self, gint64 value);
|
||||
f_unity_launcher_entry_set_count ps_unity_launcher_entry_set_count = 0;
|
||||
|
||||
typedef void (*f_unity_launcher_entry_set_count_visible)(UnityLauncherEntry* self, gboolean value);
|
||||
f_unity_launcher_entry_set_count_visible ps_unity_launcher_entry_set_count_visible = 0;
|
||||
|
||||
typedef UnityLauncherEntry* (*f_unity_launcher_entry_get_for_desktop_id)(const gchar* desktop_id);
|
||||
f_unity_launcher_entry_get_for_desktop_id ps_unity_launcher_entry_get_for_desktop_id = 0;
|
||||
|
||||
template <typename TFunction>
|
||||
bool loadFunction(QLibrary &lib, const char *name, TFunction &func) {
|
||||
if (!lib.isLoaded()) return false;
|
||||
|
||||
func = (TFunction)lib.resolve(name);
|
||||
if (func) {
|
||||
return true;
|
||||
} else {
|
||||
LOG(("Error: failed to load '%1' function!").arg(name));
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
void _trayIconPopup(GtkStatusIcon *status_icon, guint button, guint32 activate_time, gpointer popup_menu) {
|
||||
ps_gtk_menu_popup(PS_GTK_MENU(popup_menu), NULL, NULL, ps_gtk_status_icon_position_menu, status_icon, button, activate_time);
|
||||
}
|
||||
|
||||
void _trayIconActivate(GtkStatusIcon *status_icon, gpointer popup_menu) {
|
||||
if (App::wnd()->isActiveWindow() && App::wnd()->isVisible()) {
|
||||
ps_gtk_menu_popup(PS_GTK_MENU(popup_menu), NULL, NULL, ps_gtk_status_icon_position_menu, status_icon, 0, ps_gtk_get_current_event_time());
|
||||
} else {
|
||||
App::wnd()->showFromTray();
|
||||
}
|
||||
}
|
||||
|
||||
gboolean _trayIconResized(GtkStatusIcon *status_icon, gint size, gpointer popup_menu) {
|
||||
_trayIconSize = size;
|
||||
if (App::wnd()) App::wnd()->psUpdateCounter();
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
#if Q_BYTE_ORDER == Q_BIG_ENDIAN
|
||||
|
||||
#define QT_RED 3
|
||||
#define QT_GREEN 2
|
||||
#define QT_BLUE 1
|
||||
#define QT_ALPHA 0
|
||||
|
||||
#else
|
||||
|
||||
#define QT_RED 0
|
||||
#define QT_GREEN 1
|
||||
#define QT_BLUE 2
|
||||
#define QT_ALPHA 3
|
||||
|
||||
#endif
|
||||
|
||||
#define GTK_RED 2
|
||||
#define GTK_GREEN 1
|
||||
#define GTK_BLUE 0
|
||||
#define GTK_ALPHA 3
|
||||
|
||||
QImage _trayIconImageGen() {
|
||||
int32 counter = App::histories().unreadBadge(), counterSlice = (counter >= 1000) ? (1000 + (counter % 100)) : counter;
|
||||
bool muted = App::histories().unreadOnlyMuted();
|
||||
if (_trayIconImage.isNull() || _trayIconImage.width() != _trayIconSize || muted != _trayIconMuted || counterSlice != _trayIconCount) {
|
||||
if (_trayIconImageBack.isNull() || _trayIconImageBack.width() != _trayIconSize) {
|
||||
_trayIconImageBack = App::wnd()->iconLarge().scaled(_trayIconSize, _trayIconSize, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
|
||||
_trayIconImageBack = _trayIconImageBack.convertToFormat(QImage::Format_ARGB32);
|
||||
int w = _trayIconImageBack.width(), h = _trayIconImageBack.height(), perline = _trayIconImageBack.bytesPerLine();
|
||||
uchar *bytes = _trayIconImageBack.bits();
|
||||
for (int32 y = 0; y < h; ++y) {
|
||||
for (int32 x = 0; x < w; ++x) {
|
||||
int32 srcoff = y * perline + x * 4;
|
||||
bytes[srcoff + QT_RED ] = qMax(bytes[srcoff + QT_RED ], uchar(224));
|
||||
bytes[srcoff + QT_GREEN] = qMax(bytes[srcoff + QT_GREEN], uchar(165));
|
||||
bytes[srcoff + QT_BLUE ] = qMax(bytes[srcoff + QT_BLUE ], uchar(44));
|
||||
}
|
||||
}
|
||||
}
|
||||
_trayIconImage = _trayIconImageBack;
|
||||
if (counter > 0) {
|
||||
QPainter p(&_trayIconImage);
|
||||
int32 layerSize = -16;
|
||||
if (_trayIconSize >= 48) {
|
||||
layerSize = -32;
|
||||
} else if (_trayIconSize >= 36) {
|
||||
layerSize = -24;
|
||||
} else if (_trayIconSize >= 32) {
|
||||
layerSize = -20;
|
||||
}
|
||||
QImage layer = App::wnd()->iconWithCounter(layerSize, counter, (muted ? st::counterMuteBG : st::counterBG), false);
|
||||
p.drawImage(_trayIconImage.width() - layer.width() - 1, _trayIconImage.height() - layer.height() - 1, layer);
|
||||
}
|
||||
}
|
||||
return _trayIconImage;
|
||||
}
|
||||
|
||||
QString _trayIconImageFile() {
|
||||
int32 counter = App::histories().unreadBadge(), counterSlice = (counter >= 1000) ? (1000 + (counter % 100)) : counter;
|
||||
bool muted = App::histories().unreadOnlyMuted();
|
||||
|
||||
QString name = cWorkingDir() + qsl("tdata/ticons/ico%1_%2_%3.png").arg(muted ? "mute" : "").arg(_trayIconSize).arg(counterSlice);
|
||||
QFileInfo info(name);
|
||||
if (info.exists()) return name;
|
||||
|
||||
QImage img = _trayIconImageGen();
|
||||
if (img.save(name, "PNG")) return name;
|
||||
|
||||
QDir dir(info.absoluteDir());
|
||||
if (!dir.exists()) {
|
||||
dir.mkpath(dir.absolutePath());
|
||||
if (img.save(name, "PNG")) return name;
|
||||
}
|
||||
|
||||
return QString();
|
||||
}
|
||||
|
||||
void loadPixbuf(QImage image) {
|
||||
int w = image.width(), h = image.height(), perline = image.bytesPerLine(), s = image.byteCount();
|
||||
_trayPixbufData.resize(w * h * 4);
|
||||
uchar *result = (uchar*)_trayPixbufData.data(), *bytes = image.bits();
|
||||
for (int32 y = 0; y < h; ++y) {
|
||||
for (int32 x = 0; x < w; ++x) {
|
||||
int32 offset = (y * w + x) * 4, srcoff = y * perline + x * 4;
|
||||
result[offset + GTK_RED ] = bytes[srcoff + QT_RED ];
|
||||
result[offset + GTK_GREEN] = bytes[srcoff + QT_GREEN];
|
||||
result[offset + GTK_BLUE ] = bytes[srcoff + QT_BLUE ];
|
||||
result[offset + GTK_ALPHA] = bytes[srcoff + QT_ALPHA];
|
||||
}
|
||||
}
|
||||
|
||||
if (_trayPixbuf) ps_g_object_unref(_trayPixbuf);
|
||||
_trayPixbuf = ps_gdk_pixbuf_new_from_data(result, GDK_COLORSPACE_RGB, true, 8, w, h, w * 4, 0, 0);
|
||||
}
|
||||
|
||||
void _trayMenuCallback(GtkMenu *menu, gpointer data) {
|
||||
for (int32 i = 0, l = _trayItems.size(); i < l; ++i) {
|
||||
if ((void*)_trayItems.at(i).first == (void*)menu) {
|
||||
QMetaObject::invokeMethod(_trayItems.at(i).second, "triggered");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static gboolean _trayIconCheck(gpointer/* pIn*/) {
|
||||
if (useStatusIcon && !trayIconChecked) {
|
||||
if (ps_gtk_status_icon_is_embedded(_trayIcon)) {
|
||||
trayIconChecked = true;
|
||||
cSetSupportTray(true);
|
||||
if (App::wnd()) {
|
||||
App::wnd()->psUpdateWorkmode();
|
||||
App::wnd()->psUpdateCounter();
|
||||
App::wnd()->updateTrayMenu();
|
||||
}
|
||||
}
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
bool loadLibrary(QLibrary &lib, const char *name, int version) {
|
||||
DEBUG_LOG(("Loading '%1' with version %2...").arg(QLatin1String(name)).arg(version));
|
||||
lib.setFileNameAndVersion(QLatin1String(name), version);
|
||||
if (lib.load()) {
|
||||
DEBUG_LOG(("Loaded '%1' with version %2!").arg(QLatin1String(name)).arg(version));
|
||||
return true;
|
||||
}
|
||||
lib.setFileNameAndVersion(QLatin1String(name), QString());
|
||||
if (lib.load()) {
|
||||
DEBUG_LOG(("Loaded '%1' without version!").arg(QLatin1String(name)));
|
||||
return true;
|
||||
}
|
||||
LOG(("Could not load '%1' with version %2 :(").arg(QLatin1String(name)).arg(version));
|
||||
return false;
|
||||
}
|
||||
|
||||
void setupGtkBase(QLibrary &lib_gtk) {
|
||||
if (!loadFunction(lib_gtk, "gtk_init_check", ps_gtk_init_check)) return;
|
||||
if (!loadFunction(lib_gtk, "gtk_menu_new", ps_gtk_menu_new)) return;
|
||||
if (!loadFunction(lib_gtk, "gtk_menu_get_type", ps_gtk_menu_get_type)) return;
|
||||
|
||||
if (!loadFunction(lib_gtk, "gtk_menu_item_new_with_label", ps_gtk_menu_item_new_with_label)) return;
|
||||
if (!loadFunction(lib_gtk, "gtk_menu_item_set_label", ps_gtk_menu_item_set_label)) return;
|
||||
if (!loadFunction(lib_gtk, "gtk_menu_shell_append", ps_gtk_menu_shell_append)) return;
|
||||
if (!loadFunction(lib_gtk, "gtk_menu_shell_get_type", ps_gtk_menu_shell_get_type)) return;
|
||||
if (!loadFunction(lib_gtk, "gtk_widget_show", ps_gtk_widget_show)) return;
|
||||
if (!loadFunction(lib_gtk, "gtk_widget_get_toplevel", ps_gtk_widget_get_toplevel)) return;
|
||||
if (!loadFunction(lib_gtk, "gtk_widget_get_visible", ps_gtk_widget_get_visible)) return;
|
||||
if (!loadFunction(lib_gtk, "gtk_widget_set_sensitive", ps_gtk_widget_set_sensitive)) return;
|
||||
|
||||
if (!loadFunction(lib_gtk, "g_type_check_instance_cast", ps_g_type_check_instance_cast)) return;
|
||||
if (!loadFunction(lib_gtk, "g_signal_connect_data", ps_g_signal_connect_data)) return;
|
||||
|
||||
if (!loadFunction(lib_gtk, "g_object_ref_sink", ps_g_object_ref_sink)) return;
|
||||
if (!loadFunction(lib_gtk, "g_object_unref", ps_g_object_unref)) return;
|
||||
|
||||
DEBUG_LOG(("Library gtk functions loaded!"));
|
||||
if (ps_gtk_init_check(0, 0)) {
|
||||
DEBUG_LOG(("Checked gtk with gtk_init_check!"));
|
||||
useGtkBase = true;
|
||||
} else {
|
||||
DEBUG_LOG(("Failed to gtk_init_check(0, 0)!"));
|
||||
}
|
||||
}
|
||||
|
||||
void setupAppIndicator(QLibrary &lib_indicator) {
|
||||
if (!loadFunction(lib_indicator, "app_indicator_new", ps_app_indicator_new)) return;
|
||||
if (!loadFunction(lib_indicator, "app_indicator_set_status", ps_app_indicator_set_status)) return;
|
||||
if (!loadFunction(lib_indicator, "app_indicator_set_menu", ps_app_indicator_set_menu)) return;
|
||||
if (!loadFunction(lib_indicator, "app_indicator_set_icon_full", ps_app_indicator_set_icon_full)) return;
|
||||
useAppIndicator = true;
|
||||
DEBUG_LOG(("Library appindicator functions loaded!"));
|
||||
}
|
||||
|
||||
void setupGtk() {
|
||||
QLibrary lib_gtk, lib_indicator;
|
||||
if (!noQtTrayIcon && !tryAppIndicator) {
|
||||
if (!noTryUnity) {
|
||||
if (loadLibrary(lib_gtk, "gtk-3", 0)) {
|
||||
setupGtkBase(lib_gtk);
|
||||
}
|
||||
if (!useGtkBase) {
|
||||
if (loadLibrary(lib_gtk, "gtk-x11-2.0", 0)) {
|
||||
setupGtkBase(lib_gtk);
|
||||
}
|
||||
}
|
||||
if (!useGtkBase) {
|
||||
noTryUnity = true;
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if (loadLibrary(lib_indicator, "appindicator3", 1)) {
|
||||
if (loadLibrary(lib_gtk, "gtk-3", 0)) {
|
||||
setupGtkBase(lib_gtk);
|
||||
setupAppIndicator(lib_indicator);
|
||||
}
|
||||
}
|
||||
if (!useGtkBase || !useAppIndicator) {
|
||||
if (loadLibrary(lib_indicator, "appindicator", 1)) {
|
||||
if (loadLibrary(lib_gtk, "gtk-x11-2.0", 0)) {
|
||||
useGtkBase = useAppIndicator = false;
|
||||
setupGtkBase(lib_gtk);
|
||||
setupAppIndicator(lib_indicator);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (tryAppIndicator) {
|
||||
if (useGtkBase && useAppIndicator) {
|
||||
noQtTrayIcon = true;
|
||||
cSetSupportTray(false);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if (!useGtkBase && lib_gtk.isLoaded()) {
|
||||
LOG(("Could not load appindicator, trying to load gtk..."));
|
||||
setupGtkBase(lib_gtk);
|
||||
}
|
||||
if (!useGtkBase) {
|
||||
useAppIndicator = false;
|
||||
LOG(("Could not load gtk-x11-2.0!"));
|
||||
return;
|
||||
}
|
||||
|
||||
if (!loadFunction(lib_gtk, "gdk_init_check", ps_gdk_init_check)) return;
|
||||
if (!loadFunction(lib_gtk, "gdk_pixbuf_new_from_data", ps_gdk_pixbuf_new_from_data)) return;
|
||||
if (!loadFunction(lib_gtk, "gtk_status_icon_new_from_pixbuf", ps_gtk_status_icon_new_from_pixbuf)) return;
|
||||
if (!loadFunction(lib_gtk, "gtk_status_icon_set_from_pixbuf", ps_gtk_status_icon_set_from_pixbuf)) return;
|
||||
if (!loadFunction(lib_gtk, "gtk_status_icon_set_title", ps_gtk_status_icon_set_title)) return;
|
||||
if (!loadFunction(lib_gtk, "gtk_status_icon_set_tooltip_text", ps_gtk_status_icon_set_tooltip_text)) return;
|
||||
if (!loadFunction(lib_gtk, "gtk_status_icon_set_visible", ps_gtk_status_icon_set_visible)) return;
|
||||
if (!loadFunction(lib_gtk, "gtk_status_icon_is_embedded", ps_gtk_status_icon_is_embedded)) return;
|
||||
if (!loadFunction(lib_gtk, "gtk_status_icon_get_geometry", ps_gtk_status_icon_get_geometry)) return;
|
||||
if (!loadFunction(lib_gtk, "gtk_status_icon_position_menu", ps_gtk_status_icon_position_menu)) return;
|
||||
if (!loadFunction(lib_gtk, "gtk_menu_popup", ps_gtk_menu_popup)) return;
|
||||
if (!loadFunction(lib_gtk, "gtk_get_current_event_time", ps_gtk_get_current_event_time)) return;
|
||||
if (!loadFunction(lib_gtk, "g_idle_add", ps_g_idle_add)) return;
|
||||
useStatusIcon = true;
|
||||
DEBUG_LOG(("Status icon api loaded!"));
|
||||
}
|
||||
|
||||
void setupUnity() {
|
||||
if (noTryUnity) return;
|
||||
|
||||
QLibrary lib_unity(qstr("unity"), 9, 0);
|
||||
if (!loadLibrary(lib_unity, "unity", 9)) return;
|
||||
|
||||
if (!loadFunction(lib_unity, "unity_launcher_entry_get_for_desktop_id", ps_unity_launcher_entry_get_for_desktop_id)) return;
|
||||
if (!loadFunction(lib_unity, "unity_launcher_entry_set_count", ps_unity_launcher_entry_set_count)) return;
|
||||
if (!loadFunction(lib_unity, "unity_launcher_entry_set_count_visible", ps_unity_launcher_entry_set_count_visible)) return;
|
||||
useUnityCount = true;
|
||||
DEBUG_LOG(("Unity count api loaded!"));
|
||||
}
|
||||
|
||||
class _PsEventFilter : public QAbstractNativeEventFilter {
|
||||
public:
|
||||
_PsEventFilter() {
|
||||
@@ -495,8 +73,6 @@ namespace {
|
||||
}
|
||||
};
|
||||
_PsEventFilter *_psEventFilter = 0;
|
||||
|
||||
UnityLauncherEntry *_psUnityLauncherEntry = 0;
|
||||
};
|
||||
|
||||
namespace {
|
||||
@@ -521,18 +97,6 @@ void psBringToBack(QWidget *w) {
|
||||
w->hide();
|
||||
}
|
||||
|
||||
void PsMainWindow::psActivateNotify(NotifyWindow *w) {
|
||||
}
|
||||
|
||||
void PsMainWindow::psClearNotifies(PeerId peerId) {
|
||||
}
|
||||
|
||||
void PsMainWindow::psNotifyShown(NotifyWindow *w) {
|
||||
}
|
||||
|
||||
void PsMainWindow::psPlatformNotify(HistoryItem *item, int32 fwdCount) {
|
||||
}
|
||||
|
||||
QAbstractNativeEventFilter *psNativeEventFilter() {
|
||||
delete _psEventFilter;
|
||||
_psEventFilter = new _PsEventFilter();
|
||||
@@ -842,16 +406,8 @@ void finish() {
|
||||
namespace ThirdParty {
|
||||
|
||||
void start() {
|
||||
QString cdesktop = QString(getenv("XDG_CURRENT_DESKTOP")).toLower();
|
||||
noQtTrayIcon = (cdesktop == qstr("pantheon")) || (cdesktop == qstr("gnome"));
|
||||
tryAppIndicator = (cdesktop == qstr("xfce"));
|
||||
noTryUnity = (cdesktop != qstr("unity"));
|
||||
|
||||
if (noQtTrayIcon) cSetSupportTray(false);
|
||||
|
||||
DEBUG_LOG(("Loading libraries"));
|
||||
setupGtk();
|
||||
setupUnity();
|
||||
Libs::start();
|
||||
MainWindow::LibsLoaded();
|
||||
}
|
||||
|
||||
void finish() {
|
||||
|
Reference in New Issue
Block a user