Merge branch 'dev'
|
@ -8,6 +8,7 @@ env:
|
|||
- BUILD_VERSION="disable_register_custom_scheme"
|
||||
- BUILD_VERSION="disable_crash_reports"
|
||||
- BUILD_VERSION="disable_network_proxy"
|
||||
- BUILD_VERSION="disable_desktop_file_generation"
|
||||
|
||||
arch:
|
||||
packages:
|
||||
|
|
|
@ -79,6 +79,10 @@ prepare() {
|
|||
options+="\nDEFINES += TDESKTOP_DISABLE_NETWORK_PROXY"
|
||||
fi
|
||||
|
||||
if [[ $BUILD_VERSION == *"disable_desktop_file_generation"* ]]; then
|
||||
options+="\nDEFINES += TDESKTOP_DISABLE_DESKTOP_FILE_GENERATION"
|
||||
fi
|
||||
|
||||
options+='\nINCLUDEPATH += "/usr/lib/glib-2.0/include"'
|
||||
options+='\nINCLUDEPATH += "/usr/lib/gtk-2.0/include"'
|
||||
options+='\nINCLUDEPATH += "/usr/include/opus"'
|
||||
|
|
|
@ -22,11 +22,11 @@
|
|||
|
||||
/* Begin PBXBuildFile section */
|
||||
07D7954A1B5544B200DE9598 /* qtpcre in Link Binary With Libraries */ = {isa = PBXBuildFile; fileRef = 07D795491B5544B200DE9598 /* qtpcre */; };
|
||||
0785004D1CCA847400168DBB /* libqtfreetype.a in Link Binary With Libraries */ = {isa = PBXBuildFile; fileRef = 0785004C1CCA847400168DBB /* libqtfreetype.a */; };
|
||||
1A681B886F50EE30FBE62B4B /* Qt5PrintSupport in Link Binary With Libraries */ = {isa = PBXBuildFile; fileRef = DBF506D10449BFABD45B82DA /* Qt5PrintSupport */; };
|
||||
1BB705CDB741E2B7450201A5 /* Cocoa.framework in Link Binary With Libraries */ = {isa = PBXBuildFile; fileRef = AEA456A2F75ED9F5CDA7BCBE /* Cocoa.framework */; };
|
||||
328FD74542F6E2C873EE4D4B /* ApplicationServices.framework in Link Binary With Libraries */ = {isa = PBXBuildFile; fileRef = DFD7912080BC557230093752 /* ApplicationServices.framework */; };
|
||||
496FD9CEEB508016AFB9F928 /* qico in Link Binary With Libraries */ = {isa = PBXBuildFile; fileRef = 8F500B5166907B6D9A7C3E3D /* qico */; };
|
||||
59789101736112A570B8EFE6 /* qjp2 in Link Binary With Libraries */ = {isa = PBXBuildFile; fileRef = F0681BC551FC8A2B132FC646 /* qjp2 */; };
|
||||
668DDDA0C55405E7FCFD6CA5 /* CoreServices.framework in Link Binary With Libraries */ = {isa = PBXBuildFile; fileRef = 9742F24EE18EA44D52824F1E /* CoreServices.framework */; };
|
||||
7CA5405B8503BFFC60932D2B /* qicns in Link Binary With Libraries */ = {isa = PBXBuildFile; fileRef = 31120EDB269DFF13E1D49847 /* qicns */; };
|
||||
7F76437B577F737145996DC3 /* qtga in Link Binary With Libraries */ = {isa = PBXBuildFile; fileRef = DCEFD9167C239650120B0145 /* qtga */; };
|
||||
|
@ -49,7 +49,6 @@
|
|||
F4D3747C3A03B25EDC9057BB /* qwebp in Link Binary With Libraries */ = {isa = PBXBuildFile; fileRef = ADC6308023253CEA51F86E21 /* qwebp */; };
|
||||
F8B465CE34D8DF87AAE95913 /* CoreFoundation.framework in Link Binary With Libraries */ = {isa = PBXBuildFile; fileRef = 4D765E1B1EA6C757220C63E7 /* CoreFoundation.framework */; };
|
||||
F8ED42CF8679BF83227DAFC4 /* Carbon.framework in Link Binary With Libraries */ = {isa = PBXBuildFile; fileRef = 9DFF62A901D70814B8A323D4 /* Carbon.framework */; };
|
||||
FBD56E2AC34F76BFFDB68619 /* qmng in Link Binary With Libraries */ = {isa = PBXBuildFile; fileRef = 83D37373949868693FB7816D /* qmng */; };
|
||||
/* End PBXBuildFile section */
|
||||
|
||||
/* Begin PBXContainerItemProxy section */
|
||||
|
@ -63,161 +62,39 @@
|
|||
/* End PBXContainerItemProxy section */
|
||||
|
||||
/* Begin PBXFileReference section */
|
||||
04391BE7A8B9D811E255100A /* Qt5Gui */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = Qt5Gui; path = "/usr/local/Qt-5.5.1/lib/libQt5Gui$(QT_LIBRARY_SUFFIX).a"; sourceTree = "<absolute>"; };
|
||||
060A694B42A4555240009936 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qtga.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qtga.pri"; sourceTree = "<absolute>"; };
|
||||
075EB50EB07CF69FD62FB8DF /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_sql_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_sql_private.pri"; sourceTree = "<absolute>"; };
|
||||
07D795491B5544B200DE9598 /* qtpcre */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = qtpcre; path = "usr/local/Qt-5.5.1/lib/libqtpcre$(QT_LIBRARY_SUFFIX).a"; sourceTree = "<group>"; };
|
||||
0ABCEA8D0DD45589040B0AF2 /* /usr/local/Qt-5.5.1/mkspecs/common/unix.conf */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/common/unix.conf"; sourceTree = "<absolute>"; };
|
||||
111BBEE3D1432C3B517FD539 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qdds.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qdds.pri"; sourceTree = "<absolute>"; };
|
||||
16DD53E17C65AC8B450CC6C3 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_quick.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_quick.pri"; sourceTree = "<absolute>"; };
|
||||
04391BE7A8B9D811E255100A /* Qt5Gui */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = Qt5Gui; path = "$(QT_PATH)/lib/libQt5Gui$(QT_LIBRARY_SUFFIX).a"; sourceTree = "<absolute>"; };
|
||||
07D795491B5544B200DE9598 /* qtpcre */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = qtpcre; path = "$(QT_PATH)/lib/libqtpcre$(QT_LIBRARY_SUFFIX).a"; sourceTree = "<group>"; };
|
||||
0785004C1CCA847400168DBB /* libqtfreetype.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libqtfreetype.a; path = "$(QT_PATH)/lib/libqtfreetype$(QT_LIBRARY_SUFFIX).a"; sourceTree = "<group>"; };
|
||||
1F47C130E1F45B4A5A91DB5E /* genemoji.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = genemoji.cpp; path = SourceFiles/_other/genemoji.cpp; sourceTree = "<absolute>"; };
|
||||
1FAE75C970AA73F2DEDDB508 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qavfcamera.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qavfcamera.pri"; sourceTree = "<absolute>"; };
|
||||
23BC8B0FC3279421D41CA268 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_gui.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_gui.pri"; sourceTree = "<absolute>"; };
|
||||
2440CD1D4CEF80443BCA1B8B /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qgenericbearer.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qgenericbearer.pri"; sourceTree = "<absolute>"; };
|
||||
247D8DF3B1DDB665B80BBA25 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qtaccessiblequick.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qtaccessiblequick.pri"; sourceTree = "<absolute>"; };
|
||||
24B6929EE3952310F2DAECB1 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qtaudio_coreaudio.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qtaudio_coreaudio.pri"; sourceTree = "<absolute>"; };
|
||||
28BD0D10214709D95B161E24 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_multimediawidgets.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_multimediawidgets.pri"; sourceTree = "<absolute>"; };
|
||||
293C8DEEE270847AC20E70F9 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_network.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_network.pri"; sourceTree = "<absolute>"; };
|
||||
2E48BB382B895A5ACD79AF9F /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_bluetooth_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_bluetooth_private.pri"; sourceTree = "<absolute>"; };
|
||||
2E6D9B1D2743D24E31B0B284 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_xmlpatterns.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_xmlpatterns.pri"; sourceTree = "<absolute>"; };
|
||||
311004331A04F3D69C98643C /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_serialport_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_serialport_private.pri"; sourceTree = "<absolute>"; };
|
||||
31120EDB269DFF13E1D49847 /* qicns */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = qicns; path = "/usr/local/Qt-5.5.1/plugins/imageformats/libqicns$(QT_LIBRARY_SUFFIX).a"; sourceTree = "<absolute>"; };
|
||||
33F165B1DB8CBF182C56FAB5 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_macextras_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_macextras_private.pri"; sourceTree = "<absolute>"; };
|
||||
346287C9E754E7C458153F03 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qwbmp.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qwbmp.pri"; sourceTree = "<absolute>"; };
|
||||
360D4B3ED25D126430DE27D4 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_enginio.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_enginio.pri"; sourceTree = "<absolute>"; };
|
||||
3685604BDB64DD6E92169B73 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qdeclarativeview.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qdeclarativeview.pri"; sourceTree = "<absolute>"; };
|
||||
382E89A91A34F7898C25FD0D /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_network_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_network_private.pri"; sourceTree = "<absolute>"; };
|
||||
31120EDB269DFF13E1D49847 /* qicns */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = qicns; path = "$(QT_PATH)/plugins/imageformats/libqicns$(QT_LIBRARY_SUFFIX).a"; sourceTree = "<absolute>"; };
|
||||
3AC2626B26B65AA88F06BFB5 /* memain.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = memain.cpp; path = SourceFiles/_other/memain.cpp; sourceTree = "<absolute>"; };
|
||||
3F08D430CEC8D2117735CCB4 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qmldbg_tcp_qtdeclarative.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qmldbg_tcp_qtdeclarative.pri"; sourceTree = "<absolute>"; };
|
||||
45B95DB3B70B47A910FC847B /* /usr/local/Qt-5.5.1/mkspecs/common/gcc-base.conf */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/common/gcc-base.conf"; sourceTree = "<absolute>"; };
|
||||
45DB132B756499D4DF38430E /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qjp2.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qjp2.pri"; sourceTree = "<absolute>"; };
|
||||
4689C06178B60B84E7F3A3B7 /* Qt5Widgets */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = Qt5Widgets; path = "/usr/local/Qt-5.5.1/lib/libQt5Widgets$(QT_LIBRARY_SUFFIX).a"; sourceTree = "<absolute>"; };
|
||||
4C6C71914B1926119120DACD /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_enginio_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_enginio_private.pri"; sourceTree = "<absolute>"; };
|
||||
4689C06178B60B84E7F3A3B7 /* Qt5Widgets */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = Qt5Widgets; path = "$(QT_PATH)/lib/libQt5Widgets$(QT_LIBRARY_SUFFIX).a"; sourceTree = "<absolute>"; };
|
||||
4D765E1B1EA6C757220C63E7 /* CoreFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreFoundation.framework; path = /System/Library/Frameworks/CoreFoundation.framework; sourceTree = "<absolute>"; };
|
||||
4FB6657DA22BC68B819B64B3 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_qmldevtools_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_qmldevtools_private.pri"; sourceTree = "<absolute>"; };
|
||||
5597304BEC94BFB9EAAEBC4B /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_openglextensions_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_openglextensions_private.pri"; sourceTree = "<absolute>"; };
|
||||
58308B26DE991A86E8589883 /* genemoji.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = genemoji.h; path = SourceFiles/_other/genemoji.h; sourceTree = "<absolute>"; };
|
||||
5A80A1907B6CFFB524C1E57D /* Qt5Core */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = Qt5Core; path = "/usr/local/Qt-5.5.1/lib/libQt5Core$(QT_LIBRARY_SUFFIX).a"; sourceTree = "<absolute>"; };
|
||||
5B22E9E4EE9AAE42ABC24AB3 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_qtmultimediaquicktools_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_qtmultimediaquicktools_private.pri"; sourceTree = "<absolute>"; };
|
||||
5CEA7A2DB2136425A88D1254 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_opengl.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_opengl.pri"; sourceTree = "<absolute>"; };
|
||||
5F781C7FD8422D359EA1D2FE /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_core_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_core_private.pri"; sourceTree = "<absolute>"; };
|
||||
6102C69805B6398AF6FA5BEB /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_qml_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_qml_private.pri"; sourceTree = "<absolute>"; };
|
||||
63E722139886C87BC82DBDF5 /* /usr/local/Qt-5.5.1/mkspecs/macx-clang/qmake.conf */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/macx-clang/qmake.conf"; sourceTree = "<absolute>"; };
|
||||
669FB007C4A3D58424D85EC8 /* /usr/local/Qt-5.5.1/mkspecs/common/shell-unix.conf */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/common/shell-unix.conf"; sourceTree = "<absolute>"; };
|
||||
69347C39E4D922E94D0860BF /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_designercomponents_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_designercomponents_private.pri"; sourceTree = "<absolute>"; };
|
||||
6C08BFC27C4C303A3A5181DB /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_printsupport.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_printsupport.pri"; sourceTree = "<absolute>"; };
|
||||
6E67D23B15FC4B628DB2E0B2 /* /usr/local/Qt-5.5.1/mkspecs/qdevice.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/qdevice.pri"; sourceTree = "<absolute>"; };
|
||||
74C1C232DFAA71028A0412CA /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qtmultimedia_m3u.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qtmultimedia_m3u.pri"; sourceTree = "<absolute>"; };
|
||||
77FF486B1F9BCD55A8A3F35D /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_concurrent.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_concurrent.pri"; sourceTree = "<absolute>"; };
|
||||
7A94C7168B3FCBE5F04A013B /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_declarative.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_declarative.pri"; sourceTree = "<absolute>"; };
|
||||
7C2F42B222EE88E26A6FED62 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_designer_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_designer_private.pri"; sourceTree = "<absolute>"; };
|
||||
7D28E9003CE64D8A7F2E292E /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_concurrent_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_concurrent_private.pri"; sourceTree = "<absolute>"; };
|
||||
7DE30A90667C03C4F91A2A91 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_sql.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_sql.pri"; sourceTree = "<absolute>"; };
|
||||
7ECCC1F9442988B4F2707CC1 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_core.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_core.pri"; sourceTree = "<absolute>"; };
|
||||
817A0F5A41B553A6DE67FDEB /* /usr/local/Qt-5.5.1/mkspecs/common/macx.conf */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/common/macx.conf"; sourceTree = "<absolute>"; };
|
||||
82E7DCFD95559532D8FC6CDD /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_quickparticles_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_quickparticles_private.pri"; sourceTree = "<absolute>"; };
|
||||
83D37373949868693FB7816D /* qmng */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = qmng; path = "/usr/local/Qt-5.5.1/plugins/imageformats/libqmng$(QT_LIBRARY_SUFFIX).a"; sourceTree = "<absolute>"; };
|
||||
85061B1DA49D125991117950 /* /usr/local/Qt-5.5.1/mkspecs/macx-xcode/qmake.conf */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/macx-xcode/qmake.conf"; sourceTree = "<absolute>"; };
|
||||
85B6936EDBE61D9BB8F8B33B /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_sensors.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_sensors.pri"; sourceTree = "<absolute>"; };
|
||||
87A4C1983FD641360BF80A02 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qtaccessiblewidgets.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qtaccessiblewidgets.pri"; sourceTree = "<absolute>"; };
|
||||
87EEF25EE25CF21572D1438C /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_websockets_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_websockets_private.pri"; sourceTree = "<absolute>"; };
|
||||
8849E60AEC7DB97A475C17EA /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_testlib_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_testlib_private.pri"; sourceTree = "<absolute>"; };
|
||||
892D36BEF797BA4AF48D378A /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qtsensors_dummy.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qtsensors_dummy.pri"; sourceTree = "<absolute>"; };
|
||||
89863CCAF1D29037AE95755D /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_declarative_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_declarative_private.pri"; sourceTree = "<absolute>"; };
|
||||
8A04A4A3625204D12A1207F6 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_nfc.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_nfc.pri"; sourceTree = "<absolute>"; };
|
||||
8B4BB4E74F8A4442EF563D7D /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qtsensorgestures_shakeplugin.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qtsensorgestures_shakeplugin.pri"; sourceTree = "<absolute>"; };
|
||||
8C31D89BDFCDF466DAED19A0 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_quick_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_quick_private.pri"; sourceTree = "<absolute>"; };
|
||||
8C5164D4E37556D40C5E6AA2 /* /usr/local/Qt-5.5.1/mkspecs/common/clang.conf */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/common/clang.conf"; sourceTree = "<absolute>"; };
|
||||
8CF51323544B886B8F4A2232 /* qwbmp */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = qwbmp; path = "/usr/local/Qt-5.5.1/plugins/imageformats/libqwbmp$(QT_LIBRARY_SUFFIX).a"; sourceTree = "<absolute>"; };
|
||||
5A80A1907B6CFFB524C1E57D /* Qt5Core */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = Qt5Core; path = "$(QT_PATH)/lib/libQt5Core$(QT_LIBRARY_SUFFIX).a"; sourceTree = "<absolute>"; };
|
||||
83D37373949868693FB7816D /* qmng */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = qmng; path = "$(QT_PATH)/plugins/imageformats/libqmng$(QT_LIBRARY_SUFFIX).a"; sourceTree = "<absolute>"; };
|
||||
8CF51323544B886B8F4A2232 /* qwbmp */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = qwbmp; path = "$(QT_PATH)/plugins/imageformats/libqwbmp$(QT_LIBRARY_SUFFIX).a"; sourceTree = "<absolute>"; };
|
||||
8D9815BDB5BD9F90D2BC05C5 /* AGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AGL.framework; path = /System/Library/Frameworks/AGL.framework; sourceTree = "<absolute>"; };
|
||||
8DDE1D26B3206CDB8B57FABE /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_svg_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_svg_private.pri"; sourceTree = "<absolute>"; };
|
||||
8E9136256AFFBA6EF048AA55 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_widgets_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_widgets_private.pri"; sourceTree = "<absolute>"; };
|
||||
8F500B5166907B6D9A7C3E3D /* qico */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = qico; path = "/usr/local/Qt-5.5.1/plugins/imageformats/libqico$(QT_LIBRARY_SUFFIX).a"; sourceTree = "<absolute>"; };
|
||||
8F572030CE9AB8CC5F672201 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_platformsupport_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_platformsupport_private.pri"; sourceTree = "<absolute>"; };
|
||||
8F97C9CAE38CA3AFAC0B3953 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_websockets.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_websockets.pri"; sourceTree = "<absolute>"; };
|
||||
8F500B5166907B6D9A7C3E3D /* qico */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = qico; path = "$(QT_PATH)/plugins/imageformats/libqico$(QT_LIBRARY_SUFFIX).a"; sourceTree = "<absolute>"; };
|
||||
93E4BE1A02365B73BAF00B73 /* moc_genemoji.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = moc_genemoji.cpp; path = GeneratedFiles/Debug/moc_genemoji.cpp; sourceTree = "<absolute>"; };
|
||||
946BEA667170DC1A7A8F9DB0 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qmng.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qmng.pri"; sourceTree = "<absolute>"; };
|
||||
9742F24EE18EA44D52824F1E /* CoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreServices.framework; path = /System/Library/Frameworks/CoreServices.framework; sourceTree = "<absolute>"; };
|
||||
9A0BDF67E013BB4FFB8685B0 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qqt7engine.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qqt7engine.pri"; sourceTree = "<absolute>"; };
|
||||
9DFF62A901D70814B8A323D4 /* Carbon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = /System/Library/Frameworks/Carbon.framework; sourceTree = "<absolute>"; };
|
||||
A022AF919D1977534CA66BB8 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_widgets.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_widgets.pri"; sourceTree = "<absolute>"; };
|
||||
A1A67BEAA744704B29168D39 /* IOKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = /System/Library/Frameworks/IOKit.framework; sourceTree = "<absolute>"; };
|
||||
A4D8AC60897F435C1C3B9D02 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qtsensors_generic.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qtsensors_generic.pri"; sourceTree = "<absolute>"; };
|
||||
A59F74CD76FDC2B4B9910E18 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_scripttools_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_scripttools_private.pri"; sourceTree = "<absolute>"; };
|
||||
A5B17ABEFBA1C2F43443D644 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_macextras.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_macextras.pri"; sourceTree = "<absolute>"; };
|
||||
A9E30FA27827990C5F182223 /* /usr/local/Qt-5.5.1/mkspecs/common/gcc-base-mac.conf */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/common/gcc-base-mac.conf"; sourceTree = "<absolute>"; };
|
||||
AA73DC3C2901E2979FE8AD5B /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_xml.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_xml.pri"; sourceTree = "<absolute>"; };
|
||||
AB1C02DDBD8E88DD9A9AFDDD /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qtsensorgestures_plugin.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qtsensorgestures_plugin.pri"; sourceTree = "<absolute>"; };
|
||||
AB745978DF0F41D1801ABDA6 /* .qmake.stash */ = {isa = PBXFileReference; lastKnownFileType = file; path = .qmake.stash; sourceTree = "<absolute>"; };
|
||||
ABA9AB4619F09DCFD2D4A27F /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_qmltest_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_qmltest_private.pri"; sourceTree = "<absolute>"; };
|
||||
ACC8A73268E5D9AF64E97AF4 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_bluetooth.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_bluetooth.pri"; sourceTree = "<absolute>"; };
|
||||
ADC6308023253CEA51F86E21 /* qwebp */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = qwebp; path = "/usr/local/Qt-5.5.1/plugins/imageformats/libqwebp$(QT_LIBRARY_SUFFIX).a"; sourceTree = "<absolute>"; };
|
||||
ADFC79902C14A612AE93A89A /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_svg.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_svg.pri"; sourceTree = "<absolute>"; };
|
||||
ADC6308023253CEA51F86E21 /* qwebp */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = qwebp; path = "$(QT_PATH)/plugins/imageformats/libqwebp$(QT_LIBRARY_SUFFIX).a"; sourceTree = "<absolute>"; };
|
||||
AEA456A2F75ED9F5CDA7BCBE /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = "<absolute>"; };
|
||||
AFD721AA33A2F785E77B1698 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qcocoa.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qcocoa.pri"; sourceTree = "<absolute>"; };
|
||||
B064BF3B496A7BF7A449CA1E /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qsqlite.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qsqlite.pri"; sourceTree = "<absolute>"; };
|
||||
B2246267D4C0D789259A86B0 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_quickwidgets_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_quickwidgets_private.pri"; sourceTree = "<absolute>"; };
|
||||
B26239063A068F800A2C95F4 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qwebp.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qwebp.pri"; sourceTree = "<absolute>"; };
|
||||
B382B645B34234E451AE5D94 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_qml.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_qml.pri"; sourceTree = "<absolute>"; };
|
||||
B518DA4EE7376002AFC71FD5 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_uitools_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_uitools_private.pri"; sourceTree = "<absolute>"; };
|
||||
B51B01657BFE9EAEF5590561 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_nfc_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_nfc_private.pri"; sourceTree = "<absolute>"; };
|
||||
B678DA730B4ECE863AD631AE /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qminimal.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qminimal.pri"; sourceTree = "<absolute>"; };
|
||||
B8525798C5AA7D7C6D68E1B3 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qmldbg_qtquick2.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qmldbg_qtquick2.pri"; sourceTree = "<absolute>"; };
|
||||
B8C1F6C965A7A14FBA8D4518 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qtmedia_audioengine.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qtmedia_audioengine.pri"; sourceTree = "<absolute>"; };
|
||||
BD22EFEFCC02644B1883CE19 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qtiff.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qtiff.pri"; sourceTree = "<absolute>"; };
|
||||
BD4D97801B547471B37A4CDC /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_bootstrap_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_bootstrap_private.pri"; sourceTree = "<absolute>"; };
|
||||
BDC9ECADEE40D11E3C2EA93F /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_sensors_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_sensors_private.pri"; sourceTree = "<absolute>"; };
|
||||
BFF0C38FB0EC140C5F0304AE /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_serialport.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_serialport.pri"; sourceTree = "<absolute>"; };
|
||||
C3345709A0BD182590087379 /* MetaEmoji.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = MetaEmoji.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
C4295BE59CCEBCDD16268349 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qico.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qico.pri"; sourceTree = "<absolute>"; };
|
||||
C505A18319B9B63C63877858 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_script_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_script_private.pri"; sourceTree = "<absolute>"; };
|
||||
C84546C18DCBB04166195DCF /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qtposition_positionpoll.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qtposition_positionpoll.pri"; sourceTree = "<absolute>"; };
|
||||
CCF75CFFB857487FB18F99F9 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qoffscreen.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qoffscreen.pri"; sourceTree = "<absolute>"; };
|
||||
CE829DD126DD2B97E8D70A7A /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_scripttools.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_scripttools.pri"; sourceTree = "<absolute>"; };
|
||||
CF86CD5BB01B9011E6B6FD3E /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_clucene_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_clucene_private.pri"; sourceTree = "<absolute>"; };
|
||||
CFCB992BEC24B71BFB8A2F30 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_script.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_script.pri"; sourceTree = "<absolute>"; };
|
||||
CFFBE05DB004895080314289 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qsvgicon.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qsvgicon.pri"; sourceTree = "<absolute>"; };
|
||||
D0CDC87DAFDA7F18A7AF450F /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_printsupport_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_printsupport_private.pri"; sourceTree = "<absolute>"; };
|
||||
D1FA7CAB5ACC09D563AE569F /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_multimediawidgets_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_multimediawidgets_private.pri"; sourceTree = "<absolute>"; };
|
||||
D2FE4D909926A0D1656068C4 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_multimedia.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_multimedia.pri"; sourceTree = "<absolute>"; };
|
||||
D3D1BE0BEA3AEE0551AD39AC /* qdds */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = qdds; path = "/usr/local/Qt-5.5.1/plugins/imageformats/libqdds$(QT_LIBRARY_SUFFIX).a"; sourceTree = "<absolute>"; };
|
||||
D3D1BE0BEA3AEE0551AD39AC /* qdds */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = qdds; path = "$(QT_PATH)/plugins/imageformats/libqdds$(QT_LIBRARY_SUFFIX).a"; sourceTree = "<absolute>"; };
|
||||
D4B32C2222F82AC56BADEB21 /* OpenGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGL.framework; path = /System/Library/Frameworks/OpenGL.framework; sourceTree = "<absolute>"; };
|
||||
D4DE537C1FBBD48BD989FAD1 /* /usr/local/Qt-5.5.1/mkspecs/qconfig.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/qconfig.pri"; sourceTree = "<absolute>"; };
|
||||
D5141F795670589C8CC41CBC /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_cocoaprintersupport.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_cocoaprintersupport.pri"; sourceTree = "<absolute>"; };
|
||||
D53D8E6A188E05078A114294 /* qcocoa */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = qcocoa; path = "/usr/local/Qt-5.5.1/plugins/platforms/libqcocoa$(QT_LIBRARY_SUFFIX).a"; sourceTree = "<absolute>"; };
|
||||
D6193B79CECC9DD0142D1200 /* qtharfbuzzng */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = qtharfbuzzng; path = "/usr/local/Qt-5.5.1/lib/libqtharfbuzzng$(QT_LIBRARY_SUFFIX).a"; sourceTree = "<absolute>"; };
|
||||
D7A0618DE39A427EBF41940E /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_help_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_help_private.pri"; sourceTree = "<absolute>"; };
|
||||
D81E3D9A18202BE8EC3D0E2C /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_gui_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_gui_private.pri"; sourceTree = "<absolute>"; };
|
||||
D948D4D8F949D45158F8DE35 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_quickwidgets.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_quickwidgets.pri"; sourceTree = "<absolute>"; };
|
||||
DB0A26DDC377B2004F61BFE3 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_testlib.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_testlib.pri"; sourceTree = "<absolute>"; };
|
||||
DBF506D10449BFABD45B82DA /* Qt5PrintSupport */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = Qt5PrintSupport; path = "/usr/local/Qt-5.5.1/lib/libQt5PrintSupport$(QT_LIBRARY_SUFFIX).a"; sourceTree = "<absolute>"; };
|
||||
DCEFD9167C239650120B0145 /* qtga */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = qtga; path = "/usr/local/Qt-5.5.1/plugins/imageformats/libqtga$(QT_LIBRARY_SUFFIX).a"; sourceTree = "<absolute>"; };
|
||||
DF8188E30892A4654B984221 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_qmltest.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_qmltest.pri"; sourceTree = "<absolute>"; };
|
||||
D53D8E6A188E05078A114294 /* qcocoa */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = qcocoa; path = "$(QT_PATH)/plugins/platforms/libqcocoa$(QT_LIBRARY_SUFFIX).a"; sourceTree = "<absolute>"; };
|
||||
D6193B79CECC9DD0142D1200 /* qtharfbuzzng */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = qtharfbuzzng; path = "$(QT_PATH)/lib/libqtharfbuzzng$(QT_LIBRARY_SUFFIX).a"; sourceTree = "<absolute>"; };
|
||||
DBF506D10449BFABD45B82DA /* Qt5PrintSupport */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = Qt5PrintSupport; path = "$(QT_PATH)/lib/libQt5PrintSupport$(QT_LIBRARY_SUFFIX).a"; sourceTree = "<absolute>"; };
|
||||
DCEFD9167C239650120B0145 /* qtga */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = qtga; path = "$(QT_PATH)/plugins/imageformats/libqtga$(QT_LIBRARY_SUFFIX).a"; sourceTree = "<absolute>"; };
|
||||
DFD7912080BC557230093752 /* ApplicationServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ApplicationServices.framework; path = /System/Library/Frameworks/ApplicationServices.framework; sourceTree = "<absolute>"; };
|
||||
E0F4563EA350EB65112A0EF4 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_opengl_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_opengl_private.pri"; sourceTree = "<absolute>"; };
|
||||
E37365B4489B4918BEBB707D /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_xml_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_xml_private.pri"; sourceTree = "<absolute>"; };
|
||||
E432DA897A5F027987342E8F /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_openglextensions.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_openglextensions.pri"; sourceTree = "<absolute>"; };
|
||||
E50FA73B8A23BC179A642B27 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_uitools.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_uitools.pri"; sourceTree = "<absolute>"; };
|
||||
E66B9EC81C285CA9A7FB6A2E /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_positioning_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_positioning_private.pri"; sourceTree = "<absolute>"; };
|
||||
E7B2F248E3F7970788F35BF5 /* Qt5PlatformSupport */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = Qt5PlatformSupport; path = "/usr/local/Qt-5.5.1/lib/libQt5PlatformSupport$(QT_LIBRARY_SUFFIX).a"; sourceTree = "<absolute>"; };
|
||||
E7D67CB158408BB7DEA74764 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_multimedia_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_multimedia_private.pri"; sourceTree = "<absolute>"; };
|
||||
E7B2F248E3F7970788F35BF5 /* Qt5PlatformSupport */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = Qt5PlatformSupport; path = "$(QT_PATH)/lib/libQt5PlatformSupport$(QT_LIBRARY_SUFFIX).a"; sourceTree = "<absolute>"; };
|
||||
E981470FA003A8DCE3C52E59 /* memain.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = memain.h; path = SourceFiles/_other/memain.h; sourceTree = "<absolute>"; };
|
||||
EA5D4FF9DE4AC4215D7DCE0D /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qcorewlanbearer.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qcorewlanbearer.pri"; sourceTree = "<absolute>"; };
|
||||
EB1F99FD112917157F3C3F6E /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qicns.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qicns.pri"; sourceTree = "<absolute>"; };
|
||||
EB29AC635054C09EFA749AE1 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qmldbg_tcp.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qmldbg_tcp.pri"; sourceTree = "<absolute>"; };
|
||||
EBD39B69F368CEEAC360A16D /* /usr/local/Qt-5.5.1/mkspecs/common/mac.conf */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/common/mac.conf"; sourceTree = "<absolute>"; };
|
||||
F0681BC551FC8A2B132FC646 /* qjp2 */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = qjp2; path = "/usr/local/Qt-5.5.1/plugins/imageformats/libqjp2$(QT_LIBRARY_SUFFIX).a"; sourceTree = "<absolute>"; };
|
||||
F0A58515945747E36783CC21 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qmldbg_inspector.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qmldbg_inspector.pri"; sourceTree = "<absolute>"; };
|
||||
F13124A218B58585B027D96A /* MetaEmoji.pro */ = {isa = PBXFileReference; lastKnownFileType = text; path = MetaEmoji.pro; sourceTree = "<absolute>"; };
|
||||
F2453BA07315EB9F34F1CD57 /* qtiff */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = qtiff; path = "/usr/local/Qt-5.5.1/plugins/imageformats/libqtiff$(QT_LIBRARY_SUFFIX).a"; sourceTree = "<absolute>"; };
|
||||
F2F823087EA182CCBD5748B8 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_designer.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_designer.pri"; sourceTree = "<absolute>"; };
|
||||
F33BE16353DD1557A9AB3558 /* /usr/local/Qt-5.5.1/mkspecs/common/clang-mac.conf */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/common/clang-mac.conf"; sourceTree = "<absolute>"; };
|
||||
F4EB01857048DCFCFFAAC4D0 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qavfmediaplayer.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qavfmediaplayer.pri"; sourceTree = "<absolute>"; };
|
||||
F7ADBF552F6B9A5982915164 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_positioning.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_positioning.pri"; sourceTree = "<absolute>"; };
|
||||
F83F87F8A60C9DF666911D42 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qsvg.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qsvg.pri"; sourceTree = "<absolute>"; };
|
||||
F9BEAA743A908603687DA204 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_xmlpatterns_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_xmlpatterns_private.pri"; sourceTree = "<absolute>"; };
|
||||
F0681BC551FC8A2B132FC646 /* qjp2 */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = qjp2; path = "$(QT_PATH)/plugins/imageformats/libqjp2$(QT_LIBRARY_SUFFIX).a"; sourceTree = "<absolute>"; };
|
||||
F2453BA07315EB9F34F1CD57 /* qtiff */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = qtiff; path = "$(QT_PATH)/plugins/imageformats/libqtiff$(QT_LIBRARY_SUFFIX).a"; sourceTree = "<absolute>"; };
|
||||
FCC237CA5AD60B9BA4447615 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = "<absolute>"; };
|
||||
FD944B80F033DFE737D401A2 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_help.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_help.pri"; sourceTree = "<absolute>"; };
|
||||
/* End PBXFileReference section */
|
||||
|
||||
/* Begin PBXFrameworksBuildPhase section */
|
||||
|
@ -241,8 +118,6 @@
|
|||
A9563D9C9FD0D76FAAF1CA96 /* qdds in Link Binary With Libraries */,
|
||||
7CA5405B8503BFFC60932D2B /* qicns in Link Binary With Libraries */,
|
||||
496FD9CEEB508016AFB9F928 /* qico in Link Binary With Libraries */,
|
||||
59789101736112A570B8EFE6 /* qjp2 in Link Binary With Libraries */,
|
||||
FBD56E2AC34F76BFFDB68619 /* qmng in Link Binary With Libraries */,
|
||||
7F76437B577F737145996DC3 /* qtga in Link Binary With Libraries */,
|
||||
C06DDE378A7AC1FA9E6FF69A /* qtiff in Link Binary With Libraries */,
|
||||
A3F8F2284013928A02AE5C38 /* qwbmp in Link Binary With Libraries */,
|
||||
|
@ -250,6 +125,7 @@
|
|||
9F33AC0693BC81B27D8F518D /* Qt5Gui in Link Binary With Libraries */,
|
||||
8D33FE22B9BBADC7FA46C15B /* qtharfbuzzng in Link Binary With Libraries */,
|
||||
07D7954A1B5544B200DE9598 /* qtpcre in Link Binary With Libraries */,
|
||||
0785004D1CCA847400168DBB /* libqtfreetype.a in Link Binary With Libraries */,
|
||||
B9ADD90C014EA3FBE351DF03 /* Qt5Core in Link Binary With Libraries */,
|
||||
);
|
||||
name = "Link Binary With Libraries";
|
||||
|
@ -293,136 +169,6 @@
|
|||
name = SourceFiles;
|
||||
sourceTree = "<Group>";
|
||||
};
|
||||
74B182DB50CB5611B5C1C297 /* Supporting Files */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
F13124A218B58585B027D96A /* MetaEmoji.pro */,
|
||||
6E67D23B15FC4B628DB2E0B2 /* /usr/local/Qt-5.5.1/mkspecs/qdevice.pri */,
|
||||
669FB007C4A3D58424D85EC8 /* /usr/local/Qt-5.5.1/mkspecs/common/shell-unix.conf */,
|
||||
0ABCEA8D0DD45589040B0AF2 /* /usr/local/Qt-5.5.1/mkspecs/common/unix.conf */,
|
||||
EBD39B69F368CEEAC360A16D /* /usr/local/Qt-5.5.1/mkspecs/common/mac.conf */,
|
||||
817A0F5A41B553A6DE67FDEB /* /usr/local/Qt-5.5.1/mkspecs/common/macx.conf */,
|
||||
45B95DB3B70B47A910FC847B /* /usr/local/Qt-5.5.1/mkspecs/common/gcc-base.conf */,
|
||||
A9E30FA27827990C5F182223 /* /usr/local/Qt-5.5.1/mkspecs/common/gcc-base-mac.conf */,
|
||||
8C5164D4E37556D40C5E6AA2 /* /usr/local/Qt-5.5.1/mkspecs/common/clang.conf */,
|
||||
F33BE16353DD1557A9AB3558 /* /usr/local/Qt-5.5.1/mkspecs/common/clang-mac.conf */,
|
||||
D4DE537C1FBBD48BD989FAD1 /* /usr/local/Qt-5.5.1/mkspecs/qconfig.pri */,
|
||||
ACC8A73268E5D9AF64E97AF4 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_bluetooth.pri */,
|
||||
2E48BB382B895A5ACD79AF9F /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_bluetooth_private.pri */,
|
||||
BD4D97801B547471B37A4CDC /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_bootstrap_private.pri */,
|
||||
CF86CD5BB01B9011E6B6FD3E /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_clucene_private.pri */,
|
||||
77FF486B1F9BCD55A8A3F35D /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_concurrent.pri */,
|
||||
7D28E9003CE64D8A7F2E292E /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_concurrent_private.pri */,
|
||||
7ECCC1F9442988B4F2707CC1 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_core.pri */,
|
||||
5F781C7FD8422D359EA1D2FE /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_core_private.pri */,
|
||||
7A94C7168B3FCBE5F04A013B /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_declarative.pri */,
|
||||
89863CCAF1D29037AE95755D /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_declarative_private.pri */,
|
||||
F2F823087EA182CCBD5748B8 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_designer.pri */,
|
||||
7C2F42B222EE88E26A6FED62 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_designer_private.pri */,
|
||||
69347C39E4D922E94D0860BF /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_designercomponents_private.pri */,
|
||||
360D4B3ED25D126430DE27D4 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_enginio.pri */,
|
||||
4C6C71914B1926119120DACD /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_enginio_private.pri */,
|
||||
23BC8B0FC3279421D41CA268 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_gui.pri */,
|
||||
D81E3D9A18202BE8EC3D0E2C /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_gui_private.pri */,
|
||||
FD944B80F033DFE737D401A2 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_help.pri */,
|
||||
D7A0618DE39A427EBF41940E /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_help_private.pri */,
|
||||
A5B17ABEFBA1C2F43443D644 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_macextras.pri */,
|
||||
33F165B1DB8CBF182C56FAB5 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_macextras_private.pri */,
|
||||
D2FE4D909926A0D1656068C4 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_multimedia.pri */,
|
||||
E7D67CB158408BB7DEA74764 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_multimedia_private.pri */,
|
||||
28BD0D10214709D95B161E24 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_multimediawidgets.pri */,
|
||||
D1FA7CAB5ACC09D563AE569F /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_multimediawidgets_private.pri */,
|
||||
293C8DEEE270847AC20E70F9 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_network.pri */,
|
||||
382E89A91A34F7898C25FD0D /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_network_private.pri */,
|
||||
8A04A4A3625204D12A1207F6 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_nfc.pri */,
|
||||
B51B01657BFE9EAEF5590561 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_nfc_private.pri */,
|
||||
5CEA7A2DB2136425A88D1254 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_opengl.pri */,
|
||||
E0F4563EA350EB65112A0EF4 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_opengl_private.pri */,
|
||||
E432DA897A5F027987342E8F /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_openglextensions.pri */,
|
||||
5597304BEC94BFB9EAAEBC4B /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_openglextensions_private.pri */,
|
||||
8F572030CE9AB8CC5F672201 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_platformsupport_private.pri */,
|
||||
F7ADBF552F6B9A5982915164 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_positioning.pri */,
|
||||
E66B9EC81C285CA9A7FB6A2E /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_positioning_private.pri */,
|
||||
6C08BFC27C4C303A3A5181DB /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_printsupport.pri */,
|
||||
D0CDC87DAFDA7F18A7AF450F /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_printsupport_private.pri */,
|
||||
B382B645B34234E451AE5D94 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_qml.pri */,
|
||||
6102C69805B6398AF6FA5BEB /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_qml_private.pri */,
|
||||
4FB6657DA22BC68B819B64B3 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_qmldevtools_private.pri */,
|
||||
DF8188E30892A4654B984221 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_qmltest.pri */,
|
||||
ABA9AB4619F09DCFD2D4A27F /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_qmltest_private.pri */,
|
||||
5B22E9E4EE9AAE42ABC24AB3 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_qtmultimediaquicktools_private.pri */,
|
||||
16DD53E17C65AC8B450CC6C3 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_quick.pri */,
|
||||
8C31D89BDFCDF466DAED19A0 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_quick_private.pri */,
|
||||
82E7DCFD95559532D8FC6CDD /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_quickparticles_private.pri */,
|
||||
D948D4D8F949D45158F8DE35 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_quickwidgets.pri */,
|
||||
B2246267D4C0D789259A86B0 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_quickwidgets_private.pri */,
|
||||
CFCB992BEC24B71BFB8A2F30 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_script.pri */,
|
||||
C505A18319B9B63C63877858 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_script_private.pri */,
|
||||
CE829DD126DD2B97E8D70A7A /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_scripttools.pri */,
|
||||
A59F74CD76FDC2B4B9910E18 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_scripttools_private.pri */,
|
||||
85B6936EDBE61D9BB8F8B33B /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_sensors.pri */,
|
||||
BDC9ECADEE40D11E3C2EA93F /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_sensors_private.pri */,
|
||||
BFF0C38FB0EC140C5F0304AE /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_serialport.pri */,
|
||||
311004331A04F3D69C98643C /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_serialport_private.pri */,
|
||||
7DE30A90667C03C4F91A2A91 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_sql.pri */,
|
||||
075EB50EB07CF69FD62FB8DF /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_sql_private.pri */,
|
||||
ADFC79902C14A612AE93A89A /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_svg.pri */,
|
||||
8DDE1D26B3206CDB8B57FABE /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_svg_private.pri */,
|
||||
DB0A26DDC377B2004F61BFE3 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_testlib.pri */,
|
||||
8849E60AEC7DB97A475C17EA /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_testlib_private.pri */,
|
||||
E50FA73B8A23BC179A642B27 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_uitools.pri */,
|
||||
B518DA4EE7376002AFC71FD5 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_uitools_private.pri */,
|
||||
8F97C9CAE38CA3AFAC0B3953 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_websockets.pri */,
|
||||
87EEF25EE25CF21572D1438C /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_websockets_private.pri */,
|
||||
A022AF919D1977534CA66BB8 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_widgets.pri */,
|
||||
8E9136256AFFBA6EF048AA55 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_widgets_private.pri */,
|
||||
AA73DC3C2901E2979FE8AD5B /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_xml.pri */,
|
||||
E37365B4489B4918BEBB707D /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_xml_private.pri */,
|
||||
2E6D9B1D2743D24E31B0B284 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_xmlpatterns.pri */,
|
||||
F9BEAA743A908603687DA204 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_xmlpatterns_private.pri */,
|
||||
D5141F795670589C8CC41CBC /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_cocoaprintersupport.pri */,
|
||||
1FAE75C970AA73F2DEDDB508 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qavfcamera.pri */,
|
||||
F4EB01857048DCFCFFAAC4D0 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qavfmediaplayer.pri */,
|
||||
AFD721AA33A2F785E77B1698 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qcocoa.pri */,
|
||||
EA5D4FF9DE4AC4215D7DCE0D /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qcorewlanbearer.pri */,
|
||||
111BBEE3D1432C3B517FD539 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qdds.pri */,
|
||||
3685604BDB64DD6E92169B73 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qdeclarativeview.pri */,
|
||||
2440CD1D4CEF80443BCA1B8B /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qgenericbearer.pri */,
|
||||
EB1F99FD112917157F3C3F6E /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qicns.pri */,
|
||||
C4295BE59CCEBCDD16268349 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qico.pri */,
|
||||
45DB132B756499D4DF38430E /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qjp2.pri */,
|
||||
B678DA730B4ECE863AD631AE /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qminimal.pri */,
|
||||
F0A58515945747E36783CC21 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qmldbg_inspector.pri */,
|
||||
B8525798C5AA7D7C6D68E1B3 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qmldbg_qtquick2.pri */,
|
||||
EB29AC635054C09EFA749AE1 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qmldbg_tcp.pri */,
|
||||
3F08D430CEC8D2117735CCB4 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qmldbg_tcp_qtdeclarative.pri */,
|
||||
946BEA667170DC1A7A8F9DB0 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qmng.pri */,
|
||||
CCF75CFFB857487FB18F99F9 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qoffscreen.pri */,
|
||||
9A0BDF67E013BB4FFB8685B0 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qqt7engine.pri */,
|
||||
B064BF3B496A7BF7A449CA1E /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qsqlite.pri */,
|
||||
F83F87F8A60C9DF666911D42 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qsvg.pri */,
|
||||
CFFBE05DB004895080314289 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qsvgicon.pri */,
|
||||
247D8DF3B1DDB665B80BBA25 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qtaccessiblequick.pri */,
|
||||
87A4C1983FD641360BF80A02 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qtaccessiblewidgets.pri */,
|
||||
24B6929EE3952310F2DAECB1 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qtaudio_coreaudio.pri */,
|
||||
060A694B42A4555240009936 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qtga.pri */,
|
||||
BD22EFEFCC02644B1883CE19 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qtiff.pri */,
|
||||
B8C1F6C965A7A14FBA8D4518 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qtmedia_audioengine.pri */,
|
||||
74C1C232DFAA71028A0412CA /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qtmultimedia_m3u.pri */,
|
||||
C84546C18DCBB04166195DCF /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qtposition_positionpoll.pri */,
|
||||
AB1C02DDBD8E88DD9A9AFDDD /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qtsensorgestures_plugin.pri */,
|
||||
8B4BB4E74F8A4442EF563D7D /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qtsensorgestures_shakeplugin.pri */,
|
||||
892D36BEF797BA4AF48D378A /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qtsensors_dummy.pri */,
|
||||
A4D8AC60897F435C1C3B9D02 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qtsensors_generic.pri */,
|
||||
346287C9E754E7C458153F03 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qwbmp.pri */,
|
||||
B26239063A068F800A2C95F4 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qwebp.pri */,
|
||||
63E722139886C87BC82DBDF5 /* /usr/local/Qt-5.5.1/mkspecs/macx-clang/qmake.conf */,
|
||||
85061B1DA49D125991117950 /* /usr/local/Qt-5.5.1/mkspecs/macx-xcode/qmake.conf */,
|
||||
AB745978DF0F41D1801ABDA6 /* .qmake.stash */,
|
||||
);
|
||||
name = "Supporting Files";
|
||||
sourceTree = "<Group>";
|
||||
};
|
||||
801973D3334D0FCA849CF485 /* Debug */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
|
@ -435,6 +181,7 @@
|
|||
isa = PBXGroup;
|
||||
children = (
|
||||
07D795491B5544B200DE9598 /* qtpcre */,
|
||||
0785004C1CCA847400168DBB /* libqtfreetype.a */,
|
||||
AEA456A2F75ED9F5CDA7BCBE /* Cocoa.framework */,
|
||||
DFD7912080BC557230093752 /* ApplicationServices.framework */,
|
||||
9742F24EE18EA44D52824F1E /* CoreServices.framework */,
|
||||
|
@ -477,7 +224,6 @@
|
|||
children = (
|
||||
2EB56BE3C2D93CDAB0C52E67 /* Sources */,
|
||||
25B08E2869634E9BCBA333A2 /* Generated Sources */,
|
||||
74B182DB50CB5611B5C1C297 /* Supporting Files */,
|
||||
AF39DD055C3EF8226FBE929D /* Frameworks */,
|
||||
FE0A091FDBFB3E9C31B7A1BD /* Products */,
|
||||
);
|
||||
|
@ -602,25 +348,22 @@
|
|||
GCC_WARN_UNUSED_FUNCTION = NO;
|
||||
GCC_WARN_UNUSED_VARIABLE = NO;
|
||||
HEADER_SEARCH_PATHS = (
|
||||
../../Libraries/QtStatic/qtbase/include/QtGui/5.5.1/QtGui,
|
||||
../../Libraries/QtStatic/qtbase/include/QtCore/5.5.1/QtCore,
|
||||
../../Libraries/QtStatic/qtbase/include,
|
||||
"/usr/local/Qt-5.5.1/include",
|
||||
"/usr/local/Qt-5.5.1/include/QtGui",
|
||||
"/usr/local/Qt-5.5.1/include/QtCore",
|
||||
"$(QT_PATH)/include",
|
||||
"$(QT_PATH)/include/QtGui",
|
||||
"$(QT_PATH)/include/QtCore",
|
||||
GeneratedFiles/Debug,
|
||||
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/System/Library/Frameworks/OpenGL.framework/Versions/A/Headers,
|
||||
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/System/Library/Frameworks/AGL.framework/Headers,
|
||||
"/usr/local/Qt-5.5.1/mkspecs/macx-clang",
|
||||
"$(QT_PATH)/mkspecs/macx-clang",
|
||||
);
|
||||
INFOPLIST_FILE = Emoji.plist;
|
||||
INSTALL_DIR = ../Mac/ReleaseEmoji/;
|
||||
LDPLUSPLUS = "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++";
|
||||
LIBRARY_SEARCH_PATHS = (
|
||||
/System/Library/Frameworks/,
|
||||
"/usr/local/Qt-5.5.1/lib",
|
||||
"/usr/local/Qt-5.5.1/plugins/platforms",
|
||||
"/usr/local/Qt-5.5.1/plugins/imageformats",
|
||||
"$(QT_PATH)/lib",
|
||||
"$(QT_PATH)/plugins/platforms",
|
||||
"$(QT_PATH)/plugins/imageformats",
|
||||
);
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.7;
|
||||
OBJROOT = ./../Mac/ReleaseIntermediateEmoji/;
|
||||
|
@ -649,15 +392,16 @@
|
|||
OTHER_LDFLAGS = (
|
||||
"-headerpad_max_install_names",
|
||||
"-stdlib=libc++",
|
||||
"-L/usr/local/Qt-5.5.1/lib",
|
||||
"-L/usr/local/Qt-5.5.1/plugins/platforms",
|
||||
"-L$(QT_PATH)/lib",
|
||||
"-L$(QT_PATH)/plugins/platforms",
|
||||
"-lcups",
|
||||
"-L/usr/local/Qt-5.5.1/plugins/imageformats",
|
||||
"-L$(QT_PATH)/plugins/imageformats",
|
||||
"-lz",
|
||||
"-lm",
|
||||
);
|
||||
PRODUCT_NAME = MetaEmoji;
|
||||
QT_LIBRARY_SUFFIX = "";
|
||||
QT_PATH = "/usr/local/tdesktop/Qt-5.6.0";
|
||||
SDKROOT = macosx;
|
||||
SYMROOT = ./../Mac;
|
||||
};
|
||||
|
@ -693,25 +437,22 @@
|
|||
GCC_WARN_UNUSED_FUNCTION = NO;
|
||||
GCC_WARN_UNUSED_VARIABLE = NO;
|
||||
HEADER_SEARCH_PATHS = (
|
||||
../../Libraries/QtStatic/qtbase/include/QtGui/5.5.1/QtGui,
|
||||
../../Libraries/QtStatic/qtbase/include/QtCore/5.5.1/QtCore,
|
||||
../../Libraries/QtStatic/qtbase/include,
|
||||
"/usr/local/Qt-5.5.1/include",
|
||||
"/usr/local/Qt-5.5.1/include/QtGui",
|
||||
"/usr/local/Qt-5.5.1/include/QtCore",
|
||||
"$(QT_PATH)/include",
|
||||
"$(QT_PATH)/include/QtGui",
|
||||
"$(QT_PATH)/include/QtCore",
|
||||
GeneratedFiles/Debug,
|
||||
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/System/Library/Frameworks/OpenGL.framework/Versions/A/Headers,
|
||||
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/System/Library/Frameworks/AGL.framework/Headers,
|
||||
"/usr/local/Qt-5.5.1/mkspecs/macx-clang",
|
||||
"$(QT_PATH)/mkspecs/macx-clang",
|
||||
);
|
||||
INFOPLIST_FILE = Emoji.plist;
|
||||
INSTALL_DIR = ../Mac/DebugEmoji/;
|
||||
LDPLUSPLUS = "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++";
|
||||
LIBRARY_SEARCH_PATHS = (
|
||||
/System/Library/Frameworks/,
|
||||
"/usr/local/Qt-5.5.1/lib",
|
||||
"/usr/local/Qt-5.5.1/plugins/platforms",
|
||||
"/usr/local/Qt-5.5.1/plugins/imageformats",
|
||||
"$(QT_PATH)/lib",
|
||||
"$(QT_PATH)/plugins/platforms",
|
||||
"$(QT_PATH)/plugins/imageformats",
|
||||
);
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.7;
|
||||
OBJROOT = ./../Mac/DebugIntermediateEmoji/;
|
||||
|
@ -741,15 +482,16 @@
|
|||
OTHER_LDFLAGS = (
|
||||
"-headerpad_max_install_names",
|
||||
"-stdlib=libc++",
|
||||
"-L/usr/local/Qt-5.5.1/lib",
|
||||
"-L/usr/local/Qt-5.5.1/plugins/platforms",
|
||||
"-L$(QT_PATH)/lib",
|
||||
"-L$(QT_PATH)/plugins/platforms",
|
||||
"-lcups",
|
||||
"-L/usr/local/Qt-5.5.1/plugins/imageformats",
|
||||
"-L$(QT_PATH)/plugins/imageformats",
|
||||
"-lz",
|
||||
"-lm",
|
||||
);
|
||||
PRODUCT_NAME = MetaEmoji;
|
||||
QT_LIBRARY_SUFFIX = _debug;
|
||||
QT_PATH = "/usr/local/tdesktop/Qt-5.6.0";
|
||||
SDKROOT = macosx;
|
||||
SYMROOT = ./../Mac;
|
||||
};
|
||||
|
|
|
@ -1,23 +1,33 @@
|
|||
#############################################################################
|
||||
# Makefile for building: ../Mac/DebugEmoji/MetaEmoji.app/Contents/MacOS/MetaEmoji
|
||||
# Generated by qmake (3.0) (Qt 5.5.1)
|
||||
# Project: MetaEmoji.pro
|
||||
# Template: app
|
||||
# Command: /usr/local/Qt-5.5.1/bin/qmake -spec macx-xcode -o MetaEmoji.xcodeproj/project.pbxproj MetaEmoji.pro
|
||||
# Initially generated by qmake
|
||||
#############################################################################
|
||||
|
||||
MAKEFILE = project.pbxproj
|
||||
|
||||
MOC = /usr/local/Qt-5.5.1/bin/moc
|
||||
UIC =
|
||||
QT_VER = 5.6.0
|
||||
QT_DIR = /usr/local/tdesktop/Qt-$(QT_VER)
|
||||
QT_MOC = $(QT_DIR)/bin/moc
|
||||
LEX = flex
|
||||
LEXFLAGS =
|
||||
YACC = yacc
|
||||
YACCFLAGS = -d
|
||||
DEFINES = -D_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB
|
||||
INCPATH = -I/usr/local/Qt-5.5.1/mkspecs/macx-clang -I. -I../../Libraries/QtStatic/qtbase/include/QtGui/5.5.1/QtGui -I../../Libraries/QtStatic/qtbase/include/QtCore/5.5.1/QtCore -I../../Libraries/QtStatic/qtbase/include -I/usr/local/Qt-5.5.1/include -I/usr/local/Qt-5.5.1/include/QtGui -I/usr/local/Qt-5.5.1/include/QtCore -IGeneratedFiles/Debug -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/System/Library/Frameworks/OpenGL.framework/Versions/A/Headers -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/System/Library/Frameworks/AGL.framework/Headers
|
||||
DEFINES = -D_DEBUG -DQT_WIDGETS_LIB -DQT_NETWORK_LIB -DQT_GUI_LIB -DQT_CORE_LIB -D__APPLE__ -D__GNUC__=4
|
||||
INCPATH = -I$(QT_DIR)/mkspecs/macx-clang\
|
||||
-I$(QT_DIR)/include/QtGui/$(QT_VER)/QtGui\
|
||||
-I$(QT_DIR)/include/QtCore/$(QT_VER)/QtCore\
|
||||
-I$(QT_VER)/include\
|
||||
-IGeneratedFiles/Debug\
|
||||
-I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/usr/include/c++/4.2.1/backward\
|
||||
-I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/usr/include/c++/4.2.1\
|
||||
-I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/usr/include\
|
||||
-I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/System/Library/Frameworks/OpenGL.framework/Versions/A/Headers\
|
||||
-I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/System/Library/Frameworks/AGL.framework/Headers\
|
||||
-I/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/5.1/include\
|
||||
-I/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include
|
||||
DEL_FILE = rm -f
|
||||
MOVE = mv -f
|
||||
MOC_FILE = $(QT_MOC) $(DEFINES) $(INCPATH)
|
||||
|
||||
IMAGES =
|
||||
PARSERS =
|
||||
|
@ -39,22 +49,8 @@ compiler_rcc_clean:
|
|||
compiler_moc_header_make_all: GeneratedFiles/Debug/moc_genemoji.cpp
|
||||
compiler_moc_header_clean:
|
||||
-$(DEL_FILE) GeneratedFiles/Debug/moc_genemoji.cpp
|
||||
GeneratedFiles/Debug/moc_genemoji.cpp: ../../Libraries/QtStatic/qtbase/include/QtCore/QMap \
|
||||
../../Libraries/QtStatic/qtbase/include/QtCore/QVector \
|
||||
../../Libraries/QtStatic/qtbase/include/QtCore/QFile \
|
||||
../../Libraries/QtStatic/qtbase/include/QtCore/QFileInfo \
|
||||
../../Libraries/QtStatic/qtbase/include/QtCore/QBuffer \
|
||||
../../Libraries/QtStatic/qtbase/include/QtCore/QDir \
|
||||
../../Libraries/QtStatic/qtbase/include/QtCore/QRegularExpression \
|
||||
../../Libraries/QtStatic/qtbase/include/QtGui/QImage \
|
||||
../../Libraries/QtStatic/qtbase/include/QtGui/QPixmap \
|
||||
../../Libraries/QtStatic/qtbase/include/QtGui/QPainter \
|
||||
../../Libraries/QtStatic/qtbase/include/QtCore/QTextStream \
|
||||
../../Libraries/QtStatic/qtbase/include/QtCore/QString \
|
||||
../../Libraries/QtStatic/qtbase/include/QtCore/QCoreApplication \
|
||||
../../Libraries/QtStatic/qtbase/include/QtGui/QGuiApplication \
|
||||
SourceFiles/_other/genemoji.h
|
||||
/usr/local/Qt-5.5.1/bin/moc $(DEFINES) -D__APPLE__ -D__GNUC__=4 -I/usr/local/Qt-5.5.1/mkspecs/macx-clang -I. -I/usr/local/Qt-5.5.1/include/QtGui/5.5.1/QtGui -I/usr/local/Qt-5.5.1/include/QtCore/5.5.1/QtCore -I/usr/local/Qt-5.5.1/include -I/usr/local/Qt-5.5.1/include/QtGui -I/usr/local/Qt-5.5.1/include/QtCore -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/usr/include/c++/4.2.1 -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/usr/include/c++/4.2.1/backward -I/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/5.1/include -I/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/usr/include SourceFiles/_other/genemoji.h -o GeneratedFiles/Debug/moc_genemoji.cpp
|
||||
GeneratedFiles/Debug/moc_genemoji.cpp: SourceFiles/_other/genemoji.h
|
||||
$(MOC_FILE) SourceFiles/_other/genemoji.h -o GeneratedFiles/Debug/moc_genemoji.cpp
|
||||
|
||||
compiler_moc_source_make_all:
|
||||
compiler_moc_source_clean:
|
||||
|
|
|
@ -23,13 +23,13 @@
|
|||
|
||||
/* Begin PBXBuildFile section */
|
||||
07D7954A1B5544B200DE9598 /* qtpcre in Link Binary With Libraries */ = {isa = PBXBuildFile; fileRef = 07D795491B5544B200DE9598 /* qtpcre */; };
|
||||
0785004D1CCA847400168DBB /* libqtfreetype.a in Link Binary With Libraries */ = {isa = PBXBuildFile; fileRef = 0785004C1CCA847400168DBB /* libqtfreetype.a */; };
|
||||
0E4EEB1BFC9FA7662AD934C6 /* moc_genlang.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 680437016D61255E7F889A94 /* moc_genlang.cpp */; settings = {ATTRIBUTES = (); }; };
|
||||
1A681B886F50EE30FBE62B4B /* Qt5PrintSupport in Link Binary With Libraries */ = {isa = PBXBuildFile; fileRef = DBF506D10449BFABD45B82DA /* Qt5PrintSupport */; };
|
||||
1BB705CDB741E2B7450201A5 /* Cocoa.framework in Link Binary With Libraries */ = {isa = PBXBuildFile; fileRef = AEA456A2F75ED9F5CDA7BCBE /* Cocoa.framework */; };
|
||||
328FD74542F6E2C873EE4D4B /* ApplicationServices.framework in Link Binary With Libraries */ = {isa = PBXBuildFile; fileRef = DFD7912080BC557230093752 /* ApplicationServices.framework */; };
|
||||
34D95ABDC12C1841CEF3B2E3 /* genlang.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 669AB12AE74AC219B4669D79 /* genlang.cpp */; settings = {ATTRIBUTES = (); }; };
|
||||
496FD9CEEB508016AFB9F928 /* qico in Link Binary With Libraries */ = {isa = PBXBuildFile; fileRef = 8F500B5166907B6D9A7C3E3D /* qico */; };
|
||||
59789101736112A570B8EFE6 /* qjp2 in Link Binary With Libraries */ = {isa = PBXBuildFile; fileRef = F0681BC551FC8A2B132FC646 /* qjp2 */; };
|
||||
668DDDA0C55405E7FCFD6CA5 /* CoreServices.framework in Link Binary With Libraries */ = {isa = PBXBuildFile; fileRef = 9742F24EE18EA44D52824F1E /* CoreServices.framework */; };
|
||||
7CA5405B8503BFFC60932D2B /* qicns in Link Binary With Libraries */ = {isa = PBXBuildFile; fileRef = 31120EDB269DFF13E1D49847 /* qicns */; };
|
||||
7F76437B577F737145996DC3 /* qtga in Link Binary With Libraries */ = {isa = PBXBuildFile; fileRef = DCEFD9167C239650120B0145 /* qtga */; };
|
||||
|
@ -50,7 +50,6 @@
|
|||
F4D3747C3A03B25EDC9057BB /* qwebp in Link Binary With Libraries */ = {isa = PBXBuildFile; fileRef = ADC6308023253CEA51F86E21 /* qwebp */; };
|
||||
F8B465CE34D8DF87AAE95913 /* CoreFoundation.framework in Link Binary With Libraries */ = {isa = PBXBuildFile; fileRef = 4D765E1B1EA6C757220C63E7 /* CoreFoundation.framework */; };
|
||||
F8ED42CF8679BF83227DAFC4 /* Carbon.framework in Link Binary With Libraries */ = {isa = PBXBuildFile; fileRef = 9DFF62A901D70814B8A323D4 /* Carbon.framework */; };
|
||||
FBD56E2AC34F76BFFDB68619 /* qmng in Link Binary With Libraries */ = {isa = PBXBuildFile; fileRef = 83D37373949868693FB7816D /* qmng */; };
|
||||
/* End PBXBuildFile section */
|
||||
|
||||
/* Begin PBXContainerItemProxy section */
|
||||
|
@ -64,161 +63,39 @@
|
|||
/* End PBXContainerItemProxy section */
|
||||
|
||||
/* Begin PBXFileReference section */
|
||||
04391BE7A8B9D811E255100A /* Qt5Gui */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = Qt5Gui; path = "/usr/local/Qt-5.5.1/lib/libQt5Gui$(QT_LIBRARY_SUFFIX).a"; sourceTree = "<absolute>"; };
|
||||
060A694B42A4555240009936 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qtga.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qtga.pri"; sourceTree = "<absolute>"; };
|
||||
075EB50EB07CF69FD62FB8DF /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_sql_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_sql_private.pri"; sourceTree = "<absolute>"; };
|
||||
07D795491B5544B200DE9598 /* qtpcre */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = qtpcre; path = "usr/local/Qt-5.5.1/lib/libqtpcre$(QT_LIBRARY_SUFFIX).a"; sourceTree = "<group>"; };
|
||||
0ABCEA8D0DD45589040B0AF2 /* /usr/local/Qt-5.5.1/mkspecs/common/unix.conf */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/common/unix.conf"; sourceTree = "<absolute>"; };
|
||||
111BBEE3D1432C3B517FD539 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qdds.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qdds.pri"; sourceTree = "<absolute>"; };
|
||||
16DD53E17C65AC8B450CC6C3 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_quick.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_quick.pri"; sourceTree = "<absolute>"; };
|
||||
1FAE75C970AA73F2DEDDB508 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qavfcamera.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qavfcamera.pri"; sourceTree = "<absolute>"; };
|
||||
23BC8B0FC3279421D41CA268 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_gui.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_gui.pri"; sourceTree = "<absolute>"; };
|
||||
2440CD1D4CEF80443BCA1B8B /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qgenericbearer.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qgenericbearer.pri"; sourceTree = "<absolute>"; };
|
||||
247D8DF3B1DDB665B80BBA25 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qtaccessiblequick.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qtaccessiblequick.pri"; sourceTree = "<absolute>"; };
|
||||
24B6929EE3952310F2DAECB1 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qtaudio_coreaudio.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qtaudio_coreaudio.pri"; sourceTree = "<absolute>"; };
|
||||
28BD0D10214709D95B161E24 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_multimediawidgets.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_multimediawidgets.pri"; sourceTree = "<absolute>"; };
|
||||
293C8DEEE270847AC20E70F9 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_network.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_network.pri"; sourceTree = "<absolute>"; };
|
||||
2E48BB382B895A5ACD79AF9F /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_bluetooth_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_bluetooth_private.pri"; sourceTree = "<absolute>"; };
|
||||
2E6D9B1D2743D24E31B0B284 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_xmlpatterns.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_xmlpatterns.pri"; sourceTree = "<absolute>"; };
|
||||
311004331A04F3D69C98643C /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_serialport_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_serialport_private.pri"; sourceTree = "<absolute>"; };
|
||||
31120EDB269DFF13E1D49847 /* qicns */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = qicns; path = "/usr/local/Qt-5.5.1/plugins/imageformats/libqicns$(QT_LIBRARY_SUFFIX).a"; sourceTree = "<absolute>"; };
|
||||
33A9E861B2FAD8C39E154E7C /* MetaLang.pro */ = {isa = PBXFileReference; lastKnownFileType = text; path = MetaLang.pro; sourceTree = "<absolute>"; };
|
||||
33F165B1DB8CBF182C56FAB5 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_macextras_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_macextras_private.pri"; sourceTree = "<absolute>"; };
|
||||
346287C9E754E7C458153F03 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qwbmp.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qwbmp.pri"; sourceTree = "<absolute>"; };
|
||||
360D4B3ED25D126430DE27D4 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_enginio.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_enginio.pri"; sourceTree = "<absolute>"; };
|
||||
3685604BDB64DD6E92169B73 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qdeclarativeview.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qdeclarativeview.pri"; sourceTree = "<absolute>"; };
|
||||
382E89A91A34F7898C25FD0D /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_network_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_network_private.pri"; sourceTree = "<absolute>"; };
|
||||
3F08D430CEC8D2117735CCB4 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qmldbg_tcp_qtdeclarative.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qmldbg_tcp_qtdeclarative.pri"; sourceTree = "<absolute>"; };
|
||||
45B95DB3B70B47A910FC847B /* /usr/local/Qt-5.5.1/mkspecs/common/gcc-base.conf */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/common/gcc-base.conf"; sourceTree = "<absolute>"; };
|
||||
45DB132B756499D4DF38430E /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qjp2.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qjp2.pri"; sourceTree = "<absolute>"; };
|
||||
4689C06178B60B84E7F3A3B7 /* Qt5Widgets */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = Qt5Widgets; path = "/usr/local/Qt-5.5.1/lib/libQt5Widgets$(QT_LIBRARY_SUFFIX).a"; sourceTree = "<absolute>"; };
|
||||
4C6C71914B1926119120DACD /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_enginio_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_enginio_private.pri"; sourceTree = "<absolute>"; };
|
||||
04391BE7A8B9D811E255100A /* Qt5Gui */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = Qt5Gui; path = "$(QT_PATH)/lib/libQt5Gui$(QT_LIBRARY_SUFFIX).a"; sourceTree = "<absolute>"; };
|
||||
07D795491B5544B200DE9598 /* qtpcre */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = qtpcre; path = "$(QT_PATH)/lib/libqtpcre$(QT_LIBRARY_SUFFIX).a"; sourceTree = "<group>"; };
|
||||
0785004C1CCA847400168DBB /* libqtfreetype.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libqtfreetype.a; path = "$(QT_PATH)/lib/libqtfreetype$(QT_LIBRARY_SUFFIX).a"; sourceTree = "<group>"; };
|
||||
31120EDB269DFF13E1D49847 /* qicns */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = qicns; path = "$(QT_PATH)/plugins/imageformats/libqicns$(QT_LIBRARY_SUFFIX).a"; sourceTree = "<absolute>"; };
|
||||
4689C06178B60B84E7F3A3B7 /* Qt5Widgets */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = Qt5Widgets; path = "$(QT_PATH)/lib/libQt5Widgets$(QT_LIBRARY_SUFFIX).a"; sourceTree = "<absolute>"; };
|
||||
4D765E1B1EA6C757220C63E7 /* CoreFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreFoundation.framework; path = /System/Library/Frameworks/CoreFoundation.framework; sourceTree = "<absolute>"; };
|
||||
4FB6657DA22BC68B819B64B3 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_qmldevtools_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_qmldevtools_private.pri"; sourceTree = "<absolute>"; };
|
||||
54D6D1A7260739988F6FC406 /* genlang.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = genlang.h; path = SourceFiles/_other/genlang.h; sourceTree = "<absolute>"; };
|
||||
5597304BEC94BFB9EAAEBC4B /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_openglextensions_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_openglextensions_private.pri"; sourceTree = "<absolute>"; };
|
||||
5A80A1907B6CFFB524C1E57D /* Qt5Core */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = Qt5Core; path = "/usr/local/Qt-5.5.1/lib/libQt5Core$(QT_LIBRARY_SUFFIX).a"; sourceTree = "<absolute>"; };
|
||||
5B22E9E4EE9AAE42ABC24AB3 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_qtmultimediaquicktools_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_qtmultimediaquicktools_private.pri"; sourceTree = "<absolute>"; };
|
||||
5CEA7A2DB2136425A88D1254 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_opengl.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_opengl.pri"; sourceTree = "<absolute>"; };
|
||||
5F781C7FD8422D359EA1D2FE /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_core_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_core_private.pri"; sourceTree = "<absolute>"; };
|
||||
6102C69805B6398AF6FA5BEB /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_qml_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_qml_private.pri"; sourceTree = "<absolute>"; };
|
||||
63E722139886C87BC82DBDF5 /* /usr/local/Qt-5.5.1/mkspecs/macx-clang/qmake.conf */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/macx-clang/qmake.conf"; sourceTree = "<absolute>"; };
|
||||
5A80A1907B6CFFB524C1E57D /* Qt5Core */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = Qt5Core; path = "$(QT_PATH)/lib/libQt5Core$(QT_LIBRARY_SUFFIX).a"; sourceTree = "<absolute>"; };
|
||||
669AB12AE74AC219B4669D79 /* genlang.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = genlang.cpp; path = SourceFiles/_other/genlang.cpp; sourceTree = "<absolute>"; };
|
||||
669FB007C4A3D58424D85EC8 /* /usr/local/Qt-5.5.1/mkspecs/common/shell-unix.conf */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/common/shell-unix.conf"; sourceTree = "<absolute>"; };
|
||||
680437016D61255E7F889A94 /* moc_genlang.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = moc_genlang.cpp; path = GeneratedFiles/Debug/moc_genlang.cpp; sourceTree = "<absolute>"; };
|
||||
69347C39E4D922E94D0860BF /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_designercomponents_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_designercomponents_private.pri"; sourceTree = "<absolute>"; };
|
||||
6C08BFC27C4C303A3A5181DB /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_printsupport.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_printsupport.pri"; sourceTree = "<absolute>"; };
|
||||
6E67D23B15FC4B628DB2E0B2 /* /usr/local/Qt-5.5.1/mkspecs/qdevice.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/qdevice.pri"; sourceTree = "<absolute>"; };
|
||||
74C1C232DFAA71028A0412CA /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qtmultimedia_m3u.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qtmultimedia_m3u.pri"; sourceTree = "<absolute>"; };
|
||||
77FF486B1F9BCD55A8A3F35D /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_concurrent.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_concurrent.pri"; sourceTree = "<absolute>"; };
|
||||
7A94C7168B3FCBE5F04A013B /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_declarative.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_declarative.pri"; sourceTree = "<absolute>"; };
|
||||
7C2F42B222EE88E26A6FED62 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_designer_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_designer_private.pri"; sourceTree = "<absolute>"; };
|
||||
7D28E9003CE64D8A7F2E292E /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_concurrent_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_concurrent_private.pri"; sourceTree = "<absolute>"; };
|
||||
7DE30A90667C03C4F91A2A91 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_sql.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_sql.pri"; sourceTree = "<absolute>"; };
|
||||
7ECCC1F9442988B4F2707CC1 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_core.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_core.pri"; sourceTree = "<absolute>"; };
|
||||
817A0F5A41B553A6DE67FDEB /* /usr/local/Qt-5.5.1/mkspecs/common/macx.conf */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/common/macx.conf"; sourceTree = "<absolute>"; };
|
||||
82E7DCFD95559532D8FC6CDD /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_quickparticles_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_quickparticles_private.pri"; sourceTree = "<absolute>"; };
|
||||
83D37373949868693FB7816D /* qmng */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = qmng; path = "/usr/local/Qt-5.5.1/plugins/imageformats/libqmng$(QT_LIBRARY_SUFFIX).a"; sourceTree = "<absolute>"; };
|
||||
83D37373949868693FB7816D /* qmng */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = qmng; path = "$(QT_PATH)/plugins/imageformats/libqmng$(QT_LIBRARY_SUFFIX).a"; sourceTree = "<absolute>"; };
|
||||
83FFCB79DDEB015B4A5CB301 /* MetaLang.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = MetaLang.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
85061B1DA49D125991117950 /* /usr/local/Qt-5.5.1/mkspecs/macx-xcode/qmake.conf */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/macx-xcode/qmake.conf"; sourceTree = "<absolute>"; };
|
||||
85B6936EDBE61D9BB8F8B33B /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_sensors.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_sensors.pri"; sourceTree = "<absolute>"; };
|
||||
87A4C1983FD641360BF80A02 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qtaccessiblewidgets.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qtaccessiblewidgets.pri"; sourceTree = "<absolute>"; };
|
||||
87EEF25EE25CF21572D1438C /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_websockets_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_websockets_private.pri"; sourceTree = "<absolute>"; };
|
||||
8849E60AEC7DB97A475C17EA /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_testlib_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_testlib_private.pri"; sourceTree = "<absolute>"; };
|
||||
892D36BEF797BA4AF48D378A /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qtsensors_dummy.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qtsensors_dummy.pri"; sourceTree = "<absolute>"; };
|
||||
89863CCAF1D29037AE95755D /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_declarative_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_declarative_private.pri"; sourceTree = "<absolute>"; };
|
||||
8A04A4A3625204D12A1207F6 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_nfc.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_nfc.pri"; sourceTree = "<absolute>"; };
|
||||
8B4BB4E74F8A4442EF563D7D /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qtsensorgestures_shakeplugin.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qtsensorgestures_shakeplugin.pri"; sourceTree = "<absolute>"; };
|
||||
8C31D89BDFCDF466DAED19A0 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_quick_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_quick_private.pri"; sourceTree = "<absolute>"; };
|
||||
8C5164D4E37556D40C5E6AA2 /* /usr/local/Qt-5.5.1/mkspecs/common/clang.conf */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/common/clang.conf"; sourceTree = "<absolute>"; };
|
||||
8CF51323544B886B8F4A2232 /* qwbmp */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = qwbmp; path = "/usr/local/Qt-5.5.1/plugins/imageformats/libqwbmp$(QT_LIBRARY_SUFFIX).a"; sourceTree = "<absolute>"; };
|
||||
8CF51323544B886B8F4A2232 /* qwbmp */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = qwbmp; path = "$(QT_PATH)/plugins/imageformats/libqwbmp$(QT_LIBRARY_SUFFIX).a"; sourceTree = "<absolute>"; };
|
||||
8D9815BDB5BD9F90D2BC05C5 /* AGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AGL.framework; path = /System/Library/Frameworks/AGL.framework; sourceTree = "<absolute>"; };
|
||||
8DDE1D26B3206CDB8B57FABE /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_svg_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_svg_private.pri"; sourceTree = "<absolute>"; };
|
||||
8E9136256AFFBA6EF048AA55 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_widgets_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_widgets_private.pri"; sourceTree = "<absolute>"; };
|
||||
8F500B5166907B6D9A7C3E3D /* qico */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = qico; path = "/usr/local/Qt-5.5.1/plugins/imageformats/libqico$(QT_LIBRARY_SUFFIX).a"; sourceTree = "<absolute>"; };
|
||||
8F572030CE9AB8CC5F672201 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_platformsupport_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_platformsupport_private.pri"; sourceTree = "<absolute>"; };
|
||||
8F97C9CAE38CA3AFAC0B3953 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_websockets.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_websockets.pri"; sourceTree = "<absolute>"; };
|
||||
946BEA667170DC1A7A8F9DB0 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qmng.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qmng.pri"; sourceTree = "<absolute>"; };
|
||||
8F500B5166907B6D9A7C3E3D /* qico */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = qico; path = "$(QT_PATH)/plugins/imageformats/libqico$(QT_LIBRARY_SUFFIX).a"; sourceTree = "<absolute>"; };
|
||||
9742F24EE18EA44D52824F1E /* CoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreServices.framework; path = /System/Library/Frameworks/CoreServices.framework; sourceTree = "<absolute>"; };
|
||||
9A0BDF67E013BB4FFB8685B0 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qqt7engine.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qqt7engine.pri"; sourceTree = "<absolute>"; };
|
||||
9DFF62A901D70814B8A323D4 /* Carbon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = /System/Library/Frameworks/Carbon.framework; sourceTree = "<absolute>"; };
|
||||
A022AF919D1977534CA66BB8 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_widgets.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_widgets.pri"; sourceTree = "<absolute>"; };
|
||||
A1A67BEAA744704B29168D39 /* IOKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = /System/Library/Frameworks/IOKit.framework; sourceTree = "<absolute>"; };
|
||||
A4D8AC60897F435C1C3B9D02 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qtsensors_generic.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qtsensors_generic.pri"; sourceTree = "<absolute>"; };
|
||||
A59F74CD76FDC2B4B9910E18 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_scripttools_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_scripttools_private.pri"; sourceTree = "<absolute>"; };
|
||||
A5B17ABEFBA1C2F43443D644 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_macextras.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_macextras.pri"; sourceTree = "<absolute>"; };
|
||||
A83296E7180A28ABB0FD85D2 /* mlmain.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = mlmain.cpp; path = SourceFiles/_other/mlmain.cpp; sourceTree = "<absolute>"; };
|
||||
A9E30FA27827990C5F182223 /* /usr/local/Qt-5.5.1/mkspecs/common/gcc-base-mac.conf */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/common/gcc-base-mac.conf"; sourceTree = "<absolute>"; };
|
||||
AA73DC3C2901E2979FE8AD5B /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_xml.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_xml.pri"; sourceTree = "<absolute>"; };
|
||||
AB1C02DDBD8E88DD9A9AFDDD /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qtsensorgestures_plugin.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qtsensorgestures_plugin.pri"; sourceTree = "<absolute>"; };
|
||||
AB745978DF0F41D1801ABDA6 /* .qmake.stash */ = {isa = PBXFileReference; lastKnownFileType = file; path = .qmake.stash; sourceTree = "<absolute>"; };
|
||||
ABA9AB4619F09DCFD2D4A27F /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_qmltest_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_qmltest_private.pri"; sourceTree = "<absolute>"; };
|
||||
ACC8A73268E5D9AF64E97AF4 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_bluetooth.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_bluetooth.pri"; sourceTree = "<absolute>"; };
|
||||
ADC6308023253CEA51F86E21 /* qwebp */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = qwebp; path = "/usr/local/Qt-5.5.1/plugins/imageformats/libqwebp$(QT_LIBRARY_SUFFIX).a"; sourceTree = "<absolute>"; };
|
||||
ADFC79902C14A612AE93A89A /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_svg.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_svg.pri"; sourceTree = "<absolute>"; };
|
||||
ADC6308023253CEA51F86E21 /* qwebp */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = qwebp; path = "$(QT_PATH)/plugins/imageformats/libqwebp$(QT_LIBRARY_SUFFIX).a"; sourceTree = "<absolute>"; };
|
||||
AEA456A2F75ED9F5CDA7BCBE /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = "<absolute>"; };
|
||||
AFD721AA33A2F785E77B1698 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qcocoa.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qcocoa.pri"; sourceTree = "<absolute>"; };
|
||||
B064BF3B496A7BF7A449CA1E /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qsqlite.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qsqlite.pri"; sourceTree = "<absolute>"; };
|
||||
B2246267D4C0D789259A86B0 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_quickwidgets_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_quickwidgets_private.pri"; sourceTree = "<absolute>"; };
|
||||
B26239063A068F800A2C95F4 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qwebp.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qwebp.pri"; sourceTree = "<absolute>"; };
|
||||
B382B645B34234E451AE5D94 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_qml.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_qml.pri"; sourceTree = "<absolute>"; };
|
||||
B518DA4EE7376002AFC71FD5 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_uitools_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_uitools_private.pri"; sourceTree = "<absolute>"; };
|
||||
B51B01657BFE9EAEF5590561 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_nfc_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_nfc_private.pri"; sourceTree = "<absolute>"; };
|
||||
B678DA730B4ECE863AD631AE /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qminimal.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qminimal.pri"; sourceTree = "<absolute>"; };
|
||||
B8525798C5AA7D7C6D68E1B3 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qmldbg_qtquick2.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qmldbg_qtquick2.pri"; sourceTree = "<absolute>"; };
|
||||
B8C1F6C965A7A14FBA8D4518 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qtmedia_audioengine.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qtmedia_audioengine.pri"; sourceTree = "<absolute>"; };
|
||||
BD22EFEFCC02644B1883CE19 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qtiff.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qtiff.pri"; sourceTree = "<absolute>"; };
|
||||
BD4D97801B547471B37A4CDC /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_bootstrap_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_bootstrap_private.pri"; sourceTree = "<absolute>"; };
|
||||
BDC9ECADEE40D11E3C2EA93F /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_sensors_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_sensors_private.pri"; sourceTree = "<absolute>"; };
|
||||
BFF0C38FB0EC140C5F0304AE /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_serialport.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_serialport.pri"; sourceTree = "<absolute>"; };
|
||||
C4295BE59CCEBCDD16268349 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qico.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qico.pri"; sourceTree = "<absolute>"; };
|
||||
C505A18319B9B63C63877858 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_script_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_script_private.pri"; sourceTree = "<absolute>"; };
|
||||
C84546C18DCBB04166195DCF /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qtposition_positionpoll.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qtposition_positionpoll.pri"; sourceTree = "<absolute>"; };
|
||||
CCF75CFFB857487FB18F99F9 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qoffscreen.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qoffscreen.pri"; sourceTree = "<absolute>"; };
|
||||
CE829DD126DD2B97E8D70A7A /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_scripttools.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_scripttools.pri"; sourceTree = "<absolute>"; };
|
||||
CF86CD5BB01B9011E6B6FD3E /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_clucene_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_clucene_private.pri"; sourceTree = "<absolute>"; };
|
||||
CFCB992BEC24B71BFB8A2F30 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_script.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_script.pri"; sourceTree = "<absolute>"; };
|
||||
CFFBE05DB004895080314289 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qsvgicon.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qsvgicon.pri"; sourceTree = "<absolute>"; };
|
||||
D0CDC87DAFDA7F18A7AF450F /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_printsupport_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_printsupport_private.pri"; sourceTree = "<absolute>"; };
|
||||
D1FA7CAB5ACC09D563AE569F /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_multimediawidgets_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_multimediawidgets_private.pri"; sourceTree = "<absolute>"; };
|
||||
D2FE4D909926A0D1656068C4 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_multimedia.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_multimedia.pri"; sourceTree = "<absolute>"; };
|
||||
D3D1BE0BEA3AEE0551AD39AC /* qdds */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = qdds; path = "/usr/local/Qt-5.5.1/plugins/imageformats/libqdds$(QT_LIBRARY_SUFFIX).a"; sourceTree = "<absolute>"; };
|
||||
D3D1BE0BEA3AEE0551AD39AC /* qdds */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = qdds; path = "$(QT_PATH)/plugins/imageformats/libqdds$(QT_LIBRARY_SUFFIX).a"; sourceTree = "<absolute>"; };
|
||||
D4B32C2222F82AC56BADEB21 /* OpenGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGL.framework; path = /System/Library/Frameworks/OpenGL.framework; sourceTree = "<absolute>"; };
|
||||
D4DE537C1FBBD48BD989FAD1 /* /usr/local/Qt-5.5.1/mkspecs/qconfig.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/qconfig.pri"; sourceTree = "<absolute>"; };
|
||||
D5141F795670589C8CC41CBC /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_cocoaprintersupport.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_cocoaprintersupport.pri"; sourceTree = "<absolute>"; };
|
||||
D53D8E6A188E05078A114294 /* qcocoa */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = qcocoa; path = "/usr/local/Qt-5.5.1/plugins/platforms/libqcocoa$(QT_LIBRARY_SUFFIX).a"; sourceTree = "<absolute>"; };
|
||||
D6193B79CECC9DD0142D1200 /* qtharfbuzzng */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = qtharfbuzzng; path = "/usr/local/Qt-5.5.1/lib/libqtharfbuzzng$(QT_LIBRARY_SUFFIX).a"; sourceTree = "<absolute>"; };
|
||||
D7A0618DE39A427EBF41940E /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_help_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_help_private.pri"; sourceTree = "<absolute>"; };
|
||||
D53D8E6A188E05078A114294 /* qcocoa */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = qcocoa; path = "$(QT_PATH)/plugins/platforms/libqcocoa$(QT_LIBRARY_SUFFIX).a"; sourceTree = "<absolute>"; };
|
||||
D6193B79CECC9DD0142D1200 /* qtharfbuzzng */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = qtharfbuzzng; path = "$(QT_PATH)/lib/libqtharfbuzzng$(QT_LIBRARY_SUFFIX).a"; sourceTree = "<absolute>"; };
|
||||
D7D645CBFF3B86CF39CEF3DA /* mlmain.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = mlmain.h; path = SourceFiles/_other/mlmain.h; sourceTree = "<absolute>"; };
|
||||
D81E3D9A18202BE8EC3D0E2C /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_gui_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_gui_private.pri"; sourceTree = "<absolute>"; };
|
||||
D948D4D8F949D45158F8DE35 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_quickwidgets.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_quickwidgets.pri"; sourceTree = "<absolute>"; };
|
||||
DB0A26DDC377B2004F61BFE3 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_testlib.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_testlib.pri"; sourceTree = "<absolute>"; };
|
||||
DBF506D10449BFABD45B82DA /* Qt5PrintSupport */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = Qt5PrintSupport; path = "/usr/local/Qt-5.5.1/lib/libQt5PrintSupport$(QT_LIBRARY_SUFFIX).a"; sourceTree = "<absolute>"; };
|
||||
DCEFD9167C239650120B0145 /* qtga */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = qtga; path = "/usr/local/Qt-5.5.1/plugins/imageformats/libqtga$(QT_LIBRARY_SUFFIX).a"; sourceTree = "<absolute>"; };
|
||||
DF8188E30892A4654B984221 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_qmltest.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_qmltest.pri"; sourceTree = "<absolute>"; };
|
||||
DBF506D10449BFABD45B82DA /* Qt5PrintSupport */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = Qt5PrintSupport; path = "$(QT_PATH)/lib/libQt5PrintSupport$(QT_LIBRARY_SUFFIX).a"; sourceTree = "<absolute>"; };
|
||||
DCEFD9167C239650120B0145 /* qtga */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = qtga; path = "$(QT_PATH)/plugins/imageformats/libqtga$(QT_LIBRARY_SUFFIX).a"; sourceTree = "<absolute>"; };
|
||||
DFD7912080BC557230093752 /* ApplicationServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ApplicationServices.framework; path = /System/Library/Frameworks/ApplicationServices.framework; sourceTree = "<absolute>"; };
|
||||
E0F4563EA350EB65112A0EF4 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_opengl_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_opengl_private.pri"; sourceTree = "<absolute>"; };
|
||||
E37365B4489B4918BEBB707D /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_xml_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_xml_private.pri"; sourceTree = "<absolute>"; };
|
||||
E432DA897A5F027987342E8F /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_openglextensions.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_openglextensions.pri"; sourceTree = "<absolute>"; };
|
||||
E50FA73B8A23BC179A642B27 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_uitools.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_uitools.pri"; sourceTree = "<absolute>"; };
|
||||
E66B9EC81C285CA9A7FB6A2E /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_positioning_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_positioning_private.pri"; sourceTree = "<absolute>"; };
|
||||
E7B2F248E3F7970788F35BF5 /* Qt5PlatformSupport */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = Qt5PlatformSupport; path = "/usr/local/Qt-5.5.1/lib/libQt5PlatformSupport$(QT_LIBRARY_SUFFIX).a"; sourceTree = "<absolute>"; };
|
||||
E7D67CB158408BB7DEA74764 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_multimedia_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_multimedia_private.pri"; sourceTree = "<absolute>"; };
|
||||
EA5D4FF9DE4AC4215D7DCE0D /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qcorewlanbearer.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qcorewlanbearer.pri"; sourceTree = "<absolute>"; };
|
||||
EB1F99FD112917157F3C3F6E /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qicns.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qicns.pri"; sourceTree = "<absolute>"; };
|
||||
EB29AC635054C09EFA749AE1 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qmldbg_tcp.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qmldbg_tcp.pri"; sourceTree = "<absolute>"; };
|
||||
EBD39B69F368CEEAC360A16D /* /usr/local/Qt-5.5.1/mkspecs/common/mac.conf */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/common/mac.conf"; sourceTree = "<absolute>"; };
|
||||
F0681BC551FC8A2B132FC646 /* qjp2 */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = qjp2; path = "/usr/local/Qt-5.5.1/plugins/imageformats/libqjp2$(QT_LIBRARY_SUFFIX).a"; sourceTree = "<absolute>"; };
|
||||
F0A58515945747E36783CC21 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qmldbg_inspector.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qmldbg_inspector.pri"; sourceTree = "<absolute>"; };
|
||||
F2453BA07315EB9F34F1CD57 /* qtiff */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = qtiff; path = "/usr/local/Qt-5.5.1/plugins/imageformats/libqtiff$(QT_LIBRARY_SUFFIX).a"; sourceTree = "<absolute>"; };
|
||||
F2F823087EA182CCBD5748B8 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_designer.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_designer.pri"; sourceTree = "<absolute>"; };
|
||||
F33BE16353DD1557A9AB3558 /* /usr/local/Qt-5.5.1/mkspecs/common/clang-mac.conf */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/common/clang-mac.conf"; sourceTree = "<absolute>"; };
|
||||
F4EB01857048DCFCFFAAC4D0 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qavfmediaplayer.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qavfmediaplayer.pri"; sourceTree = "<absolute>"; };
|
||||
F7ADBF552F6B9A5982915164 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_positioning.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_positioning.pri"; sourceTree = "<absolute>"; };
|
||||
F83F87F8A60C9DF666911D42 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qsvg.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qsvg.pri"; sourceTree = "<absolute>"; };
|
||||
F9BEAA743A908603687DA204 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_xmlpatterns_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_xmlpatterns_private.pri"; sourceTree = "<absolute>"; };
|
||||
E7B2F248E3F7970788F35BF5 /* Qt5PlatformSupport */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = Qt5PlatformSupport; path = "$(QT_PATH)/lib/libQt5PlatformSupport$(QT_LIBRARY_SUFFIX).a"; sourceTree = "<absolute>"; };
|
||||
F0681BC551FC8A2B132FC646 /* qjp2 */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = qjp2; path = "$(QT_PATH)/plugins/imageformats/libqjp2$(QT_LIBRARY_SUFFIX).a"; sourceTree = "<absolute>"; };
|
||||
F2453BA07315EB9F34F1CD57 /* qtiff */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = qtiff; path = "$(QT_PATH)/plugins/imageformats/libqtiff$(QT_LIBRARY_SUFFIX).a"; sourceTree = "<absolute>"; };
|
||||
FCC237CA5AD60B9BA4447615 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = "<absolute>"; };
|
||||
FD944B80F033DFE737D401A2 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_help.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_help.pri"; sourceTree = "<absolute>"; };
|
||||
/* End PBXFileReference section */
|
||||
|
||||
/* Begin PBXFrameworksBuildPhase section */
|
||||
|
@ -242,8 +119,6 @@
|
|||
A9563D9C9FD0D76FAAF1CA96 /* qdds in Link Binary With Libraries */,
|
||||
7CA5405B8503BFFC60932D2B /* qicns in Link Binary With Libraries */,
|
||||
496FD9CEEB508016AFB9F928 /* qico in Link Binary With Libraries */,
|
||||
59789101736112A570B8EFE6 /* qjp2 in Link Binary With Libraries */,
|
||||
FBD56E2AC34F76BFFDB68619 /* qmng in Link Binary With Libraries */,
|
||||
7F76437B577F737145996DC3 /* qtga in Link Binary With Libraries */,
|
||||
C06DDE378A7AC1FA9E6FF69A /* qtiff in Link Binary With Libraries */,
|
||||
A3F8F2284013928A02AE5C38 /* qwbmp in Link Binary With Libraries */,
|
||||
|
@ -251,6 +126,7 @@
|
|||
9F33AC0693BC81B27D8F518D /* Qt5Gui in Link Binary With Libraries */,
|
||||
8D33FE22B9BBADC7FA46C15B /* qtharfbuzzng in Link Binary With Libraries */,
|
||||
07D7954A1B5544B200DE9598 /* qtpcre in Link Binary With Libraries */,
|
||||
0785004D1CCA847400168DBB /* libqtfreetype.a in Link Binary With Libraries */,
|
||||
B9ADD90C014EA3FBE351DF03 /* Qt5Core in Link Binary With Libraries */,
|
||||
);
|
||||
name = "Link Binary With Libraries";
|
||||
|
@ -294,136 +170,6 @@
|
|||
name = SourceFiles;
|
||||
sourceTree = "<Group>";
|
||||
};
|
||||
74B182DB50CB5611B5C1C297 /* Supporting Files */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
33A9E861B2FAD8C39E154E7C /* MetaLang.pro */,
|
||||
6E67D23B15FC4B628DB2E0B2 /* /usr/local/Qt-5.5.1/mkspecs/qdevice.pri */,
|
||||
669FB007C4A3D58424D85EC8 /* /usr/local/Qt-5.5.1/mkspecs/common/shell-unix.conf */,
|
||||
0ABCEA8D0DD45589040B0AF2 /* /usr/local/Qt-5.5.1/mkspecs/common/unix.conf */,
|
||||
EBD39B69F368CEEAC360A16D /* /usr/local/Qt-5.5.1/mkspecs/common/mac.conf */,
|
||||
817A0F5A41B553A6DE67FDEB /* /usr/local/Qt-5.5.1/mkspecs/common/macx.conf */,
|
||||
45B95DB3B70B47A910FC847B /* /usr/local/Qt-5.5.1/mkspecs/common/gcc-base.conf */,
|
||||
A9E30FA27827990C5F182223 /* /usr/local/Qt-5.5.1/mkspecs/common/gcc-base-mac.conf */,
|
||||
8C5164D4E37556D40C5E6AA2 /* /usr/local/Qt-5.5.1/mkspecs/common/clang.conf */,
|
||||
F33BE16353DD1557A9AB3558 /* /usr/local/Qt-5.5.1/mkspecs/common/clang-mac.conf */,
|
||||
D4DE537C1FBBD48BD989FAD1 /* /usr/local/Qt-5.5.1/mkspecs/qconfig.pri */,
|
||||
ACC8A73268E5D9AF64E97AF4 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_bluetooth.pri */,
|
||||
2E48BB382B895A5ACD79AF9F /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_bluetooth_private.pri */,
|
||||
BD4D97801B547471B37A4CDC /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_bootstrap_private.pri */,
|
||||
CF86CD5BB01B9011E6B6FD3E /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_clucene_private.pri */,
|
||||
77FF486B1F9BCD55A8A3F35D /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_concurrent.pri */,
|
||||
7D28E9003CE64D8A7F2E292E /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_concurrent_private.pri */,
|
||||
7ECCC1F9442988B4F2707CC1 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_core.pri */,
|
||||
5F781C7FD8422D359EA1D2FE /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_core_private.pri */,
|
||||
7A94C7168B3FCBE5F04A013B /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_declarative.pri */,
|
||||
89863CCAF1D29037AE95755D /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_declarative_private.pri */,
|
||||
F2F823087EA182CCBD5748B8 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_designer.pri */,
|
||||
7C2F42B222EE88E26A6FED62 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_designer_private.pri */,
|
||||
69347C39E4D922E94D0860BF /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_designercomponents_private.pri */,
|
||||
360D4B3ED25D126430DE27D4 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_enginio.pri */,
|
||||
4C6C71914B1926119120DACD /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_enginio_private.pri */,
|
||||
23BC8B0FC3279421D41CA268 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_gui.pri */,
|
||||
D81E3D9A18202BE8EC3D0E2C /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_gui_private.pri */,
|
||||
FD944B80F033DFE737D401A2 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_help.pri */,
|
||||
D7A0618DE39A427EBF41940E /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_help_private.pri */,
|
||||
A5B17ABEFBA1C2F43443D644 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_macextras.pri */,
|
||||
33F165B1DB8CBF182C56FAB5 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_macextras_private.pri */,
|
||||
D2FE4D909926A0D1656068C4 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_multimedia.pri */,
|
||||
E7D67CB158408BB7DEA74764 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_multimedia_private.pri */,
|
||||
28BD0D10214709D95B161E24 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_multimediawidgets.pri */,
|
||||
D1FA7CAB5ACC09D563AE569F /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_multimediawidgets_private.pri */,
|
||||
293C8DEEE270847AC20E70F9 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_network.pri */,
|
||||
382E89A91A34F7898C25FD0D /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_network_private.pri */,
|
||||
8A04A4A3625204D12A1207F6 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_nfc.pri */,
|
||||
B51B01657BFE9EAEF5590561 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_nfc_private.pri */,
|
||||
5CEA7A2DB2136425A88D1254 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_opengl.pri */,
|
||||
E0F4563EA350EB65112A0EF4 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_opengl_private.pri */,
|
||||
E432DA897A5F027987342E8F /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_openglextensions.pri */,
|
||||
5597304BEC94BFB9EAAEBC4B /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_openglextensions_private.pri */,
|
||||
8F572030CE9AB8CC5F672201 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_platformsupport_private.pri */,
|
||||
F7ADBF552F6B9A5982915164 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_positioning.pri */,
|
||||
E66B9EC81C285CA9A7FB6A2E /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_positioning_private.pri */,
|
||||
6C08BFC27C4C303A3A5181DB /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_printsupport.pri */,
|
||||
D0CDC87DAFDA7F18A7AF450F /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_printsupport_private.pri */,
|
||||
B382B645B34234E451AE5D94 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_qml.pri */,
|
||||
6102C69805B6398AF6FA5BEB /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_qml_private.pri */,
|
||||
4FB6657DA22BC68B819B64B3 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_qmldevtools_private.pri */,
|
||||
DF8188E30892A4654B984221 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_qmltest.pri */,
|
||||
ABA9AB4619F09DCFD2D4A27F /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_qmltest_private.pri */,
|
||||
5B22E9E4EE9AAE42ABC24AB3 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_qtmultimediaquicktools_private.pri */,
|
||||
16DD53E17C65AC8B450CC6C3 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_quick.pri */,
|
||||
8C31D89BDFCDF466DAED19A0 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_quick_private.pri */,
|
||||
82E7DCFD95559532D8FC6CDD /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_quickparticles_private.pri */,
|
||||
D948D4D8F949D45158F8DE35 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_quickwidgets.pri */,
|
||||
B2246267D4C0D789259A86B0 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_quickwidgets_private.pri */,
|
||||
CFCB992BEC24B71BFB8A2F30 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_script.pri */,
|
||||
C505A18319B9B63C63877858 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_script_private.pri */,
|
||||
CE829DD126DD2B97E8D70A7A /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_scripttools.pri */,
|
||||
A59F74CD76FDC2B4B9910E18 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_scripttools_private.pri */,
|
||||
85B6936EDBE61D9BB8F8B33B /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_sensors.pri */,
|
||||
BDC9ECADEE40D11E3C2EA93F /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_sensors_private.pri */,
|
||||
BFF0C38FB0EC140C5F0304AE /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_serialport.pri */,
|
||||
311004331A04F3D69C98643C /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_serialport_private.pri */,
|
||||
7DE30A90667C03C4F91A2A91 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_sql.pri */,
|
||||
075EB50EB07CF69FD62FB8DF /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_sql_private.pri */,
|
||||
ADFC79902C14A612AE93A89A /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_svg.pri */,
|
||||
8DDE1D26B3206CDB8B57FABE /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_svg_private.pri */,
|
||||
DB0A26DDC377B2004F61BFE3 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_testlib.pri */,
|
||||
8849E60AEC7DB97A475C17EA /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_testlib_private.pri */,
|
||||
E50FA73B8A23BC179A642B27 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_uitools.pri */,
|
||||
B518DA4EE7376002AFC71FD5 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_uitools_private.pri */,
|
||||
8F97C9CAE38CA3AFAC0B3953 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_websockets.pri */,
|
||||
87EEF25EE25CF21572D1438C /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_websockets_private.pri */,
|
||||
A022AF919D1977534CA66BB8 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_widgets.pri */,
|
||||
8E9136256AFFBA6EF048AA55 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_widgets_private.pri */,
|
||||
AA73DC3C2901E2979FE8AD5B /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_xml.pri */,
|
||||
E37365B4489B4918BEBB707D /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_xml_private.pri */,
|
||||
2E6D9B1D2743D24E31B0B284 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_xmlpatterns.pri */,
|
||||
F9BEAA743A908603687DA204 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_xmlpatterns_private.pri */,
|
||||
D5141F795670589C8CC41CBC /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_cocoaprintersupport.pri */,
|
||||
1FAE75C970AA73F2DEDDB508 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qavfcamera.pri */,
|
||||
F4EB01857048DCFCFFAAC4D0 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qavfmediaplayer.pri */,
|
||||
AFD721AA33A2F785E77B1698 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qcocoa.pri */,
|
||||
EA5D4FF9DE4AC4215D7DCE0D /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qcorewlanbearer.pri */,
|
||||
111BBEE3D1432C3B517FD539 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qdds.pri */,
|
||||
3685604BDB64DD6E92169B73 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qdeclarativeview.pri */,
|
||||
2440CD1D4CEF80443BCA1B8B /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qgenericbearer.pri */,
|
||||
EB1F99FD112917157F3C3F6E /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qicns.pri */,
|
||||
C4295BE59CCEBCDD16268349 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qico.pri */,
|
||||
45DB132B756499D4DF38430E /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qjp2.pri */,
|
||||
B678DA730B4ECE863AD631AE /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qminimal.pri */,
|
||||
F0A58515945747E36783CC21 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qmldbg_inspector.pri */,
|
||||
B8525798C5AA7D7C6D68E1B3 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qmldbg_qtquick2.pri */,
|
||||
EB29AC635054C09EFA749AE1 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qmldbg_tcp.pri */,
|
||||
3F08D430CEC8D2117735CCB4 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qmldbg_tcp_qtdeclarative.pri */,
|
||||
946BEA667170DC1A7A8F9DB0 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qmng.pri */,
|
||||
CCF75CFFB857487FB18F99F9 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qoffscreen.pri */,
|
||||
9A0BDF67E013BB4FFB8685B0 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qqt7engine.pri */,
|
||||
B064BF3B496A7BF7A449CA1E /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qsqlite.pri */,
|
||||
F83F87F8A60C9DF666911D42 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qsvg.pri */,
|
||||
CFFBE05DB004895080314289 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qsvgicon.pri */,
|
||||
247D8DF3B1DDB665B80BBA25 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qtaccessiblequick.pri */,
|
||||
87A4C1983FD641360BF80A02 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qtaccessiblewidgets.pri */,
|
||||
24B6929EE3952310F2DAECB1 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qtaudio_coreaudio.pri */,
|
||||
060A694B42A4555240009936 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qtga.pri */,
|
||||
BD22EFEFCC02644B1883CE19 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qtiff.pri */,
|
||||
B8C1F6C965A7A14FBA8D4518 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qtmedia_audioengine.pri */,
|
||||
74C1C232DFAA71028A0412CA /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qtmultimedia_m3u.pri */,
|
||||
C84546C18DCBB04166195DCF /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qtposition_positionpoll.pri */,
|
||||
AB1C02DDBD8E88DD9A9AFDDD /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qtsensorgestures_plugin.pri */,
|
||||
8B4BB4E74F8A4442EF563D7D /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qtsensorgestures_shakeplugin.pri */,
|
||||
892D36BEF797BA4AF48D378A /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qtsensors_dummy.pri */,
|
||||
A4D8AC60897F435C1C3B9D02 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qtsensors_generic.pri */,
|
||||
346287C9E754E7C458153F03 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qwbmp.pri */,
|
||||
B26239063A068F800A2C95F4 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qwebp.pri */,
|
||||
63E722139886C87BC82DBDF5 /* /usr/local/Qt-5.5.1/mkspecs/macx-clang/qmake.conf */,
|
||||
85061B1DA49D125991117950 /* /usr/local/Qt-5.5.1/mkspecs/macx-xcode/qmake.conf */,
|
||||
AB745978DF0F41D1801ABDA6 /* .qmake.stash */,
|
||||
);
|
||||
name = "Supporting Files";
|
||||
sourceTree = "<Group>";
|
||||
};
|
||||
801973D3334D0FCA849CF485 /* Debug */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
|
@ -436,6 +182,7 @@
|
|||
isa = PBXGroup;
|
||||
children = (
|
||||
07D795491B5544B200DE9598 /* qtpcre */,
|
||||
0785004C1CCA847400168DBB /* libqtfreetype.a */,
|
||||
AEA456A2F75ED9F5CDA7BCBE /* Cocoa.framework */,
|
||||
DFD7912080BC557230093752 /* ApplicationServices.framework */,
|
||||
9742F24EE18EA44D52824F1E /* CoreServices.framework */,
|
||||
|
@ -478,7 +225,6 @@
|
|||
children = (
|
||||
2EB56BE3C2D93CDAB0C52E67 /* Sources */,
|
||||
25B08E2869634E9BCBA333A2 /* Generated Sources */,
|
||||
74B182DB50CB5611B5C1C297 /* Supporting Files */,
|
||||
AF39DD055C3EF8226FBE929D /* Frameworks */,
|
||||
FE0A091FDBFB3E9C31B7A1BD /* Products */,
|
||||
);
|
||||
|
@ -616,25 +362,22 @@
|
|||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
HEADER_SEARCH_PATHS = (
|
||||
../../Libraries/QtStatic/qtbase/include/QtGui/5.5.1/QtGui,
|
||||
../../Libraries/QtStatic/qtbase/include/QtCore/5.5.1/QtCore,
|
||||
../../Libraries/QtStatic/qtbase/include,
|
||||
"/usr/local/Qt-5.5.1/include",
|
||||
"/usr/local/Qt-5.5.1/include/QtGui",
|
||||
"/usr/local/Qt-5.5.1/include/QtCore",
|
||||
"$(QT_PATH)/include",
|
||||
"$(QT_PATH)/include/QtGui",
|
||||
"$(QT_PATH)/include/QtCore",
|
||||
GeneratedFiles/Debug,
|
||||
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/System/Library/Frameworks/OpenGL.framework/Versions/A/Headers,
|
||||
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/System/Library/Frameworks/AGL.framework/Headers,
|
||||
"/usr/local/Qt-5.5.1/mkspecs/macx-clang",
|
||||
"$(QT_PATH)/mkspecs/macx-clang",
|
||||
);
|
||||
INFOPLIST_FILE = Lang.plist;
|
||||
INSTALL_DIR = ../Mac/ReleaseLang/;
|
||||
LDPLUSPLUS = "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++";
|
||||
LIBRARY_SEARCH_PATHS = (
|
||||
/System/Library/Frameworks/,
|
||||
"/usr/local/Qt-5.5.1/lib",
|
||||
"/usr/local/Qt-5.5.1/plugins/platforms",
|
||||
"/usr/local/Qt-5.5.1/plugins/imageformats",
|
||||
"$(QT_PATH)/lib",
|
||||
"$(QT_PATH)/plugins/platforms",
|
||||
"$(QT_PATH)/plugins/imageformats",
|
||||
);
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.7;
|
||||
OBJROOT = ./../Mac/ReleaseIntermediateLang;
|
||||
|
@ -663,15 +406,16 @@
|
|||
OTHER_LDFLAGS = (
|
||||
"-headerpad_max_install_names",
|
||||
"-stdlib=libc++",
|
||||
"-L/usr/local/Qt-5.5.1/lib",
|
||||
"-L/usr/local/Qt-5.5.1/plugins/platforms",
|
||||
"-L$(QT_PATH)/lib",
|
||||
"-L$(QT_PATH)/plugins/platforms",
|
||||
"-lcups",
|
||||
"-L/usr/local/Qt-5.5.1/plugins/imageformats",
|
||||
"-L$(QT_PATH)/plugins/imageformats",
|
||||
"-lz",
|
||||
"-lm",
|
||||
);
|
||||
PRODUCT_NAME = MetaLang;
|
||||
QT_LIBRARY_SUFFIX = "";
|
||||
QT_PATH = "/usr/local/tdesktop/Qt-5.6.0";
|
||||
SDKROOT = macosx;
|
||||
SYMROOT = ./../Mac;
|
||||
};
|
||||
|
@ -707,25 +451,22 @@
|
|||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
HEADER_SEARCH_PATHS = (
|
||||
../../Libraries/QtStatic/qtbase/include/QtGui/5.5.1/QtGui,
|
||||
../../Libraries/QtStatic/qtbase/include/QtCore/5.5.1/QtCore,
|
||||
../../Libraries/QtStatic/qtbase/include,
|
||||
"/usr/local/Qt-5.5.1/include",
|
||||
"/usr/local/Qt-5.5.1/include/QtGui",
|
||||
"/usr/local/Qt-5.5.1/include/QtCore",
|
||||
"$(QT_PATH)/include",
|
||||
"$(QT_PATH)/include/QtGui",
|
||||
"$(QT_PATH)/include/QtCore",
|
||||
GeneratedFiles/Debug,
|
||||
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/System/Library/Frameworks/OpenGL.framework/Versions/A/Headers,
|
||||
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/System/Library/Frameworks/AGL.framework/Headers,
|
||||
"/usr/local/Qt-5.5.1/mkspecs/macx-clang",
|
||||
"$(QT_PATH)/mkspecs/macx-clang",
|
||||
);
|
||||
INFOPLIST_FILE = Lang.plist;
|
||||
INSTALL_DIR = ../Mac/DebugLang/;
|
||||
LDPLUSPLUS = "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++";
|
||||
LIBRARY_SEARCH_PATHS = (
|
||||
/System/Library/Frameworks/,
|
||||
"/usr/local/Qt-5.5.1/lib",
|
||||
"/usr/local/Qt-5.5.1/plugins/platforms",
|
||||
"/usr/local/Qt-5.5.1/plugins/imageformats",
|
||||
"$(QT_PATH)/lib",
|
||||
"$(QT_PATH)/plugins/platforms",
|
||||
"$(QT_PATH)/plugins/imageformats",
|
||||
);
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.7;
|
||||
OBJROOT = ./../Mac/DebugIntermediateLang;
|
||||
|
@ -755,15 +496,16 @@
|
|||
OTHER_LDFLAGS = (
|
||||
"-headerpad_max_install_names",
|
||||
"-stdlib=libc++",
|
||||
"-L/usr/local/Qt-5.5.1/lib",
|
||||
"-L/usr/local/Qt-5.5.1/plugins/platforms",
|
||||
"-L$(QT_PATH)/lib",
|
||||
"-L$(QT_PATH)/plugins/platforms",
|
||||
"-lcups",
|
||||
"-L/usr/local/Qt-5.5.1/plugins/imageformats",
|
||||
"-L$(QT_PATH)/plugins/imageformats",
|
||||
"-lz",
|
||||
"-lm",
|
||||
);
|
||||
PRODUCT_NAME = MetaLang;
|
||||
QT_LIBRARY_SUFFIX = _debug;
|
||||
QT_PATH = "/usr/local/tdesktop/Qt-5.6.0";
|
||||
SDKROOT = macosx;
|
||||
SYMROOT = ./../Mac;
|
||||
};
|
||||
|
@ -776,20 +518,18 @@
|
|||
COPY_PHASE_STRIP = YES;
|
||||
GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
|
||||
HEADER_SEARCH_PATHS = (
|
||||
./../../Libraries/QtStatic/qtbase/include/QtGui/5.5.1/QtGui,
|
||||
./../../Libraries/QtStatic/qtbase/include/QtCore/5.5.1/QtCore,
|
||||
./../../Libraries/QtStatic/qtbase/include,
|
||||
"/usr/local/Qt-5.5.1/include",
|
||||
"/usr/local/Qt-5.5.1/include/QtGui",
|
||||
"/usr/local/Qt-5.5.1/include/QtCore",
|
||||
"$(QT_PATH)/include",
|
||||
"$(QT_PATH)/include/QtGui",
|
||||
"$(QT_PATH)/include/QtCore",
|
||||
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/System/Library/Frameworks/OpenGL.framework/Versions/A/Headers,
|
||||
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/System/Library/Frameworks/AGL.framework/Headers,
|
||||
"/usr/local/Qt-5.5.1/mkspecs/macx-clang",
|
||||
"$(QT_PATH)/mkspecs/macx-clang",
|
||||
);
|
||||
INSTALL_DIR = ../Mac/ReleaseLang/;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = "com.tdesktop.${PRODUCT_NAME:rfc1034identifier}";
|
||||
PRODUCT_NAME = MetaLang;
|
||||
QT_LIBRARY_SUFFIX = "";
|
||||
QT_PATH = "/usr/local/tdesktop/Qt-5.6.0";
|
||||
SDKROOT = macosx;
|
||||
};
|
||||
name = Release;
|
||||
|
@ -803,20 +543,18 @@
|
|||
GCC_GENERATE_DEBUGGING_SYMBOLS = YES;
|
||||
GCC_OPTIMIZATION_LEVEL = 0;
|
||||
HEADER_SEARCH_PATHS = (
|
||||
./../../Libraries/QtStatic/qtbase/include/QtGui/5.5.1/QtGui,
|
||||
./../../Libraries/QtStatic/qtbase/include/QtCore/5.5.1/QtCore,
|
||||
./../../Libraries/QtStatic/qtbase/include,
|
||||
"/usr/local/Qt-5.5.1/include",
|
||||
"/usr/local/Qt-5.5.1/include/QtGui",
|
||||
"/usr/local/Qt-5.5.1/include/QtCore",
|
||||
"$(QT_PATH)/include",
|
||||
"$(QT_PATH)/include/QtGui",
|
||||
"$(QT_PATH)/include/QtCore",
|
||||
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/System/Library/Frameworks/OpenGL.framework/Versions/A/Headers,
|
||||
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/System/Library/Frameworks/AGL.framework/Headers,
|
||||
"/usr/local/Qt-5.5.1/mkspecs/macx-clang",
|
||||
"$(QT_PATH)/mkspecs/macx-clang",
|
||||
);
|
||||
INSTALL_DIR = ../Mac/DebugLang/;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = "com.tdesktop.${PRODUCT_NAME:rfc1034identifier}";
|
||||
PRODUCT_NAME = MetaLang;
|
||||
QT_LIBRARY_SUFFIX = _debug;
|
||||
QT_PATH = "/usr/local/tdesktop/Qt-5.6.0";
|
||||
SDKROOT = macosx;
|
||||
};
|
||||
name = Debug;
|
||||
|
|
|
@ -1,23 +1,33 @@
|
|||
#############################################################################
|
||||
# Makefile for building: ../Mac/DebugLang/MetaLang.app/Contents/MacOS/MetaLang
|
||||
# Generated by qmake (3.0) (Qt 5.5.1)
|
||||
# Project: MetaLang.pro
|
||||
# Template: app
|
||||
# Command: /usr/local/Qt-5.5.1/bin/qmake -spec macx-xcode -o MetaLang.xcodeproj/project.pbxproj MetaLang.pro
|
||||
# Initially generated by qmake
|
||||
#############################################################################
|
||||
|
||||
MAKEFILE = project.pbxproj
|
||||
|
||||
MOC = /usr/local/Qt-5.5.1/bin/moc
|
||||
UIC =
|
||||
QT_VER = 5.6.0
|
||||
QT_DIR = /usr/local/tdesktop/Qt-$(QT_VER)
|
||||
QT_MOC = $(QT_DIR)/bin/moc
|
||||
LEX = flex
|
||||
LEXFLAGS =
|
||||
YACC = yacc
|
||||
YACCFLAGS = -d
|
||||
DEFINES = -D_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB
|
||||
INCPATH = -I/usr/local/Qt-5.5.1/mkspecs/macx-clang -I. -I../../Libraries/QtStatic/qtbase/include/QtGui/5.5.1/QtGui -I../../Libraries/QtStatic/qtbase/include/QtCore/5.5.1/QtCore -I../../Libraries/QtStatic/qtbase/include -I/usr/local/Qt-5.5.1/include -I/usr/local/Qt-5.5.1/include/QtGui -I/usr/local/Qt-5.5.1/include/QtCore -IGeneratedFiles/Debug -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/System/Library/Frameworks/OpenGL.framework/Versions/A/Headers -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/System/Library/Frameworks/AGL.framework/Headers
|
||||
DEFINES = -D_DEBUG -DQT_WIDGETS_LIB -DQT_NETWORK_LIB -DQT_GUI_LIB -DQT_CORE_LIB -D__APPLE__ -D__GNUC__=4
|
||||
INCPATH = -I$(QT_DIR)/mkspecs/macx-clang\
|
||||
-I$(QT_DIR)/include/QtGui/$(QT_VER)/QtGui\
|
||||
-I$(QT_DIR)/include/QtCore/$(QT_VER)/QtCore\
|
||||
-I$(QT_VER)/include\
|
||||
-IGeneratedFiles/Debug\
|
||||
-I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/usr/include/c++/4.2.1/backward\
|
||||
-I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/usr/include/c++/4.2.1\
|
||||
-I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/usr/include\
|
||||
-I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/System/Library/Frameworks/OpenGL.framework/Versions/A/Headers\
|
||||
-I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/System/Library/Frameworks/AGL.framework/Headers\
|
||||
-I/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/5.1/include\
|
||||
-I/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include
|
||||
DEL_FILE = rm -f
|
||||
MOVE = mv -f
|
||||
MOC_FILE = $(QT_MOC) $(DEFINES) $(INCPATH)
|
||||
|
||||
IMAGES =
|
||||
PARSERS =
|
||||
|
@ -39,20 +49,8 @@ compiler_rcc_clean:
|
|||
compiler_moc_header_make_all: GeneratedFiles/Debug/moc_genlang.cpp
|
||||
compiler_moc_header_clean:
|
||||
-$(DEL_FILE) GeneratedFiles/Debug/moc_genlang.cpp
|
||||
GeneratedFiles/Debug/moc_genlang.cpp: ../../Libraries/QtStatic/qtbase/include/QtCore/QMap \
|
||||
../../Libraries/QtStatic/qtbase/include/QtCore/QVector \
|
||||
../../Libraries/QtStatic/qtbase/include/QtCore/QFile \
|
||||
../../Libraries/QtStatic/qtbase/include/QtCore/QDir \
|
||||
../../Libraries/QtStatic/qtbase/include/QtCore/QRegularExpression \
|
||||
../../Libraries/QtStatic/qtbase/include/QtGui/QImage \
|
||||
../../Libraries/QtStatic/qtbase/include/QtGui/QPixmap \
|
||||
../../Libraries/QtStatic/qtbase/include/QtGui/QPainter \
|
||||
../../Libraries/QtStatic/qtbase/include/QtCore/QTextStream \
|
||||
../../Libraries/QtStatic/qtbase/include/QtCore/QString \
|
||||
../../Libraries/QtStatic/qtbase/include/QtCore/QCoreApplication \
|
||||
../../Libraries/QtStatic/qtbase/include/QtGui/QGuiApplication \
|
||||
SourceFiles/_other/genlang.h
|
||||
/usr/local/Qt-5.5.1/bin/moc $(DEFINES) -D__APPLE__ -D__GNUC__=4 -I/usr/local/Qt-5.5.1/mkspecs/macx-clang -I. -I/usr/local/Qt-5.5.1/include/QtGui/5.5.1/QtGui -I/usr/local/Qt-5.5.1/include/QtCore/5.5.1/QtCore -I/usr/local/Qt-5.5.1/include -I/usr/local/Qt-5.5.1/include/QtGui -I/usr/local/Qt-5.5.1/include/QtCore -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/usr/include/c++/4.2.1 -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/usr/include/c++/4.2.1/backward -I/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/5.1/include -I/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/usr/include SourceFiles/_other/genlang.h -o GeneratedFiles/Debug/moc_genlang.cpp
|
||||
GeneratedFiles/Debug/moc_genlang.cpp: SourceFiles/_other/genlang.h
|
||||
$(MOC_FILE) SourceFiles/_other/genlang.h -o GeneratedFiles/Debug/moc_genlang.cpp
|
||||
|
||||
compiler_moc_source_make_all:
|
||||
compiler_moc_source_clean:
|
||||
|
|
|
@ -22,11 +22,11 @@
|
|||
|
||||
/* Begin PBXBuildFile section */
|
||||
07D7954A1B5544B200DE9598 /* qtpcre in Link Binary With Libraries */ = {isa = PBXBuildFile; fileRef = 07D795491B5544B200DE9598 /* qtpcre */; };
|
||||
0785004D1CCA847400168DBB /* libqtfreetype.a in Link Binary With Libraries */ = {isa = PBXBuildFile; fileRef = 0785004C1CCA847400168DBB /* libqtfreetype.a */; };
|
||||
1A681B886F50EE30FBE62B4B /* Qt5PrintSupport in Link Binary With Libraries */ = {isa = PBXBuildFile; fileRef = DBF506D10449BFABD45B82DA /* Qt5PrintSupport */; };
|
||||
1BB705CDB741E2B7450201A5 /* Cocoa.framework in Link Binary With Libraries */ = {isa = PBXBuildFile; fileRef = AEA456A2F75ED9F5CDA7BCBE /* Cocoa.framework */; };
|
||||
328FD74542F6E2C873EE4D4B /* ApplicationServices.framework in Link Binary With Libraries */ = {isa = PBXBuildFile; fileRef = DFD7912080BC557230093752 /* ApplicationServices.framework */; };
|
||||
496FD9CEEB508016AFB9F928 /* qico in Link Binary With Libraries */ = {isa = PBXBuildFile; fileRef = 8F500B5166907B6D9A7C3E3D /* qico */; };
|
||||
59789101736112A570B8EFE6 /* qjp2 in Link Binary With Libraries */ = {isa = PBXBuildFile; fileRef = F0681BC551FC8A2B132FC646 /* qjp2 */; };
|
||||
668DDDA0C55405E7FCFD6CA5 /* CoreServices.framework in Link Binary With Libraries */ = {isa = PBXBuildFile; fileRef = 9742F24EE18EA44D52824F1E /* CoreServices.framework */; };
|
||||
7CA5405B8503BFFC60932D2B /* qicns in Link Binary With Libraries */ = {isa = PBXBuildFile; fileRef = 31120EDB269DFF13E1D49847 /* qicns */; };
|
||||
7F76437B577F737145996DC3 /* qtga in Link Binary With Libraries */ = {isa = PBXBuildFile; fileRef = DCEFD9167C239650120B0145 /* qtga */; };
|
||||
|
@ -47,7 +47,6 @@
|
|||
F4D3747C3A03B25EDC9057BB /* qwebp in Link Binary With Libraries */ = {isa = PBXBuildFile; fileRef = ADC6308023253CEA51F86E21 /* qwebp */; };
|
||||
F8B465CE34D8DF87AAE95913 /* CoreFoundation.framework in Link Binary With Libraries */ = {isa = PBXBuildFile; fileRef = 4D765E1B1EA6C757220C63E7 /* CoreFoundation.framework */; };
|
||||
F8ED42CF8679BF83227DAFC4 /* Carbon.framework in Link Binary With Libraries */ = {isa = PBXBuildFile; fileRef = 9DFF62A901D70814B8A323D4 /* Carbon.framework */; };
|
||||
FBD56E2AC34F76BFFDB68619 /* qmng in Link Binary With Libraries */ = {isa = PBXBuildFile; fileRef = 83D37373949868693FB7816D /* qmng */; };
|
||||
/* End PBXBuildFile section */
|
||||
|
||||
/* Begin PBXContainerItemProxy section */
|
||||
|
@ -61,158 +60,36 @@
|
|||
/* End PBXContainerItemProxy section */
|
||||
|
||||
/* Begin PBXFileReference section */
|
||||
04391BE7A8B9D811E255100A /* Qt5Gui */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = Qt5Gui; path = "/usr/local/Qt-5.5.1/lib/libQt5Gui$(QT_LIBRARY_SUFFIX).a"; sourceTree = "<absolute>"; };
|
||||
060A694B42A4555240009936 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qtga.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qtga.pri"; sourceTree = "<absolute>"; };
|
||||
075EB50EB07CF69FD62FB8DF /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_sql_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_sql_private.pri"; sourceTree = "<absolute>"; };
|
||||
07D795491B5544B200DE9598 /* qtpcre */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = qtpcre; path = "usr/local/Qt-5.5.1/lib/libqtpcre$(QT_LIBRARY_SUFFIX).a"; sourceTree = "<group>"; };
|
||||
0ABCEA8D0DD45589040B0AF2 /* /usr/local/Qt-5.5.1/mkspecs/common/unix.conf */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/common/unix.conf"; sourceTree = "<absolute>"; };
|
||||
111BBEE3D1432C3B517FD539 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qdds.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qdds.pri"; sourceTree = "<absolute>"; };
|
||||
16DD53E17C65AC8B450CC6C3 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_quick.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_quick.pri"; sourceTree = "<absolute>"; };
|
||||
1FAE75C970AA73F2DEDDB508 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qavfcamera.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qavfcamera.pri"; sourceTree = "<absolute>"; };
|
||||
23BC8B0FC3279421D41CA268 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_gui.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_gui.pri"; sourceTree = "<absolute>"; };
|
||||
2440CD1D4CEF80443BCA1B8B /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qgenericbearer.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qgenericbearer.pri"; sourceTree = "<absolute>"; };
|
||||
247D8DF3B1DDB665B80BBA25 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qtaccessiblequick.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qtaccessiblequick.pri"; sourceTree = "<absolute>"; };
|
||||
24B6929EE3952310F2DAECB1 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qtaudio_coreaudio.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qtaudio_coreaudio.pri"; sourceTree = "<absolute>"; };
|
||||
28BD0D10214709D95B161E24 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_multimediawidgets.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_multimediawidgets.pri"; sourceTree = "<absolute>"; };
|
||||
293C8DEEE270847AC20E70F9 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_network.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_network.pri"; sourceTree = "<absolute>"; };
|
||||
2E48BB382B895A5ACD79AF9F /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_bluetooth_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_bluetooth_private.pri"; sourceTree = "<absolute>"; };
|
||||
2E6D9B1D2743D24E31B0B284 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_xmlpatterns.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_xmlpatterns.pri"; sourceTree = "<absolute>"; };
|
||||
311004331A04F3D69C98643C /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_serialport_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_serialport_private.pri"; sourceTree = "<absolute>"; };
|
||||
31120EDB269DFF13E1D49847 /* qicns */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = qicns; path = "/usr/local/Qt-5.5.1/plugins/imageformats/libqicns$(QT_LIBRARY_SUFFIX).a"; sourceTree = "<absolute>"; };
|
||||
33F165B1DB8CBF182C56FAB5 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_macextras_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_macextras_private.pri"; sourceTree = "<absolute>"; };
|
||||
346287C9E754E7C458153F03 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qwbmp.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qwbmp.pri"; sourceTree = "<absolute>"; };
|
||||
360D4B3ED25D126430DE27D4 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_enginio.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_enginio.pri"; sourceTree = "<absolute>"; };
|
||||
3685604BDB64DD6E92169B73 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qdeclarativeview.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qdeclarativeview.pri"; sourceTree = "<absolute>"; };
|
||||
382E89A91A34F7898C25FD0D /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_network_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_network_private.pri"; sourceTree = "<absolute>"; };
|
||||
3F08D430CEC8D2117735CCB4 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qmldbg_tcp_qtdeclarative.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qmldbg_tcp_qtdeclarative.pri"; sourceTree = "<absolute>"; };
|
||||
45B95DB3B70B47A910FC847B /* /usr/local/Qt-5.5.1/mkspecs/common/gcc-base.conf */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/common/gcc-base.conf"; sourceTree = "<absolute>"; };
|
||||
45DB132B756499D4DF38430E /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qjp2.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qjp2.pri"; sourceTree = "<absolute>"; };
|
||||
4689C06178B60B84E7F3A3B7 /* Qt5Widgets */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = Qt5Widgets; path = "/usr/local/Qt-5.5.1/lib/libQt5Widgets$(QT_LIBRARY_SUFFIX).a"; sourceTree = "<absolute>"; };
|
||||
4C6C71914B1926119120DACD /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_enginio_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_enginio_private.pri"; sourceTree = "<absolute>"; };
|
||||
04391BE7A8B9D811E255100A /* Qt5Gui */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = Qt5Gui; path = "$(QT_PATH)/lib/libQt5Gui$(QT_LIBRARY_SUFFIX).a"; sourceTree = "<absolute>"; };
|
||||
07D795491B5544B200DE9598 /* qtpcre */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = qtpcre; path = "$(QT_PATH)/lib/libqtpcre$(QT_LIBRARY_SUFFIX).a"; sourceTree = "<group>"; };
|
||||
0785004C1CCA847400168DBB /* libqtfreetype.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libqtfreetype.a; path = "$(QT_PATH)/lib/libqtfreetype$(QT_LIBRARY_SUFFIX).a"; sourceTree = "<group>"; };
|
||||
31120EDB269DFF13E1D49847 /* qicns */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = qicns; path = "$(QT_PATH)/plugins/imageformats/libqicns$(QT_LIBRARY_SUFFIX).a"; sourceTree = "<absolute>"; };
|
||||
4689C06178B60B84E7F3A3B7 /* Qt5Widgets */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = Qt5Widgets; path = "$(QT_PATH)/lib/libQt5Widgets$(QT_LIBRARY_SUFFIX).a"; sourceTree = "<absolute>"; };
|
||||
4D765E1B1EA6C757220C63E7 /* CoreFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreFoundation.framework; path = /System/Library/Frameworks/CoreFoundation.framework; sourceTree = "<absolute>"; };
|
||||
4FB6657DA22BC68B819B64B3 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_qmldevtools_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_qmldevtools_private.pri"; sourceTree = "<absolute>"; };
|
||||
5520A59148EC5EC44EF0D3CD /* Packer.pro */ = {isa = PBXFileReference; lastKnownFileType = text; path = Packer.pro; sourceTree = "<absolute>"; };
|
||||
5597304BEC94BFB9EAAEBC4B /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_openglextensions_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_openglextensions_private.pri"; sourceTree = "<absolute>"; };
|
||||
5A80A1907B6CFFB524C1E57D /* Qt5Core */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = Qt5Core; path = "/usr/local/Qt-5.5.1/lib/libQt5Core$(QT_LIBRARY_SUFFIX).a"; sourceTree = "<absolute>"; };
|
||||
5A80A1907B6CFFB524C1E57D /* Qt5Core */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = Qt5Core; path = "$(QT_PATH)/lib/libQt5Core$(QT_LIBRARY_SUFFIX).a"; sourceTree = "<absolute>"; };
|
||||
5AA25EFD83BC060B26945285 /* packer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = packer.h; path = SourceFiles/_other/packer.h; sourceTree = "<absolute>"; };
|
||||
5B22E9E4EE9AAE42ABC24AB3 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_qtmultimediaquicktools_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_qtmultimediaquicktools_private.pri"; sourceTree = "<absolute>"; };
|
||||
5CEA7A2DB2136425A88D1254 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_opengl.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_opengl.pri"; sourceTree = "<absolute>"; };
|
||||
5F781C7FD8422D359EA1D2FE /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_core_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_core_private.pri"; sourceTree = "<absolute>"; };
|
||||
6102C69805B6398AF6FA5BEB /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_qml_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_qml_private.pri"; sourceTree = "<absolute>"; };
|
||||
63E722139886C87BC82DBDF5 /* /usr/local/Qt-5.5.1/mkspecs/macx-clang/qmake.conf */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/macx-clang/qmake.conf"; sourceTree = "<absolute>"; };
|
||||
669FB007C4A3D58424D85EC8 /* /usr/local/Qt-5.5.1/mkspecs/common/shell-unix.conf */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/common/shell-unix.conf"; sourceTree = "<absolute>"; };
|
||||
69347C39E4D922E94D0860BF /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_designercomponents_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_designercomponents_private.pri"; sourceTree = "<absolute>"; };
|
||||
6C08BFC27C4C303A3A5181DB /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_printsupport.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_printsupport.pri"; sourceTree = "<absolute>"; };
|
||||
6E67D23B15FC4B628DB2E0B2 /* /usr/local/Qt-5.5.1/mkspecs/qdevice.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/qdevice.pri"; sourceTree = "<absolute>"; };
|
||||
74C1C232DFAA71028A0412CA /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qtmultimedia_m3u.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qtmultimedia_m3u.pri"; sourceTree = "<absolute>"; };
|
||||
77FF486B1F9BCD55A8A3F35D /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_concurrent.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_concurrent.pri"; sourceTree = "<absolute>"; };
|
||||
7A94C7168B3FCBE5F04A013B /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_declarative.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_declarative.pri"; sourceTree = "<absolute>"; };
|
||||
7C2F42B222EE88E26A6FED62 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_designer_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_designer_private.pri"; sourceTree = "<absolute>"; };
|
||||
7D28E9003CE64D8A7F2E292E /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_concurrent_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_concurrent_private.pri"; sourceTree = "<absolute>"; };
|
||||
7DE30A90667C03C4F91A2A91 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_sql.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_sql.pri"; sourceTree = "<absolute>"; };
|
||||
7ECCC1F9442988B4F2707CC1 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_core.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_core.pri"; sourceTree = "<absolute>"; };
|
||||
817A0F5A41B553A6DE67FDEB /* /usr/local/Qt-5.5.1/mkspecs/common/macx.conf */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/common/macx.conf"; sourceTree = "<absolute>"; };
|
||||
82E7DCFD95559532D8FC6CDD /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_quickparticles_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_quickparticles_private.pri"; sourceTree = "<absolute>"; };
|
||||
83D37373949868693FB7816D /* qmng */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = qmng; path = "/usr/local/Qt-5.5.1/plugins/imageformats/libqmng$(QT_LIBRARY_SUFFIX).a"; sourceTree = "<absolute>"; };
|
||||
85061B1DA49D125991117950 /* /usr/local/Qt-5.5.1/mkspecs/macx-xcode/qmake.conf */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/macx-xcode/qmake.conf"; sourceTree = "<absolute>"; };
|
||||
85B6936EDBE61D9BB8F8B33B /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_sensors.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_sensors.pri"; sourceTree = "<absolute>"; };
|
||||
87A4C1983FD641360BF80A02 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qtaccessiblewidgets.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qtaccessiblewidgets.pri"; sourceTree = "<absolute>"; };
|
||||
87EEF25EE25CF21572D1438C /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_websockets_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_websockets_private.pri"; sourceTree = "<absolute>"; };
|
||||
8849E60AEC7DB97A475C17EA /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_testlib_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_testlib_private.pri"; sourceTree = "<absolute>"; };
|
||||
892D36BEF797BA4AF48D378A /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qtsensors_dummy.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qtsensors_dummy.pri"; sourceTree = "<absolute>"; };
|
||||
89863CCAF1D29037AE95755D /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_declarative_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_declarative_private.pri"; sourceTree = "<absolute>"; };
|
||||
8A04A4A3625204D12A1207F6 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_nfc.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_nfc.pri"; sourceTree = "<absolute>"; };
|
||||
8B4BB4E74F8A4442EF563D7D /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qtsensorgestures_shakeplugin.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qtsensorgestures_shakeplugin.pri"; sourceTree = "<absolute>"; };
|
||||
8C31D89BDFCDF466DAED19A0 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_quick_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_quick_private.pri"; sourceTree = "<absolute>"; };
|
||||
8C5164D4E37556D40C5E6AA2 /* /usr/local/Qt-5.5.1/mkspecs/common/clang.conf */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/common/clang.conf"; sourceTree = "<absolute>"; };
|
||||
8CF51323544B886B8F4A2232 /* qwbmp */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = qwbmp; path = "/usr/local/Qt-5.5.1/plugins/imageformats/libqwbmp$(QT_LIBRARY_SUFFIX).a"; sourceTree = "<absolute>"; };
|
||||
83D37373949868693FB7816D /* qmng */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = qmng; path = "$(QT_PATH)/plugins/imageformats/libqmng$(QT_LIBRARY_SUFFIX).a"; sourceTree = "<absolute>"; };
|
||||
8CF51323544B886B8F4A2232 /* qwbmp */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = qwbmp; path = "$(QT_PATH)/plugins/imageformats/libqwbmp$(QT_LIBRARY_SUFFIX).a"; sourceTree = "<absolute>"; };
|
||||
8D9815BDB5BD9F90D2BC05C5 /* AGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AGL.framework; path = /System/Library/Frameworks/AGL.framework; sourceTree = "<absolute>"; };
|
||||
8DDE1D26B3206CDB8B57FABE /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_svg_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_svg_private.pri"; sourceTree = "<absolute>"; };
|
||||
8E9136256AFFBA6EF048AA55 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_widgets_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_widgets_private.pri"; sourceTree = "<absolute>"; };
|
||||
8F500B5166907B6D9A7C3E3D /* qico */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = qico; path = "/usr/local/Qt-5.5.1/plugins/imageformats/libqico$(QT_LIBRARY_SUFFIX).a"; sourceTree = "<absolute>"; };
|
||||
8F572030CE9AB8CC5F672201 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_platformsupport_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_platformsupport_private.pri"; sourceTree = "<absolute>"; };
|
||||
8F97C9CAE38CA3AFAC0B3953 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_websockets.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_websockets.pri"; sourceTree = "<absolute>"; };
|
||||
946BEA667170DC1A7A8F9DB0 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qmng.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qmng.pri"; sourceTree = "<absolute>"; };
|
||||
8F500B5166907B6D9A7C3E3D /* qico */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = qico; path = "$(QT_PATH)/plugins/imageformats/libqico$(QT_LIBRARY_SUFFIX).a"; sourceTree = "<absolute>"; };
|
||||
9742F24EE18EA44D52824F1E /* CoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreServices.framework; path = /System/Library/Frameworks/CoreServices.framework; sourceTree = "<absolute>"; };
|
||||
9A0BDF67E013BB4FFB8685B0 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qqt7engine.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qqt7engine.pri"; sourceTree = "<absolute>"; };
|
||||
9DFF62A901D70814B8A323D4 /* Carbon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = /System/Library/Frameworks/Carbon.framework; sourceTree = "<absolute>"; };
|
||||
A022AF919D1977534CA66BB8 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_widgets.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_widgets.pri"; sourceTree = "<absolute>"; };
|
||||
A1A67BEAA744704B29168D39 /* IOKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = /System/Library/Frameworks/IOKit.framework; sourceTree = "<absolute>"; };
|
||||
A4D8AC60897F435C1C3B9D02 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qtsensors_generic.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qtsensors_generic.pri"; sourceTree = "<absolute>"; };
|
||||
A5588D4B50885E2A9CAA5505 /* Packer.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Packer.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
A59F74CD76FDC2B4B9910E18 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_scripttools_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_scripttools_private.pri"; sourceTree = "<absolute>"; };
|
||||
A5B17ABEFBA1C2F43443D644 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_macextras.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_macextras.pri"; sourceTree = "<absolute>"; };
|
||||
A9E30FA27827990C5F182223 /* /usr/local/Qt-5.5.1/mkspecs/common/gcc-base-mac.conf */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/common/gcc-base-mac.conf"; sourceTree = "<absolute>"; };
|
||||
AA73DC3C2901E2979FE8AD5B /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_xml.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_xml.pri"; sourceTree = "<absolute>"; };
|
||||
AB1C02DDBD8E88DD9A9AFDDD /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qtsensorgestures_plugin.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qtsensorgestures_plugin.pri"; sourceTree = "<absolute>"; };
|
||||
AB745978DF0F41D1801ABDA6 /* .qmake.stash */ = {isa = PBXFileReference; lastKnownFileType = file; path = .qmake.stash; sourceTree = "<absolute>"; };
|
||||
ABA9AB4619F09DCFD2D4A27F /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_qmltest_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_qmltest_private.pri"; sourceTree = "<absolute>"; };
|
||||
ACC8A73268E5D9AF64E97AF4 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_bluetooth.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_bluetooth.pri"; sourceTree = "<absolute>"; };
|
||||
ADC6308023253CEA51F86E21 /* qwebp */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = qwebp; path = "/usr/local/Qt-5.5.1/plugins/imageformats/libqwebp$(QT_LIBRARY_SUFFIX).a"; sourceTree = "<absolute>"; };
|
||||
ADFC79902C14A612AE93A89A /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_svg.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_svg.pri"; sourceTree = "<absolute>"; };
|
||||
ADC6308023253CEA51F86E21 /* qwebp */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = qwebp; path = "$(QT_PATH)/plugins/imageformats/libqwebp$(QT_LIBRARY_SUFFIX).a"; sourceTree = "<absolute>"; };
|
||||
AEA456A2F75ED9F5CDA7BCBE /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = "<absolute>"; };
|
||||
AFD721AA33A2F785E77B1698 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qcocoa.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qcocoa.pri"; sourceTree = "<absolute>"; };
|
||||
B064BF3B496A7BF7A449CA1E /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qsqlite.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qsqlite.pri"; sourceTree = "<absolute>"; };
|
||||
B2246267D4C0D789259A86B0 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_quickwidgets_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_quickwidgets_private.pri"; sourceTree = "<absolute>"; };
|
||||
B26239063A068F800A2C95F4 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qwebp.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qwebp.pri"; sourceTree = "<absolute>"; };
|
||||
B382B645B34234E451AE5D94 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_qml.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_qml.pri"; sourceTree = "<absolute>"; };
|
||||
B518DA4EE7376002AFC71FD5 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_uitools_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_uitools_private.pri"; sourceTree = "<absolute>"; };
|
||||
B51B01657BFE9EAEF5590561 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_nfc_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_nfc_private.pri"; sourceTree = "<absolute>"; };
|
||||
B678DA730B4ECE863AD631AE /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qminimal.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qminimal.pri"; sourceTree = "<absolute>"; };
|
||||
B8525798C5AA7D7C6D68E1B3 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qmldbg_qtquick2.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qmldbg_qtquick2.pri"; sourceTree = "<absolute>"; };
|
||||
B8C1F6C965A7A14FBA8D4518 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qtmedia_audioengine.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qtmedia_audioengine.pri"; sourceTree = "<absolute>"; };
|
||||
BD22EFEFCC02644B1883CE19 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qtiff.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qtiff.pri"; sourceTree = "<absolute>"; };
|
||||
BD4D97801B547471B37A4CDC /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_bootstrap_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_bootstrap_private.pri"; sourceTree = "<absolute>"; };
|
||||
BDC9ECADEE40D11E3C2EA93F /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_sensors_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_sensors_private.pri"; sourceTree = "<absolute>"; };
|
||||
BFF0C38FB0EC140C5F0304AE /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_serialport.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_serialport.pri"; sourceTree = "<absolute>"; };
|
||||
C4295BE59CCEBCDD16268349 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qico.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qico.pri"; sourceTree = "<absolute>"; };
|
||||
C505A18319B9B63C63877858 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_script_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_script_private.pri"; sourceTree = "<absolute>"; };
|
||||
C84546C18DCBB04166195DCF /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qtposition_positionpoll.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qtposition_positionpoll.pri"; sourceTree = "<absolute>"; };
|
||||
CCF75CFFB857487FB18F99F9 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qoffscreen.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qoffscreen.pri"; sourceTree = "<absolute>"; };
|
||||
CE829DD126DD2B97E8D70A7A /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_scripttools.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_scripttools.pri"; sourceTree = "<absolute>"; };
|
||||
CF86CD5BB01B9011E6B6FD3E /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_clucene_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_clucene_private.pri"; sourceTree = "<absolute>"; };
|
||||
CFCB992BEC24B71BFB8A2F30 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_script.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_script.pri"; sourceTree = "<absolute>"; };
|
||||
CFFBE05DB004895080314289 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qsvgicon.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qsvgicon.pri"; sourceTree = "<absolute>"; };
|
||||
D0CDC87DAFDA7F18A7AF450F /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_printsupport_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_printsupport_private.pri"; sourceTree = "<absolute>"; };
|
||||
D1FA7CAB5ACC09D563AE569F /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_multimediawidgets_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_multimediawidgets_private.pri"; sourceTree = "<absolute>"; };
|
||||
D2FE4D909926A0D1656068C4 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_multimedia.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_multimedia.pri"; sourceTree = "<absolute>"; };
|
||||
D3D1BE0BEA3AEE0551AD39AC /* qdds */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = qdds; path = "/usr/local/Qt-5.5.1/plugins/imageformats/libqdds$(QT_LIBRARY_SUFFIX).a"; sourceTree = "<absolute>"; };
|
||||
D3D1BE0BEA3AEE0551AD39AC /* qdds */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = qdds; path = "$(QT_PATH)/plugins/imageformats/libqdds$(QT_LIBRARY_SUFFIX).a"; sourceTree = "<absolute>"; };
|
||||
D4B32C2222F82AC56BADEB21 /* OpenGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGL.framework; path = /System/Library/Frameworks/OpenGL.framework; sourceTree = "<absolute>"; };
|
||||
D4DE537C1FBBD48BD989FAD1 /* /usr/local/Qt-5.5.1/mkspecs/qconfig.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/qconfig.pri"; sourceTree = "<absolute>"; };
|
||||
D5141F795670589C8CC41CBC /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_cocoaprintersupport.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_cocoaprintersupport.pri"; sourceTree = "<absolute>"; };
|
||||
D53D8E6A188E05078A114294 /* qcocoa */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = qcocoa; path = "/usr/local/Qt-5.5.1/plugins/platforms/libqcocoa$(QT_LIBRARY_SUFFIX).a"; sourceTree = "<absolute>"; };
|
||||
D6193B79CECC9DD0142D1200 /* qtharfbuzzng */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = qtharfbuzzng; path = "/usr/local/Qt-5.5.1/lib/libqtharfbuzzng$(QT_LIBRARY_SUFFIX).a"; sourceTree = "<absolute>"; };
|
||||
D7A0618DE39A427EBF41940E /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_help_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_help_private.pri"; sourceTree = "<absolute>"; };
|
||||
D81E3D9A18202BE8EC3D0E2C /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_gui_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_gui_private.pri"; sourceTree = "<absolute>"; };
|
||||
D948D4D8F949D45158F8DE35 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_quickwidgets.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_quickwidgets.pri"; sourceTree = "<absolute>"; };
|
||||
DB0A26DDC377B2004F61BFE3 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_testlib.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_testlib.pri"; sourceTree = "<absolute>"; };
|
||||
DBF506D10449BFABD45B82DA /* Qt5PrintSupport */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = Qt5PrintSupport; path = "/usr/local/Qt-5.5.1/lib/libQt5PrintSupport$(QT_LIBRARY_SUFFIX).a"; sourceTree = "<absolute>"; };
|
||||
DCEFD9167C239650120B0145 /* qtga */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = qtga; path = "/usr/local/Qt-5.5.1/plugins/imageformats/libqtga$(QT_LIBRARY_SUFFIX).a"; sourceTree = "<absolute>"; };
|
||||
DF8188E30892A4654B984221 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_qmltest.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_qmltest.pri"; sourceTree = "<absolute>"; };
|
||||
D53D8E6A188E05078A114294 /* qcocoa */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = qcocoa; path = "$(QT_PATH)/plugins/platforms/libqcocoa$(QT_LIBRARY_SUFFIX).a"; sourceTree = "<absolute>"; };
|
||||
D6193B79CECC9DD0142D1200 /* qtharfbuzzng */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = qtharfbuzzng; path = "$(QT_PATH)/lib/libqtharfbuzzng$(QT_LIBRARY_SUFFIX).a"; sourceTree = "<absolute>"; };
|
||||
DBF506D10449BFABD45B82DA /* Qt5PrintSupport */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = Qt5PrintSupport; path = "$(QT_PATH)/lib/libQt5PrintSupport$(QT_LIBRARY_SUFFIX).a"; sourceTree = "<absolute>"; };
|
||||
DCEFD9167C239650120B0145 /* qtga */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = qtga; path = "$(QT_PATH)/plugins/imageformats/libqtga$(QT_LIBRARY_SUFFIX).a"; sourceTree = "<absolute>"; };
|
||||
DFD7912080BC557230093752 /* ApplicationServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ApplicationServices.framework; path = /System/Library/Frameworks/ApplicationServices.framework; sourceTree = "<absolute>"; };
|
||||
E0F4563EA350EB65112A0EF4 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_opengl_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_opengl_private.pri"; sourceTree = "<absolute>"; };
|
||||
E37365B4489B4918BEBB707D /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_xml_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_xml_private.pri"; sourceTree = "<absolute>"; };
|
||||
E3790AE49DBDB3F5EFA42FE1 /* packer.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = packer.cpp; path = SourceFiles/_other/packer.cpp; sourceTree = "<absolute>"; };
|
||||
E432DA897A5F027987342E8F /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_openglextensions.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_openglextensions.pri"; sourceTree = "<absolute>"; };
|
||||
E50FA73B8A23BC179A642B27 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_uitools.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_uitools.pri"; sourceTree = "<absolute>"; };
|
||||
E66B9EC81C285CA9A7FB6A2E /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_positioning_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_positioning_private.pri"; sourceTree = "<absolute>"; };
|
||||
E7B2F248E3F7970788F35BF5 /* Qt5PlatformSupport */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = Qt5PlatformSupport; path = "/usr/local/Qt-5.5.1/lib/libQt5PlatformSupport$(QT_LIBRARY_SUFFIX).a"; sourceTree = "<absolute>"; };
|
||||
E7D67CB158408BB7DEA74764 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_multimedia_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_multimedia_private.pri"; sourceTree = "<absolute>"; };
|
||||
EA5D4FF9DE4AC4215D7DCE0D /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qcorewlanbearer.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qcorewlanbearer.pri"; sourceTree = "<absolute>"; };
|
||||
EB1F99FD112917157F3C3F6E /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qicns.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qicns.pri"; sourceTree = "<absolute>"; };
|
||||
EB29AC635054C09EFA749AE1 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qmldbg_tcp.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qmldbg_tcp.pri"; sourceTree = "<absolute>"; };
|
||||
EBD39B69F368CEEAC360A16D /* /usr/local/Qt-5.5.1/mkspecs/common/mac.conf */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/common/mac.conf"; sourceTree = "<absolute>"; };
|
||||
F0681BC551FC8A2B132FC646 /* qjp2 */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = qjp2; path = "/usr/local/Qt-5.5.1/plugins/imageformats/libqjp2$(QT_LIBRARY_SUFFIX).a"; sourceTree = "<absolute>"; };
|
||||
F0A58515945747E36783CC21 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qmldbg_inspector.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qmldbg_inspector.pri"; sourceTree = "<absolute>"; };
|
||||
F2453BA07315EB9F34F1CD57 /* qtiff */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = qtiff; path = "/usr/local/Qt-5.5.1/plugins/imageformats/libqtiff$(QT_LIBRARY_SUFFIX).a"; sourceTree = "<absolute>"; };
|
||||
F2F823087EA182CCBD5748B8 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_designer.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_designer.pri"; sourceTree = "<absolute>"; };
|
||||
F33BE16353DD1557A9AB3558 /* /usr/local/Qt-5.5.1/mkspecs/common/clang-mac.conf */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/common/clang-mac.conf"; sourceTree = "<absolute>"; };
|
||||
F4EB01857048DCFCFFAAC4D0 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qavfmediaplayer.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qavfmediaplayer.pri"; sourceTree = "<absolute>"; };
|
||||
F7ADBF552F6B9A5982915164 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_positioning.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_positioning.pri"; sourceTree = "<absolute>"; };
|
||||
F83F87F8A60C9DF666911D42 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qsvg.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qsvg.pri"; sourceTree = "<absolute>"; };
|
||||
F9BEAA743A908603687DA204 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_xmlpatterns_private.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_xmlpatterns_private.pri"; sourceTree = "<absolute>"; };
|
||||
E7B2F248E3F7970788F35BF5 /* Qt5PlatformSupport */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = Qt5PlatformSupport; path = "$(QT_PATH)/lib/libQt5PlatformSupport$(QT_LIBRARY_SUFFIX).a"; sourceTree = "<absolute>"; };
|
||||
F0681BC551FC8A2B132FC646 /* qjp2 */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = qjp2; path = "$(QT_PATH)/plugins/imageformats/libqjp2$(QT_LIBRARY_SUFFIX).a"; sourceTree = "<absolute>"; };
|
||||
F2453BA07315EB9F34F1CD57 /* qtiff */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = qtiff; path = "$(QT_PATH)/plugins/imageformats/libqtiff$(QT_LIBRARY_SUFFIX).a"; sourceTree = "<absolute>"; };
|
||||
FCC237CA5AD60B9BA4447615 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = "<absolute>"; };
|
||||
FD944B80F033DFE737D401A2 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_help.pri */ = {isa = PBXFileReference; lastKnownFileType = text; path = "/usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_help.pri"; sourceTree = "<absolute>"; };
|
||||
/* End PBXFileReference section */
|
||||
|
||||
/* Begin PBXFrameworksBuildPhase section */
|
||||
|
@ -236,8 +113,6 @@
|
|||
A9563D9C9FD0D76FAAF1CA96 /* qdds in Link Binary With Libraries */,
|
||||
7CA5405B8503BFFC60932D2B /* qicns in Link Binary With Libraries */,
|
||||
496FD9CEEB508016AFB9F928 /* qico in Link Binary With Libraries */,
|
||||
59789101736112A570B8EFE6 /* qjp2 in Link Binary With Libraries */,
|
||||
FBD56E2AC34F76BFFDB68619 /* qmng in Link Binary With Libraries */,
|
||||
7F76437B577F737145996DC3 /* qtga in Link Binary With Libraries */,
|
||||
C06DDE378A7AC1FA9E6FF69A /* qtiff in Link Binary With Libraries */,
|
||||
A3F8F2284013928A02AE5C38 /* qwbmp in Link Binary With Libraries */,
|
||||
|
@ -245,6 +120,7 @@
|
|||
9F33AC0693BC81B27D8F518D /* Qt5Gui in Link Binary With Libraries */,
|
||||
8D33FE22B9BBADC7FA46C15B /* qtharfbuzzng in Link Binary With Libraries */,
|
||||
07D7954A1B5544B200DE9598 /* qtpcre in Link Binary With Libraries */,
|
||||
0785004D1CCA847400168DBB /* libqtfreetype.a in Link Binary With Libraries */,
|
||||
B9ADD90C014EA3FBE351DF03 /* Qt5Core in Link Binary With Libraries */,
|
||||
);
|
||||
name = "Link Binary With Libraries";
|
||||
|
@ -278,140 +154,11 @@
|
|||
name = SourceFiles;
|
||||
sourceTree = "<Group>";
|
||||
};
|
||||
74B182DB50CB5611B5C1C297 /* Supporting Files */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
5520A59148EC5EC44EF0D3CD /* Packer.pro */,
|
||||
6E67D23B15FC4B628DB2E0B2 /* /usr/local/Qt-5.5.1/mkspecs/qdevice.pri */,
|
||||
669FB007C4A3D58424D85EC8 /* /usr/local/Qt-5.5.1/mkspecs/common/shell-unix.conf */,
|
||||
0ABCEA8D0DD45589040B0AF2 /* /usr/local/Qt-5.5.1/mkspecs/common/unix.conf */,
|
||||
EBD39B69F368CEEAC360A16D /* /usr/local/Qt-5.5.1/mkspecs/common/mac.conf */,
|
||||
817A0F5A41B553A6DE67FDEB /* /usr/local/Qt-5.5.1/mkspecs/common/macx.conf */,
|
||||
45B95DB3B70B47A910FC847B /* /usr/local/Qt-5.5.1/mkspecs/common/gcc-base.conf */,
|
||||
A9E30FA27827990C5F182223 /* /usr/local/Qt-5.5.1/mkspecs/common/gcc-base-mac.conf */,
|
||||
8C5164D4E37556D40C5E6AA2 /* /usr/local/Qt-5.5.1/mkspecs/common/clang.conf */,
|
||||
F33BE16353DD1557A9AB3558 /* /usr/local/Qt-5.5.1/mkspecs/common/clang-mac.conf */,
|
||||
D4DE537C1FBBD48BD989FAD1 /* /usr/local/Qt-5.5.1/mkspecs/qconfig.pri */,
|
||||
ACC8A73268E5D9AF64E97AF4 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_bluetooth.pri */,
|
||||
2E48BB382B895A5ACD79AF9F /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_bluetooth_private.pri */,
|
||||
BD4D97801B547471B37A4CDC /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_bootstrap_private.pri */,
|
||||
CF86CD5BB01B9011E6B6FD3E /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_clucene_private.pri */,
|
||||
77FF486B1F9BCD55A8A3F35D /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_concurrent.pri */,
|
||||
7D28E9003CE64D8A7F2E292E /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_concurrent_private.pri */,
|
||||
7ECCC1F9442988B4F2707CC1 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_core.pri */,
|
||||
5F781C7FD8422D359EA1D2FE /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_core_private.pri */,
|
||||
7A94C7168B3FCBE5F04A013B /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_declarative.pri */,
|
||||
89863CCAF1D29037AE95755D /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_declarative_private.pri */,
|
||||
F2F823087EA182CCBD5748B8 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_designer.pri */,
|
||||
7C2F42B222EE88E26A6FED62 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_designer_private.pri */,
|
||||
69347C39E4D922E94D0860BF /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_designercomponents_private.pri */,
|
||||
360D4B3ED25D126430DE27D4 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_enginio.pri */,
|
||||
4C6C71914B1926119120DACD /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_enginio_private.pri */,
|
||||
23BC8B0FC3279421D41CA268 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_gui.pri */,
|
||||
D81E3D9A18202BE8EC3D0E2C /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_gui_private.pri */,
|
||||
FD944B80F033DFE737D401A2 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_help.pri */,
|
||||
D7A0618DE39A427EBF41940E /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_help_private.pri */,
|
||||
A5B17ABEFBA1C2F43443D644 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_macextras.pri */,
|
||||
33F165B1DB8CBF182C56FAB5 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_macextras_private.pri */,
|
||||
D2FE4D909926A0D1656068C4 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_multimedia.pri */,
|
||||
E7D67CB158408BB7DEA74764 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_multimedia_private.pri */,
|
||||
28BD0D10214709D95B161E24 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_multimediawidgets.pri */,
|
||||
D1FA7CAB5ACC09D563AE569F /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_multimediawidgets_private.pri */,
|
||||
293C8DEEE270847AC20E70F9 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_network.pri */,
|
||||
382E89A91A34F7898C25FD0D /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_network_private.pri */,
|
||||
8A04A4A3625204D12A1207F6 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_nfc.pri */,
|
||||
B51B01657BFE9EAEF5590561 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_nfc_private.pri */,
|
||||
5CEA7A2DB2136425A88D1254 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_opengl.pri */,
|
||||
E0F4563EA350EB65112A0EF4 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_opengl_private.pri */,
|
||||
E432DA897A5F027987342E8F /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_openglextensions.pri */,
|
||||
5597304BEC94BFB9EAAEBC4B /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_openglextensions_private.pri */,
|
||||
8F572030CE9AB8CC5F672201 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_platformsupport_private.pri */,
|
||||
F7ADBF552F6B9A5982915164 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_positioning.pri */,
|
||||
E66B9EC81C285CA9A7FB6A2E /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_positioning_private.pri */,
|
||||
6C08BFC27C4C303A3A5181DB /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_printsupport.pri */,
|
||||
D0CDC87DAFDA7F18A7AF450F /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_printsupport_private.pri */,
|
||||
B382B645B34234E451AE5D94 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_qml.pri */,
|
||||
6102C69805B6398AF6FA5BEB /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_qml_private.pri */,
|
||||
4FB6657DA22BC68B819B64B3 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_qmldevtools_private.pri */,
|
||||
DF8188E30892A4654B984221 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_qmltest.pri */,
|
||||
ABA9AB4619F09DCFD2D4A27F /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_qmltest_private.pri */,
|
||||
5B22E9E4EE9AAE42ABC24AB3 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_qtmultimediaquicktools_private.pri */,
|
||||
16DD53E17C65AC8B450CC6C3 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_quick.pri */,
|
||||
8C31D89BDFCDF466DAED19A0 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_quick_private.pri */,
|
||||
82E7DCFD95559532D8FC6CDD /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_quickparticles_private.pri */,
|
||||
D948D4D8F949D45158F8DE35 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_quickwidgets.pri */,
|
||||
B2246267D4C0D789259A86B0 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_quickwidgets_private.pri */,
|
||||
CFCB992BEC24B71BFB8A2F30 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_script.pri */,
|
||||
C505A18319B9B63C63877858 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_script_private.pri */,
|
||||
CE829DD126DD2B97E8D70A7A /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_scripttools.pri */,
|
||||
A59F74CD76FDC2B4B9910E18 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_scripttools_private.pri */,
|
||||
85B6936EDBE61D9BB8F8B33B /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_sensors.pri */,
|
||||
BDC9ECADEE40D11E3C2EA93F /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_sensors_private.pri */,
|
||||
BFF0C38FB0EC140C5F0304AE /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_serialport.pri */,
|
||||
311004331A04F3D69C98643C /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_serialport_private.pri */,
|
||||
7DE30A90667C03C4F91A2A91 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_sql.pri */,
|
||||
075EB50EB07CF69FD62FB8DF /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_sql_private.pri */,
|
||||
ADFC79902C14A612AE93A89A /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_svg.pri */,
|
||||
8DDE1D26B3206CDB8B57FABE /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_svg_private.pri */,
|
||||
DB0A26DDC377B2004F61BFE3 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_testlib.pri */,
|
||||
8849E60AEC7DB97A475C17EA /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_testlib_private.pri */,
|
||||
E50FA73B8A23BC179A642B27 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_uitools.pri */,
|
||||
B518DA4EE7376002AFC71FD5 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_uitools_private.pri */,
|
||||
8F97C9CAE38CA3AFAC0B3953 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_websockets.pri */,
|
||||
87EEF25EE25CF21572D1438C /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_websockets_private.pri */,
|
||||
A022AF919D1977534CA66BB8 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_widgets.pri */,
|
||||
8E9136256AFFBA6EF048AA55 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_widgets_private.pri */,
|
||||
AA73DC3C2901E2979FE8AD5B /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_xml.pri */,
|
||||
E37365B4489B4918BEBB707D /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_xml_private.pri */,
|
||||
2E6D9B1D2743D24E31B0B284 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_xmlpatterns.pri */,
|
||||
F9BEAA743A908603687DA204 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_lib_xmlpatterns_private.pri */,
|
||||
D5141F795670589C8CC41CBC /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_cocoaprintersupport.pri */,
|
||||
1FAE75C970AA73F2DEDDB508 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qavfcamera.pri */,
|
||||
F4EB01857048DCFCFFAAC4D0 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qavfmediaplayer.pri */,
|
||||
AFD721AA33A2F785E77B1698 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qcocoa.pri */,
|
||||
EA5D4FF9DE4AC4215D7DCE0D /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qcorewlanbearer.pri */,
|
||||
111BBEE3D1432C3B517FD539 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qdds.pri */,
|
||||
3685604BDB64DD6E92169B73 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qdeclarativeview.pri */,
|
||||
2440CD1D4CEF80443BCA1B8B /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qgenericbearer.pri */,
|
||||
EB1F99FD112917157F3C3F6E /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qicns.pri */,
|
||||
C4295BE59CCEBCDD16268349 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qico.pri */,
|
||||
45DB132B756499D4DF38430E /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qjp2.pri */,
|
||||
B678DA730B4ECE863AD631AE /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qminimal.pri */,
|
||||
F0A58515945747E36783CC21 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qmldbg_inspector.pri */,
|
||||
B8525798C5AA7D7C6D68E1B3 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qmldbg_qtquick2.pri */,
|
||||
EB29AC635054C09EFA749AE1 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qmldbg_tcp.pri */,
|
||||
3F08D430CEC8D2117735CCB4 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qmldbg_tcp_qtdeclarative.pri */,
|
||||
946BEA667170DC1A7A8F9DB0 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qmng.pri */,
|
||||
CCF75CFFB857487FB18F99F9 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qoffscreen.pri */,
|
||||
9A0BDF67E013BB4FFB8685B0 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qqt7engine.pri */,
|
||||
B064BF3B496A7BF7A449CA1E /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qsqlite.pri */,
|
||||
F83F87F8A60C9DF666911D42 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qsvg.pri */,
|
||||
CFFBE05DB004895080314289 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qsvgicon.pri */,
|
||||
247D8DF3B1DDB665B80BBA25 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qtaccessiblequick.pri */,
|
||||
87A4C1983FD641360BF80A02 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qtaccessiblewidgets.pri */,
|
||||
24B6929EE3952310F2DAECB1 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qtaudio_coreaudio.pri */,
|
||||
060A694B42A4555240009936 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qtga.pri */,
|
||||
BD22EFEFCC02644B1883CE19 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qtiff.pri */,
|
||||
B8C1F6C965A7A14FBA8D4518 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qtmedia_audioengine.pri */,
|
||||
74C1C232DFAA71028A0412CA /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qtmultimedia_m3u.pri */,
|
||||
C84546C18DCBB04166195DCF /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qtposition_positionpoll.pri */,
|
||||
AB1C02DDBD8E88DD9A9AFDDD /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qtsensorgestures_plugin.pri */,
|
||||
8B4BB4E74F8A4442EF563D7D /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qtsensorgestures_shakeplugin.pri */,
|
||||
892D36BEF797BA4AF48D378A /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qtsensors_dummy.pri */,
|
||||
A4D8AC60897F435C1C3B9D02 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qtsensors_generic.pri */,
|
||||
346287C9E754E7C458153F03 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qwbmp.pri */,
|
||||
B26239063A068F800A2C95F4 /* /usr/local/Qt-5.5.1/mkspecs/modules/qt_plugin_qwebp.pri */,
|
||||
63E722139886C87BC82DBDF5 /* /usr/local/Qt-5.5.1/mkspecs/macx-clang/qmake.conf */,
|
||||
85061B1DA49D125991117950 /* /usr/local/Qt-5.5.1/mkspecs/macx-xcode/qmake.conf */,
|
||||
AB745978DF0F41D1801ABDA6 /* .qmake.stash */,
|
||||
);
|
||||
name = "Supporting Files";
|
||||
sourceTree = "<Group>";
|
||||
};
|
||||
AF39DD055C3EF8226FBE929D /* Frameworks */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
07D795491B5544B200DE9598 /* qtpcre */,
|
||||
0785004C1CCA847400168DBB /* libqtfreetype.a */,
|
||||
AEA456A2F75ED9F5CDA7BCBE /* Cocoa.framework */,
|
||||
DFD7912080BC557230093752 /* ApplicationServices.framework */,
|
||||
9742F24EE18EA44D52824F1E /* CoreServices.framework */,
|
||||
|
@ -445,7 +192,6 @@
|
|||
isa = PBXGroup;
|
||||
children = (
|
||||
2EB56BE3C2D93CDAB0C52E67 /* Sources */,
|
||||
74B182DB50CB5611B5C1C297 /* Supporting Files */,
|
||||
AF39DD055C3EF8226FBE929D /* Frameworks */,
|
||||
FE0A091FDBFB3E9C31B7A1BD /* Products */,
|
||||
);
|
||||
|
@ -567,26 +313,23 @@
|
|||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
HEADER_SEARCH_PATHS = (
|
||||
../../Libraries/QtStatic/qtbase/include/QtGui/5.5.1/QtGui,
|
||||
../../Libraries/QtStatic/qtbase/include/QtCore/5.5.1/QtCore,
|
||||
../../Libraries/QtStatic/qtbase/include,
|
||||
/usr/local/include,
|
||||
"/usr/local/Qt-5.5.1/include",
|
||||
"/usr/local/Qt-5.5.1/include/QtGui",
|
||||
"/usr/local/Qt-5.5.1/include/QtCore",
|
||||
"$(QT_PATH)/include",
|
||||
"$(QT_PATH)/include/QtGui",
|
||||
"$(QT_PATH)/include/QtCore",
|
||||
GeneratedFiles/Debug,
|
||||
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/System/Library/Frameworks/OpenGL.framework/Versions/A/Headers,
|
||||
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/System/Library/Frameworks/AGL.framework/Headers,
|
||||
"/usr/local/Qt-5.5.1/mkspecs/macx-clang",
|
||||
"$(QT_PATH)/mkspecs/macx-clang",
|
||||
);
|
||||
INFOPLIST_FILE = Packer.plist;
|
||||
INSTALL_DIR = "../Mac/$(CONFIGURATION)";
|
||||
LDPLUSPLUS = "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++";
|
||||
LIBRARY_SEARCH_PATHS = (
|
||||
/System/Library/Frameworks/,
|
||||
"/usr/local/Qt-5.5.1/lib",
|
||||
"/usr/local/Qt-5.5.1/plugins/platforms",
|
||||
"/usr/local/Qt-5.5.1/plugins/imageformats",
|
||||
"$(QT_PATH)/lib",
|
||||
"$(QT_PATH)/plugins/platforms",
|
||||
"$(QT_PATH)/plugins/imageformats",
|
||||
);
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.7;
|
||||
OBJROOT = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)IntermediatePacker/";
|
||||
|
@ -617,16 +360,17 @@
|
|||
"-stdlib=libc++",
|
||||
"-lcrypto",
|
||||
"-lssl",
|
||||
"-L/usr/local/Qt-5.5.1/lib",
|
||||
"-L/usr/local/Qt-5.5.1/plugins/platforms",
|
||||
"-L$(QT_PATH)/lib",
|
||||
"-L$(QT_PATH)/plugins/platforms",
|
||||
"-lcups",
|
||||
"-L/usr/local/Qt-5.5.1/plugins/imageformats",
|
||||
"-L$(QT_PATH)/plugins/imageformats",
|
||||
"-lz",
|
||||
"-lm",
|
||||
"-llzma",
|
||||
);
|
||||
PRODUCT_NAME = Packer;
|
||||
QT_LIBRARY_SUFFIX = "";
|
||||
QT_PATH = "/usr/local/tdesktop/Qt-5.6.0";
|
||||
SDKROOT = macosx;
|
||||
SYMROOT = ../Mac;
|
||||
};
|
||||
|
@ -661,26 +405,23 @@
|
|||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
HEADER_SEARCH_PATHS = (
|
||||
../../Libraries/QtStatic/qtbase/include/QtGui/5.5.1/QtGui,
|
||||
../../Libraries/QtStatic/qtbase/include/QtCore/5.5.1/QtCore,
|
||||
../../Libraries/QtStatic/qtbase/include,
|
||||
/usr/local/include,
|
||||
"/usr/local/Qt-5.5.1/include",
|
||||
"/usr/local/Qt-5.5.1/include/QtGui",
|
||||
"/usr/local/Qt-5.5.1/include/QtCore",
|
||||
"$(QT_PATH)/include",
|
||||
"$(QT_PATH)/include/QtGui",
|
||||
"$(QT_PATH)/include/QtCore",
|
||||
GeneratedFiles/Debug,
|
||||
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/System/Library/Frameworks/OpenGL.framework/Versions/A/Headers,
|
||||
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/System/Library/Frameworks/AGL.framework/Headers,
|
||||
"/usr/local/Qt-5.5.1/mkspecs/macx-clang",
|
||||
"$(QT_PATH)/mkspecs/macx-clang",
|
||||
);
|
||||
INFOPLIST_FILE = Packer.plist;
|
||||
INSTALL_DIR = "../Mac/$(CONFIGURATION)";
|
||||
LDPLUSPLUS = "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++";
|
||||
LIBRARY_SEARCH_PATHS = (
|
||||
/System/Library/Frameworks/,
|
||||
"/usr/local/Qt-5.5.1/lib",
|
||||
"/usr/local/Qt-5.5.1/plugins/platforms",
|
||||
"/usr/local/Qt-5.5.1/plugins/imageformats",
|
||||
"$(QT_PATH)/lib",
|
||||
"$(QT_PATH)/plugins/platforms",
|
||||
"$(QT_PATH)/plugins/imageformats",
|
||||
);
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.7;
|
||||
OBJROOT = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)IntermediatePacker/";
|
||||
|
@ -712,16 +453,17 @@
|
|||
"-stdlib=libc++",
|
||||
"-lcrypto",
|
||||
"-lssl",
|
||||
"-L/usr/local/Qt-5.5.1/lib",
|
||||
"-L/usr/local/Qt-5.5.1/plugins/platforms",
|
||||
"-L$(QT_PATH)/lib",
|
||||
"-L$(QT_PATH)/plugins/platforms",
|
||||
"-lcups",
|
||||
"-L/usr/local/Qt-5.5.1/plugins/imageformats",
|
||||
"-L$(QT_PATH)/plugins/imageformats",
|
||||
"-lz",
|
||||
"-lm",
|
||||
"-llzma",
|
||||
);
|
||||
PRODUCT_NAME = Packer;
|
||||
QT_LIBRARY_SUFFIX = _debug;
|
||||
QT_PATH = "/usr/local/tdesktop/Qt-5.6.0";
|
||||
SDKROOT = macosx;
|
||||
SYMROOT = ../Mac;
|
||||
};
|
||||
|
@ -735,7 +477,7 @@
|
|||
GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
|
||||
LIBRARY_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"/usr/local/Qt-5.5.1/lib",
|
||||
"$(QT_PATH)/lib",
|
||||
);
|
||||
OBJROOT = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)IntermediatePacker";
|
||||
OTHER_CFLAGS = (
|
||||
|
@ -765,6 +507,7 @@
|
|||
PRODUCT_BUNDLE_IDENTIFIER = "com.tdesktop.$(PRODUCT_NAME:rfc1034identifier)";
|
||||
PRODUCT_NAME = Packer;
|
||||
QT_LIBRARY_SUFFIX = "";
|
||||
QT_PATH = "/usr/local/tdesktop/Qt-5.6.0";
|
||||
SDKROOT = macosx;
|
||||
};
|
||||
name = Release;
|
||||
|
@ -779,7 +522,7 @@
|
|||
GCC_OPTIMIZATION_LEVEL = 0;
|
||||
LIBRARY_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"/usr/local/Qt-5.5.1/lib",
|
||||
"$(QT_PATH)/lib",
|
||||
);
|
||||
OBJROOT = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)IntermediatePacker";
|
||||
OTHER_CFLAGS = (
|
||||
|
@ -809,6 +552,7 @@
|
|||
PRODUCT_BUNDLE_IDENTIFIER = "com.tdesktop.$(PRODUCT_NAME:rfc1034identifier)";
|
||||
PRODUCT_NAME = Packer;
|
||||
QT_LIBRARY_SUFFIX = _debug;
|
||||
QT_PATH = "/usr/local/tdesktop/Qt-5.6.0";
|
||||
SDKROOT = macosx;
|
||||
};
|
||||
name = Debug;
|
||||
|
|
|
@ -1,23 +1,33 @@
|
|||
#############################################################################
|
||||
# Makefile for building: ../Mac/DebugPacker/Packer.app/Contents/MacOS/Packer
|
||||
# Generated by qmake (3.0) (Qt 5.5.1)
|
||||
# Project: Packer.pro
|
||||
# Template: app
|
||||
# Command: /usr/local/Qt-5.5.1/bin/qmake -spec macx-xcode -o Packer.xcodeproj/project.pbxproj Packer.pro
|
||||
# Initially generated by qmake
|
||||
#############################################################################
|
||||
|
||||
MAKEFILE = project.pbxproj
|
||||
|
||||
MOC = /usr/local/Qt-5.5.1/bin/moc
|
||||
UIC =
|
||||
QT_VER = 5.6.0
|
||||
QT_DIR = /usr/local/tdesktop/Qt-$(QT_VER)
|
||||
QT_MOC = $(QT_DIR)/bin/moc
|
||||
LEX = flex
|
||||
LEXFLAGS =
|
||||
YACC = yacc
|
||||
YACCFLAGS = -d
|
||||
DEFINES = -D_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB
|
||||
INCPATH = -I/usr/local/Qt-5.5.1/mkspecs/macx-clang -I. -I../../Libraries/QtStatic/qtbase/include/QtGui/5.5.1/QtGui -I../../Libraries/QtStatic/qtbase/include/QtCore/5.5.1/QtCore -I../../Libraries/QtStatic/qtbase/include -I../../Libraries/lzma/C -I/usr/local/Qt-5.5.1/include -I/usr/local/Qt-5.5.1/include/QtGui -I/usr/local/Qt-5.5.1/include/QtCore -IGeneratedFiles/Debug -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/System/Library/Frameworks/OpenGL.framework/Versions/A/Headers -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/System/Library/Frameworks/AGL.framework/Headers
|
||||
DEFINES = -D_DEBUG -DQT_WIDGETS_LIB -DQT_NETWORK_LIB -DQT_GUI_LIB -DQT_CORE_LIB -D__APPLE__ -D__GNUC__=4
|
||||
INCPATH = -I$(QT_DIR)/mkspecs/macx-clang\
|
||||
-I$(QT_DIR)/include/QtGui/$(QT_VER)/QtGui\
|
||||
-I$(QT_DIR)/include/QtCore/$(QT_VER)/QtCore\
|
||||
-I$(QT_VER)/include\
|
||||
-IGeneratedFiles/Debug\
|
||||
-I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/usr/include/c++/4.2.1/backward\
|
||||
-I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/usr/include/c++/4.2.1\
|
||||
-I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/usr/include\
|
||||
-I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/System/Library/Frameworks/OpenGL.framework/Versions/A/Headers\
|
||||
-I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/System/Library/Frameworks/AGL.framework/Headers\
|
||||
-I/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/5.1/include\
|
||||
-I/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include
|
||||
DEL_FILE = rm -f
|
||||
MOVE = mv -f
|
||||
MOC_FILE = $(QT_MOC) $(DEFINES) $(INCPATH)
|
||||
|
||||
IMAGES =
|
||||
PARSERS =
|
||||
|
|
|
@ -16,6 +16,23 @@ index eec9e1f..ec3015e 100644
|
|||
QMAKE_CFLAGS_YACC =
|
||||
QMAKE_CFLAGS_LTCG = -GL
|
||||
QMAKE_CFLAGS_SSE2 = -arch:SSE2
|
||||
diff --git a/src/corelib/io/qfilesystemengine_win.cpp b/src/corelib/io/qfilesystemengine_win.cpp
|
||||
index f1a6019..81ff6ef 100644
|
||||
--- a/src/corelib/io/qfilesystemengine_win.cpp
|
||||
+++ b/src/corelib/io/qfilesystemengine_win.cpp
|
||||
@@ -1416,8 +1416,10 @@ bool QFileSystemEngine::copyFile(const QFileSystemEntry &source, const QFileSyst
|
||||
COPYFILE2_EXTENDED_PARAMETERS copyParams = {
|
||||
sizeof(copyParams), COPY_FILE_FAIL_IF_EXISTS, NULL, NULL, NULL
|
||||
};
|
||||
- bool ret = ::CopyFile2((const wchar_t*)source.nativeFilePath().utf16(),
|
||||
- (const wchar_t*)target.nativeFilePath().utf16(), ©Params) != 0;
|
||||
+ // CopyFile2 returns HRESULT, not BOOL, so it should be tested for S_OK, not 0.
|
||||
+ HRESULT hres = ::CopyFile2((const wchar_t*)source.nativeFilePath().utf16(),
|
||||
+ (const wchar_t*)target.nativeFilePath().utf16(), ©Params);
|
||||
+ bool ret = SUCCEEDED(hres);
|
||||
#endif // Q_OS_WINRT
|
||||
if(!ret)
|
||||
error = QSystemError(::GetLastError(), QSystemError::NativeError);
|
||||
diff --git a/src/corelib/tools/qunicodetables.cpp b/src/corelib/tools/qunicodetables.cpp
|
||||
index 14e4fd1..c31c62b 100644
|
||||
--- a/src/corelib/tools/qunicodetables.cpp
|
||||
|
@ -82,14 +99,14 @@ index 918c989..55ef783 100644
|
|||
+#endif
|
||||
+ }
|
||||
}
|
||||
|
||||
|
||||
// Make sure we're inside the viewport.
|
||||
diff --git a/src/gui/text/qtextengine_p.h b/src/gui/text/qtextengine_p.h
|
||||
index 39c228f..b72fdc0 100644
|
||||
--- a/src/gui/text/qtextengine_p.h
|
||||
+++ b/src/gui/text/qtextengine_p.h
|
||||
@@ -283,7 +283,8 @@ private:
|
||||
|
||||
|
||||
struct QScriptItem;
|
||||
/// Internal QTextItem
|
||||
-class QTextItemInt : public QTextItem
|
||||
|
@ -119,14 +136,14 @@ index 9e2a23a..4466a4e 100644
|
|||
- while (oldPos < len && attributes[oldPos].whiteSpace)
|
||||
- oldPos++;
|
||||
}
|
||||
|
||||
|
||||
return oldPos;
|
||||
@@ -1644,6 +1645,7 @@ namespace {
|
||||
int maxGlyphs;
|
||||
int currentPosition;
|
||||
glyph_t previousGlyph;
|
||||
+ QFontEngine *previousGlyphFontEngine;
|
||||
|
||||
|
||||
QFixed minw;
|
||||
QFixed softHyphenWidth;
|
||||
@@ -1677,13 +1679,14 @@ namespace {
|
||||
|
@ -136,14 +153,14 @@ index 9e2a23a..4466a4e 100644
|
|||
+ previousGlyphFontEngine = fontEngine;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
- inline void calculateRightBearing(glyph_t glyph)
|
||||
+ inline void calculateRightBearing(QFontEngine *engine, glyph_t glyph)
|
||||
{
|
||||
qreal rb;
|
||||
- fontEngine->getGlyphBearings(glyph, 0, &rb);
|
||||
+ engine->getGlyphBearings(glyph, 0, &rb);
|
||||
|
||||
|
||||
// We only care about negative right bearings, so we limit the range
|
||||
// of the bearing here so that we can assume it's negative in the rest
|
||||
@@ -1696,13 +1699,13 @@ namespace {
|
||||
|
@ -153,14 +170,14 @@ index 9e2a23a..4466a4e 100644
|
|||
- calculateRightBearing(currentGlyph());
|
||||
+ calculateRightBearing(fontEngine, currentGlyph());
|
||||
}
|
||||
|
||||
|
||||
inline void calculateRightBearingForPreviousGlyph()
|
||||
{
|
||||
if (previousGlyph > 0)
|
||||
- calculateRightBearing(previousGlyph);
|
||||
+ calculateRightBearing(previousGlyphFontEngine, previousGlyph);
|
||||
}
|
||||
|
||||
|
||||
static const QFixed RightBearingNotCalculated;
|
||||
diff --git a/src/gui/text/qtextlayout.h b/src/gui/text/qtextlayout.h
|
||||
index f74d4d4..57d449a 100644
|
||||
|
@ -174,8 +191,8 @@ index f74d4d4..57d449a 100644
|
|||
+ // allow access to private constructor
|
||||
+ friend class TextBlock;
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
diff --git a/src/network/socket/qnativesocketengine_win.cpp b/src/network/socket/qnativesocketengine_win.cpp
|
||||
index ca0a8b9..26ee865 100644
|
||||
--- a/src/network/socket/qnativesocketengine_win.cpp
|
||||
|
@ -199,9 +216,9 @@ index 728b166..12364db 100644
|
|||
--- a/src/platformsupport/fontdatabases/basic/qbasicfontdatabase.cpp
|
||||
+++ b/src/platformsupport/fontdatabases/basic/qbasicfontdatabase.cpp
|
||||
@@ -172,6 +172,79 @@ void QBasicFontDatabase::releaseHandle(void *handle)
|
||||
|
||||
|
||||
extern FT_Library qt_getFreetype();
|
||||
|
||||
|
||||
+// Enable Open Sans Semibold font family reading.
|
||||
+// Copied from freetype with some modifications.
|
||||
+
|
||||
|
@ -295,9 +312,9 @@ index a5fe888..5878a4f 100644
|
|||
--- a/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp
|
||||
+++ b/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp
|
||||
@@ -381,6 +381,17 @@ static void populateFromPattern(FcPattern *pattern)
|
||||
|
||||
|
||||
familyName = QString::fromUtf8((const char *)value);
|
||||
|
||||
|
||||
+ // Enable Open Sans Semibold font family reading.
|
||||
+ if (familyName == QLatin1String("Open Sans")) {
|
||||
+ FcChar8 *styl = 0;
|
||||
|
@ -356,7 +373,7 @@ index 0af7790..c16f154 100644
|
|||
--- a/src/platformsupport/fontdatabases/mac/qcoretextfontdatabase.mm
|
||||
+++ b/src/platformsupport/fontdatabases/mac/qcoretextfontdatabase.mm
|
||||
@@ -259,6 +259,13 @@ static void getFontDescription(CTFontDescriptorRef font, FontDescription *fd)
|
||||
|
||||
|
||||
fd->foundryName = QStringLiteral("CoreText");
|
||||
fd->familyName = (CFStringRef) CTFontDescriptorCopyAttribute(font, kCTFontFamilyNameAttribute);
|
||||
+
|
||||
|
@ -383,6 +400,23 @@ index a4b5280..e2dffcb 100644
|
|||
} else {
|
||||
LIBS += $$QMAKE_LIBS_XKBCOMMON
|
||||
QMAKE_CXXFLAGS += $$QMAKE_CFLAGS_XKBCOMMON
|
||||
diff --git a/src/plugins/platforminputcontexts/compose/qcomposeplatforminputcontext.cpp b/src/plugins/platforminputcontexts/compose/qcomposeplatforminputcontext.cpp
|
||||
index d1bea9a..f1f808d 100644
|
||||
--- a/src/plugins/platforminputcontexts/compose/qcomposeplatforminputcontext.cpp
|
||||
+++ b/src/plugins/platforminputcontexts/compose/qcomposeplatforminputcontext.cpp
|
||||
@@ -232,6 +232,12 @@ bool QComposeInputContext::checkComposeTable()
|
||||
|
||||
void QComposeInputContext::commitText(uint character) const
|
||||
{
|
||||
+ // Crash fix when not focused widget still receives input events.
|
||||
+ if (!m_focusObject) {
|
||||
+ qWarning("QComposeInputContext::commitText: m_focusObject == nullptr, cannot commit text");
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
QInputMethodEvent event;
|
||||
event.setCommitString(QChar(character));
|
||||
QCoreApplication::sendEvent(m_focusObject, &event);
|
||||
diff --git a/src/plugins/platforminputcontexts/fcitx/fcitx.json b/src/plugins/platforminputcontexts/fcitx/fcitx.json
|
||||
new file mode 100644
|
||||
index 0000000..6d2b389
|
||||
|
@ -11193,13 +11227,13 @@ index faea54b..7d85080 100644
|
|||
+++ b/src/plugins/platforminputcontexts/platforminputcontexts.pro
|
||||
@@ -1,7 +1,8 @@
|
||||
TEMPLATE = subdirs
|
||||
|
||||
|
||||
qtHaveModule(dbus) {
|
||||
-!mac:!win32:SUBDIRS += ibus
|
||||
+# Adding fcitx input context plugin to our static build.
|
||||
+!mac:!win32:SUBDIRS += ibus fcitx
|
||||
}
|
||||
|
||||
|
||||
contains(QT_CONFIG, xcb-plugin): SUBDIRS += compose
|
||||
diff --git a/src/plugins/platforms/cocoa/qcocoaapplicationdelegate.mm b/src/plugins/platforms/cocoa/qcocoaapplicationdelegate.mm
|
||||
index caa8884..b083e65 100644
|
||||
|
@ -11213,7 +11247,7 @@ index caa8884..b083e65 100644
|
|||
+ // Don't terminate if reflectionDelegate does not respond to that selector, just use the default.
|
||||
+ //return NSTerminateNow;
|
||||
}
|
||||
|
||||
|
||||
if ([self canQuit]) {
|
||||
diff --git a/src/plugins/platforms/cocoa/qcocoabackingstore.h b/src/plugins/platforms/cocoa/qcocoabackingstore.h
|
||||
index 5a199de..5622728 100644
|
||||
|
@ -11227,7 +11261,7 @@ index 5a199de..5622728 100644
|
|||
+ // Optimize redraw - don't clear image if it will be fully redrawn.
|
||||
+ bool m_qImageNeedsClear;
|
||||
};
|
||||
|
||||
|
||||
QT_END_NAMESPACE
|
||||
diff --git a/src/plugins/platforms/cocoa/qcocoabackingstore.mm b/src/plugins/platforms/cocoa/qcocoabackingstore.mm
|
||||
index ca92103..225d85f 100644
|
||||
|
@ -11235,14 +11269,14 @@ index ca92103..225d85f 100644
|
|||
+++ b/src/plugins/platforms/cocoa/qcocoabackingstore.mm
|
||||
@@ -38,7 +38,8 @@
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
|
||||
QCocoaBackingStore::QCocoaBackingStore(QWindow *window)
|
||||
- : QPlatformBackingStore(window)
|
||||
+ // Optimize redraw - don't clear image if it will be fully redrawn.
|
||||
+ : QPlatformBackingStore(window), m_qImageNeedsClear(false)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
@@ -59,9 +60,11 @@ QPaintDevice *QCocoaBackingStore::paintDevice()
|
||||
if (m_qImage.size() != effectiveBufferSize) {
|
||||
QImage::Format format = (window()->format().hasAlpha() || cocoaWindow->m_drawContentBorderGradient)
|
||||
|
@ -11257,7 +11291,7 @@ index ca92103..225d85f 100644
|
|||
}
|
||||
return &m_qImage;
|
||||
@@ -100,7 +103,8 @@ bool QCocoaBackingStore::scroll(const QRegion &area, int dx, int dy)
|
||||
|
||||
|
||||
void QCocoaBackingStore::beginPaint(const QRegion ®ion)
|
||||
{
|
||||
- if (m_qImage.hasAlphaChannel()) {
|
||||
|
@ -11282,7 +11316,7 @@ index c2d206f..0f9b512 100644
|
|||
+
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -466,7 +472,8 @@ QList<int> QCocoaKeyMapper::possibleKeys(const QKeyEvent *event) const
|
||||
Qt::KeyboardModifiers neededMods = ModsTbl[i];
|
||||
int key = kbItem->qtKey[i];
|
||||
|
@ -11316,7 +11350,7 @@ index 8152c57..a7c1ca0 100644
|
|||
+ const int padding = 0;
|
||||
const int menuHeight = [[NSStatusBar systemStatusBar] thickness];
|
||||
const int maxImageHeight = menuHeight - padding;
|
||||
|
||||
|
||||
@@ -207,8 +211,11 @@ void QCocoaSystemTrayIcon::updateIcon(const QIcon &icon)
|
||||
// devicePixelRatio for the "best" screen on the system.
|
||||
qreal devicePixelRatio = qApp->devicePixelRatio();
|
||||
|
@ -11331,21 +11365,21 @@ index 8152c57..a7c1ca0 100644
|
|||
// with a height smaller or equal to maxPixmapHeight. The pixmap
|
||||
// may rectangular; assume it has a reasonable size. If there is
|
||||
@@ -224,9 +231,9 @@ void QCocoaSystemTrayIcon::updateIcon(const QIcon &icon)
|
||||
|
||||
|
||||
// Handle SVG icons, which do not return anything for availableSizes().
|
||||
if (!selectedSize.isValid())
|
||||
- selectedSize = icon.actualSize(QSize(maxPixmapHeight, maxPixmapHeight));
|
||||
+ selectedSize = icon.actualSize(QSize(maxPixmapHeight, maxPixmapHeight), mode);
|
||||
|
||||
|
||||
- QPixmap pixmap = icon.pixmap(selectedSize);
|
||||
+ QPixmap pixmap = icon.pixmap(selectedSize, mode);
|
||||
|
||||
|
||||
// Draw a low-resolution icon if there is not enough pixels for a retina
|
||||
// icon. This prevents showing a small icon on retina displays.
|
||||
@@ -374,6 +381,11 @@ QT_END_NAMESPACE
|
||||
Q_UNUSED(notification);
|
||||
down = NO;
|
||||
|
||||
|
||||
+ // Create a rich os x tray icon (pixel-perfect, theme switching).
|
||||
+ parent->iconSelected = false;
|
||||
+ parent->systray->updateIcon(parent->icon);
|
||||
|
@ -11353,11 +11387,11 @@ index 8152c57..a7c1ca0 100644
|
|||
+
|
||||
[self setNeedsDisplay:YES];
|
||||
}
|
||||
|
||||
|
||||
@@ -383,6 +395,10 @@ QT_END_NAMESPACE
|
||||
int clickCount = [mouseEvent clickCount];
|
||||
[self setNeedsDisplay:YES];
|
||||
|
||||
|
||||
+ // Create a rich os x tray icon (pixel-perfect, theme switching).
|
||||
+ parent->iconSelected = (clickCount != 2) && parent->menu;
|
||||
+ parent->systray->updateIcon(parent->icon);
|
||||
|
@ -11376,7 +11410,7 @@ index 8152c57..a7c1ca0 100644
|
|||
+
|
||||
[self menuTrackingDone:nil];
|
||||
}
|
||||
|
||||
|
||||
@@ -410,6 +431,11 @@ QT_END_NAMESPACE
|
||||
-(void)rightMouseUp:(NSEvent *)mouseEvent
|
||||
{
|
||||
|
@ -11388,10 +11422,10 @@ index 8152c57..a7c1ca0 100644
|
|||
+
|
||||
[self menuTrackingDone:nil];
|
||||
}
|
||||
|
||||
|
||||
@@ -425,7 +451,8 @@ QT_END_NAMESPACE
|
||||
}
|
||||
|
||||
|
||||
-(void)drawRect:(NSRect)rect {
|
||||
- [[parent item] drawStatusBarBackgroundInRect:rect withHighlight:down];
|
||||
+ // Create a rich os x tray icon (pixel-perfect, theme switching).
|
||||
|
@ -11428,7 +11462,7 @@ index 00cb43c..4530862 100644
|
|||
@@ -141,7 +141,8 @@ static bool isMouseEvent(NSEvent *ev)
|
||||
if (!self.window.delegate)
|
||||
return; // Already detached, pending NSAppKitDefined event
|
||||
|
||||
|
||||
- if (pw && pw->frameStrutEventsEnabled() && isMouseEvent(theEvent)) {
|
||||
+ // Fix restore after minimize or close by window buttons.
|
||||
+ if (pw && pw->frameStrutEventsEnabled() && pw->m_synchedWindowState != Qt::WindowMinimized && pw->m_isExposed && isMouseEvent(theEvent)) {
|
||||
|
@ -11438,7 +11472,7 @@ index 00cb43c..4530862 100644
|
|||
@@ -931,6 +932,15 @@ void QCocoaWindow::setWindowFilePath(const QString &filePath)
|
||||
[m_nsWindow setRepresentedFilename: fi.exists() ? QCFString::toNSString(filePath) : @""];
|
||||
}
|
||||
|
||||
|
||||
+// Create a good os x window icon (pixel-perfect).
|
||||
+qreal _win_devicePixelRatio() {
|
||||
+ qreal result = 1.0;
|
||||
|
@ -11478,7 +11512,7 @@ index 0d80333..729d4d0 100644
|
|||
}
|
||||
@@ -1451,14 +1452,14 @@ static QTabletEvent::TabletDevice wacomTabletDevice(NSEvent *theEvent)
|
||||
quint32 nativeVirtualKey = [nsevent keyCode];
|
||||
|
||||
|
||||
QChar ch = QChar::ReplacementCharacter;
|
||||
- int keyCode = Qt::Key_unknown;
|
||||
- if ([characters length] != 0) {
|
||||
|
@ -11496,13 +11530,13 @@ index 0d80333..729d4d0 100644
|
|||
+ ch = QChar([charactersIgnoringModifiers characterAtIndex:0]);
|
||||
+
|
||||
+ int keyCode = [self convertKeyCode:ch];
|
||||
|
||||
|
||||
// we will send a key event unless the input method sets m_sendKeyEvent to false
|
||||
m_sendKeyEvent = true;
|
||||
@@ -1524,6 +1525,23 @@ static QTabletEvent::TabletDevice wacomTabletDevice(NSEvent *theEvent)
|
||||
[self handleKeyEvent:nsevent eventType:int(QEvent::KeyRelease)];
|
||||
}
|
||||
|
||||
|
||||
+// Enable Ctrl+Tab and Ctrl+Shift+Tab / Ctrl+Backtab handle in-app.
|
||||
+- (BOOL)performKeyEquivalent:(NSEvent *)nsevent
|
||||
+{
|
||||
|
@ -11530,7 +11564,7 @@ index 9211fd1..283aabd 100644
|
|||
@@ -716,12 +716,20 @@ public:
|
||||
void setSelectedFiles(const QList<QUrl> &);
|
||||
QString selectedFile() const;
|
||||
|
||||
|
||||
+ // Adding select-by-url for Windows file dialog.
|
||||
+ void setSelectedRemoteContent(const QByteArray &);
|
||||
+ QByteArray selectedRemoteContent() const;
|
||||
|
@ -11551,7 +11585,7 @@ index 9211fd1..283aabd 100644
|
|||
@@ -775,6 +783,21 @@ inline void QWindowsFileDialogSharedData::setSelectedFiles(const QList<QUrl> &ur
|
||||
m_data->selectedFiles = urls;
|
||||
}
|
||||
|
||||
|
||||
+// Adding select-by-url for Windows file dialog.
|
||||
+inline QByteArray QWindowsFileDialogSharedData::selectedRemoteContent() const
|
||||
+{
|
||||
|
@ -11573,7 +11607,7 @@ index 9211fd1..283aabd 100644
|
|||
@@ -899,6 +922,9 @@ public:
|
||||
// example by appended default suffixes, etc.
|
||||
virtual QList<QUrl> dialogResult() const = 0;
|
||||
|
||||
|
||||
+ // Adding select-by-url for Windows file dialog.
|
||||
+ virtual QByteArray dialogRemoteContent() const { return QByteArray(); }
|
||||
+
|
||||
|
@ -11595,7 +11629,7 @@ index 9211fd1..283aabd 100644
|
|||
+ m_fileDialog->SetFileName((wchar_t*)file.utf16());;
|
||||
+ }
|
||||
}
|
||||
|
||||
|
||||
// Return the index of the selected filter, accounting for QFileDialog
|
||||
@@ -1405,7 +1438,11 @@ bool QWindowsNativeFileDialogBase::onFileOk()
|
||||
{
|
||||
|
@ -11608,12 +11642,12 @@ index 9211fd1..283aabd 100644
|
|||
+
|
||||
+ return true;
|
||||
}
|
||||
|
||||
|
||||
void QWindowsNativeFileDialogBase::close()
|
||||
@@ -1534,6 +1571,9 @@ public:
|
||||
QList<QUrl> selectedFiles() const Q_DECL_OVERRIDE;
|
||||
QList<QUrl> dialogResult() const Q_DECL_OVERRIDE;
|
||||
|
||||
|
||||
+ // Adding select-by-url for Windows file dialog.
|
||||
+ QByteArray dialogRemoteContent() const Q_DECL_OVERRIDE;
|
||||
+
|
||||
|
@ -11623,7 +11657,7 @@ index 9211fd1..283aabd 100644
|
|||
@@ -1548,6 +1588,62 @@ QList<QUrl> QWindowsNativeOpenFileDialog::dialogResult() const
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
+// Adding select-by-url for Windows file dialog.
|
||||
+QByteArray QWindowsNativeOpenFileDialog::dialogRemoteContent() const
|
||||
+{
|
||||
|
@ -11697,7 +11731,7 @@ index 9211fd1..283aabd 100644
|
|||
@@ -1704,6 +1804,12 @@ QList<QUrl> QWindowsFileDialogHelper::selectedFiles() const
|
||||
return m_data.selectedFiles();
|
||||
}
|
||||
|
||||
|
||||
+// Adding select-by-url for Windows file dialog.
|
||||
+QByteArray QWindowsFileDialogHelper::selectedRemoteContent() const
|
||||
+{
|
||||
|
@ -11721,7 +11755,7 @@ index 9211fd1..283aabd 100644
|
|||
@@ -2036,6 +2146,12 @@ QList<QUrl> QWindowsXpFileDialogHelper::selectedFiles() const
|
||||
return m_data.selectedFiles();
|
||||
}
|
||||
|
||||
|
||||
+// Adding select-by-url for Windows file dialog.
|
||||
+QByteArray QWindowsXpFileDialogHelper::selectedRemoteContent() const
|
||||
+{
|
||||
|
@ -11731,6 +11765,21 @@ index 9211fd1..283aabd 100644
|
|||
void QWindowsXpFileDialogHelper::selectNameFilter(const QString &f)
|
||||
{
|
||||
m_data.setSelectedNameFilter(f); // Dialog cannot be updated at run-time.
|
||||
diff --git a/src/plugins/platforms/windows/qwindowskeymapper.cpp b/src/plugins/platforms/windows/qwindowskeymapper.cpp
|
||||
index c5dff60..ce6c715 100644
|
||||
--- a/src/plugins/platforms/windows/qwindowskeymapper.cpp
|
||||
+++ b/src/plugins/platforms/windows/qwindowskeymapper.cpp
|
||||
@@ -1249,6 +1249,10 @@ QList<int> QWindowsKeyMapper::possibleKeys(const QKeyEvent *e) const
|
||||
{
|
||||
QList<int> result;
|
||||
|
||||
+ // This must not happen, but there are crash reports on the next line.
|
||||
+ if (e->nativeVirtualKey() > 0xFF)
|
||||
+ return result;
|
||||
+
|
||||
const KeyboardLayoutItem &kbItem = keyLayout[e->nativeVirtualKey()];
|
||||
if (!kbItem.exists)
|
||||
return result;
|
||||
diff --git a/src/plugins/platforms/windows/qwindowsservices.cpp b/src/plugins/platforms/windows/qwindowsservices.cpp
|
||||
index cc697ba..c72234f 100644
|
||||
--- a/src/plugins/platforms/windows/qwindowsservices.cpp
|
||||
|
@ -11747,7 +11796,7 @@ index cc697ba..c72234f 100644
|
|||
// but that cannot handle a Windows command line [yet].
|
||||
command.replace(QStringLiteral("%1"), url.toString(QUrl::FullyEncoded));
|
||||
diff --git a/src/plugins/platforms/windows/qwindowswindow.cpp b/src/plugins/platforms/windows/qwindowswindow.cpp
|
||||
index 7f45b48..4ace49c 100644
|
||||
index 7f45b48..9d5c339 100644
|
||||
--- a/src/plugins/platforms/windows/qwindowswindow.cpp
|
||||
+++ b/src/plugins/platforms/windows/qwindowswindow.cpp
|
||||
@@ -1025,7 +1025,8 @@ void QWindowsWindow::destroyWindow()
|
||||
|
@ -11782,6 +11831,24 @@ index 7f45b48..4ace49c 100644
|
|||
if (newTransientParent != oldTransientParent)
|
||||
SetWindowLongPtr(m_data.hwnd, GWL_HWNDPARENT, (LONG_PTR)newTransientParent);
|
||||
#endif // !Q_OS_WINCE
|
||||
@@ -1453,10 +1469,14 @@ void QWindowsWindow::handleResized(int wParam)
|
||||
handleGeometryChange();
|
||||
break;
|
||||
case SIZE_RESTORED:
|
||||
- if (isFullScreen_sys())
|
||||
- handleWindowStateChange(Qt::WindowFullScreen);
|
||||
- else if (m_windowState != Qt::WindowNoState && !testFlag(MaximizeToFullScreen))
|
||||
+ if (isFullScreen_sys()) {
|
||||
+ if (m_windowState != Qt::WindowFullScreen)
|
||||
+ // When resolution is changed for a frameless fullscreen widget
|
||||
+ // this call prevents correct geometry get in handleGeometryChange().
|
||||
+ handleWindowStateChange(Qt::WindowFullScreen);
|
||||
+ } else if (m_windowState != Qt::WindowNoState && !testFlag(MaximizeToFullScreen)) {
|
||||
handleWindowStateChange(Qt::WindowNoState);
|
||||
+ }
|
||||
handleGeometryChange();
|
||||
break;
|
||||
}
|
||||
diff --git a/src/plugins/platforms/windows/qwindowswindow.h b/src/plugins/platforms/windows/qwindowswindow.h
|
||||
index 6fffa1e..288df03 100644
|
||||
--- a/src/plugins/platforms/windows/qwindowswindow.h
|
||||
|
@ -11804,7 +11871,7 @@ index 3f3a6e7..f1cf176 100644
|
|||
@@ -1200,6 +1200,15 @@ QList<QUrl> QFileDialogPrivate::userSelectedFiles() const
|
||||
return files;
|
||||
}
|
||||
|
||||
|
||||
+// Adding select-by-url for Windows file dialog.
|
||||
+QByteArray QFileDialogPrivate::userSelectedRemoteContent() const
|
||||
+{
|
||||
|
@ -11820,7 +11887,7 @@ index 3f3a6e7..f1cf176 100644
|
|||
@@ -1267,6 +1276,14 @@ QStringList QFileDialog::selectedFiles() const
|
||||
return files;
|
||||
}
|
||||
|
||||
|
||||
+// Adding select-by-url for Windows file dialog.
|
||||
+QByteArray QFileDialog::selectedRemoteContent() const
|
||||
+{
|
||||
|
@ -11839,13 +11906,13 @@ index ffe49a2..4213206 100644
|
|||
@@ -108,6 +108,9 @@ public:
|
||||
void selectFile(const QString &filename);
|
||||
QStringList selectedFiles() const;
|
||||
|
||||
|
||||
+ // Adding select-by-url for Windows file dialog.
|
||||
+ QByteArray selectedRemoteContent() const;
|
||||
+
|
||||
void selectUrl(const QUrl &url);
|
||||
QList<QUrl> selectedUrls() const;
|
||||
|
||||
|
||||
diff --git a/src/widgets/dialogs/qfiledialog_p.h b/src/widgets/dialogs/qfiledialog_p.h
|
||||
index f610e46..ca71d55 100644
|
||||
--- a/src/widgets/dialogs/qfiledialog_p.h
|
||||
|
@ -11875,7 +11942,7 @@ index f610e46..ca71d55 100644
|
|||
@@ -393,6 +401,14 @@ inline QList<QUrl> QFileDialogPrivate::selectedFiles_sys() const
|
||||
return QList<QUrl>();
|
||||
}
|
||||
|
||||
|
||||
+// Adding select-by-url for Windows file dialog.
|
||||
+inline QByteArray QFileDialogPrivate::selectedRemoteContent_sys() const
|
||||
+{
|
||||
|
@ -11914,7 +11981,35 @@ index ebb2921..8119bad 100644
|
|||
+ qpa_sys->updateMenu(nullptr);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
diff --git a/src/widgets/widgets/qabstractscrollarea.cpp b/src/widgets/widgets/qabstractscrollarea.cpp
|
||||
index 65d06ea..920f529 100644
|
||||
--- a/src/widgets/widgets/qabstractscrollarea.cpp
|
||||
+++ b/src/widgets/widgets/qabstractscrollarea.cpp
|
||||
@@ -640,15 +640,19 @@ scrolling range.
|
||||
QSize QAbstractScrollArea::maximumViewportSize() const
|
||||
{
|
||||
Q_D(const QAbstractScrollArea);
|
||||
- int hsbExt = d->hbar->sizeHint().height();
|
||||
- int vsbExt = d->vbar->sizeHint().width();
|
||||
|
||||
int f = 2 * d->frameWidth;
|
||||
QSize max = size() - QSize(f + d->left + d->right, f + d->top + d->bottom);
|
||||
- if (d->vbarpolicy == Qt::ScrollBarAlwaysOn)
|
||||
+ if (d->vbarpolicy == Qt::ScrollBarAlwaysOn) {
|
||||
+ // Count the sizeHint of the bar only if it is displayed.
|
||||
+ int vsbExt = d->vbar->sizeHint().width();
|
||||
max.rwidth() -= vsbExt;
|
||||
- if (d->hbarpolicy == Qt::ScrollBarAlwaysOn)
|
||||
+ }
|
||||
+ if (d->hbarpolicy == Qt::ScrollBarAlwaysOn) {
|
||||
+ // Count the sizeHint of the bar only if it is displayed.
|
||||
+ int hsbExt = d->hbar->sizeHint().height();
|
||||
max.rheight() -= hsbExt;
|
||||
+ }
|
||||
return max;
|
||||
}
|
||||
|
||||
diff --git a/src/widgets/widgets/qwidgetlinecontrol.cpp b/src/widgets/widgets/qwidgetlinecontrol.cpp
|
||||
index 436937b..fc7a843 100644
|
||||
--- a/src/widgets/widgets/qwidgetlinecontrol.cpp
|
||||
|
@ -11933,7 +12028,7 @@ index 436937b..fc7a843 100644
|
|||
#endif
|
||||
@@ -1881,11 +1886,21 @@ void QWidgetLineControl::processKeyEvent(QKeyEvent* event)
|
||||
}
|
||||
|
||||
|
||||
// QTBUG-35734: ignore Ctrl/Ctrl+Shift; accept only AltGr (Alt+Ctrl) on German keyboards
|
||||
- if (unknown && !isReadOnly()
|
||||
- && event->modifiers() != Qt::ControlModifier
|
||||
|
|
Before Width: | Height: | Size: 177 KiB After Width: | Height: | Size: 176 KiB |
Before Width: | Height: | Size: 239 KiB After Width: | Height: | Size: 239 KiB |
|
@ -55,13 +55,15 @@ wndMinWidth: 380px;
|
|||
adaptiveNormalWidth: 640px;
|
||||
adaptiveWideWidth: 1366px;
|
||||
|
||||
windowBg: #fff; // fallback for background: white
|
||||
windowBg: #ffffff; // fallback for background: white
|
||||
windowActiveBg: #40ace3; // fallback for blue filled active areas
|
||||
windowTextFg: #000; // fallback for text color: black
|
||||
windowTextFg: #000000; // fallback for text color: black
|
||||
windowSubTextFg: #8a8a8a; // fallback for subtext color: gray
|
||||
windowSubTextFgOver: #7c99b2; // fallback for subtext over color: gray over blue bg
|
||||
windowActiveTextFg: #1485c2; // fallback for active color: blue online
|
||||
windowShadowFg: #000; // fallback for shadow color
|
||||
windowShadowFg: #000000; // fallback for shadow color
|
||||
|
||||
semiboldButtonBlueText: #2b99d5;
|
||||
|
||||
wndMinHeight: 480px;
|
||||
wndDefWidth: 800px;
|
||||
|
@ -108,9 +110,11 @@ boxBlueCloseDuration: 150;
|
|||
boxBlueShadow: sprite(132px, 108px, 1px, 4px);
|
||||
|
||||
boxButtonFont: font(boxFontSize semibold);
|
||||
defaultBoxButton: BoxButton {
|
||||
defaultBoxButton: RoundButton {
|
||||
textFg: #2f9fea;
|
||||
textFgOver: #2f9fea;
|
||||
secondaryTextFg: #2f9fea;
|
||||
secondaryTextFgOver: #2f9fea;
|
||||
textBg: white;
|
||||
textBgOver: #edf7ff;
|
||||
|
||||
|
@ -123,10 +127,10 @@ defaultBoxButton: BoxButton {
|
|||
font: boxButtonFont;
|
||||
duration: 200;
|
||||
}
|
||||
cancelBoxButton: BoxButton(defaultBoxButton) {
|
||||
cancelBoxButton: RoundButton(defaultBoxButton) {
|
||||
textFg: #aeaeae;
|
||||
}
|
||||
attentionBoxButton: BoxButton(defaultBoxButton) {
|
||||
attentionBoxButton: RoundButton(defaultBoxButton) {
|
||||
textFg: #ea4b2f;
|
||||
textFgOver: #ea4b2f;
|
||||
textBgOver: #fff0ed;
|
||||
|
@ -613,7 +617,7 @@ inpDefGray: flatInput(inpDefFlat) {
|
|||
bgColor: #f2f2f2;
|
||||
borderWidth: 2px;
|
||||
borderColor: #f2f2f2;
|
||||
borderActive: #80cff9;
|
||||
borderActive: #54c3f3;
|
||||
borderError: #ed8080;
|
||||
phColor: #808080;
|
||||
}
|
||||
|
@ -658,6 +662,9 @@ scrollDef: flatScroll {
|
|||
duration: 150;
|
||||
hiding: 1000;
|
||||
}
|
||||
|
||||
msgRadius: 3px;
|
||||
|
||||
scrollCountries: flatScroll(scrollDef) {
|
||||
topsh: 0px;
|
||||
bottomsh: -2px;
|
||||
|
@ -725,6 +732,7 @@ btnIntroNext: flatButton(btnDefNext, btnDefBig) {
|
|||
overFont: font(17px);
|
||||
|
||||
width: 300px;
|
||||
radius: msgRadius;
|
||||
}
|
||||
|
||||
boxShadow: sprite(363px, 50px, 15px, 15px);
|
||||
|
@ -925,11 +933,6 @@ searchFlatInput: flatInput(inpDefGray) {
|
|||
phColor: #949494;
|
||||
phFocusColor: #a4a4a4;
|
||||
imgRect: sprite(227px, 21px, 24px, 24px);
|
||||
|
||||
borderWidth: 2px;
|
||||
borderColor: #f2f2f2;
|
||||
borderActive: #80cff9;
|
||||
borderError: #ed8080;
|
||||
}
|
||||
|
||||
noContactsHeight: 100px;
|
||||
|
@ -983,10 +986,12 @@ topBarSearch: iconedButton(btnDefIconed) {
|
|||
height: topBarHeight;
|
||||
}
|
||||
topBarMinPadding: 5px;
|
||||
topBarButton: BoxButton {
|
||||
topBarButton: RoundButton {
|
||||
textFg: #0084c4;
|
||||
textFgOver: #0084c4;
|
||||
textBg: white;
|
||||
secondaryTextFg: #0084c4;
|
||||
secondaryTextFgOver: #0084c4;
|
||||
textBg: windowBg;
|
||||
textBgOver: #edf4f7;
|
||||
|
||||
width: -22px;
|
||||
|
@ -998,26 +1003,38 @@ topBarButton: BoxButton {
|
|||
font: font(fsize);
|
||||
duration: 200;
|
||||
}
|
||||
topBarClearButton: BoxButton(topBarButton) {
|
||||
padding: margins(8px, 14px, 8px, 14px);
|
||||
}
|
||||
topBarActionButton: flatButton(btnDefNext, btnDefBig) {
|
||||
textTop: 8px;
|
||||
overTextTop: 8px;
|
||||
downTextTop: 9px;
|
||||
defaultActiveButton: RoundButton {
|
||||
textFg: #ffffff;
|
||||
textFgOver: #ffffff;
|
||||
secondaryTextFg: #cceeff;
|
||||
secondaryTextFgOver: #cceeff;
|
||||
textBg: windowActiveBg;
|
||||
textBgOver: windowActiveBg;
|
||||
|
||||
font: font(fsize);
|
||||
overFont: font(fsize);
|
||||
width: 101px;
|
||||
secondarySkip: 7px;
|
||||
|
||||
width: -34px;
|
||||
height: 34px;
|
||||
padding: margins(0px, 0px, 0px, 0px);
|
||||
|
||||
textTop: 8px;
|
||||
|
||||
font: semiboldFont;
|
||||
duration: 200;
|
||||
}
|
||||
topBarActionSkip: 13px;
|
||||
topBarClearButton: RoundButton(defaultActiveButton) {
|
||||
textFg: semiboldButtonBlueText;
|
||||
textFgOver: semiboldButtonBlueText;
|
||||
textBg: #ffffff;
|
||||
textBgOver: #f2f7fa;
|
||||
|
||||
width: -18px;
|
||||
}
|
||||
topBarActionSkip: 10px;
|
||||
|
||||
activeFadeInDuration: 500;
|
||||
activeFadeOutDuration: 3000;
|
||||
|
||||
msgRadius: 3px;
|
||||
|
||||
msgMaxWidth: 430px;
|
||||
msgFont: font(fsize);
|
||||
msgNameFont: semiboldFont;
|
||||
|
@ -1260,14 +1277,14 @@ msgFileThumbPadding: margins(10px, 10px, 14px, 10px);
|
|||
msgFileThumbNameTop: 12px;
|
||||
msgFileThumbStatusTop: 32px;
|
||||
msgFileThumbLinkTop: 60px;
|
||||
msgFileThumbLinkInFg: #3da5e0;
|
||||
msgFileThumbLinkInFgSelected: #3da5e0;
|
||||
msgFileThumbLinkInFg: semiboldButtonBlueText;
|
||||
msgFileThumbLinkInFgSelected: semiboldButtonBlueText;
|
||||
msgFileThumbLinkOutFg: #5eba5b;
|
||||
msgFileThumbLinkOutFgSelected: #31a298;
|
||||
msgFileNameTop: 16px;
|
||||
msgFileStatusTop: 37px;
|
||||
msgFileMinWidth: 294px;
|
||||
msgFileInBg: #59b6eb;
|
||||
msgFileInBg: windowActiveBg;
|
||||
msgFileInBgOver: #4eade3;
|
||||
msgFileInBgSelected: #51a3d3;
|
||||
msgFileOutBg: #78c67f;
|
||||
|
@ -1313,7 +1330,7 @@ msgWaveformBar: 2px;
|
|||
msgWaveformSkip: 1px;
|
||||
msgWaveformMin: 2px;
|
||||
msgWaveformMax: 20px;
|
||||
msgWaveformInActive: #59b6eb;
|
||||
msgWaveformInActive: windowActiveBg;
|
||||
msgWaveformInActiveSelected: #51a3d3;
|
||||
msgWaveformInInactive: #d4dee6;
|
||||
msgWaveformInInactiveSelected: #9cc1e1;
|
||||
|
@ -1578,10 +1595,10 @@ contactsScroll: flatScroll(boxScroll) {
|
|||
deltab: 0px;
|
||||
}
|
||||
|
||||
btnNewGroup: iconedButton(btnDefIconed) {
|
||||
icon: sprite(189px, 118px, 18px, 17px);
|
||||
btnAddContact: iconedButton(btnDefIconed) {
|
||||
icon: sprite(188px, 93px, 18px, 18px);
|
||||
iconPos: point(8px, 8px);
|
||||
downIcon: sprite(189px, 118px, 18px, 17px);
|
||||
downIcon: sprite(188px, 93px, 18px, 18px);
|
||||
downIconPos: point(8px, 9px);
|
||||
|
||||
bgColor: transparent;
|
||||
|
@ -1589,11 +1606,7 @@ btnNewGroup: iconedButton(btnDefIconed) {
|
|||
width: 36px;
|
||||
height: 36px;
|
||||
}
|
||||
btnAddContact: iconedButton(btnNewGroup) {
|
||||
icon: sprite(188px, 93px, 18px, 18px);
|
||||
downIcon: sprite(188px, 93px, 18px, 18px);
|
||||
}
|
||||
btnCancelSearch: iconedButton(btnNewGroup) {
|
||||
btnCancelSearch: iconedButton(btnAddContact) {
|
||||
icon: sprite(188px, 43px, 18px, 18px);
|
||||
downIcon: sprite(188px, 43px, 18px, 18px);
|
||||
}
|
||||
|
@ -1734,6 +1747,17 @@ dropdownDef: dropdown {
|
|||
width: 0px;
|
||||
}
|
||||
|
||||
defaultInnerDropdownShadow: icon {
|
||||
{ "dropdown_shadow", windowShadowFg },
|
||||
};
|
||||
defaultInnerDropdown: InnerDropdown {
|
||||
padding: margins(10px, 10px, 10px, 10px);
|
||||
shadow: defaultInnerDropdownShadow;
|
||||
shadowShift: 1px;
|
||||
|
||||
duration: 150;
|
||||
}
|
||||
|
||||
dropdownAttachDocument: iconedButton(btnAttachDocument) {
|
||||
iconPos: point(14px, 13px);
|
||||
downIconPos: point(14px, 14px);
|
||||
|
@ -1988,7 +2012,7 @@ botKbScroll: flatScroll(solidScroll) {
|
|||
deltax: 3px;
|
||||
width: 10px;
|
||||
}
|
||||
switchPmButton: BoxButton(defaultBoxButton) {
|
||||
switchPmButton: RoundButton(defaultBoxButton) {
|
||||
width: 320px;
|
||||
height: 34px;
|
||||
textTop: 7px;
|
||||
|
@ -2148,19 +2172,8 @@ btnContext: iconedButton(btnDefIconed) {
|
|||
downTextPos: point(16px, 8px);
|
||||
}
|
||||
|
||||
photoLoader: size(52px, 22px);
|
||||
photoLoaderBg: #00000054;
|
||||
photoLoaderCnt: 3;
|
||||
photoLoaderPoint: size(6px, 6px);
|
||||
photoLoaderSkip: 6px;
|
||||
photoLoaderPeriod: 600; // ms full period
|
||||
photoLoaderDelta: 150; // ms between points
|
||||
photoLoaderDuration1: 150; // ms fade in
|
||||
photoLoaderDuration2: 150; // ms fade out
|
||||
photoLoaderAlphaMin: 0.1; // not less than that
|
||||
|
||||
radialSize: size(50px, 50px);
|
||||
radialLine: 2px;
|
||||
radialLine: 3px;
|
||||
radialDuration: 350;
|
||||
radialPeriod: 3000;
|
||||
radialBgOpacity: 0.4;
|
||||
|
@ -2169,10 +2182,6 @@ radialDownloadOpacity: 0.8;
|
|||
radialCancel: sprite(378px, 50px, 18px, 18px);
|
||||
radialCancelOpacity: 1.0;
|
||||
|
||||
mediaviewLoader: size(78px, 33px);
|
||||
mediaviewLoaderPoint: size(9px, 9px);
|
||||
mediaviewLoaderSkip: 9px;
|
||||
|
||||
downloadPathSkip: 10px;
|
||||
|
||||
usernamePadding: margins(23px, 22px, 21px, 12px);
|
||||
|
|
|
@ -66,6 +66,8 @@ flatButton {
|
|||
overFont: font;
|
||||
duration: int;
|
||||
cursor: cursor;
|
||||
|
||||
radius: pixels;
|
||||
}
|
||||
|
||||
iconedButton {
|
||||
|
@ -246,6 +248,18 @@ dropdown {
|
|||
width: pixels;
|
||||
}
|
||||
|
||||
InnerDropdown {
|
||||
padding: margins;
|
||||
shadow: icon;
|
||||
shadowShift: pixels;
|
||||
|
||||
duration: int;
|
||||
width: pixels;
|
||||
|
||||
scrollMargin: margins;
|
||||
scrollPadding: margins;
|
||||
}
|
||||
|
||||
PopupMenu {
|
||||
skip: pixels;
|
||||
|
||||
|
@ -297,12 +311,16 @@ botKeyboardButton {
|
|||
downTextTop: pixels;
|
||||
}
|
||||
|
||||
BoxButton {
|
||||
RoundButton {
|
||||
textFg: color;
|
||||
textFgOver: color;
|
||||
textBg: color; // rect of textBg with rounded rect of textBgOver upon it
|
||||
textBgOver: color;
|
||||
|
||||
secondaryTextFg: color;
|
||||
secondaryTextFgOver: color;
|
||||
secondarySkip: pixels;
|
||||
|
||||
width: pixels;
|
||||
height: pixels;
|
||||
padding: margins;
|
||||
|
|
BIN
Telegram/Resources/icons/dialogs_new_chat.png
Normal file
After Width: | Height: | Size: 152 B |
BIN
Telegram/Resources/icons/dialogs_new_chat@2x.png
Normal file
After Width: | Height: | Size: 416 B |
BIN
Telegram/Resources/icons/dropdown_shadow.png
Normal file
After Width: | Height: | Size: 128 B |
BIN
Telegram/Resources/icons/dropdown_shadow@2x.png
Normal file
After Width: | Height: | Size: 146 B |
Before Width: | Height: | Size: 300 B After Width: | Height: | Size: 282 B |
Before Width: | Height: | Size: 559 B After Width: | Height: | Size: 524 B |
|
@ -697,7 +697,7 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org
|
|||
"lng_in_dlg_audio" = "Voice message";
|
||||
"lng_in_dlg_file" = "File";
|
||||
"lng_in_dlg_sticker" = "Sticker";
|
||||
"lng_in_dlg_sticker_emoji" = "{emoji} (sticker)";
|
||||
"lng_in_dlg_sticker_emoji" = "{emoji} Sticker";
|
||||
|
||||
"lng_ban_user" = "Ban User";
|
||||
"lng_delete_all_from" = "Delete all from this user";
|
||||
|
@ -726,7 +726,6 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org
|
|||
"lng_wont_be_notified" = "Members will not be notified when you post";
|
||||
"lng_empty_history" = "";
|
||||
"lng_willbe_history" = "Please select a chat to start messaging";
|
||||
"lng_message_with_from" = "[c]{from}:[/c] {message}";
|
||||
"lng_from_you" = "You";
|
||||
"lng_from_draft" = "Draft";
|
||||
"lng_bot_description" = "What can this bot do?";
|
||||
|
@ -735,6 +734,11 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org
|
|||
"lng_channel_mute" = "Mute";
|
||||
"lng_channel_unmute" = "Unmute";
|
||||
|
||||
"lng_dialogs_text_with_from" = "{from_part} {message}";
|
||||
"lng_dialogs_text_from_wrapped" = "{from}:";
|
||||
"lng_dialogs_text_media" = "{media_part} {caption}";
|
||||
"lng_dialogs_text_media_wrapped" = "{media},";
|
||||
|
||||
"lng_open_this_link" = "Open this link?";
|
||||
"lng_open_link" = "Open";
|
||||
|
||||
|
@ -880,7 +884,7 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org
|
|||
"lng_selected_upload_stop" = "Stop";
|
||||
"lng_selected_delete_sure_this" = "Do you want to delete this message?";
|
||||
"lng_selected_delete_sure" = "Do you want to delete {count:_not_used_|# message|# messages}?";
|
||||
//"lng_delete_photo_sure" = "Do you want to delete this photo?";
|
||||
"lng_delete_photo_sure" = "Do you want to delete this photo?";
|
||||
"lng_box_delete" = "Delete";
|
||||
"lng_box_leave" = "Leave";
|
||||
|
||||
|
@ -917,7 +921,7 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org
|
|||
|
||||
"lng_new_version_wrap" = "Telegram Desktop was updated to version {version}\n\n{changes}\n\nFull version history is available here:\n{link}";
|
||||
"lng_new_version_minor" = "— Bug fixes and other minor improvements";
|
||||
"lng_new_version_text" = "— Introducing Drafts: Seamless syncing for unsent messages on all your devices. Drafts are now visible in your chats list.\n— Completely redesigned group and user profiles.\n— Unread messages counter on the 'Scroll to bottom' button.\n\nMore about this update: {link}";
|
||||
"lng_new_version_text" = "— Fixed photo viewer to handle screen resolution change correctly\n— Fixed forwarding photos via drag-n-drop\n— Various design improvements and other bug fixes";
|
||||
|
||||
"lng_menu_insert_unicode" = "Insert Unicode control character";
|
||||
|
||||
|
|
|
@ -34,8 +34,8 @@ IDI_ICON1 ICON "..\\art\\icon256.ico"
|
|||
//
|
||||
|
||||
VS_VERSION_INFO VERSIONINFO
|
||||
FILEVERSION 0,9,51,0
|
||||
PRODUCTVERSION 0,9,51,0
|
||||
FILEVERSION 0,9,55,0
|
||||
PRODUCTVERSION 0,9,55,0
|
||||
FILEFLAGSMASK 0x3fL
|
||||
#ifdef _DEBUG
|
||||
FILEFLAGS 0x1L
|
||||
|
@ -51,10 +51,10 @@ BEGIN
|
|||
BLOCK "040904b0"
|
||||
BEGIN
|
||||
VALUE "CompanyName", "Telegram Messenger LLP"
|
||||
VALUE "FileVersion", "0.9.51.0"
|
||||
VALUE "FileVersion", "0.9.55.0"
|
||||
VALUE "LegalCopyright", "Copyright (C) 2014-2016"
|
||||
VALUE "ProductName", "Telegram Desktop"
|
||||
VALUE "ProductVersion", "0.9.51.0"
|
||||
VALUE "ProductVersion", "0.9.55.0"
|
||||
END
|
||||
END
|
||||
BLOCK "VarFileInfo"
|
||||
|
|
|
@ -25,8 +25,8 @@ LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
|
|||
//
|
||||
|
||||
VS_VERSION_INFO VERSIONINFO
|
||||
FILEVERSION 0,9,51,0
|
||||
PRODUCTVERSION 0,9,51,0
|
||||
FILEVERSION 0,9,55,0
|
||||
PRODUCTVERSION 0,9,55,0
|
||||
FILEFLAGSMASK 0x3fL
|
||||
#ifdef _DEBUG
|
||||
FILEFLAGS 0x1L
|
||||
|
@ -43,10 +43,10 @@ BEGIN
|
|||
BEGIN
|
||||
VALUE "CompanyName", "Telegram Messenger LLP"
|
||||
VALUE "FileDescription", "Telegram Updater"
|
||||
VALUE "FileVersion", "0.9.51.0"
|
||||
VALUE "FileVersion", "0.9.55.0"
|
||||
VALUE "LegalCopyright", "Copyright (C) 2014-2016"
|
||||
VALUE "ProductName", "Telegram Desktop"
|
||||
VALUE "ProductVersion", "0.9.51.0"
|
||||
VALUE "ProductVersion", "0.9.55.0"
|
||||
END
|
||||
END
|
||||
BLOCK "VarFileInfo"
|
||||
|
|
|
@ -32,8 +32,6 @@ Q_IMPORT_PLUGIN(QCocoaIntegrationPlugin)
|
|||
Q_IMPORT_PLUGIN(QDDSPlugin)
|
||||
Q_IMPORT_PLUGIN(QICNSPlugin)
|
||||
Q_IMPORT_PLUGIN(QICOPlugin)
|
||||
Q_IMPORT_PLUGIN(QJp2Plugin)
|
||||
Q_IMPORT_PLUGIN(QMngPlugin)
|
||||
Q_IMPORT_PLUGIN(QTgaPlugin)
|
||||
Q_IMPORT_PLUGIN(QTiffPlugin)
|
||||
Q_IMPORT_PLUGIN(QWbmpPlugin)
|
||||
|
|
|
@ -31,8 +31,6 @@ Q_IMPORT_PLUGIN(QCocoaIntegrationPlugin)
|
|||
Q_IMPORT_PLUGIN(QDDSPlugin)
|
||||
Q_IMPORT_PLUGIN(QICNSPlugin)
|
||||
Q_IMPORT_PLUGIN(QICOPlugin)
|
||||
Q_IMPORT_PLUGIN(QJp2Plugin)
|
||||
Q_IMPORT_PLUGIN(QMngPlugin)
|
||||
Q_IMPORT_PLUGIN(QTgaPlugin)
|
||||
Q_IMPORT_PLUGIN(QTiffPlugin)
|
||||
Q_IMPORT_PLUGIN(QWbmpPlugin)
|
||||
|
|
|
@ -27,8 +27,6 @@ Q_IMPORT_PLUGIN(QCocoaIntegrationPlugin)
|
|||
Q_IMPORT_PLUGIN(QDDSPlugin)
|
||||
Q_IMPORT_PLUGIN(QICNSPlugin)
|
||||
Q_IMPORT_PLUGIN(QICOPlugin)
|
||||
Q_IMPORT_PLUGIN(QJp2Plugin)
|
||||
Q_IMPORT_PLUGIN(QMngPlugin)
|
||||
Q_IMPORT_PLUGIN(QTgaPlugin)
|
||||
Q_IMPORT_PLUGIN(QTiffPlugin)
|
||||
Q_IMPORT_PLUGIN(QWbmpPlugin)
|
||||
|
|
|
@ -493,7 +493,10 @@ namespace {
|
|||
if (d.has_bot_info_version()) {
|
||||
data->setBotInfoVersion(d.vbot_info_version.v);
|
||||
data->botInfo->readsAllHistory = d.is_bot_chat_history();
|
||||
data->botInfo->cantJoinGroups = d.is_bot_nochats();
|
||||
if (data->botInfo->cantJoinGroups != d.is_bot_nochats()) {
|
||||
data->botInfo->cantJoinGroups = d.is_bot_nochats();
|
||||
update.flags |= UpdateFlag::BotCanAddToGroups;
|
||||
}
|
||||
data->botInfo->inlinePlaceholder = d.has_bot_inline_placeholder() ? '_' + qs(d.vbot_inline_placeholder) : QString();
|
||||
} else {
|
||||
data->setBotInfoVersion(-1);
|
||||
|
@ -1220,7 +1223,7 @@ namespace {
|
|||
}
|
||||
}
|
||||
|
||||
void feedOutboxRead(const PeerId &peer, MsgId upTo) {
|
||||
void feedOutboxRead(const PeerId &peer, MsgId upTo, TimeId when) {
|
||||
if (auto history = App::historyLoaded(peer)) {
|
||||
history->outboxRead(upTo);
|
||||
if (history->lastMsg && history->lastMsg->out() && history->lastMsg->id <= upTo) {
|
||||
|
@ -1229,7 +1232,7 @@ namespace {
|
|||
history->updateChatListEntry();
|
||||
|
||||
if (history->peer->isUser()) {
|
||||
history->peer->asUser()->madeAction();
|
||||
history->peer->asUser()->madeAction(when);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -2285,7 +2288,9 @@ namespace {
|
|||
setLaunchState(QuitRequested);
|
||||
|
||||
if (auto window = wnd()) {
|
||||
window->hide();
|
||||
if (!Sandbox::isSavingSession()) {
|
||||
window->hide();
|
||||
}
|
||||
}
|
||||
if (auto mainwidget = main()) {
|
||||
mainwidget->saveDraftToCloud();
|
||||
|
|
|
@ -83,7 +83,7 @@ namespace App {
|
|||
void feedMsgs(const QVector<MTPMessage> &msgs, NewMessageType type);
|
||||
void feedMsgs(const MTPVector<MTPMessage> &msgs, NewMessageType type);
|
||||
void feedInboxRead(const PeerId &peer, MsgId upTo);
|
||||
void feedOutboxRead(const PeerId &peer, MsgId upTo);
|
||||
void feedOutboxRead(const PeerId &peer, MsgId upTo, TimeId when);
|
||||
void feedWereDeleted(ChannelId channelId, const QVector<MTPint> &msgsIds);
|
||||
void feedUserLink(MTPint userId, const MTPContactLink &myLink, const MTPContactLink &foreignLink);
|
||||
|
||||
|
|
|
@ -780,10 +780,6 @@ void AppClass::regPhotoUpdate(const PeerId &peer, const FullMsgId &msgId) {
|
|||
photoUpdates.insert(msgId, peer);
|
||||
}
|
||||
|
||||
void AppClass::clearPhotoUpdates() {
|
||||
photoUpdates.clear();
|
||||
}
|
||||
|
||||
bool AppClass::isPhotoUpdating(const PeerId &peer) {
|
||||
for (QMap<FullMsgId, PeerId>::iterator i = photoUpdates.begin(), e = photoUpdates.end(); i != e; ++i) {
|
||||
if (i.value() == peer) {
|
||||
|
@ -1049,9 +1045,9 @@ void AppClass::checkMapVersion() {
|
|||
if (Local::oldMapVersion() < AppVersion) {
|
||||
if (Local::oldMapVersion()) {
|
||||
QString versionFeatures;
|
||||
if ((cAlphaVersion() || cBetaVersion()) && Local::oldMapVersion() < 9050) {
|
||||
// versionFeatures = QString::fromUtf8("\xe2\x80\x94 Select and copy text in photo / video captions and web page previews\n\xe2\x80\x94 Media player shortcuts are enabled only when player is opened");
|
||||
versionFeatures = langNewVersionText();
|
||||
if ((cAlphaVersion() || cBetaVersion()) && Local::oldMapVersion() < 9055) {
|
||||
versionFeatures = QString::fromUtf8("\xe2\x80\x94 Main window position and size are saved between the launches in Windows\n\xe2\x80\x94 Dock and top bar hiding fixed in OS X\n\xe2\x80\x94 Various design improvements and other bug fixes");
|
||||
// versionFeatures = langNewVersionText();
|
||||
} else if (Local::oldMapVersion() < 9050) {
|
||||
versionFeatures = langNewVersionText();
|
||||
} else {
|
||||
|
|
|
@ -159,7 +159,6 @@ public:
|
|||
FileUploader *uploader();
|
||||
void uploadProfilePhoto(const QImage &tosend, const PeerId &peerId);
|
||||
void regPhotoUpdate(const PeerId &peer, const FullMsgId &msgId);
|
||||
void clearPhotoUpdates();
|
||||
bool isPhotoUpdating(const PeerId &peer);
|
||||
void cancelPhotoUpdate(const PeerId &peer);
|
||||
|
||||
|
|
|
@ -35,7 +35,7 @@ TextParseOptions _confirmBoxTextOptions = {
|
|||
Qt::LayoutDirectionAuto, // dir
|
||||
};
|
||||
|
||||
ConfirmBox::ConfirmBox(const QString &text, const QString &doneText, const style::BoxButton &doneStyle, const QString &cancelText, const style::BoxButton &cancelStyle) : AbstractBox(st::boxWidth)
|
||||
ConfirmBox::ConfirmBox(const QString &text, const QString &doneText, const style::RoundButton &doneStyle, const QString &cancelText, const style::RoundButton &cancelStyle) : AbstractBox(st::boxWidth)
|
||||
, _informative(false)
|
||||
, _text(100)
|
||||
, _confirm(this, doneText.isEmpty() ? lang(lng_box_ok) : doneText, doneStyle)
|
||||
|
@ -43,7 +43,7 @@ ConfirmBox::ConfirmBox(const QString &text, const QString &doneText, const style
|
|||
init(text);
|
||||
}
|
||||
|
||||
ConfirmBox::ConfirmBox(const QString &text, const QString &doneText, const style::BoxButton &doneStyle, bool informative) : AbstractBox(st::boxWidth)
|
||||
ConfirmBox::ConfirmBox(const QString &text, const QString &doneText, const style::RoundButton &doneStyle, bool informative) : AbstractBox(st::boxWidth)
|
||||
, _informative(true)
|
||||
, _text(100)
|
||||
, _confirm(this, doneText.isEmpty() ? lang(lng_box_ok) : doneText, doneStyle)
|
||||
|
@ -504,3 +504,19 @@ void RichDeleteMessageBox::hideAll() {
|
|||
_delete.hide();
|
||||
_cancel.hide();
|
||||
}
|
||||
|
||||
KickMemberBox::KickMemberBox(PeerData *chat, UserData *member)
|
||||
: ConfirmBox(lng_profile_sure_kick(lt_user, member->firstName), lang(lng_box_remove))
|
||||
, _chat(chat)
|
||||
, _member(member) {
|
||||
connect(this, SIGNAL(confirmed()), this, SLOT(onConfirm()));
|
||||
}
|
||||
|
||||
void KickMemberBox::onConfirm() {
|
||||
Ui::hideLayer();
|
||||
if (auto chat = _chat->asChat()) {
|
||||
App::main()->kickParticipant(chat, _member);
|
||||
} else if (auto channel = _chat->asChannel()) {
|
||||
App::api()->kickParticipant(channel, _member);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -29,7 +29,7 @@ class ConfirmBox : public AbstractBox, public ClickHandlerHost {
|
|||
|
||||
public:
|
||||
|
||||
ConfirmBox(const QString &text, const QString &doneText = QString(), const style::BoxButton &doneStyle = st::defaultBoxButton, const QString &cancelText = QString(), const style::BoxButton &cancelStyle = st::cancelBoxButton);
|
||||
ConfirmBox(const QString &text, const QString &doneText = QString(), const style::RoundButton &doneStyle = st::defaultBoxButton, const QString &cancelText = QString(), const style::RoundButton &cancelStyle = st::cancelBoxButton);
|
||||
void keyPressEvent(QKeyEvent *e);
|
||||
void paintEvent(QPaintEvent *e);
|
||||
void resizeEvent(QResizeEvent *e);
|
||||
|
@ -61,7 +61,7 @@ protected:
|
|||
|
||||
private:
|
||||
|
||||
ConfirmBox(const QString &text, const QString &doneText, const style::BoxButton &doneStyle, bool informative);
|
||||
ConfirmBox(const QString &text, const QString &doneText, const style::RoundButton &doneStyle, bool informative);
|
||||
friend class InformBox;
|
||||
|
||||
void init(const QString &text);
|
||||
|
@ -80,7 +80,7 @@ private:
|
|||
|
||||
class InformBox : public ConfirmBox {
|
||||
public:
|
||||
InformBox(const QString &text, const QString &doneText = QString(), const style::BoxButton &doneStyle = st::defaultBoxButton) : ConfirmBox(text, doneText, doneStyle, true) {
|
||||
InformBox(const QString &text, const QString &doneText = QString(), const style::RoundButton &doneStyle = st::defaultBoxButton) : ConfirmBox(text, doneText, doneStyle, true) {
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -251,3 +251,18 @@ private:
|
|||
BoxButton _delete, _cancel;
|
||||
|
||||
};
|
||||
|
||||
class KickMemberBox : public ConfirmBox {
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
KickMemberBox(PeerData *chat, UserData *member);
|
||||
|
||||
private slots:
|
||||
void onConfirm();
|
||||
|
||||
private:
|
||||
PeerData *_chat;
|
||||
UserData *_member;
|
||||
|
||||
};
|
||||
|
|
|
@ -646,6 +646,10 @@ bool Generator::collectUniqueValues() {
|
|||
int iconMaskIndex = 0;
|
||||
std::function<bool(const Variable&)> collector = [this, &collector, &fontFamilyIndex, &iconMaskIndex](const Variable &variable) {
|
||||
auto value = variable.value;
|
||||
if (!value.copyOf().isEmpty()) {
|
||||
return true;
|
||||
}
|
||||
|
||||
switch (value.type().tag) {
|
||||
case Tag::Invalid:
|
||||
case Tag::Int:
|
||||
|
|
|
@ -52,7 +52,7 @@ const Struct *Module::findStruct(const FullName &name) const {
|
|||
return result;
|
||||
}
|
||||
for (const auto &module : included_) {
|
||||
if (auto result = findStructInModule(name, *module)) {
|
||||
if (auto result = module->findStruct(name)) {
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
@ -68,12 +68,14 @@ bool Module::addVariable(const Variable &value) {
|
|||
return true;
|
||||
}
|
||||
|
||||
const Variable *Module::findVariable(const FullName &name) const {
|
||||
const Variable *Module::findVariable(const FullName &name, bool *outFromThisModule) const {
|
||||
if (auto result = findVariableInModule(name, *this)) {
|
||||
if (outFromThisModule) *outFromThisModule = true;
|
||||
return result;
|
||||
}
|
||||
for (const auto &module : included_) {
|
||||
if (auto result = findVariableInModule(name, *module)) {
|
||||
if (auto result = module->findVariable(name)) {
|
||||
if (outFromThisModule) *outFromThisModule = false;
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -75,7 +75,7 @@ public:
|
|||
// Returns false if there is a variable with such name already.
|
||||
bool addVariable(const Variable &value);
|
||||
// Returns nullptr if there is no such variable in result_ or any of included modules.
|
||||
const Variable *findVariable(const FullName &name) const;
|
||||
const Variable *findVariable(const FullName &name, bool *outFromThisModule = nullptr) const;
|
||||
bool hasVariables() const {
|
||||
return !variables_.isEmpty();
|
||||
}
|
||||
|
|
|
@ -43,6 +43,7 @@ constexpr int kErrorUnknownField = 803;
|
|||
constexpr int kErrorIdentifierNotFound = 804;
|
||||
constexpr int kErrorAlreadyDefined = 805;
|
||||
constexpr int kErrorBadString = 806;
|
||||
constexpr int kErrorIconDuplicate = 807;
|
||||
|
||||
QString findInputFile(const Options &options) {
|
||||
for (const auto &dir : options.includePaths) {
|
||||
|
@ -351,7 +352,8 @@ structure::Value ParsedFile::defaultConstructedStruct(const structure::FullName
|
|||
}
|
||||
|
||||
void ParsedFile::applyStructParent(structure::Value &result, const structure::FullName &parentName) {
|
||||
if (auto parent = module_->findVariable(parentName)) {
|
||||
bool fromTheSameModule = false;
|
||||
if (auto parent = module_->findVariable(parentName, &fromTheSameModule)) {
|
||||
if (parent->value.type() != result.type()) {
|
||||
logErrorTypeMismatch() << "parent '" << logFullName(parentName) << "' has type '" << logType(parent->value.type()) << "' while child value has type " << logType(result.type());
|
||||
return;
|
||||
|
@ -374,6 +376,22 @@ void ParsedFile::applyStructParent(structure::Value &result, const structure::Fu
|
|||
const auto &srcValue(srcField.variable.value);
|
||||
auto &dstValue(dstField.variable.value);
|
||||
logAssert(srcValue.type() == dstValue.type()) << "struct field type check failed";
|
||||
|
||||
// Optimization: don't let the style files to contain unnamed inherited
|
||||
// icons from the other (included) style files, because they will
|
||||
// duplicate the binary data across different style c++ source files.
|
||||
//
|
||||
// Example:
|
||||
// a.style has "A: Struct { icon: icon { ..file.. } };" and
|
||||
// b.style has "B: Struct(A) { .. };" with non-overriden icon field.
|
||||
// Then both style_a.cpp and style_b.cpp will contain binary data of "file".
|
||||
if (!fromTheSameModule
|
||||
&& srcValue.type().tag == structure::TypeTag::Icon
|
||||
&& !srcValue.Icon().parts.empty()
|
||||
&& srcValue.copyOf().isEmpty()) {
|
||||
logError(kErrorIconDuplicate) << "an unnamed icon field '" << logFullName(srcField.variable.name) << "' is inherited from parent '" << logFullName(parentName) << "'";
|
||||
return;
|
||||
}
|
||||
dstValue = srcValue;
|
||||
dstField.status = Status::Implicit;
|
||||
}
|
||||
|
|
|
@ -130,9 +130,9 @@ TimeId fromServerTime(const MTPint &serverTime) {
|
|||
return serverTime.v - unixtimeDelta;
|
||||
}
|
||||
|
||||
MTPint toServerTime(const TimeId &clientTime) {
|
||||
void toServerTime(const TimeId &clientTime, MTPint &outServerTime) {
|
||||
QReadLocker locker(&unixtimeLock);
|
||||
return MTP_int(clientTime + unixtimeDelta);
|
||||
outServerTime = MTP_int(clientTime + unixtimeDelta);
|
||||
}
|
||||
|
||||
QDateTime dateFromServerTime(TimeId time) {
|
||||
|
@ -254,7 +254,7 @@ namespace {
|
|||
namespace ThirdParty {
|
||||
|
||||
void start() {
|
||||
PlatformSpecific::ThirdParty::start();
|
||||
Platform::ThirdParty::start();
|
||||
|
||||
if (!RAND_status()) { // should be always inited in all modern OS
|
||||
char buf[16];
|
||||
|
@ -293,7 +293,7 @@ namespace ThirdParty {
|
|||
delete[] _sslLocks;
|
||||
_sslLocks = 0;
|
||||
|
||||
PlatformSpecific::ThirdParty::finish();
|
||||
Platform::ThirdParty::finish();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -490,6 +490,7 @@ void unixtimeInit();
|
|||
void unixtimeSet(TimeId servertime, bool force = false);
|
||||
TimeId unixtime();
|
||||
TimeId fromServerTime(const MTPint &serverTime);
|
||||
void toServerTime(const TimeId &clientTime, MTPint &outServerTime);
|
||||
uint64 msgid();
|
||||
int32 reqid();
|
||||
|
||||
|
|
|
@ -24,7 +24,7 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org
|
|||
|
||||
#define BETA_VERSION_MACRO (0ULL)
|
||||
|
||||
constexpr int AppVersion = 9051;
|
||||
constexpr str_const AppVersionStr = "0.9.51";
|
||||
constexpr bool AppAlphaVersion = false;
|
||||
constexpr int AppVersion = 9055;
|
||||
constexpr str_const AppVersionStr = "0.9.55";
|
||||
constexpr bool AppAlphaVersion = true;
|
||||
constexpr uint64 AppBetaVersion = BETA_VERSION_MACRO;
|
||||
|
|
|
@ -42,7 +42,6 @@ void applyPeerCloudDraft(PeerId peerId, const MTPDdraftMessage &draft) {
|
|||
history->setCloudDraft(std_::move(cloudDraft));
|
||||
history->createLocalDraftFromCloud();
|
||||
history->updateChatListSortPosition();
|
||||
history->updateChatListEntry();
|
||||
|
||||
if (auto main = App::main()) {
|
||||
main->applyCloudDraft(history);
|
||||
|
@ -56,7 +55,6 @@ void clearPeerCloudDraft(PeerId peerId) {
|
|||
history->clearLocalDraft();
|
||||
|
||||
history->updateChatListSortPosition();
|
||||
history->updateChatListEntry();
|
||||
|
||||
if (auto main = App::main()) {
|
||||
main->applyCloudDraft(history);
|
||||
|
|
|
@ -23,8 +23,8 @@ using "basic_types.style";
|
|||
|
||||
dialogsUnreadFg: #ffffff;
|
||||
dialogsUnreadFgActive: #5b94bf;
|
||||
dialogsUnreadBg: #009ce6;//#6fc766;
|
||||
dialogsUnreadBgMuted: #bbb;
|
||||
dialogsUnreadBg: windowActiveBg;
|
||||
dialogsUnreadBgMuted: #bbbbbb;
|
||||
dialogsUnreadBgActive: #ffffff;
|
||||
dialogsUnreadBgMutedActive: #d3e2ee;
|
||||
dialogsUnreadFont: font(12px bold);
|
||||
|
@ -85,3 +85,19 @@ dialogsTextStyleActive: textStyle(dialogsTextStyle) {
|
|||
linkFg: dialogsTextFgActive;
|
||||
linkFgDown: dialogsTextFgActive;
|
||||
}
|
||||
|
||||
dialogsNewChatIcon: icon {
|
||||
{ "dialogs_new_chat", #b7b7b7, point(9px, 10px) }
|
||||
};
|
||||
dialogsNewChatButton: RoundButton {
|
||||
width: 36px;
|
||||
height: 36px;
|
||||
icon: dialogsNewChatIcon;
|
||||
|
||||
textFg: transparent;
|
||||
textFgOver: transparent;
|
||||
secondaryTextFg: transparent;
|
||||
secondaryTextFgOver: transparent;
|
||||
textBg: transparent;
|
||||
textBgOver: transparent;
|
||||
}
|
||||
|
|
|
@ -88,10 +88,9 @@ void paintRow(Painter &p, History *history, HistoryItem *item, Data::Draft *draf
|
|||
p.setPen(active ? st::dialogsTextFgActive : st::dialogsTextFgService);
|
||||
if (history->typing.isEmpty() && history->sendActions.isEmpty()) {
|
||||
if (history->cloudDraftTextCache.isEmpty()) {
|
||||
TextCustomTagsMap custom;
|
||||
custom.insert(QChar('c'), qMakePair(textcmdStartLink(1), textcmdStopLink()));
|
||||
QString msg = lng_message_with_from(lt_from, textRichPrepare(lang(lng_from_draft)), lt_message, textRichPrepare(draft->textWithTags.text));
|
||||
history->cloudDraftTextCache.setRichText(st::dialogsTextFont, msg, _textDlgOptions, custom);
|
||||
auto draftWrapped = textcmdLink(1, lng_dialogs_text_from_wrapped(lt_from, lang(lng_from_draft)));
|
||||
auto draftText = lng_dialogs_text_with_from(lt_from_part, draftWrapped, lt_message, textClean(draft->textWithTags.text));
|
||||
history->cloudDraftTextCache.setText(st::dialogsTextFont, draftText, _textDlgOptions);
|
||||
}
|
||||
textstyleSet(&(active ? st::dialogsTextStyleActive : st::dialogsTextStyleDraft));
|
||||
p.setFont(st::dialogsTextFont);
|
||||
|
@ -140,59 +139,78 @@ void paintRow(Painter &p, History *history, HistoryItem *item, Data::Draft *draf
|
|||
history->peer->dialogName().drawElided(p, rectForName.left(), rectForName.top(), rectForName.width());
|
||||
}
|
||||
|
||||
class UnreadBadgeStyleData : public Data::AbstractStructure {
|
||||
public:
|
||||
struct UnreadBadgeSizeData {
|
||||
QImage circle;
|
||||
QPixmap left[4], right[4];
|
||||
};
|
||||
class UnreadBadgeStyleData : public Data::AbstractStructure {
|
||||
public:
|
||||
UnreadBadgeSizeData sizes[UnreadBadgeSizesCount];
|
||||
style::color bg[4] = { st::dialogsUnreadBg, st::dialogsUnreadBgActive, st::dialogsUnreadBgMuted, st::dialogsUnreadBgMutedActive };
|
||||
};
|
||||
Data::GlobalStructurePointer<UnreadBadgeStyleData> unreadBadgeStyle;
|
||||
|
||||
void createCircleMask(int size) {
|
||||
if (!unreadBadgeStyle->circle.isNull()) return;
|
||||
void createCircleMask(UnreadBadgeSizeData *data, int size) {
|
||||
if (!data->circle.isNull()) return;
|
||||
|
||||
unreadBadgeStyle->circle = style::createCircleMask(size);
|
||||
data->circle = style::createCircleMask(size);
|
||||
}
|
||||
|
||||
QImage colorizeCircleHalf(int size, int half, int xoffset, style::color color) {
|
||||
auto result = style::colorizeImage(unreadBadgeStyle->circle, color, QRect(xoffset, 0, half, size));
|
||||
QImage colorizeCircleHalf(UnreadBadgeSizeData *data, int size, int half, int xoffset, style::color color) {
|
||||
auto result = style::colorizeImage(data->circle, color, QRect(xoffset, 0, half, size));
|
||||
result.setDevicePixelRatio(cRetinaFactor());
|
||||
return result;
|
||||
}
|
||||
|
||||
} // namepsace
|
||||
|
||||
void paintUnreadBadge(Painter &p, const QRect &rect, bool active, bool muted) {
|
||||
int index = (active ? 0x01 : 0x00) | (muted ? 0x02 : 0x00);
|
||||
int size = rect.height(), sizehalf = size / 2;
|
||||
void paintUnreadBadge(Painter &p, const QRect &rect, const UnreadBadgeStyle &st) {
|
||||
t_assert(rect.height() == st.size);
|
||||
|
||||
int index = (st.active ? 0x01 : 0x00) | (st.muted ? 0x02 : 0x00);
|
||||
int size = st.size, sizehalf = size / 2;
|
||||
|
||||
unreadBadgeStyle.createIfNull();
|
||||
auto badgeData = unreadBadgeStyle->sizes;
|
||||
if (st.sizeId > 0) {
|
||||
t_assert(st.sizeId < UnreadBadgeSizesCount);
|
||||
badgeData = &unreadBadgeStyle->sizes[st.sizeId];
|
||||
}
|
||||
style::color bg = unreadBadgeStyle->bg[index];
|
||||
if (unreadBadgeStyle->left[index].isNull()) {
|
||||
if (badgeData->left[index].isNull()) {
|
||||
int imgsize = size * cIntRetinaFactor(), imgsizehalf = sizehalf * cIntRetinaFactor();
|
||||
createCircleMask(size);
|
||||
unreadBadgeStyle->left[index] = App::pixmapFromImageInPlace(colorizeCircleHalf(imgsize, imgsizehalf, 0, bg));
|
||||
unreadBadgeStyle->right[index] = App::pixmapFromImageInPlace(colorizeCircleHalf(imgsize, imgsizehalf, imgsize - imgsizehalf, bg));
|
||||
createCircleMask(badgeData, size);
|
||||
badgeData->left[index] = App::pixmapFromImageInPlace(colorizeCircleHalf(badgeData, imgsize, imgsizehalf, 0, bg));
|
||||
badgeData->right[index] = App::pixmapFromImageInPlace(colorizeCircleHalf(badgeData, imgsize, imgsizehalf, imgsize - imgsizehalf, bg));
|
||||
}
|
||||
|
||||
int bar = rect.width() - 2 * sizehalf;
|
||||
p.drawPixmap(rect.x(), rect.y(), unreadBadgeStyle->left[index]);
|
||||
p.drawPixmap(rect.x(), rect.y(), badgeData->left[index]);
|
||||
if (bar) {
|
||||
p.fillRect(rect.x() + sizehalf, rect.y(), bar, rect.height(), bg);
|
||||
}
|
||||
p.drawPixmap(rect.x() + sizehalf + bar, rect.y(), unreadBadgeStyle->right[index]);
|
||||
p.drawPixmap(rect.x() + sizehalf + bar, rect.y(), badgeData->right[index]);
|
||||
}
|
||||
|
||||
void paintUnreadCount(Painter &p, const QString &text, int x, int y, style::align align, bool active, bool muted, int *outUnreadWidth) {
|
||||
int unreadWidth = st::dialogsUnreadFont->width(text);
|
||||
UnreadBadgeStyle::UnreadBadgeStyle()
|
||||
: align(style::al_right)
|
||||
, active(false)
|
||||
, muted(false)
|
||||
, size(st::dialogsUnreadHeight)
|
||||
, sizeId(UnreadBadgeInDialogs)
|
||||
, font(st::dialogsUnreadFont) {
|
||||
}
|
||||
|
||||
void paintUnreadCount(Painter &p, const QString &text, int x, int y, const UnreadBadgeStyle &st, int *outUnreadWidth) {
|
||||
int unreadWidth = st.font->width(text);
|
||||
int unreadRectWidth = unreadWidth + 2 * st::dialogsUnreadPadding;
|
||||
int unreadRectHeight = st::dialogsUnreadHeight;
|
||||
int unreadRectHeight = st.size;
|
||||
accumulate_max(unreadRectWidth, unreadRectHeight);
|
||||
|
||||
int unreadRectLeft = x;
|
||||
if ((align & Qt::AlignHorizontal_Mask) & style::al_center) {
|
||||
if ((st.align & Qt::AlignHorizontal_Mask) & style::al_center) {
|
||||
unreadRectLeft = (x - unreadRectWidth) / 2;
|
||||
} else if ((align & Qt::AlignHorizontal_Mask) & style::al_right) {
|
||||
} else if ((st.align & Qt::AlignHorizontal_Mask) & style::al_right) {
|
||||
unreadRectLeft = x - unreadRectWidth;
|
||||
}
|
||||
int unreadRectTop = y;
|
||||
|
@ -200,11 +218,11 @@ void paintUnreadCount(Painter &p, const QString &text, int x, int y, style::alig
|
|||
*outUnreadWidth = unreadRectWidth;
|
||||
}
|
||||
|
||||
paintUnreadBadge(p, QRect(unreadRectLeft, unreadRectTop, unreadRectWidth, unreadRectHeight), active, muted);
|
||||
paintUnreadBadge(p, QRect(unreadRectLeft, unreadRectTop, unreadRectWidth, unreadRectHeight), st);
|
||||
|
||||
p.setFont(st::dialogsUnreadFont);
|
||||
p.setPen(active ? st::dialogsUnreadFgActive : st::dialogsUnreadFg);
|
||||
p.drawText(unreadRectLeft + (unreadRectWidth - unreadWidth) / 2, unreadRectTop + st::dialogsUnreadTop + st::dialogsUnreadFont->ascent, text);
|
||||
p.setFont(st.font);
|
||||
p.setPen(st.active ? st::dialogsUnreadFgActive : st::dialogsUnreadFg);
|
||||
p.drawText(unreadRectLeft + (unreadRectWidth - unreadWidth) / 2, unreadRectTop + st::dialogsUnreadTop + st.font->ascent, text);
|
||||
}
|
||||
|
||||
void RowPainter::paint(Painter &p, const Row *row, int w, bool active, bool selected, bool onlyBackground) {
|
||||
|
@ -242,7 +260,11 @@ void RowPainter::paint(Painter &p, const Row *row, int w, bool active, bool sele
|
|||
int unreadRight = w - st::dialogsPadding.x();
|
||||
int unreadTop = texttop + st::dialogsTextFont->ascent - st::dialogsUnreadFont->ascent - st::dialogsUnreadTop;
|
||||
int unreadWidth = 0;
|
||||
paintUnreadCount(p, counter, unreadRight, unreadTop, style::al_right, active, mutedCounter, &unreadWidth);
|
||||
|
||||
UnreadBadgeStyle st;
|
||||
st.active = active;
|
||||
st.muted = history->mute();
|
||||
paintUnreadCount(p, counter, unreadRight, unreadTop, st, &unreadWidth);
|
||||
availableWidth -= unreadWidth + st::dialogsUnreadPadding;
|
||||
}
|
||||
if (history->typing.isEmpty() && history->sendActions.isEmpty()) {
|
||||
|
@ -281,7 +303,9 @@ void paintImportantSwitch(Painter &p, Mode current, int w, bool selected, bool o
|
|||
if (mutedHidden) {
|
||||
if (int32 unread = App::histories().unreadMutedCount()) {
|
||||
int unreadRight = w - st::dialogsPadding.x();
|
||||
paintUnreadCount(p, QString::number(unread), unreadRight, unreadTop, style::al_right, false, true, nullptr);
|
||||
UnreadBadgeStyle st;
|
||||
st.muted = true;
|
||||
paintUnreadCount(p, QString::number(unread), unreadRight, unreadTop, st, nullptr);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -35,8 +35,23 @@ public:
|
|||
|
||||
void paintImportantSwitch(Painter &p, Mode current, int w, bool selected, bool onlyBackground);
|
||||
|
||||
void paintUnreadCount(Painter &p, const QString &text, int x, int y, style::align align, bool active, bool muted, int *outUnreadWidth);
|
||||
void paintUnreadBadge(Painter &p, const QRect &rect, bool active, bool muted);
|
||||
enum UnreadBadgeSize {
|
||||
UnreadBadgeInDialogs = 0,
|
||||
UnreadBadgeInHistoryToDown,
|
||||
|
||||
UnreadBadgeSizesCount
|
||||
};
|
||||
struct UnreadBadgeStyle {
|
||||
UnreadBadgeStyle();
|
||||
|
||||
style::align align;
|
||||
bool active;
|
||||
bool muted;
|
||||
int size;
|
||||
UnreadBadgeSize sizeId;
|
||||
style::font font;
|
||||
};
|
||||
void paintUnreadCount(Painter &p, const QString &text, int x, int y, const UnreadBadgeStyle &st, int *outUnreadWidth = nullptr);
|
||||
|
||||
} // namespace Layout
|
||||
} // namespace Dialogs
|
||||
|
|
|
@ -24,6 +24,7 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org
|
|||
#include "dialogs/dialogs_indexed_list.h"
|
||||
#include "dialogs/dialogs_layout.h"
|
||||
#include "styles/style_dialogs.h"
|
||||
#include "ui/buttons/round_button.h"
|
||||
#include "data/data_drafts.h"
|
||||
#include "lang.h"
|
||||
#include "application.h"
|
||||
|
@ -1759,7 +1760,7 @@ DialogsWidget::DialogsWidget(MainWidget *parent) : TWidget(parent)
|
|||
, _dialogsRequest(0)
|
||||
, _contactsRequest(0)
|
||||
, _filter(this, st::dlgFilter, lang(lng_dlg_filter))
|
||||
, _newGroup(this, st::btnNewGroup)
|
||||
, _newGroup(this, QString(), st::dialogsNewChatButton)
|
||||
, _addContact(this, st::btnAddContact)
|
||||
, _cancelSearch(this, st::btnCancelSearch)
|
||||
, _scroll(this, st::dialogsScroll)
|
||||
|
@ -1787,7 +1788,7 @@ DialogsWidget::DialogsWidget(MainWidget *parent) : TWidget(parent)
|
|||
connect(&_filter, SIGNAL(cursorPositionChanged(int,int)), this, SLOT(onFilterCursorMoved(int,int)));
|
||||
connect(parent, SIGNAL(dialogsUpdated()), this, SLOT(onListScroll()));
|
||||
connect(&_addContact, SIGNAL(clicked()), this, SLOT(onAddContact()));
|
||||
connect(&_newGroup, SIGNAL(clicked()), this, SLOT(onNewGroup()));
|
||||
connect(_newGroup, SIGNAL(clicked()), this, SLOT(onNewGroup()));
|
||||
connect(&_cancelSearch, SIGNAL(clicked()), this, SLOT(onCancelSearch()));
|
||||
|
||||
_chooseByDragTimer.setSingleShot(true);
|
||||
|
@ -1804,9 +1805,9 @@ DialogsWidget::DialogsWidget(MainWidget *parent) : TWidget(parent)
|
|||
_filter.setFocusPolicy(Qt::StrongFocus);
|
||||
_filter.customUpDown(true);
|
||||
_addContact.hide();
|
||||
_newGroup.show();
|
||||
_newGroup->show();
|
||||
_cancelSearch.hide();
|
||||
_newGroup.move(width() - _newGroup.width() - st::dialogsPadding.x(), 0);
|
||||
_newGroup->move(width() - _newGroup->width() - st::dialogsPadding.x(), 0);
|
||||
_addContact.move(width() - _addContact.width() - st::dialogsPadding.x(), 0);
|
||||
_cancelSearch.move(width() - _cancelSearch.width() - st::dialogsPadding.x(), 0);
|
||||
}
|
||||
|
@ -1854,7 +1855,7 @@ void DialogsWidget::showAnimated(Window::SlideDirection direction, const Window:
|
|||
_scroll.hide();
|
||||
_filter.hide();
|
||||
_cancelSearch.hide();
|
||||
_newGroup.hide();
|
||||
_newGroup->hide();
|
||||
|
||||
int delta = st::slideShift;
|
||||
if (direction == Window::SlideDirection::FromLeft) {
|
||||
|
@ -2360,10 +2361,10 @@ void DialogsWidget::onFilterUpdate(bool force) {
|
|||
_searchQueries.clear();
|
||||
_searchQuery = QString();
|
||||
_cancelSearch.hide();
|
||||
_newGroup.show();
|
||||
_newGroup->show();
|
||||
} else if (_cancelSearch.isHidden()) {
|
||||
_cancelSearch.show();
|
||||
_newGroup.hide();
|
||||
_newGroup->hide();
|
||||
}
|
||||
if (filterText.size() < MinUsernameLength) {
|
||||
_peopleCache.clear();
|
||||
|
@ -2426,7 +2427,7 @@ void DialogsWidget::onCompleteHashtag(QString tag) {
|
|||
void DialogsWidget::resizeEvent(QResizeEvent *e) {
|
||||
int32 w = width();
|
||||
_filter.setGeometry(st::dialogsPadding.x(), st::dialogsFilterPadding, w - 2 * st::dialogsPadding.x(), _filter.height());
|
||||
_newGroup.move(w - _newGroup.width() - st::dialogsPadding.x(), _filter.y());
|
||||
_newGroup->move(w - _newGroup->width() - st::dialogsPadding.x(), _filter.y());
|
||||
_addContact.move(w - _addContact.width() - st::dialogsPadding.x(), _filter.y());
|
||||
_cancelSearch.move(w - _cancelSearch.width() - st::dialogsPadding.x(), _filter.y());
|
||||
_scroll.move(0, _filter.height() + 2 * st::dialogsFilterPadding);
|
||||
|
|
|
@ -29,6 +29,10 @@ class FakeRow;
|
|||
class IndexedList;
|
||||
} // namespace Dialogs
|
||||
|
||||
namespace Ui {
|
||||
class RoundButton;
|
||||
} // namespace Ui
|
||||
|
||||
enum DialogsSearchRequestType {
|
||||
DialogsSearchFromStart,
|
||||
DialogsSearchFromOffset,
|
||||
|
@ -336,7 +340,8 @@ private:
|
|||
mtpRequestId _dialogsRequest, _contactsRequest;
|
||||
|
||||
FlatInput _filter;
|
||||
IconedButton _newGroup, _addContact, _cancelSearch;
|
||||
ChildWidget<Ui::RoundButton> _newGroup;
|
||||
IconedButton _addContact, _cancelSearch;
|
||||
ScrollArea _scroll;
|
||||
DialogsInner _inner;
|
||||
|
||||
|
|
|
@ -1019,11 +1019,11 @@ void EmojiPanInner::leaveEvent(QEvent *e) {
|
|||
clearSelection();
|
||||
}
|
||||
|
||||
void EmojiPanInner::leaveToChildEvent(QEvent *e) {
|
||||
void EmojiPanInner::leaveToChildEvent(QEvent *e, QWidget *child) {
|
||||
clearSelection();
|
||||
}
|
||||
|
||||
void EmojiPanInner::enterFromChildEvent(QEvent *e) {
|
||||
void EmojiPanInner::enterFromChildEvent(QEvent *e, QWidget *child) {
|
||||
_lastMousePos = QCursor::pos();
|
||||
updateSelected();
|
||||
}
|
||||
|
@ -1544,11 +1544,11 @@ void StickerPanInner::leaveEvent(QEvent *e) {
|
|||
clearSelection();
|
||||
}
|
||||
|
||||
void StickerPanInner::leaveToChildEvent(QEvent *e) {
|
||||
void StickerPanInner::leaveToChildEvent(QEvent *e, QWidget *child) {
|
||||
clearSelection();
|
||||
}
|
||||
|
||||
void StickerPanInner::enterFromChildEvent(QEvent *e) {
|
||||
void StickerPanInner::enterFromChildEvent(QEvent *e, QWidget *child) {
|
||||
_lastMousePos = QCursor::pos();
|
||||
updateSelected();
|
||||
}
|
||||
|
@ -3139,7 +3139,7 @@ void EmojiPan::onRefreshPanels() {
|
|||
}
|
||||
}
|
||||
|
||||
void EmojiPan::leaveToChildEvent(QEvent *e) {
|
||||
void EmojiPan::leaveToChildEvent(QEvent *e, QWidget *child) {
|
||||
if (!_stickersShown) return;
|
||||
_iconsMousePos = QCursor::pos();
|
||||
updateSelected();
|
||||
|
|
|
@ -254,14 +254,14 @@ public:
|
|||
EmojiPanInner();
|
||||
|
||||
void setMaxHeight(int32 h);
|
||||
void paintEvent(QPaintEvent *e);
|
||||
void paintEvent(QPaintEvent *e) override;
|
||||
|
||||
void mousePressEvent(QMouseEvent *e);
|
||||
void mouseReleaseEvent(QMouseEvent *e);
|
||||
void mouseMoveEvent(QMouseEvent *e);
|
||||
void leaveEvent(QEvent *e);
|
||||
void leaveToChildEvent(QEvent *e);
|
||||
void enterFromChildEvent(QEvent *e);
|
||||
void mousePressEvent(QMouseEvent *e) override;
|
||||
void mouseReleaseEvent(QMouseEvent *e) override;
|
||||
void mouseMoveEvent(QMouseEvent *e) override;
|
||||
void leaveEvent(QEvent *e) override;
|
||||
void leaveToChildEvent(QEvent *e, QWidget *child) override;
|
||||
void enterFromChildEvent(QEvent *e, QWidget *child) override;
|
||||
|
||||
void step_selected(uint64 ms, bool timer);
|
||||
void hideFinish();
|
||||
|
@ -346,14 +346,14 @@ public:
|
|||
StickerPanInner();
|
||||
|
||||
void setMaxHeight(int32 h);
|
||||
void paintEvent(QPaintEvent *e);
|
||||
void paintEvent(QPaintEvent *e) override;
|
||||
|
||||
void mousePressEvent(QMouseEvent *e);
|
||||
void mouseReleaseEvent(QMouseEvent *e);
|
||||
void mouseMoveEvent(QMouseEvent *e);
|
||||
void leaveEvent(QEvent *e);
|
||||
void leaveToChildEvent(QEvent *e);
|
||||
void enterFromChildEvent(QEvent *e);
|
||||
void mousePressEvent(QMouseEvent *e) override;
|
||||
void mouseReleaseEvent(QMouseEvent *e) override;
|
||||
void mouseMoveEvent(QMouseEvent *e) override;
|
||||
void leaveEvent(QEvent *e) override;
|
||||
void leaveToChildEvent(QEvent *e, QWidget *child) override;
|
||||
void enterFromChildEvent(QEvent *e, QWidget *child) override;
|
||||
|
||||
void step_selected(uint64 ms, bool timer);
|
||||
|
||||
|
@ -663,7 +663,7 @@ private:
|
|||
bool _horizontal;
|
||||
void updateContentHeight();
|
||||
|
||||
void leaveToChildEvent(QEvent *e);
|
||||
void leaveToChildEvent(QEvent *e, QWidget *child);
|
||||
void hideAnimated();
|
||||
void prepareShowHideCache();
|
||||
|
||||
|
|
|
@ -276,7 +276,7 @@ bool hideWindowNoQuit() {
|
|||
if (cWorkMode() == dbiwmTrayOnly || cWorkMode() == dbiwmWindowAndTray) {
|
||||
return w->minimizeToTray();
|
||||
} else if (cPlatform() == dbipMac || cPlatform() == dbipMacOld) {
|
||||
w->hide();
|
||||
w->closeWithoutDestroy();
|
||||
w->updateIsActive(Global::OfflineBlurTimeout());
|
||||
w->updateGlobalMenu();
|
||||
return true;
|
||||
|
@ -532,6 +532,7 @@ struct Data {
|
|||
bool AdaptiveForWide = true;
|
||||
bool DialogsModeEnabled = false;
|
||||
Dialogs::Mode DialogsMode = Dialogs::Mode::All;
|
||||
bool ModerateModeEnabled = false;
|
||||
|
||||
int32 DebugLoggingFlags = 0;
|
||||
|
||||
|
@ -597,6 +598,7 @@ DefineVar(Global, Adaptive::Layout, AdaptiveLayout);
|
|||
DefineVar(Global, bool, AdaptiveForWide);
|
||||
DefineVar(Global, bool, DialogsModeEnabled);
|
||||
DefineVar(Global, Dialogs::Mode, DialogsMode);
|
||||
DefineVar(Global, bool, ModerateModeEnabled);
|
||||
|
||||
DefineVar(Global, int32, DebugLoggingFlags);
|
||||
|
||||
|
|
|
@ -211,6 +211,7 @@ DeclareVar(Adaptive::Layout, AdaptiveLayout);
|
|||
DeclareVar(bool, AdaptiveForWide);
|
||||
DeclareVar(bool, DialogsModeEnabled);
|
||||
DeclareVar(Dialogs::Mode, DialogsMode);
|
||||
DeclareVar(bool, ModerateModeEnabled);
|
||||
|
||||
DeclareVar(int32, DebugLoggingFlags);
|
||||
|
||||
|
|
|
@ -230,7 +230,6 @@ Data::Draft *History::createCloudDraft(Data::Draft *fromDraft) {
|
|||
|
||||
cloudDraftTextCache.clear();
|
||||
updateChatListSortPosition();
|
||||
updateChatListEntry();
|
||||
|
||||
return cloudDraft();
|
||||
}
|
||||
|
@ -248,7 +247,6 @@ void History::clearCloudDraft() {
|
|||
_cloudDraft = nullptr;
|
||||
cloudDraftTextCache.clear();
|
||||
updateChatListSortPosition();
|
||||
updateChatListEntry();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -606,7 +604,7 @@ void Histories::clear() {
|
|||
typing.clear();
|
||||
}
|
||||
|
||||
void Histories::regSendAction(History *history, UserData *user, const MTPSendMessageAction &action) {
|
||||
void Histories::regSendAction(History *history, UserData *user, const MTPSendMessageAction &action, TimeId when) {
|
||||
if (action.type() == mtpc_sendMessageCancelAction) {
|
||||
history->unregTyping(user);
|
||||
return;
|
||||
|
@ -626,7 +624,7 @@ void Histories::regSendAction(History *history, UserData *user, const MTPSendMes
|
|||
default: return;
|
||||
}
|
||||
|
||||
user->madeAction();
|
||||
user->madeAction(when);
|
||||
|
||||
TypingHistories::const_iterator i = typing.find(history);
|
||||
if (i == typing.cend()) {
|
||||
|
@ -1142,7 +1140,9 @@ void History::newItemAdded(HistoryItem *item) {
|
|||
if (item->from() == item->author()) {
|
||||
unregTyping(item->from()->asUser());
|
||||
}
|
||||
item->from()->asUser()->madeAction();
|
||||
MTPint itemServerTime;
|
||||
toServerTime(item->date.toTime_t(), itemServerTime);
|
||||
item->from()->asUser()->madeAction(itemServerTime.v);
|
||||
}
|
||||
if (item->out()) {
|
||||
if (unreadBar) unreadBar->destroyUnreadBar();
|
||||
|
@ -1759,6 +1759,7 @@ namespace {
|
|||
}
|
||||
|
||||
inline uint64 dialogPosFromDate(const QDateTime &date) {
|
||||
if (date.isNull()) return 0;
|
||||
return (uint64(date.toTime_t()) << 32) | (++_dialogsPosToTopShift);
|
||||
}
|
||||
|
||||
|
@ -1769,8 +1770,8 @@ void History::setLastMessage(HistoryItem *msg) {
|
|||
setChatsListDate(msg->date);
|
||||
} else {
|
||||
lastMsg = 0;
|
||||
updateChatListEntry();
|
||||
}
|
||||
updateChatListEntry();
|
||||
}
|
||||
|
||||
bool History::needUpdateInChatList() const {
|
||||
|
@ -1796,7 +1797,7 @@ void History::setChatsListDate(const QDateTime &date) {
|
|||
void History::updateChatListSortPosition() {
|
||||
auto chatListDate = [this]() {
|
||||
if (auto draft = cloudDraft()) {
|
||||
if (draft->date > lastMsgDate) {
|
||||
if (!Data::draftIsNull(draft) && draft->date > lastMsgDate) {
|
||||
return draft->date;
|
||||
}
|
||||
}
|
||||
|
@ -1804,8 +1805,15 @@ void History::updateChatListSortPosition() {
|
|||
};
|
||||
|
||||
_sortKeyInChatList = dialogPosFromDate(chatListDate());
|
||||
if (App::main() && needUpdateInChatList()) {
|
||||
App::main()->createDialog(this);
|
||||
if (auto m = App::main()) {
|
||||
if (needUpdateInChatList()) {
|
||||
if (_sortKeyInChatList) {
|
||||
m->createDialog(this);
|
||||
updateChatListEntry();
|
||||
} else {
|
||||
m->deleteConversation(peer, false);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2953,6 +2961,49 @@ void HistoryItem::recountDisplayDate() {
|
|||
}
|
||||
}
|
||||
|
||||
QString HistoryItem::notificationText() const {
|
||||
auto getText = [this]() {
|
||||
if (emptyText()) {
|
||||
return _media ? _media->notificationText() : QString();
|
||||
}
|
||||
return _text.originalText();
|
||||
};
|
||||
|
||||
auto result = getText();
|
||||
if (result.size() > 0xFF) result = result.mid(0, 0xFF) + qsl("...");
|
||||
return result;
|
||||
}
|
||||
|
||||
QString HistoryItem::inDialogsText() const {
|
||||
auto getText = [this]() {
|
||||
if (emptyText()) {
|
||||
return _media ? _media->inDialogsText() : QString();
|
||||
}
|
||||
return textClean(_text.originalText());
|
||||
};
|
||||
auto plainText = getText();
|
||||
if ((!_history->peer->isUser() || out()) && !isPost() && !isEmpty()) {
|
||||
auto fromText = author()->isSelf() ? lang(lng_from_you) : author()->shortName();
|
||||
auto fromWrapped = textcmdLink(1, lng_dialogs_text_from_wrapped(lt_from, textClean(fromText)));
|
||||
return lng_dialogs_text_with_from(lt_from_part, fromWrapped, lt_message, plainText);
|
||||
}
|
||||
return plainText;
|
||||
}
|
||||
|
||||
void HistoryItem::drawInDialog(Painter &p, const QRect &r, bool act, const HistoryItem *&cacheFor, Text &cache) const {
|
||||
if (cacheFor != this) {
|
||||
cacheFor = this;
|
||||
cache.setText(st::dialogsTextFont, inDialogsText(), _textDlgOptions);
|
||||
}
|
||||
if (r.width()) {
|
||||
textstyleSet(&(act ? st::dialogsTextStyleActive : st::dialogsTextStyle));
|
||||
p.setFont(st::dialogsTextFont);
|
||||
p.setPen(act ? st::dialogsTextFgActive : st::dialogsTextFg);
|
||||
cache.drawElided(p, r.left(), r.top(), r.width(), r.height() / st::dialogsTextFont->height);
|
||||
textstyleRestore();
|
||||
}
|
||||
}
|
||||
|
||||
HistoryItem::~HistoryItem() {
|
||||
App::historyUnregItem(this);
|
||||
if (id < 0 && App::uploader()) {
|
||||
|
@ -3035,6 +3086,11 @@ void RadialAnimation::draw(Painter &p, const QRect &inner, int32 thickness, cons
|
|||
p.setOpacity(o);
|
||||
}
|
||||
|
||||
QString HistoryMedia::inDialogsText() const {
|
||||
auto result = notificationText();
|
||||
return result.isEmpty() ? QString() : textcmdLink(1, textClean(result));
|
||||
}
|
||||
|
||||
namespace {
|
||||
|
||||
int32 documentMaxStatusWidth(DocumentData *document) {
|
||||
|
@ -3077,6 +3133,26 @@ TextWithEntities captionedSelectedText(const QString &attachType, const Text &ca
|
|||
return result;
|
||||
}
|
||||
|
||||
QString captionedNotificationText(const QString &attachType, const Text &caption) {
|
||||
if (caption.isEmpty()) {
|
||||
return attachType;
|
||||
}
|
||||
|
||||
auto captionText = caption.originalText();
|
||||
auto attachTypeWrapped = lng_dialogs_text_media_wrapped(lt_media, attachType);
|
||||
return lng_dialogs_text_media(lt_media_part, attachTypeWrapped, lt_caption, captionText);
|
||||
}
|
||||
|
||||
QString captionedInDialogsText(const QString &attachType, const Text &caption) {
|
||||
if (caption.isEmpty()) {
|
||||
return textcmdLink(1, textClean(attachType));
|
||||
}
|
||||
|
||||
auto captionText = textClean(caption.originalText());
|
||||
auto attachTypeWrapped = textcmdLink(1, lng_dialogs_text_media_wrapped(lt_media, textClean(attachType)));
|
||||
return lng_dialogs_text_media(lt_media_part, attachTypeWrapped, lt_caption, captionText);
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
void HistoryFileMedia::clickHandlerActiveChanged(const ClickHandlerPtr &p, bool active) {
|
||||
|
@ -3495,8 +3571,12 @@ void HistoryPhoto::detachFromParent() {
|
|||
App::unregPhotoItem(_data, _parent);
|
||||
}
|
||||
|
||||
QString HistoryPhoto::notificationText() const {
|
||||
return captionedNotificationText(lang(lng_in_dlg_photo), _caption);
|
||||
}
|
||||
|
||||
QString HistoryPhoto::inDialogsText() const {
|
||||
return _caption.isEmpty() ? lang(lng_in_dlg_photo) : _caption.originalText(AllTextSelection, ExpandLinksNone);
|
||||
return captionedInDialogsText(lang(lng_in_dlg_photo), _caption);
|
||||
}
|
||||
|
||||
TextWithEntities HistoryPhoto::selectedText(TextSelection selection) const {
|
||||
|
@ -3741,8 +3821,12 @@ void HistoryVideo::setStatusSize(int32 newSize) const {
|
|||
HistoryFileMedia::setStatusSize(newSize, _data->size, _data->duration(), 0);
|
||||
}
|
||||
|
||||
QString HistoryVideo::notificationText() const {
|
||||
return captionedNotificationText(lang(lng_in_dlg_video), _caption);
|
||||
}
|
||||
|
||||
QString HistoryVideo::inDialogsText() const {
|
||||
return _caption.isEmpty() ? lang(lng_in_dlg_video) : _caption.originalText(AllTextSelection, ExpandLinksNone);
|
||||
return captionedInDialogsText(lang(lng_in_dlg_video), _caption);
|
||||
}
|
||||
|
||||
TextWithEntities HistoryVideo::selectedText(TextSelection selection) const {
|
||||
|
@ -4218,28 +4302,36 @@ HistoryTextState HistoryDocument::getState(int x, int y, HistoryStateRequest req
|
|||
return result;
|
||||
}
|
||||
|
||||
QString HistoryDocument::notificationText() const {
|
||||
QString result;
|
||||
buildStringRepresentation([&result](const QString &type, const QString &fileName, const Text &caption) {
|
||||
result = captionedNotificationText(fileName.isEmpty() ? type : fileName, caption);
|
||||
});
|
||||
return result;
|
||||
}
|
||||
|
||||
QString HistoryDocument::inDialogsText() const {
|
||||
QString result;
|
||||
if (Has<HistoryDocumentVoice>()) {
|
||||
result = lang(lng_in_dlg_audio);
|
||||
} else if (auto song = _data->song()) {
|
||||
result = documentName(_data);
|
||||
if (result.isEmpty()) {
|
||||
result = lang(lng_in_dlg_audio_file);
|
||||
}
|
||||
} else {
|
||||
auto named = Get<HistoryDocumentNamed>();
|
||||
result = (!named || named->_name.isEmpty()) ? lang(lng_in_dlg_file) : named->_name;
|
||||
}
|
||||
if (auto captioned = Get<HistoryDocumentCaptioned>()) {
|
||||
if (!captioned->_caption.isEmpty()) {
|
||||
result.append(' ').append(captioned->_caption.originalText(AllTextSelection, ExpandLinksNone));
|
||||
}
|
||||
}
|
||||
buildStringRepresentation([&result](const QString &type, const QString &fileName, const Text &caption) {
|
||||
result = captionedInDialogsText(fileName.isEmpty() ? type : fileName, caption);
|
||||
});
|
||||
return result;
|
||||
}
|
||||
|
||||
TextWithEntities HistoryDocument::selectedText(TextSelection selection) const {
|
||||
TextWithEntities result;
|
||||
buildStringRepresentation([&result, selection](const QString &type, const QString &fileName, const Text &caption) {
|
||||
auto fullType = type;
|
||||
if (!fileName.isEmpty()) {
|
||||
fullType.append(qstr(" : ")).append(fileName);
|
||||
}
|
||||
result = captionedSelectedText(fullType, caption, selection);
|
||||
});
|
||||
return result;
|
||||
}
|
||||
|
||||
template <typename Callback>
|
||||
void HistoryDocument::buildStringRepresentation(Callback callback) const {
|
||||
const Text emptyCaption;
|
||||
const Text *caption = &emptyCaption;
|
||||
if (auto captioned = Get<HistoryDocumentCaptioned>()) {
|
||||
|
@ -4251,12 +4343,14 @@ TextWithEntities HistoryDocument::selectedText(TextSelection selection) const {
|
|||
} else if (_data->song()) {
|
||||
attachType = lang(lng_in_dlg_audio_file);
|
||||
}
|
||||
|
||||
QString attachFileName;
|
||||
if (auto named = Get<HistoryDocumentNamed>()) {
|
||||
if (!named->_name.isEmpty()) {
|
||||
attachType.append(qstr(" : ")).append(named->_name);
|
||||
attachFileName = named->_name;
|
||||
}
|
||||
}
|
||||
return captionedSelectedText(attachType, *caption, selection);
|
||||
return callback(attachType, attachFileName, *caption);
|
||||
}
|
||||
|
||||
void HistoryDocument::setStatusSize(int32 newSize, qint64 realDuration) const {
|
||||
|
@ -4690,8 +4784,12 @@ HistoryTextState HistoryGif::getState(int x, int y, HistoryStateRequest request)
|
|||
return result;
|
||||
}
|
||||
|
||||
QString HistoryGif::notificationText() const {
|
||||
return captionedNotificationText(qsl("GIF"), _caption);
|
||||
}
|
||||
|
||||
QString HistoryGif::inDialogsText() const {
|
||||
return qsl("GIF") + (_caption.isEmpty() ? QString() : (' ' + _caption.originalText(AllTextSelection, ExpandLinksNone)));
|
||||
return captionedInDialogsText(qsl("GIF"), _caption);
|
||||
}
|
||||
|
||||
TextWithEntities HistoryGif::selectedText(TextSelection selection) const {
|
||||
|
@ -5008,15 +5106,19 @@ HistoryTextState HistorySticker::getState(int x, int y, HistoryStateRequest requ
|
|||
return result;
|
||||
}
|
||||
|
||||
QString HistorySticker::inDialogsText() const {
|
||||
QString HistorySticker::toString() const {
|
||||
return _emoji.isEmpty() ? lang(lng_in_dlg_sticker) : lng_in_dlg_sticker_emoji(lt_emoji, _emoji);
|
||||
}
|
||||
|
||||
QString HistorySticker::notificationText() const {
|
||||
return toString();
|
||||
}
|
||||
|
||||
TextWithEntities HistorySticker::selectedText(TextSelection selection) const {
|
||||
if (selection != FullSelection) {
|
||||
return TextWithEntities();
|
||||
}
|
||||
return { qsl("[ ") + inDialogsText() + qsl(" ]"), EntitiesInText() };
|
||||
return { qsl("[ ") + toString() + qsl(" ]"), EntitiesInText() };
|
||||
}
|
||||
|
||||
void HistorySticker::attachToParent() {
|
||||
|
@ -5196,7 +5298,7 @@ HistoryTextState HistoryContact::getState(int x, int y, HistoryStateRequest requ
|
|||
return result;
|
||||
}
|
||||
|
||||
QString HistoryContact::inDialogsText() const {
|
||||
QString HistoryContact::notificationText() const {
|
||||
return lang(lng_in_dlg_contact);
|
||||
}
|
||||
|
||||
|
@ -5717,10 +5819,6 @@ void HistoryWebPage::detachFromParent() {
|
|||
if (_attach) _attach->detachFromParent();
|
||||
}
|
||||
|
||||
QString HistoryWebPage::inDialogsText() const {
|
||||
return QString();
|
||||
}
|
||||
|
||||
TextWithEntities HistoryWebPage::selectedText(TextSelection selection) const {
|
||||
if (selection == FullSelection) {
|
||||
return TextWithEntities();
|
||||
|
@ -6166,8 +6264,12 @@ TextSelection HistoryLocation::adjustSelection(TextSelection selection, TextSele
|
|||
return { titleSelection.from, fromDescriptionSelection(descriptionSelection).to };
|
||||
}
|
||||
|
||||
QString HistoryLocation::notificationText() const {
|
||||
return captionedNotificationText(lang(lng_maps_point), _title);
|
||||
}
|
||||
|
||||
QString HistoryLocation::inDialogsText() const {
|
||||
return _title.isEmpty() ? lang(lng_maps_point) : _title.originalText(AllTextSelection);
|
||||
return captionedInDialogsText(lang(lng_maps_point), _title);
|
||||
}
|
||||
|
||||
TextWithEntities HistoryLocation::selectedText(TextSelection selection) const {
|
||||
|
@ -6295,7 +6397,7 @@ bool HistoryMessageReply::updateData(HistoryMessage *holder, bool force) {
|
|||
}
|
||||
|
||||
if (replyToMsg) {
|
||||
replyToText.setText(st::msgFont, replyToMsg->inReplyText(), _textDlgOptions);
|
||||
replyToText.setText(st::msgFont, textClean(replyToMsg->inReplyText()), _textDlgOptions);
|
||||
|
||||
updateName();
|
||||
|
||||
|
@ -7026,10 +7128,6 @@ TextWithEntities HistoryMessage::selectedText(TextSelection selection) const {
|
|||
return result;
|
||||
}
|
||||
|
||||
QString HistoryMessage::inDialogsText() const {
|
||||
return emptyText() ? (_media ? _media->inDialogsText() : QString()) : _text.originalText(AllTextSelection, ExpandLinksNone);
|
||||
}
|
||||
|
||||
void HistoryMessage::setMedia(const MTPMessageMedia *media) {
|
||||
if (!_media && (!media || media->type() == mtpc_messageMediaEmpty)) return;
|
||||
|
||||
|
@ -7692,38 +7790,10 @@ TextSelection HistoryMessage::adjustSelection(TextSelection selection, TextSelec
|
|||
return { textSelection.from, fromMediaSelection(mediaSelection).to };
|
||||
}
|
||||
|
||||
void HistoryMessage::drawInDialog(Painter &p, const QRect &r, bool act, const HistoryItem *&cacheFor, Text &cache) const {
|
||||
if (cacheFor != this) {
|
||||
cacheFor = this;
|
||||
QString msg(inDialogsText());
|
||||
if ((!_history->peer->isUser() || out()) && !isPost() && !isEmpty()) {
|
||||
TextCustomTagsMap custom;
|
||||
custom.insert(QChar('c'), qMakePair(textcmdStartLink(1), textcmdStopLink()));
|
||||
msg = lng_message_with_from(lt_from, textRichPrepare((author() == App::self()) ? lang(lng_from_you) : author()->shortName()), lt_message, textRichPrepare(msg));
|
||||
cache.setRichText(st::dialogsTextFont, msg, _textDlgOptions, custom);
|
||||
} else {
|
||||
cache.setText(st::dialogsTextFont, msg, _textDlgOptions);
|
||||
}
|
||||
}
|
||||
if (r.width()) {
|
||||
textstyleSet(&(act ? st::dialogsTextStyleActive : st::dialogsTextStyle));
|
||||
p.setFont(st::dialogsTextFont);
|
||||
p.setPen(act ? st::dialogsTextFgActive : (emptyText() ? st::dialogsTextFgService : st::dialogsTextFg));
|
||||
cache.drawElided(p, r.left(), r.top(), r.width(), r.height() / st::dialogsTextFont->height);
|
||||
textstyleRestore();
|
||||
}
|
||||
}
|
||||
|
||||
QString HistoryMessage::notificationHeader() const {
|
||||
return (!_history->peer->isUser() && !isPost()) ? from()->name : QString();
|
||||
}
|
||||
|
||||
QString HistoryMessage::notificationText() const {
|
||||
QString msg(inDialogsText());
|
||||
if (msg.size() > 0xFF) msg = msg.mid(0, 0xFF) + qsl("...");
|
||||
return msg;
|
||||
}
|
||||
|
||||
bool HistoryMessage::displayFromPhoto() const {
|
||||
return hasFromPhoto() && !isAttachedToPrevious();
|
||||
}
|
||||
|
@ -8037,11 +8107,11 @@ TextWithEntities HistoryService::selectedText(TextSelection selection) const {
|
|||
}
|
||||
|
||||
QString HistoryService::inDialogsText() const {
|
||||
return _text.originalText(AllTextSelection, ExpandLinksNone);
|
||||
return textcmdLink(1, textClean(notificationText()));
|
||||
}
|
||||
|
||||
QString HistoryService::inReplyText() const {
|
||||
QString result = HistoryService::inDialogsText();
|
||||
QString result = HistoryService::notificationText();
|
||||
return result.trimmed().startsWith(author()->name) ? result.trimmed().mid(author()->name.size()).trimmed() : result;
|
||||
}
|
||||
|
||||
|
@ -8178,22 +8248,6 @@ HistoryTextState HistoryService::getState(int x, int y, HistoryStateRequest requ
|
|||
return result;
|
||||
}
|
||||
|
||||
void HistoryService::drawInDialog(Painter &p, const QRect &r, bool act, const HistoryItem *&cacheFor, Text &cache) const {
|
||||
if (cacheFor != this) {
|
||||
cacheFor = this;
|
||||
cache.setText(st::dialogsTextFont, inDialogsText(), _textDlgOptions);
|
||||
}
|
||||
QRect tr(r);
|
||||
p.setPen(act ? st::dialogsTextFgActive : st::dialogsTextFgService);
|
||||
cache.drawElided(p, tr.left(), tr.top(), tr.width(), tr.height() / st::dialogsTextFont->height);
|
||||
}
|
||||
|
||||
QString HistoryService::notificationText() const {
|
||||
QString msg = _text.originalText();
|
||||
if (msg.size() > 0xFF) msg = msg.mid(0, 0xFF) + qsl("...");
|
||||
return msg;
|
||||
}
|
||||
|
||||
void HistoryService::applyEditionToEmpty() {
|
||||
TextWithEntities textWithEntities = { QString(), EntitiesInText() };
|
||||
setServiceText(QString());
|
||||
|
|
|
@ -44,7 +44,7 @@ public:
|
|||
Histories() : _a_typings(animation(this, &Histories::step_typings)), _unreadFull(0), _unreadMuted(0) {
|
||||
}
|
||||
|
||||
void regSendAction(History *history, UserData *user, const MTPSendMessageAction &action);
|
||||
void regSendAction(History *history, UserData *user, const MTPSendMessageAction &action, TimeId when);
|
||||
void step_typings(uint64 ms, bool timer);
|
||||
|
||||
History *find(const PeerId &peerId);
|
||||
|
@ -1212,11 +1212,17 @@ public:
|
|||
virtual TextWithEntities selectedText(TextSelection selection) const {
|
||||
return { qsl("[-]"), EntitiesInText() };
|
||||
}
|
||||
virtual QString inDialogsText() const {
|
||||
return qsl("-");
|
||||
|
||||
virtual QString notificationHeader() const {
|
||||
return QString();
|
||||
}
|
||||
virtual QString notificationText() const;
|
||||
|
||||
// Returns text with link-start and link-end commands for service-color highlighting.
|
||||
// Example: "[link1-start]You:[link1-end] [link1-start]Photo,[link1-end] caption text"
|
||||
virtual QString inDialogsText() const;
|
||||
virtual QString inReplyText() const {
|
||||
return inDialogsText();
|
||||
return notificationText();
|
||||
}
|
||||
virtual TextWithEntities originalText() const {
|
||||
return { QString(), EntitiesInText() };
|
||||
|
@ -1227,11 +1233,11 @@ public:
|
|||
virtual void setViewsCount(int32 count) {
|
||||
}
|
||||
virtual void setId(MsgId newId);
|
||||
virtual void drawInDialog(Painter &p, const QRect &r, bool act, const HistoryItem *&cacheFor, Text &cache) const = 0;
|
||||
virtual QString notificationHeader() const {
|
||||
return QString();
|
||||
}
|
||||
virtual QString notificationText() const = 0;
|
||||
void drawInDialog(Painter &p, const QRect &r, bool act, const HistoryItem *&cacheFor, Text &cache) const;
|
||||
|
||||
bool emptyText() const {
|
||||
return _text.isEmpty();
|
||||
}
|
||||
|
||||
bool canDelete() const {
|
||||
ChannelData *channel = _history->peer->asChannel();
|
||||
|
@ -1593,7 +1599,14 @@ public:
|
|||
HistoryMedia &operator=(const HistoryMedia &other) = delete;
|
||||
|
||||
virtual HistoryMediaType type() const = 0;
|
||||
virtual QString inDialogsText() const = 0;
|
||||
|
||||
virtual QString notificationText() const {
|
||||
return QString();
|
||||
}
|
||||
|
||||
// Returns text with link-start and link-end commands for service-color highlighting.
|
||||
// Example: "[link1-start]You:[link1-end] [link1-start]Photo,[link1-end] caption text"
|
||||
virtual QString inDialogsText() const;
|
||||
virtual TextWithEntities selectedText(TextSelection selection) const = 0;
|
||||
|
||||
bool hasPoint(int x, int y) const {
|
||||
|
@ -1817,6 +1830,7 @@ public:
|
|||
return !_caption.isEmpty();
|
||||
}
|
||||
|
||||
QString notificationText() const override;
|
||||
QString inDialogsText() const override;
|
||||
TextWithEntities selectedText(TextSelection selection) const override;
|
||||
|
||||
|
@ -1897,6 +1911,7 @@ public:
|
|||
return !_caption.isEmpty();
|
||||
}
|
||||
|
||||
QString notificationText() const override;
|
||||
QString inDialogsText() const override;
|
||||
TextWithEntities selectedText(TextSelection selection) const override;
|
||||
|
||||
|
@ -2020,6 +2035,7 @@ public:
|
|||
return Has<HistoryDocumentCaptioned>();
|
||||
}
|
||||
|
||||
QString notificationText() const override;
|
||||
QString inDialogsText() const override;
|
||||
TextWithEntities selectedText(TextSelection selection) const override;
|
||||
|
||||
|
@ -2076,11 +2092,17 @@ protected:
|
|||
|
||||
private:
|
||||
void createComponents(bool caption);
|
||||
DocumentData *_data;
|
||||
|
||||
void setStatusSize(int32 newSize, qint64 realDuration = 0) const;
|
||||
bool updateStatusText() const; // returns showPause
|
||||
|
||||
// Callback is a void(const QString &, const QString &, const Text &) functor.
|
||||
// It will be called as callback(attachType, attachFileName, attachCaption).
|
||||
template <typename Callback>
|
||||
void buildStringRepresentation(Callback callback) const;
|
||||
|
||||
DocumentData *_data;
|
||||
|
||||
};
|
||||
|
||||
class HistoryGif : public HistoryFileMedia {
|
||||
|
@ -2107,6 +2129,7 @@ public:
|
|||
return !_caption.isEmpty();
|
||||
}
|
||||
|
||||
QString notificationText() const override;
|
||||
QString inDialogsText() const override;
|
||||
TextWithEntities selectedText(TextSelection selection) const override;
|
||||
|
||||
|
@ -2205,7 +2228,7 @@ public:
|
|||
return true;
|
||||
}
|
||||
|
||||
QString inDialogsText() const override;
|
||||
QString notificationText() const override;
|
||||
TextWithEntities selectedText(TextSelection selection) const override;
|
||||
|
||||
DocumentData *getDocument() override {
|
||||
|
@ -2230,6 +2253,7 @@ private:
|
|||
int additionalWidth() const {
|
||||
return additionalWidth(_parent->Get<HistoryMessageVia>(), _parent->Get<HistoryMessageReply>());
|
||||
}
|
||||
QString toString() const;
|
||||
|
||||
int16 _pixw, _pixh;
|
||||
ClickHandlerPtr _packLink;
|
||||
|
@ -2274,7 +2298,7 @@ public:
|
|||
return true;
|
||||
}
|
||||
|
||||
QString inDialogsText() const override;
|
||||
QString notificationText() const override;
|
||||
TextWithEntities selectedText(TextSelection selection) const override;
|
||||
|
||||
void attachToParent() override;
|
||||
|
@ -2342,7 +2366,6 @@ public:
|
|||
return _attach && _attach->dragItemByHandler(p);
|
||||
}
|
||||
|
||||
QString inDialogsText() const override;
|
||||
TextWithEntities selectedText(TextSelection selection) const override;
|
||||
|
||||
void clickHandlerActiveChanged(const ClickHandlerPtr &p, bool active) override;
|
||||
|
@ -2476,6 +2499,7 @@ public:
|
|||
return p == _link;
|
||||
}
|
||||
|
||||
QString notificationText() const override;
|
||||
QString inDialogsText() const override;
|
||||
TextWithEntities selectedText(TextSelection selection) const override;
|
||||
|
||||
|
@ -2549,9 +2573,6 @@ public:
|
|||
int32 plainMaxWidth() const;
|
||||
void countPositionAndSize(int32 &left, int32 &width) const;
|
||||
|
||||
bool emptyText() const {
|
||||
return _text.isEmpty();
|
||||
}
|
||||
bool drawBubble() const {
|
||||
return _media ? (!emptyText() || _media->needsBubble()) : !isEmpty();
|
||||
}
|
||||
|
@ -2593,9 +2614,7 @@ public:
|
|||
HistoryItem::clickHandlerPressedChanged(p, pressed);
|
||||
}
|
||||
|
||||
void drawInDialog(Painter &p, const QRect &r, bool act, const HistoryItem *&cacheFor, Text &cache) const override;
|
||||
QString notificationHeader() const override;
|
||||
QString notificationText() const override;
|
||||
|
||||
void applyEdition(const MTPDmessage &message) override;
|
||||
void applyEditionToEmpty() override;
|
||||
|
@ -2604,7 +2623,6 @@ public:
|
|||
void eraseFromOverview() override;
|
||||
|
||||
TextWithEntities selectedText(TextSelection selection) const override;
|
||||
QString inDialogsText() const override;
|
||||
void setText(const TextWithEntities &textWithEntities) override;
|
||||
TextWithEntities originalText() const override;
|
||||
bool textHasLinks() const override;
|
||||
|
@ -2795,9 +2813,6 @@ public:
|
|||
HistoryItem::clickHandlerPressedChanged(p, pressed);
|
||||
}
|
||||
|
||||
void drawInDialog(Painter &p, const QRect &r, bool act, const HistoryItem *&cacheFor, Text &cache) const override;
|
||||
QString notificationText() const override;
|
||||
|
||||
void applyEditionToEmpty() override;
|
||||
|
||||
int32 addToOverview(AddToOverviewMethod method) override;
|
||||
|
|
|
@ -493,14 +493,24 @@ bool FieldAutocomplete::chooseSelected(ChooseMethod method) const {
|
|||
}
|
||||
|
||||
bool FieldAutocomplete::eventFilter(QObject *obj, QEvent *e) {
|
||||
if (isHidden()) return QWidget::eventFilter(obj, e);
|
||||
auto hidden = isHidden();
|
||||
auto moderate = Global::ModerateModeEnabled();
|
||||
if (hidden && !moderate) return QWidget::eventFilter(obj, e);
|
||||
|
||||
if (e->type() == QEvent::KeyPress) {
|
||||
QKeyEvent *ev = static_cast<QKeyEvent*>(e);
|
||||
if (!(ev->modifiers() & (Qt::AltModifier | Qt::ControlModifier | Qt::ShiftModifier | Qt::MetaModifier))) {
|
||||
if (ev->key() == Qt::Key_Up || ev->key() == Qt::Key_Down || (!_srows.isEmpty() && (ev->key() == Qt::Key_Left || ev->key() == Qt::Key_Right))) {
|
||||
return _inner->moveSel(ev->key());
|
||||
} else if (ev->key() == Qt::Key_Enter || ev->key() == Qt::Key_Return) {
|
||||
return _inner->chooseSelected(ChooseMethod::ByEnter);
|
||||
if (!hidden) {
|
||||
if (ev->key() == Qt::Key_Up || ev->key() == Qt::Key_Down || (!_srows.isEmpty() && (ev->key() == Qt::Key_Left || ev->key() == Qt::Key_Right))) {
|
||||
return _inner->moveSel(ev->key());
|
||||
} else if (ev->key() == Qt::Key_Enter || ev->key() == Qt::Key_Return) {
|
||||
return _inner->chooseSelected(ChooseMethod::ByEnter);
|
||||
}
|
||||
}
|
||||
if (moderate && (ev->key() >= Qt::Key_1 && ev->key() <= Qt::Key_9 || ev->key() == Qt::Key_Q)) {
|
||||
bool handled = false;
|
||||
emit moderateKeyActivate(ev->key(), &handled);
|
||||
return handled;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -85,6 +85,8 @@ signals:
|
|||
void botCommandChosen(QString command, FieldAutocomplete::ChooseMethod method) const;
|
||||
void stickerChosen(DocumentData *sticker, FieldAutocomplete::ChooseMethod method) const;
|
||||
|
||||
void moderateKeyActivate(int key, bool *outHandled) const;
|
||||
|
||||
public slots:
|
||||
|
||||
void hideStart();
|
||||
|
|
|
@ -29,3 +29,18 @@ historyToDownArrow: icon {
|
|||
{ "history_down_arrow", #b9b9b9, point(14px, 19px) },
|
||||
};
|
||||
historyToDownPaddingTop: 10px;
|
||||
|
||||
membersInnerScroll: flatScroll(solidScroll) {
|
||||
deltat: 3px;
|
||||
deltab: 3px;
|
||||
width: 8px;
|
||||
deltax: 3px;
|
||||
}
|
||||
membersInnerWidth: 310px;
|
||||
membersInnerHeightMax: 360px;
|
||||
membersInnerDropdown: InnerDropdown(defaultInnerDropdown) {
|
||||
scrollMargin: margins(0px, 5px, 0px, 5px);
|
||||
scrollPadding: margins(0px, 3px, 8px, 3px);
|
||||
}
|
||||
historyToDownBadgeFont: semiboldFont;
|
||||
historyToDownBadgeSize: 22px;
|
||||
|
|
|
@ -28,9 +28,11 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org
|
|||
#include "ui/filedialog.h"
|
||||
#include "ui/toast/toast.h"
|
||||
#include "ui/buttons/history_down_button.h"
|
||||
#include "ui/inner_dropdown.h"
|
||||
#include "inline_bots/inline_bot_result.h"
|
||||
#include "data/data_drafts.h"
|
||||
#include "history/history_service_layout.h"
|
||||
#include "profile/profile_members_widget.h"
|
||||
#include "lang.h"
|
||||
#include "application.h"
|
||||
#include "mainwidget.h"
|
||||
|
@ -905,10 +907,10 @@ void HistoryInner::onDragExec() {
|
|||
mimeData->setData(qsl("application/x-td-forward-selected"), "1");
|
||||
}
|
||||
drag->setMimeData(mimeData);
|
||||
drag->exec(Qt::CopyAction);
|
||||
|
||||
// We don't receive mouseReleaseEvent when drag is finished.
|
||||
ClickHandler::unpressed();
|
||||
drag->exec(Qt::CopyAction);
|
||||
if (App::main()) App::main()->updateAfterDrag();
|
||||
return;
|
||||
} else {
|
||||
|
@ -942,10 +944,10 @@ void HistoryInner::onDragExec() {
|
|||
}
|
||||
|
||||
drag->setMimeData(mimeData);
|
||||
drag->exec(Qt::CopyAction);
|
||||
|
||||
// We don't receive mouseReleaseEvent when drag is finished.
|
||||
ClickHandler::unpressed();
|
||||
drag->exec(Qt::CopyAction);
|
||||
if (App::main()) App::main()->updateAfterDrag();
|
||||
return;
|
||||
}
|
||||
|
@ -1475,6 +1477,10 @@ void HistoryInner::keyPressEvent(QKeyEvent *e) {
|
|||
if (!_selected.isEmpty() && selectedForDelete == selectedForForward) {
|
||||
_widget->onDeleteSelected();
|
||||
}
|
||||
} else if (e->key() == Qt::Key_Return || e->key() == Qt::Key_Enter) {
|
||||
if (_selected.isEmpty()) {
|
||||
_widget->onListEnterPressed();
|
||||
}
|
||||
} else {
|
||||
e->ignore();
|
||||
}
|
||||
|
@ -2445,21 +2451,6 @@ int BotKeyboard::Style::minButtonWidth(HistoryMessageReplyMarkup::Button::Type t
|
|||
return result;
|
||||
}
|
||||
|
||||
void BotKeyboard::resizeEvent(QResizeEvent *e) {
|
||||
if (!_impl) return;
|
||||
|
||||
updateStyle();
|
||||
|
||||
_height = _impl->naturalHeight() + st::botKbScroll.deltat + st::botKbScroll.deltab;
|
||||
if (_maximizeSize) _height = qMax(_height, _maxOuterHeight);
|
||||
if (height() != _height) {
|
||||
resize(width(), _height);
|
||||
return;
|
||||
}
|
||||
|
||||
_impl->resize(width() - _st->margin - st::botKbScroll.width, _height - (st::botKbScroll.deltat + st::botKbScroll.deltab));
|
||||
}
|
||||
|
||||
void BotKeyboard::mousePressEvent(QMouseEvent *e) {
|
||||
_lastMousePos = e->globalPos();
|
||||
updateSelected();
|
||||
|
@ -2490,6 +2481,28 @@ void BotKeyboard::leaveEvent(QEvent *e) {
|
|||
clearSelection();
|
||||
}
|
||||
|
||||
bool BotKeyboard::moderateKeyActivate(int key) {
|
||||
if (auto item = App::histItemById(_wasForMsgId)) {
|
||||
if (auto markup = item->Get<HistoryMessageReplyMarkup>()) {
|
||||
if (key >= Qt::Key_1 && key <= Qt::Key_9) {
|
||||
int index = (key - Qt::Key_1);
|
||||
if (!markup->rows.isEmpty() && index >= 0 && index < markup->rows.front().size()) {
|
||||
App::activateBotCommand(item, 0, index);
|
||||
return true;
|
||||
}
|
||||
} else if (key == Qt::Key_Q) {
|
||||
if (auto user = item->history()->peer->asUser()) {
|
||||
if (user->botInfo && item->from() == user) {
|
||||
App::sendBotCommand(user, user, qsl("/translate"));
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
void BotKeyboard::clickHandlerActiveChanged(const ClickHandlerPtr &p, bool active) {
|
||||
if (!_impl) return;
|
||||
_impl->clickHandlerActiveChanged(p, active);
|
||||
|
@ -2529,14 +2542,8 @@ bool BotKeyboard::updateMarkup(HistoryItem *to, bool force) {
|
|||
}
|
||||
}
|
||||
|
||||
updateStyle();
|
||||
_height = st::botKbScroll.deltat + st::botKbScroll.deltab + (_impl ? _impl->naturalHeight() : 0);
|
||||
if (_maximizeSize) _height = qMax(_height, _maxOuterHeight);
|
||||
if (height() != _height) {
|
||||
resize(width(), _height);
|
||||
} else {
|
||||
resizeEvent(nullptr);
|
||||
}
|
||||
resizeToWidth(width(), _maxOuterHeight);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -2548,13 +2555,23 @@ bool BotKeyboard::forceReply() const {
|
|||
return _forceReply;
|
||||
}
|
||||
|
||||
void BotKeyboard::resizeToWidth(int width, int maxOuterHeight) {
|
||||
updateStyle(width);
|
||||
_height = st::botKbScroll.deltat + st::botKbScroll.deltab + (_impl ? _impl->naturalHeight() : 0);
|
||||
void BotKeyboard::resizeToWidth(int newWidth, int maxOuterHeight) {
|
||||
_maxOuterHeight = maxOuterHeight;
|
||||
|
||||
if (_maximizeSize) _height = qMax(_height, _maxOuterHeight);
|
||||
resize(width, _height);
|
||||
updateStyle(newWidth);
|
||||
_height = st::botKbScroll.deltat + st::botKbScroll.deltab + (_impl ? _impl->naturalHeight() : 0);
|
||||
if (_maximizeSize) {
|
||||
accumulate_max(_height, _maxOuterHeight);
|
||||
}
|
||||
if (_impl) {
|
||||
int implWidth = newWidth - _st->margin - st::botKbScroll.width;
|
||||
int implHeight = _height - (st::botKbScroll.deltat + st::botKbScroll.deltab);
|
||||
_impl->resize(implWidth, implHeight);
|
||||
}
|
||||
QSize newSize(newWidth, _height);
|
||||
if (newSize != size()) {
|
||||
resize(newSize);
|
||||
}
|
||||
}
|
||||
|
||||
bool BotKeyboard::maximizeSize() const {
|
||||
|
@ -2565,10 +2582,10 @@ bool BotKeyboard::singleUse() const {
|
|||
return _singleUse;
|
||||
}
|
||||
|
||||
void BotKeyboard::updateStyle(int32 w) {
|
||||
void BotKeyboard::updateStyle(int newWidth) {
|
||||
if (!_impl) return;
|
||||
|
||||
int implWidth = ((w < 0) ? width() : w) - st::botKbButton.margin - st::botKbScroll.width;
|
||||
int implWidth = newWidth - st::botKbButton.margin - st::botKbScroll.width;
|
||||
_st = _impl->isEnoughSpace(implWidth, st::botKbButton) ? &st::botKbButton : &st::botKbTinyButton;
|
||||
|
||||
_impl->setStyle(std_::make_unique<Style>(this, *_st));
|
||||
|
@ -2594,13 +2611,6 @@ QString BotKeyboard::tooltipText() const {
|
|||
return QString();
|
||||
}
|
||||
|
||||
//void BotKeyboard::onParentScrolled() {
|
||||
// // Holding scrollarea can fire scrolled() event from a resize() call before
|
||||
// // the resizeEvent() is called, which prepares _impl for updateSelected() call.
|
||||
// // Calling updateSelected() without delay causes _impl->getState() before _impl->resize().
|
||||
// QMetaObject::invokeMethod(this, "updateSelected", Qt::QueuedConnection);
|
||||
//}
|
||||
|
||||
void BotKeyboard::updateSelected() {
|
||||
PopupTooltip::Show(1000, this);
|
||||
|
||||
|
@ -3069,6 +3079,9 @@ HistoryWidget::HistoryWidget(QWidget *parent) : TWidget(parent)
|
|||
_animActiveTimer.setSingleShot(false);
|
||||
connect(&_animActiveTimer, SIGNAL(timeout()), this, SLOT(onAnimActiveStep()));
|
||||
|
||||
_membersDropdownShowTimer.setSingleShot(true);
|
||||
connect(&_membersDropdownShowTimer, SIGNAL(timeout()), this, SLOT(onMembersDropdownShow()));
|
||||
|
||||
_saveDraftTimer.setSingleShot(true);
|
||||
connect(&_saveDraftTimer, SIGNAL(timeout()), this, SLOT(onDraftSave()));
|
||||
_saveCloudDraftTimer.setSingleShot(true);
|
||||
|
@ -3086,8 +3099,6 @@ HistoryWidget::HistoryWidget(QWidget *parent) : TWidget(parent)
|
|||
_kbScroll.setWidget(&_keyboard);
|
||||
_kbScroll.hide();
|
||||
|
||||
// connect(&_kbScroll, SIGNAL(scrolled()), &_keyboard, SLOT(onParentScrolled()));
|
||||
|
||||
updateScrollColors();
|
||||
|
||||
_historyToEnd->installEventFilter(this);
|
||||
|
@ -3097,6 +3108,7 @@ HistoryWidget::HistoryWidget(QWidget *parent) : TWidget(parent)
|
|||
connect(_fieldAutocomplete, SIGNAL(hashtagChosen(QString,FieldAutocomplete::ChooseMethod)), this, SLOT(onHashtagOrBotCommandInsert(QString,FieldAutocomplete::ChooseMethod)));
|
||||
connect(_fieldAutocomplete, SIGNAL(botCommandChosen(QString,FieldAutocomplete::ChooseMethod)), this, SLOT(onHashtagOrBotCommandInsert(QString,FieldAutocomplete::ChooseMethod)));
|
||||
connect(_fieldAutocomplete, SIGNAL(stickerChosen(DocumentData*,FieldAutocomplete::ChooseMethod)), this, SLOT(onStickerSend(DocumentData*)));
|
||||
connect(_fieldAutocomplete, SIGNAL(moderateKeyActivate(int,bool*)), this, SLOT(onModerateKeyActivate(int,bool*)));
|
||||
_field.installEventFilter(_fieldAutocomplete);
|
||||
_field.setTagMimeProcessor(std_::make_unique<FieldTagMimeProcessor>());
|
||||
updateFieldSubmitSettings();
|
||||
|
@ -3976,6 +3988,7 @@ void HistoryWidget::showHistory(const PeerId &peerId, MsgId showAtMsgId, bool re
|
|||
_previewCache.clear();
|
||||
_fieldBarCancel.hide();
|
||||
|
||||
_membersDropdownShowTimer.stop();
|
||||
if (_list) _list->deleteLater();
|
||||
_list = nullptr;
|
||||
_scroll.takeWidget();
|
||||
|
@ -5462,7 +5475,7 @@ void HistoryWidget::mouseMoveEvent(QMouseEvent *e) {
|
|||
if (startAnim) _a_record.start();
|
||||
}
|
||||
|
||||
void HistoryWidget::leaveToChildEvent(QEvent *e) { // e -- from enterEvent() of child TWidget
|
||||
void HistoryWidget::leaveToChildEvent(QEvent *e, QWidget *child) { // e -- from enterEvent() of child TWidget
|
||||
if (hasMouseTracking()) mouseMoveEvent(0);
|
||||
}
|
||||
|
||||
|
@ -5656,7 +5669,10 @@ bool HistoryWidget::eventFilter(QObject *obj, QEvent *e) {
|
|||
}
|
||||
|
||||
DragState HistoryWidget::getDragState(const QMimeData *d) {
|
||||
if (!d || d->hasFormat(qsl("application/x-td-forward-pressed-link"))) return DragStateNone;
|
||||
if (!d
|
||||
|| d->hasFormat(qsl("application/x-td-forward-selected"))
|
||||
|| d->hasFormat(qsl("application/x-td-forward-pressed"))
|
||||
|| d->hasFormat(qsl("application/x-td-forward-pressed-link"))) return DragStateNone;
|
||||
|
||||
if (d->hasImage()) return DragStateImage;
|
||||
|
||||
|
@ -5877,10 +5893,13 @@ void HistoryWidget::onFilesDrop(const QMimeData *data) {
|
|||
}
|
||||
|
||||
void HistoryWidget::onKbToggle(bool manual) {
|
||||
auto fieldEnabled = canWriteMessage();
|
||||
if (_kbShown || _kbReplyTo) {
|
||||
_kbHide.hide();
|
||||
if (_kbShown) {
|
||||
_kbShow.show();
|
||||
if (fieldEnabled) {
|
||||
_kbShow.show();
|
||||
}
|
||||
if (manual && _history) {
|
||||
_history->lastKeyboardHiddenId = _keyboard.forMsgId().msg;
|
||||
}
|
||||
|
@ -5904,23 +5923,25 @@ void HistoryWidget::onKbToggle(bool manual) {
|
|||
} else if (!_keyboard.hasMarkup() && _keyboard.forceReply()) {
|
||||
_kbHide.hide();
|
||||
_kbShow.hide();
|
||||
_cmdStart.show();
|
||||
if (fieldEnabled) {
|
||||
_cmdStart.show();
|
||||
}
|
||||
_kbScroll.hide();
|
||||
_kbShown = false;
|
||||
|
||||
_field.setMaxHeight(st::maxFieldHeight);
|
||||
|
||||
_kbReplyTo = (_peer->isChat() || _peer->isChannel() || _keyboard.forceReply()) ? App::histItemById(_keyboard.forMsgId()) : 0;
|
||||
if (_kbReplyTo && !_editMsgId && !_replyToId) {
|
||||
if (_kbReplyTo && !_editMsgId && !_replyToId && fieldEnabled) {
|
||||
updateReplyToName();
|
||||
_replyEditMsgText.setText(st::msgFont, _kbReplyTo->inDialogsText(), _textDlgOptions);
|
||||
_replyEditMsgText.setText(st::msgFont, textClean(_kbReplyTo->inReplyText()), _textDlgOptions);
|
||||
_fieldBarCancel.show();
|
||||
updateMouseTracking();
|
||||
}
|
||||
if (manual && _history) {
|
||||
_history->lastKeyboardHiddenId = 0;
|
||||
}
|
||||
} else {
|
||||
} else if (fieldEnabled) {
|
||||
_kbHide.show();
|
||||
_kbShow.hide();
|
||||
_kbScroll.show();
|
||||
|
@ -5932,7 +5953,7 @@ void HistoryWidget::onKbToggle(bool manual) {
|
|||
_kbReplyTo = (_peer->isChat() || _peer->isChannel() || _keyboard.forceReply()) ? App::histItemById(_keyboard.forMsgId()) : 0;
|
||||
if (_kbReplyTo && !_editMsgId && !_replyToId) {
|
||||
updateReplyToName();
|
||||
_replyEditMsgText.setText(st::msgFont, _kbReplyTo->inDialogsText(), _textDlgOptions);
|
||||
_replyEditMsgText.setText(st::msgFont, textClean(_kbReplyTo->inReplyText()), _textDlgOptions);
|
||||
_fieldBarCancel.show();
|
||||
updateMouseTracking();
|
||||
}
|
||||
|
@ -5941,7 +5962,7 @@ void HistoryWidget::onKbToggle(bool manual) {
|
|||
}
|
||||
}
|
||||
resizeEvent(0);
|
||||
if (_kbHide.isHidden()) {
|
||||
if (_kbHide.isHidden() && canWriteMessage()) {
|
||||
_attachEmoji.show();
|
||||
} else {
|
||||
_attachEmoji.hide();
|
||||
|
@ -6029,6 +6050,52 @@ void HistoryWidget::paintTopBar(Painter &p, float64 over, int32 decreaseWidth) {
|
|||
}
|
||||
}
|
||||
|
||||
QRect HistoryWidget::getMembersShowAreaGeometry() const {
|
||||
int increaseLeft = Adaptive::OneColumn() ? (st::topBarForwardPadding.right() - st::topBarForwardPadding.left()) : 0;
|
||||
int membersTextLeft = st::topBarForwardPadding.left() + increaseLeft;
|
||||
int membersTextTop = st::topBarHeight - st::topBarForwardPadding.bottom() - st::dialogsTextFont->height;
|
||||
int membersTextWidth = _titlePeerTextWidth;
|
||||
int membersTextHeight = st::topBarHeight - membersTextTop;
|
||||
|
||||
return rtlrect(membersTextLeft, membersTextTop, membersTextWidth, membersTextHeight, width());
|
||||
}
|
||||
|
||||
void HistoryWidget::setMembersShowAreaActive(bool active) {
|
||||
if (!active) {
|
||||
_membersDropdownShowTimer.stop();
|
||||
}
|
||||
if (active && _peer && (_peer->isChat() || _peer->isMegagroup())) {
|
||||
if (_membersDropdown) {
|
||||
_membersDropdown->otherEnter();
|
||||
} else if (!_membersDropdownShowTimer.isActive()) {
|
||||
_membersDropdownShowTimer.start(300);
|
||||
}
|
||||
} else if (_membersDropdown) {
|
||||
_membersDropdown->otherLeave();
|
||||
}
|
||||
}
|
||||
|
||||
void HistoryWidget::onMembersDropdownShow() {
|
||||
if (!_membersDropdown) {
|
||||
_membersDropdown = new Ui::InnerDropdown(this, st::membersInnerDropdown, st::membersInnerScroll);
|
||||
_membersDropdown->setOwnedWidget(new Profile::MembersWidget(_membersDropdown, _peer, Profile::MembersWidget::TitleVisibility::Hidden));
|
||||
_membersDropdown->resize(st::membersInnerWidth, _membersDropdown->height());
|
||||
|
||||
_membersDropdown->setMaxHeight(countMembersDropdownHeightMax());
|
||||
_membersDropdown->moveToLeft(0, 0);
|
||||
connect(_membersDropdown, SIGNAL(hidden()), this, SLOT(onMembersDropdownHidden()));
|
||||
}
|
||||
_membersDropdown->otherEnter();
|
||||
}
|
||||
|
||||
void HistoryWidget::onModerateKeyActivate(int index, bool *outHandled) {
|
||||
*outHandled = _keyboard.isHidden() ? false : _keyboard.moderateKeyActivate(index);
|
||||
}
|
||||
|
||||
void HistoryWidget::onMembersDropdownHidden() {
|
||||
_membersDropdown.destroyDelayed();
|
||||
}
|
||||
|
||||
void HistoryWidget::topBarClick() {
|
||||
if (Adaptive::OneColumn()) {
|
||||
Ui::showChatsList();
|
||||
|
@ -6094,6 +6161,7 @@ void HistoryWidget::updateOnlineDisplay(int32 x, int32 w) {
|
|||
_titlePeerTextOnline = titlePeerTextOnline;
|
||||
_titlePeerTextWidth = st::dialogsTextFont->width(_titlePeerText);
|
||||
if (App::main()) {
|
||||
App::main()->topBar()->updateMembersShowArea();
|
||||
App::main()->topBar()->update();
|
||||
}
|
||||
}
|
||||
|
@ -6707,6 +6775,9 @@ void HistoryWidget::resizeEvent(QResizeEvent *e) {
|
|||
_historyToEnd->moveToRight(st::historyToDownPosition.x(), _scroll.y() + _scroll.height() - _historyToEnd->height() - st::historyToDownPosition.y());
|
||||
|
||||
_emojiPan.setMaxHeight(height() - st::dropdownDef.padding.top() - st::dropdownDef.padding.bottom() - _attachEmoji.height());
|
||||
if (_membersDropdown) {
|
||||
_membersDropdown->setMaxHeight(countMembersDropdownHeightMax());
|
||||
}
|
||||
|
||||
switch (_attachDrag) {
|
||||
case DragStateFiles:
|
||||
|
@ -7007,7 +7078,7 @@ void HistoryWidget::updateBotKeyboard(History *h, bool force) {
|
|||
_kbReplyTo = (_peer->isChat() || _peer->isChannel() || _keyboard.forceReply()) ? App::histItemById(_keyboard.forMsgId()) : 0;
|
||||
if (_kbReplyTo && !_replyToId) {
|
||||
updateReplyToName();
|
||||
_replyEditMsgText.setText(st::msgFont, _kbReplyTo->inDialogsText(), _textDlgOptions);
|
||||
_replyEditMsgText.setText(st::msgFont, textClean(_kbReplyTo->inReplyText()), _textDlgOptions);
|
||||
_fieldBarCancel.show();
|
||||
updateMouseTracking();
|
||||
}
|
||||
|
@ -7244,7 +7315,7 @@ void HistoryWidget::updatePinnedBar(bool force) {
|
|||
_pinnedBar->msg = App::histItemById(_history->channelId(), _pinnedBar->msgId);
|
||||
}
|
||||
if (_pinnedBar->msg) {
|
||||
_pinnedBar->text.setText(st::msgFont, _pinnedBar->msg->inDialogsText(), _textDlgOptions);
|
||||
_pinnedBar->text.setText(st::msgFont, textClean(_pinnedBar->msg->notificationText()), _textDlgOptions);
|
||||
update();
|
||||
} else if (force) {
|
||||
if (_peer && _peer->isMegagroup()) {
|
||||
|
@ -7283,6 +7354,9 @@ bool HistoryWidget::pinnedMsgVisibilityUpdated() {
|
|||
connect(&_pinnedBar->cancel, SIGNAL(clicked()), this, SLOT(onPinnedHide()));
|
||||
_reportSpamPanel.raise();
|
||||
_topShadow.raise();
|
||||
if (_membersDropdown) {
|
||||
_membersDropdown->raise();
|
||||
}
|
||||
updatePinnedBar();
|
||||
result = true;
|
||||
|
||||
|
@ -7479,7 +7553,7 @@ void HistoryWidget::onReplyToMessage() {
|
|||
} else {
|
||||
_replyEditMsg = to;
|
||||
_replyToId = to->id;
|
||||
_replyEditMsgText.setText(st::msgFont, _replyEditMsg->inDialogsText(), _textDlgOptions);
|
||||
_replyEditMsgText.setText(st::msgFont, textClean(_replyEditMsg->inReplyText()), _textDlgOptions);
|
||||
|
||||
updateBotKeyboard();
|
||||
|
||||
|
@ -7665,6 +7739,13 @@ void HistoryWidget::cancelReplyAfterMediaSend(bool lastKeyboardUsed) {
|
|||
}
|
||||
}
|
||||
|
||||
int HistoryWidget::countMembersDropdownHeightMax() const {
|
||||
int result = height() - st::membersInnerDropdown.padding.top() - st::membersInnerDropdown.padding.bottom();
|
||||
result -= _attachEmoji.height();
|
||||
accumulate_min(result, st::membersInnerHeightMax);
|
||||
return result;
|
||||
}
|
||||
|
||||
void HistoryWidget::cancelEdit() {
|
||||
if (!_editMsgId) return;
|
||||
|
||||
|
@ -7818,7 +7899,7 @@ void HistoryWidget::updatePreview() {
|
|||
updateMouseTracking();
|
||||
if (_previewData->pendingTill) {
|
||||
_previewTitle.setText(st::msgServiceNameFont, lang(lng_preview_loading), _textNameOptions);
|
||||
_previewDescription.setText(st::msgFont, _previewLinks.splitRef(' ').at(0).toString(), _textDlgOptions);
|
||||
_previewDescription.setText(st::msgFont, textClean(_previewLinks.splitRef(' ').at(0).toString()), _textDlgOptions);
|
||||
|
||||
int32 t = (_previewData->pendingTill - unixtime()) * 1000;
|
||||
if (t <= 0) t = 1;
|
||||
|
@ -7850,7 +7931,7 @@ void HistoryWidget::updatePreview() {
|
|||
}
|
||||
}
|
||||
_previewTitle.setText(st::msgServiceNameFont, title, _textNameOptions);
|
||||
_previewDescription.setText(st::msgFont, desc, _textDlgOptions);
|
||||
_previewDescription.setText(st::msgFont, textClean(desc), _textDlgOptions);
|
||||
}
|
||||
} else if (!readyToForward() && !replyToId() && !_editMsgId) {
|
||||
_fieldBarCancel.hide();
|
||||
|
@ -8027,6 +8108,12 @@ void HistoryWidget::onListEscapePressed() {
|
|||
}
|
||||
}
|
||||
|
||||
void HistoryWidget::onListEnterPressed() {
|
||||
if (!_botStart.isHidden()) {
|
||||
onBotStart();
|
||||
}
|
||||
}
|
||||
|
||||
void HistoryWidget::onClearSelected() {
|
||||
if (_list) _list->clearSelectedItems();
|
||||
}
|
||||
|
@ -8106,7 +8193,7 @@ void HistoryWidget::updateReplyEditTexts(bool force) {
|
|||
_replyEditMsg = App::histItemById(_channel, _editMsgId ? _editMsgId : _replyToId);
|
||||
}
|
||||
if (_replyEditMsg) {
|
||||
_replyEditMsgText.setText(st::msgFont, _replyEditMsg->inDialogsText(), _textDlgOptions);
|
||||
_replyEditMsgText.setText(st::msgFont, textClean(_replyEditMsg->inReplyText()), _textDlgOptions);
|
||||
|
||||
updateBotKeyboard();
|
||||
|
||||
|
|
|
@ -36,6 +36,7 @@ class Result;
|
|||
|
||||
namespace Ui {
|
||||
class HistoryDownButton;
|
||||
class InnerDropdown;
|
||||
} // namespace Ui
|
||||
|
||||
class HistoryWidget;
|
||||
|
@ -357,13 +358,14 @@ public:
|
|||
BotKeyboard();
|
||||
|
||||
void paintEvent(QPaintEvent *e) override;
|
||||
void resizeEvent(QResizeEvent *e) override;
|
||||
void mousePressEvent(QMouseEvent *e) override;
|
||||
void mouseMoveEvent(QMouseEvent *e) override;
|
||||
void mouseReleaseEvent(QMouseEvent *e) override;
|
||||
void enterEvent(QEvent *e) override;
|
||||
void leaveEvent(QEvent *e) override;
|
||||
|
||||
bool moderateKeyActivate(int index);
|
||||
|
||||
// With force=true the markup is updated even if it is
|
||||
// already shown for the passed history item.
|
||||
bool updateMarkup(HistoryItem *last, bool force = false);
|
||||
|
@ -371,7 +373,7 @@ public:
|
|||
bool forceReply() const;
|
||||
|
||||
void step_selected(uint64 ms, bool timer);
|
||||
void resizeToWidth(int width, int maxOuterHeight);
|
||||
void resizeToWidth(int newWidth, int maxOuterHeight);
|
||||
|
||||
bool maximizeSize() const;
|
||||
bool singleUse() const;
|
||||
|
@ -388,18 +390,10 @@ public:
|
|||
void clickHandlerActiveChanged(const ClickHandlerPtr &p, bool active) override;
|
||||
void clickHandlerPressedChanged(const ClickHandlerPtr &p, bool pressed) override;
|
||||
|
||||
//public slots:
|
||||
//
|
||||
// void onParentScrolled();
|
||||
|
||||
//private slots:
|
||||
private:
|
||||
|
||||
void updateSelected();
|
||||
|
||||
private:
|
||||
|
||||
void updateStyle(int32 w = -1);
|
||||
void updateStyle(int newWidth);
|
||||
void clearSelection();
|
||||
|
||||
FullMsgId _wasForMsgId;
|
||||
|
@ -549,12 +543,14 @@ public:
|
|||
void dropEvent(QDropEvent *e) override;
|
||||
void mouseReleaseEvent(QMouseEvent *e) override;
|
||||
void mouseMoveEvent(QMouseEvent *e) override;
|
||||
void leaveToChildEvent(QEvent *e) override;
|
||||
void leaveToChildEvent(QEvent *e, QWidget *child) override;
|
||||
void contextMenuEvent(QContextMenuEvent *e) override;
|
||||
|
||||
void updateTopBarSelection();
|
||||
|
||||
void paintTopBar(Painter &p, float64 over, int32 decreaseWidth);
|
||||
QRect getMembersShowAreaGeometry() const;
|
||||
void setMembersShowAreaActive(bool active);
|
||||
void topBarClick();
|
||||
|
||||
void loadMessages();
|
||||
|
@ -657,6 +653,7 @@ public:
|
|||
void stopRecording(bool send);
|
||||
|
||||
void onListEscapePressed();
|
||||
void onListEnterPressed();
|
||||
|
||||
void sendBotCommand(PeerData *peer, UserData *bot, const QString &cmd, MsgId replyTo);
|
||||
bool insertBotCommand(const QString &cmd, bool specialGif);
|
||||
|
@ -848,6 +845,10 @@ private slots:
|
|||
void onHashtagOrBotCommandInsert(QString str, FieldAutocomplete::ChooseMethod method);
|
||||
void onMentionInsert(UserData *user);
|
||||
void onInlineBotCancel();
|
||||
void onMembersDropdownHidden();
|
||||
void onMembersDropdownShow();
|
||||
|
||||
void onModerateKeyActivate(int index, bool *outHandled);
|
||||
|
||||
void updateField();
|
||||
|
||||
|
@ -872,6 +873,8 @@ private:
|
|||
|
||||
void cancelReplyAfterMediaSend(bool lastKeyboardUsed);
|
||||
|
||||
int countMembersDropdownHeightMax() const;
|
||||
|
||||
MsgId _replyToId = 0;
|
||||
Text _replyToName;
|
||||
int _replyToNameVersion = 0;
|
||||
|
@ -1108,6 +1111,9 @@ private:
|
|||
ScrollArea _kbScroll;
|
||||
BotKeyboard _keyboard;
|
||||
|
||||
ChildWidget<Ui::InnerDropdown> _membersDropdown = { nullptr };
|
||||
QTimer _membersDropdownShowTimer;
|
||||
|
||||
Dropdown _attachType;
|
||||
EmojiPan _emojiPan;
|
||||
DragState _attachDrag = DragStateNone;
|
||||
|
|
|
@ -46,8 +46,8 @@ LangString langCounted(ushort key0, ushort tag, float64 value) { // current lang
|
|||
return lang(LangKey(key0)).tag(tag, sv);
|
||||
}
|
||||
|
||||
#define NEW_VER_TAG lt_link
|
||||
#define NEW_VER_TAG_VALUE "https://telegram.org/blog/drafts"
|
||||
//#define NEW_VER_TAG lt_link
|
||||
//#define NEW_VER_TAG_VALUE "https://telegram.org/blog/drafts"
|
||||
|
||||
QString langNewVersionText() {
|
||||
#ifdef NEW_VER_TAG
|
||||
|
|
|
@ -40,7 +40,7 @@ TextParseOptions _textNameOptions = {
|
|||
Qt::LayoutDirectionAuto, // lang-dependent
|
||||
};
|
||||
TextParseOptions _textDlgOptions = {
|
||||
0, // flags
|
||||
TextParseRichText, // flags
|
||||
0, // maxw is style-dependent
|
||||
1, // maxh
|
||||
Qt::LayoutDirectionAuto, // lang-dependent
|
||||
|
|
|
@ -540,6 +540,7 @@ namespace {
|
|||
dbiAdaptiveForWide = 0x38,
|
||||
dbiHiddenPinnedMessages = 0x39,
|
||||
dbiDialogsMode = 0x40,
|
||||
dbiModerateMode = 0x41,
|
||||
|
||||
dbiEncryptedWithSalt = 333,
|
||||
dbiEncrypted = 444,
|
||||
|
@ -933,6 +934,14 @@ namespace {
|
|||
Global::SetDialogsMode(mode);
|
||||
} break;
|
||||
|
||||
case dbiModerateMode: {
|
||||
qint32 enabled;
|
||||
stream >> enabled;
|
||||
if (!_checkStreamStatus(stream)) return false;
|
||||
|
||||
Global::SetModerateModeEnabled(enabled == 1);
|
||||
} break;
|
||||
|
||||
case dbiIncludeMuted: {
|
||||
qint32 v;
|
||||
stream >> v;
|
||||
|
@ -1523,7 +1532,7 @@ namespace {
|
|||
_writeMap(WriteMapFast);
|
||||
}
|
||||
|
||||
uint32 size = 16 * (sizeof(quint32) + sizeof(qint32));
|
||||
uint32 size = 17 * (sizeof(quint32) + sizeof(qint32));
|
||||
size += sizeof(quint32) + Serialize::stringSize(cAskDownloadPath() ? QString() : cDownloadPath()) + Serialize::bytearraySize(cAskDownloadPath() ? QByteArray() : cDownloadPathBookmark());
|
||||
size += sizeof(quint32) + sizeof(qint32) + (cRecentEmojisPreload().isEmpty() ? cGetRecentEmojis().size() : cRecentEmojisPreload().size()) * (sizeof(uint64) + sizeof(ushort));
|
||||
size += sizeof(quint32) + sizeof(qint32) + cEmojiVariants().size() * (sizeof(uint32) + sizeof(uint64));
|
||||
|
@ -1555,6 +1564,7 @@ namespace {
|
|||
data.stream << quint32(dbiSongVolume) << qint32(qRound(cSongVolume() * 1e6));
|
||||
data.stream << quint32(dbiAutoDownload) << qint32(cAutoDownloadPhoto()) << qint32(cAutoDownloadAudio()) << qint32(cAutoDownloadGif());
|
||||
data.stream << quint32(dbiDialogsMode) << qint32(Global::DialogsModeEnabled() ? 1 : 0) << static_cast<qint32>(Global::DialogsMode());
|
||||
data.stream << quint32(dbiModerateMode) << qint32(Global::ModerateModeEnabled() ? 1 : 0);
|
||||
data.stream << quint32(dbiAutoPlay) << qint32(cAutoPlayGif() ? 1 : 0);
|
||||
|
||||
{
|
||||
|
|
|
@ -41,8 +41,8 @@ int main(int argc, char *argv[]) {
|
|||
}
|
||||
|
||||
// both are finished in Application::closeApplication
|
||||
Logs::start(); // must be started before PlatformSpecific is started
|
||||
PlatformSpecific::start(); // must be started before QApplication is created
|
||||
Logs::start(); // must be started before Platform is started
|
||||
Platform::start(); // must be started before QApplication is created
|
||||
|
||||
// prepare fake args to disable QT_STYLE_OVERRIDE env variable
|
||||
// currently this is required in some desktop environments, including Xubuntu 15.10
|
||||
|
@ -76,7 +76,7 @@ int main(int argc, char *argv[]) {
|
|||
}
|
||||
|
||||
SignalHandlers::finish();
|
||||
PlatformSpecific::finish();
|
||||
Platform::finish();
|
||||
Logs::finish();
|
||||
|
||||
return result;
|
||||
|
|
|
@ -256,7 +256,7 @@ void MainWidget::updateForwardingTexts() {
|
|||
}
|
||||
}
|
||||
_toForwardFrom.setText(st::msgServiceNameFont, from, _textNameOptions);
|
||||
_toForwardText.setText(st::msgFont, text, _textDlgOptions);
|
||||
_toForwardText.setText(st::msgFont, textClean(text), _textDlgOptions);
|
||||
_toForwardNameVersion = version;
|
||||
}
|
||||
|
||||
|
@ -632,10 +632,9 @@ void MainWidget::deleteLayer(int32 selectedCount) {
|
|||
|
||||
void MainWidget::deletePhotoLayer(PhotoData *photo) {
|
||||
_deletingPhoto = photo;
|
||||
onDeletePhotoSure(); // langs are not ready yet
|
||||
//auto box = new ConfirmBox(lang(lng_delete_photo_sure), lang(lng_box_delete));
|
||||
//connect(box, SIGNAL(confirmed()), this, SLOT(onDeletePhotoSure()));
|
||||
//Ui::showLayer(box);
|
||||
auto box = new ConfirmBox(lang(lng_delete_photo_sure), lang(lng_box_delete));
|
||||
connect(box, SIGNAL(confirmed()), this, SLOT(onDeletePhotoSure()));
|
||||
Ui::showLayer(box);
|
||||
}
|
||||
|
||||
void MainWidget::onDeletePhotoSure() {
|
||||
|
@ -1280,7 +1279,8 @@ void MainWidget::preloadOverviews(PeerData *peer) {
|
|||
History *h = App::history(peer->id);
|
||||
bool sending = false;
|
||||
for (int32 i = 0; i < OverviewCount; ++i) {
|
||||
if (preloadOverview(peer, MediaOverviewType(i))) {
|
||||
auto type = MediaOverviewType(i);
|
||||
if (type != OverviewChatPhotos && preloadOverview(peer, type)) {
|
||||
sending = true;
|
||||
}
|
||||
}
|
||||
|
@ -1842,7 +1842,14 @@ void MainWidget::setChatBackground(const App::WallPaper &wp) {
|
|||
}
|
||||
|
||||
bool MainWidget::chatBackgroundLoading() {
|
||||
return !!_background;
|
||||
return (_background != nullptr);
|
||||
}
|
||||
|
||||
float64 MainWidget::chatBackgroundProgress() const {
|
||||
if (_background) {
|
||||
return _background->full->progress();
|
||||
}
|
||||
return 1.;
|
||||
}
|
||||
|
||||
void MainWidget::checkChatBackground() {
|
||||
|
@ -2696,6 +2703,19 @@ void MainWidget::paintTopBar(Painter &p, float64 over, int32 decreaseWidth) {
|
|||
}
|
||||
}
|
||||
|
||||
QRect MainWidget::getMembersShowAreaGeometry() const {
|
||||
if (!_overview && !_wideSection) {
|
||||
return _history->getMembersShowAreaGeometry();
|
||||
}
|
||||
return QRect();
|
||||
}
|
||||
|
||||
void MainWidget::setMembersShowAreaActive(bool active) {
|
||||
if (!active || (!_overview && !_wideSection)) {
|
||||
_history->setMembersShowAreaActive(active);
|
||||
}
|
||||
}
|
||||
|
||||
void MainWidget::onPhotosSelect() {
|
||||
if (_overview) _overview->switchType(OverviewPhotos);
|
||||
_mediaType->hideStart();
|
||||
|
@ -3195,7 +3215,7 @@ void MainWidget::getDifference() {
|
|||
_getDifferenceTimeByPts = 0;
|
||||
|
||||
LOG(("Getting difference! no updates timer: %1, remains: %2").arg(noUpdatesTimer.isActive() ? 1 : 0).arg(noUpdatesTimer.remainingTime()));
|
||||
if (_ptsWaiter.requesting()) return;
|
||||
if (requestingDifference()) return;
|
||||
|
||||
_bySeqUpdates.clear();
|
||||
_bySeqTimer.stop();
|
||||
|
@ -3859,7 +3879,7 @@ void MainWidget::updateReceived(const mtpPrime *from, const mtpPrime *end) {
|
|||
|
||||
_lastUpdateTime = getms(true);
|
||||
noUpdatesTimer.start(NoUpdatesTimeout);
|
||||
if (!_ptsWaiter.requesting()) {
|
||||
if (!requestingDifference()) {
|
||||
feedUpdates(updates);
|
||||
}
|
||||
} catch (mtpErrorUnexpected &) { // just some other type
|
||||
|
@ -4175,8 +4195,10 @@ void MainWidget::feedUpdate(const MTPUpdate &update) {
|
|||
if (item->isMediaUnread()) {
|
||||
item->markMediaRead();
|
||||
Ui::repaintHistoryItem(item);
|
||||
|
||||
if (item->out() && item->history()->peer->isUser()) {
|
||||
item->history()->peer->asUser()->madeAction();
|
||||
auto when = requestingDifference() ? 0 : unixtime();
|
||||
item->history()->peer->asUser()->madeAction(when);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -4207,7 +4229,8 @@ void MainWidget::feedUpdate(const MTPUpdate &update) {
|
|||
|
||||
// update before applying skipped
|
||||
auto peerId = peerFromMTP(d.vpeer);
|
||||
App::feedOutboxRead(peerId, d.vmax_id.v);
|
||||
auto when = requestingDifference() ? 0 : unixtime();
|
||||
App::feedOutboxRead(peerId, d.vmax_id.v, when);
|
||||
if (_history->peer() && _history->peer()->id == peerId) {
|
||||
_history->update();
|
||||
}
|
||||
|
@ -4249,7 +4272,8 @@ void MainWidget::feedUpdate(const MTPUpdate &update) {
|
|||
History *history = App::historyLoaded(peerFromUser(d.vuser_id));
|
||||
UserData *user = App::userLoaded(d.vuser_id.v);
|
||||
if (history && user) {
|
||||
App::histories().regSendAction(history, user, d.vaction);
|
||||
auto when = requestingDifference() ? 0 : unixtime();
|
||||
App::histories().regSendAction(history, user, d.vaction, when);
|
||||
}
|
||||
} break;
|
||||
|
||||
|
@ -4263,7 +4287,8 @@ void MainWidget::feedUpdate(const MTPUpdate &update) {
|
|||
}
|
||||
UserData *user = (d.vuser_id.v == MTP::authedId()) ? 0 : App::userLoaded(d.vuser_id.v);
|
||||
if (history && user) {
|
||||
App::histories().regSendAction(history, user, d.vaction);
|
||||
auto when = requestingDifference() ? 0 : unixtime();
|
||||
App::histories().regSendAction(history, user, d.vaction, when);
|
||||
}
|
||||
} break;
|
||||
|
||||
|
@ -4461,7 +4486,7 @@ void MainWidget::feedUpdate(const MTPUpdate &update) {
|
|||
const auto &d(update.c_updateNewChannelMessage());
|
||||
ChannelData *channel = App::channelLoaded(peerToChannel(peerFromMessage(d.vmessage)));
|
||||
DataIsLoadedResult isDataLoaded = allDataLoadedForMessage(d.vmessage);
|
||||
if (!_ptsWaiter.requesting() && (!channel || isDataLoaded != DataIsLoadedResult::Ok)) {
|
||||
if (!requestingDifference() && (!channel || isDataLoaded != DataIsLoadedResult::Ok)) {
|
||||
MTP_LOG(0, ("getDifference { good - after not all data loaded in updateNewChannelMessage }%1").arg(cTestMode() ? " TESTMODE" : ""));
|
||||
|
||||
// Request last active supergroup participants if the 'from' user was not loaded yet.
|
||||
|
@ -4566,7 +4591,8 @@ void MainWidget::feedUpdate(const MTPUpdate &update) {
|
|||
case mtpc_updateReadChannelOutbox: {
|
||||
auto &d(update.c_updateReadChannelOutbox());
|
||||
auto peerId = peerFromChannel(d.vchannel_id.v);
|
||||
App::feedOutboxRead(peerId, d.vmax_id.v);
|
||||
auto when = requestingDifference() ? 0 : unixtime();
|
||||
App::feedOutboxRead(peerId, d.vmax_id.v, when);
|
||||
if (_history->peer() && _history->peer()->id == peerId) {
|
||||
_history->update();
|
||||
}
|
||||
|
|
|
@ -162,7 +162,10 @@ public:
|
|||
void updateAdaptiveLayout();
|
||||
bool needBackButton();
|
||||
|
||||
// Temporary methods, while top bar was not done inside HistoryWidget / OverviewWidget.
|
||||
void paintTopBar(Painter &p, float64 over, int32 decreaseWidth);
|
||||
QRect getMembersShowAreaGeometry() const;
|
||||
void setMembersShowAreaActive(bool active);
|
||||
Window::TopBarWidget *topBar();
|
||||
|
||||
PlayerWidget *player();
|
||||
|
@ -342,6 +345,7 @@ public:
|
|||
|
||||
void setChatBackground(const App::WallPaper &wp);
|
||||
bool chatBackgroundLoading();
|
||||
float64 chatBackgroundProgress() const;
|
||||
void checkChatBackground();
|
||||
ImagePtr newBackgroundThumb();
|
||||
|
||||
|
@ -614,6 +618,9 @@ private:
|
|||
bool ptsUpdated(int32 pts, int32 ptsCount, const MTPUpdate &update);
|
||||
void ptsApplySkippedUpdates();
|
||||
PtsWaiter _ptsWaiter;
|
||||
bool requestingDifference() const {
|
||||
return _ptsWaiter.requesting();
|
||||
}
|
||||
|
||||
typedef QMap<ChannelData*, uint64> ChannelGetDifferenceTime;
|
||||
ChannelGetDifferenceTime _channelGetDifferenceTimeByPts, _channelGetDifferenceTimeAfterFail;
|
||||
|
|
|
@ -364,7 +364,7 @@ NotifyWindow::~NotifyWindow() {
|
|||
if (App::wnd()) App::wnd()->notifyShowNext(this);
|
||||
}
|
||||
|
||||
MainWindow::MainWindow(QWidget *parent) : PsMainWindow(parent) {
|
||||
MainWindow::MainWindow() {
|
||||
icon16 = icon256.scaledToWidth(16, Qt::SmoothTransformation);
|
||||
icon32 = icon256.scaledToWidth(32, Qt::SmoothTransformation);
|
||||
icon64 = icon256.scaledToWidth(64, Qt::SmoothTransformation);
|
||||
|
@ -417,7 +417,9 @@ void MainWindow::onInactiveTimer() {
|
|||
inactivePress(false);
|
||||
}
|
||||
|
||||
void MainWindow::stateChanged(Qt::WindowState state) {
|
||||
void MainWindow::onStateChanged(Qt::WindowState state) {
|
||||
stateChangedHook(state);
|
||||
|
||||
psUserActionDone();
|
||||
|
||||
updateIsActive((state == Qt::WindowMinimized) ? Global::OfflineBlurTimeout() : Global::OnlineFocusTimeout());
|
||||
|
@ -434,7 +436,7 @@ void MainWindow::init() {
|
|||
setWindowIcon(wndIcon);
|
||||
|
||||
Application::instance()->installEventFilter(this);
|
||||
connect(windowHandle(), SIGNAL(windowStateChanged(Qt::WindowState)), this, SLOT(stateChanged(Qt::WindowState)));
|
||||
connect(windowHandle(), SIGNAL(windowStateChanged(Qt::WindowState)), this, SLOT(onStateChanged(Qt::WindowState)));
|
||||
connect(windowHandle(), SIGNAL(activeChanged()), this, SLOT(checkHistoryActivation()), Qt::QueuedConnection);
|
||||
|
||||
QPalette p(palette());
|
||||
|
@ -453,7 +455,7 @@ void MainWindow::firstShow() {
|
|||
#else
|
||||
trayIconMenu = new QMenu(this);
|
||||
#endif
|
||||
QString notificationItem = lang(cDesktopNotify()
|
||||
auto notificationItem = lang(cDesktopNotify()
|
||||
? lng_disable_notifications_from_tray : lng_enable_notifications_from_tray);
|
||||
|
||||
if (cPlatform() == dbipWindows || cPlatform() == dbipMac || cPlatform() == dbipMacOld) {
|
||||
|
@ -467,9 +469,10 @@ void MainWindow::firstShow() {
|
|||
trayIconMenu->addAction(lang(lng_quit_from_tray), this, SLOT(quitFromTray()))->setEnabled(true);
|
||||
}
|
||||
psUpdateWorkmode();
|
||||
|
||||
psFirstShow();
|
||||
updateTrayMenu();
|
||||
|
||||
_mediaView = new MediaView();
|
||||
}
|
||||
|
||||
QWidget *MainWindow::filedialogParent() {
|
||||
|
@ -665,8 +668,6 @@ void MainWindow::setupMain(bool anim, const MTPUser *self) {
|
|||
fixOrder();
|
||||
|
||||
updateTitleStatus();
|
||||
|
||||
_mediaView = new MediaView();
|
||||
}
|
||||
|
||||
void MainWindow::updateUnreadCounter() {
|
||||
|
@ -924,13 +925,26 @@ void MainWindow::layerHidden() {
|
|||
setInnerFocus();
|
||||
}
|
||||
|
||||
void MainWindow::onReActivate() {
|
||||
if (auto w = App::wnd()) {
|
||||
if (auto f = QApplication::focusWidget()) {
|
||||
f->clearFocus();
|
||||
}
|
||||
w->windowHandle()->requestActivate();
|
||||
w->activate();
|
||||
if (auto f = QApplication::focusWidget()) {
|
||||
f->clearFocus();
|
||||
}
|
||||
w->setInnerFocus();
|
||||
}
|
||||
}
|
||||
|
||||
void MainWindow::hideMediaview() {
|
||||
if (_mediaView && !_mediaView->isHidden()) {
|
||||
_mediaView->hide();
|
||||
#if defined Q_OS_LINUX32 || defined Q_OS_LINUX64
|
||||
if (App::wnd()) {
|
||||
App::wnd()->activateWindow();
|
||||
}
|
||||
onReActivate();
|
||||
QTimer::singleShot(200, this, SLOT(onReActivate()));
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
@ -1069,7 +1083,7 @@ bool MainWindow::eventFilter(QObject *obj, QEvent *e) {
|
|||
case QEvent::WindowStateChange:
|
||||
if (obj == this) {
|
||||
Qt::WindowState state = (windowState() & Qt::WindowMinimized) ? Qt::WindowMinimized : ((windowState() & Qt::WindowMaximized) ? Qt::WindowMaximized : ((windowState() & Qt::WindowFullScreen) ? Qt::WindowFullScreen : Qt::WindowNoState));
|
||||
stateChanged(state);
|
||||
onStateChanged(state);
|
||||
}
|
||||
break;
|
||||
|
||||
|
@ -1081,7 +1095,7 @@ bool MainWindow::eventFilter(QObject *obj, QEvent *e) {
|
|||
break;
|
||||
}
|
||||
|
||||
return PsMainWindow::eventFilter(obj, e);
|
||||
return Platform::MainWindow::eventFilter(obj, e);
|
||||
}
|
||||
|
||||
void MainWindow::mouseMoveEvent(QMouseEvent *e) {
|
||||
|
@ -1107,7 +1121,7 @@ void MainWindow::mouseReleaseEvent(QMouseEvent *e) {
|
|||
bool MainWindow::minimizeToTray() {
|
||||
if (App::quitting() || !psHasTrayIcon()) return false;
|
||||
|
||||
hide();
|
||||
closeWithoutDestroy();
|
||||
if (cPlatform() == dbipWindows && trayIcon && !cSeenTrayTooltip()) {
|
||||
trayIcon->showMessage(str_const_toString(AppName), lang(lng_tray_icon_text), QSystemTrayIcon::Information, 10000);
|
||||
cSetSeenTrayTooltip(true);
|
||||
|
@ -1283,9 +1297,14 @@ void MainWindow::toggleDisplayNotifyFromTray() {
|
|||
}
|
||||
|
||||
void MainWindow::closeEvent(QCloseEvent *e) {
|
||||
e->ignore();
|
||||
if (!MTP::authedId() || Sandbox::isSavingSession() || !Ui::hideWindowNoQuit()) {
|
||||
if (Sandbox::isSavingSession()) {
|
||||
e->accept();
|
||||
App::quit();
|
||||
} else {
|
||||
e->ignore();
|
||||
if (!MTP::authedId() || !Ui::hideWindowNoQuit()) {
|
||||
App::quit();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -23,6 +23,7 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org
|
|||
#include "title.h"
|
||||
#include "pspecific.h"
|
||||
#include "ui/boxshadow.h"
|
||||
#include "platform/platform_main_window.h"
|
||||
|
||||
class MediaView;
|
||||
class TitleWidget;
|
||||
|
@ -123,11 +124,11 @@ typedef QList<NotifyWindow*> NotifyWindows;
|
|||
|
||||
class MediaPreviewWidget;
|
||||
|
||||
class MainWindow : public PsMainWindow {
|
||||
class MainWindow : public Platform::MainWindow {
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
MainWindow(QWidget *parent = 0);
|
||||
MainWindow();
|
||||
~MainWindow();
|
||||
|
||||
void init();
|
||||
|
@ -248,9 +249,7 @@ public:
|
|||
PeerData *ui_getPeerForMouseAction();
|
||||
|
||||
public slots:
|
||||
|
||||
void updateIsActive(int timeout = 0);
|
||||
void stateChanged(Qt::WindowState state);
|
||||
|
||||
void checkHistoryActivation();
|
||||
|
||||
|
@ -283,12 +282,13 @@ public slots:
|
|||
void onLogoutSure();
|
||||
void updateGlobalMenu(); // for OS X top menu
|
||||
|
||||
void onReActivate();
|
||||
|
||||
void notifyUpdateAllPhotos();
|
||||
|
||||
void app_activateClickHandler(ClickHandlerPtr handler, Qt::MouseButton button);
|
||||
|
||||
signals:
|
||||
|
||||
void resized(const QSize &size);
|
||||
void tempDirCleared(int task);
|
||||
void tempDirClearFailed(int task);
|
||||
|
@ -296,6 +296,9 @@ signals:
|
|||
|
||||
void imageLoaded();
|
||||
|
||||
private slots:
|
||||
void onStateChanged(Qt::WindowState state);
|
||||
|
||||
private:
|
||||
|
||||
QPixmap grabInner();
|
||||
|
|
|
@ -74,20 +74,21 @@ namespace {
|
|||
|
||||
MediaView::MediaView() : TWidget(App::wnd())
|
||||
, _animStarted(getms())
|
||||
, _docRadial(animation(this, &MediaView::step_radial))
|
||||
, _docDownload(this, lang(lng_media_download), st::mvDocLink)
|
||||
, _docSaveAs(this, lang(lng_mediaview_save_as), st::mvDocLink)
|
||||
, _docCancel(this, lang(lng_cancel), st::mvDocLink)
|
||||
, _radial(animation(this, &MediaView::step_radial))
|
||||
, _lastAction(-st::mvDeltaFromLastAction, -st::mvDeltaFromLastAction)
|
||||
, _a_state(animation(this, &MediaView::step_state))
|
||||
, _dropdown(this, st::mvDropdown)
|
||||
, _saveMsgOpacity(0) {
|
||||
, _dropdown(this, st::mvDropdown) {
|
||||
TextCustomTagsMap custom;
|
||||
custom.insert(QChar('c'), qMakePair(textcmdStartLink(1), textcmdStopLink()));
|
||||
_saveMsgText.setRichText(st::medviewSaveMsgFont, lang(lng_mediaview_saved), _textDlgOptions, custom);
|
||||
_saveMsg = QRect(0, 0, _saveMsgText.maxWidth() + st::medviewSaveMsgPadding.left() + st::medviewSaveMsgPadding.right(), st::medviewSaveMsgFont->height + st::medviewSaveMsgPadding.top() + st::medviewSaveMsgPadding.bottom());
|
||||
_saveMsgText.setLink(1, MakeShared<SaveMsgClickHandler>(this));
|
||||
|
||||
connect(QApplication::desktop(), SIGNAL(resized(int)), this, SLOT(onScreenResized(int)));
|
||||
|
||||
_transparentBrush = QBrush(App::sprite().copy(st::mvTransparentBrush.rect()));
|
||||
|
||||
setWindowFlags(Qt::FramelessWindowHint | Qt::BypassWindowManagerHint | Qt::Tool | Qt::NoDropShadowWindowHint);
|
||||
|
@ -98,6 +99,9 @@ MediaView::MediaView() : TWidget(App::wnd())
|
|||
|
||||
hide();
|
||||
createWinId();
|
||||
if (cPlatform() == dbipWindows) {
|
||||
setWindowState(Qt::WindowFullScreen);
|
||||
}
|
||||
|
||||
_saveMsgUpdater.setSingleShot(true);
|
||||
connect(&_saveMsgUpdater, SIGNAL(timeout()), this, SLOT(updateImage()));
|
||||
|
@ -160,6 +164,17 @@ void MediaView::moveToScreen() {
|
|||
|
||||
void MediaView::mediaOverviewUpdated(PeerData *peer, MediaOverviewType type) {
|
||||
if (!_photo && !_doc) return;
|
||||
if (_photo && _overview == OverviewChatPhotos && _history && !_history->peer->isUser()) {
|
||||
auto lastChatPhoto = computeLastOverviewChatPhoto();
|
||||
if (_index < 0 && _photo == lastChatPhoto.photo && _photo == _additionalChatPhoto) {
|
||||
auto firstOpened = _firstOpenedPeerPhoto;
|
||||
showPhoto(_photo, lastChatPhoto.item);
|
||||
_firstOpenedPeerPhoto = firstOpened;
|
||||
return;
|
||||
}
|
||||
computeAdditionalChatPhoto(_history->peer, lastChatPhoto.photo);
|
||||
}
|
||||
|
||||
if (_history && (_history->peer == peer || (_migrated && _migrated->peer == peer)) && type == _overview && _msgid) {
|
||||
_index = -1;
|
||||
if (_msgmigrated) {
|
||||
|
@ -272,9 +287,6 @@ void MediaView::updateControls() {
|
|||
_docSaveAs.hide();
|
||||
_docCancel.moveToLeft(_docRect.x() + 2 * st::mvDocPadding + st::mvDocIconSize, _docRect.y() + st::mvDocPadding + st::mvDocLinksTop);
|
||||
_docCancel.show();
|
||||
if (!_docRadial.animating()) {
|
||||
_docRadial.start(_doc->progress());
|
||||
}
|
||||
} else {
|
||||
if (_doc->loaded(DocumentData::FilePathResolveChecked)) {
|
||||
_docDownload.hide();
|
||||
|
@ -295,6 +307,7 @@ void MediaView::updateControls() {
|
|||
_docSaveAs.hide();
|
||||
_docCancel.hide();
|
||||
}
|
||||
radialStart();
|
||||
|
||||
_saveVisible = ((_photo && _photo->loaded()) || (_doc && (_doc->loaded(DocumentData::FilePathResolveChecked) || (!fileShown() && (_photo || _doc)))));
|
||||
_saveNav = myrtlrect(width() - st::mvIconSize.width() * 2, height() - st::mvIconSize.height(), st::mvIconSize.width(), st::mvIconSize.height());
|
||||
|
@ -332,8 +345,8 @@ void MediaView::updateControls() {
|
|||
(_msgmigrated && _migrated && _migrated->overview[_overview].size() < _migrated->overviewCount(_overview)) ||
|
||||
(!_msgmigrated && _history && _migrated && (!_migrated->overview[_overview].isEmpty() || _migrated->overviewCount(_overview) > 0)))) ||
|
||||
(_index < 0 && _photo == _additionalChatPhoto &&
|
||||
((_history && !_history->overview[_overview].isEmpty()) ||
|
||||
(_migrated && _history->overviewLoaded(_overview) && !_migrated->overview[_overview].isEmpty()))
|
||||
((_history && _history->overviewCount(_overview) > 0) ||
|
||||
(_migrated && _history->overviewLoaded(_overview) && _migrated->overviewCount(_overview) > 0))
|
||||
);
|
||||
_rightNavVisible = (_index >= 0) && (
|
||||
(!_msgmigrated && _history && _index + 1 < _history->overview[_overview].size()) ||
|
||||
|
@ -417,16 +430,56 @@ void MediaView::step_state(uint64 ms, bool timer) {
|
|||
}
|
||||
}
|
||||
|
||||
float64 MediaView::radialProgress() const {
|
||||
if (_doc) {
|
||||
return _doc->progress();
|
||||
} else if (_photo) {
|
||||
return _photo->full->progress();
|
||||
}
|
||||
return 1.;
|
||||
}
|
||||
|
||||
bool MediaView::radialLoading() const {
|
||||
if (_doc) {
|
||||
return _doc->loading();
|
||||
} else if (_photo) {
|
||||
return _photo->full->loading();
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
QRect MediaView::radialRect() const {
|
||||
if (_doc) {
|
||||
return _docIconRect;
|
||||
} else if (_photo) {
|
||||
return _photoRadialRect;
|
||||
}
|
||||
return QRect();
|
||||
}
|
||||
|
||||
void MediaView::radialStart() {
|
||||
if (radialLoading() && !_radial.animating()) {
|
||||
_radial.start(radialProgress());
|
||||
if (auto shift = radialTimeShift()) {
|
||||
_radial.update(radialProgress(), !radialLoading(), getms() + shift);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
uint64 MediaView::radialTimeShift() const {
|
||||
return _photo ? st::radialDuration : 0;
|
||||
}
|
||||
|
||||
void MediaView::step_radial(uint64 ms, bool timer) {
|
||||
if (!_doc) {
|
||||
_docRadial.stop();
|
||||
if (!_doc && !_photo) {
|
||||
_radial.stop();
|
||||
return;
|
||||
}
|
||||
_docRadial.update(_doc->progress(), !_doc->loading(), ms);
|
||||
if (timer && _docRadial.animating()) {
|
||||
update(_docIconRect);
|
||||
_radial.update(radialProgress(), !radialLoading(), ms + radialTimeShift());
|
||||
if (timer && _radial.animating()) {
|
||||
update(radialRect());
|
||||
}
|
||||
if (_doc->loaded() && _doc->size < MediaViewImageSizeLimit && (!_docRadial.animating() || _doc->isAnimation())) {
|
||||
if (_doc && _doc->loaded() && _doc->size < MediaViewImageSizeLimit && (!_radial.animating() || _doc->isAnimation())) {
|
||||
if (!_doc->data().isEmpty() && _doc->isAnimation()) {
|
||||
displayDocument(_doc, App::histItemById(_msgmigrated ? 0 : _channel, _msgid));
|
||||
} else {
|
||||
|
@ -438,7 +491,6 @@ void MediaView::step_radial(uint64 ms, bool timer) {
|
|||
location.accessDisable();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -497,6 +549,29 @@ void MediaView::onDropdownHiding() {
|
|||
}
|
||||
}
|
||||
|
||||
void MediaView::onScreenResized(int screen) {
|
||||
if (isHidden()) return;
|
||||
|
||||
bool ignore = false;
|
||||
auto screens = QApplication::screens();
|
||||
if (screen >= 0 && screen < screens.size()) {
|
||||
if (auto screenHandle = windowHandle()->screen()) {
|
||||
if (screens.at(screen) != screenHandle) {
|
||||
ignore = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!ignore) {
|
||||
moveToScreen();
|
||||
auto item = (_msgid ? App::histItemById(_msgmigrated ? 0 : _channel, _msgid) : nullptr);
|
||||
if (_photo) {
|
||||
displayPhoto(_photo, item);
|
||||
} else if (_doc) {
|
||||
displayDocument(_doc, item);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void MediaView::onToMessage() {
|
||||
if (HistoryItem *item = _msgid ? App::histItemById(_msgmigrated ? 0 : _channel, _msgid) : 0) {
|
||||
if (App::wnd()) {
|
||||
|
@ -573,8 +648,8 @@ void MediaView::onDocClick() {
|
|||
onSaveCancel();
|
||||
} else {
|
||||
DocumentOpenClickHandler::doOpen(_doc, ActionOnLoadNone);
|
||||
if (_doc->loading() && !_docRadial.animating()) {
|
||||
_docRadial.start(_doc->progress());
|
||||
if (_doc->loading() && !_radial.animating()) {
|
||||
_radial.start(_doc->progress());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -689,7 +764,18 @@ void MediaView::onForward() {
|
|||
|
||||
void MediaView::onDelete() {
|
||||
close();
|
||||
if (!_msgid) {
|
||||
auto deletingPeerPhoto = [this]() {
|
||||
if (!_msgid) return true;
|
||||
if (_photo && _history) {
|
||||
auto lastPhoto = computeLastOverviewChatPhoto();
|
||||
if (lastPhoto.photo == _photo && _history->peer->photoId == _photo->id) {
|
||||
return _firstOpenedPeerPhoto;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
};
|
||||
|
||||
if (deletingPeerPhoto()) {
|
||||
App::main()->deletePhotoLayer(_photo);
|
||||
} else if (auto item = App::histItemById(_msgmigrated ? 0 : _channel, _msgid)) {
|
||||
App::contextItem(item);
|
||||
|
@ -738,6 +824,7 @@ void MediaView::showPhoto(PhotoData *photo, HistoryItem *context) {
|
|||
_migrated = nullptr;
|
||||
}
|
||||
_additionalChatPhoto = nullptr;
|
||||
_firstOpenedPeerPhoto = false;
|
||||
_peer = 0;
|
||||
_user = 0;
|
||||
_saveMsgStarted = 0;
|
||||
|
@ -779,6 +866,7 @@ void MediaView::showPhoto(PhotoData *photo, HistoryItem *context) {
|
|||
void MediaView::showPhoto(PhotoData *photo, PeerData *context) {
|
||||
_history = _migrated = nullptr;
|
||||
_additionalChatPhoto = nullptr;
|
||||
_firstOpenedPeerPhoto = true;
|
||||
_peer = context;
|
||||
_user = context->asUser();
|
||||
_saveMsgStarted = 0;
|
||||
|
@ -822,12 +910,15 @@ void MediaView::showPhoto(PhotoData *photo, PeerData *context) {
|
|||
|
||||
auto lastChatPhoto = computeLastOverviewChatPhoto();
|
||||
if (_photo == lastChatPhoto.photo) {
|
||||
return showPhoto(_photo, lastChatPhoto.item);
|
||||
showPhoto(_photo, lastChatPhoto.item);
|
||||
_firstOpenedPeerPhoto = true;
|
||||
return;
|
||||
}
|
||||
|
||||
computeAdditionalChatPhoto(_history->peer, lastChatPhoto.photo);
|
||||
if (_additionalChatPhoto == _photo) {
|
||||
_overview = OverviewChatPhotos;
|
||||
findCurrent();
|
||||
} else {
|
||||
_additionalChatPhoto = nullptr;
|
||||
_history = _migrated = nullptr;
|
||||
|
@ -883,8 +974,11 @@ void MediaView::showDocument(DocumentData *doc, HistoryItem *context) {
|
|||
|
||||
void MediaView::displayPhoto(PhotoData *photo, HistoryItem *item) {
|
||||
stopGif();
|
||||
_doc = 0;
|
||||
_doc = nullptr;
|
||||
_photo = photo;
|
||||
_radial.stop();
|
||||
|
||||
_photoRadialRect = QRect(QPoint((width() - st::radialSize.width()) / 2, (height() - st::radialSize.height()) / 2), st::radialSize);
|
||||
|
||||
_zoom = 0;
|
||||
|
||||
|
@ -921,8 +1015,8 @@ void MediaView::displayPhoto(PhotoData *photo, HistoryItem *item) {
|
|||
} else {
|
||||
_from = _user;
|
||||
}
|
||||
updateControls();
|
||||
_photo->download();
|
||||
updateControls();
|
||||
if (isHidden()) {
|
||||
psUpdateOverlayed(this);
|
||||
show();
|
||||
|
@ -938,6 +1032,7 @@ void MediaView::displayDocument(DocumentData *doc, HistoryItem *item) { // empty
|
|||
}
|
||||
_doc = doc;
|
||||
_photo = nullptr;
|
||||
_radial.stop();
|
||||
|
||||
_current = QPixmap();
|
||||
|
||||
|
@ -1021,7 +1116,6 @@ void MediaView::displayDocument(DocumentData *doc, HistoryItem *item) { // empty
|
|||
_docNameWidth = st::mvDocNameFont->width(_docName);
|
||||
}
|
||||
|
||||
_docRadial.stop();
|
||||
// _docSize is updated in updateControls()
|
||||
|
||||
_docRect = QRect((width() - st::mvDocSize.width()) / 2, (height() - st::mvDocSize.height()) / 2, st::mvDocSize.width(), st::mvDocSize.height());
|
||||
|
@ -1143,33 +1237,30 @@ void MediaView::paintEvent(QPaintEvent *e) {
|
|||
p.drawPixmap(_x, _y, toDraw);
|
||||
}
|
||||
|
||||
uint64 ms = 0;
|
||||
if (_full < 1) {
|
||||
ms = getms();
|
||||
uint64 dt = ms - _animStarted;
|
||||
int32 cnt = int32(st::photoLoaderCnt), period = int32(st::photoLoaderPeriod), t = dt % period, delta = int32(st::photoLoaderDelta);
|
||||
|
||||
int32 x = (width() - st::mediaviewLoader.width()) / 2;
|
||||
int32 y = (height() - st::mediaviewLoader.height()) / 2;
|
||||
p.fillRect(x, y, st::mediaviewLoader.width(), st::mediaviewLoader.height(), st::photoLoaderBg->b);
|
||||
|
||||
x += (st::mediaviewLoader.width() - cnt * st::mediaviewLoaderPoint.width() - (cnt - 1) * st::mediaviewLoaderSkip) / 2;
|
||||
y += (st::mediaviewLoader.height() - st::mediaviewLoaderPoint.height()) / 2;
|
||||
QColor c(st::white->c);
|
||||
QBrush b(c);
|
||||
for (int32 i = 0; i < cnt; ++i) {
|
||||
t -= delta;
|
||||
while (t < 0) t += period;
|
||||
|
||||
float64 alpha = (t >= st::photoLoaderDuration1 + st::photoLoaderDuration2) ? 0 : ((t > st::photoLoaderDuration1 ? ((st::photoLoaderDuration1 + st::photoLoaderDuration2 - t) / st::photoLoaderDuration2) : (t / st::photoLoaderDuration1)));
|
||||
c.setAlphaF(st::photoLoaderAlphaMin + alpha * (1 - st::photoLoaderAlphaMin));
|
||||
b.setColor(c);
|
||||
p.fillRect(x + i * (st::mediaviewLoaderPoint.width() + st::mediaviewLoaderSkip), y, st::mediaviewLoaderPoint.width(), st::mediaviewLoaderPoint.height(), b);
|
||||
}
|
||||
_saveMsgUpdater.start(AnimationTimerDelta);
|
||||
bool radial = false;
|
||||
float64 radialOpacity = 0;
|
||||
if (_radial.animating()) {
|
||||
_radial.step(ms);
|
||||
radial = _radial.animating();
|
||||
radialOpacity = _radial.opacity();
|
||||
}
|
||||
if (radial) {
|
||||
QRect inner(QPoint(_photoRadialRect.x(), _photoRadialRect.y()), st::radialSize);
|
||||
p.setPen(Qt::NoPen);
|
||||
p.setBrush(st::black);
|
||||
p.setOpacity(radialOpacity * st::radialBgOpacity);
|
||||
|
||||
p.setRenderHint(QPainter::HighQualityAntialiasing);
|
||||
p.drawEllipse(inner);
|
||||
p.setRenderHint(QPainter::HighQualityAntialiasing, false);
|
||||
|
||||
p.setOpacity(1);
|
||||
QRect arc(inner.marginsRemoved(QMargins(st::radialLine, st::radialLine, st::radialLine, st::radialLine)));
|
||||
_radial.draw(p, arc, st::radialLine, st::white);
|
||||
}
|
||||
|
||||
if (_saveMsgStarted) {
|
||||
if (!ms) ms = getms();
|
||||
auto ms = getms();
|
||||
float64 dt = float64(ms) - _saveMsgStarted, hidingDt = dt - st::medviewSaveMsgShowing - st::medviewSaveMsgShown;
|
||||
if (dt < st::medviewSaveMsgShowing + st::medviewSaveMsgShown + st::medviewSaveMsgHiding) {
|
||||
if (hidingDt >= 0 && _saveMsgOpacity.to() > 0.5) {
|
||||
|
@ -1203,10 +1294,10 @@ void MediaView::paintEvent(QPaintEvent *e) {
|
|||
if (_docIconRect.intersects(r)) {
|
||||
bool radial = false;
|
||||
float64 radialOpacity = 0;
|
||||
if (_docRadial.animating()) {
|
||||
_docRadial.step(ms);
|
||||
radial = _docRadial.animating();
|
||||
radialOpacity = _docRadial.opacity();
|
||||
if (_radial.animating()) {
|
||||
_radial.step(ms);
|
||||
radial = _radial.animating();
|
||||
radialOpacity = _radial.opacity();
|
||||
}
|
||||
icon = true;
|
||||
if (!_doc || _doc->thumb->isNull()) {
|
||||
|
@ -1245,7 +1336,7 @@ void MediaView::paintEvent(QPaintEvent *e) {
|
|||
p.setOpacity(1);
|
||||
|
||||
QRect arc(inner.marginsRemoved(QMargins(st::radialLine, st::radialLine, st::radialLine, st::radialLine)));
|
||||
_docRadial.draw(p, arc, st::radialLine, st::white);
|
||||
_radial.draw(p, arc, st::radialLine, st::white);
|
||||
} else if (_doc && !_doc->loaded()) {
|
||||
p.setOpacity((o * 1. + (1 - o) * st::radialDownloadOpacity));
|
||||
p.drawSpriteCenter(_docIconRect, st::radialDownload);
|
||||
|
@ -1508,6 +1599,10 @@ bool MediaView::moveToNext(int32 delta) {
|
|||
stopGif();
|
||||
displayPhoto(lastChatPhoto.photo, lastChatPhoto.item); preloadData(delta);
|
||||
return true;
|
||||
} else if (_history && (_history->overviewCount(OverviewChatPhotos) != 0 || (
|
||||
_migrated && _migrated->overviewCount(OverviewChatPhotos) != 0))) {
|
||||
loadBack();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
|
@ -1991,6 +2086,7 @@ void MediaView::hide() {
|
|||
a_cOpacity = anim::fvalue(1, 1);
|
||||
QWidget::hide();
|
||||
stopGif();
|
||||
_radial.stop();
|
||||
|
||||
Notify::clipStopperHidden(ClipStopperMediaview);
|
||||
}
|
||||
|
@ -2069,7 +2165,12 @@ void MediaView::findCurrent() {
|
|||
}
|
||||
|
||||
void MediaView::loadBack() {
|
||||
if (_loadRequest || _index < 0 || (_overview == OverviewCount && !_user)) return;
|
||||
if (_loadRequest || (_overview == OverviewCount && !_user)) {
|
||||
return;
|
||||
}
|
||||
if (_index < 0 && (!_additionalChatPhoto || _photo != _additionalChatPhoto || !_history)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (_history && _overview != OverviewCount && (!_history->overviewLoaded(_overview) || (_migrated && !_migrated->overviewLoaded(_overview)))) {
|
||||
if (App::main()) {
|
||||
|
@ -2168,6 +2269,8 @@ void MediaView::updateHeader() {
|
|||
int32 index = _index, count = 0, addcount = (_migrated && _overview != OverviewCount) ? _migrated->overviewCount(_overview) : 0;
|
||||
if (_history) {
|
||||
if (_overview != OverviewCount) {
|
||||
bool lastOverviewPhotoLoaded = (!_history->overview[_overview].isEmpty() || (
|
||||
_migrated && _history->overviewCount(_overview) == 0 && !_migrated->overview[_overview].isEmpty()));
|
||||
count = _history->overviewCount(_overview);
|
||||
if (addcount >= 0 && count >= 0) {
|
||||
count += addcount;
|
||||
|
@ -2178,10 +2281,10 @@ void MediaView::updateHeader() {
|
|||
} else {
|
||||
index += count - _history->overview[_overview].size();
|
||||
}
|
||||
if (_additionalChatPhoto) {
|
||||
if (_additionalChatPhoto && lastOverviewPhotoLoaded) {
|
||||
++count;
|
||||
}
|
||||
} else if (index < 0 && _additionalChatPhoto && _photo == _additionalChatPhoto) {
|
||||
} else if (index < 0 && _additionalChatPhoto && _photo == _additionalChatPhoto && lastOverviewPhotoLoaded) {
|
||||
// Additional chat photo (not in the list => place it at the end of the list).
|
||||
index = count;
|
||||
++count;
|
||||
|
|
|
@ -51,10 +51,10 @@ public:
|
|||
bool moveToNext(int32 delta);
|
||||
void preloadData(int32 delta);
|
||||
|
||||
void leaveToChildEvent(QEvent *e) override { // e -- from enterEvent() of child TWidget
|
||||
void leaveToChildEvent(QEvent *e, QWidget *child) override { // e -- from enterEvent() of child TWidget
|
||||
updateOverState(OverNone);
|
||||
}
|
||||
void enterFromChildEvent(QEvent *e) override { // e -- from leaveEvent() of child TWidget
|
||||
void enterFromChildEvent(QEvent *e, QWidget *child) override { // e -- from leaveEvent() of child TWidget
|
||||
updateOver(mapFromGlobal(QCursor::pos()));
|
||||
}
|
||||
|
||||
|
@ -85,6 +85,8 @@ public slots:
|
|||
void onHideControls(bool force = false);
|
||||
void onDropdownHiding();
|
||||
|
||||
void onScreenResized(int screen);
|
||||
|
||||
void onToMessage();
|
||||
void onSaveAs();
|
||||
void onDownload();
|
||||
|
@ -111,6 +113,13 @@ private:
|
|||
void findCurrent();
|
||||
void loadBack();
|
||||
|
||||
// Radial animation interface.
|
||||
float64 radialProgress() const;
|
||||
bool radialLoading() const;
|
||||
QRect radialRect() const;
|
||||
void radialStart();
|
||||
uint64 radialTimeShift() const;
|
||||
|
||||
// Computes the last OverviewChatPhotos PhotoData* from _history or _migrated.
|
||||
struct LastChatPhoto {
|
||||
HistoryItem *item;
|
||||
|
@ -173,9 +182,11 @@ private:
|
|||
int _docNameWidth = 0, _docSizeWidth = 0, _docExtWidth = 0;
|
||||
QRect _docRect, _docIconRect;
|
||||
int _docThumbx = 0, _docThumby = 0, _docThumbw = 0;
|
||||
RadialAnimation _docRadial;
|
||||
LinkButton _docDownload, _docSaveAs, _docCancel;
|
||||
|
||||
QRect _photoRadialRect;
|
||||
RadialAnimation _radial;
|
||||
|
||||
History *_migrated = nullptr;
|
||||
History *_history = nullptr; // if conversation photos or files overview
|
||||
PeerData *_peer = nullptr;
|
||||
|
@ -185,6 +196,12 @@ private:
|
|||
// in the _history->overview[OverviewChatPhotos] (if the item was deleted).
|
||||
PhotoData *_additionalChatPhoto = nullptr;
|
||||
|
||||
// We save the information about the reason of the current mediaview show:
|
||||
// did we open a peer profile photo or a photo from some message.
|
||||
// We use it when trying to delete a photo: if we've opened a peer photo,
|
||||
// then we'll delete group photo instead of the corresponding message.
|
||||
bool _firstOpenedPeerPhoto = false;
|
||||
|
||||
PeerData *_from = nullptr;
|
||||
Text _fromName;
|
||||
|
||||
|
@ -241,7 +258,7 @@ private:
|
|||
|
||||
QString _saveMsgFilename;
|
||||
uint64 _saveMsgStarted = 0;
|
||||
anim::fvalue _saveMsgOpacity;
|
||||
anim::fvalue _saveMsgOpacity = { 0 };
|
||||
QRect _saveMsg;
|
||||
QTimer _saveMsgUpdater;
|
||||
Text _saveMsgText;
|
||||
|
|
|
@ -34,6 +34,7 @@ struct PeerUpdate {
|
|||
PeerData *peer;
|
||||
|
||||
enum class Flag {
|
||||
// Common flags
|
||||
NameChanged = 0x00000001U,
|
||||
UsernameChanged = 0x00000002U,
|
||||
PhotoChanged = 0x00000004U,
|
||||
|
@ -47,15 +48,19 @@ struct PeerUpdate {
|
|||
MembersChanged = 0x00000040U,
|
||||
AdminsChanged = 0x00000080U,
|
||||
|
||||
// For users
|
||||
UserCanShareContact = 0x00010000U,
|
||||
UserIsContact = 0x00020000U,
|
||||
UserPhoneChanged = 0x00040000U,
|
||||
UserIsBlocked = 0x00080000U,
|
||||
BotCommandsChanged = 0x00100000U,
|
||||
UserOnlineChanged = 0x00200000U,
|
||||
BotCanAddToGroups = 0x00400000U,
|
||||
|
||||
// For chats
|
||||
ChatCanEdit = 0x00010000U,
|
||||
|
||||
// For channels
|
||||
ChannelAmIn = 0x00010000U,
|
||||
ChannelAmEditor = 0x00020000U,
|
||||
ChannelCanEditPhoto = 0x00040000U,
|
||||
|
|
|
@ -609,10 +609,10 @@ void OverviewInner::onDragExec() {
|
|||
mimeData->setData(qsl("application/x-td-forward-selected"), "1");
|
||||
}
|
||||
drag->setMimeData(mimeData);
|
||||
drag->exec(Qt::CopyAction);
|
||||
|
||||
// We don't receive mouseReleaseEvent when drag is finished.
|
||||
ClickHandler::unpressed();
|
||||
drag->exec(Qt::CopyAction);
|
||||
if (App::main()) App::main()->updateAfterDrag();
|
||||
return;
|
||||
} else {
|
||||
|
@ -640,10 +640,10 @@ void OverviewInner::onDragExec() {
|
|||
}
|
||||
|
||||
drag->setMimeData(mimeData);
|
||||
drag->exec(Qt::CopyAction);
|
||||
|
||||
// We don't receive mouseReleaseEvent when drag is finished.
|
||||
ClickHandler::unpressed();
|
||||
drag->exec(Qt::CopyAction);
|
||||
if (App::main()) App::main()->updateAfterDrag();
|
||||
return;
|
||||
}
|
||||
|
|
188
Telegram/SourceFiles/platform/linux/linux_libs.cpp
Normal file
|
@ -0,0 +1,188 @@
|
|||
/*
|
||||
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_new_from_file gtk_status_icon_new_from_file = nullptr;
|
||||
f_gtk_status_icon_set_from_file gtk_status_icon_set_from_file = 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_new_from_file", gtk_status_icon_new_from_file);
|
||||
load(lib_gtk, "gtk_status_icon_set_from_file", gtk_status_icon_set_from_file);
|
||||
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
|
180
Telegram/SourceFiles/platform/linux/linux_libs.h
Normal file
|
@ -0,0 +1,180 @@
|
|||
/*
|
||||
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
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
extern "C" {
|
||||
#undef signals
|
||||
#include <libappindicator/app-indicator.h>
|
||||
#include <gtk/gtk.h>
|
||||
#define signals public
|
||||
} // extern "C"
|
||||
|
||||
#include <unity/unity/unity.h>
|
||||
|
||||
namespace Platform {
|
||||
namespace Libs {
|
||||
|
||||
void start();
|
||||
|
||||
template <typename Function>
|
||||
bool load(QLibrary &lib, const char *name, Function &func) {
|
||||
func = nullptr;
|
||||
if (!lib.isLoaded()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
func = reinterpret_cast<Function>(lib.resolve(name));
|
||||
if (func) {
|
||||
return true;
|
||||
}
|
||||
LOG(("Error: failed to load '%1' function!").arg(name));
|
||||
return false;
|
||||
}
|
||||
|
||||
typedef gboolean (*f_gtk_init_check)(int *argc, char ***argv);
|
||||
extern f_gtk_init_check gtk_init_check;
|
||||
|
||||
typedef GtkWidget* (*f_gtk_menu_new)(void);
|
||||
extern f_gtk_menu_new gtk_menu_new;
|
||||
|
||||
typedef GType (*f_gtk_menu_get_type)(void) G_GNUC_CONST;
|
||||
extern f_gtk_menu_get_type gtk_menu_get_type;
|
||||
|
||||
typedef GtkWidget* (*f_gtk_menu_item_new_with_label)(const gchar *label);
|
||||
extern f_gtk_menu_item_new_with_label gtk_menu_item_new_with_label;
|
||||
|
||||
typedef void (*f_gtk_menu_item_set_label)(GtkMenuItem *menu_item, const gchar *label);
|
||||
extern f_gtk_menu_item_set_label gtk_menu_item_set_label;
|
||||
|
||||
typedef void (*f_gtk_menu_shell_append)(GtkMenuShell *menu_shell, GtkWidget *child);
|
||||
extern f_gtk_menu_shell_append gtk_menu_shell_append;
|
||||
|
||||
typedef GType (*f_gtk_menu_shell_get_type)(void) G_GNUC_CONST;
|
||||
extern f_gtk_menu_shell_get_type gtk_menu_shell_get_type;
|
||||
|
||||
typedef void (*f_gtk_widget_show)(GtkWidget *widget);
|
||||
extern f_gtk_widget_show gtk_widget_show;
|
||||
|
||||
typedef GtkWidget* (*f_gtk_widget_get_toplevel)(GtkWidget *widget);
|
||||
extern f_gtk_widget_get_toplevel gtk_widget_get_toplevel;
|
||||
|
||||
typedef gboolean (*f_gtk_widget_get_visible)(GtkWidget *widget);
|
||||
extern f_gtk_widget_get_visible gtk_widget_get_visible;
|
||||
|
||||
typedef void (*f_gtk_widget_set_sensitive)(GtkWidget *widget, gboolean sensitive);
|
||||
extern f_gtk_widget_set_sensitive gtk_widget_set_sensitive;
|
||||
|
||||
typedef GTypeInstance* (*f_g_type_check_instance_cast)(GTypeInstance *instance, GType iface_type);
|
||||
extern f_g_type_check_instance_cast g_type_check_instance_cast;
|
||||
|
||||
template <typename Result, typename Object>
|
||||
inline Result *g_type_cic_helper(Object *instance, GType iface_type) {
|
||||
return reinterpret_cast<Result*>(g_type_check_instance_cast(reinterpret_cast<GTypeInstance*>(instance), iface_type));
|
||||
}
|
||||
template <typename Object>
|
||||
inline GtkMenu *gtk_menu_cast(Object *obj) {
|
||||
return g_type_cic_helper<GtkMenu, Object>(obj, gtk_menu_get_type());
|
||||
}
|
||||
template <typename Object>
|
||||
inline GtkMenuShell *gtk_menu_shell_cast(Object *obj) {
|
||||
return g_type_cic_helper<GtkMenuShell, Object>(obj, gtk_menu_get_type());
|
||||
}
|
||||
|
||||
typedef gulong (*f_g_signal_connect_data)(gpointer instance, const gchar *detailed_signal, GCallback c_handler, gpointer data, GClosureNotify destroy_data, GConnectFlags connect_flags);
|
||||
extern f_g_signal_connect_data g_signal_connect_data;
|
||||
inline gulong g_signal_connect_helper(gpointer instance, const gchar *detailed_signal, GCallback c_handler, gpointer data) {
|
||||
return 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);
|
||||
extern f_app_indicator_new app_indicator_new;
|
||||
|
||||
typedef void (*f_app_indicator_set_status)(AppIndicator *self, AppIndicatorStatus status);
|
||||
extern f_app_indicator_set_status app_indicator_set_status;
|
||||
|
||||
typedef void (*f_app_indicator_set_menu)(AppIndicator *self, GtkMenu *menu);
|
||||
extern f_app_indicator_set_menu app_indicator_set_menu;
|
||||
|
||||
typedef void (*f_app_indicator_set_icon_full)(AppIndicator *self, const gchar *icon_name, const gchar *icon_desc);
|
||||
extern f_app_indicator_set_icon_full app_indicator_set_icon_full;
|
||||
|
||||
typedef gboolean (*f_gdk_init_check)(gint *argc, gchar ***argv);
|
||||
extern f_gdk_init_check gdk_init_check;
|
||||
|
||||
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);
|
||||
extern f_gdk_pixbuf_new_from_data gdk_pixbuf_new_from_data;
|
||||
|
||||
typedef GtkStatusIcon* (*f_gtk_status_icon_new_from_pixbuf)(GdkPixbuf *pixbuf);
|
||||
extern f_gtk_status_icon_new_from_pixbuf gtk_status_icon_new_from_pixbuf;
|
||||
|
||||
typedef void (*f_gtk_status_icon_set_from_pixbuf)(GtkStatusIcon *status_icon, GdkPixbuf *pixbuf);
|
||||
extern f_gtk_status_icon_set_from_pixbuf gtk_status_icon_set_from_pixbuf;
|
||||
|
||||
typedef GtkStatusIcon* (*f_gtk_status_icon_new_from_file)(const gchar *filename);
|
||||
extern f_gtk_status_icon_new_from_file gtk_status_icon_new_from_file;
|
||||
|
||||
typedef void (*f_gtk_status_icon_set_from_file)(GtkStatusIcon *status_icon, const gchar *filename);
|
||||
extern f_gtk_status_icon_set_from_file gtk_status_icon_set_from_file;
|
||||
|
||||
typedef void (*f_gtk_status_icon_set_title)(GtkStatusIcon *status_icon, const gchar *title);
|
||||
extern f_gtk_status_icon_set_title gtk_status_icon_set_title;
|
||||
|
||||
typedef void (*f_gtk_status_icon_set_tooltip_text)(GtkStatusIcon *status_icon, const gchar *title);
|
||||
extern f_gtk_status_icon_set_tooltip_text gtk_status_icon_set_tooltip_text;
|
||||
|
||||
typedef void (*f_gtk_status_icon_set_visible)(GtkStatusIcon *status_icon, gboolean visible);
|
||||
extern f_gtk_status_icon_set_visible gtk_status_icon_set_visible;
|
||||
|
||||
typedef gboolean (*f_gtk_status_icon_is_embedded)(GtkStatusIcon *status_icon);
|
||||
extern f_gtk_status_icon_is_embedded gtk_status_icon_is_embedded;
|
||||
|
||||
typedef gboolean (*f_gtk_status_icon_get_geometry)(GtkStatusIcon *status_icon, GdkScreen **screen, GdkRectangle *area, GtkOrientation *orientation);
|
||||
extern f_gtk_status_icon_get_geometry gtk_status_icon_get_geometry;
|
||||
|
||||
typedef void (*f_gtk_status_icon_position_menu)(GtkMenu *menu, gint *x, gint *y, gboolean *push_in, gpointer user_data);
|
||||
extern f_gtk_status_icon_position_menu gtk_status_icon_position_menu;
|
||||
|
||||
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);
|
||||
extern f_gtk_menu_popup gtk_menu_popup;
|
||||
|
||||
typedef guint32 (*f_gtk_get_current_event_time)(void);
|
||||
extern f_gtk_get_current_event_time gtk_get_current_event_time;
|
||||
|
||||
typedef gpointer (*f_g_object_ref_sink)(gpointer object);
|
||||
extern f_g_object_ref_sink g_object_ref_sink;
|
||||
|
||||
typedef void (*f_g_object_unref)(gpointer object);
|
||||
extern f_g_object_unref g_object_unref;
|
||||
|
||||
typedef guint (*f_g_idle_add)(GSourceFunc function, gpointer data);
|
||||
extern f_g_idle_add g_idle_add;
|
||||
|
||||
typedef void (*f_unity_launcher_entry_set_count)(UnityLauncherEntry* self, gint64 value);
|
||||
extern f_unity_launcher_entry_set_count unity_launcher_entry_set_count;
|
||||
|
||||
typedef void (*f_unity_launcher_entry_set_count_visible)(UnityLauncherEntry* self, gboolean value);
|
||||
extern f_unity_launcher_entry_set_count_visible unity_launcher_entry_set_count_visible;
|
||||
|
||||
typedef UnityLauncherEntry* (*f_unity_launcher_entry_get_for_desktop_id)(const gchar* desktop_id);
|
||||
extern f_unity_launcher_entry_get_for_desktop_id unity_launcher_entry_get_for_desktop_id;
|
||||
|
||||
} // namespace Libs
|
||||
} // namespace Platform
|
686
Telegram/SourceFiles/platform/linux/main_window_linux.cpp
Normal file
|
@ -0,0 +1,686 @@
|
|||
/*
|
||||
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/main_window_linux.h"
|
||||
|
||||
#include "platform/linux/linux_libs.h"
|
||||
#include "mainwindow.h"
|
||||
#include "application.h"
|
||||
#include "lang.h"
|
||||
#include "localstorage.h"
|
||||
|
||||
namespace Platform {
|
||||
namespace {
|
||||
|
||||
bool noQtTrayIcon = 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;
|
||||
|
||||
void _trayIconPopup(GtkStatusIcon *status_icon, guint button, guint32 activate_time, gpointer popup_menu) {
|
||||
Libs::gtk_menu_popup(Libs::gtk_menu_cast(popup_menu), NULL, NULL, Libs::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()) {
|
||||
Libs::gtk_menu_popup(Libs::gtk_menu_cast(popup_menu), NULL, NULL, Libs::gtk_status_icon_position_menu, status_icon, 0, Libs::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) Libs::g_object_unref(_trayPixbuf);
|
||||
_trayPixbuf = Libs::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 (Libs::gtk_status_icon_is_embedded(_trayIcon)) {
|
||||
trayIconChecked = true;
|
||||
cSetSupportTray(true);
|
||||
if (App::wnd()) {
|
||||
App::wnd()->psUpdateWorkmode();
|
||||
App::wnd()->psUpdateCounter();
|
||||
App::wnd()->updateTrayMenu();
|
||||
}
|
||||
}
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
UnityLauncherEntry *_psUnityLauncherEntry = nullptr;
|
||||
|
||||
} // namespace
|
||||
|
||||
MainWindow::MainWindow()
|
||||
: icon256(qsl(":/gui/art/icon256.png"))
|
||||
, iconbig256(icon256)
|
||||
, wndIcon(QIcon::fromTheme("telegram", QIcon(QPixmap::fromImage(icon256, Qt::ColorOnly)))) {
|
||||
connect(&_psCheckStatusIconTimer, SIGNAL(timeout()), this, SLOT(psStatusIconCheck()));
|
||||
_psCheckStatusIconTimer.setSingleShot(false);
|
||||
|
||||
connect(&_psUpdateIndicatorTimer, SIGNAL(timeout()), this, SLOT(psUpdateIndicator()));
|
||||
_psUpdateIndicatorTimer.setSingleShot(true);
|
||||
}
|
||||
|
||||
bool MainWindow::psHasTrayIcon() const {
|
||||
return trayIcon || ((useAppIndicator || (useStatusIcon && trayIconChecked)) && (cWorkMode() != dbiwmWindowOnly));
|
||||
}
|
||||
|
||||
void MainWindow::psStatusIconCheck() {
|
||||
_trayIconCheck(0);
|
||||
if (cSupportTray() || !--_psCheckStatusIconLeft) {
|
||||
_psCheckStatusIconTimer.stop();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
void MainWindow::psShowTrayMenu() {
|
||||
}
|
||||
|
||||
void MainWindow::psRefreshTaskbarIcon() {
|
||||
}
|
||||
|
||||
void MainWindow::psTrayMenuUpdated() {
|
||||
if (noQtTrayIcon && (useAppIndicator || useStatusIcon)) {
|
||||
const QList<QAction*> &actions = trayIconMenu->actions();
|
||||
if (_trayItems.isEmpty()) {
|
||||
DEBUG_LOG(("Creating tray menu!"));
|
||||
for (int32 i = 0, l = actions.size(); i != l; ++i) {
|
||||
GtkWidget *item = Libs::gtk_menu_item_new_with_label(actions.at(i)->text().toUtf8());
|
||||
Libs::gtk_menu_shell_append(Libs::gtk_menu_shell_cast(_trayMenu), item);
|
||||
Libs::g_signal_connect_helper(item, "activate", G_CALLBACK(_trayMenuCallback), this);
|
||||
Libs::gtk_widget_show(item);
|
||||
Libs::gtk_widget_set_sensitive(item, actions.at(i)->isEnabled());
|
||||
|
||||
_trayItems.push_back(qMakePair(item, actions.at(i)));
|
||||
}
|
||||
} else {
|
||||
DEBUG_LOG(("Updating tray menu!"));
|
||||
for (int32 i = 0, l = actions.size(); i != l; ++i) {
|
||||
if (i < _trayItems.size()) {
|
||||
Libs::gtk_menu_item_set_label(reinterpret_cast<GtkMenuItem*>(_trayItems.at(i).first), actions.at(i)->text().toUtf8());
|
||||
Libs::gtk_widget_set_sensitive(_trayItems.at(i).first, actions.at(i)->isEnabled());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void MainWindow::psSetupTrayIcon() {
|
||||
if (noQtTrayIcon) {
|
||||
if (!cSupportTray()) return;
|
||||
psUpdateCounter();
|
||||
} else {
|
||||
if (!trayIcon) {
|
||||
trayIcon = new QSystemTrayIcon(this);
|
||||
|
||||
QIcon icon;
|
||||
QFileInfo iconFile(_trayIconImageFile());
|
||||
if (iconFile.exists()) {
|
||||
QByteArray path = QFile::encodeName(iconFile.absoluteFilePath());
|
||||
icon = QIcon(path.constData());
|
||||
} else {
|
||||
icon = QIcon(QPixmap::fromImage(App::wnd()->iconLarge(), Qt::ColorOnly));
|
||||
}
|
||||
trayIcon->setIcon(icon);
|
||||
|
||||
trayIcon->setToolTip(str_const_toString(AppName));
|
||||
connect(trayIcon, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), this, SLOT(toggleTray(QSystemTrayIcon::ActivationReason)), Qt::UniqueConnection);
|
||||
connect(trayIcon, SIGNAL(messageClicked()), this, SLOT(showFromTray()));
|
||||
App::wnd()->updateTrayMenu();
|
||||
}
|
||||
psUpdateCounter();
|
||||
|
||||
trayIcon->show();
|
||||
psUpdateDelegate();
|
||||
}
|
||||
}
|
||||
|
||||
void MainWindow::psUpdateWorkmode() {
|
||||
if (!cSupportTray()) return;
|
||||
|
||||
if (cWorkMode() == dbiwmWindowOnly) {
|
||||
if (noQtTrayIcon) {
|
||||
if (useAppIndicator) {
|
||||
Libs::app_indicator_set_status(_trayIndicator, APP_INDICATOR_STATUS_PASSIVE);
|
||||
} else if (useStatusIcon) {
|
||||
Libs::gtk_status_icon_set_visible(_trayIcon, false);
|
||||
}
|
||||
} else {
|
||||
if (trayIcon) {
|
||||
trayIcon->setContextMenu(0);
|
||||
trayIcon->deleteLater();
|
||||
}
|
||||
trayIcon = 0;
|
||||
}
|
||||
} else {
|
||||
if (noQtTrayIcon) {
|
||||
if (useAppIndicator) {
|
||||
Libs::app_indicator_set_status(_trayIndicator, APP_INDICATOR_STATUS_ACTIVE);
|
||||
} else if (useStatusIcon) {
|
||||
Libs::gtk_status_icon_set_visible(_trayIcon, true);
|
||||
}
|
||||
} else {
|
||||
psSetupTrayIcon();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void MainWindow::psUpdateIndicator() {
|
||||
_psUpdateIndicatorTimer.stop();
|
||||
_psLastIndicatorUpdate = getms();
|
||||
QFileInfo iconFile(_trayIconImageFile());
|
||||
if (iconFile.exists()) {
|
||||
QByteArray path = QFile::encodeName(iconFile.absoluteFilePath()), name = QFile::encodeName(iconFile.fileName());
|
||||
name = name.mid(0, name.size() - 4);
|
||||
Libs::app_indicator_set_icon_full(_trayIndicator, path.constData(), name);
|
||||
} else {
|
||||
useAppIndicator = false;
|
||||
}
|
||||
}
|
||||
|
||||
void MainWindow::psUpdateCounter() {
|
||||
setWindowIcon(wndIcon);
|
||||
|
||||
int32 counter = App::histories().unreadBadge();
|
||||
|
||||
setWindowTitle((counter > 0) ? qsl("Telegram (%1)").arg(counter) : qsl("Telegram"));
|
||||
if (_psUnityLauncherEntry) {
|
||||
if (counter > 0) {
|
||||
Libs::unity_launcher_entry_set_count(_psUnityLauncherEntry, (counter > 9999) ? 9999 : counter);
|
||||
Libs::unity_launcher_entry_set_count_visible(_psUnityLauncherEntry, TRUE);
|
||||
} else {
|
||||
Libs::unity_launcher_entry_set_count_visible(_psUnityLauncherEntry, FALSE);
|
||||
}
|
||||
}
|
||||
|
||||
if (noQtTrayIcon) {
|
||||
if (useAppIndicator) {
|
||||
if (getms() > _psLastIndicatorUpdate + 1000) {
|
||||
psUpdateIndicator();
|
||||
} else if (!_psUpdateIndicatorTimer.isActive()) {
|
||||
_psUpdateIndicatorTimer.start(100);
|
||||
}
|
||||
} else if (useStatusIcon && trayIconChecked) {
|
||||
QFileInfo iconFile(_trayIconImageFile());
|
||||
if (iconFile.exists()) {
|
||||
QByteArray path = QFile::encodeName(iconFile.absoluteFilePath());
|
||||
Libs::gtk_status_icon_set_from_file(_trayIcon, path.constData());
|
||||
} else {
|
||||
loadPixbuf(_trayIconImageGen());
|
||||
Libs::gtk_status_icon_set_from_pixbuf(_trayIcon, _trayPixbuf);
|
||||
}
|
||||
}
|
||||
} else if (trayIcon) {
|
||||
QIcon icon;
|
||||
QFileInfo iconFile(_trayIconImageFile());
|
||||
if (iconFile.exists()) {
|
||||
QByteArray path = QFile::encodeName(iconFile.absoluteFilePath());
|
||||
icon = QIcon(path.constData());
|
||||
} else {
|
||||
int32 counter = App::histories().unreadBadge();
|
||||
bool muted = App::histories().unreadOnlyMuted();
|
||||
|
||||
style::color bg = muted ? st::counterMuteBG : st::counterBG;
|
||||
icon.addPixmap(QPixmap::fromImage(iconWithCounter(16, counter, bg, true), Qt::ColorOnly));
|
||||
icon.addPixmap(QPixmap::fromImage(iconWithCounter(32, counter, bg, true), Qt::ColorOnly));
|
||||
}
|
||||
trayIcon->setIcon(icon);
|
||||
}
|
||||
}
|
||||
|
||||
void MainWindow::LibsLoaded() {
|
||||
QString cdesktop = QString(getenv("XDG_CURRENT_DESKTOP")).toLower();
|
||||
noQtTrayIcon = (cdesktop == qstr("pantheon")) || (cdesktop == qstr("gnome"));
|
||||
tryAppIndicator = (cdesktop == qstr("xfce"));
|
||||
|
||||
if (noQtTrayIcon) cSetSupportTray(false);
|
||||
|
||||
useGtkBase = (Libs::gtk_init_check != nullptr)
|
||||
&& (Libs::gtk_menu_new != nullptr)
|
||||
&& (Libs::gtk_menu_get_type != nullptr)
|
||||
&& (Libs::gtk_menu_item_new_with_label != nullptr)
|
||||
&& (Libs::gtk_menu_item_set_label != nullptr)
|
||||
&& (Libs::gtk_menu_shell_append != nullptr)
|
||||
&& (Libs::gtk_menu_shell_get_type != nullptr)
|
||||
&& (Libs::gtk_widget_show != nullptr)
|
||||
&& (Libs::gtk_widget_get_toplevel != nullptr)
|
||||
&& (Libs::gtk_widget_get_visible != nullptr)
|
||||
&& (Libs::gtk_widget_set_sensitive != nullptr)
|
||||
&& (Libs::g_type_check_instance_cast != nullptr)
|
||||
&& (Libs::g_signal_connect_data != nullptr)
|
||||
&& (Libs::g_object_ref_sink != nullptr)
|
||||
&& (Libs::g_object_unref != nullptr);
|
||||
|
||||
useAppIndicator = useGtkBase
|
||||
&& (Libs::app_indicator_new != nullptr)
|
||||
&& (Libs::app_indicator_set_status != nullptr)
|
||||
&& (Libs::app_indicator_set_menu != nullptr)
|
||||
&& (Libs::app_indicator_set_icon_full != nullptr);
|
||||
|
||||
if (tryAppIndicator && useGtkBase && useAppIndicator) {
|
||||
noQtTrayIcon = true;
|
||||
cSetSupportTray(false);
|
||||
}
|
||||
|
||||
useStatusIcon = (Libs::gdk_init_check != nullptr)
|
||||
&& (Libs::gdk_pixbuf_new_from_data != nullptr)
|
||||
&& (Libs::gtk_status_icon_new_from_pixbuf != nullptr)
|
||||
&& (Libs::gtk_status_icon_set_from_pixbuf != nullptr)
|
||||
&& (Libs::gtk_status_icon_new_from_file != nullptr)
|
||||
&& (Libs::gtk_status_icon_set_from_file != nullptr)
|
||||
&& (Libs::gtk_status_icon_set_title != nullptr)
|
||||
&& (Libs::gtk_status_icon_set_tooltip_text != nullptr)
|
||||
&& (Libs::gtk_status_icon_set_visible != nullptr)
|
||||
&& (Libs::gtk_status_icon_is_embedded != nullptr)
|
||||
&& (Libs::gtk_status_icon_get_geometry != nullptr)
|
||||
&& (Libs::gtk_status_icon_position_menu != nullptr)
|
||||
&& (Libs::gtk_menu_popup != nullptr)
|
||||
&& (Libs::gtk_get_current_event_time != nullptr)
|
||||
&& (Libs::g_idle_add != nullptr);
|
||||
if (useStatusIcon) {
|
||||
DEBUG_LOG(("Status icon api loaded!"));
|
||||
}
|
||||
|
||||
useUnityCount = (Libs::unity_launcher_entry_get_for_desktop_id != nullptr)
|
||||
&& (Libs::unity_launcher_entry_set_count != nullptr)
|
||||
&& (Libs::unity_launcher_entry_set_count_visible != nullptr);
|
||||
if (useUnityCount) {
|
||||
DEBUG_LOG(("Unity count api loaded!"));
|
||||
}
|
||||
}
|
||||
|
||||
void MainWindow::psUpdateDelegate() {
|
||||
}
|
||||
|
||||
void MainWindow::psInitSize() {
|
||||
setMinimumWidth(st::wndMinWidth);
|
||||
setMinimumHeight(st::wndMinHeight);
|
||||
|
||||
TWindowPos pos(cWindowPos());
|
||||
QRect avail(QDesktopWidget().availableGeometry());
|
||||
bool maximized = false;
|
||||
QRect geom(avail.x() + (avail.width() - st::wndDefWidth) / 2, avail.y() + (avail.height() - st::wndDefHeight) / 2, st::wndDefWidth, st::wndDefHeight);
|
||||
if (pos.w && pos.h) {
|
||||
QList<QScreen*> screens = Application::screens();
|
||||
for (QList<QScreen*>::const_iterator i = screens.cbegin(), e = screens.cend(); i != e; ++i) {
|
||||
QByteArray name = (*i)->name().toUtf8();
|
||||
if (pos.moncrc == hashCrc32(name.constData(), name.size())) {
|
||||
QRect screen((*i)->geometry());
|
||||
int32 w = screen.width(), h = screen.height();
|
||||
if (w >= st::wndMinWidth && h >= st::wndMinHeight) {
|
||||
if (pos.w > w) pos.w = w;
|
||||
if (pos.h > h) pos.h = h;
|
||||
pos.x += screen.x();
|
||||
pos.y += screen.y();
|
||||
if (pos.x < screen.x() + screen.width() - 10 && pos.y < screen.y() + screen.height() - 10) {
|
||||
geom = QRect(pos.x, pos.y, pos.w, pos.h);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (pos.y < 0) pos.y = 0;
|
||||
maximized = pos.maximized;
|
||||
}
|
||||
setGeometry(geom);
|
||||
}
|
||||
|
||||
void MainWindow::psInitFrameless() {
|
||||
psUpdatedPositionTimer.setSingleShot(true);
|
||||
connect(&psUpdatedPositionTimer, SIGNAL(timeout()), this, SLOT(psSavePosition()));
|
||||
}
|
||||
|
||||
void MainWindow::psSavePosition(Qt::WindowState state) {
|
||||
if (state == Qt::WindowActive) state = windowHandle()->windowState();
|
||||
if (state == Qt::WindowMinimized || !posInited) return;
|
||||
|
||||
TWindowPos pos(cWindowPos()), curPos = pos;
|
||||
|
||||
if (state == Qt::WindowMaximized) {
|
||||
curPos.maximized = 1;
|
||||
} else {
|
||||
QRect r(geometry());
|
||||
curPos.x = r.x();
|
||||
curPos.y = r.y();
|
||||
curPos.w = r.width();
|
||||
curPos.h = r.height();
|
||||
curPos.maximized = 0;
|
||||
}
|
||||
|
||||
int px = curPos.x + curPos.w / 2, py = curPos.y + curPos.h / 2, d = 0;
|
||||
QScreen *chosen = 0;
|
||||
QList<QScreen*> screens = Application::screens();
|
||||
for (QList<QScreen*>::const_iterator i = screens.cbegin(), e = screens.cend(); i != e; ++i) {
|
||||
int dx = (*i)->geometry().x() + (*i)->geometry().width() / 2 - px; if (dx < 0) dx = -dx;
|
||||
int dy = (*i)->geometry().y() + (*i)->geometry().height() / 2 - py; if (dy < 0) dy = -dy;
|
||||
if (!chosen || dx + dy < d) {
|
||||
d = dx + dy;
|
||||
chosen = *i;
|
||||
}
|
||||
}
|
||||
if (chosen) {
|
||||
curPos.x -= chosen->geometry().x();
|
||||
curPos.y -= chosen->geometry().y();
|
||||
QByteArray name = chosen->name().toUtf8();
|
||||
curPos.moncrc = hashCrc32(name.constData(), name.size());
|
||||
}
|
||||
|
||||
if (curPos.w >= st::wndMinWidth && curPos.h >= st::wndMinHeight) {
|
||||
if (curPos.x != pos.x || curPos.y != pos.y || curPos.w != pos.w || curPos.h != pos.h || curPos.moncrc != pos.moncrc || curPos.maximized != pos.maximized) {
|
||||
cSetWindowPos(curPos);
|
||||
Local::writeSettings();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void MainWindow::psUpdatedPosition() {
|
||||
psUpdatedPositionTimer.start(SaveWindowPositionTimeout);
|
||||
}
|
||||
|
||||
void MainWindow::psCreateTrayIcon() {
|
||||
if (!noQtTrayIcon) {
|
||||
cSetSupportTray(QSystemTrayIcon::isSystemTrayAvailable());
|
||||
return;
|
||||
}
|
||||
|
||||
if (useAppIndicator) {
|
||||
DEBUG_LOG(("Trying to create AppIndicator"));
|
||||
_trayMenu = Libs::gtk_menu_new();
|
||||
if (_trayMenu) {
|
||||
DEBUG_LOG(("Created gtk menu for appindicator!"));
|
||||
QFileInfo iconFile(_trayIconImageFile());
|
||||
if (iconFile.exists()) {
|
||||
QByteArray path = QFile::encodeName(iconFile.absoluteFilePath());
|
||||
_trayIndicator = Libs::app_indicator_new("Telegram Desktop", path.constData(), APP_INDICATOR_CATEGORY_APPLICATION_STATUS);
|
||||
if (_trayIndicator) {
|
||||
DEBUG_LOG(("Created appindicator!"));
|
||||
} else {
|
||||
DEBUG_LOG(("Failed to app_indicator_new()!"));
|
||||
}
|
||||
} else {
|
||||
useAppIndicator = false;
|
||||
DEBUG_LOG(("Failed to create image file!"));
|
||||
}
|
||||
} else {
|
||||
DEBUG_LOG(("Failed to gtk_menu_new()!"));
|
||||
}
|
||||
if (_trayMenu && _trayIndicator) {
|
||||
Libs::app_indicator_set_status(_trayIndicator, APP_INDICATOR_STATUS_ACTIVE);
|
||||
Libs::app_indicator_set_menu(_trayIndicator, Libs::gtk_menu_cast(_trayMenu));
|
||||
useStatusIcon = false;
|
||||
} else {
|
||||
DEBUG_LOG(("AppIndicator failed!"));
|
||||
useAppIndicator = false;
|
||||
}
|
||||
}
|
||||
if (useStatusIcon) {
|
||||
if (Libs::gdk_init_check(0, 0)) {
|
||||
if (!_trayMenu) _trayMenu = Libs::gtk_menu_new();
|
||||
if (_trayMenu) {
|
||||
QFileInfo iconFile(_trayIconImageFile());
|
||||
if (iconFile.exists()) {
|
||||
QByteArray path = QFile::encodeName(iconFile.absoluteFilePath());
|
||||
_trayIcon = Libs::gtk_status_icon_new_from_file(path.constData());
|
||||
} else {
|
||||
loadPixbuf(_trayIconImageGen());
|
||||
_trayIcon = Libs::gtk_status_icon_new_from_pixbuf(_trayPixbuf);
|
||||
}
|
||||
if (_trayIcon) {
|
||||
Libs::g_signal_connect_helper(_trayIcon, "popup-menu", GCallback(_trayIconPopup), _trayMenu);
|
||||
Libs::g_signal_connect_helper(_trayIcon, "activate", GCallback(_trayIconActivate), _trayMenu);
|
||||
Libs::g_signal_connect_helper(_trayIcon, "size-changed", GCallback(_trayIconResized), _trayMenu);
|
||||
|
||||
Libs::gtk_status_icon_set_title(_trayIcon, "Telegram Desktop");
|
||||
Libs::gtk_status_icon_set_tooltip_text(_trayIcon, "Telegram Desktop");
|
||||
Libs::gtk_status_icon_set_visible(_trayIcon, true);
|
||||
} else {
|
||||
useStatusIcon = false;
|
||||
}
|
||||
} else {
|
||||
useStatusIcon = false;
|
||||
}
|
||||
} else {
|
||||
useStatusIcon = false;
|
||||
}
|
||||
}
|
||||
if (!useStatusIcon && !useAppIndicator) {
|
||||
if (_trayMenu) {
|
||||
Libs::g_object_ref_sink(_trayMenu);
|
||||
Libs::g_object_unref(_trayMenu);
|
||||
_trayMenu = 0;
|
||||
}
|
||||
}
|
||||
cSetSupportTray(useAppIndicator);
|
||||
if (useStatusIcon) {
|
||||
Libs::g_idle_add((GSourceFunc)_trayIconCheck, 0);
|
||||
_psCheckStatusIconTimer.start(100);
|
||||
} else {
|
||||
psUpdateWorkmode();
|
||||
}
|
||||
}
|
||||
|
||||
void MainWindow::psFirstShow() {
|
||||
psCreateTrayIcon();
|
||||
|
||||
if (useUnityCount) {
|
||||
_psUnityLauncherEntry = Libs::unity_launcher_entry_get_for_desktop_id("telegramdesktop.desktop");
|
||||
if (_psUnityLauncherEntry) {
|
||||
LOG(("Found Unity Launcher entry telegramdesktop.desktop!"));
|
||||
} else {
|
||||
_psUnityLauncherEntry = Libs::unity_launcher_entry_get_for_desktop_id("Telegram.desktop");
|
||||
if (_psUnityLauncherEntry) {
|
||||
LOG(("Found Unity Launcher entry Telegram.desktop!"));
|
||||
} else {
|
||||
LOG(("Could not get Unity Launcher entry!"));
|
||||
}
|
||||
}
|
||||
} else {
|
||||
LOG(("Not using Unity Launcher count."));
|
||||
}
|
||||
|
||||
psUpdateMargins();
|
||||
|
||||
bool showShadows = true;
|
||||
|
||||
show();
|
||||
//_private.enableShadow(winId());
|
||||
if (cWindowPos().maximized) {
|
||||
setWindowState(Qt::WindowMaximized);
|
||||
}
|
||||
|
||||
if ((cLaunchMode() == LaunchModeAutoStart && cStartMinimized()) || cStartInTray()) {
|
||||
setWindowState(Qt::WindowMinimized);
|
||||
if (cWorkMode() == dbiwmTrayOnly || cWorkMode() == dbiwmWindowAndTray) {
|
||||
hide();
|
||||
} else {
|
||||
show();
|
||||
}
|
||||
showShadows = false;
|
||||
} else {
|
||||
show();
|
||||
}
|
||||
|
||||
posInited = true;
|
||||
}
|
||||
|
||||
bool MainWindow::psHandleTitle() {
|
||||
return false;
|
||||
}
|
||||
|
||||
void MainWindow::psInitSysMenu() {
|
||||
}
|
||||
|
||||
void MainWindow::psUpdateSysMenu(Qt::WindowState state) {
|
||||
}
|
||||
|
||||
void MainWindow::psUpdateMargins() {
|
||||
}
|
||||
|
||||
void MainWindow::psFlash() {
|
||||
}
|
||||
|
||||
void MainWindow::psActivateNotify(NotifyWindow *w) {
|
||||
}
|
||||
|
||||
void MainWindow::psClearNotifies(PeerId peerId) {
|
||||
}
|
||||
|
||||
void MainWindow::psNotifyShown(NotifyWindow *w) {
|
||||
}
|
||||
|
||||
void MainWindow::psPlatformNotify(HistoryItem *item, int32 fwdCount) {
|
||||
}
|
||||
|
||||
MainWindow::~MainWindow() {
|
||||
if (_trayIcon) {
|
||||
Libs::g_object_unref(_trayIcon);
|
||||
_trayIcon = nullptr;
|
||||
}
|
||||
if (_trayPixbuf) {
|
||||
Libs::g_object_unref(_trayPixbuf);
|
||||
_trayPixbuf = nullptr;
|
||||
}
|
||||
if (_trayMenu) {
|
||||
Libs::g_object_ref_sink(_trayMenu);
|
||||
Libs::g_object_unref(_trayMenu);
|
||||
_trayMenu = nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace Platform
|
112
Telegram/SourceFiles/platform/linux/main_window_linux.h
Normal file
|
@ -0,0 +1,112 @@
|
|||
/*
|
||||
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
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
#include "window/main_window.h"
|
||||
|
||||
class NotifyWindow;
|
||||
|
||||
namespace Platform {
|
||||
|
||||
class MainWindow : public Window::MainWindow {
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
MainWindow();
|
||||
|
||||
int32 psResizeRowWidth() const {
|
||||
return 0;//st::wndResizeAreaWidth;
|
||||
}
|
||||
|
||||
void psInitFrameless();
|
||||
void psInitSize();
|
||||
|
||||
void psFirstShow();
|
||||
void psInitSysMenu();
|
||||
void psUpdateSysMenu(Qt::WindowState state);
|
||||
void psUpdateMargins();
|
||||
void psUpdatedPosition();
|
||||
|
||||
bool psHandleTitle();
|
||||
|
||||
void psFlash();
|
||||
void psNotifySettingGot();
|
||||
|
||||
void psUpdateWorkmode();
|
||||
|
||||
void psRefreshTaskbarIcon();
|
||||
|
||||
bool psPosInited() const {
|
||||
return posInited;
|
||||
}
|
||||
|
||||
void psActivateNotify(NotifyWindow *w);
|
||||
void psClearNotifies(PeerId peerId = 0);
|
||||
void psNotifyShown(NotifyWindow *w);
|
||||
void psPlatformNotify(HistoryItem *item, int32 fwdCount);
|
||||
|
||||
void psUpdateCounter();
|
||||
|
||||
bool psHasNativeNotifications() {
|
||||
return false;
|
||||
}
|
||||
|
||||
virtual QImage iconWithCounter(int size, int count, style::color bg, bool smallIcon) = 0;
|
||||
|
||||
static void LibsLoaded();
|
||||
|
||||
~MainWindow();
|
||||
|
||||
public slots:
|
||||
|
||||
void psUpdateDelegate();
|
||||
void psSavePosition(Qt::WindowState state = Qt::WindowActive);
|
||||
void psShowTrayMenu();
|
||||
|
||||
void psStatusIconCheck();
|
||||
void psUpdateIndicator();
|
||||
|
||||
protected:
|
||||
|
||||
bool psHasTrayIcon() const;
|
||||
|
||||
bool posInited = false;
|
||||
QSystemTrayIcon *trayIcon = nullptr;
|
||||
QMenu *trayIconMenu = nullptr;
|
||||
QImage icon256, iconbig256;
|
||||
QIcon wndIcon;
|
||||
|
||||
void psTrayMenuUpdated();
|
||||
void psSetupTrayIcon();
|
||||
|
||||
QTimer psUpdatedPositionTimer;
|
||||
|
||||
private:
|
||||
void psCreateTrayIcon();
|
||||
|
||||
QTimer _psCheckStatusIconTimer;
|
||||
int _psCheckStatusIconLeft = 100;
|
||||
|
||||
QTimer _psUpdateIndicatorTimer;
|
||||
uint64 _psLastIndicatorUpdate = 0;
|
||||
};
|
||||
|
||||
} // namespace Platform
|
157
Telegram/SourceFiles/platform/mac/main_window_mac.h
Normal file
|
@ -0,0 +1,157 @@
|
|||
/*
|
||||
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
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
#include "window/main_window.h"
|
||||
#include "pspecific_mac_p.h"
|
||||
|
||||
class NotifyWindow;
|
||||
|
||||
namespace Platform {
|
||||
|
||||
class MacPrivate : public PsMacWindowPrivate {
|
||||
public:
|
||||
|
||||
void activeSpaceChanged();
|
||||
void darkModeChanged();
|
||||
void notifyClicked(unsigned long long peer, int msgid);
|
||||
void notifyReplied(unsigned long long peer, int msgid, const char *str);
|
||||
|
||||
};
|
||||
|
||||
class MainWindow : public Window::MainWindow {
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
MainWindow();
|
||||
|
||||
int32 psResizeRowWidth() const {
|
||||
return 0;//st::wndResizeAreaWidth;
|
||||
}
|
||||
|
||||
void psInitFrameless();
|
||||
void psInitSize();
|
||||
|
||||
void psFirstShow();
|
||||
void psInitSysMenu();
|
||||
void psUpdateSysMenu(Qt::WindowState state);
|
||||
void psUpdateMargins();
|
||||
void psUpdatedPosition();
|
||||
|
||||
bool psHandleTitle();
|
||||
|
||||
void psFlash();
|
||||
|
||||
void psUpdateWorkmode();
|
||||
|
||||
void psRefreshTaskbarIcon();
|
||||
|
||||
bool psPosInited() const {
|
||||
return posInited;
|
||||
}
|
||||
|
||||
bool psFilterNativeEvent(void *event);
|
||||
|
||||
void psActivateNotify(NotifyWindow *w);
|
||||
void psClearNotifies(PeerId peerId = 0);
|
||||
void psNotifyShown(NotifyWindow *w);
|
||||
void psPlatformNotify(HistoryItem *item, int32 fwdCount);
|
||||
|
||||
bool eventFilter(QObject *obj, QEvent *evt) override;
|
||||
|
||||
void psUpdateCounter();
|
||||
|
||||
bool psHasNativeNotifications() {
|
||||
return !(QSysInfo::macVersion() < QSysInfo::MV_10_8);
|
||||
}
|
||||
|
||||
virtual QImage iconWithCounter(int size, int count, style::color bg, bool smallIcon) = 0;
|
||||
|
||||
void closeWithoutDestroy() override;
|
||||
|
||||
~MainWindow();
|
||||
|
||||
public slots:
|
||||
void psUpdateDelegate();
|
||||
void psSavePosition(Qt::WindowState state = Qt::WindowActive);
|
||||
void psShowTrayMenu();
|
||||
|
||||
void psMacUndo();
|
||||
void psMacRedo();
|
||||
void psMacCut();
|
||||
void psMacCopy();
|
||||
void psMacPaste();
|
||||
void psMacDelete();
|
||||
void psMacSelectAll();
|
||||
|
||||
private slots:
|
||||
void onHideAfterFullScreen();
|
||||
|
||||
protected:
|
||||
void stateChangedHook(Qt::WindowState state) override;
|
||||
|
||||
QImage psTrayIcon(bool selected = false) const;
|
||||
bool psHasTrayIcon() const {
|
||||
return trayIcon;
|
||||
}
|
||||
|
||||
void psMacUpdateMenu();
|
||||
|
||||
bool posInited;
|
||||
QSystemTrayIcon *trayIcon = nullptr;
|
||||
QMenu *trayIconMenu = nullptr;
|
||||
QImage icon256, iconbig256;
|
||||
QIcon wndIcon;
|
||||
|
||||
QImage trayImg, trayImgSel;
|
||||
|
||||
void psTrayMenuUpdated();
|
||||
void psSetupTrayIcon();
|
||||
virtual void placeSmallCounter(QImage &img, int size, int count, style::color bg, const QPoint &shift, style::color color) = 0;
|
||||
|
||||
QTimer psUpdatedPositionTimer;
|
||||
|
||||
private:
|
||||
MacPrivate _private;
|
||||
|
||||
mutable bool psIdle;
|
||||
mutable QTimer psIdleTimer;
|
||||
|
||||
QTimer _hideAfterFullScreenTimer;
|
||||
|
||||
QMenuBar psMainMenu;
|
||||
QAction *psLogout = nullptr;
|
||||
QAction *psUndo = nullptr;
|
||||
QAction *psRedo = nullptr;
|
||||
QAction *psCut = nullptr;
|
||||
QAction *psCopy = nullptr;
|
||||
QAction *psPaste = nullptr;
|
||||
QAction *psDelete = nullptr;
|
||||
QAction *psSelectAll = nullptr;
|
||||
QAction *psContacts = nullptr;
|
||||
QAction *psAddContact = nullptr;
|
||||
QAction *psNewGroup = nullptr;
|
||||
QAction *psNewChannel = nullptr;
|
||||
QAction *psShowTelegram = nullptr;
|
||||
|
||||
};
|
||||
|
||||
} // namespace Platform
|
510
Telegram/SourceFiles/platform/mac/main_window_mac.mm
Normal file
|
@ -0,0 +1,510 @@
|
|||
/*
|
||||
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.
|
||||
|
||||
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/mac/main_window_mac.h"
|
||||
|
||||
#include "mainwindow.h"
|
||||
#include "mainwidget.h"
|
||||
#include "application.h"
|
||||
#include "playerwidget.h"
|
||||
#include "historywidget.h"
|
||||
#include "localstorage.h"
|
||||
|
||||
#include "lang.h"
|
||||
|
||||
#include <Cocoa/Cocoa.h>
|
||||
#include <IOKit/IOKitLib.h>
|
||||
#include <CoreFoundation/CFURL.h>
|
||||
|
||||
#include <IOKit/hidsystem/ev_keymap.h>
|
||||
|
||||
namespace Platform {
|
||||
|
||||
void MacPrivate::activeSpaceChanged() {
|
||||
if (App::wnd()) {
|
||||
App::wnd()->notifyActivateAll();
|
||||
}
|
||||
}
|
||||
|
||||
void MacPrivate::darkModeChanged() {
|
||||
Notify::unreadCounterUpdated();
|
||||
}
|
||||
|
||||
void MacPrivate::notifyClicked(unsigned long long peer, int msgid) {
|
||||
History *history = App::history(PeerId(peer));
|
||||
|
||||
App::wnd()->showFromTray();
|
||||
if (App::passcoded()) {
|
||||
App::wnd()->setInnerFocus();
|
||||
App::wnd()->notifyClear();
|
||||
} else {
|
||||
App::wnd()->hideSettings();
|
||||
bool tomsg = !history->peer->isUser() && (msgid > 0);
|
||||
if (tomsg) {
|
||||
HistoryItem *item = App::histItemById(peerToChannel(PeerId(peer)), MsgId(msgid));
|
||||
if (!item || !item->mentionsMe()) {
|
||||
tomsg = false;
|
||||
}
|
||||
}
|
||||
Ui::showPeerHistory(history, tomsg ? msgid : ShowAtUnreadMsgId);
|
||||
App::wnd()->notifyClear(history);
|
||||
}
|
||||
}
|
||||
|
||||
void MacPrivate::notifyReplied(unsigned long long peer, int msgid, const char *str) {
|
||||
History *history = App::history(PeerId(peer));
|
||||
|
||||
MainWidget::MessageToSend message;
|
||||
message.history = history;
|
||||
message.textWithTags = { QString::fromUtf8(str), TextWithTags::Tags() };
|
||||
message.replyTo = (msgid > 0 && !history->peer->isUser()) ? msgid : 0;
|
||||
message.silent = false;
|
||||
message.clearDraft = false;
|
||||
App::main()->sendMessage(message);
|
||||
}
|
||||
|
||||
MainWindow::MainWindow()
|
||||
: posInited(false)
|
||||
, icon256(qsl(":/gui/art/icon256.png"))
|
||||
, iconbig256(qsl(":/gui/art/iconbig256.png"))
|
||||
, wndIcon(QPixmap::fromImage(iconbig256, Qt::ColorOnly)) {
|
||||
QImage tray(qsl(":/gui/art/osxtray.png"));
|
||||
trayImg = tray.copy(0, cRetina() ? 0 : tray.width() / 2, tray.width() / (cRetina() ? 2 : 4), tray.width() / (cRetina() ? 2 : 4));
|
||||
trayImgSel = tray.copy(tray.width() / (cRetina() ? 2 : 4), cRetina() ? 0 : tray.width() / 2, tray.width() / (cRetina() ? 2 : 4), tray.width() / (cRetina() ? 2 : 4));
|
||||
|
||||
_hideAfterFullScreenTimer.setSingleShot(true);
|
||||
connect(&_hideAfterFullScreenTimer, SIGNAL(timeout()), this, SLOT(onHideAfterFullScreen()));
|
||||
}
|
||||
|
||||
void MainWindow::closeWithoutDestroy() {
|
||||
NSWindow *nsWindow = [reinterpret_cast<NSView*>(winId()) window];
|
||||
bool isFullScreen = (([nsWindow styleMask] & NSFullScreenWindowMask) == NSFullScreenWindowMask);
|
||||
if (isFullScreen) {
|
||||
_hideAfterFullScreenTimer.start(3000);
|
||||
[nsWindow toggleFullScreen:nsWindow];
|
||||
} else {
|
||||
hide();
|
||||
}
|
||||
}
|
||||
|
||||
void MainWindow::stateChangedHook(Qt::WindowState state) {
|
||||
if (_hideAfterFullScreenTimer.isActive()) {
|
||||
_hideAfterFullScreenTimer.stop();
|
||||
QTimer::singleShot(0, this, SLOT(onHideAfterFullScreen()));
|
||||
}
|
||||
}
|
||||
|
||||
void MainWindow::onHideAfterFullScreen() {
|
||||
hide();
|
||||
}
|
||||
|
||||
QImage MainWindow::psTrayIcon(bool selected) const {
|
||||
return selected ? trayImgSel : trayImg;
|
||||
}
|
||||
|
||||
void MainWindow::psShowTrayMenu() {
|
||||
}
|
||||
|
||||
void MainWindow::psRefreshTaskbarIcon() {
|
||||
}
|
||||
|
||||
void MainWindow::psTrayMenuUpdated() {
|
||||
}
|
||||
|
||||
void MainWindow::psSetupTrayIcon() {
|
||||
if (!trayIcon) {
|
||||
trayIcon = new QSystemTrayIcon(this);
|
||||
|
||||
QIcon icon(QPixmap::fromImage(psTrayIcon(), Qt::ColorOnly));
|
||||
icon.addPixmap(QPixmap::fromImage(psTrayIcon(true), Qt::ColorOnly), QIcon::Selected);
|
||||
|
||||
trayIcon->setIcon(icon);
|
||||
trayIcon->setToolTip(str_const_toString(AppName));
|
||||
connect(trayIcon, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), this, SLOT(toggleTray(QSystemTrayIcon::ActivationReason)), Qt::UniqueConnection);
|
||||
App::wnd()->updateTrayMenu();
|
||||
}
|
||||
psUpdateCounter();
|
||||
|
||||
trayIcon->show();
|
||||
}
|
||||
|
||||
void MainWindow::psUpdateWorkmode() {
|
||||
psSetupTrayIcon();
|
||||
if (cWorkMode() == dbiwmWindowOnly) {
|
||||
if (trayIcon) {
|
||||
trayIcon->setContextMenu(0);
|
||||
delete trayIcon;
|
||||
}
|
||||
trayIcon = 0;
|
||||
}
|
||||
psUpdateDelegate();
|
||||
setWindowIcon(wndIcon);
|
||||
}
|
||||
|
||||
void _placeCounter(QImage &img, int size, int count, style::color bg, style::color color) {
|
||||
if (!count) return;
|
||||
|
||||
QPainter p(&img);
|
||||
QString cnt = (count < 100) ? QString("%1").arg(count) : QString("..%1").arg(count % 100, 2, 10, QChar('0'));
|
||||
int32 cntSize = cnt.size();
|
||||
|
||||
p.setBrush(bg->b);
|
||||
p.setPen(Qt::NoPen);
|
||||
p.setRenderHint(QPainter::Antialiasing);
|
||||
int32 fontSize, skip;
|
||||
if (size == 22) {
|
||||
skip = 1;
|
||||
fontSize = 8;
|
||||
} else {
|
||||
skip = 2;
|
||||
fontSize = 16;
|
||||
}
|
||||
style::font f(fontSize, 0, 0);
|
||||
int32 w = f->width(cnt), d, r;
|
||||
if (size == 22) {
|
||||
d = (cntSize < 2) ? 3 : 2;
|
||||
r = (cntSize < 2) ? 6 : 5;
|
||||
} else {
|
||||
d = (cntSize < 2) ? 6 : 5;
|
||||
r = (cntSize < 2) ? 9 : 11;
|
||||
}
|
||||
p.drawRoundedRect(QRect(size - w - d * 2 - skip, size - f->height - skip, w + d * 2, f->height), r, r);
|
||||
|
||||
p.setCompositionMode(QPainter::CompositionMode_Source);
|
||||
p.setFont(f->f);
|
||||
p.setPen(color->p);
|
||||
p.drawText(size - w - d - skip, size - f->height + f->ascent - skip, cnt);
|
||||
}
|
||||
|
||||
void MainWindow::psUpdateCounter() {
|
||||
int32 counter = App::histories().unreadBadge();
|
||||
|
||||
setWindowTitle((counter > 0) ? qsl("Telegram (%1)").arg(counter) : qsl("Telegram"));
|
||||
setWindowIcon(wndIcon);
|
||||
|
||||
QString cnt = (counter < 1000) ? QString("%1").arg(counter) : QString("..%1").arg(counter % 100, 2, 10, QChar('0'));
|
||||
_private.setWindowBadge(counter ? cnt : QString());
|
||||
|
||||
if (trayIcon) {
|
||||
bool muted = App::histories().unreadOnlyMuted();
|
||||
bool dm = objc_darkMode();
|
||||
|
||||
style::color bg = muted ? st::counterMuteBG : st::counterBG;
|
||||
QIcon icon;
|
||||
QImage img(psTrayIcon(dm)), imgsel(psTrayIcon(true));
|
||||
img.detach();
|
||||
imgsel.detach();
|
||||
int32 size = cRetina() ? 44 : 22;
|
||||
_placeCounter(img, size, counter, bg, (dm && muted) ? st::counterMacInvColor : st::counterColor);
|
||||
_placeCounter(imgsel, size, counter, st::white, st::counterMacInvColor);
|
||||
icon.addPixmap(QPixmap::fromImage(img, Qt::ColorOnly));
|
||||
icon.addPixmap(QPixmap::fromImage(imgsel, Qt::ColorOnly), QIcon::Selected);
|
||||
trayIcon->setIcon(icon);
|
||||
}
|
||||
}
|
||||
|
||||
void MainWindow::psUpdateDelegate() {
|
||||
_private.updateDelegate();
|
||||
}
|
||||
|
||||
void MainWindow::psInitSize() {
|
||||
setMinimumWidth(st::wndMinWidth);
|
||||
setMinimumHeight(st::wndMinHeight);
|
||||
|
||||
TWindowPos pos(cWindowPos());
|
||||
QRect avail(QDesktopWidget().availableGeometry());
|
||||
bool maximized = false;
|
||||
QRect geom(avail.x() + (avail.width() - st::wndDefWidth) / 2, avail.y() + (avail.height() - st::wndDefHeight) / 2, st::wndDefWidth, st::wndDefHeight);
|
||||
if (pos.w && pos.h) {
|
||||
QList<QScreen*> screens = Application::screens();
|
||||
for (QList<QScreen*>::const_iterator i = screens.cbegin(), e = screens.cend(); i != e; ++i) {
|
||||
QByteArray name = (*i)->name().toUtf8();
|
||||
if (pos.moncrc == hashCrc32(name.constData(), name.size())) {
|
||||
QRect screen((*i)->geometry());
|
||||
int32 w = screen.width(), h = screen.height();
|
||||
if (w >= st::wndMinWidth && h >= st::wndMinHeight) {
|
||||
if (pos.w > w) pos.w = w;
|
||||
if (pos.h > h) pos.h = h;
|
||||
pos.x += screen.x();
|
||||
pos.y += screen.y();
|
||||
if (pos.x < screen.x() + screen.width() - 10 && pos.y < screen.y() + screen.height() - 10) {
|
||||
geom = QRect(pos.x, pos.y, pos.w, pos.h);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (pos.y < 0) pos.y = 0;
|
||||
maximized = pos.maximized;
|
||||
}
|
||||
setGeometry(geom);
|
||||
}
|
||||
|
||||
void MainWindow::psInitFrameless() {
|
||||
psUpdatedPositionTimer.setSingleShot(true);
|
||||
connect(&psUpdatedPositionTimer, SIGNAL(timeout()), this, SLOT(psSavePosition()));
|
||||
}
|
||||
|
||||
void MainWindow::psSavePosition(Qt::WindowState state) {
|
||||
if (state == Qt::WindowActive) state = windowHandle()->windowState();
|
||||
if (state == Qt::WindowMinimized || !posInited) return;
|
||||
|
||||
TWindowPos pos(cWindowPos()), curPos = pos;
|
||||
|
||||
if (state == Qt::WindowMaximized) {
|
||||
curPos.maximized = 1;
|
||||
} else {
|
||||
QRect r(geometry());
|
||||
curPos.x = r.x();
|
||||
curPos.y = r.y();
|
||||
curPos.w = r.width();
|
||||
curPos.h = r.height();
|
||||
curPos.maximized = 0;
|
||||
}
|
||||
|
||||
int px = curPos.x + curPos.w / 2, py = curPos.y + curPos.h / 2, d = 0;
|
||||
QScreen *chosen = 0;
|
||||
QList<QScreen*> screens = Application::screens();
|
||||
for (QList<QScreen*>::const_iterator i = screens.cbegin(), e = screens.cend(); i != e; ++i) {
|
||||
int dx = (*i)->geometry().x() + (*i)->geometry().width() / 2 - px; if (dx < 0) dx = -dx;
|
||||
int dy = (*i)->geometry().y() + (*i)->geometry().height() / 2 - py; if (dy < 0) dy = -dy;
|
||||
if (!chosen || dx + dy < d) {
|
||||
d = dx + dy;
|
||||
chosen = *i;
|
||||
}
|
||||
}
|
||||
if (chosen) {
|
||||
curPos.x -= chosen->geometry().x();
|
||||
curPos.y -= chosen->geometry().y();
|
||||
QByteArray name = chosen->name().toUtf8();
|
||||
curPos.moncrc = hashCrc32(name.constData(), name.size());
|
||||
}
|
||||
|
||||
if (curPos.w >= st::wndMinWidth && curPos.h >= st::wndMinHeight) {
|
||||
if (curPos.x != pos.x || curPos.y != pos.y || curPos.w != pos.w || curPos.h != pos.h || curPos.moncrc != pos.moncrc || curPos.maximized != pos.maximized) {
|
||||
cSetWindowPos(curPos);
|
||||
Local::writeSettings();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void MainWindow::psUpdatedPosition() {
|
||||
psUpdatedPositionTimer.start(SaveWindowPositionTimeout);
|
||||
}
|
||||
|
||||
void MainWindow::psFirstShow() {
|
||||
psUpdateMargins();
|
||||
|
||||
bool showShadows = true;
|
||||
|
||||
show();
|
||||
_private.enableShadow(winId());
|
||||
if (cWindowPos().maximized) {
|
||||
setWindowState(Qt::WindowMaximized);
|
||||
}
|
||||
|
||||
if ((cLaunchMode() == LaunchModeAutoStart && cStartMinimized()) || cStartInTray()) {
|
||||
setWindowState(Qt::WindowMinimized);
|
||||
if (cWorkMode() == dbiwmTrayOnly || cWorkMode() == dbiwmWindowAndTray) {
|
||||
hide();
|
||||
} else {
|
||||
show();
|
||||
}
|
||||
showShadows = false;
|
||||
} else {
|
||||
show();
|
||||
}
|
||||
|
||||
posInited = true;
|
||||
|
||||
// init global menu
|
||||
QMenu *main = psMainMenu.addMenu(qsl("Telegram"));
|
||||
main->addAction(lng_mac_menu_about_telegram(lt_telegram, qsl("Telegram")), App::wnd()->getTitle(), SLOT(onAbout()))->setMenuRole(QAction::AboutQtRole);
|
||||
main->addSeparator();
|
||||
QAction *prefs = main->addAction(lang(lng_mac_menu_preferences), App::wnd(), SLOT(showSettings()), QKeySequence(Qt::ControlModifier | Qt::Key_Comma));
|
||||
prefs->setMenuRole(QAction::PreferencesRole);
|
||||
|
||||
QMenu *file = psMainMenu.addMenu(lang(lng_mac_menu_file));
|
||||
psLogout = file->addAction(lang(lng_mac_menu_logout), App::wnd(), SLOT(onLogout()));
|
||||
|
||||
QMenu *edit = psMainMenu.addMenu(lang(lng_mac_menu_edit));
|
||||
psUndo = edit->addAction(lang(lng_mac_menu_undo), this, SLOT(psMacUndo()), QKeySequence::Undo);
|
||||
psRedo = edit->addAction(lang(lng_mac_menu_redo), this, SLOT(psMacRedo()), QKeySequence::Redo);
|
||||
edit->addSeparator();
|
||||
psCut = edit->addAction(lang(lng_mac_menu_cut), this, SLOT(psMacCut()), QKeySequence::Cut);
|
||||
psCopy = edit->addAction(lang(lng_mac_menu_copy), this, SLOT(psMacCopy()), QKeySequence::Copy);
|
||||
psPaste = edit->addAction(lang(lng_mac_menu_paste), this, SLOT(psMacPaste()), QKeySequence::Paste);
|
||||
psDelete = edit->addAction(lang(lng_mac_menu_delete), this, SLOT(psMacDelete()), QKeySequence(Qt::ControlModifier | Qt::Key_Backspace));
|
||||
edit->addSeparator();
|
||||
psSelectAll = edit->addAction(lang(lng_mac_menu_select_all), this, SLOT(psMacSelectAll()), QKeySequence::SelectAll);
|
||||
|
||||
QMenu *window = psMainMenu.addMenu(lang(lng_mac_menu_window));
|
||||
psContacts = window->addAction(lang(lng_mac_menu_contacts), App::wnd()->getTitle(), SLOT(onContacts()));
|
||||
psAddContact = window->addAction(lang(lng_mac_menu_add_contact), App::wnd(), SLOT(onShowAddContact()));
|
||||
window->addSeparator();
|
||||
psNewGroup = window->addAction(lang(lng_mac_menu_new_group), App::wnd(), SLOT(onShowNewGroup()));
|
||||
psNewChannel = window->addAction(lang(lng_mac_menu_new_channel), App::wnd(), SLOT(onShowNewChannel()));
|
||||
window->addSeparator();
|
||||
psShowTelegram = window->addAction(lang(lng_mac_menu_show), App::wnd(), SLOT(showFromTray()));
|
||||
|
||||
psMacUpdateMenu();
|
||||
}
|
||||
|
||||
namespace {
|
||||
void _sendKeySequence(Qt::Key key, Qt::KeyboardModifiers modifiers = Qt::NoModifier) {
|
||||
QWidget *focused = QApplication::focusWidget();
|
||||
if (qobject_cast<QLineEdit*>(focused) || qobject_cast<FlatTextarea*>(focused) || qobject_cast<HistoryInner*>(focused)) {
|
||||
QApplication::postEvent(focused, new QKeyEvent(QEvent::KeyPress, key, modifiers));
|
||||
QApplication::postEvent(focused, new QKeyEvent(QEvent::KeyRelease, key, modifiers));
|
||||
}
|
||||
}
|
||||
void _forceDisabled(QAction *action, bool disabled) {
|
||||
if (action->isEnabled()) {
|
||||
if (disabled) action->setDisabled(true);
|
||||
} else if (!disabled) {
|
||||
action->setDisabled(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void MainWindow::psMacUndo() {
|
||||
_sendKeySequence(Qt::Key_Z, Qt::ControlModifier);
|
||||
}
|
||||
|
||||
void MainWindow::psMacRedo() {
|
||||
_sendKeySequence(Qt::Key_Z, Qt::ControlModifier | Qt::ShiftModifier);
|
||||
}
|
||||
|
||||
void MainWindow::psMacCut() {
|
||||
_sendKeySequence(Qt::Key_X, Qt::ControlModifier);
|
||||
}
|
||||
|
||||
void MainWindow::psMacCopy() {
|
||||
_sendKeySequence(Qt::Key_C, Qt::ControlModifier);
|
||||
}
|
||||
|
||||
void MainWindow::psMacPaste() {
|
||||
_sendKeySequence(Qt::Key_V, Qt::ControlModifier);
|
||||
}
|
||||
|
||||
void MainWindow::psMacDelete() {
|
||||
_sendKeySequence(Qt::Key_Delete);
|
||||
}
|
||||
|
||||
void MainWindow::psMacSelectAll() {
|
||||
_sendKeySequence(Qt::Key_A, Qt::ControlModifier);
|
||||
}
|
||||
|
||||
bool MainWindow::psHandleTitle() {
|
||||
return false;
|
||||
}
|
||||
|
||||
void MainWindow::psInitSysMenu() {
|
||||
}
|
||||
|
||||
void MainWindow::psUpdateSysMenu(Qt::WindowState state) {
|
||||
}
|
||||
|
||||
void MainWindow::psUpdateMargins() {
|
||||
}
|
||||
|
||||
void MainWindow::psMacUpdateMenu() {
|
||||
if (!posInited) return;
|
||||
|
||||
QWidget *focused = QApplication::focusWidget();
|
||||
bool isLogged = !!App::self(), canUndo = false, canRedo = false, canCut = false, canCopy = false, canPaste = false, canDelete = false, canSelectAll = false;
|
||||
if (QLineEdit *edit = qobject_cast<QLineEdit*>(focused)) {
|
||||
canCut = canCopy = canDelete = edit->hasSelectedText();
|
||||
canSelectAll = !edit->text().isEmpty();
|
||||
canUndo = edit->isUndoAvailable();
|
||||
canRedo = edit->isRedoAvailable();
|
||||
canPaste = !Application::clipboard()->text().isEmpty();
|
||||
} else if (FlatTextarea *edit = qobject_cast<FlatTextarea*>(focused)) {
|
||||
canCut = canCopy = canDelete = edit->textCursor().hasSelection();
|
||||
canSelectAll = !edit->isEmpty();
|
||||
canUndo = edit->isUndoAvailable();
|
||||
canRedo = edit->isRedoAvailable();
|
||||
canPaste = !Application::clipboard()->text().isEmpty();
|
||||
} else if (HistoryInner *list = qobject_cast<HistoryInner*>(focused)) {
|
||||
canCopy = list->canCopySelected();
|
||||
canDelete = list->canDeleteSelected();
|
||||
}
|
||||
_forceDisabled(psLogout, !isLogged && !App::passcoded());
|
||||
_forceDisabled(psUndo, !canUndo);
|
||||
_forceDisabled(psRedo, !canRedo);
|
||||
_forceDisabled(psCut, !canCut);
|
||||
_forceDisabled(psCopy, !canCopy);
|
||||
_forceDisabled(psPaste, !canPaste);
|
||||
_forceDisabled(psDelete, !canDelete);
|
||||
_forceDisabled(psSelectAll, !canSelectAll);
|
||||
_forceDisabled(psContacts, !isLogged || App::passcoded());
|
||||
_forceDisabled(psAddContact, !isLogged || App::passcoded());
|
||||
_forceDisabled(psNewGroup, !isLogged || App::passcoded());
|
||||
_forceDisabled(psNewChannel, !isLogged || App::passcoded());
|
||||
_forceDisabled(psShowTelegram, App::wnd()->isActive(false));
|
||||
}
|
||||
|
||||
void MainWindow::psFlash() {
|
||||
_private.startBounce();
|
||||
}
|
||||
|
||||
void MainWindow::psClearNotifies(PeerId peerId) {
|
||||
_private.clearNotifies(peerId);
|
||||
}
|
||||
|
||||
void MainWindow::psActivateNotify(NotifyWindow *w) {
|
||||
objc_activateWnd(w->winId());
|
||||
}
|
||||
|
||||
bool MainWindow::psFilterNativeEvent(void *event) {
|
||||
return _private.filterNativeEvent(event);
|
||||
}
|
||||
|
||||
void MainWindow::psNotifyShown(NotifyWindow *w) {
|
||||
w->hide();
|
||||
objc_holdOnTop(w->winId());
|
||||
w->show();
|
||||
psShowOverAll(w, false);
|
||||
}
|
||||
|
||||
void MainWindow::psPlatformNotify(HistoryItem *item, int32 fwdCount) {
|
||||
QString title = (!App::passcoded() && cNotifyView() <= dbinvShowName) ? item->history()->peer->name : qsl("Telegram Desktop");
|
||||
QString subtitle = (!App::passcoded() && cNotifyView() <= dbinvShowName) ? item->notificationHeader() : QString();
|
||||
QPixmap pix = (!App::passcoded() && cNotifyView() <= dbinvShowName) ? item->history()->peer->genUserpic(st::notifyMacPhotoSize) : QPixmap();
|
||||
QString msg = (!App::passcoded() && cNotifyView() <= dbinvShowPreview) ? (fwdCount < 2 ? item->notificationText() : lng_forward_messages(lt_count, fwdCount)) : lang(lng_notification_preview);
|
||||
|
||||
bool withReply = !App::passcoded() && (cNotifyView() <= dbinvShowPreview) && item->history()->peer->canWrite();
|
||||
|
||||
_private.showNotify(item->history()->peer->id, item->id, pix, title, subtitle, msg, withReply);
|
||||
}
|
||||
|
||||
bool MainWindow::eventFilter(QObject *obj, QEvent *evt) {
|
||||
QEvent::Type t = evt->type();
|
||||
if (t == QEvent::FocusIn || t == QEvent::FocusOut) {
|
||||
if (qobject_cast<QLineEdit*>(obj) || qobject_cast<FlatTextarea*>(obj) || qobject_cast<HistoryInner*>(obj)) {
|
||||
psMacUpdateMenu();
|
||||
}
|
||||
}
|
||||
return Window::MainWindow::eventFilter(obj, evt);
|
||||
}
|
||||
|
||||
MainWindow::~MainWindow() {
|
||||
}
|
||||
|
||||
} // namespace
|
31
Telegram/SourceFiles/platform/platform_main_window.h
Normal file
|
@ -0,0 +1,31 @@
|
|||
/*
|
||||
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
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
#ifdef Q_OS_MAC
|
||||
#include "platform/mac/main_window_mac.h"
|
||||
#elif defined Q_OS_LINUX // Q_OS_MAC
|
||||
#include "platform/linux/main_window_linux.h"
|
||||
#elif defined Q_OS_WINRT // Q_OS_MAC || Q_OS_LINUX
|
||||
#include "platform/winrt/main_window_winrt.h"
|
||||
#elif defined Q_OS_WIN // Q_OS_MAC || Q_OS_LINUX || Q_OS_WINRT
|
||||
#include "platform/win/main_window_win.h"
|
||||
#endif // Q_OS_MAC || Q_OS_LINUX || Q_OS_WINRT || Q_OS_WIN
|
1099
Telegram/SourceFiles/platform/win/main_window_win.cpp
Normal file
157
Telegram/SourceFiles/platform/win/main_window_win.h
Normal file
|
@ -0,0 +1,157 @@
|
|||
/*
|
||||
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
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
#include "window/main_window.h"
|
||||
|
||||
#include <windows.h>
|
||||
|
||||
class NotifyWindow;
|
||||
|
||||
namespace Platform {
|
||||
|
||||
class MainWindow : public Window::MainWindow {
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
MainWindow();
|
||||
|
||||
int32 psResizeRowWidth() const {
|
||||
return 0;//st::wndResizeAreaWidth;
|
||||
}
|
||||
|
||||
void psInitFrameless();
|
||||
void psInitSize();
|
||||
HWND psHwnd() const;
|
||||
HMENU psMenu() const;
|
||||
|
||||
void psFirstShow();
|
||||
void psInitSysMenu();
|
||||
void psUpdateSysMenu(Qt::WindowState state);
|
||||
void psUpdateMargins();
|
||||
void psUpdatedPosition();
|
||||
|
||||
bool psHandleTitle();
|
||||
|
||||
void psFlash();
|
||||
void psNotifySettingGot();
|
||||
|
||||
void psUpdateWorkmode();
|
||||
|
||||
void psRefreshTaskbarIcon();
|
||||
|
||||
bool psPosInited() const {
|
||||
return posInited;
|
||||
}
|
||||
|
||||
void psActivateNotify(NotifyWindow *w);
|
||||
void psClearNotifies(PeerId peerId = 0);
|
||||
void psNotifyShown(NotifyWindow *w);
|
||||
void psPlatformNotify(HistoryItem *item, int32 fwdCount);
|
||||
|
||||
void psUpdateCounter();
|
||||
|
||||
bool psHasNativeNotifications();
|
||||
void psCleanNotifyPhotosIn(int32 dt);
|
||||
|
||||
virtual QImage iconWithCounter(int size, int count, style::color bg, bool smallIcon) = 0;
|
||||
|
||||
static UINT TaskbarCreatedMsgId() {
|
||||
return _taskbarCreatedMsgId;
|
||||
}
|
||||
static void TaskbarCreated();
|
||||
|
||||
// Custom shadows.
|
||||
enum class ShadowsChange {
|
||||
Moved = 0x01,
|
||||
Resized = 0x02,
|
||||
Shown = 0x04,
|
||||
Hidden = 0x08,
|
||||
Activate = 0x10,
|
||||
};
|
||||
Q_DECLARE_FLAGS(ShadowsChanges, ShadowsChange);
|
||||
|
||||
bool shadowsWorking() const {
|
||||
return _shadowsWorking;
|
||||
}
|
||||
void shadowsActivate();
|
||||
void shadowsDeactivate();
|
||||
void shadowsUpdate(ShadowsChanges changes, WINDOWPOS *position = nullptr);
|
||||
|
||||
int deltaLeft() const {
|
||||
return _deltaLeft;
|
||||
}
|
||||
int deltaTop() const {
|
||||
return _deltaTop;
|
||||
}
|
||||
|
||||
~MainWindow();
|
||||
|
||||
public slots:
|
||||
|
||||
void psUpdateDelegate();
|
||||
void psSavePosition(Qt::WindowState state = Qt::WindowActive);
|
||||
void psShowTrayMenu();
|
||||
|
||||
void psCleanNotifyPhotos();
|
||||
|
||||
protected:
|
||||
|
||||
bool psHasTrayIcon() const {
|
||||
return trayIcon;
|
||||
}
|
||||
|
||||
bool posInited = false;
|
||||
QSystemTrayIcon *trayIcon = nullptr;
|
||||
PopupMenu *trayIconMenu = nullptr;
|
||||
QImage icon256, iconbig256;
|
||||
QIcon wndIcon;
|
||||
|
||||
void psTrayMenuUpdated();
|
||||
void psSetupTrayIcon();
|
||||
|
||||
QTimer psUpdatedPositionTimer;
|
||||
|
||||
private:
|
||||
void psDestroyIcons();
|
||||
|
||||
static UINT _taskbarCreatedMsgId;
|
||||
|
||||
bool _shadowsWorking = false;
|
||||
bool _themeInited = false;
|
||||
|
||||
HWND ps_hWnd = nullptr;
|
||||
HWND ps_tbHider_hWnd = nullptr;
|
||||
HMENU ps_menu = nullptr;
|
||||
HICON ps_iconBig = nullptr;
|
||||
HICON ps_iconSmall = nullptr;
|
||||
HICON ps_iconOverlay = nullptr;
|
||||
|
||||
SingleTimer ps_cleanNotifyPhotosTimer;
|
||||
|
||||
int _deltaLeft = 0;
|
||||
int _deltaTop = 0;
|
||||
|
||||
};
|
||||
|
||||
Q_DECLARE_OPERATORS_FOR_FLAGS(MainWindow::ShadowsChanges);
|
||||
|
||||
} // namespace Platform
|
331
Telegram/SourceFiles/platform/win/windows_app_user_model_id.cpp
Normal file
|
@ -0,0 +1,331 @@
|
|||
/*
|
||||
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/win/windows_app_user_model_id.h"
|
||||
|
||||
#include "platform/win/windows_dlls.h"
|
||||
#include <propvarutil.h>
|
||||
#include <propkey.h>
|
||||
|
||||
#include <roapi.h>
|
||||
#include <wrl\client.h>
|
||||
#include <wrl\implements.h>
|
||||
#include <windows.ui.notifications.h>
|
||||
|
||||
using namespace Microsoft::WRL;
|
||||
|
||||
namespace Platform {
|
||||
namespace AppUserModelId {
|
||||
namespace {
|
||||
|
||||
const PROPERTYKEY pkey_AppUserModel_ID = { { 0x9F4C2855, 0x9F79, 0x4B39, { 0xA8, 0xD0, 0xE1, 0xD4, 0x2D, 0xE1, 0xD5, 0xF3 } }, 5 };
|
||||
const PROPERTYKEY pkey_AppUserModel_StartPinOption = { { 0x9F4C2855, 0x9F79, 0x4B39, { 0xA8, 0xD0, 0xE1, 0xD4, 0x2D, 0xE1, 0xD5, 0xF3 } }, 12 };
|
||||
|
||||
const WCHAR AppUserModelIdRelease[] = L"Telegram.TelegramDesktop";
|
||||
const WCHAR AppUserModelIdBeta[] = L"Telegram.TelegramDesktop.Beta";
|
||||
|
||||
} // namespace
|
||||
|
||||
QString pinnedPath() {
|
||||
static const int maxFileLen = MAX_PATH * 10;
|
||||
WCHAR wstrPath[maxFileLen];
|
||||
if (GetEnvironmentVariable(L"APPDATA", wstrPath, maxFileLen)) {
|
||||
QDir appData(QString::fromStdWString(std::wstring(wstrPath)));
|
||||
return appData.absolutePath() + qsl("/Microsoft/Internet Explorer/Quick Launch/User Pinned/TaskBar/");
|
||||
}
|
||||
return QString();
|
||||
}
|
||||
|
||||
void checkPinned() {
|
||||
if (!Dlls::PropVariantToString) return;
|
||||
|
||||
static const int maxFileLen = MAX_PATH * 10;
|
||||
|
||||
HRESULT hr = CoInitialize(0);
|
||||
if (!SUCCEEDED(hr)) return;
|
||||
|
||||
QString path = pinnedPath();
|
||||
std::wstring p = QDir::toNativeSeparators(path).toStdWString();
|
||||
|
||||
WCHAR src[MAX_PATH];
|
||||
GetModuleFileName(GetModuleHandle(0), src, MAX_PATH);
|
||||
BY_HANDLE_FILE_INFORMATION srcinfo = { 0 };
|
||||
HANDLE srcfile = CreateFile(src, 0x00, 0x00, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
|
||||
if (srcfile == INVALID_HANDLE_VALUE) return;
|
||||
BOOL srcres = GetFileInformationByHandle(srcfile, &srcinfo);
|
||||
CloseHandle(srcfile);
|
||||
if (!srcres) return;
|
||||
LOG(("Checking..."));
|
||||
WIN32_FIND_DATA findData;
|
||||
HANDLE findHandle = FindFirstFileEx((p + L"*").c_str(), FindExInfoStandard, &findData, FindExSearchNameMatch, 0, 0);
|
||||
if (findHandle == INVALID_HANDLE_VALUE) {
|
||||
LOG(("Init Error: could not find files in pinned folder"));
|
||||
return;
|
||||
}
|
||||
do {
|
||||
std::wstring fname = p + findData.cFileName;
|
||||
LOG(("Checking %1").arg(QString::fromStdWString(fname)));
|
||||
if (findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
|
||||
continue;
|
||||
} else {
|
||||
DWORD attributes = GetFileAttributes(fname.c_str());
|
||||
if (attributes >= 0xFFFFFFF) continue; // file does not exist
|
||||
|
||||
ComPtr<IShellLink> shellLink;
|
||||
HRESULT hr = CoCreateInstance(CLSID_ShellLink, nullptr, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&shellLink));
|
||||
if (!SUCCEEDED(hr)) continue;
|
||||
|
||||
ComPtr<IPersistFile> persistFile;
|
||||
hr = shellLink.As(&persistFile);
|
||||
if (!SUCCEEDED(hr)) continue;
|
||||
|
||||
hr = persistFile->Load(fname.c_str(), STGM_READWRITE);
|
||||
if (!SUCCEEDED(hr)) continue;
|
||||
|
||||
WCHAR dst[MAX_PATH];
|
||||
hr = shellLink->GetPath(dst, MAX_PATH, 0, 0);
|
||||
if (!SUCCEEDED(hr)) continue;
|
||||
|
||||
BY_HANDLE_FILE_INFORMATION dstinfo = { 0 };
|
||||
HANDLE dstfile = CreateFile(dst, 0x00, 0x00, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
|
||||
if (dstfile == INVALID_HANDLE_VALUE) continue;
|
||||
BOOL dstres = GetFileInformationByHandle(dstfile, &dstinfo);
|
||||
CloseHandle(dstfile);
|
||||
if (!dstres) continue;
|
||||
|
||||
if (srcinfo.dwVolumeSerialNumber == dstinfo.dwVolumeSerialNumber && srcinfo.nFileIndexLow == dstinfo.nFileIndexLow && srcinfo.nFileIndexHigh == dstinfo.nFileIndexHigh) {
|
||||
ComPtr<IPropertyStore> propertyStore;
|
||||
hr = shellLink.As(&propertyStore);
|
||||
if (!SUCCEEDED(hr)) return;
|
||||
|
||||
PROPVARIANT appIdPropVar;
|
||||
hr = propertyStore->GetValue(getKey(), &appIdPropVar);
|
||||
if (!SUCCEEDED(hr)) return;
|
||||
LOG(("Reading..."));
|
||||
WCHAR already[MAX_PATH];
|
||||
hr = Dlls::PropVariantToString(appIdPropVar, already, MAX_PATH);
|
||||
if (SUCCEEDED(hr)) {
|
||||
if (std::wstring(getId()) == already) {
|
||||
LOG(("Already!"));
|
||||
PropVariantClear(&appIdPropVar);
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (appIdPropVar.vt != VT_EMPTY) {
|
||||
PropVariantClear(&appIdPropVar);
|
||||
return;
|
||||
}
|
||||
PropVariantClear(&appIdPropVar);
|
||||
|
||||
hr = InitPropVariantFromString(getId(), &appIdPropVar);
|
||||
if (!SUCCEEDED(hr)) return;
|
||||
|
||||
hr = propertyStore->SetValue(getKey(), appIdPropVar);
|
||||
PropVariantClear(&appIdPropVar);
|
||||
if (!SUCCEEDED(hr)) return;
|
||||
|
||||
hr = propertyStore->Commit();
|
||||
if (!SUCCEEDED(hr)) return;
|
||||
|
||||
if (persistFile->IsDirty() == S_OK) {
|
||||
persistFile->Save(fname.c_str(), TRUE);
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
} while (FindNextFile(findHandle, &findData));
|
||||
DWORD errorCode = GetLastError();
|
||||
if (errorCode && errorCode != ERROR_NO_MORE_FILES) { // everything is found
|
||||
LOG(("Init Error: could not find some files in pinned folder"));
|
||||
return;
|
||||
}
|
||||
FindClose(findHandle);
|
||||
}
|
||||
|
||||
QString systemShortcutPath() {
|
||||
static const int maxFileLen = MAX_PATH * 10;
|
||||
WCHAR wstrPath[maxFileLen];
|
||||
if (GetEnvironmentVariable(L"APPDATA", wstrPath, maxFileLen)) {
|
||||
QDir appData(QString::fromStdWString(std::wstring(wstrPath)));
|
||||
return appData.absolutePath() + qsl("/Microsoft/Windows/Start Menu/Programs/");
|
||||
}
|
||||
return QString();
|
||||
}
|
||||
|
||||
void cleanupShortcut() {
|
||||
static const int maxFileLen = MAX_PATH * 10;
|
||||
|
||||
QString path = systemShortcutPath() + qsl("Telegram.lnk");
|
||||
std::wstring p = QDir::toNativeSeparators(path).toStdWString();
|
||||
|
||||
DWORD attributes = GetFileAttributes(p.c_str());
|
||||
if (attributes >= 0xFFFFFFF) return; // file does not exist
|
||||
|
||||
ComPtr<IShellLink> shellLink;
|
||||
HRESULT hr = CoCreateInstance(CLSID_ShellLink, nullptr, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&shellLink));
|
||||
if (!SUCCEEDED(hr)) return;
|
||||
|
||||
ComPtr<IPersistFile> persistFile;
|
||||
hr = shellLink.As(&persistFile);
|
||||
if (!SUCCEEDED(hr)) return;
|
||||
|
||||
hr = persistFile->Load(p.c_str(), STGM_READWRITE);
|
||||
if (!SUCCEEDED(hr)) return;
|
||||
|
||||
WCHAR szGotPath[MAX_PATH];
|
||||
WIN32_FIND_DATA wfd;
|
||||
hr = shellLink->GetPath(szGotPath, MAX_PATH, (WIN32_FIND_DATA*)&wfd, SLGP_SHORTPATH);
|
||||
if (!SUCCEEDED(hr)) return;
|
||||
|
||||
if (QDir::toNativeSeparators(cExeDir() + cExeName()).toStdWString() == szGotPath) {
|
||||
QFile().remove(path);
|
||||
}
|
||||
}
|
||||
|
||||
bool validateShortcutAt(const QString &path) {
|
||||
static const int maxFileLen = MAX_PATH * 10;
|
||||
|
||||
std::wstring p = QDir::toNativeSeparators(path).toStdWString();
|
||||
|
||||
DWORD attributes = GetFileAttributes(p.c_str());
|
||||
if (attributes >= 0xFFFFFFF) return false; // file does not exist
|
||||
|
||||
ComPtr<IShellLink> shellLink;
|
||||
HRESULT hr = CoCreateInstance(CLSID_ShellLink, nullptr, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&shellLink));
|
||||
if (!SUCCEEDED(hr)) return false;
|
||||
|
||||
ComPtr<IPersistFile> persistFile;
|
||||
hr = shellLink.As(&persistFile);
|
||||
if (!SUCCEEDED(hr)) return false;
|
||||
|
||||
hr = persistFile->Load(p.c_str(), STGM_READWRITE);
|
||||
if (!SUCCEEDED(hr)) return false;
|
||||
|
||||
ComPtr<IPropertyStore> propertyStore;
|
||||
hr = shellLink.As(&propertyStore);
|
||||
if (!SUCCEEDED(hr)) return false;
|
||||
|
||||
PROPVARIANT appIdPropVar;
|
||||
hr = propertyStore->GetValue(getKey(), &appIdPropVar);
|
||||
if (!SUCCEEDED(hr)) return false;
|
||||
|
||||
WCHAR already[MAX_PATH];
|
||||
hr = Dlls::PropVariantToString(appIdPropVar, already, MAX_PATH);
|
||||
if (SUCCEEDED(hr)) {
|
||||
if (std::wstring(getId()) == already) {
|
||||
PropVariantClear(&appIdPropVar);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
if (appIdPropVar.vt != VT_EMPTY) {
|
||||
PropVariantClear(&appIdPropVar);
|
||||
return false;
|
||||
}
|
||||
PropVariantClear(&appIdPropVar);
|
||||
|
||||
hr = InitPropVariantFromString(getId(), &appIdPropVar);
|
||||
if (!SUCCEEDED(hr)) return false;
|
||||
|
||||
hr = propertyStore->SetValue(getKey(), appIdPropVar);
|
||||
PropVariantClear(&appIdPropVar);
|
||||
if (!SUCCEEDED(hr)) return false;
|
||||
|
||||
hr = propertyStore->Commit();
|
||||
if (!SUCCEEDED(hr)) return false;
|
||||
|
||||
if (persistFile->IsDirty() == S_OK) {
|
||||
persistFile->Save(p.c_str(), TRUE);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool validateShortcut() {
|
||||
QString path = systemShortcutPath();
|
||||
if (path.isEmpty()) return false;
|
||||
|
||||
if (cBetaVersion()) {
|
||||
path += qsl("TelegramBeta.lnk");
|
||||
if (validateShortcutAt(path)) return true;
|
||||
} else {
|
||||
if (validateShortcutAt(path + qsl("Telegram Desktop/Telegram.lnk"))) return true;
|
||||
if (validateShortcutAt(path + qsl("Telegram Win (Unofficial)/Telegram.lnk"))) return true;
|
||||
|
||||
path += qsl("Telegram.lnk");
|
||||
if (validateShortcutAt(path)) return true;
|
||||
}
|
||||
|
||||
ComPtr<IShellLink> shellLink;
|
||||
HRESULT hr = CoCreateInstance(CLSID_ShellLink, nullptr, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&shellLink));
|
||||
if (!SUCCEEDED(hr)) return false;
|
||||
|
||||
hr = shellLink->SetPath(QDir::toNativeSeparators(cExeDir() + cExeName()).toStdWString().c_str());
|
||||
if (!SUCCEEDED(hr)) return false;
|
||||
|
||||
hr = shellLink->SetArguments(L"");
|
||||
if (!SUCCEEDED(hr)) return false;
|
||||
|
||||
hr = shellLink->SetWorkingDirectory(QDir::toNativeSeparators(QDir(cWorkingDir()).absolutePath()).toStdWString().c_str());
|
||||
if (!SUCCEEDED(hr)) return false;
|
||||
|
||||
ComPtr<IPropertyStore> propertyStore;
|
||||
hr = shellLink.As(&propertyStore);
|
||||
if (!SUCCEEDED(hr)) return false;
|
||||
|
||||
PROPVARIANT appIdPropVar;
|
||||
hr = InitPropVariantFromString(getId(), &appIdPropVar);
|
||||
if (!SUCCEEDED(hr)) return false;
|
||||
|
||||
hr = propertyStore->SetValue(getKey(), appIdPropVar);
|
||||
PropVariantClear(&appIdPropVar);
|
||||
if (!SUCCEEDED(hr)) return false;
|
||||
|
||||
PROPVARIANT startPinPropVar;
|
||||
hr = InitPropVariantFromUInt32(APPUSERMODEL_STARTPINOPTION_NOPINONINSTALL, &startPinPropVar);
|
||||
if (!SUCCEEDED(hr)) return false;
|
||||
|
||||
hr = propertyStore->SetValue(pkey_AppUserModel_StartPinOption, startPinPropVar);
|
||||
PropVariantClear(&startPinPropVar);
|
||||
if (!SUCCEEDED(hr)) return false;
|
||||
|
||||
hr = propertyStore->Commit();
|
||||
if (!SUCCEEDED(hr)) return false;
|
||||
|
||||
ComPtr<IPersistFile> persistFile;
|
||||
hr = shellLink.As(&persistFile);
|
||||
if (!SUCCEEDED(hr)) return false;
|
||||
|
||||
hr = persistFile->Save(QDir::toNativeSeparators(path).toStdWString().c_str(), TRUE);
|
||||
if (!SUCCEEDED(hr)) return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
const WCHAR *getId() {
|
||||
return cBetaVersion() ? AppUserModelIdBeta : AppUserModelIdRelease;
|
||||
}
|
||||
|
||||
const PROPERTYKEY &getKey() {
|
||||
return pkey_AppUserModel_ID;
|
||||
}
|
||||
|
||||
} // namespace AppUserModelId
|
||||
} // namespace Platform
|
|
@ -0,0 +1,37 @@
|
|||
/*
|
||||
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
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
#include <windows.h>
|
||||
|
||||
namespace Platform {
|
||||
namespace AppUserModelId {
|
||||
|
||||
void cleanupShortcut();
|
||||
void checkPinned();
|
||||
|
||||
const WCHAR *getId();
|
||||
bool validateShortcut();
|
||||
|
||||
const PROPERTYKEY &getKey();
|
||||
|
||||
} // namespace AppUserModelId
|
||||
} // namespace Platform
|
73
Telegram/SourceFiles/platform/win/windows_dlls.cpp
Normal file
|
@ -0,0 +1,73 @@
|
|||
/*
|
||||
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/win/windows_dlls.h"
|
||||
|
||||
namespace Platform {
|
||||
namespace Dlls {
|
||||
|
||||
f_SetWindowTheme SetWindowTheme;
|
||||
f_OpenAs_RunDLL OpenAs_RunDLL;
|
||||
f_SHOpenWithDialog SHOpenWithDialog;
|
||||
f_SHAssocEnumHandlers SHAssocEnumHandlers;
|
||||
f_SHCreateItemFromParsingName SHCreateItemFromParsingName;
|
||||
f_WTSRegisterSessionNotification WTSRegisterSessionNotification;
|
||||
f_WTSUnRegisterSessionNotification WTSUnRegisterSessionNotification;
|
||||
f_SHQueryUserNotificationState SHQueryUserNotificationState;
|
||||
f_SetCurrentProcessExplicitAppUserModelID SetCurrentProcessExplicitAppUserModelID;
|
||||
f_RoGetActivationFactory RoGetActivationFactory;
|
||||
f_WindowsCreateStringReference WindowsCreateStringReference;
|
||||
f_WindowsDeleteString WindowsDeleteString;
|
||||
f_PropVariantToString PropVariantToString;
|
||||
|
||||
HINSTANCE LibUxTheme;
|
||||
HINSTANCE LibShell32;
|
||||
HINSTANCE LibWtsApi32;
|
||||
HINSTANCE LibPropSys;
|
||||
HINSTANCE LibComBase;
|
||||
|
||||
void start() {
|
||||
LibUxTheme = LoadLibrary(L"UXTHEME.DLL");
|
||||
load(LibUxTheme, "SetWindowTheme", SetWindowTheme);
|
||||
|
||||
LibShell32 = LoadLibrary(L"SHELL32.DLL");
|
||||
load(LibShell32, "SHAssocEnumHandlers", SHAssocEnumHandlers);
|
||||
load(LibShell32, "SHCreateItemFromParsingName", SHCreateItemFromParsingName);
|
||||
load(LibShell32, "SHOpenWithDialog", SHOpenWithDialog);
|
||||
load(LibShell32, "OpenAs_RunDLLW", OpenAs_RunDLL);
|
||||
load(LibShell32, "SHQueryUserNotificationState", SHQueryUserNotificationState);
|
||||
load(LibShell32, "SetCurrentProcessExplicitAppUserModelID", SetCurrentProcessExplicitAppUserModelID);
|
||||
|
||||
LibWtsApi32 = LoadLibrary(L"WTSAPI32.DLL");
|
||||
load(LibWtsApi32, "WTSRegisterSessionNotification", WTSRegisterSessionNotification);
|
||||
load(LibWtsApi32, "WTSUnRegisterSessionNotification", WTSUnRegisterSessionNotification);
|
||||
|
||||
LibPropSys = LoadLibrary(L"PROPSYS.DLL");
|
||||
load(LibPropSys, "PropVariantToString", PropVariantToString);
|
||||
|
||||
LibComBase = LoadLibrary(L"COMBASE.DLL");
|
||||
load(LibComBase, "RoGetActivationFactory", RoGetActivationFactory);
|
||||
load(LibComBase, "WindowsCreateStringReference", WindowsCreateStringReference);
|
||||
load(LibComBase, "WindowsDeleteString", WindowsDeleteString);
|
||||
}
|
||||
|
||||
} // namespace Dlls
|
||||
} // namespace Platform
|
88
Telegram/SourceFiles/platform/win/windows_dlls.h
Normal file
|
@ -0,0 +1,88 @@
|
|||
/*
|
||||
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
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
#include <windows.h>
|
||||
#include <shlobj.h>
|
||||
#include <roapi.h>
|
||||
|
||||
namespace Platform {
|
||||
namespace Dlls {
|
||||
|
||||
void start();
|
||||
|
||||
template <typename Function>
|
||||
bool load(HINSTANCE library, LPCSTR name, Function &func) {
|
||||
if (!library) return false;
|
||||
|
||||
func = reinterpret_cast<Function>(GetProcAddress(library, name));
|
||||
return (func != nullptr);
|
||||
}
|
||||
|
||||
// UXTHEME.DLL
|
||||
typedef HRESULT (FAR STDAPICALLTYPE *f_SetWindowTheme)(HWND hWnd, LPCWSTR pszSubAppName, LPCWSTR pszSubIdList);
|
||||
extern f_SetWindowTheme SetWindowTheme;
|
||||
|
||||
// SHELL32.DLL
|
||||
typedef HRESULT (FAR STDAPICALLTYPE *f_SHAssocEnumHandlers)(PCWSTR pszExtra, ASSOC_FILTER afFilter, IEnumAssocHandlers **ppEnumHandler);
|
||||
extern f_SHAssocEnumHandlers SHAssocEnumHandlers;
|
||||
|
||||
typedef HRESULT (FAR STDAPICALLTYPE *f_SHCreateItemFromParsingName)(PCWSTR pszPath, IBindCtx *pbc, REFIID riid, void **ppv);
|
||||
extern f_SHCreateItemFromParsingName SHCreateItemFromParsingName;
|
||||
|
||||
typedef HRESULT (FAR STDAPICALLTYPE *f_SHOpenWithDialog)(HWND hwndParent, const OPENASINFO *poainfo);
|
||||
extern f_SHOpenWithDialog SHOpenWithDialog;
|
||||
|
||||
typedef HRESULT (FAR STDAPICALLTYPE *f_OpenAs_RunDLL)(HWND hWnd, HINSTANCE hInstance, LPCWSTR lpszCmdLine, int nCmdShow);
|
||||
extern f_OpenAs_RunDLL OpenAs_RunDLL;
|
||||
|
||||
typedef HRESULT (FAR STDAPICALLTYPE *f_SHQueryUserNotificationState)(QUERY_USER_NOTIFICATION_STATE *pquns);
|
||||
extern f_SHQueryUserNotificationState SHQueryUserNotificationState;
|
||||
|
||||
typedef HRESULT (FAR STDAPICALLTYPE *f_SetCurrentProcessExplicitAppUserModelID)(__in PCWSTR AppID);
|
||||
extern f_SetCurrentProcessExplicitAppUserModelID SetCurrentProcessExplicitAppUserModelID;
|
||||
|
||||
// WTSAPI32.DLL
|
||||
|
||||
typedef BOOL (FAR STDAPICALLTYPE *f_WTSRegisterSessionNotification)(HWND hWnd, DWORD dwFlags);
|
||||
extern f_WTSRegisterSessionNotification WTSRegisterSessionNotification;
|
||||
|
||||
typedef BOOL (FAR STDAPICALLTYPE *f_WTSUnRegisterSessionNotification)(HWND hWnd);
|
||||
extern f_WTSUnRegisterSessionNotification WTSUnRegisterSessionNotification;
|
||||
|
||||
// PROPSYS.DLL
|
||||
|
||||
typedef HRESULT (FAR STDAPICALLTYPE *f_PropVariantToString)(_In_ REFPROPVARIANT propvar, _Out_writes_(cch) PWSTR psz, _In_ UINT cch);
|
||||
extern f_PropVariantToString PropVariantToString;
|
||||
|
||||
// COMBASE.DLL
|
||||
|
||||
typedef HRESULT (FAR STDAPICALLTYPE *f_RoGetActivationFactory)(_In_ HSTRING activatableClassId, _In_ REFIID iid, _COM_Outptr_ void ** factory);
|
||||
extern f_RoGetActivationFactory RoGetActivationFactory;
|
||||
|
||||
typedef HRESULT (FAR STDAPICALLTYPE *f_WindowsCreateStringReference)(_In_reads_opt_(length + 1) PCWSTR sourceString, UINT32 length, _Out_ HSTRING_HEADER * hstringHeader, _Outptr_result_maybenull_ _Result_nullonfailure_ HSTRING * string);
|
||||
extern f_WindowsCreateStringReference WindowsCreateStringReference;
|
||||
|
||||
typedef HRESULT (FAR STDAPICALLTYPE *f_WindowsDeleteString)(_In_opt_ HSTRING string);
|
||||
extern f_WindowsDeleteString WindowsDeleteString;
|
||||
|
||||
} // namespace Dlls
|
||||
} // namespace Platform
|
260
Telegram/SourceFiles/platform/win/windows_event_filter.cpp
Normal file
|
@ -0,0 +1,260 @@
|
|||
/*
|
||||
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/win/windows_event_filter.h"
|
||||
|
||||
#include "mainwindow.h"
|
||||
|
||||
namespace Platform {
|
||||
namespace {
|
||||
|
||||
EventFilter *instance = nullptr;
|
||||
|
||||
int menuShown = 0, menuHidden = 0;
|
||||
|
||||
} // namespace
|
||||
|
||||
EventFilter *EventFilter::createInstance() {
|
||||
destroy();
|
||||
instance = new EventFilter();
|
||||
return getInstance();
|
||||
}
|
||||
|
||||
EventFilter *EventFilter::getInstance() {
|
||||
return instance;
|
||||
}
|
||||
|
||||
void EventFilter::destroy() {
|
||||
delete instance;
|
||||
instance = nullptr;
|
||||
}
|
||||
|
||||
bool EventFilter::nativeEventFilter(const QByteArray &eventType, void *message, long *result) {
|
||||
auto wnd = App::wnd();
|
||||
if (!wnd) return false;
|
||||
|
||||
MSG *msg = (MSG*)message;
|
||||
if (msg->message == WM_ENDSESSION) {
|
||||
App::quit();
|
||||
return false;
|
||||
}
|
||||
if (msg->hwnd == wnd->psHwnd() || msg->hwnd && !wnd->psHwnd()) {
|
||||
return mainWindowEvent(msg->hwnd, msg->message, msg->wParam, msg->lParam, (LRESULT*)result);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool EventFilter::mainWindowEvent(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, LRESULT *result) {
|
||||
using ShadowsChange = MainWindow::ShadowsChange;
|
||||
|
||||
if (auto tbCreatedMsgId = Platform::MainWindow::TaskbarCreatedMsgId()) {
|
||||
if (msg == tbCreatedMsgId) {
|
||||
Platform::MainWindow::TaskbarCreated();
|
||||
}
|
||||
}
|
||||
|
||||
switch (msg) {
|
||||
|
||||
case WM_TIMECHANGE: {
|
||||
App::wnd()->checkAutoLockIn(100);
|
||||
} return false;
|
||||
|
||||
case WM_WTSSESSION_CHANGE: {
|
||||
if (wParam == WTS_SESSION_LOGOFF || wParam == WTS_SESSION_LOCK) {
|
||||
setSessionLoggedOff(true);
|
||||
} else if (wParam == WTS_SESSION_LOGON || wParam == WTS_SESSION_UNLOCK) {
|
||||
setSessionLoggedOff(false);
|
||||
}
|
||||
} return false;
|
||||
|
||||
case WM_DESTROY: {
|
||||
App::quit();
|
||||
} return false;
|
||||
|
||||
case WM_ACTIVATE: {
|
||||
if (LOWORD(wParam) == WA_CLICKACTIVE) {
|
||||
App::wnd()->inactivePress(true);
|
||||
}
|
||||
if (LOWORD(wParam) != WA_INACTIVE) {
|
||||
App::wnd()->shadowsActivate();
|
||||
} else {
|
||||
App::wnd()->shadowsDeactivate();
|
||||
}
|
||||
if (Global::started()) {
|
||||
App::wnd()->update();
|
||||
}
|
||||
} return false;
|
||||
|
||||
case WM_NCPAINT: if (QSysInfo::WindowsVersion >= QSysInfo::WV_WINDOWS8) return false; *result = 0; return true;
|
||||
|
||||
case WM_NCCALCSIZE: {
|
||||
WINDOWPLACEMENT wp;
|
||||
wp.length = sizeof(WINDOWPLACEMENT);
|
||||
if (GetWindowPlacement(hWnd, &wp) && wp.showCmd == SW_SHOWMAXIMIZED) {
|
||||
LPNCCALCSIZE_PARAMS params = (LPNCCALCSIZE_PARAMS)lParam;
|
||||
LPRECT r = (wParam == TRUE) ? ¶ms->rgrc[0] : (LPRECT)lParam;
|
||||
HMONITOR hMonitor = MonitorFromPoint({ (r->left + r->right) / 2, (r->top + r->bottom) / 2 }, MONITOR_DEFAULTTONEAREST);
|
||||
if (hMonitor) {
|
||||
MONITORINFO mi;
|
||||
mi.cbSize = sizeof(mi);
|
||||
if (GetMonitorInfo(hMonitor, &mi)) {
|
||||
*r = mi.rcWork;
|
||||
}
|
||||
}
|
||||
}
|
||||
*result = 0;
|
||||
return true;
|
||||
}
|
||||
|
||||
case WM_NCACTIVATE: {
|
||||
*result = DefWindowProc(hWnd, msg, wParam, -1);
|
||||
} return true;
|
||||
|
||||
case WM_WINDOWPOSCHANGING:
|
||||
case WM_WINDOWPOSCHANGED: {
|
||||
WINDOWPLACEMENT wp;
|
||||
wp.length = sizeof(WINDOWPLACEMENT);
|
||||
if (GetWindowPlacement(hWnd, &wp) && (wp.showCmd == SW_SHOWMAXIMIZED || wp.showCmd == SW_SHOWMINIMIZED)) {
|
||||
App::wnd()->shadowsUpdate(ShadowsChange::Hidden);
|
||||
} else {
|
||||
App::wnd()->shadowsUpdate(ShadowsChange::Moved | ShadowsChange::Resized, (WINDOWPOS*)lParam);
|
||||
}
|
||||
} return false;
|
||||
|
||||
case WM_SIZE: {
|
||||
if (App::wnd()) {
|
||||
if (wParam == SIZE_MAXIMIZED || wParam == SIZE_RESTORED || wParam == SIZE_MINIMIZED) {
|
||||
if (wParam != SIZE_RESTORED || App::wnd()->windowState() != Qt::WindowNoState) {
|
||||
Qt::WindowState state = Qt::WindowNoState;
|
||||
if (wParam == SIZE_MAXIMIZED) {
|
||||
state = Qt::WindowMaximized;
|
||||
} else if (wParam == SIZE_MINIMIZED) {
|
||||
state = Qt::WindowMinimized;
|
||||
}
|
||||
emit App::wnd()->windowHandle()->windowStateChanged(state);
|
||||
} else {
|
||||
App::wnd()->psUpdatedPosition();
|
||||
}
|
||||
App::wnd()->psUpdateMargins();
|
||||
MainWindow::ShadowsChanges changes = (wParam == SIZE_MINIMIZED || wParam == SIZE_MAXIMIZED) ? ShadowsChange::Hidden : (ShadowsChange::Resized | ShadowsChange::Shown);
|
||||
App::wnd()->shadowsUpdate(changes);
|
||||
}
|
||||
}
|
||||
} return false;
|
||||
|
||||
case WM_SHOWWINDOW: {
|
||||
LONG style = GetWindowLong(hWnd, GWL_STYLE);
|
||||
auto changes = ShadowsChange::Resized | ((wParam && !(style & (WS_MAXIMIZE | WS_MINIMIZE))) ? ShadowsChange::Shown : ShadowsChange::Hidden);
|
||||
App::wnd()->shadowsUpdate(changes);
|
||||
} return false;
|
||||
|
||||
case WM_MOVE: {
|
||||
App::wnd()->shadowsUpdate(ShadowsChange::Moved);
|
||||
App::wnd()->psUpdatedPosition();
|
||||
} return false;
|
||||
|
||||
case WM_NCHITTEST: {
|
||||
POINTS p = MAKEPOINTS(lParam);
|
||||
RECT r;
|
||||
GetWindowRect(hWnd, &r);
|
||||
HitTestType res = App::wnd()->hitTest(QPoint(p.x - r.left + App::wnd()->deltaLeft(), p.y - r.top + App::wnd()->deltaTop()));
|
||||
switch (res) {
|
||||
case HitTestClient:
|
||||
case HitTestSysButton: *result = HTCLIENT; break;
|
||||
case HitTestIcon: *result = HTCAPTION; break;
|
||||
case HitTestCaption: *result = HTCAPTION; break;
|
||||
case HitTestTop: *result = HTTOP; break;
|
||||
case HitTestTopRight: *result = HTTOPRIGHT; break;
|
||||
case HitTestRight: *result = HTRIGHT; break;
|
||||
case HitTestBottomRight: *result = HTBOTTOMRIGHT; break;
|
||||
case HitTestBottom: *result = HTBOTTOM; break;
|
||||
case HitTestBottomLeft: *result = HTBOTTOMLEFT; break;
|
||||
case HitTestLeft: *result = HTLEFT; break;
|
||||
case HitTestTopLeft: *result = HTTOPLEFT; break;
|
||||
case HitTestNone:
|
||||
default: *result = HTTRANSPARENT; break;
|
||||
};
|
||||
} return true;
|
||||
|
||||
case WM_NCRBUTTONUP: {
|
||||
SendMessage(hWnd, WM_SYSCOMMAND, SC_MOUSEMENU, lParam);
|
||||
} return true;
|
||||
|
||||
case WM_NCLBUTTONDOWN: {
|
||||
POINTS p = MAKEPOINTS(lParam);
|
||||
RECT r;
|
||||
GetWindowRect(hWnd, &r);
|
||||
HitTestType res = App::wnd()->hitTest(QPoint(p.x - r.left + App::wnd()->deltaLeft(), p.y - r.top + App::wnd()->deltaTop()));
|
||||
switch (res) {
|
||||
case HitTestIcon:
|
||||
if (menuHidden && getms() < menuHidden + 10) {
|
||||
menuHidden = 0;
|
||||
if (getms() < menuShown + GetDoubleClickTime()) {
|
||||
App::wnd()->close();
|
||||
}
|
||||
} else {
|
||||
QRect icon = App::wnd()->iconRect();
|
||||
p.x = r.left - App::wnd()->deltaLeft() + icon.left();
|
||||
p.y = r.top - App::wnd()->deltaTop() + icon.top() + icon.height();
|
||||
App::wnd()->psUpdateSysMenu(App::wnd()->windowHandle()->windowState());
|
||||
menuShown = getms();
|
||||
menuHidden = 0;
|
||||
TrackPopupMenu(App::wnd()->psMenu(), TPM_LEFTALIGN | TPM_TOPALIGN | TPM_LEFTBUTTON, p.x, p.y, 0, hWnd, 0);
|
||||
menuHidden = getms();
|
||||
}
|
||||
return true;
|
||||
};
|
||||
} return false;
|
||||
|
||||
case WM_NCLBUTTONDBLCLK: {
|
||||
POINTS p = MAKEPOINTS(lParam);
|
||||
RECT r;
|
||||
GetWindowRect(hWnd, &r);
|
||||
HitTestType res = App::wnd()->hitTest(QPoint(p.x - r.left + App::wnd()->deltaLeft(), p.y - r.top + App::wnd()->deltaTop()));
|
||||
switch (res) {
|
||||
case HitTestIcon: App::wnd()->close(); return true;
|
||||
};
|
||||
} return false;
|
||||
|
||||
case WM_SYSCOMMAND: {
|
||||
if (wParam == SC_MOUSEMENU) {
|
||||
POINTS p = MAKEPOINTS(lParam);
|
||||
App::wnd()->psUpdateSysMenu(App::wnd()->windowHandle()->windowState());
|
||||
TrackPopupMenu(App::wnd()->psMenu(), TPM_LEFTALIGN | TPM_TOPALIGN | TPM_LEFTBUTTON, p.x, p.y, 0, hWnd, 0);
|
||||
}
|
||||
} return false;
|
||||
|
||||
case WM_COMMAND: {
|
||||
if (HIWORD(wParam)) return false;
|
||||
int cmd = LOWORD(wParam);
|
||||
switch (cmd) {
|
||||
case SC_CLOSE: App::wnd()->close(); return true;
|
||||
case SC_MINIMIZE: App::wnd()->setWindowState(Qt::WindowMinimized); return true;
|
||||
case SC_MAXIMIZE: App::wnd()->setWindowState(Qt::WindowMaximized); return true;
|
||||
case SC_RESTORE: App::wnd()->setWindowState(Qt::WindowNoState); return true;
|
||||
}
|
||||
} return true;
|
||||
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
} // namespace Platform
|
51
Telegram/SourceFiles/platform/win/windows_event_filter.h
Normal file
|
@ -0,0 +1,51 @@
|
|||
/*
|
||||
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
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
#include <windows.h>
|
||||
|
||||
namespace Platform {
|
||||
|
||||
class EventFilter : public QAbstractNativeEventFilter {
|
||||
public:
|
||||
bool nativeEventFilter(const QByteArray &eventType, void *message, long *result);
|
||||
bool mainWindowEvent(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, LRESULT *result);
|
||||
|
||||
bool sessionLoggedOff() const {
|
||||
return _sessionLoggedOff;
|
||||
}
|
||||
void setSessionLoggedOff(bool loggedOff) {
|
||||
_sessionLoggedOff = loggedOff;
|
||||
}
|
||||
|
||||
static EventFilter *createInstance();
|
||||
static EventFilter *getInstance();
|
||||
static void destroy();
|
||||
|
||||
private:
|
||||
EventFilter() {
|
||||
}
|
||||
|
||||
bool _sessionLoggedOff = false;
|
||||
|
||||
};
|
||||
|
||||
} // namespace Platform
|
554
Telegram/SourceFiles/platform/win/windows_toasts.cpp
Normal file
|
@ -0,0 +1,554 @@
|
|||
/*
|
||||
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/win/windows_toasts.h"
|
||||
|
||||
#include "platform/win/windows_app_user_model_id.h"
|
||||
#include "platform/win/windows_dlls.h"
|
||||
#include "mainwindow.h"
|
||||
|
||||
#include <Shobjidl.h>
|
||||
#include <shellapi.h>
|
||||
|
||||
#include <roapi.h>
|
||||
#include <wrl\client.h>
|
||||
#include <wrl\implements.h>
|
||||
#include <windows.ui.notifications.h>
|
||||
|
||||
#include <strsafe.h>
|
||||
#include <intsafe.h>
|
||||
|
||||
HICON qt_pixmapToWinHICON(const QPixmap &);
|
||||
|
||||
using namespace Microsoft::WRL;
|
||||
using namespace ABI::Windows::UI::Notifications;
|
||||
using namespace ABI::Windows::Data::Xml::Dom;
|
||||
using namespace Windows::Foundation;
|
||||
|
||||
namespace Platform {
|
||||
namespace Toasts {
|
||||
namespace {
|
||||
|
||||
bool _supported = false;
|
||||
|
||||
ComPtr<IToastNotificationManagerStatics> _notificationManager;
|
||||
ComPtr<IToastNotifier> _notifier;
|
||||
ComPtr<IToastNotificationFactory> _notificationFactory;
|
||||
|
||||
struct NotificationPtr {
|
||||
NotificationPtr() {
|
||||
}
|
||||
NotificationPtr(const ComPtr<IToastNotification> &ptr) : p(ptr) {
|
||||
}
|
||||
ComPtr<IToastNotification> p;
|
||||
};
|
||||
using Notifications = QMap<PeerId, QMap<MsgId, NotificationPtr>>;
|
||||
Notifications _notifications;
|
||||
struct Image {
|
||||
uint64 until;
|
||||
QString path;
|
||||
};
|
||||
using Images = QMap<StorageKey, Image>;
|
||||
Images _images;
|
||||
bool _imageSavedFlag = false;
|
||||
|
||||
class StringReferenceWrapper {
|
||||
public:
|
||||
StringReferenceWrapper(_In_reads_(length) PCWSTR stringRef, _In_ UINT32 length) throw() {
|
||||
HRESULT hr = Dlls::WindowsCreateStringReference(stringRef, length, &_header, &_hstring);
|
||||
if (!SUCCEEDED(hr)) {
|
||||
RaiseException(static_cast<DWORD>(STATUS_INVALID_PARAMETER), EXCEPTION_NONCONTINUABLE, 0, nullptr);
|
||||
}
|
||||
}
|
||||
|
||||
~StringReferenceWrapper() {
|
||||
Dlls::WindowsDeleteString(_hstring);
|
||||
}
|
||||
|
||||
template <size_t N>
|
||||
StringReferenceWrapper(_In_reads_(N) wchar_t const (&stringRef)[N]) throw() {
|
||||
UINT32 length = N - 1;
|
||||
HRESULT hr = Dlls::WindowsCreateStringReference(stringRef, length, &_header, &_hstring);
|
||||
if (!SUCCEEDED(hr)) {
|
||||
RaiseException(static_cast<DWORD>(STATUS_INVALID_PARAMETER), EXCEPTION_NONCONTINUABLE, 0, nullptr);
|
||||
}
|
||||
}
|
||||
|
||||
template <size_t _>
|
||||
StringReferenceWrapper(_In_reads_(_) wchar_t(&stringRef)[_]) throw() {
|
||||
UINT32 length;
|
||||
HRESULT hr = SizeTToUInt32(wcslen(stringRef), &length);
|
||||
if (!SUCCEEDED(hr)) {
|
||||
RaiseException(static_cast<DWORD>(STATUS_INVALID_PARAMETER), EXCEPTION_NONCONTINUABLE, 0, nullptr);
|
||||
}
|
||||
|
||||
Dlls::WindowsCreateStringReference(stringRef, length, &_header, &_hstring);
|
||||
}
|
||||
|
||||
HSTRING Get() const throw() {
|
||||
return _hstring;
|
||||
}
|
||||
|
||||
private:
|
||||
HSTRING _hstring;
|
||||
HSTRING_HEADER _header;
|
||||
|
||||
};
|
||||
|
||||
template<class T>
|
||||
_Check_return_ __inline HRESULT _1_GetActivationFactory(_In_ HSTRING activatableClassId, _COM_Outptr_ T** factory) {
|
||||
return Dlls::RoGetActivationFactory(activatableClassId, IID_INS_ARGS(factory));
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
inline HRESULT wrap_GetActivationFactory(_In_ HSTRING activatableClassId, _Inout_ Details::ComPtrRef<T> factory) throw() {
|
||||
return _1_GetActivationFactory(activatableClassId, factory.ReleaseAndGetAddressOf());
|
||||
}
|
||||
|
||||
bool init() {
|
||||
if (QSysInfo::windowsVersion() < QSysInfo::WV_WINDOWS8) {
|
||||
return false;
|
||||
}
|
||||
if ((Dlls::SetCurrentProcessExplicitAppUserModelID == nullptr)
|
||||
|| (Dlls::PropVariantToString == nullptr)
|
||||
|| (Dlls::RoGetActivationFactory == nullptr)
|
||||
|| (Dlls::WindowsCreateStringReference == nullptr)
|
||||
|| (Dlls::WindowsDeleteString == nullptr)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!AppUserModelId::validateShortcut()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
auto appUserModelId = AppUserModelId::getId();
|
||||
if (!SUCCEEDED(Dlls::SetCurrentProcessExplicitAppUserModelID(appUserModelId))) {
|
||||
return false;
|
||||
}
|
||||
if (!SUCCEEDED(wrap_GetActivationFactory(StringReferenceWrapper(RuntimeClass_Windows_UI_Notifications_ToastNotificationManager).Get(), &_notificationManager))) {
|
||||
return false;
|
||||
}
|
||||
if (!SUCCEEDED(_notificationManager->CreateToastNotifierWithId(StringReferenceWrapper(appUserModelId, wcslen(appUserModelId)).Get(), &_notifier))) {
|
||||
return false;
|
||||
}
|
||||
if (!SUCCEEDED(wrap_GetActivationFactory(StringReferenceWrapper(RuntimeClass_Windows_UI_Notifications_ToastNotification).Get(), &_notificationFactory))) {
|
||||
return false;
|
||||
}
|
||||
QDir().mkpath(cWorkingDir() + qsl("tdata/temp"));
|
||||
return true;
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
void start() {
|
||||
_supported = init();
|
||||
}
|
||||
|
||||
bool supported() {
|
||||
return _supported;
|
||||
}
|
||||
|
||||
uint64 clearImages(uint64 ms) {
|
||||
uint64 result = 0;
|
||||
for (auto i = _images.begin(); i != _images.end();) {
|
||||
if (!i->until) {
|
||||
++i;
|
||||
continue;
|
||||
}
|
||||
if (i->until <= ms) {
|
||||
QFile(i->path).remove();
|
||||
i = _images.erase(i);
|
||||
} else {
|
||||
if (!result) {
|
||||
result = i->until;
|
||||
} else {
|
||||
accumulate_min(result, i->until);
|
||||
}
|
||||
++i;
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
void clearNotifies(PeerId peerId) {
|
||||
if (!_notifier) return;
|
||||
|
||||
if (peerId) {
|
||||
auto i = _notifications.find(peerId);
|
||||
if (i != _notifications.cend()) {
|
||||
auto temp = createAndSwap(i.value());
|
||||
_notifications.erase(i);
|
||||
|
||||
for (auto j = temp.cbegin(), e = temp.cend(); j != e; ++j) {
|
||||
_notifier->Hide(j->p.Get());
|
||||
}
|
||||
}
|
||||
} else {
|
||||
auto temp = createAndSwap(_notifications);
|
||||
for_const (auto ¬ifications, temp) {
|
||||
for_const (auto ¬ification, notifications) {
|
||||
_notifier->Hide(notification.p.Get());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void finish() {
|
||||
_notifications.clear();
|
||||
if (_notificationManager) _notificationManager.Reset();
|
||||
if (_notifier) _notifier.Reset();
|
||||
if (_notificationFactory) _notificationFactory.Reset();
|
||||
|
||||
if (_imageSavedFlag) {
|
||||
psDeleteDir(cWorkingDir() + qsl("tdata/temp"));
|
||||
}
|
||||
}
|
||||
|
||||
HRESULT SetNodeValueString(_In_ HSTRING inputString, _In_ IXmlNode *node, _In_ IXmlDocument *xml) {
|
||||
ComPtr<IXmlText> inputText;
|
||||
|
||||
HRESULT hr = xml->CreateTextNode(inputString, &inputText);
|
||||
if (!SUCCEEDED(hr)) return hr;
|
||||
ComPtr<IXmlNode> inputTextNode;
|
||||
|
||||
hr = inputText.As(&inputTextNode);
|
||||
if (!SUCCEEDED(hr)) return hr;
|
||||
|
||||
ComPtr<IXmlNode> pAppendedChild;
|
||||
return node->AppendChild(inputTextNode.Get(), &pAppendedChild);
|
||||
}
|
||||
|
||||
HRESULT SetAudioSilent(_In_ IXmlDocument *toastXml) {
|
||||
ComPtr<IXmlNodeList> nodeList;
|
||||
HRESULT hr = toastXml->GetElementsByTagName(StringReferenceWrapper(L"audio").Get(), &nodeList);
|
||||
if (!SUCCEEDED(hr)) return hr;
|
||||
|
||||
ComPtr<IXmlNode> audioNode;
|
||||
hr = nodeList->Item(0, &audioNode);
|
||||
if (!SUCCEEDED(hr)) return hr;
|
||||
|
||||
if (audioNode) {
|
||||
ComPtr<IXmlElement> audioElement;
|
||||
hr = audioNode.As(&audioElement);
|
||||
if (!SUCCEEDED(hr)) return hr;
|
||||
|
||||
hr = audioElement->SetAttribute(StringReferenceWrapper(L"silent").Get(), StringReferenceWrapper(L"true").Get());
|
||||
if (!SUCCEEDED(hr)) return hr;
|
||||
} else {
|
||||
ComPtr<IXmlElement> audioElement;
|
||||
hr = toastXml->CreateElement(StringReferenceWrapper(L"audio").Get(), &audioElement);
|
||||
if (!SUCCEEDED(hr)) return hr;
|
||||
|
||||
hr = audioElement->SetAttribute(StringReferenceWrapper(L"silent").Get(), StringReferenceWrapper(L"true").Get());
|
||||
if (!SUCCEEDED(hr)) return hr;
|
||||
|
||||
ComPtr<IXmlNode> audioNode;
|
||||
hr = audioElement.As(&audioNode);
|
||||
if (!SUCCEEDED(hr)) return hr;
|
||||
|
||||
ComPtr<IXmlNodeList> nodeList;
|
||||
hr = toastXml->GetElementsByTagName(StringReferenceWrapper(L"toast").Get(), &nodeList);
|
||||
if (!SUCCEEDED(hr)) return hr;
|
||||
|
||||
ComPtr<IXmlNode> toastNode;
|
||||
hr = nodeList->Item(0, &toastNode);
|
||||
if (!SUCCEEDED(hr)) return hr;
|
||||
|
||||
ComPtr<IXmlNode> appendedNode;
|
||||
hr = toastNode->AppendChild(audioNode.Get(), &appendedNode);
|
||||
}
|
||||
return hr;
|
||||
}
|
||||
|
||||
HRESULT SetImageSrc(_In_z_ const wchar_t *imagePath, _In_ IXmlDocument *toastXml) {
|
||||
wchar_t imageSrc[MAX_PATH] = L"file:///";
|
||||
HRESULT hr = StringCchCat(imageSrc, ARRAYSIZE(imageSrc), imagePath);
|
||||
if (!SUCCEEDED(hr)) return hr;
|
||||
|
||||
ComPtr<IXmlNodeList> nodeList;
|
||||
hr = toastXml->GetElementsByTagName(StringReferenceWrapper(L"image").Get(), &nodeList);
|
||||
if (!SUCCEEDED(hr)) return hr;
|
||||
|
||||
ComPtr<IXmlNode> imageNode;
|
||||
hr = nodeList->Item(0, &imageNode);
|
||||
if (!SUCCEEDED(hr)) return hr;
|
||||
|
||||
ComPtr<IXmlNamedNodeMap> attributes;
|
||||
hr = imageNode->get_Attributes(&attributes);
|
||||
if (!SUCCEEDED(hr)) return hr;
|
||||
|
||||
ComPtr<IXmlNode> srcAttribute;
|
||||
hr = attributes->GetNamedItem(StringReferenceWrapper(L"src").Get(), &srcAttribute);
|
||||
if (!SUCCEEDED(hr)) return hr;
|
||||
|
||||
return SetNodeValueString(StringReferenceWrapper(imageSrc).Get(), srcAttribute.Get(), toastXml);
|
||||
}
|
||||
|
||||
typedef ABI::Windows::Foundation::ITypedEventHandler<ToastNotification*, ::IInspectable *> DesktopToastActivatedEventHandler;
|
||||
typedef ABI::Windows::Foundation::ITypedEventHandler<ToastNotification*, ToastDismissedEventArgs*> DesktopToastDismissedEventHandler;
|
||||
typedef ABI::Windows::Foundation::ITypedEventHandler<ToastNotification*, ToastFailedEventArgs*> DesktopToastFailedEventHandler;
|
||||
|
||||
class ToastEventHandler : public Implements<DesktopToastActivatedEventHandler, DesktopToastDismissedEventHandler, DesktopToastFailedEventHandler> {
|
||||
public:
|
||||
|
||||
ToastEventHandler::ToastEventHandler(const PeerId &peer, MsgId msg) : _ref(1), _peerId(peer), _msgId(msg) {
|
||||
}
|
||||
~ToastEventHandler() {
|
||||
}
|
||||
|
||||
// DesktopToastActivatedEventHandler
|
||||
IFACEMETHODIMP Invoke(_In_ IToastNotification *sender, _In_ IInspectable* args) {
|
||||
auto i = _notifications.find(_peerId);
|
||||
if (i != _notifications.cend()) {
|
||||
i.value().remove(_msgId);
|
||||
if (i.value().isEmpty()) {
|
||||
_notifications.erase(i);
|
||||
}
|
||||
}
|
||||
if (App::wnd()) {
|
||||
History *history = App::history(_peerId);
|
||||
|
||||
App::wnd()->showFromTray();
|
||||
if (App::passcoded()) {
|
||||
App::wnd()->setInnerFocus();
|
||||
App::wnd()->notifyClear();
|
||||
} else {
|
||||
App::wnd()->hideSettings();
|
||||
bool tomsg = !history->peer->isUser() && (_msgId > 0);
|
||||
if (tomsg) {
|
||||
HistoryItem *item = App::histItemById(peerToChannel(_peerId), _msgId);
|
||||
if (!item || !item->mentionsMe()) {
|
||||
tomsg = false;
|
||||
}
|
||||
}
|
||||
Ui::showPeerHistory(history, tomsg ? _msgId : ShowAtUnreadMsgId);
|
||||
App::wnd()->notifyClear(history);
|
||||
}
|
||||
SetForegroundWindow(App::wnd()->psHwnd());
|
||||
}
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
// DesktopToastDismissedEventHandler
|
||||
IFACEMETHODIMP Invoke(_In_ IToastNotification *sender, _In_ IToastDismissedEventArgs *e) {
|
||||
ToastDismissalReason tdr;
|
||||
if (SUCCEEDED(e->get_Reason(&tdr))) {
|
||||
switch (tdr) {
|
||||
case ToastDismissalReason_ApplicationHidden:
|
||||
break;
|
||||
case ToastDismissalReason_UserCanceled:
|
||||
case ToastDismissalReason_TimedOut:
|
||||
default:
|
||||
auto i = _notifications.find(_peerId);
|
||||
if (i != _notifications.cend()) {
|
||||
i.value().remove(_msgId);
|
||||
if (i.value().isEmpty()) {
|
||||
_notifications.erase(i);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
// DesktopToastFailedEventHandler
|
||||
IFACEMETHODIMP Invoke(_In_ IToastNotification *sender, _In_ IToastFailedEventArgs *e) {
|
||||
auto i = _notifications.find(_peerId);
|
||||
if (i != _notifications.cend()) {
|
||||
i.value().remove(_msgId);
|
||||
if (i.value().isEmpty()) {
|
||||
_notifications.erase(i);
|
||||
}
|
||||
}
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
// IUnknown
|
||||
IFACEMETHODIMP_(ULONG) AddRef() {
|
||||
return InterlockedIncrement(&_ref);
|
||||
}
|
||||
|
||||
IFACEMETHODIMP_(ULONG) Release() {
|
||||
ULONG l = InterlockedDecrement(&_ref);
|
||||
if (l == 0) delete this;
|
||||
return l;
|
||||
}
|
||||
|
||||
IFACEMETHODIMP QueryInterface(_In_ REFIID riid, _COM_Outptr_ void **ppv) {
|
||||
if (IsEqualIID(riid, IID_IUnknown))
|
||||
*ppv = static_cast<IUnknown*>(static_cast<DesktopToastActivatedEventHandler*>(this));
|
||||
else if (IsEqualIID(riid, __uuidof(DesktopToastActivatedEventHandler)))
|
||||
*ppv = static_cast<DesktopToastActivatedEventHandler*>(this);
|
||||
else if (IsEqualIID(riid, __uuidof(DesktopToastDismissedEventHandler)))
|
||||
*ppv = static_cast<DesktopToastDismissedEventHandler*>(this);
|
||||
else if (IsEqualIID(riid, __uuidof(DesktopToastFailedEventHandler)))
|
||||
*ppv = static_cast<DesktopToastFailedEventHandler*>(this);
|
||||
else *ppv = nullptr;
|
||||
|
||||
if (*ppv) {
|
||||
reinterpret_cast<IUnknown*>(*ppv)->AddRef();
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
return E_NOINTERFACE;
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
ULONG _ref;
|
||||
PeerId _peerId;
|
||||
MsgId _msgId;
|
||||
};
|
||||
|
||||
QString getImage(const StorageKey &key, PeerData *peer) {
|
||||
uint64 ms = getms(true);
|
||||
auto i = _images.find(key);
|
||||
if (i != _images.cend()) {
|
||||
if (i->until) {
|
||||
i->until = ms + NotifyDeletePhotoAfter;
|
||||
if (App::wnd()) App::wnd()->psCleanNotifyPhotosIn(-NotifyDeletePhotoAfter);
|
||||
}
|
||||
} else {
|
||||
Image v;
|
||||
if (key.first) {
|
||||
v.until = ms + NotifyDeletePhotoAfter;
|
||||
if (App::wnd()) App::wnd()->psCleanNotifyPhotosIn(-NotifyDeletePhotoAfter);
|
||||
} else {
|
||||
v.until = 0;
|
||||
}
|
||||
v.path = cWorkingDir() + qsl("tdata/temp/") + QString::number(rand_value<uint64>(), 16) + qsl(".png");
|
||||
if (key.first || key.second) {
|
||||
peer->saveUserpic(v.path, st::notifyMacPhotoSize);
|
||||
} else {
|
||||
App::wnd()->iconLarge().save(v.path, "PNG");
|
||||
}
|
||||
i = _images.insert(key, v);
|
||||
_imageSavedFlag = true;
|
||||
}
|
||||
return i->path;
|
||||
}
|
||||
|
||||
bool create(PeerData *peer, int32 msgId, bool showpix, const QString &title, const QString &subtitle, const QString &msg) {
|
||||
if (!supported() || !_notificationManager || !_notifier || !_notificationFactory) return false;
|
||||
|
||||
ComPtr<IXmlDocument> toastXml;
|
||||
bool withSubtitle = !subtitle.isEmpty();
|
||||
|
||||
HRESULT hr = _notificationManager->GetTemplateContent(withSubtitle ? ToastTemplateType_ToastImageAndText04 : ToastTemplateType_ToastImageAndText02, &toastXml);
|
||||
if (!SUCCEEDED(hr)) return false;
|
||||
|
||||
hr = SetAudioSilent(toastXml.Get());
|
||||
if (!SUCCEEDED(hr)) return false;
|
||||
|
||||
StorageKey key;
|
||||
QString imagePath;
|
||||
if (showpix) {
|
||||
key = peer->userpicUniqueKey();
|
||||
} else {
|
||||
key = StorageKey(0, 0);
|
||||
}
|
||||
QString image = getImage(key, peer);
|
||||
std::wstring wimage = QDir::toNativeSeparators(image).toStdWString();
|
||||
|
||||
hr = SetImageSrc(wimage.c_str(), toastXml.Get());
|
||||
if (!SUCCEEDED(hr)) return false;
|
||||
|
||||
ComPtr<IXmlNodeList> nodeList;
|
||||
hr = toastXml->GetElementsByTagName(StringReferenceWrapper(L"text").Get(), &nodeList);
|
||||
if (!SUCCEEDED(hr)) return false;
|
||||
|
||||
UINT32 nodeListLength;
|
||||
hr = nodeList->get_Length(&nodeListLength);
|
||||
if (!SUCCEEDED(hr)) return false;
|
||||
|
||||
if (nodeListLength < (withSubtitle ? 3U : 2U)) return false;
|
||||
|
||||
{
|
||||
ComPtr<IXmlNode> textNode;
|
||||
hr = nodeList->Item(0, &textNode);
|
||||
if (!SUCCEEDED(hr)) return false;
|
||||
|
||||
std::wstring wtitle = title.toStdWString();
|
||||
hr = SetNodeValueString(StringReferenceWrapper(wtitle.data(), wtitle.size()).Get(), textNode.Get(), toastXml.Get());
|
||||
if (!SUCCEEDED(hr)) return false;
|
||||
}
|
||||
if (withSubtitle) {
|
||||
ComPtr<IXmlNode> textNode;
|
||||
hr = nodeList->Item(1, &textNode);
|
||||
if (!SUCCEEDED(hr)) return false;
|
||||
|
||||
std::wstring wsubtitle = subtitle.toStdWString();
|
||||
hr = SetNodeValueString(StringReferenceWrapper(wsubtitle.data(), wsubtitle.size()).Get(), textNode.Get(), toastXml.Get());
|
||||
if (!SUCCEEDED(hr)) return false;
|
||||
}
|
||||
{
|
||||
ComPtr<IXmlNode> textNode;
|
||||
hr = nodeList->Item(withSubtitle ? 2 : 1, &textNode);
|
||||
if (!SUCCEEDED(hr)) return false;
|
||||
|
||||
std::wstring wmsg = msg.toStdWString();
|
||||
hr = SetNodeValueString(StringReferenceWrapper(wmsg.data(), wmsg.size()).Get(), textNode.Get(), toastXml.Get());
|
||||
if (!SUCCEEDED(hr)) return false;
|
||||
}
|
||||
|
||||
ComPtr<IToastNotification> toast;
|
||||
hr = _notificationFactory->CreateToastNotification(toastXml.Get(), &toast);
|
||||
if (!SUCCEEDED(hr)) return false;
|
||||
|
||||
EventRegistrationToken activatedToken, dismissedToken, failedToken;
|
||||
ComPtr<ToastEventHandler> eventHandler(new ToastEventHandler(peer->id, msgId));
|
||||
|
||||
hr = toast->add_Activated(eventHandler.Get(), &activatedToken);
|
||||
if (!SUCCEEDED(hr)) return false;
|
||||
|
||||
hr = toast->add_Dismissed(eventHandler.Get(), &dismissedToken);
|
||||
if (!SUCCEEDED(hr)) return false;
|
||||
|
||||
hr = toast->add_Failed(eventHandler.Get(), &failedToken);
|
||||
if (!SUCCEEDED(hr)) return false;
|
||||
|
||||
auto i = _notifications.find(peer->id);
|
||||
if (i != _notifications.cend()) {
|
||||
auto j = i->find(msgId);
|
||||
if (j != i->cend()) {
|
||||
ComPtr<IToastNotification> notify = j->p;
|
||||
i->erase(j);
|
||||
_notifier->Hide(notify.Get());
|
||||
i = _notifications.find(peer->id);
|
||||
}
|
||||
}
|
||||
if (i == _notifications.cend()) {
|
||||
i = _notifications.insert(peer->id, QMap<MsgId, NotificationPtr>());
|
||||
}
|
||||
hr = _notifier->Show(toast.Get());
|
||||
if (!SUCCEEDED(hr)) {
|
||||
i = _notifications.find(peer->id);
|
||||
if (i != _notifications.cend() && i->isEmpty()) _notifications.erase(i);
|
||||
return false;
|
||||
}
|
||||
_notifications[peer->id].insert(msgId, toast);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
} // namespace Toasts
|
||||
} // namespace Platform
|
38
Telegram/SourceFiles/platform/win/windows_toasts.h
Normal file
|
@ -0,0 +1,38 @@
|
|||
/*
|
||||
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
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
namespace Platform {
|
||||
namespace Toasts {
|
||||
|
||||
void start();
|
||||
void finish();
|
||||
|
||||
bool supported();
|
||||
bool create(PeerData *peer, int32 msgId, bool showpix, const QString &title, const QString &subtitle, const QString &msg);
|
||||
|
||||
// Returns the next ms when clearImages() should be called.
|
||||
uint64 clearImages(uint64 ms);
|
||||
|
||||
void clearNotifies(PeerId peerId);
|
||||
|
||||
} // namespace Toasts
|
||||
} // namespace Platform
|
29
Telegram/SourceFiles/platform/winrt/main_window_winrt.cpp
Normal file
|
@ -0,0 +1,29 @@
|
|||
/*
|
||||
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/win/main_window_winrt.h"
|
||||
|
||||
namespace Platform {
|
||||
namespace {
|
||||
|
||||
} // namespace
|
||||
|
||||
} // namespace Platform
|
31
Telegram/SourceFiles/platform/winrt/main_window_winrt.h
Normal file
|
@ -0,0 +1,31 @@
|
|||
/*
|
||||
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
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
#include "window/main_window.h"
|
||||
|
||||
namespace Platform {
|
||||
|
||||
class MainWindow : public Window::MainWindow {
|
||||
|
||||
};
|
||||
|
||||
} // namespace Platform
|
|
@ -32,7 +32,7 @@ profileTopBarBackIconPosition: point(15px, 20px);
|
|||
profileTopBarBackFont: font(14px);
|
||||
profileTopBarBackFg: #1485c2;
|
||||
profileTopBarBackPosition: point(32px, 17px);
|
||||
profileFixedBarButton: BoxButton(topBarButton) {
|
||||
profileFixedBarButton: RoundButton(topBarButton) {
|
||||
}
|
||||
|
||||
profileMarginTop: 13px;
|
||||
|
@ -61,31 +61,18 @@ profileMarginBottom: 30px;
|
|||
profileButtonLeft: 27px;
|
||||
profileButtonTop: 88px;
|
||||
profileButtonSkip: 10px;
|
||||
profilePrimaryButton: BoxButton {
|
||||
textFg: #ffffff;
|
||||
textFgOver: #ffffff;
|
||||
textBg: windowActiveBg;
|
||||
textBgOver: windowActiveBg;
|
||||
|
||||
width: -34px;
|
||||
height: 34px;
|
||||
padding: margins(0px, 0px, 0px, 0px);
|
||||
|
||||
textTop: 8px;
|
||||
|
||||
font: semiboldFont;
|
||||
duration: 200;
|
||||
profilePrimaryButton: RoundButton(defaultActiveButton) {
|
||||
}
|
||||
profileSecondaryButton: BoxButton(profilePrimaryButton) {
|
||||
textFg: #2b99d5;
|
||||
textFgOver: #2b99d5;
|
||||
profileSecondaryButton: RoundButton(profilePrimaryButton) {
|
||||
textFg: semiboldButtonBlueText;
|
||||
textFgOver: semiboldButtonBlueText;
|
||||
textBg: #ffffff;
|
||||
textBgOver: #f2f7fa;
|
||||
}
|
||||
profileAddMemberIcon: icon {
|
||||
{ "profile_add_member", windowActiveBg, point(20px, 10px) },
|
||||
};
|
||||
profileAddMemberButton: BoxButton(profileSecondaryButton) {
|
||||
profileAddMemberButton: RoundButton(profileSecondaryButton) {
|
||||
width: 62px;
|
||||
icon: profileAddMemberIcon;
|
||||
}
|
||||
|
@ -157,7 +144,7 @@ profileMemberStatusFg: windowSubTextFg;
|
|||
profileMemberStatusFgOver: windowSubTextFgOver;
|
||||
profileMemberStatusFgActive: windowActiveTextFg;
|
||||
profileMemberAdminIcon: icon {
|
||||
{ "profile_admin_star", #3babe7, point(4px, 2px) },
|
||||
{ "profile_admin_star", #3babe7, point(4px, 3px) },
|
||||
};
|
||||
profileLimitReachedLabel: flatLabel(labelDefFlat) {
|
||||
width: 180px;
|
||||
|
|
|
@ -25,29 +25,30 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org
|
|||
|
||||
namespace Profile {
|
||||
|
||||
BlockWidget::BlockWidget(QWidget *parent, PeerData *peer, const QString &title) : TWidget(parent)
|
||||
BlockWidget::BlockWidget(QWidget *parent, PeerData *peer, const QString &title) : ScrolledWidget(parent)
|
||||
, _peer(peer)
|
||||
, _title(title) {
|
||||
}
|
||||
|
||||
void BlockWidget::resizeToWidth(int newWidth) {
|
||||
resize(newWidth, resizeGetHeight(newWidth));
|
||||
}
|
||||
|
||||
int BlockWidget::contentTop() const {
|
||||
return st::profileBlockMarginTop + st::profileBlockTitleHeight;
|
||||
return emptyTitle() ? 0 : (st::profileBlockMarginTop + st::profileBlockTitleHeight);
|
||||
}
|
||||
|
||||
void BlockWidget::paintEvent(QPaintEvent *e) {
|
||||
Painter p(this);
|
||||
|
||||
paintTitle(p);
|
||||
paintContents(p);
|
||||
}
|
||||
|
||||
void BlockWidget::paintTitle(Painter &p) {
|
||||
if (emptyTitle()) return;
|
||||
|
||||
p.setFont(st::profileBlockTitleFont);
|
||||
p.setPen(st::profileBlockTitleFg);
|
||||
int titleLeft = st::profileBlockTitlePosition.x();
|
||||
int titleTop = st::profileBlockMarginTop + st::profileBlockTitlePosition.y();
|
||||
p.drawTextLeft(titleLeft, titleTop, width(), _title);
|
||||
|
||||
paintContents(p);
|
||||
}
|
||||
|
||||
int defaultOutlineButtonLeft() {
|
||||
|
|
|
@ -24,25 +24,12 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org
|
|||
|
||||
namespace Profile {
|
||||
|
||||
class BlockWidget : public TWidget, public Notify::Observer {
|
||||
class BlockWidget : public ScrolledWidget, public Notify::Observer {
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
BlockWidget(QWidget *parent, PeerData *peer, const QString &title);
|
||||
|
||||
// Count new height for width=newWidth and resize to it.
|
||||
void resizeToWidth(int newWidth);
|
||||
|
||||
// Updates the area that is visible inside the scroll container.
|
||||
virtual void setVisibleTopBottom(int visibleTop, int visibleBottom) {
|
||||
}
|
||||
|
||||
virtual ~BlockWidget() {
|
||||
}
|
||||
|
||||
signals:
|
||||
void heightUpdated();
|
||||
|
||||
protected:
|
||||
void paintEvent(QPaintEvent *e) override;
|
||||
virtual void paintContents(Painter &p) {
|
||||
|
@ -52,7 +39,7 @@ protected:
|
|||
int contentTop() const;
|
||||
|
||||
// Resizes content and counts natural widget height for the desired width.
|
||||
virtual int resizeGetHeight(int newWidth) = 0;
|
||||
int resizeGetHeight(int newWidth) override = 0;
|
||||
|
||||
void contentSizeUpdated() {
|
||||
resizeToWidth(width());
|
||||
|
@ -63,7 +50,13 @@ protected:
|
|||
return _peer;
|
||||
}
|
||||
|
||||
bool emptyTitle() const {
|
||||
return _title.isEmpty();
|
||||
}
|
||||
|
||||
private:
|
||||
void paintTitle(Painter &p);
|
||||
|
||||
PeerData *_peer;
|
||||
QString _title;
|
||||
|
||||
|
|
|
@ -26,6 +26,8 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org
|
|||
#include "profile/profile_userpic_button.h"
|
||||
#include "ui/buttons/round_button.h"
|
||||
#include "ui/filedialog.h"
|
||||
#include "ui/flatlabel.h"
|
||||
#include "ui/flatbutton.h"
|
||||
#include "observer_peer.h"
|
||||
#include "boxes/confirmbox.h"
|
||||
#include "boxes/contactsbox.h"
|
||||
|
@ -34,12 +36,14 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org
|
|||
#include "apiwrap.h"
|
||||
#include "mainwidget.h"
|
||||
#include "mainwindow.h"
|
||||
#include "application.h"
|
||||
|
||||
namespace Profile {
|
||||
namespace {
|
||||
|
||||
using UpdateFlag = Notify::PeerUpdate::Flag;
|
||||
const auto ButtonsUpdateFlags = UpdateFlag::UserCanShareContact
|
||||
| UpdateFlag::BotCanAddToGroups
|
||||
| UpdateFlag::ChatCanEdit
|
||||
| UpdateFlag::ChannelCanEditPhoto
|
||||
| UpdateFlag::ChannelCanAddMembers
|
||||
|
@ -58,8 +62,8 @@ CoverWidget::CoverWidget(QWidget *parent, PeerData *peer) : TWidget(parent)
|
|||
setAttribute(Qt::WA_OpaquePaintEvent);
|
||||
setAcceptDrops(true);
|
||||
|
||||
_name.setSelectable(true);
|
||||
_name.setContextCopyText(lang(lng_profile_copy_fullname));
|
||||
_name->setSelectable(true);
|
||||
_name->setContextCopyText(lang(lng_profile_copy_fullname));
|
||||
|
||||
auto observeEvents = ButtonsUpdateFlags
|
||||
| UpdateFlag::NameChanged
|
||||
|
@ -67,6 +71,9 @@ CoverWidget::CoverWidget(QWidget *parent, PeerData *peer) : TWidget(parent)
|
|||
Notify::registerPeerObserver(observeEvents, this, &CoverWidget::notifyPeerUpdated);
|
||||
FileDialog::registerObserver(this, &CoverWidget::notifyFileQueryUpdated);
|
||||
|
||||
connect(App::app(), SIGNAL(peerPhotoDone(PeerId)), this, SLOT(onPhotoUploadStatusChanged(PeerId)));
|
||||
connect(App::app(), SIGNAL(peerPhotoFail(PeerId)), this, SLOT(onPhotoUploadStatusChanged(PeerId)));
|
||||
|
||||
connect(_userpicButton, SIGNAL(clicked()), this, SLOT(onPhotoShow()));
|
||||
validatePhoto();
|
||||
|
||||
|
@ -91,6 +98,13 @@ void CoverWidget::onPhotoShow() {
|
|||
}
|
||||
}
|
||||
|
||||
void CoverWidget::onCancelPhotoUpload() {
|
||||
if (auto app = App::app()) {
|
||||
app->cancelPhotoUpdate(_peer->id);
|
||||
refreshStatusText();
|
||||
}
|
||||
}
|
||||
|
||||
int CoverWidget::countPhotoLeft(int newWidth) const {
|
||||
int result = st::profilePhotoLeftMin;
|
||||
result += (newWidth - st::wndMinWidth) / 2;
|
||||
|
@ -109,6 +123,9 @@ void CoverWidget::resizeToWidth(int newWidth) {
|
|||
|
||||
int infoLeft = _userpicButton->x() + _userpicButton->width();
|
||||
_statusPosition = QPoint(infoLeft + st::profileStatusLeft, _userpicButton->y() + st::profileStatusTop);
|
||||
if (_cancelPhotoUpload) {
|
||||
_cancelPhotoUpload->moveToLeft(_statusPosition.x() + st::profileStatusFont->width(_statusText) + st::profileStatusFont->spacew, _statusPosition.y());
|
||||
}
|
||||
|
||||
moveAndToggleButtons(newWidth);
|
||||
|
||||
|
@ -134,8 +151,8 @@ void CoverWidget::refreshNameGeometry(int newWidth) {
|
|||
nameWidth -= st::profileVerifiedCheckPosition.x() + st::profileVerifiedCheck.width();
|
||||
}
|
||||
int marginsAdd = st::profileNameLabel.margin.left() + st::profileNameLabel.margin.right();
|
||||
_name.resizeToWidth(qMin(nameWidth - marginsAdd, _name.naturalWidth()) + marginsAdd);
|
||||
_name.moveToLeft(nameLeft, nameTop);
|
||||
_name->resizeToWidth(qMin(nameWidth - marginsAdd, _name->naturalWidth()) + marginsAdd);
|
||||
_name->moveToLeft(nameLeft, nameTop);
|
||||
}
|
||||
|
||||
// A more generic solution would be allowing an optional icon button
|
||||
|
@ -187,7 +204,7 @@ void CoverWidget::paintEvent(QPaintEvent *e) {
|
|||
p.drawTextLeft(_statusPosition.x(), _statusPosition.y(), width(), _statusText);
|
||||
|
||||
if (_peer->isVerified()) {
|
||||
st::profileVerifiedCheck.paint(p, QPoint(_name.x() + _name.width(), _name.y()) + st::profileVerifiedCheckPosition, width());
|
||||
st::profileVerifiedCheck.paint(p, QPoint(_name->x() + _name->width(), _name->y()) + st::profileVerifiedCheckPosition, width());
|
||||
}
|
||||
|
||||
paintDivider(p);
|
||||
|
@ -321,11 +338,26 @@ void CoverWidget::notifyPeerUpdated(const Notify::PeerUpdate &update) {
|
|||
}
|
||||
|
||||
void CoverWidget::refreshNameText() {
|
||||
_name.setText(App::peerName(_peer));
|
||||
_name->setText(App::peerName(_peer));
|
||||
refreshNameGeometry(width());
|
||||
}
|
||||
|
||||
void CoverWidget::refreshStatusText() {
|
||||
if (auto app = App::app()) {
|
||||
if (app->isPhotoUpdating(_peer->id)) {
|
||||
_statusText = lang(lng_settings_uploading_photo);
|
||||
if (!_cancelPhotoUpload) {
|
||||
_cancelPhotoUpload = new LinkButton(this, lang(lng_cancel), st::btnDefLink);
|
||||
connect(_cancelPhotoUpload, SIGNAL(clicked()), this, SLOT(onCancelPhotoUpload()));
|
||||
_cancelPhotoUpload->show();
|
||||
_cancelPhotoUpload->moveToLeft(_statusPosition.x() + st::profileStatusFont->width(_statusText) + st::profileStatusFont->spacew, _statusPosition.y());
|
||||
}
|
||||
update();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
_cancelPhotoUpload.destroy();
|
||||
int currentTime = unixtime();
|
||||
if (_peerUser) {
|
||||
_statusText = App::onlineText(_peerUser, currentTime, true);
|
||||
|
@ -368,7 +400,9 @@ void CoverWidget::refreshButtons() {
|
|||
|
||||
void CoverWidget::setUserButtons() {
|
||||
addButton(lang(lng_profile_send_message), SLOT(onSendMessage()));
|
||||
if (_peerUser->canShareThisContact()) {
|
||||
if (_peerUser->botInfo && !_peerUser->botInfo->cantJoinGroups) {
|
||||
addButton(lang(lng_profile_invite_to_group), SLOT(onAddBotToGroup()), &st::profileAddMemberButton);
|
||||
} else if (_peerUser->canShareThisContact()) {
|
||||
addButton(lang(lng_profile_share_contact), SLOT(onShareContact()));
|
||||
}
|
||||
}
|
||||
|
@ -411,7 +445,7 @@ void CoverWidget::clearButtons() {
|
|||
}
|
||||
}
|
||||
|
||||
void CoverWidget::addButton(const QString &text, const char *slot, const style::BoxButton *replacementStyle) {
|
||||
void CoverWidget::addButton(const QString &text, const char *slot, const style::RoundButton *replacementStyle) {
|
||||
auto &buttonStyle = _buttons.isEmpty() ? st::profilePrimaryButton : st::profileSecondaryButton;
|
||||
auto button = new Ui::RoundButton(this, text, buttonStyle);
|
||||
button->setTextTransform(Ui::RoundButton::TextTransform::ToUpper);
|
||||
|
@ -474,10 +508,16 @@ void CoverWidget::showSetPhotoBox(const QImage &img) {
|
|||
}
|
||||
|
||||
auto box = new PhotoCropBox(img, _peer);
|
||||
connect(box, SIGNAL(closed()), this, SLOT(onPhotoUpdateStart()));
|
||||
connect(box, SIGNAL(closed()), this, SLOT(onPhotoUploadStatusChanged()));
|
||||
Ui::showLayer(box);
|
||||
}
|
||||
|
||||
void CoverWidget::onPhotoUploadStatusChanged(PeerId peerId) {
|
||||
if (!peerId || peerId == _peer->id) {
|
||||
refreshStatusText();
|
||||
}
|
||||
}
|
||||
|
||||
void CoverWidget::onAddMember() {
|
||||
if (_peerChat) {
|
||||
if (_peerChat->count >= Global::ChatSizeMax() && _peerChat->amCreator()) {
|
||||
|
@ -494,6 +534,12 @@ void CoverWidget::onAddMember() {
|
|||
}
|
||||
}
|
||||
|
||||
void CoverWidget::onAddBotToGroup() {
|
||||
if (_peerUser && _peerUser->botInfo) {
|
||||
Ui::showLayer(new ContactsBox(_peerUser));
|
||||
}
|
||||
}
|
||||
|
||||
void CoverWidget::onJoin() {
|
||||
if (!_peerChannel) return;
|
||||
|
||||
|
|
|
@ -22,7 +22,9 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org
|
|||
|
||||
#include "core/observer.h"
|
||||
#include "ui/filedialog.h"
|
||||
#include "ui/flatlabel.h"
|
||||
|
||||
class FlatLabel;
|
||||
class LinkButton;
|
||||
|
||||
namespace Ui {
|
||||
class RoundButton;
|
||||
|
@ -59,11 +61,14 @@ public slots:
|
|||
|
||||
private slots:
|
||||
void onPhotoShow();
|
||||
void onPhotoUploadStatusChanged(PeerId peerId = 0);
|
||||
void onCancelPhotoUpload();
|
||||
|
||||
void onSendMessage();
|
||||
void onShareContact();
|
||||
void onSetPhoto();
|
||||
void onAddMember();
|
||||
void onAddBotToGroup();
|
||||
void onJoin();
|
||||
void onViewChannel();
|
||||
|
||||
|
@ -94,7 +99,7 @@ private:
|
|||
void setChannelButtons();
|
||||
|
||||
void clearButtons();
|
||||
void addButton(const QString &text, const char *slot, const style::BoxButton *replacementStyle = nullptr);
|
||||
void addButton(const QString &text, const char *slot, const style::RoundButton *replacementStyle = nullptr);
|
||||
|
||||
void paintDivider(Painter &p);
|
||||
|
||||
|
@ -113,7 +118,8 @@ private:
|
|||
ChildWidget<UserpicButton> _userpicButton;
|
||||
ChildWidget<CoverDropArea> _dropArea = { nullptr };
|
||||
|
||||
FlatLabel _name;
|
||||
ChildWidget<FlatLabel> _name;
|
||||
ChildWidget<LinkButton> _cancelPhotoUpload = { nullptr };
|
||||
|
||||
QPoint _statusPosition;
|
||||
QString _statusText;
|
||||
|
|
|
@ -37,7 +37,8 @@ namespace Profile {
|
|||
|
||||
using UpdateFlag = Notify::PeerUpdate::Flag;
|
||||
|
||||
MembersWidget::MembersWidget(QWidget *parent, PeerData *peer) : BlockWidget(parent, peer, lang(lng_profile_participants_section)) {
|
||||
MembersWidget::MembersWidget(QWidget *parent, PeerData *peer, TitleVisibility titleVisibility)
|
||||
: BlockWidget(parent, peer, (titleVisibility == TitleVisibility::Visible) ? lang(lng_profile_participants_section) : QString()) {
|
||||
setMouseTracking(true);
|
||||
|
||||
_removeWidth = st::normalFont->width(lang(lng_profile_kick));
|
||||
|
@ -193,10 +194,7 @@ void MembersWidget::mouseReleaseEvent(QMouseEvent *e) {
|
|||
if (pressed >= 0 && pressed < _list.size() && pressed == _selected && pressedKick == _selectedKick) {
|
||||
auto member = _list.at(pressed);
|
||||
if (pressedKick) {
|
||||
_kicking = member->user;
|
||||
ConfirmBox *box = new ConfirmBox(lng_profile_sure_kick(lt_user, _kicking->firstName), lang(lng_box_remove));
|
||||
connect(box, SIGNAL(confirmed()), this, SLOT(onKickConfirm()));
|
||||
Ui::showLayer(box);
|
||||
Ui::showLayer(new KickMemberBox(peer(), member->user));
|
||||
} else {
|
||||
Ui::showPeerProfile(member->user);
|
||||
}
|
||||
|
@ -309,7 +307,7 @@ void MembersWidget::refreshLimitReached() {
|
|||
auto chat = peer()->asChat();
|
||||
if (!chat) return;
|
||||
|
||||
bool limitReachedShown = (_list.size() >= Global::ChatSizeMax()) && chat->amCreator();
|
||||
bool limitReachedShown = (_list.size() >= Global::ChatSizeMax()) && chat->amCreator() && !emptyTitle();
|
||||
if (limitReachedShown && !_limitReachedInfo) {
|
||||
_limitReachedInfo = new FlatLabel(this, st::profileLimitReachedLabel, st::profileLimitReachedStyle);
|
||||
QString title = textRichPrepare(lng_profile_migrate_reached(lt_count, Global::ChatSizeMax()));
|
||||
|
@ -571,15 +569,6 @@ void MembersWidget::paintMember(Painter &p, int x, int y, Member *member, bool s
|
|||
p.drawTextLeft(x + st::profileMemberStatusPosition.x(), y + st::profileMemberStatusPosition.y(), width(), member->onlineText);
|
||||
}
|
||||
|
||||
void MembersWidget::onKickConfirm() {
|
||||
Ui::hideLayer();
|
||||
if (auto chat = peer()->asChat()) {
|
||||
App::main()->kickParticipant(chat, _kicking);
|
||||
} else if (auto channel = peer()->asChannel()) {
|
||||
App::api()->kickParticipant(channel, _kicking);
|
||||
}
|
||||
}
|
||||
|
||||
void MembersWidget::onUpdateOnlineDisplay() {
|
||||
if (_sortByOnline) {
|
||||
_now = unixtime();
|
||||
|
|
|
@ -38,7 +38,11 @@ class MembersWidget : public BlockWidget {
|
|||
Q_OBJECT
|
||||
|
||||
public:
|
||||
MembersWidget(QWidget *parent, PeerData *peer);
|
||||
enum class TitleVisibility {
|
||||
Visible,
|
||||
Hidden,
|
||||
};
|
||||
MembersWidget(QWidget *parent, PeerData *peer, TitleVisibility titleVisibility = TitleVisibility::Visible);
|
||||
|
||||
void setVisibleTopBottom(int visibleTop, int visibleBottom) override;
|
||||
int onlineCount() const {
|
||||
|
@ -57,11 +61,11 @@ protected:
|
|||
void mousePressEvent(QMouseEvent *e) override;
|
||||
void mouseReleaseEvent(QMouseEvent *e) override;
|
||||
void enterEvent(QEvent *e) override;
|
||||
void enterFromChildEvent(QEvent *e) override {
|
||||
void enterFromChildEvent(QEvent *e, QWidget *child) override {
|
||||
enterEvent(e);
|
||||
}
|
||||
void leaveEvent(QEvent *e) override;
|
||||
void leaveToChildEvent(QEvent *e) override {
|
||||
void leaveToChildEvent(QEvent *e, QWidget *child) override {
|
||||
leaveEvent(e);
|
||||
}
|
||||
|
||||
|
@ -69,7 +73,6 @@ signals:
|
|||
void onlineCountUpdated(int onlineCount);
|
||||
|
||||
private slots:
|
||||
void onKickConfirm();
|
||||
void onUpdateOnlineDisplay();
|
||||
|
||||
private:
|
||||
|
@ -135,7 +138,6 @@ private:
|
|||
int _pressed = -1;
|
||||
bool _selectedKick = false;
|
||||
bool _pressedKick = false;
|
||||
UserData *_kicking = nullptr;
|
||||
QPoint _mousePosition;
|
||||
|
||||
int _onlineCount = 0;
|
||||
|
|
|
@ -26,26 +26,23 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org
|
|||
|
||||
#ifdef Q_OS_MAC
|
||||
#include "pspecific_mac.h"
|
||||
#endif // Q_OS_MAC
|
||||
|
||||
#ifdef Q_OS_LINUX
|
||||
#elif defined Q_OS_LINUX // Q_OS_MAC
|
||||
#include "pspecific_linux.h"
|
||||
#endif // Q_OS_LINUX
|
||||
|
||||
#ifdef Q_OS_WINRT
|
||||
#elif defined Q_OS_WINRT // Q_OS_MAC || Q_OS_LINUX
|
||||
#include "pspecific_winrt.h"
|
||||
#elif defined Q_OS_WIN // Q_OS_WINRT
|
||||
#elif defined Q_OS_WIN // Q_OS_MAC || Q_OS_LINUX || Q_OS_WINRT
|
||||
#include "pspecific_win.h"
|
||||
#endif // Q_OS_WIN*
|
||||
#endif // Q_OS_MAC || Q_OS_LINUX || Q_OS_WINRT || Q_OS_WIN
|
||||
|
||||
namespace PlatformSpecific {
|
||||
namespace Platform {
|
||||
|
||||
void start();
|
||||
void finish();
|
||||
void start();
|
||||
void finish();
|
||||
|
||||
namespace ThirdParty {
|
||||
void start();
|
||||
void finish();
|
||||
}
|
||||
namespace ThirdParty {
|
||||
|
||||
}
|
||||
void start();
|
||||
void finish();
|
||||
|
||||
} // namespace ThirdParty
|
||||
} // namespace Platform
|
||||
|
|
|
@ -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,416 +73,8 @@ namespace {
|
|||
}
|
||||
};
|
||||
_PsEventFilter *_psEventFilter = 0;
|
||||
|
||||
UnityLauncherEntry *_psUnityLauncherEntry = 0;
|
||||
};
|
||||
|
||||
PsMainWindow::PsMainWindow(QWidget *parent) : QMainWindow(parent),
|
||||
posInited(false), trayIcon(0), trayIconMenu(0), icon256(qsl(":/gui/art/icon256.png")), iconbig256(icon256), wndIcon(QIcon::fromTheme("telegram", QIcon(QPixmap::fromImage(icon256, Qt::ColorOnly)))), _psCheckStatusIconLeft(100), _psLastIndicatorUpdate(0) {
|
||||
connect(&_psCheckStatusIconTimer, SIGNAL(timeout()), this, SLOT(psStatusIconCheck()));
|
||||
_psCheckStatusIconTimer.setSingleShot(false);
|
||||
|
||||
connect(&_psUpdateIndicatorTimer, SIGNAL(timeout()), this, SLOT(psUpdateIndicator()));
|
||||
_psUpdateIndicatorTimer.setSingleShot(true);
|
||||
}
|
||||
|
||||
bool PsMainWindow::psHasTrayIcon() const {
|
||||
return trayIcon || ((useAppIndicator || (useStatusIcon && trayIconChecked)) && (cWorkMode() != dbiwmWindowOnly));
|
||||
}
|
||||
|
||||
void PsMainWindow::psStatusIconCheck() {
|
||||
_trayIconCheck(0);
|
||||
if (cSupportTray() || !--_psCheckStatusIconLeft) {
|
||||
_psCheckStatusIconTimer.stop();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
void PsMainWindow::psShowTrayMenu() {
|
||||
}
|
||||
|
||||
void PsMainWindow::psRefreshTaskbarIcon() {
|
||||
}
|
||||
|
||||
void PsMainWindow::psTrayMenuUpdated() {
|
||||
if (noQtTrayIcon && (useAppIndicator || useStatusIcon)) {
|
||||
const QList<QAction*> &actions = trayIconMenu->actions();
|
||||
if (_trayItems.isEmpty()) {
|
||||
DEBUG_LOG(("Creating tray menu!"));
|
||||
for (int32 i = 0, l = actions.size(); i != l; ++i) {
|
||||
GtkWidget *item = ps_gtk_menu_item_new_with_label(actions.at(i)->text().toUtf8());
|
||||
ps_gtk_menu_shell_append(PS_GTK_MENU_SHELL(_trayMenu), item);
|
||||
ps_g_signal_connect(item, "activate", G_CALLBACK(_trayMenuCallback), this);
|
||||
ps_gtk_widget_show(item);
|
||||
ps_gtk_widget_set_sensitive(item, actions.at(i)->isEnabled());
|
||||
|
||||
_trayItems.push_back(qMakePair(item, actions.at(i)));
|
||||
}
|
||||
} else {
|
||||
DEBUG_LOG(("Updating tray menu!"));
|
||||
for (int32 i = 0, l = actions.size(); i != l; ++i) {
|
||||
if (i < _trayItems.size()) {
|
||||
ps_gtk_menu_item_set_label(reinterpret_cast<GtkMenuItem*>(_trayItems.at(i).first), actions.at(i)->text().toUtf8());
|
||||
ps_gtk_widget_set_sensitive(_trayItems.at(i).first, actions.at(i)->isEnabled());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void PsMainWindow::psSetupTrayIcon() {
|
||||
if (noQtTrayIcon) {
|
||||
if (!cSupportTray()) return;
|
||||
psUpdateCounter();
|
||||
} else {
|
||||
if (!trayIcon) {
|
||||
trayIcon = new QSystemTrayIcon(this);
|
||||
|
||||
QIcon icon(QPixmap::fromImage(App::wnd()->iconLarge(), Qt::ColorOnly));
|
||||
|
||||
trayIcon->setIcon(icon);
|
||||
trayIcon->setToolTip(str_const_toString(AppName));
|
||||
connect(trayIcon, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), this, SLOT(toggleTray(QSystemTrayIcon::ActivationReason)), Qt::UniqueConnection);
|
||||
connect(trayIcon, SIGNAL(messageClicked()), this, SLOT(showFromTray()));
|
||||
App::wnd()->updateTrayMenu();
|
||||
}
|
||||
psUpdateCounter();
|
||||
|
||||
trayIcon->show();
|
||||
psUpdateDelegate();
|
||||
}
|
||||
}
|
||||
|
||||
void PsMainWindow::psUpdateWorkmode() {
|
||||
if (!cSupportTray()) return;
|
||||
|
||||
if (cWorkMode() == dbiwmWindowOnly) {
|
||||
if (noQtTrayIcon) {
|
||||
if (useAppIndicator) {
|
||||
ps_app_indicator_set_status(_trayIndicator, APP_INDICATOR_STATUS_PASSIVE);
|
||||
} else if (useStatusIcon) {
|
||||
ps_gtk_status_icon_set_visible(_trayIcon, false);
|
||||
}
|
||||
} else {
|
||||
if (trayIcon) {
|
||||
trayIcon->setContextMenu(0);
|
||||
trayIcon->deleteLater();
|
||||
}
|
||||
trayIcon = 0;
|
||||
}
|
||||
} else {
|
||||
if (noQtTrayIcon) {
|
||||
if (useAppIndicator) {
|
||||
ps_app_indicator_set_status(_trayIndicator, APP_INDICATOR_STATUS_ACTIVE);
|
||||
} else if (useStatusIcon) {
|
||||
ps_gtk_status_icon_set_visible(_trayIcon, true);
|
||||
}
|
||||
} else {
|
||||
psSetupTrayIcon();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void PsMainWindow::psUpdateIndicator() {
|
||||
_psUpdateIndicatorTimer.stop();
|
||||
_psLastIndicatorUpdate = getms();
|
||||
QFileInfo f(_trayIconImageFile());
|
||||
if (f.exists()) {
|
||||
QByteArray path = QFile::encodeName(f.absoluteFilePath()), name = QFile::encodeName(f.fileName());
|
||||
name = name.mid(0, name.size() - 4);
|
||||
ps_app_indicator_set_icon_full(_trayIndicator, path.constData(), name);
|
||||
} else {
|
||||
useAppIndicator = false;
|
||||
}
|
||||
}
|
||||
|
||||
void PsMainWindow::psUpdateCounter() {
|
||||
setWindowIcon(wndIcon);
|
||||
|
||||
int32 counter = App::histories().unreadBadge();
|
||||
|
||||
setWindowTitle((counter > 0) ? qsl("Telegram (%1)").arg(counter) : qsl("Telegram"));
|
||||
if (_psUnityLauncherEntry) {
|
||||
if (counter > 0) {
|
||||
ps_unity_launcher_entry_set_count(_psUnityLauncherEntry, (counter > 9999) ? 9999 : counter);
|
||||
ps_unity_launcher_entry_set_count_visible(_psUnityLauncherEntry, TRUE);
|
||||
} else {
|
||||
ps_unity_launcher_entry_set_count_visible(_psUnityLauncherEntry, FALSE);
|
||||
}
|
||||
}
|
||||
|
||||
if (noQtTrayIcon) {
|
||||
if (useAppIndicator) {
|
||||
if (getms() > _psLastIndicatorUpdate + 1000) {
|
||||
psUpdateIndicator();
|
||||
} else if (!_psUpdateIndicatorTimer.isActive()) {
|
||||
_psUpdateIndicatorTimer.start(100);
|
||||
}
|
||||
} else if (useStatusIcon && trayIconChecked) {
|
||||
loadPixbuf(_trayIconImageGen());
|
||||
ps_gtk_status_icon_set_from_pixbuf(_trayIcon, _trayPixbuf);
|
||||
}
|
||||
} else if (trayIcon) {
|
||||
int32 counter = App::histories().unreadBadge();
|
||||
bool muted = App::histories().unreadOnlyMuted();
|
||||
|
||||
style::color bg = muted ? st::counterMuteBG : st::counterBG;
|
||||
QIcon iconSmall;
|
||||
iconSmall.addPixmap(QPixmap::fromImage(iconWithCounter(16, counter, bg, true), Qt::ColorOnly));
|
||||
iconSmall.addPixmap(QPixmap::fromImage(iconWithCounter(32, counter, bg, true), Qt::ColorOnly));
|
||||
trayIcon->setIcon(iconSmall);
|
||||
}
|
||||
}
|
||||
|
||||
void PsMainWindow::psUpdateDelegate() {
|
||||
}
|
||||
|
||||
void PsMainWindow::psInitSize() {
|
||||
setMinimumWidth(st::wndMinWidth);
|
||||
setMinimumHeight(st::wndMinHeight);
|
||||
|
||||
TWindowPos pos(cWindowPos());
|
||||
QRect avail(QDesktopWidget().availableGeometry());
|
||||
bool maximized = false;
|
||||
QRect geom(avail.x() + (avail.width() - st::wndDefWidth) / 2, avail.y() + (avail.height() - st::wndDefHeight) / 2, st::wndDefWidth, st::wndDefHeight);
|
||||
if (pos.w && pos.h) {
|
||||
QList<QScreen*> screens = Application::screens();
|
||||
for (QList<QScreen*>::const_iterator i = screens.cbegin(), e = screens.cend(); i != e; ++i) {
|
||||
QByteArray name = (*i)->name().toUtf8();
|
||||
if (pos.moncrc == hashCrc32(name.constData(), name.size())) {
|
||||
QRect screen((*i)->geometry());
|
||||
int32 w = screen.width(), h = screen.height();
|
||||
if (w >= st::wndMinWidth && h >= st::wndMinHeight) {
|
||||
if (pos.w > w) pos.w = w;
|
||||
if (pos.h > h) pos.h = h;
|
||||
pos.x += screen.x();
|
||||
pos.y += screen.y();
|
||||
if (pos.x < screen.x() + screen.width() - 10 && pos.y < screen.y() + screen.height() - 10) {
|
||||
geom = QRect(pos.x, pos.y, pos.w, pos.h);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (pos.y < 0) pos.y = 0;
|
||||
maximized = pos.maximized;
|
||||
}
|
||||
setGeometry(geom);
|
||||
}
|
||||
|
||||
void PsMainWindow::psInitFrameless() {
|
||||
psUpdatedPositionTimer.setSingleShot(true);
|
||||
connect(&psUpdatedPositionTimer, SIGNAL(timeout()), this, SLOT(psSavePosition()));
|
||||
|
||||
if (frameless) {
|
||||
//setWindowFlags(Qt::FramelessWindowHint);
|
||||
}
|
||||
}
|
||||
|
||||
void PsMainWindow::psSavePosition(Qt::WindowState state) {
|
||||
if (state == Qt::WindowActive) state = windowHandle()->windowState();
|
||||
if (state == Qt::WindowMinimized || !posInited) return;
|
||||
|
||||
TWindowPos pos(cWindowPos()), curPos = pos;
|
||||
|
||||
if (state == Qt::WindowMaximized) {
|
||||
curPos.maximized = 1;
|
||||
} else {
|
||||
QRect r(geometry());
|
||||
curPos.x = r.x();
|
||||
curPos.y = r.y();
|
||||
curPos.w = r.width();
|
||||
curPos.h = r.height();
|
||||
curPos.maximized = 0;
|
||||
}
|
||||
|
||||
int px = curPos.x + curPos.w / 2, py = curPos.y + curPos.h / 2, d = 0;
|
||||
QScreen *chosen = 0;
|
||||
QList<QScreen*> screens = Application::screens();
|
||||
for (QList<QScreen*>::const_iterator i = screens.cbegin(), e = screens.cend(); i != e; ++i) {
|
||||
int dx = (*i)->geometry().x() + (*i)->geometry().width() / 2 - px; if (dx < 0) dx = -dx;
|
||||
int dy = (*i)->geometry().y() + (*i)->geometry().height() / 2 - py; if (dy < 0) dy = -dy;
|
||||
if (!chosen || dx + dy < d) {
|
||||
d = dx + dy;
|
||||
chosen = *i;
|
||||
}
|
||||
}
|
||||
if (chosen) {
|
||||
curPos.x -= chosen->geometry().x();
|
||||
curPos.y -= chosen->geometry().y();
|
||||
QByteArray name = chosen->name().toUtf8();
|
||||
curPos.moncrc = hashCrc32(name.constData(), name.size());
|
||||
}
|
||||
|
||||
if (curPos.w >= st::wndMinWidth && curPos.h >= st::wndMinHeight) {
|
||||
if (curPos.x != pos.x || curPos.y != pos.y || curPos.w != pos.w || curPos.h != pos.h || curPos.moncrc != pos.moncrc || curPos.maximized != pos.maximized) {
|
||||
cSetWindowPos(curPos);
|
||||
Local::writeSettings();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void PsMainWindow::psUpdatedPosition() {
|
||||
psUpdatedPositionTimer.start(SaveWindowPositionTimeout);
|
||||
}
|
||||
|
||||
void PsMainWindow::psCreateTrayIcon() {
|
||||
if (!noQtTrayIcon) {
|
||||
cSetSupportTray(QSystemTrayIcon::isSystemTrayAvailable());
|
||||
return;
|
||||
}
|
||||
|
||||
if (useAppIndicator) {
|
||||
DEBUG_LOG(("Trying to create AppIndicator"));
|
||||
_trayMenu = ps_gtk_menu_new();
|
||||
if (_trayMenu) {
|
||||
DEBUG_LOG(("Created gtk menu for appindicator!"));
|
||||
QFileInfo f(_trayIconImageFile());
|
||||
if (f.exists()) {
|
||||
QByteArray path = QFile::encodeName(f.absoluteFilePath());
|
||||
_trayIndicator = ps_app_indicator_new("Telegram Desktop", path.constData(), APP_INDICATOR_CATEGORY_APPLICATION_STATUS);
|
||||
if (_trayIndicator) {
|
||||
DEBUG_LOG(("Created appindicator!"));
|
||||
} else {
|
||||
DEBUG_LOG(("Failed to app_indicator_new()!"));
|
||||
}
|
||||
} else {
|
||||
useAppIndicator = false;
|
||||
DEBUG_LOG(("Failed to create image file!"));
|
||||
}
|
||||
} else {
|
||||
DEBUG_LOG(("Failed to gtk_menu_new()!"));
|
||||
}
|
||||
if (_trayMenu && _trayIndicator) {
|
||||
ps_app_indicator_set_status(_trayIndicator, APP_INDICATOR_STATUS_ACTIVE);
|
||||
ps_app_indicator_set_menu(_trayIndicator, PS_GTK_MENU(_trayMenu));
|
||||
useStatusIcon = false;
|
||||
} else {
|
||||
DEBUG_LOG(("AppIndicator failed!"));
|
||||
useAppIndicator = false;
|
||||
}
|
||||
}
|
||||
if (useStatusIcon) {
|
||||
if (ps_gdk_init_check(0, 0)) {
|
||||
if (!_trayMenu) _trayMenu = ps_gtk_menu_new();
|
||||
if (_trayMenu) {
|
||||
loadPixbuf(_trayIconImageGen());
|
||||
_trayIcon = ps_gtk_status_icon_new_from_pixbuf(_trayPixbuf);
|
||||
if (_trayIcon) {
|
||||
ps_g_signal_connect(_trayIcon, "popup-menu", GCallback(_trayIconPopup), _trayMenu);
|
||||
ps_g_signal_connect(_trayIcon, "activate", GCallback(_trayIconActivate), _trayMenu);
|
||||
ps_g_signal_connect(_trayIcon, "size-changed", GCallback(_trayIconResized), _trayMenu);
|
||||
|
||||
ps_gtk_status_icon_set_title(_trayIcon, "Telegram Desktop");
|
||||
ps_gtk_status_icon_set_tooltip_text(_trayIcon, "Telegram Desktop");
|
||||
ps_gtk_status_icon_set_visible(_trayIcon, true);
|
||||
} else {
|
||||
useStatusIcon = false;
|
||||
}
|
||||
} else {
|
||||
useStatusIcon = false;
|
||||
}
|
||||
} else {
|
||||
useStatusIcon = false;
|
||||
}
|
||||
}
|
||||
if (!useStatusIcon && !useAppIndicator) {
|
||||
if (_trayMenu) {
|
||||
ps_g_object_ref_sink(_trayMenu);
|
||||
ps_g_object_unref(_trayMenu);
|
||||
_trayMenu = 0;
|
||||
}
|
||||
}
|
||||
cSetSupportTray(useAppIndicator);
|
||||
if (useStatusIcon) {
|
||||
ps_g_idle_add((GSourceFunc)_trayIconCheck, 0);
|
||||
_psCheckStatusIconTimer.start(100);
|
||||
} else {
|
||||
psUpdateWorkmode();
|
||||
}
|
||||
}
|
||||
|
||||
void PsMainWindow::psFirstShow() {
|
||||
psCreateTrayIcon();
|
||||
|
||||
if (useUnityCount) {
|
||||
_psUnityLauncherEntry = ps_unity_launcher_entry_get_for_desktop_id("telegramdesktop.desktop");
|
||||
if (_psUnityLauncherEntry) {
|
||||
LOG(("Found Unity Launcher entry telegramdesktop.desktop!"));
|
||||
} else {
|
||||
_psUnityLauncherEntry = ps_unity_launcher_entry_get_for_desktop_id("Telegram.desktop");
|
||||
if (_psUnityLauncherEntry) {
|
||||
LOG(("Found Unity Launcher entry Telegram.desktop!"));
|
||||
} else {
|
||||
LOG(("Could not get Unity Launcher entry!"));
|
||||
}
|
||||
}
|
||||
} else {
|
||||
LOG(("Not using Unity Launcher count."));
|
||||
}
|
||||
|
||||
finished = false;
|
||||
|
||||
psUpdateMargins();
|
||||
|
||||
bool showShadows = true;
|
||||
|
||||
show();
|
||||
//_private.enableShadow(winId());
|
||||
if (cWindowPos().maximized) {
|
||||
setWindowState(Qt::WindowMaximized);
|
||||
}
|
||||
|
||||
if ((cLaunchMode() == LaunchModeAutoStart && cStartMinimized()) || cStartInTray()) {
|
||||
setWindowState(Qt::WindowMinimized);
|
||||
if (cWorkMode() == dbiwmTrayOnly || cWorkMode() == dbiwmWindowAndTray) {
|
||||
hide();
|
||||
} else {
|
||||
show();
|
||||
}
|
||||
showShadows = false;
|
||||
} else {
|
||||
show();
|
||||
}
|
||||
|
||||
posInited = true;
|
||||
}
|
||||
|
||||
bool PsMainWindow::psHandleTitle() {
|
||||
return false;
|
||||
}
|
||||
|
||||
void PsMainWindow::psInitSysMenu() {
|
||||
}
|
||||
|
||||
void PsMainWindow::psUpdateSysMenu(Qt::WindowState state) {
|
||||
}
|
||||
|
||||
void PsMainWindow::psUpdateMargins() {
|
||||
}
|
||||
|
||||
void PsMainWindow::psFlash() {
|
||||
//_private.startBounce();
|
||||
}
|
||||
|
||||
PsMainWindow::~PsMainWindow() {
|
||||
if (_trayIcon) {
|
||||
ps_g_object_unref(_trayIcon);
|
||||
_trayIcon = 0;
|
||||
}
|
||||
if (_trayPixbuf) {
|
||||
ps_g_object_unref(_trayPixbuf);
|
||||
_trayPixbuf = 0;
|
||||
}
|
||||
if (_trayMenu) {
|
||||
ps_g_object_ref_sink(_trayMenu);
|
||||
ps_g_object_unref(_trayMenu);
|
||||
_trayMenu = 0;
|
||||
}
|
||||
finished = true;
|
||||
}
|
||||
|
||||
namespace {
|
||||
QRect _monitorRect;
|
||||
uint64 _monitorLastGot = 0;
|
||||
|
@ -927,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();
|
||||
|
@ -1235,36 +393,30 @@ void psShowInFolder(const QString &name) {
|
|||
system(("xdg-open " + escapeShell(QFile::encodeName(QFileInfo(name).absoluteDir().absolutePath()))).constData());
|
||||
}
|
||||
|
||||
namespace PlatformSpecific {
|
||||
|
||||
void start() {
|
||||
}
|
||||
|
||||
void finish() {
|
||||
delete _psEventFilter;
|
||||
_psEventFilter = 0;
|
||||
}
|
||||
|
||||
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();
|
||||
}
|
||||
|
||||
void finish() {
|
||||
}
|
||||
}
|
||||
namespace Platform {
|
||||
|
||||
void start() {
|
||||
}
|
||||
|
||||
void finish() {
|
||||
delete _psEventFilter;
|
||||
_psEventFilter = nullptr;
|
||||
}
|
||||
|
||||
namespace ThirdParty {
|
||||
|
||||
void start() {
|
||||
Libs::start();
|
||||
MainWindow::LibsLoaded();
|
||||
}
|
||||
|
||||
void finish() {
|
||||
}
|
||||
|
||||
} // namespace ThirdParty
|
||||
|
||||
} // namespace Platform
|
||||
|
||||
namespace {
|
||||
bool _psRunCommand(const QByteArray &command) {
|
||||
int result = system(command.constData());
|
||||
|
@ -1282,6 +434,7 @@ void psRegisterCustomScheme() {
|
|||
QString home(_psHomeDir());
|
||||
if (home.isEmpty() || cBetaVersion()) return; // don't update desktop file for beta version
|
||||
|
||||
#ifndef TDESKTOP_DISABLE_DESKTOP_FILE_GENERATION
|
||||
DEBUG_LOG(("App Info: placing .desktop file"));
|
||||
if (QDir(home + qsl(".local/")).exists()) {
|
||||
QString apps = home + qsl(".local/share/applications/");
|
||||
|
@ -1328,6 +481,7 @@ void psRegisterCustomScheme() {
|
|||
LOG(("App Error: Could not open '%1' for write").arg(file));
|
||||
}
|
||||
}
|
||||
#endif // TDESKTOP_DISABLE_DESKTOP_FILE_GENERATION
|
||||
|
||||
DEBUG_LOG(("App Info: registerting for Gnome"));
|
||||
if (_psRunCommand("gconftool-2 -t string -s /desktop/gnome/url-handlers/tg/command " + escapeShell(escapeShell(QFile::encodeName(cExeDir() + cExeName())) + " -- %s"))) {
|
||||
|
|
|
@ -30,89 +30,6 @@ inline void psCheckLocalSocket(const QString &serverName) {
|
|||
}
|
||||
}
|
||||
|
||||
class NotifyWindow;
|
||||
|
||||
class PsMainWindow : public QMainWindow {
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
PsMainWindow(QWidget *parent = 0);
|
||||
|
||||
int32 psResizeRowWidth() const {
|
||||
return 0;//st::wndResizeAreaWidth;
|
||||
}
|
||||
|
||||
void psInitFrameless();
|
||||
void psInitSize();
|
||||
|
||||
void psFirstShow();
|
||||
void psInitSysMenu();
|
||||
void psUpdateSysMenu(Qt::WindowState state);
|
||||
void psUpdateMargins();
|
||||
void psUpdatedPosition();
|
||||
|
||||
bool psHandleTitle();
|
||||
|
||||
void psFlash();
|
||||
void psNotifySettingGot();
|
||||
|
||||
void psUpdateWorkmode();
|
||||
|
||||
void psRefreshTaskbarIcon();
|
||||
|
||||
bool psPosInited() const {
|
||||
return posInited;
|
||||
}
|
||||
|
||||
void psActivateNotify(NotifyWindow *w);
|
||||
void psClearNotifies(PeerId peerId = 0);
|
||||
void psNotifyShown(NotifyWindow *w);
|
||||
void psPlatformNotify(HistoryItem *item, int32 fwdCount);
|
||||
|
||||
void psUpdateCounter();
|
||||
|
||||
bool psHasNativeNotifications() {
|
||||
return false;
|
||||
}
|
||||
|
||||
virtual QImage iconWithCounter(int size, int count, style::color bg, bool smallIcon) = 0;
|
||||
|
||||
~PsMainWindow();
|
||||
|
||||
public slots:
|
||||
|
||||
void psUpdateDelegate();
|
||||
void psSavePosition(Qt::WindowState state = Qt::WindowActive);
|
||||
void psShowTrayMenu();
|
||||
|
||||
void psStatusIconCheck();
|
||||
void psUpdateIndicator();
|
||||
|
||||
protected:
|
||||
|
||||
bool psHasTrayIcon() const;
|
||||
|
||||
bool posInited;
|
||||
QSystemTrayIcon *trayIcon;
|
||||
QMenu *trayIconMenu;
|
||||
QImage icon256, iconbig256;
|
||||
QIcon wndIcon;
|
||||
|
||||
void psTrayMenuUpdated();
|
||||
void psSetupTrayIcon();
|
||||
|
||||
QTimer psUpdatedPositionTimer;
|
||||
|
||||
private:
|
||||
void psCreateTrayIcon();
|
||||
|
||||
QTimer _psCheckStatusIconTimer;
|
||||
int _psCheckStatusIconLeft;
|
||||
|
||||
QTimer _psUpdateIndicatorTimer;
|
||||
uint64 _psLastIndicatorUpdate;
|
||||
};
|
||||
|
||||
void psWriteDump();
|
||||
QString psPrepareCrashDump(const QByteArray &crashdump, QString dumpfile);
|
||||
|
||||
|
|
|
@ -31,9 +31,6 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org
|
|||
namespace {
|
||||
QStringList _initLogs;
|
||||
|
||||
bool frameless = true;
|
||||
bool finished = true;
|
||||
|
||||
class _PsEventFilter : public QAbstractNativeEventFilter {
|
||||
public:
|
||||
_PsEventFilter() {
|
||||
|
@ -50,430 +47,6 @@ namespace {
|
|||
|
||||
};
|
||||
|
||||
void MacPrivate::activeSpaceChanged() {
|
||||
if (App::wnd()) {
|
||||
App::wnd()->notifyActivateAll();
|
||||
}
|
||||
}
|
||||
|
||||
void MacPrivate::darkModeChanged() {
|
||||
Notify::unreadCounterUpdated();
|
||||
}
|
||||
|
||||
void MacPrivate::notifyClicked(unsigned long long peer, int msgid) {
|
||||
History *history = App::history(PeerId(peer));
|
||||
|
||||
App::wnd()->showFromTray();
|
||||
if (App::passcoded()) {
|
||||
App::wnd()->setInnerFocus();
|
||||
App::wnd()->notifyClear();
|
||||
} else {
|
||||
App::wnd()->hideSettings();
|
||||
bool tomsg = !history->peer->isUser() && (msgid > 0);
|
||||
if (tomsg) {
|
||||
HistoryItem *item = App::histItemById(peerToChannel(PeerId(peer)), MsgId(msgid));
|
||||
if (!item || !item->mentionsMe()) {
|
||||
tomsg = false;
|
||||
}
|
||||
}
|
||||
Ui::showPeerHistory(history, tomsg ? msgid : ShowAtUnreadMsgId);
|
||||
App::wnd()->notifyClear(history);
|
||||
}
|
||||
}
|
||||
|
||||
void MacPrivate::notifyReplied(unsigned long long peer, int msgid, const char *str) {
|
||||
History *history = App::history(PeerId(peer));
|
||||
|
||||
MainWidget::MessageToSend message;
|
||||
message.history = history;
|
||||
message.textWithTags = { QString::fromUtf8(str), TextWithTags::Tags() };
|
||||
message.replyTo = (msgid > 0 && !history->peer->isUser()) ? msgid : 0;
|
||||
message.silent = false;
|
||||
message.clearDraft = false;
|
||||
App::main()->sendMessage(message);
|
||||
}
|
||||
|
||||
PsMainWindow::PsMainWindow(QWidget *parent) : QMainWindow(parent),
|
||||
posInited(false), trayIcon(0), trayIconMenu(0), icon256(qsl(":/gui/art/icon256.png")), iconbig256(qsl(":/gui/art/iconbig256.png")), wndIcon(QPixmap::fromImage(iconbig256, Qt::ColorOnly)),
|
||||
psLogout(0), psUndo(0), psRedo(0), psCut(0), psCopy(0), psPaste(0), psDelete(0), psSelectAll(0), psContacts(0), psAddContact(0), psNewGroup(0), psNewChannel(0), psShowTelegram(0) {
|
||||
QImage tray(qsl(":/gui/art/osxtray.png"));
|
||||
trayImg = tray.copy(0, cRetina() ? 0 : tray.width() / 2, tray.width() / (cRetina() ? 2 : 4), tray.width() / (cRetina() ? 2 : 4));
|
||||
trayImgSel = tray.copy(tray.width() / (cRetina() ? 2 : 4), cRetina() ? 0 : tray.width() / 2, tray.width() / (cRetina() ? 2 : 4), tray.width() / (cRetina() ? 2 : 4));
|
||||
}
|
||||
|
||||
QImage PsMainWindow::psTrayIcon(bool selected) const {
|
||||
return selected ? trayImgSel : trayImg;
|
||||
}
|
||||
|
||||
void PsMainWindow::psShowTrayMenu() {
|
||||
}
|
||||
|
||||
void PsMainWindow::psRefreshTaskbarIcon() {
|
||||
}
|
||||
|
||||
void PsMainWindow::psTrayMenuUpdated() {
|
||||
}
|
||||
|
||||
void PsMainWindow::psSetupTrayIcon() {
|
||||
if (!trayIcon) {
|
||||
trayIcon = new QSystemTrayIcon(this);
|
||||
|
||||
QIcon icon(QPixmap::fromImage(psTrayIcon(), Qt::ColorOnly));
|
||||
icon.addPixmap(QPixmap::fromImage(psTrayIcon(true), Qt::ColorOnly), QIcon::Selected);
|
||||
|
||||
trayIcon->setIcon(icon);
|
||||
trayIcon->setToolTip(str_const_toString(AppName));
|
||||
connect(trayIcon, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), this, SLOT(toggleTray(QSystemTrayIcon::ActivationReason)), Qt::UniqueConnection);
|
||||
App::wnd()->updateTrayMenu();
|
||||
}
|
||||
psUpdateCounter();
|
||||
|
||||
trayIcon->show();
|
||||
}
|
||||
|
||||
void PsMainWindow::psUpdateWorkmode() {
|
||||
psSetupTrayIcon();
|
||||
if (cWorkMode() == dbiwmWindowOnly) {
|
||||
if (trayIcon) {
|
||||
trayIcon->setContextMenu(0);
|
||||
delete trayIcon;
|
||||
}
|
||||
trayIcon = 0;
|
||||
}
|
||||
psUpdateDelegate();
|
||||
setWindowIcon(wndIcon);
|
||||
}
|
||||
|
||||
void _placeCounter(QImage &img, int size, int count, style::color bg, style::color color) {
|
||||
if (!count) return;
|
||||
|
||||
QPainter p(&img);
|
||||
QString cnt = (count < 100) ? QString("%1").arg(count) : QString("..%1").arg(count % 100, 2, 10, QChar('0'));
|
||||
int32 cntSize = cnt.size();
|
||||
|
||||
p.setBrush(bg->b);
|
||||
p.setPen(Qt::NoPen);
|
||||
p.setRenderHint(QPainter::Antialiasing);
|
||||
int32 fontSize, skip;
|
||||
if (size == 22) {
|
||||
skip = 1;
|
||||
fontSize = 8;
|
||||
} else {
|
||||
skip = 2;
|
||||
fontSize = 16;
|
||||
}
|
||||
style::font f(fontSize, 0, 0);
|
||||
int32 w = f->width(cnt), d, r;
|
||||
if (size == 22) {
|
||||
d = (cntSize < 2) ? 3 : 2;
|
||||
r = (cntSize < 2) ? 6 : 5;
|
||||
} else {
|
||||
d = (cntSize < 2) ? 6 : 5;
|
||||
r = (cntSize < 2) ? 9 : 11;
|
||||
}
|
||||
p.drawRoundedRect(QRect(size - w - d * 2 - skip, size - f->height - skip, w + d * 2, f->height), r, r);
|
||||
|
||||
p.setCompositionMode(QPainter::CompositionMode_Source);
|
||||
p.setFont(f->f);
|
||||
p.setPen(color->p);
|
||||
p.drawText(size - w - d - skip, size - f->height + f->ascent - skip, cnt);
|
||||
}
|
||||
|
||||
void PsMainWindow::psUpdateCounter() {
|
||||
int32 counter = App::histories().unreadBadge();
|
||||
|
||||
setWindowTitle((counter > 0) ? qsl("Telegram (%1)").arg(counter) : qsl("Telegram"));
|
||||
setWindowIcon(wndIcon);
|
||||
|
||||
QString cnt = (counter < 1000) ? QString("%1").arg(counter) : QString("..%1").arg(counter % 100, 2, 10, QChar('0'));
|
||||
_private.setWindowBadge(counter ? cnt : QString());
|
||||
|
||||
if (trayIcon) {
|
||||
bool muted = App::histories().unreadOnlyMuted();
|
||||
bool dm = objc_darkMode();
|
||||
|
||||
style::color bg = muted ? st::counterMuteBG : st::counterBG;
|
||||
QIcon icon;
|
||||
QImage img(psTrayIcon(dm)), imgsel(psTrayIcon(true));
|
||||
img.detach();
|
||||
imgsel.detach();
|
||||
int32 size = cRetina() ? 44 : 22;
|
||||
_placeCounter(img, size, counter, bg, (dm && muted) ? st::counterMacInvColor : st::counterColor);
|
||||
_placeCounter(imgsel, size, counter, st::white, st::counterMacInvColor);
|
||||
icon.addPixmap(QPixmap::fromImage(img, Qt::ColorOnly));
|
||||
icon.addPixmap(QPixmap::fromImage(imgsel, Qt::ColorOnly), QIcon::Selected);
|
||||
trayIcon->setIcon(icon);
|
||||
}
|
||||
}
|
||||
|
||||
void PsMainWindow::psUpdateDelegate() {
|
||||
_private.updateDelegate();
|
||||
}
|
||||
|
||||
void PsMainWindow::psInitSize() {
|
||||
setMinimumWidth(st::wndMinWidth);
|
||||
setMinimumHeight(st::wndMinHeight);
|
||||
|
||||
TWindowPos pos(cWindowPos());
|
||||
QRect avail(QDesktopWidget().availableGeometry());
|
||||
bool maximized = false;
|
||||
QRect geom(avail.x() + (avail.width() - st::wndDefWidth) / 2, avail.y() + (avail.height() - st::wndDefHeight) / 2, st::wndDefWidth, st::wndDefHeight);
|
||||
if (pos.w && pos.h) {
|
||||
QList<QScreen*> screens = Application::screens();
|
||||
for (QList<QScreen*>::const_iterator i = screens.cbegin(), e = screens.cend(); i != e; ++i) {
|
||||
QByteArray name = (*i)->name().toUtf8();
|
||||
if (pos.moncrc == hashCrc32(name.constData(), name.size())) {
|
||||
QRect screen((*i)->geometry());
|
||||
int32 w = screen.width(), h = screen.height();
|
||||
if (w >= st::wndMinWidth && h >= st::wndMinHeight) {
|
||||
if (pos.w > w) pos.w = w;
|
||||
if (pos.h > h) pos.h = h;
|
||||
pos.x += screen.x();
|
||||
pos.y += screen.y();
|
||||
if (pos.x < screen.x() + screen.width() - 10 && pos.y < screen.y() + screen.height() - 10) {
|
||||
geom = QRect(pos.x, pos.y, pos.w, pos.h);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (pos.y < 0) pos.y = 0;
|
||||
maximized = pos.maximized;
|
||||
}
|
||||
setGeometry(geom);
|
||||
}
|
||||
|
||||
void PsMainWindow::psInitFrameless() {
|
||||
psUpdatedPositionTimer.setSingleShot(true);
|
||||
connect(&psUpdatedPositionTimer, SIGNAL(timeout()), this, SLOT(psSavePosition()));
|
||||
|
||||
if (frameless) {
|
||||
//setWindowFlags(Qt::FramelessWindowHint);
|
||||
}
|
||||
}
|
||||
|
||||
void PsMainWindow::psSavePosition(Qt::WindowState state) {
|
||||
if (state == Qt::WindowActive) state = windowHandle()->windowState();
|
||||
if (state == Qt::WindowMinimized || !posInited) return;
|
||||
|
||||
TWindowPos pos(cWindowPos()), curPos = pos;
|
||||
|
||||
if (state == Qt::WindowMaximized) {
|
||||
curPos.maximized = 1;
|
||||
} else {
|
||||
QRect r(geometry());
|
||||
curPos.x = r.x();
|
||||
curPos.y = r.y();
|
||||
curPos.w = r.width();
|
||||
curPos.h = r.height();
|
||||
curPos.maximized = 0;
|
||||
}
|
||||
|
||||
int px = curPos.x + curPos.w / 2, py = curPos.y + curPos.h / 2, d = 0;
|
||||
QScreen *chosen = 0;
|
||||
QList<QScreen*> screens = Application::screens();
|
||||
for (QList<QScreen*>::const_iterator i = screens.cbegin(), e = screens.cend(); i != e; ++i) {
|
||||
int dx = (*i)->geometry().x() + (*i)->geometry().width() / 2 - px; if (dx < 0) dx = -dx;
|
||||
int dy = (*i)->geometry().y() + (*i)->geometry().height() / 2 - py; if (dy < 0) dy = -dy;
|
||||
if (!chosen || dx + dy < d) {
|
||||
d = dx + dy;
|
||||
chosen = *i;
|
||||
}
|
||||
}
|
||||
if (chosen) {
|
||||
curPos.x -= chosen->geometry().x();
|
||||
curPos.y -= chosen->geometry().y();
|
||||
QByteArray name = chosen->name().toUtf8();
|
||||
curPos.moncrc = hashCrc32(name.constData(), name.size());
|
||||
}
|
||||
|
||||
if (curPos.w >= st::wndMinWidth && curPos.h >= st::wndMinHeight) {
|
||||
if (curPos.x != pos.x || curPos.y != pos.y || curPos.w != pos.w || curPos.h != pos.h || curPos.moncrc != pos.moncrc || curPos.maximized != pos.maximized) {
|
||||
cSetWindowPos(curPos);
|
||||
Local::writeSettings();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void PsMainWindow::psUpdatedPosition() {
|
||||
psUpdatedPositionTimer.start(SaveWindowPositionTimeout);
|
||||
}
|
||||
|
||||
void PsMainWindow::psFirstShow() {
|
||||
finished = false;
|
||||
|
||||
psUpdateMargins();
|
||||
|
||||
bool showShadows = true;
|
||||
|
||||
show();
|
||||
_private.enableShadow(winId());
|
||||
if (cWindowPos().maximized) {
|
||||
setWindowState(Qt::WindowMaximized);
|
||||
}
|
||||
|
||||
if ((cLaunchMode() == LaunchModeAutoStart && cStartMinimized()) || cStartInTray()) {
|
||||
setWindowState(Qt::WindowMinimized);
|
||||
if (cWorkMode() == dbiwmTrayOnly || cWorkMode() == dbiwmWindowAndTray) {
|
||||
hide();
|
||||
} else {
|
||||
show();
|
||||
}
|
||||
showShadows = false;
|
||||
} else {
|
||||
show();
|
||||
}
|
||||
|
||||
posInited = true;
|
||||
|
||||
// init global menu
|
||||
QMenu *main = psMainMenu.addMenu(qsl("Telegram"));
|
||||
main->addAction(lng_mac_menu_about_telegram(lt_telegram, qsl("Telegram")), App::wnd()->getTitle(), SLOT(onAbout()))->setMenuRole(QAction::AboutQtRole);
|
||||
main->addSeparator();
|
||||
QAction *prefs = main->addAction(lang(lng_mac_menu_preferences), App::wnd(), SLOT(showSettings()), QKeySequence(Qt::ControlModifier | Qt::Key_Comma));
|
||||
prefs->setMenuRole(QAction::PreferencesRole);
|
||||
|
||||
QMenu *file = psMainMenu.addMenu(lang(lng_mac_menu_file));
|
||||
psLogout = file->addAction(lang(lng_mac_menu_logout), App::wnd(), SLOT(onLogout()));
|
||||
|
||||
QMenu *edit = psMainMenu.addMenu(lang(lng_mac_menu_edit));
|
||||
psUndo = edit->addAction(lang(lng_mac_menu_undo), this, SLOT(psMacUndo()), QKeySequence::Undo);
|
||||
psRedo = edit->addAction(lang(lng_mac_menu_redo), this, SLOT(psMacRedo()), QKeySequence::Redo);
|
||||
edit->addSeparator();
|
||||
psCut = edit->addAction(lang(lng_mac_menu_cut), this, SLOT(psMacCut()), QKeySequence::Cut);
|
||||
psCopy = edit->addAction(lang(lng_mac_menu_copy), this, SLOT(psMacCopy()), QKeySequence::Copy);
|
||||
psPaste = edit->addAction(lang(lng_mac_menu_paste), this, SLOT(psMacPaste()), QKeySequence::Paste);
|
||||
psDelete = edit->addAction(lang(lng_mac_menu_delete), this, SLOT(psMacDelete()), QKeySequence(Qt::ControlModifier | Qt::Key_Backspace));
|
||||
edit->addSeparator();
|
||||
psSelectAll = edit->addAction(lang(lng_mac_menu_select_all), this, SLOT(psMacSelectAll()), QKeySequence::SelectAll);
|
||||
|
||||
QMenu *window = psMainMenu.addMenu(lang(lng_mac_menu_window));
|
||||
psContacts = window->addAction(lang(lng_mac_menu_contacts), App::wnd()->getTitle(), SLOT(onContacts()));
|
||||
psAddContact = window->addAction(lang(lng_mac_menu_add_contact), App::wnd(), SLOT(onShowAddContact()));
|
||||
window->addSeparator();
|
||||
psNewGroup = window->addAction(lang(lng_mac_menu_new_group), App::wnd(), SLOT(onShowNewGroup()));
|
||||
psNewChannel = window->addAction(lang(lng_mac_menu_new_channel), App::wnd(), SLOT(onShowNewChannel()));
|
||||
window->addSeparator();
|
||||
psShowTelegram = window->addAction(lang(lng_mac_menu_show), App::wnd(), SLOT(showFromTray()));
|
||||
|
||||
psMacUpdateMenu();
|
||||
}
|
||||
|
||||
namespace {
|
||||
void _sendKeySequence(Qt::Key key, Qt::KeyboardModifiers modifiers = Qt::NoModifier) {
|
||||
QWidget *focused = QApplication::focusWidget();
|
||||
if (qobject_cast<QLineEdit*>(focused) || qobject_cast<FlatTextarea*>(focused) || qobject_cast<HistoryInner*>(focused)) {
|
||||
QApplication::postEvent(focused, new QKeyEvent(QEvent::KeyPress, key, modifiers));
|
||||
QApplication::postEvent(focused, new QKeyEvent(QEvent::KeyRelease, key, modifiers));
|
||||
}
|
||||
}
|
||||
void _forceDisabled(QAction *action, bool disabled) {
|
||||
if (action->isEnabled()) {
|
||||
if (disabled) action->setDisabled(true);
|
||||
} else if (!disabled) {
|
||||
action->setDisabled(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void PsMainWindow::psMacUndo() {
|
||||
_sendKeySequence(Qt::Key_Z, Qt::ControlModifier);
|
||||
}
|
||||
|
||||
void PsMainWindow::psMacRedo() {
|
||||
_sendKeySequence(Qt::Key_Z, Qt::ControlModifier | Qt::ShiftModifier);
|
||||
}
|
||||
|
||||
void PsMainWindow::psMacCut() {
|
||||
_sendKeySequence(Qt::Key_X, Qt::ControlModifier);
|
||||
}
|
||||
|
||||
void PsMainWindow::psMacCopy() {
|
||||
_sendKeySequence(Qt::Key_C, Qt::ControlModifier);
|
||||
}
|
||||
|
||||
void PsMainWindow::psMacPaste() {
|
||||
_sendKeySequence(Qt::Key_V, Qt::ControlModifier);
|
||||
}
|
||||
|
||||
void PsMainWindow::psMacDelete() {
|
||||
_sendKeySequence(Qt::Key_Delete);
|
||||
}
|
||||
|
||||
void PsMainWindow::psMacSelectAll() {
|
||||
_sendKeySequence(Qt::Key_A, Qt::ControlModifier);
|
||||
}
|
||||
|
||||
bool PsMainWindow::psHandleTitle() {
|
||||
return false;
|
||||
}
|
||||
|
||||
void PsMainWindow::psInitSysMenu() {
|
||||
}
|
||||
|
||||
void PsMainWindow::psUpdateSysMenu(Qt::WindowState state) {
|
||||
}
|
||||
|
||||
void PsMainWindow::psUpdateMargins() {
|
||||
}
|
||||
|
||||
void PsMainWindow::psMacUpdateMenu() {
|
||||
if (!posInited) return;
|
||||
|
||||
QWidget *focused = QApplication::focusWidget();
|
||||
bool isLogged = !!App::self(), canUndo = false, canRedo = false, canCut = false, canCopy = false, canPaste = false, canDelete = false, canSelectAll = false;
|
||||
if (QLineEdit *edit = qobject_cast<QLineEdit*>(focused)) {
|
||||
canCut = canCopy = canDelete = edit->hasSelectedText();
|
||||
canSelectAll = !edit->text().isEmpty();
|
||||
canUndo = edit->isUndoAvailable();
|
||||
canRedo = edit->isRedoAvailable();
|
||||
canPaste = !Application::clipboard()->text().isEmpty();
|
||||
} else if (FlatTextarea *edit = qobject_cast<FlatTextarea*>(focused)) {
|
||||
canCut = canCopy = canDelete = edit->textCursor().hasSelection();
|
||||
canSelectAll = !edit->isEmpty();
|
||||
canUndo = edit->isUndoAvailable();
|
||||
canRedo = edit->isRedoAvailable();
|
||||
canPaste = !Application::clipboard()->text().isEmpty();
|
||||
} else if (HistoryInner *list = qobject_cast<HistoryInner*>(focused)) {
|
||||
canCopy = list->canCopySelected();
|
||||
canDelete = list->canDeleteSelected();
|
||||
}
|
||||
_forceDisabled(psLogout, !isLogged && !App::passcoded());
|
||||
_forceDisabled(psUndo, !canUndo);
|
||||
_forceDisabled(psRedo, !canRedo);
|
||||
_forceDisabled(psCut, !canCut);
|
||||
_forceDisabled(psCopy, !canCopy);
|
||||
_forceDisabled(psPaste, !canPaste);
|
||||
_forceDisabled(psDelete, !canDelete);
|
||||
_forceDisabled(psSelectAll, !canSelectAll);
|
||||
_forceDisabled(psContacts, !isLogged || App::passcoded());
|
||||
_forceDisabled(psAddContact, !isLogged || App::passcoded());
|
||||
_forceDisabled(psNewGroup, !isLogged || App::passcoded());
|
||||
_forceDisabled(psNewChannel, !isLogged || App::passcoded());
|
||||
_forceDisabled(psShowTelegram, App::wnd()->isActive(false));
|
||||
}
|
||||
|
||||
void PsMainWindow::psFlash() {
|
||||
_private.startBounce();
|
||||
}
|
||||
|
||||
PsMainWindow::~PsMainWindow() {
|
||||
finished = true;
|
||||
}
|
||||
|
||||
void PsMainWindow::psClearNotifies(PeerId peerId) {
|
||||
_private.clearNotifies(peerId);
|
||||
}
|
||||
|
||||
void PsMainWindow::psActivateNotify(NotifyWindow *w) {
|
||||
objc_activateWnd(w->winId());
|
||||
}
|
||||
|
||||
bool PsMainWindow::psFilterNativeEvent(void *event) {
|
||||
return _private.filterNativeEvent(event);
|
||||
}
|
||||
|
||||
namespace {
|
||||
QRect _monitorRect;
|
||||
uint64 _monitorLastGot = 0;
|
||||
|
@ -496,34 +69,6 @@ void psBringToBack(QWidget *w) {
|
|||
objc_bringToBack(w->winId());
|
||||
}
|
||||
|
||||
void PsMainWindow::psNotifyShown(NotifyWindow *w) {
|
||||
w->hide();
|
||||
objc_holdOnTop(w->winId());
|
||||
w->show();
|
||||
psShowOverAll(w, false);
|
||||
}
|
||||
|
||||
void PsMainWindow::psPlatformNotify(HistoryItem *item, int32 fwdCount) {
|
||||
QString title = (!App::passcoded() && cNotifyView() <= dbinvShowName) ? item->history()->peer->name : qsl("Telegram Desktop");
|
||||
QString subtitle = (!App::passcoded() && cNotifyView() <= dbinvShowName) ? item->notificationHeader() : QString();
|
||||
QPixmap pix = (!App::passcoded() && cNotifyView() <= dbinvShowName) ? item->history()->peer->genUserpic(st::notifyMacPhotoSize) : QPixmap();
|
||||
QString msg = (!App::passcoded() && cNotifyView() <= dbinvShowPreview) ? (fwdCount < 2 ? item->notificationText() : lng_forward_messages(lt_count, fwdCount)) : lang(lng_notification_preview);
|
||||
|
||||
bool withReply = !App::passcoded() && (cNotifyView() <= dbinvShowPreview) && item->history()->peer->canWrite();
|
||||
|
||||
_private.showNotify(item->history()->peer->id, item->id, pix, title, subtitle, msg, withReply);
|
||||
}
|
||||
|
||||
bool PsMainWindow::eventFilter(QObject *obj, QEvent *evt) {
|
||||
QEvent::Type t = evt->type();
|
||||
if (t == QEvent::FocusIn || t == QEvent::FocusOut) {
|
||||
if (qobject_cast<QLineEdit*>(obj) || qobject_cast<FlatTextarea*>(obj) || qobject_cast<HistoryInner*>(obj)) {
|
||||
psMacUpdateMenu();
|
||||
}
|
||||
}
|
||||
return QMainWindow::eventFilter(obj, evt);
|
||||
}
|
||||
|
||||
QAbstractNativeEventFilter *psNativeEventFilter() {
|
||||
delete _psEventFilter;
|
||||
_psEventFilter = new _PsEventFilter();
|
||||
|
@ -854,29 +399,30 @@ void psShowInFolder(const QString &name) {
|
|||
objc_showInFinder(name, QFileInfo(name).absolutePath());
|
||||
}
|
||||
|
||||
namespace PlatformSpecific {
|
||||
|
||||
void start() {
|
||||
objc_start();
|
||||
}
|
||||
|
||||
void finish() {
|
||||
delete _psEventFilter;
|
||||
_psEventFilter = 0;
|
||||
|
||||
objc_finish();
|
||||
}
|
||||
|
||||
namespace ThirdParty {
|
||||
void start() {
|
||||
}
|
||||
|
||||
void finish() {
|
||||
}
|
||||
}
|
||||
namespace Platform {
|
||||
|
||||
void start() {
|
||||
objc_start();
|
||||
}
|
||||
|
||||
void finish() {
|
||||
delete _psEventFilter;
|
||||
_psEventFilter = nullptr;
|
||||
|
||||
objc_finish();
|
||||
}
|
||||
|
||||
namespace ThirdParty {
|
||||
|
||||
void start() {
|
||||
}
|
||||
|
||||
void finish() {
|
||||
}
|
||||
|
||||
} // namespace ThirdParty
|
||||
} // namespace Platform
|
||||
|
||||
void psNewVersion() {
|
||||
objc_registerCustomScheme();
|
||||
}
|
||||
|
|
|
@ -29,117 +29,6 @@ inline void psCheckLocalSocket(const QString &serverName) {
|
|||
}
|
||||
}
|
||||
|
||||
class MacPrivate : public PsMacWindowPrivate {
|
||||
public:
|
||||
|
||||
void activeSpaceChanged();
|
||||
void darkModeChanged();
|
||||
void notifyClicked(unsigned long long peer, int msgid);
|
||||
void notifyReplied(unsigned long long peer, int msgid, const char *str);
|
||||
|
||||
};
|
||||
|
||||
class NotifyWindow;
|
||||
|
||||
class PsMainWindow : public QMainWindow {
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
PsMainWindow(QWidget *parent = 0);
|
||||
|
||||
int32 psResizeRowWidth() const {
|
||||
return 0;//st::wndResizeAreaWidth;
|
||||
}
|
||||
|
||||
void psInitFrameless();
|
||||
void psInitSize();
|
||||
|
||||
void psFirstShow();
|
||||
void psInitSysMenu();
|
||||
void psUpdateSysMenu(Qt::WindowState state);
|
||||
void psUpdateMargins();
|
||||
void psUpdatedPosition();
|
||||
|
||||
bool psHandleTitle();
|
||||
|
||||
void psFlash();
|
||||
|
||||
void psUpdateWorkmode();
|
||||
|
||||
void psRefreshTaskbarIcon();
|
||||
|
||||
bool psPosInited() const {
|
||||
return posInited;
|
||||
}
|
||||
|
||||
bool psFilterNativeEvent(void *event);
|
||||
|
||||
void psActivateNotify(NotifyWindow *w);
|
||||
void psClearNotifies(PeerId peerId = 0);
|
||||
void psNotifyShown(NotifyWindow *w);
|
||||
void psPlatformNotify(HistoryItem *item, int32 fwdCount);
|
||||
|
||||
bool eventFilter(QObject *obj, QEvent *evt);
|
||||
|
||||
void psUpdateCounter();
|
||||
|
||||
bool psHasNativeNotifications() {
|
||||
return !(QSysInfo::macVersion() < QSysInfo::MV_10_8);
|
||||
}
|
||||
|
||||
virtual QImage iconWithCounter(int size, int count, style::color bg, bool smallIcon) = 0;
|
||||
|
||||
~PsMainWindow();
|
||||
|
||||
public slots:
|
||||
|
||||
void psUpdateDelegate();
|
||||
void psSavePosition(Qt::WindowState state = Qt::WindowActive);
|
||||
void psShowTrayMenu();
|
||||
|
||||
void psMacUndo();
|
||||
void psMacRedo();
|
||||
void psMacCut();
|
||||
void psMacCopy();
|
||||
void psMacPaste();
|
||||
void psMacDelete();
|
||||
void psMacSelectAll();
|
||||
|
||||
protected:
|
||||
|
||||
void psNotIdle() const;
|
||||
QImage psTrayIcon(bool selected = false) const;
|
||||
bool psHasTrayIcon() const {
|
||||
return trayIcon;
|
||||
}
|
||||
|
||||
void psMacUpdateMenu();
|
||||
|
||||
bool posInited;
|
||||
QSystemTrayIcon *trayIcon;
|
||||
QMenu *trayIconMenu;
|
||||
QImage icon256, iconbig256;
|
||||
QIcon wndIcon;
|
||||
|
||||
QImage trayImg, trayImgSel;
|
||||
|
||||
void psTrayMenuUpdated();
|
||||
void psSetupTrayIcon();
|
||||
virtual void placeSmallCounter(QImage &img, int size, int count, style::color bg, const QPoint &shift, style::color color) = 0;
|
||||
|
||||
QTimer psUpdatedPositionTimer;
|
||||
|
||||
private:
|
||||
MacPrivate _private;
|
||||
|
||||
mutable bool psIdle;
|
||||
mutable QTimer psIdleTimer;
|
||||
|
||||
QMenuBar psMainMenu;
|
||||
QAction *psLogout, *psUndo, *psRedo, *psCut, *psCopy, *psPaste, *psDelete, *psSelectAll, *psContacts, *psAddContact, *psNewGroup, *psNewChannel, *psShowTelegram;
|
||||
|
||||
};
|
||||
|
||||
void psWriteDump();
|
||||
QString psPrepareCrashDump(const QByteArray &crashdump, QString dumpfile);
|
||||
|
||||
|
|
|
@ -255,7 +255,7 @@ void objc_holdOnTop(WId winId) {
|
|||
bool objc_darkMode() {
|
||||
NSDictionary *dict = [[NSUserDefaults standardUserDefaults] persistentDomainForName:NSGlobalDomain];
|
||||
id style = [dict objectForKey:QNSString(strStyleOfInterface()).s()];
|
||||
BOOL darkModeOn = ( style && [style isKindOfClass:[NSString class]] && NSOrderedSame == [style caseInsensitiveCompare:@"dark"] );
|
||||
BOOL darkModeOn = (style && [style isKindOfClass:[NSString class]] && NSOrderedSame == [style caseInsensitiveCompare:@"dark"]);
|
||||
return darkModeOn ? true : false;
|
||||
}
|
||||
|
||||
|
|