184 lines
		
	
	
	
		
			8.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			184 lines
		
	
	
	
		
			8.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /*
 | |
| This file is part of Telegram Desktop,
 | |
| the official desktop version of Telegram messaging app, see https://telegram.org
 | |
| 
 | |
| Telegram Desktop 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 3 of the License, or
 | |
| (at your option) any later version.
 | |
| 
 | |
| It 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.
 | |
| 
 | |
| In addition, as a special exception, the copyright holders give permission
 | |
| to link the code of portions of this program with the OpenSSL library.
 | |
| 
 | |
| Full license: https://github.com/telegramdesktop/tdesktop/blob/master/LICENSE
 | |
| Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org
 | |
| */
 | |
| #include "stdafx.h"
 | |
| #include "platform/linux/linux_libs.h"
 | |
| 
 | |
| namespace Platform {
 | |
| namespace Libs {
 | |
| namespace {
 | |
| 
 | |
| 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;
 | |
| }
 | |
| 
 | |
| bool setupGtkBase(QLibrary &lib_gtk) {
 | |
|     if (!load(lib_gtk, "gtk_init_check", gtk_init_check)) return false;
 | |
|     if (!load(lib_gtk, "gtk_menu_new", gtk_menu_new)) return false;
 | |
|     if (!load(lib_gtk, "gtk_menu_get_type", gtk_menu_get_type)) return false;
 | |
| 
 | |
|     if (!load(lib_gtk, "gtk_menu_item_new_with_label", gtk_menu_item_new_with_label)) return false;
 | |
|     if (!load(lib_gtk, "gtk_menu_item_set_label", gtk_menu_item_set_label)) return false;
 | |
|     if (!load(lib_gtk, "gtk_menu_shell_append", gtk_menu_shell_append)) return false;
 | |
|     if (!load(lib_gtk, "gtk_menu_shell_get_type", gtk_menu_shell_get_type)) return false;
 | |
|     if (!load(lib_gtk, "gtk_widget_show", gtk_widget_show)) return false;
 | |
|     if (!load(lib_gtk, "gtk_widget_get_toplevel", gtk_widget_get_toplevel)) return false;
 | |
|     if (!load(lib_gtk, "gtk_widget_get_visible", gtk_widget_get_visible)) return false;
 | |
|     if (!load(lib_gtk, "gtk_widget_set_sensitive", gtk_widget_set_sensitive)) return false;
 | |
| 
 | |
|     if (!load(lib_gtk, "g_type_check_instance_cast", g_type_check_instance_cast)) return false;
 | |
|     if (!load(lib_gtk, "g_signal_connect_data", g_signal_connect_data)) return false;
 | |
| 
 | |
|     if (!load(lib_gtk, "g_object_ref_sink", g_object_ref_sink)) return false;
 | |
|     if (!load(lib_gtk, "g_object_unref", g_object_unref)) return false;
 | |
| 
 | |
|     DEBUG_LOG(("Library gtk functions loaded!"));
 | |
|     if (!gtk_init_check(0, 0)) {
 | |
| 		gtk_init_check = nullptr;
 | |
| 		DEBUG_LOG(("Failed to gtk_init_check(0, 0)!"));
 | |
| 		return false;
 | |
| 	}
 | |
| 
 | |
| 	DEBUG_LOG(("Checked gtk with gtk_init_check!"));
 | |
| 	return true;
 | |
| }
 | |
| 
 | |
| bool setupAppIndicator(QLibrary &lib_indicator) {
 | |
|     if (!load(lib_indicator, "app_indicator_new", app_indicator_new)) return false;
 | |
|     if (!load(lib_indicator, "app_indicator_set_status", app_indicator_set_status)) return false;
 | |
|     if (!load(lib_indicator, "app_indicator_set_menu", app_indicator_set_menu)) return false;
 | |
|     if (!load(lib_indicator, "app_indicator_set_icon_full", app_indicator_set_icon_full)) return false;
 | |
| 
 | |
|     DEBUG_LOG(("Library appindicator functions loaded!"));
 | |
| 	return true;
 | |
| }
 | |
| 
 | |
| } // namespace
 | |
| 
 | |
| f_gtk_init_check gtk_init_check = nullptr;
 | |
| f_gtk_menu_new gtk_menu_new = nullptr;
 | |
| f_gtk_menu_get_type gtk_menu_get_type = nullptr;
 | |
| f_gtk_menu_item_new_with_label gtk_menu_item_new_with_label = nullptr;
 | |
| f_gtk_menu_item_set_label gtk_menu_item_set_label = nullptr;
 | |
| f_gtk_menu_shell_append gtk_menu_shell_append = nullptr;
 | |
| f_gtk_menu_shell_get_type gtk_menu_shell_get_type = nullptr;
 | |
| f_gtk_widget_show gtk_widget_show = nullptr;
 | |
| f_gtk_widget_get_toplevel gtk_widget_get_toplevel = nullptr;
 | |
| f_gtk_widget_get_visible gtk_widget_get_visible = nullptr;
 | |
| f_gtk_widget_set_sensitive gtk_widget_set_sensitive = nullptr;
 | |
| f_g_type_check_instance_cast g_type_check_instance_cast = nullptr;
 | |
| f_g_signal_connect_data g_signal_connect_data = nullptr;
 | |
| f_app_indicator_new app_indicator_new = nullptr;
 | |
| f_app_indicator_set_status app_indicator_set_status = nullptr;
 | |
| f_app_indicator_set_menu app_indicator_set_menu = nullptr;
 | |
| f_app_indicator_set_icon_full app_indicator_set_icon_full = nullptr;
 | |
| f_gdk_init_check gdk_init_check = nullptr;
 | |
| f_gdk_pixbuf_new_from_data gdk_pixbuf_new_from_data = nullptr;
 | |
| f_gtk_status_icon_new_from_pixbuf gtk_status_icon_new_from_pixbuf = nullptr;
 | |
| f_gtk_status_icon_set_from_pixbuf gtk_status_icon_set_from_pixbuf = nullptr;
 | |
| f_gtk_status_icon_set_title gtk_status_icon_set_title = nullptr;
 | |
| f_gtk_status_icon_set_tooltip_text gtk_status_icon_set_tooltip_text = nullptr;
 | |
| f_gtk_status_icon_set_visible gtk_status_icon_set_visible = nullptr;
 | |
| f_gtk_status_icon_is_embedded gtk_status_icon_is_embedded = nullptr;
 | |
| f_gtk_status_icon_get_geometry gtk_status_icon_get_geometry = nullptr;
 | |
| f_gtk_status_icon_position_menu gtk_status_icon_position_menu = nullptr;
 | |
| f_gtk_menu_popup gtk_menu_popup = nullptr;
 | |
| f_gtk_get_current_event_time gtk_get_current_event_time = nullptr;
 | |
| f_g_object_ref_sink g_object_ref_sink = nullptr;
 | |
| f_g_object_unref g_object_unref = nullptr;
 | |
| f_g_idle_add g_idle_add = nullptr;
 | |
| f_unity_launcher_entry_set_count unity_launcher_entry_set_count = nullptr;
 | |
| f_unity_launcher_entry_set_count_visible unity_launcher_entry_set_count_visible = nullptr;
 | |
| f_unity_launcher_entry_get_for_desktop_id unity_launcher_entry_get_for_desktop_id = nullptr;
 | |
| 
 | |
| void start() {
 | |
| 	DEBUG_LOG(("Loading libraries"));
 | |
| 
 | |
| 	bool gtkLoaded = false;
 | |
| 	bool indicatorLoaded = false;
 | |
| 	QLibrary lib_gtk, lib_indicator;
 | |
| 	if (loadLibrary(lib_indicator, "appindicator3", 1)) {
 | |
| 		if (loadLibrary(lib_gtk, "gtk-3", 0)) {
 | |
| 			gtkLoaded = setupGtkBase(lib_gtk);
 | |
| 			indicatorLoaded = setupAppIndicator(lib_indicator);
 | |
| 		}
 | |
| 	}
 | |
| 	if (!gtkLoaded || !indicatorLoaded) {
 | |
| 		if (loadLibrary(lib_indicator, "appindicator", 1)) {
 | |
| 			if (loadLibrary(lib_gtk, "gtk-x11-2.0", 0)) {
 | |
| 				gtkLoaded = indicatorLoaded = false;
 | |
| 				gtkLoaded = setupGtkBase(lib_gtk);
 | |
| 				indicatorLoaded = setupAppIndicator(lib_indicator);
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	// If no appindicator, try at least load gtk.
 | |
| 	if (!gtkLoaded && !indicatorLoaded) {
 | |
| 		if (loadLibrary(lib_gtk, "gtk-3", 0)) {
 | |
| 			gtkLoaded = setupGtkBase(lib_gtk);
 | |
| 		}
 | |
| 		if (!gtkLoaded && loadLibrary(lib_gtk, "gtk-x11-2.0", 0)) {
 | |
| 			gtkLoaded = setupGtkBase(lib_gtk);
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	if (gtkLoaded) {
 | |
| 		load(lib_gtk, "gdk_init_check", gdk_init_check);
 | |
| 		load(lib_gtk, "gdk_pixbuf_new_from_data", gdk_pixbuf_new_from_data);
 | |
| 		load(lib_gtk, "gtk_status_icon_new_from_pixbuf", gtk_status_icon_new_from_pixbuf);
 | |
| 		load(lib_gtk, "gtk_status_icon_set_from_pixbuf", gtk_status_icon_set_from_pixbuf);
 | |
| 		load(lib_gtk, "gtk_status_icon_set_title", gtk_status_icon_set_title);
 | |
| 		load(lib_gtk, "gtk_status_icon_set_tooltip_text", gtk_status_icon_set_tooltip_text);
 | |
| 		load(lib_gtk, "gtk_status_icon_set_visible", gtk_status_icon_set_visible);
 | |
| 		load(lib_gtk, "gtk_status_icon_is_embedded", gtk_status_icon_is_embedded);
 | |
| 		load(lib_gtk, "gtk_status_icon_get_geometry", gtk_status_icon_get_geometry);
 | |
| 		load(lib_gtk, "gtk_status_icon_position_menu", gtk_status_icon_position_menu);
 | |
| 		load(lib_gtk, "gtk_menu_popup", gtk_menu_popup);
 | |
| 		load(lib_gtk, "gtk_get_current_event_time", gtk_get_current_event_time);
 | |
| 		load(lib_gtk, "g_idle_add", g_idle_add);
 | |
| 	} else {
 | |
| 		LOG(("Could not load gtk-x11-2.0!"));
 | |
| 	}
 | |
| 
 | |
| 	if (QString(getenv("XDG_CURRENT_DESKTOP")).toLower() == qstr("unity")) {
 | |
| 		QLibrary lib_unity(qstr("unity"), 9, 0);
 | |
| 		loadLibrary(lib_unity, "unity", 9);
 | |
| 
 | |
| 		load(lib_unity, "unity_launcher_entry_get_for_desktop_id", unity_launcher_entry_get_for_desktop_id);
 | |
| 		load(lib_unity, "unity_launcher_entry_set_count", unity_launcher_entry_set_count);
 | |
| 		load(lib_unity, "unity_launcher_entry_set_count_visible", unity_launcher_entry_set_count_visible);
 | |
| 	}
 | |
| }
 | |
| 
 | |
| } // namespace Libs
 | |
| } // namespace Platform
 | 
