mirror of
https://github.com/hexchat/hexchat.git
synced 2024-11-05 10:42:33 +01:00
move additions to own repo, so that patch contains only modifications
This commit is contained in:
parent
876a185af3
commit
c7ec88c88a
33
build/build-x64.bat
Normal file
33
build/build-x64.bat
Normal file
@ -0,0 +1,33 @@
|
||||
@echo off
|
||||
set INCLUDE=c:\WinDDK\7600.16385.1\inc\api;c:\WinDDK\7600.16385.1\inc\crt;c:\WinDDK\7600.16385.1\inc\api\crt\stl70;c:\mozilla-build\build\xchat-dev64\include;c:\mozilla-build\build\openssl-0.9.8j-wdk-x64\include
|
||||
set LIB=c:\WinDDK\7600.16385.1\lib\wnet\amd64;c:\WinDDK\7600.16385.1\lib\Crt\amd64;c:\mozilla-build\build\openssl-0.9.8j-wdk-x64\lib
|
||||
set OPATH=%PATH%
|
||||
set PATH=c:\WinDDK\7600.16385.1\bin\x86\amd64;c:\WinDDK\7600.16385.1\bin\x86;c:\Program Files\Microsoft SDKs\Windows\v6.0A\Bin;c:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin;c:\mozilla-build\build\xchat-dev64\bin;c:\mozilla-build\perl-5.10-x64\bin
|
||||
cd ..\src
|
||||
nmake -f makefile.mak clean
|
||||
nmake -f makefile.mak
|
||||
cd ..\plugins\dns
|
||||
nmake -f makefile.mak clean
|
||||
nmake -f makefile.mak
|
||||
cd ..\ewc
|
||||
nmake -f makefile.mak clean
|
||||
nmake -f makefile.mak
|
||||
cd ..\perl
|
||||
nmake -f makefile.mak clean
|
||||
nmake -f makefile.mak
|
||||
::cd ..\python
|
||||
::nmake -f makefile.mak clean
|
||||
::nmake -f makefile.mak
|
||||
::cd ..\tcl
|
||||
::nmake -f makefile.mak clean
|
||||
::nmake -f makefile.mak
|
||||
cd ..\xtray
|
||||
nmake -f makefile.mak clean
|
||||
nmake -f makefile.mak
|
||||
cd ..\..\build
|
||||
set PATH=%PATH%;c:\mozilla-build\build\xchat-dev32\bin
|
||||
call compile-po-files.bat
|
||||
cd ..\build
|
||||
set PATH=%OPATH%
|
||||
call release-x64.bat
|
||||
pause
|
32
build/build-x86.bat
Normal file
32
build/build-x86.bat
Normal file
@ -0,0 +1,32 @@
|
||||
@echo off
|
||||
set INCLUDE=c:\WinDDK\7600.16385.1\inc\api;c:\WinDDK\7600.16385.1\inc\crt;c:\WinDDK\7600.16385.1\inc\api\crt\stl70;c:\mozilla-build\build\xchat-dev32\include;c:\mozilla-build\build\openssl-0.9.8j-wdk-x86\include
|
||||
set LIB=c:\WinDDK\7600.16385.1\lib\wxp\i386;c:\WinDDK\7600.16385.1\lib\Crt\i386;c:\mozilla-build\build\openssl-0.9.8j-wdk-x86\lib
|
||||
set OPATH=%PATH%
|
||||
set PATH=c:\WinDDK\7600.16385.1\bin\x86\x86;c:\WinDDK\7600.16385.1\bin\x86;c:\Program Files\Microsoft SDKs\Windows\v6.0A\Bin;c:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin;c:\mozilla-build\build\xchat-dev32\bin;c:\mozilla-build\mingw\bin;c:\mozilla-build\perl-5.10-x86\bin
|
||||
cd ..\src
|
||||
nmake -f makefile.mak clean
|
||||
nmake -f makefile.mak
|
||||
cd ..\plugins\dns
|
||||
nmake -f makefile.mak clean
|
||||
nmake -f makefile.mak
|
||||
cd ..\ewc
|
||||
nmake -f makefile.mak clean
|
||||
nmake -f makefile.mak
|
||||
cd ..\perl
|
||||
nmake -f makefile.mak clean
|
||||
nmake -f makefile.mak
|
||||
::cd ..\python
|
||||
::nmake -f makefile.mak clean
|
||||
::nmake -f makefile.mak
|
||||
cd ..\tcl
|
||||
nmake -f makefile.mak clean
|
||||
nmake -f makefile.mak
|
||||
cd ..\xtray
|
||||
nmake -f makefile.mak clean
|
||||
nmake -f makefile.mak
|
||||
cd ..\..\build
|
||||
call compile-po-files.bat
|
||||
cd ..\build
|
||||
set PATH=%OPATH%
|
||||
call release-x86.bat
|
||||
pause
|
87
build/compile-po-files.bat
Normal file
87
build/compile-po-files.bat
Normal file
@ -0,0 +1,87 @@
|
||||
@echo off
|
||||
|
||||
echo.Compiling translations . . .
|
||||
cd ..\po
|
||||
rmdir /Q /S locale
|
||||
mkdir locale
|
||||
|
||||
mkdir locale\be\LC_MESSAGES
|
||||
msgfmt -cvo locale\be\LC_MESSAGES\xchat.mo be.po
|
||||
|
||||
mkdir locale\ca\LC_MESSAGES
|
||||
msgfmt -cvo locale\ca\LC_MESSAGES\xchat.mo ca.po
|
||||
|
||||
mkdir locale\cs\LC_MESSAGES
|
||||
msgfmt -cvo locale\cs\LC_MESSAGES\xchat.mo cs.po
|
||||
|
||||
mkdir locale\de\LC_MESSAGES
|
||||
msgfmt -cvo locale\de\LC_MESSAGES\xchat.mo de.po
|
||||
|
||||
mkdir locale\el\LC_MESSAGES
|
||||
msgfmt -cvo locale\el\LC_MESSAGES\xchat.mo el.po
|
||||
|
||||
mkdir locale\es\LC_MESSAGES
|
||||
msgfmt -cvo locale\es\LC_MESSAGES\xchat.mo es.po
|
||||
|
||||
mkdir locale\fi\LC_MESSAGES
|
||||
msgfmt -cvo locale\fi\LC_MESSAGES\xchat.mo fi.po
|
||||
|
||||
mkdir locale\fr\LC_MESSAGES
|
||||
msgfmt -cvo locale\fr\LC_MESSAGES\xchat.mo fr.po
|
||||
|
||||
mkdir locale\gl\LC_MESSAGES
|
||||
msgfmt -cvo locale\gl\LC_MESSAGES\xchat.mo gl.po
|
||||
|
||||
mkdir locale\hu\LC_MESSAGES
|
||||
msgfmt -cvo locale\hu\LC_MESSAGES\xchat.mo hu.po
|
||||
|
||||
mkdir locale\it\LC_MESSAGES
|
||||
msgfmt -cvo locale\it\LC_MESSAGES\xchat.mo it.po
|
||||
|
||||
mkdir locale\ja\LC_MESSAGES
|
||||
msgfmt -cvo locale\ja\LC_MESSAGES\xchat.mo ja.po
|
||||
|
||||
mkdir locale\ko\LC_MESSAGES
|
||||
msgfmt -cvo locale\ko\LC_MESSAGES\xchat.mo ko.po
|
||||
|
||||
mkdir locale\lt\LC_MESSAGES
|
||||
msgfmt -cvo locale\lt\LC_MESSAGES\xchat.mo lt.po
|
||||
|
||||
mkdir locale\mk\LC_MESSAGES
|
||||
msgfmt -cvo locale\mk\LC_MESSAGES\xchat.mo mk.po
|
||||
|
||||
mkdir locale\nl\LC_MESSAGES
|
||||
msgfmt -cvo locale\nl\LC_MESSAGES\xchat.mo nl.po
|
||||
|
||||
mkdir locale\pa\LC_MESSAGES
|
||||
msgfmt -cvo locale\pa\LC_MESSAGES\xchat.mo pa.po
|
||||
|
||||
mkdir locale\pt\LC_MESSAGES
|
||||
msgfmt -cvo locale\pt\LC_MESSAGES\xchat.mo pt.po
|
||||
|
||||
mkdir locale\ru\LC_MESSAGES
|
||||
msgfmt -cvo locale\ru\LC_MESSAGES\xchat.mo ru.po
|
||||
|
||||
mkdir locale\sq\LC_MESSAGES
|
||||
msgfmt -cvo locale\sq\LC_MESSAGES\xchat.mo sq.po
|
||||
|
||||
mkdir locale\sr\LC_MESSAGES
|
||||
msgfmt -cvo locale\sr\LC_MESSAGES\xchat.mo sr.po
|
||||
|
||||
mkdir locale\sv\LC_MESSAGES
|
||||
msgfmt -cvo locale\sv\LC_MESSAGES\xchat.mo sv.po
|
||||
|
||||
mkdir locale\th\LC_MESSAGES
|
||||
msgfmt -cvo locale\th\LC_MESSAGES\xchat.mo th.po
|
||||
|
||||
mkdir locale\uk\LC_MESSAGES
|
||||
msgfmt -cvo locale\uk\LC_MESSAGES\xchat.mo uk.po
|
||||
|
||||
mkdir locale\vi\LC_MESSAGES
|
||||
msgfmt -cvo locale\vi\LC_MESSAGES\xchat.mo vi.po
|
||||
|
||||
mkdir locale\zh_CN\LC_MESSAGES
|
||||
msgfmt -cvo locale\zh_CN\LC_MESSAGES\xchat.mo zh_CN.po
|
||||
|
||||
mkdir locale\zh_TW\LC_MESSAGES
|
||||
msgfmt -cvo locale\zh_TW\LC_MESSAGES\xchat.mo zh_TW.po
|
68
build/etc/gtk-2.0/gtkrc
Normal file
68
build/etc/gtk-2.0/gtkrc
Normal file
@ -0,0 +1,68 @@
|
||||
gtk-font-name = "sans 8"
|
||||
|
||||
gtk-icon-sizes = "gtk-menu=13,13:gtk-small-toolbar=16,16:gtk-large-toolbar=24,24:gtk-dnd=32,32"
|
||||
gtk-toolbar-icon-size = small-toolbar
|
||||
|
||||
# disable images in buttons. i've only seen ugly delphi apps use this feature.
|
||||
gtk-button-images = 0
|
||||
|
||||
# enable/disable images in menus. most "stock" microsoft apps don't use these, except sparingly.
|
||||
# the office apps use them heavily, though.
|
||||
gtk-menu-images = 1
|
||||
|
||||
# use the win32 button ordering instead of the GNOME HIG one, where applicable
|
||||
gtk-alternative-button-order = 1
|
||||
|
||||
# use the win32 sort indicators direction, as in Explorer
|
||||
gtk-alternative-sort-arrows = 1
|
||||
|
||||
# Windows users don't expect the PC Speaker beeping at them when they backspace in an empty textview and stuff like that
|
||||
gtk-error-bell = 0
|
||||
|
||||
style "msw-default"
|
||||
{
|
||||
GtkWidget::interior-focus = 1
|
||||
GtkOptionMenu::indicator-size = { 9, 5 }
|
||||
GtkOptionMenu::indicator-spacing = { 7, 5, 2, 2 }
|
||||
GtkSpinButton::shadow-type = in
|
||||
|
||||
# Owen and I disagree that these should be themable
|
||||
#GtkUIManager::add-tearoffs = 0
|
||||
#GtkComboBox::add-tearoffs = 0
|
||||
|
||||
GtkComboBox::appears-as-list = 1
|
||||
GtkComboBox::focus-on-click = 0
|
||||
|
||||
GOComboBox::add_tearoffs = 0
|
||||
|
||||
GtkTreeView::allow-rules = 0
|
||||
GtkTreeView::expander-size = 12
|
||||
|
||||
GtkExpander::expander-size = 12
|
||||
|
||||
GtkScrolledWindow::scrollbar_spacing = 1
|
||||
|
||||
GtkSeparatorMenuItem::horizontal-padding = 2
|
||||
|
||||
engine "wimp"
|
||||
{
|
||||
}
|
||||
}
|
||||
class "*" style "msw-default"
|
||||
|
||||
binding "ms-windows-tree-view"
|
||||
{
|
||||
bind "Right" { "expand-collapse-cursor-row" (1,1,0) }
|
||||
bind "Left" { "expand-collapse-cursor-row" (1,0,0) }
|
||||
}
|
||||
|
||||
class "GtkTreeView" binding "ms-windows-tree-view"
|
||||
|
||||
style "msw-combobox-thickness" = "msw-default"
|
||||
{
|
||||
xthickness = 0
|
||||
ythickness = 0
|
||||
}
|
||||
|
||||
widget_class "*TreeView*ComboBox*" style "msw-combobox-thickness"
|
||||
widget_class "*ComboBox*GtkFrame*" style "msw-combobox-thickness"
|
39
build/release-x64.bat
Normal file
39
build/release-x64.bat
Normal file
@ -0,0 +1,39 @@
|
||||
@echo off
|
||||
set GTK_BIN=c:\mozilla-build\build\xchat-dev64\bin
|
||||
set SSL_BIN=c:\mozilla-build\build\openssl-0.9.8j-wdk-x64\bin
|
||||
set XCHAT_DEST=c:\mozilla-build\build\xchat-wdk-x64
|
||||
rmdir /Q /S %XCHAT_DEST%
|
||||
mkdir %XCHAT_DEST%
|
||||
xcopy ..\src\fe-gtk\xchat.exe %XCHAT_DEST%
|
||||
xcopy %GTK_BIN%\libgtk-win32-2.0-0.dll %XCHAT_DEST%
|
||||
xcopy %GTK_BIN%\libgdk_pixbuf-2.0-0.dll %XCHAT_DEST%
|
||||
xcopy %GTK_BIN%\libgio-2.0-0.dll %XCHAT_DEST%
|
||||
xcopy %GTK_BIN%\libglib-2.0-0.dll %XCHAT_DEST%
|
||||
xcopy %GTK_BIN%\libgmodule-2.0-0.dll %XCHAT_DEST%
|
||||
xcopy %GTK_BIN%\libgobject-2.0-0.dll %XCHAT_DEST%
|
||||
xcopy %GTK_BIN%\libpng14-14.dll %XCHAT_DEST%
|
||||
xcopy %GTK_BIN%\zlib1.dll %XCHAT_DEST%
|
||||
xcopy %GTK_BIN%\libgdk-win32-2.0-0.dll %XCHAT_DEST%
|
||||
xcopy %GTK_BIN%\libcairo-2.dll %XCHAT_DEST%
|
||||
xcopy %GTK_BIN%\libfontconfig-1.dll %XCHAT_DEST%
|
||||
xcopy %GTK_BIN%\libexpat-1.dll %XCHAT_DEST%
|
||||
xcopy %GTK_BIN%\libfreetype-6.dll %XCHAT_DEST%
|
||||
xcopy %GTK_BIN%\libpango-1.0-0.dll %XCHAT_DEST%
|
||||
xcopy %GTK_BIN%\libpangocairo-1.0-0.dll %XCHAT_DEST%
|
||||
xcopy %GTK_BIN%\libpangoft2-1.0-0.dll %XCHAT_DEST%
|
||||
xcopy %GTK_BIN%\libpangowin32-1.0-0.dll %XCHAT_DEST%
|
||||
xcopy %GTK_BIN%\libatk-1.0-0.dll %XCHAT_DEST%
|
||||
xcopy %GTK_BIN%\libintl-8.dll %XCHAT_DEST%
|
||||
xcopy /S /I %GTK_BIN%\..\lib\gtk-2.0 %XCHAT_DEST%\lib\gtk-2.0
|
||||
rmdir /Q /S %XCHAT_DEST%\lib\gtk-2.0\include
|
||||
xcopy /S /I etc %XCHAT_DEST%\etc
|
||||
xcopy ..\COPYING %XCHAT_DEST%
|
||||
::xcopy %SSL_BIN%\libeay32.dll %XCHAT_DEST%
|
||||
::xcopy %SSL_BIN%\ssleay32.dll %XCHAT_DEST%
|
||||
xcopy /S /I ..\plugins\dns\xcdns.dll %XCHAT_DEST%\plugins\
|
||||
xcopy /S /I ..\plugins\ewc\xcewc.dll %XCHAT_DEST%\plugins\
|
||||
xcopy /S /I ..\plugins\perl\xcperl.dll %XCHAT_DEST%\plugins\
|
||||
::xcopy /S /I ..\plugins\python\xcpython.dll %XCHAT_DEST%\plugins\
|
||||
::xcopy /S /I ..\plugins\tcl\xctcl.dll %XCHAT_DEST%\plugins\
|
||||
xcopy /S /I ..\plugins\xtray\xtray.dll %XCHAT_DEST%\plugins\
|
||||
xcopy /S /I ..\po\locale %XCHAT_DEST%\locale
|
39
build/release-x86.bat
Normal file
39
build/release-x86.bat
Normal file
@ -0,0 +1,39 @@
|
||||
@echo off
|
||||
set GTK_BIN=c:\mozilla-build\build\xchat-dev32\bin
|
||||
set SSL_BIN=c:\mozilla-build\build\openssl-0.9.8j-wdk-x86\bin
|
||||
set XCHAT_DEST=c:\mozilla-build\build\xchat-wdk-x86
|
||||
rmdir /Q /S %XCHAT_DEST%
|
||||
mkdir %XCHAT_DEST%
|
||||
xcopy ..\src\fe-gtk\xchat.exe %XCHAT_DEST%
|
||||
xcopy %GTK_BIN%\libgtk-win32-2.0-0.dll %XCHAT_DEST%
|
||||
xcopy %GTK_BIN%\libgdk_pixbuf-2.0-0.dll %XCHAT_DEST%
|
||||
xcopy %GTK_BIN%\libgio-2.0-0.dll %XCHAT_DEST%
|
||||
xcopy %GTK_BIN%\libglib-2.0-0.dll %XCHAT_DEST%
|
||||
xcopy %GTK_BIN%\libgmodule-2.0-0.dll %XCHAT_DEST%
|
||||
xcopy %GTK_BIN%\libgobject-2.0-0.dll %XCHAT_DEST%
|
||||
xcopy %GTK_BIN%\libpng14-14.dll %XCHAT_DEST%
|
||||
xcopy %GTK_BIN%\zlib1.dll %XCHAT_DEST%
|
||||
xcopy %GTK_BIN%\libgdk-win32-2.0-0.dll %XCHAT_DEST%
|
||||
xcopy %GTK_BIN%\libcairo-2.dll %XCHAT_DEST%
|
||||
xcopy %GTK_BIN%\libfontconfig-1.dll %XCHAT_DEST%
|
||||
xcopy %GTK_BIN%\libexpat-1.dll %XCHAT_DEST%
|
||||
xcopy %GTK_BIN%\freetype6.dll %XCHAT_DEST%
|
||||
xcopy %GTK_BIN%\libpango-1.0-0.dll %XCHAT_DEST%
|
||||
xcopy %GTK_BIN%\libpangocairo-1.0-0.dll %XCHAT_DEST%
|
||||
xcopy %GTK_BIN%\libpangoft2-1.0-0.dll %XCHAT_DEST%
|
||||
xcopy %GTK_BIN%\libpangowin32-1.0-0.dll %XCHAT_DEST%
|
||||
xcopy %GTK_BIN%\libatk-1.0-0.dll %XCHAT_DEST%
|
||||
xcopy %GTK_BIN%\intl.dll %XCHAT_DEST%
|
||||
xcopy /S /I %GTK_BIN%\..\lib\gtk-2.0 %XCHAT_DEST%\lib\gtk-2.0
|
||||
rmdir /Q /S %XCHAT_DEST%\lib\gtk-2.0\include
|
||||
xcopy /S /I etc %XCHAT_DEST%\etc
|
||||
xcopy ..\COPYING %XCHAT_DEST%
|
||||
::xcopy %SSL_BIN%\libeay32.dll %XCHAT_DEST%
|
||||
::xcopy %SSL_BIN%\ssleay32.dll %XCHAT_DEST%
|
||||
xcopy /S /I ..\plugins\dns\xcdns.dll %XCHAT_DEST%\plugins\
|
||||
xcopy /S /I ..\plugins\ewc\xcewc.dll %XCHAT_DEST%\plugins\
|
||||
xcopy /S /I ..\plugins\perl\xcperl.dll %XCHAT_DEST%\plugins\
|
||||
::xcopy /S /I ..\plugins\python\xcpython.dll %XCHAT_DEST%\plugins\
|
||||
xcopy /S /I ..\plugins\tcl\xctcl.dll %XCHAT_DEST%\plugins\
|
||||
xcopy /S /I ..\plugins\xtray\xtray.dll %XCHAT_DEST%\plugins\
|
||||
xcopy /S /I ..\po\locale %XCHAT_DEST%\locale
|
3
build/test-x64.bat
Normal file
3
build/test-x64.bat
Normal file
@ -0,0 +1,3 @@
|
||||
@echo off
|
||||
set PATH=c:\mozilla-build\build\xchat-dev64\bin;c:\mozilla-build\perl-5.10-x64\bin;c:\mozilla-build\python-2.6-x64
|
||||
..\src\fe-gtk\xchat.exe
|
3
build/test-x86.bat
Normal file
3
build/test-x86.bat
Normal file
@ -0,0 +1,3 @@
|
||||
@echo off
|
||||
set PATH=c:\mozilla-build\build\xchat-dev32\bin;c:\mozilla-build\perl-5.10-x86\bin;c:\mozilla-build\python-2.6-x86
|
||||
..\src\fe-gtk\xchat.exe
|
14
config.h
Normal file
14
config.h
Normal file
@ -0,0 +1,14 @@
|
||||
#define LOCALEDIR "./locale"
|
||||
#define ENABLE_NLS
|
||||
#define USE_GMODULE
|
||||
#define USE_PLUGIN
|
||||
#define PACKAGE_NAME "xchat"
|
||||
#define PACKAGE_VERSION "r1409-6"
|
||||
#define XCHATLIBDIR "."
|
||||
#define XCHATSHAREDIR "."
|
||||
#define OLD_PERL
|
||||
#ifndef USE_IPV6
|
||||
#define socklen_t int
|
||||
#endif
|
||||
#define GETTEXT_PACKAGE "xchat"
|
||||
#define PACKAGE_TARNAME "xchat-2.8.6"
|
19
plugins/dns/makefile.mak
Normal file
19
plugins/dns/makefile.mak
Normal file
@ -0,0 +1,19 @@
|
||||
include "..\..\src\makeinc.mak"
|
||||
|
||||
xcdns.dll: plugin-dns.obj dns.def
|
||||
link $(LDFLAGS) /dll /out:xcdns.dll /def:dns.def plugin-dns.obj ws2_32.lib
|
||||
dir xcdns.dll
|
||||
|
||||
dns.def:
|
||||
echo EXPORTS > dns.def
|
||||
echo xchat_plugin_init >> dns.def
|
||||
echo xchat_plugin_deinit >> dns.def
|
||||
|
||||
plugin-dns.obj: plugin-dns.c makefile.mak thread.c
|
||||
cl $(CFLAGS) /I.. -Dsnprintf=_snprintf plugin-dns.c
|
||||
|
||||
clean:
|
||||
del *.obj
|
||||
del *.dll
|
||||
del *.exp
|
||||
del *.lib
|
335
plugins/dns/plugin-dns.c
Normal file
335
plugins/dns/plugin-dns.c
Normal file
@ -0,0 +1,335 @@
|
||||
/* XChat Win32 DNS Plugin
|
||||
* Copyright (C) 2003-2004 Peter Zelezny.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*/
|
||||
/*
|
||||
* Requires MS Visual Studio and IPV6 headers to compile (run nmake).
|
||||
* Compiling with gcc (mingw) will fail due to missing gai_strerror.
|
||||
*/
|
||||
|
||||
#define DNS_VERSION "2.4"
|
||||
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <fcntl.h>
|
||||
|
||||
#define IPV6
|
||||
|
||||
#ifdef _WIN32
|
||||
#ifdef IPV6
|
||||
#include <winsock2.h>
|
||||
#include <ws2tcpip.h>
|
||||
#else
|
||||
#include <winsock2.h>
|
||||
#endif
|
||||
#else
|
||||
#include <netdb.h>
|
||||
#include <sys/socket.h>
|
||||
#endif
|
||||
|
||||
#include "xchat-plugin.h"
|
||||
#include "thread.c"
|
||||
|
||||
#define HELP "Usage: DNS <nickname|hostname|numerical address>\n"
|
||||
#define HEAD "\0034[DNS]\017\t"
|
||||
|
||||
#define PIPE_READ 0
|
||||
#define PIPE_WRITE 1
|
||||
#define MAX_HOSTNAME 128
|
||||
|
||||
static xchat_plugin *ph;
|
||||
static thread *active_thread = NULL;
|
||||
|
||||
|
||||
static int
|
||||
waitline (void *source, char *buf, int bufsize)
|
||||
{
|
||||
int i = 0;
|
||||
int len;
|
||||
|
||||
while(1)
|
||||
{
|
||||
len = 1;
|
||||
/* we can't read() here, due to glib's giowin32 */
|
||||
if(ph->xchat_read_fd(ph, source, buf + i, &len) != 0)
|
||||
return -1;
|
||||
if(buf[i] == '\n' || bufsize == i + 1)
|
||||
{
|
||||
buf[i] = 0;
|
||||
return i;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
static void *
|
||||
thread_function (void *ud)
|
||||
{
|
||||
#ifdef IPV6
|
||||
struct addrinfo *ent;
|
||||
struct addrinfo *cur;
|
||||
struct addrinfo hints;
|
||||
#else
|
||||
struct hostent *ent;
|
||||
#endif
|
||||
thread *th = ud;
|
||||
int fd = th->pipe_fd[PIPE_WRITE];
|
||||
int ret;
|
||||
char ipstring[MAX_HOSTNAME];
|
||||
char reverse[MAX_HOSTNAME];
|
||||
// int i;
|
||||
|
||||
active_thread = th;
|
||||
|
||||
#ifdef IPV6
|
||||
memset (&hints, 0, sizeof (hints));
|
||||
hints.ai_family = PF_UNSPEC; /* support ipv6 and ipv4 */
|
||||
hints.ai_flags = AI_CANONNAME;
|
||||
// hints.ai_socktype = SOCK_STREAM;
|
||||
|
||||
ret = getaddrinfo (th->userdata, NULL, &hints, &ent);
|
||||
if (ret != 0)
|
||||
{
|
||||
sprintf (ipstring, "1%d\n", ret); /* failed */
|
||||
write (fd, ipstring, strlen (ipstring));
|
||||
// Sleep (3000);
|
||||
active_thread = NULL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
// i = 0;
|
||||
cur = ent;
|
||||
while (cur)
|
||||
{
|
||||
/* find the numeric IP number */
|
||||
ipstring[0] = 0;
|
||||
getnameinfo (cur->ai_addr, cur->ai_addrlen,
|
||||
ipstring, sizeof (ipstring), NULL, 0, NI_NUMERICHOST);
|
||||
|
||||
if (cur->ai_canonname)
|
||||
{
|
||||
/* force reverse lookup if canonname & ipstring are the same */
|
||||
if (/*i == 0 &&*/ strcmp (cur->ai_canonname, ipstring) == 0)
|
||||
goto lamecode;
|
||||
}
|
||||
|
||||
if (cur->ai_canonname)
|
||||
{
|
||||
write (fd, "0", 1);
|
||||
write (fd, ipstring, strlen (ipstring));
|
||||
write (fd, "\n", 1);
|
||||
write (fd, cur->ai_canonname, strlen (cur->ai_canonname));
|
||||
} else
|
||||
{
|
||||
lamecode:
|
||||
// ret = 1;
|
||||
// if (i == 0)
|
||||
{
|
||||
/* reverse lookup */
|
||||
reverse[0] = 0;
|
||||
ret = getnameinfo (cur->ai_addr, cur->ai_addrlen,
|
||||
reverse, sizeof (reverse), NULL, 0, NI_NAMEREQD);
|
||||
}
|
||||
|
||||
write (fd, "0", 1);
|
||||
write (fd, ipstring, strlen (ipstring));
|
||||
|
||||
write (fd, "\n", 1);
|
||||
if (ret == 0)
|
||||
write (fd, reverse, strlen (reverse));
|
||||
}
|
||||
write (fd, "\n", 1);
|
||||
|
||||
// i++;
|
||||
cur = cur->ai_next;
|
||||
}
|
||||
|
||||
/* tell the parent we're done */
|
||||
write (fd, "2\n", 2);
|
||||
freeaddrinfo (ent);
|
||||
|
||||
#else
|
||||
ent = gethostbyname (th->userdata);
|
||||
if (ent)
|
||||
{
|
||||
write (fd, "0", 1);
|
||||
write (fd, ent->h_name, strlen (ent->h_name));
|
||||
write (fd, "\n", 1);
|
||||
write (fd, ent->h_name, strlen (ent->h_name));
|
||||
write (fd, "\n", 1);
|
||||
write (fd, "2\n", 2);
|
||||
} else
|
||||
{
|
||||
write (fd, "10\n", 1);
|
||||
}
|
||||
#endif
|
||||
|
||||
// Sleep (3000);
|
||||
active_thread = NULL; /* race condition, better than nothing */
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
dns_close_pipe (int fd)
|
||||
{
|
||||
close (fd);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* read messages comming from the child (through the pipe) */
|
||||
|
||||
static int
|
||||
dns_read_cb (int fd, int flags, thread *th, void *source)
|
||||
{
|
||||
char buf[512];
|
||||
char buf2[512];
|
||||
|
||||
while (waitline (source, buf, sizeof (buf)))
|
||||
{
|
||||
switch (buf[0])
|
||||
{
|
||||
case '0': /* got data to show */
|
||||
waitline (source, buf2, sizeof (buf2));
|
||||
if (buf2[0] == 0)
|
||||
xchat_printf(ph, HEAD"\002Numerical\002: %s\n", buf + 1);
|
||||
else
|
||||
xchat_printf(ph, HEAD"\002Canonical\002: %s \002Numerical\002: %s\n", buf2, buf + 1);
|
||||
return 1;
|
||||
|
||||
case '1': /* failed */
|
||||
xchat_printf(ph, HEAD"Lookup failed. %s\n", gai_strerrorA (atoi (buf + 1)));
|
||||
|
||||
case '2': /* done */
|
||||
// close (th->pipe_fd[PIPE_WRITE]);
|
||||
// close (th->pipe_fd[PIPE_READ]);
|
||||
xchat_hook_timer(ph, 3000, dns_close_pipe, (void *)th->pipe_fd[PIPE_WRITE]);
|
||||
xchat_hook_timer(ph, 4000, dns_close_pipe, (void *)th->pipe_fd[PIPE_READ]);
|
||||
free (th->userdata); /* hostname strdup'ed */
|
||||
free (th);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* find hostname from nickname (search the userlist, current chan only) */
|
||||
|
||||
static char *
|
||||
find_nick_host (char *nick)
|
||||
{
|
||||
xchat_list *list;
|
||||
char *at;
|
||||
const char *host;
|
||||
|
||||
list = xchat_list_get (ph, "users");
|
||||
if (!list)
|
||||
return NULL;
|
||||
|
||||
while (xchat_list_next (ph, list))
|
||||
{
|
||||
if (stricmp (nick, xchat_list_str (ph, list, "nick")) == 0)
|
||||
{
|
||||
host = xchat_list_str (ph, list, "host");
|
||||
if (host)
|
||||
{
|
||||
at = strrchr (host, '@');
|
||||
if (at)
|
||||
return at + 1;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static int
|
||||
dns_cmd_cb (char *word[], char *word_eol[], void *ud)
|
||||
{
|
||||
thread *th;
|
||||
char *nickhost;
|
||||
|
||||
if (!word[2][0])
|
||||
{
|
||||
xchat_print (ph, HELP);
|
||||
return XCHAT_EAT_ALL;
|
||||
}
|
||||
|
||||
th = thread_new ();
|
||||
if (th)
|
||||
{
|
||||
nickhost = find_nick_host (word[2]);
|
||||
if (nickhost)
|
||||
{
|
||||
xchat_printf (ph, HEAD"Looking up %s (%s)...\n", nickhost, word[2]);
|
||||
th->userdata = strdup (nickhost);
|
||||
} else
|
||||
{
|
||||
xchat_printf (ph, HEAD"Looking up %s...\n", word[2]);
|
||||
th->userdata = strdup (word[2]);
|
||||
}
|
||||
|
||||
if (thread_start (th, thread_function, th))
|
||||
{
|
||||
xchat_hook_fd(ph, th->pipe_fd[PIPE_READ],
|
||||
XCHAT_FD_READ | XCHAT_FD_EXCEPTION | XCHAT_FD_NOTSOCKET,
|
||||
(void *)dns_read_cb, th);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
return XCHAT_EAT_ALL;
|
||||
}
|
||||
|
||||
int
|
||||
xchat_plugin_deinit (xchat_plugin *plugin_handle)
|
||||
{
|
||||
while (active_thread) /* children will set this var to NULL soon... */
|
||||
{
|
||||
Sleep (1000);
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
int
|
||||
#ifdef STATIC
|
||||
exec_plugin_init
|
||||
#else
|
||||
xchat_plugin_init
|
||||
#endif
|
||||
(xchat_plugin *plugin_handle, char **plugin_name,
|
||||
char **plugin_desc, char **plugin_version, char *arg)
|
||||
{
|
||||
/* we need to save this for use with any xchat_* functions */
|
||||
ph = plugin_handle;
|
||||
|
||||
/*if((void *)ph->xchat_read_fd == ph->dummy7)
|
||||
{
|
||||
xchat_print(ph, HEAD"This version of xchat is too old.\n");
|
||||
return 0;
|
||||
}*/
|
||||
|
||||
*plugin_name = "DNS";
|
||||
*plugin_desc = "Threaded IPv4/6 DNS Command";
|
||||
*plugin_version = DNS_VERSION;
|
||||
|
||||
xchat_hook_command(ph, "DNS", XCHAT_PRI_LOW, dns_cmd_cb, HELP, 0);
|
||||
|
||||
return 1; /* return 1 for success */
|
||||
}
|
111
plugins/dns/thread.c
Normal file
111
plugins/dns/thread.c
Normal file
@ -0,0 +1,111 @@
|
||||
#include <stdlib.h>
|
||||
|
||||
#define USE_PTHREAD
|
||||
|
||||
#ifdef WIN32
|
||||
|
||||
#include <windows.h>
|
||||
#define pthread_t DWORD
|
||||
#define pipe(a) _pipe(a,4096,_O_BINARY)
|
||||
|
||||
#else
|
||||
#ifdef USE_PTHREAD
|
||||
|
||||
#include <pthread.h>
|
||||
|
||||
#else
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/wait.h>
|
||||
#include <signal.h>
|
||||
#define pthread_t int
|
||||
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
typedef struct
|
||||
{
|
||||
pthread_t threadid;
|
||||
int pipe_fd[2];
|
||||
void *userdata;
|
||||
} thread;
|
||||
|
||||
thread *
|
||||
thread_new (void)
|
||||
{
|
||||
thread *th;
|
||||
|
||||
th = calloc (1, sizeof (*th));
|
||||
if (!th)
|
||||
return NULL;
|
||||
|
||||
if (pipe (th->pipe_fd) == -1)
|
||||
{
|
||||
free (th);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
#ifdef __EMX__ /* os/2 */
|
||||
setmode (pipe_fd[0], O_BINARY);
|
||||
setmode (pipe_fd[1], O_BINARY);
|
||||
#endif
|
||||
|
||||
return th;
|
||||
}
|
||||
|
||||
int
|
||||
thread_start (thread *th, void *(*start_routine)(void *), void *arg)
|
||||
{
|
||||
pthread_t id;
|
||||
|
||||
#ifdef WIN32
|
||||
CloseHandle (CreateThread (NULL, 0,
|
||||
(LPTHREAD_START_ROUTINE)start_routine,
|
||||
arg, 0, (DWORD *)&id));
|
||||
#else
|
||||
#ifdef USE_PTHREAD
|
||||
if (pthread_create (&id, NULL, start_routine, arg) != 0)
|
||||
return 0;
|
||||
#else
|
||||
switch (id = fork ())
|
||||
{
|
||||
case -1:
|
||||
return 0;
|
||||
case 0:
|
||||
/* this is the child */
|
||||
setuid (getuid ());
|
||||
start_routine (arg);
|
||||
_exit (0);
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
th->threadid = id;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*void
|
||||
thread_kill (thread *th)
|
||||
{
|
||||
#ifdef WIN32
|
||||
PostThreadMessage (th->threadid, WM_QUIT, 0, 0);
|
||||
#else
|
||||
#ifdef USE_PTHREAD
|
||||
pthread_cancel (th->threadid);
|
||||
pthread_join (th->threadid, (void *)&th);
|
||||
#else
|
||||
kill (th->threadid, SIGKILL);
|
||||
waitpid (th->threadid, NULL, 0);
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
|
||||
void
|
||||
thread_free (thread *th)
|
||||
{
|
||||
close (th->pipe_fd[0]);
|
||||
close (th->pipe_fd[1]);
|
||||
free (th);
|
||||
}*/
|
502
plugins/ewc/COPYING
Normal file
502
plugins/ewc/COPYING
Normal file
@ -0,0 +1,502 @@
|
||||
GNU LESSER GENERAL PUBLIC LICENSE
|
||||
Version 2.1, February 1999
|
||||
|
||||
Copyright (C) 1991, 1999 Free Software Foundation, Inc.
|
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
[This is the first released version of the Lesser GPL. It also counts
|
||||
as the successor of the GNU Library Public License, version 2, hence
|
||||
the version number 2.1.]
|
||||
|
||||
Preamble
|
||||
|
||||
The licenses for most software are designed to take away your
|
||||
freedom to share and change it. By contrast, the GNU General Public
|
||||
Licenses are intended to guarantee your freedom to share and change
|
||||
free software--to make sure the software is free for all its users.
|
||||
|
||||
This license, the Lesser General Public License, applies to some
|
||||
specially designated software packages--typically libraries--of the
|
||||
Free Software Foundation and other authors who decide to use it. You
|
||||
can use it too, but we suggest you first think carefully about whether
|
||||
this license or the ordinary General Public License is the better
|
||||
strategy to use in any particular case, based on the explanations below.
|
||||
|
||||
When we speak of free software, we are referring to freedom of use,
|
||||
not price. Our General Public Licenses are designed to make sure that
|
||||
you have the freedom to distribute copies of free software (and charge
|
||||
for this service if you wish); that you receive source code or can get
|
||||
it if you want it; that you can change the software and use pieces of
|
||||
it in new free programs; and that you are informed that you can do
|
||||
these things.
|
||||
|
||||
To protect your rights, we need to make restrictions that forbid
|
||||
distributors to deny you these rights or to ask you to surrender these
|
||||
rights. These restrictions translate to certain responsibilities for
|
||||
you if you distribute copies of the library or if you modify it.
|
||||
|
||||
For example, if you distribute copies of the library, whether gratis
|
||||
or for a fee, you must give the recipients all the rights that we gave
|
||||
you. You must make sure that they, too, receive or can get the source
|
||||
code. If you link other code with the library, you must provide
|
||||
complete object files to the recipients, so that they can relink them
|
||||
with the library after making changes to the library and recompiling
|
||||
it. And you must show them these terms so they know their rights.
|
||||
|
||||
We protect your rights with a two-step method: (1) we copyright the
|
||||
library, and (2) we offer you this license, which gives you legal
|
||||
permission to copy, distribute and/or modify the library.
|
||||
|
||||
To protect each distributor, we want to make it very clear that
|
||||
there is no warranty for the free library. Also, if the library is
|
||||
modified by someone else and passed on, the recipients should know
|
||||
that what they have is not the original version, so that the original
|
||||
author's reputation will not be affected by problems that might be
|
||||
introduced by others.
|
||||
|
||||
Finally, software patents pose a constant threat to the existence of
|
||||
any free program. We wish to make sure that a company cannot
|
||||
effectively restrict the users of a free program by obtaining a
|
||||
restrictive license from a patent holder. Therefore, we insist that
|
||||
any patent license obtained for a version of the library must be
|
||||
consistent with the full freedom of use specified in this license.
|
||||
|
||||
Most GNU software, including some libraries, is covered by the
|
||||
ordinary GNU General Public License. This license, the GNU Lesser
|
||||
General Public License, applies to certain designated libraries, and
|
||||
is quite different from the ordinary General Public License. We use
|
||||
this license for certain libraries in order to permit linking those
|
||||
libraries into non-free programs.
|
||||
|
||||
When a program is linked with a library, whether statically or using
|
||||
a shared library, the combination of the two is legally speaking a
|
||||
combined work, a derivative of the original library. The ordinary
|
||||
General Public License therefore permits such linking only if the
|
||||
entire combination fits its criteria of freedom. The Lesser General
|
||||
Public License permits more lax criteria for linking other code with
|
||||
the library.
|
||||
|
||||
We call this license the "Lesser" General Public License because it
|
||||
does Less to protect the user's freedom than the ordinary General
|
||||
Public License. It also provides other free software developers Less
|
||||
of an advantage over competing non-free programs. These disadvantages
|
||||
are the reason we use the ordinary General Public License for many
|
||||
libraries. However, the Lesser license provides advantages in certain
|
||||
special circumstances.
|
||||
|
||||
For example, on rare occasions, there may be a special need to
|
||||
encourage the widest possible use of a certain library, so that it becomes
|
||||
a de-facto standard. To achieve this, non-free programs must be
|
||||
allowed to use the library. A more frequent case is that a free
|
||||
library does the same job as widely used non-free libraries. In this
|
||||
case, there is little to gain by limiting the free library to free
|
||||
software only, so we use the Lesser General Public License.
|
||||
|
||||
In other cases, permission to use a particular library in non-free
|
||||
programs enables a greater number of people to use a large body of
|
||||
free software. For example, permission to use the GNU C Library in
|
||||
non-free programs enables many more people to use the whole GNU
|
||||
operating system, as well as its variant, the GNU/Linux operating
|
||||
system.
|
||||
|
||||
Although the Lesser General Public License is Less protective of the
|
||||
users' freedom, it does ensure that the user of a program that is
|
||||
linked with the Library has the freedom and the wherewithal to run
|
||||
that program using a modified version of the Library.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow. Pay close attention to the difference between a
|
||||
"work based on the library" and a "work that uses the library". The
|
||||
former contains code derived from the library, whereas the latter must
|
||||
be combined with the library in order to run.
|
||||
|
||||
GNU LESSER GENERAL PUBLIC LICENSE
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
0. This License Agreement applies to any software library or other
|
||||
program which contains a notice placed by the copyright holder or
|
||||
other authorized party saying it may be distributed under the terms of
|
||||
this Lesser General Public License (also called "this License").
|
||||
Each licensee is addressed as "you".
|
||||
|
||||
A "library" means a collection of software functions and/or data
|
||||
prepared so as to be conveniently linked with application programs
|
||||
(which use some of those functions and data) to form executables.
|
||||
|
||||
The "Library", below, refers to any such software library or work
|
||||
which has been distributed under these terms. A "work based on the
|
||||
Library" means either the Library or any derivative work under
|
||||
copyright law: that is to say, a work containing the Library or a
|
||||
portion of it, either verbatim or with modifications and/or translated
|
||||
straightforwardly into another language. (Hereinafter, translation is
|
||||
included without limitation in the term "modification".)
|
||||
|
||||
"Source code" for a work means the preferred form of the work for
|
||||
making modifications to it. For a library, complete source code means
|
||||
all the source code for all modules it contains, plus any associated
|
||||
interface definition files, plus the scripts used to control compilation
|
||||
and installation of the library.
|
||||
|
||||
Activities other than copying, distribution and modification are not
|
||||
covered by this License; they are outside its scope. The act of
|
||||
running a program using the Library is not restricted, and output from
|
||||
such a program is covered only if its contents constitute a work based
|
||||
on the Library (independent of the use of the Library in a tool for
|
||||
writing it). Whether that is true depends on what the Library does
|
||||
and what the program that uses the Library does.
|
||||
|
||||
1. You may copy and distribute verbatim copies of the Library's
|
||||
complete source code as you receive it, in any medium, provided that
|
||||
you conspicuously and appropriately publish on each copy an
|
||||
appropriate copyright notice and disclaimer of warranty; keep intact
|
||||
all the notices that refer to this License and to the absence of any
|
||||
warranty; and distribute a copy of this License along with the
|
||||
Library.
|
||||
|
||||
You may charge a fee for the physical act of transferring a copy,
|
||||
and you may at your option offer warranty protection in exchange for a
|
||||
fee.
|
||||
|
||||
2. You may modify your copy or copies of the Library or any portion
|
||||
of it, thus forming a work based on the Library, and copy and
|
||||
distribute such modifications or work under the terms of Section 1
|
||||
above, provided that you also meet all of these conditions:
|
||||
|
||||
a) The modified work must itself be a software library.
|
||||
|
||||
b) You must cause the files modified to carry prominent notices
|
||||
stating that you changed the files and the date of any change.
|
||||
|
||||
c) You must cause the whole of the work to be licensed at no
|
||||
charge to all third parties under the terms of this License.
|
||||
|
||||
d) If a facility in the modified Library refers to a function or a
|
||||
table of data to be supplied by an application program that uses
|
||||
the facility, other than as an argument passed when the facility
|
||||
is invoked, then you must make a good faith effort to ensure that,
|
||||
in the event an application does not supply such function or
|
||||
table, the facility still operates, and performs whatever part of
|
||||
its purpose remains meaningful.
|
||||
|
||||
(For example, a function in a library to compute square roots has
|
||||
a purpose that is entirely well-defined independent of the
|
||||
application. Therefore, Subsection 2d requires that any
|
||||
application-supplied function or table used by this function must
|
||||
be optional: if the application does not supply it, the square
|
||||
root function must still compute square roots.)
|
||||
|
||||
These requirements apply to the modified work as a whole. If
|
||||
identifiable sections of that work are not derived from the Library,
|
||||
and can be reasonably considered independent and separate works in
|
||||
themselves, then this License, and its terms, do not apply to those
|
||||
sections when you distribute them as separate works. But when you
|
||||
distribute the same sections as part of a whole which is a work based
|
||||
on the Library, the distribution of the whole must be on the terms of
|
||||
this License, whose permissions for other licensees extend to the
|
||||
entire whole, and thus to each and every part regardless of who wrote
|
||||
it.
|
||||
|
||||
Thus, it is not the intent of this section to claim rights or contest
|
||||
your rights to work written entirely by you; rather, the intent is to
|
||||
exercise the right to control the distribution of derivative or
|
||||
collective works based on the Library.
|
||||
|
||||
In addition, mere aggregation of another work not based on the Library
|
||||
with the Library (or with a work based on the Library) on a volume of
|
||||
a storage or distribution medium does not bring the other work under
|
||||
the scope of this License.
|
||||
|
||||
3. You may opt to apply the terms of the ordinary GNU General Public
|
||||
License instead of this License to a given copy of the Library. To do
|
||||
this, you must alter all the notices that refer to this License, so
|
||||
that they refer to the ordinary GNU General Public License, version 2,
|
||||
instead of to this License. (If a newer version than version 2 of the
|
||||
ordinary GNU General Public License has appeared, then you can specify
|
||||
that version instead if you wish.) Do not make any other change in
|
||||
these notices.
|
||||
|
||||
Once this change is made in a given copy, it is irreversible for
|
||||
that copy, so the ordinary GNU General Public License applies to all
|
||||
subsequent copies and derivative works made from that copy.
|
||||
|
||||
This option is useful when you wish to copy part of the code of
|
||||
the Library into a program that is not a library.
|
||||
|
||||
4. You may copy and distribute the Library (or a portion or
|
||||
derivative of it, under Section 2) in object code or executable form
|
||||
under the terms of Sections 1 and 2 above provided that you accompany
|
||||
it with the complete corresponding machine-readable source code, which
|
||||
must be distributed under the terms of Sections 1 and 2 above on a
|
||||
medium customarily used for software interchange.
|
||||
|
||||
If distribution of object code is made by offering access to copy
|
||||
from a designated place, then offering equivalent access to copy the
|
||||
source code from the same place satisfies the requirement to
|
||||
distribute the source code, even though third parties are not
|
||||
compelled to copy the source along with the object code.
|
||||
|
||||
5. A program that contains no derivative of any portion of the
|
||||
Library, but is designed to work with the Library by being compiled or
|
||||
linked with it, is called a "work that uses the Library". Such a
|
||||
work, in isolation, is not a derivative work of the Library, and
|
||||
therefore falls outside the scope of this License.
|
||||
|
||||
However, linking a "work that uses the Library" with the Library
|
||||
creates an executable that is a derivative of the Library (because it
|
||||
contains portions of the Library), rather than a "work that uses the
|
||||
library". The executable is therefore covered by this License.
|
||||
Section 6 states terms for distribution of such executables.
|
||||
|
||||
When a "work that uses the Library" uses material from a header file
|
||||
that is part of the Library, the object code for the work may be a
|
||||
derivative work of the Library even though the source code is not.
|
||||
Whether this is true is especially significant if the work can be
|
||||
linked without the Library, or if the work is itself a library. The
|
||||
threshold for this to be true is not precisely defined by law.
|
||||
|
||||
If such an object file uses only numerical parameters, data
|
||||
structure layouts and accessors, and small macros and small inline
|
||||
functions (ten lines or less in length), then the use of the object
|
||||
file is unrestricted, regardless of whether it is legally a derivative
|
||||
work. (Executables containing this object code plus portions of the
|
||||
Library will still fall under Section 6.)
|
||||
|
||||
Otherwise, if the work is a derivative of the Library, you may
|
||||
distribute the object code for the work under the terms of Section 6.
|
||||
Any executables containing that work also fall under Section 6,
|
||||
whether or not they are linked directly with the Library itself.
|
||||
|
||||
6. As an exception to the Sections above, you may also combine or
|
||||
link a "work that uses the Library" with the Library to produce a
|
||||
work containing portions of the Library, and distribute that work
|
||||
under terms of your choice, provided that the terms permit
|
||||
modification of the work for the customer's own use and reverse
|
||||
engineering for debugging such modifications.
|
||||
|
||||
You must give prominent notice with each copy of the work that the
|
||||
Library is used in it and that the Library and its use are covered by
|
||||
this License. You must supply a copy of this License. If the work
|
||||
during execution displays copyright notices, you must include the
|
||||
copyright notice for the Library among them, as well as a reference
|
||||
directing the user to the copy of this License. Also, you must do one
|
||||
of these things:
|
||||
|
||||
a) Accompany the work with the complete corresponding
|
||||
machine-readable source code for the Library including whatever
|
||||
changes were used in the work (which must be distributed under
|
||||
Sections 1 and 2 above); and, if the work is an executable linked
|
||||
with the Library, with the complete machine-readable "work that
|
||||
uses the Library", as object code and/or source code, so that the
|
||||
user can modify the Library and then relink to produce a modified
|
||||
executable containing the modified Library. (It is understood
|
||||
that the user who changes the contents of definitions files in the
|
||||
Library will not necessarily be able to recompile the application
|
||||
to use the modified definitions.)
|
||||
|
||||
b) Use a suitable shared library mechanism for linking with the
|
||||
Library. A suitable mechanism is one that (1) uses at run time a
|
||||
copy of the library already present on the user's computer system,
|
||||
rather than copying library functions into the executable, and (2)
|
||||
will operate properly with a modified version of the library, if
|
||||
the user installs one, as long as the modified version is
|
||||
interface-compatible with the version that the work was made with.
|
||||
|
||||
c) Accompany the work with a written offer, valid for at
|
||||
least three years, to give the same user the materials
|
||||
specified in Subsection 6a, above, for a charge no more
|
||||
than the cost of performing this distribution.
|
||||
|
||||
d) If distribution of the work is made by offering access to copy
|
||||
from a designated place, offer equivalent access to copy the above
|
||||
specified materials from the same place.
|
||||
|
||||
e) Verify that the user has already received a copy of these
|
||||
materials or that you have already sent this user a copy.
|
||||
|
||||
For an executable, the required form of the "work that uses the
|
||||
Library" must include any data and utility programs needed for
|
||||
reproducing the executable from it. However, as a special exception,
|
||||
the materials to be distributed need not include anything that is
|
||||
normally distributed (in either source or binary form) with the major
|
||||
components (compiler, kernel, and so on) of the operating system on
|
||||
which the executable runs, unless that component itself accompanies
|
||||
the executable.
|
||||
|
||||
It may happen that this requirement contradicts the license
|
||||
restrictions of other proprietary libraries that do not normally
|
||||
accompany the operating system. Such a contradiction means you cannot
|
||||
use both them and the Library together in an executable that you
|
||||
distribute.
|
||||
|
||||
7. You may place library facilities that are a work based on the
|
||||
Library side-by-side in a single library together with other library
|
||||
facilities not covered by this License, and distribute such a combined
|
||||
library, provided that the separate distribution of the work based on
|
||||
the Library and of the other library facilities is otherwise
|
||||
permitted, and provided that you do these two things:
|
||||
|
||||
a) Accompany the combined library with a copy of the same work
|
||||
based on the Library, uncombined with any other library
|
||||
facilities. This must be distributed under the terms of the
|
||||
Sections above.
|
||||
|
||||
b) Give prominent notice with the combined library of the fact
|
||||
that part of it is a work based on the Library, and explaining
|
||||
where to find the accompanying uncombined form of the same work.
|
||||
|
||||
8. You may not copy, modify, sublicense, link with, or distribute
|
||||
the Library except as expressly provided under this License. Any
|
||||
attempt otherwise to copy, modify, sublicense, link with, or
|
||||
distribute the Library is void, and will automatically terminate your
|
||||
rights under this License. However, parties who have received copies,
|
||||
or rights, from you under this License will not have their licenses
|
||||
terminated so long as such parties remain in full compliance.
|
||||
|
||||
9. You are not required to accept this License, since you have not
|
||||
signed it. However, nothing else grants you permission to modify or
|
||||
distribute the Library or its derivative works. These actions are
|
||||
prohibited by law if you do not accept this License. Therefore, by
|
||||
modifying or distributing the Library (or any work based on the
|
||||
Library), you indicate your acceptance of this License to do so, and
|
||||
all its terms and conditions for copying, distributing or modifying
|
||||
the Library or works based on it.
|
||||
|
||||
10. Each time you redistribute the Library (or any work based on the
|
||||
Library), the recipient automatically receives a license from the
|
||||
original licensor to copy, distribute, link with or modify the Library
|
||||
subject to these terms and conditions. You may not impose any further
|
||||
restrictions on the recipients' exercise of the rights granted herein.
|
||||
You are not responsible for enforcing compliance by third parties with
|
||||
this License.
|
||||
|
||||
11. If, as a consequence of a court judgment or allegation of patent
|
||||
infringement or for any other reason (not limited to patent issues),
|
||||
conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot
|
||||
distribute so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you
|
||||
may not distribute the Library at all. For example, if a patent
|
||||
license would not permit royalty-free redistribution of the Library by
|
||||
all those who receive copies directly or indirectly through you, then
|
||||
the only way you could satisfy both it and this License would be to
|
||||
refrain entirely from distribution of the Library.
|
||||
|
||||
If any portion of this section is held invalid or unenforceable under any
|
||||
particular circumstance, the balance of the section is intended to apply,
|
||||
and the section as a whole is intended to apply in other circumstances.
|
||||
|
||||
It is not the purpose of this section to induce you to infringe any
|
||||
patents or other property right claims or to contest validity of any
|
||||
such claims; this section has the sole purpose of protecting the
|
||||
integrity of the free software distribution system which is
|
||||
implemented by public license practices. Many people have made
|
||||
generous contributions to the wide range of software distributed
|
||||
through that system in reliance on consistent application of that
|
||||
system; it is up to the author/donor to decide if he or she is willing
|
||||
to distribute software through any other system and a licensee cannot
|
||||
impose that choice.
|
||||
|
||||
This section is intended to make thoroughly clear what is believed to
|
||||
be a consequence of the rest of this License.
|
||||
|
||||
12. If the distribution and/or use of the Library is restricted in
|
||||
certain countries either by patents or by copyrighted interfaces, the
|
||||
original copyright holder who places the Library under this License may add
|
||||
an explicit geographical distribution limitation excluding those countries,
|
||||
so that distribution is permitted only in or among countries not thus
|
||||
excluded. In such case, this License incorporates the limitation as if
|
||||
written in the body of this License.
|
||||
|
||||
13. The Free Software Foundation may publish revised and/or new
|
||||
versions of the Lesser General Public License from time to time.
|
||||
Such new versions will be similar in spirit to the present version,
|
||||
but may differ in detail to address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the Library
|
||||
specifies a version number of this License which applies to it and
|
||||
"any later version", you have the option of following the terms and
|
||||
conditions either of that version or of any later version published by
|
||||
the Free Software Foundation. If the Library does not specify a
|
||||
license version number, you may choose any version ever published by
|
||||
the Free Software Foundation.
|
||||
|
||||
14. If you wish to incorporate parts of the Library into other free
|
||||
programs whose distribution conditions are incompatible with these,
|
||||
write to the author to ask for permission. For software which is
|
||||
copyrighted by the Free Software Foundation, write to the Free
|
||||
Software Foundation; we sometimes make exceptions for this. Our
|
||||
decision will be guided by the two goals of preserving the free status
|
||||
of all derivatives of our free software and of promoting the sharing
|
||||
and reuse of software generally.
|
||||
|
||||
NO WARRANTY
|
||||
|
||||
15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
|
||||
WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
|
||||
EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
|
||||
OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
|
||||
KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
|
||||
LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
|
||||
THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||||
|
||||
16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
|
||||
WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
|
||||
AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
|
||||
FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
|
||||
CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
|
||||
LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
|
||||
RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
|
||||
FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
|
||||
SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
|
||||
DAMAGES.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
How to Apply These Terms to Your New Libraries
|
||||
|
||||
If you develop a new library, and you want it to be of the greatest
|
||||
possible use to the public, we recommend making it free software that
|
||||
everyone can redistribute and change. You can do so by permitting
|
||||
redistribution under these terms (or, alternatively, under the terms of the
|
||||
ordinary General Public License).
|
||||
|
||||
To apply these terms, attach the following notices to the library. It is
|
||||
safest to attach them to the start of each source file to most effectively
|
||||
convey the exclusion of warranty; and each file should have at least the
|
||||
"copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
<one line to give the library's name and a brief idea of what it does.>
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
This library 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
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with this library; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
You should also get your employer (if you work as a programmer) or your
|
||||
school, if any, to sign a "copyright disclaimer" for the library, if
|
||||
necessary. Here is a sample; alter the names:
|
||||
|
||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the
|
||||
library `Frob' (a library for tweaking knobs) written by James Random Hacker.
|
||||
|
||||
<signature of Ty Coon>, 1 April 1990
|
||||
Ty Coon, President of Vice
|
||||
|
||||
That's all there is to it!
|
231
plugins/ewc/ewc.c
Normal file
231
plugins/ewc/ewc.c
Normal file
@ -0,0 +1,231 @@
|
||||
/*
|
||||
EasyWinampControl - A Winamp "What's playing" plugin for Xchat
|
||||
Copyright (C) Yann HAMON & contributors
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
This library 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
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with this library; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#include "xchat-plugin.h"
|
||||
#include <windows.h>
|
||||
|
||||
static xchat_plugin *ph; /* plugin handle */
|
||||
static int enable = 1;
|
||||
|
||||
// For example, circularstrstr("winamp", "pwi", 3) would return 5 (the index of p)
|
||||
int circularstrstr(char* a, char* b, int nb)
|
||||
{
|
||||
int equal = 1;
|
||||
int length;
|
||||
int pos=-1;
|
||||
int i, j;
|
||||
|
||||
length = strlen(a);
|
||||
|
||||
for (i=0; i<length && pos == -1; ++i) {
|
||||
equal = 1;
|
||||
for (j=0; j<nb;j++) {
|
||||
if (a[(i+j)%length] != b[j])
|
||||
equal = 0;
|
||||
}
|
||||
if (equal == 1)
|
||||
pos = i;
|
||||
}
|
||||
|
||||
return pos;
|
||||
}
|
||||
|
||||
void GetCurrentSongsName(HWND hwndWinamp, char* title, int titlesize)
|
||||
{
|
||||
int pos;
|
||||
char *title2;
|
||||
int i, j=0;
|
||||
int length;
|
||||
char *p;
|
||||
|
||||
GetWindowText(hwndWinamp, title, titlesize);
|
||||
length = strlen(title);
|
||||
|
||||
if ((pos = circularstrstr(title, "- Winamp ***", 12)) != -1) {
|
||||
// The option "scroll song title in taskbar" is on
|
||||
title2 = (char*) malloc (titlesize*sizeof(char));
|
||||
|
||||
for (i=(pos+12)%length; i!=pos; i=(i+1)%length)
|
||||
title2[j++] = title[i];
|
||||
|
||||
title2[j] = '\0';
|
||||
|
||||
p = title2;
|
||||
while (p<title2+titlesize && *p != '.')
|
||||
p++;
|
||||
p+=2; // Delete the . and the following white space
|
||||
|
||||
strcpy(title, p);
|
||||
free(title2);
|
||||
}
|
||||
else {
|
||||
p = title;
|
||||
while (p<title+titlesize && *p != '.')
|
||||
p++;
|
||||
p+=2; // Delete the . and the following white space
|
||||
if (p<title+titlesize)
|
||||
strncpy(title, p, titlesize-(p-title));
|
||||
|
||||
// Delete the trailing "- winamp"
|
||||
p = title + titlesize - 1;
|
||||
while (p>title && *p != '-') p--;
|
||||
*p = '\0';
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Controlling winamp
|
||||
static int wcmd_cb(char *word[], char *word_eol[], void *userdata)
|
||||
{
|
||||
// Everything's here : http://winamp.com/nsdn/winamp2x/dev/sdk/api.php
|
||||
// The previous url seems dead, see http://forums.winamp.com/showthread.php?threadid=180297
|
||||
HWND hwndWinamp = NULL;
|
||||
|
||||
if ((hwndWinamp = FindWindow("Winamp v1.x",NULL)) == NULL) {
|
||||
xchat_print(ph, "Winamp's window not found - Is winamp really running?\n");
|
||||
}
|
||||
else {
|
||||
if (strcmp(word[1], "") == 0)
|
||||
xchat_print(ph, "Usage: wcmd [command]\n");
|
||||
else if (strcmp(word[2], "next") == 0) {
|
||||
xchat_print(ph, "Loading next song...\n");
|
||||
SendMessage (hwndWinamp, WM_COMMAND, 40048, 0);
|
||||
}
|
||||
else if (strcmp(word[2], "prev") == 0) {
|
||||
xchat_print(ph, "Loading previous song...\n");
|
||||
SendMessage (hwndWinamp, WM_COMMAND, 40044, 0);
|
||||
}
|
||||
else if (strcmp(word[2], "play") == 0) {
|
||||
xchat_print(ph, "Playin'...\n");
|
||||
SendMessage (hwndWinamp, WM_COMMAND, 40045, 0);
|
||||
}
|
||||
else if (strcmp(word[2], "stop") == 0) {
|
||||
xchat_print(ph, "Winamp stopped!...\n");
|
||||
SendMessage (hwndWinamp, WM_COMMAND, 40047, 0);
|
||||
}
|
||||
else if (strcmp(word[2], "pause") == 0) {
|
||||
SendMessage (hwndWinamp, WM_COMMAND, 40046, 0);
|
||||
}
|
||||
}
|
||||
|
||||
return XCHAT_EAT_ALL;
|
||||
}
|
||||
|
||||
|
||||
// Display current song
|
||||
static int wp_cb(char *word[], char *word_eol[], void *userdata)
|
||||
{
|
||||
HWND hwndWinamp = NULL;
|
||||
int bitrate, length, elapsed, minutes, seconds, eminutes, eseconds, samplerate, nbchannels;
|
||||
char elapsedtime[7];
|
||||
char totaltime[7];
|
||||
char this_title[1024];
|
||||
|
||||
if ((hwndWinamp = FindWindow("Winamp v1.x",NULL)) == NULL)
|
||||
xchat_print(ph, "Winamp's window not found - Is winamp really running?\n");
|
||||
else {
|
||||
//Winamp's running
|
||||
// Seems buggy when winamp2's agent is running, and winamp not (or winamp3) -> crashes xchat.
|
||||
SendMessage(hwndWinamp, WM_USER, (WPARAM)0, (LPARAM)125);
|
||||
|
||||
if ((samplerate = SendMessage(hwndWinamp, WM_USER, (WPARAM)0, (LPARAM)126)) == 0) {
|
||||
xchat_print(ph, "Could not get current song's samplerate... !?\n");
|
||||
return XCHAT_EAT_ALL;
|
||||
}
|
||||
if ((bitrate = SendMessage(hwndWinamp, WM_USER, (WPARAM)1, (LPARAM)126)) == 0) {
|
||||
xchat_print(ph, "Could not get current song's bitrate... !?\n");
|
||||
return XCHAT_EAT_ALL;
|
||||
}
|
||||
if ((nbchannels = SendMessage(hwndWinamp, WM_USER, (WPARAM)2, (LPARAM)126)) == 0) {
|
||||
xchat_print(ph, "Could not get the number of channels... !?\n");
|
||||
return XCHAT_EAT_ALL;
|
||||
}
|
||||
if ((length = SendMessage(hwndWinamp, WM_USER, (WPARAM)1, (LPARAM)105)) == 0) {
|
||||
// Could be buggy when streaming audio or video, returned length is unexpected;
|
||||
// How to detect is Winamp is streaming, and display ??:?? in that case?
|
||||
xchat_print(ph, "Could not get current song's length... !?\n");
|
||||
return XCHAT_EAT_ALL;
|
||||
}
|
||||
else {
|
||||
minutes = length/60;
|
||||
seconds = length%60;
|
||||
|
||||
if (seconds>9)
|
||||
wsprintf(totaltime, "%d:%d", minutes, seconds);
|
||||
else
|
||||
wsprintf(totaltime, "%d:0%d", minutes, seconds);
|
||||
}
|
||||
if ((elapsed = SendMessage(hwndWinamp, WM_USER, (WPARAM)0, (LPARAM)105)) == 0) {
|
||||
xchat_print(ph, "Could not get current song's elapsed time... !?\n");
|
||||
return XCHAT_EAT_ALL;
|
||||
}
|
||||
else {
|
||||
eminutes = (elapsed/1000)/60; /* kinda stupid sounding, but e is for elapsed */
|
||||
eseconds = (elapsed/1000)%60;
|
||||
|
||||
if (eseconds>9)
|
||||
wsprintf(elapsedtime, "%d:%d", eminutes, eseconds);
|
||||
else
|
||||
wsprintf(elapsedtime, "%d:0%d", eminutes, eseconds);
|
||||
}
|
||||
|
||||
if ((bitrate = SendMessage(hwndWinamp, WM_USER, (WPARAM)1, (LPARAM)126)) == 0) {
|
||||
xchat_print(ph, "Could not get current song's bitrate... !?\n");
|
||||
return XCHAT_EAT_ALL;
|
||||
}
|
||||
|
||||
GetCurrentSongsName(hwndWinamp, this_title, 1024);
|
||||
|
||||
xchat_commandf(ph, "dispcurrsong %d %d %d %s %s %s", samplerate, bitrate, nbchannels, elapsedtime, totaltime, this_title);
|
||||
}
|
||||
|
||||
return XCHAT_EAT_ALL; /* eat this command so xchat and other plugins can't process it */
|
||||
}
|
||||
|
||||
|
||||
|
||||
int xchat_plugin_init(xchat_plugin *plugin_handle,
|
||||
char **plugin_name,
|
||||
char **plugin_desc,
|
||||
char **plugin_version,
|
||||
char *arg)
|
||||
{
|
||||
/* we need to save this for use with any xchat_* functions */
|
||||
ph = plugin_handle;
|
||||
|
||||
*plugin_name = "EasyWinampControl";
|
||||
*plugin_desc = "Some commands to remotely control winamp";
|
||||
*plugin_version = "1.2";
|
||||
|
||||
xchat_hook_command(ph, "wp", XCHAT_PRI_NORM, wp_cb,
|
||||
"Usage: wp", 0);
|
||||
|
||||
xchat_hook_command(ph, "wcmd", XCHAT_PRI_NORM, wcmd_cb,
|
||||
"Usage: wcmd [play|pause|stop|prev|next]", 0);
|
||||
|
||||
xchat_print(ph, "EasyWinampControl 1.2 plugin loaded successfully!\n");
|
||||
|
||||
return 1; /* return 1 for success */
|
||||
}
|
||||
|
||||
int xchat_plugin_deinit(void)
|
||||
{
|
||||
xchat_print(ph, "EasyWinampControl 1.2 plugin unloaded successfully!\n");
|
||||
return 1;
|
||||
}
|
19
plugins/ewc/makefile.mak
Normal file
19
plugins/ewc/makefile.mak
Normal file
@ -0,0 +1,19 @@
|
||||
include "..\..\src\makeinc.mak"
|
||||
|
||||
xcewc.dll: ewc.obj ewc.def
|
||||
link $(LDFLAGS) $(LIBS) /dll /out:xcewc.dll /def:ewc.def ewc.obj
|
||||
dir xcewc.dll
|
||||
|
||||
ewc.def:
|
||||
echo EXPORTS > ewc.def
|
||||
echo xchat_plugin_init >> ewc.def
|
||||
echo xchat_plugin_deinit >> ewc.def
|
||||
|
||||
ewc.obj: ewc.c makefile.mak
|
||||
cl $(CFLAGS) /I.. ewc.c
|
||||
|
||||
clean:
|
||||
del *.obj
|
||||
del *.dll
|
||||
del *.exp
|
||||
del *.lib
|
29
plugins/perl/makefile.mak
Normal file
29
plugins/perl/makefile.mak
Normal file
@ -0,0 +1,29 @@
|
||||
include "..\..\src\makeinc.mak"
|
||||
|
||||
TARGET = $(PERLOUTPUT)
|
||||
|
||||
all: $(TARGET)
|
||||
|
||||
perl.def:
|
||||
echo EXPORTS > perl.def
|
||||
echo xchat_plugin_init >> perl.def
|
||||
echo xchat_plugin_deinit >> perl.def
|
||||
echo xchat_plugin_get_info >> perl.def
|
||||
|
||||
perl.obj: perl.c
|
||||
$(CC) $(CFLAGS) perl.c $(GLIB) -I.. -I$(PERLPATH) -DPERL_DLL=\"$(PERLLIB).dll\"
|
||||
|
||||
perl.c: xchat.pm.h
|
||||
|
||||
xchat.pm.h: Xchat.pm IRC.pm
|
||||
perl.exe generate_header
|
||||
|
||||
$(TARGET): perl.obj perl.def
|
||||
$(LINK) /DLL /out:$(TARGET) perl.obj $(LDFLAGS) $(PERLLIB).lib /LIBPATH:$(PERLPATH) /DELAYLOAD:$(PERLLIB).dll DELAYIMP.LIB user32.lib shell32.lib advapi32.lib /def:perl.def
|
||||
|
||||
clean:
|
||||
del $(TARGET)
|
||||
del *.obj
|
||||
del perl.def
|
||||
del *.lib
|
||||
del *.exp
|
24
plugins/python/makefile.mak
Normal file
24
plugins/python/makefile.mak
Normal file
@ -0,0 +1,24 @@
|
||||
include "..\..\src\makeinc.mak"
|
||||
|
||||
TARGET = $(PYTHONOUTPUT)
|
||||
|
||||
all: $(TARGET)
|
||||
|
||||
python.def:
|
||||
echo EXPORTS > python.def
|
||||
echo xchat_plugin_init >> python.def
|
||||
echo xchat_plugin_deinit >> python.def
|
||||
echo xchat_plugin_get_info >> python.def
|
||||
|
||||
python.obj: python.c
|
||||
$(CC) $(CFLAGS) /Dusleep=_sleep /DPATH_MAX=255 python.c $(GLIB) /I.. /I$(PYTHONPATH)\INCLUDE /DPYTHON_DLL=\"$(PYTHONLIB).dll\"
|
||||
|
||||
$(TARGET): python.obj python.def
|
||||
$(LINK) /DLL /out:$(TARGET) $(LDFLAGS) python.obj $(PYTHONLIB).lib /LIBPATH:$(PYTHONPATH)\LIBS $(PYTHONLIB).lib $(LIBS) /def:python.def
|
||||
|
||||
clean:
|
||||
del $(TARGET)
|
||||
del *.obj
|
||||
del python.def
|
||||
del *.lib
|
||||
del *.exp
|
22
plugins/tcl/makefile.mak
Normal file
22
plugins/tcl/makefile.mak
Normal file
@ -0,0 +1,22 @@
|
||||
include "..\..\src\makeinc.mak"
|
||||
|
||||
TARGET = $(TCLOUTPUT)
|
||||
|
||||
all: $(TARGET)
|
||||
|
||||
tcl.def:
|
||||
echo EXPORTS > tcl.def
|
||||
echo xchat_plugin_init >> tcl.def
|
||||
echo xchat_plugin_deinit >> tcl.def
|
||||
echo xchat_plugin_get_info >> tcl.def
|
||||
|
||||
tclplugin.obj: tclplugin.c
|
||||
$(CC) $(CFLAGS) tclplugin.c /I$(TCLPATH)\INCLUDE /I../../include /I.. /DTCL_DLL=\"$(TCLLIB).dll\"
|
||||
|
||||
$(TARGET): tclplugin.obj tcl.def
|
||||
$(LINK) /DLL /out:$(TARGET) $(LDFLAGS) tclplugin.obj /LIBPATH:$(TCLPATH)\LIB $(TCLLIB).lib /DELAYLOAD:$(TCLLIB).dll DELAYIMP.LIB /def:tcl.def
|
||||
|
||||
clean:
|
||||
del $(TARGET)
|
||||
del *.obj
|
||||
del tcl.def
|
729
plugins/xtray/callbacks.cpp
Normal file
729
plugins/xtray/callbacks.cpp
Normal file
@ -0,0 +1,729 @@
|
||||
/* X-Tray
|
||||
* Copyright (C) 2005 Michael Hotaling <Mike.Hotaling@SinisterDevelopments.com>
|
||||
*
|
||||
* X-Tray is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* X-Tray is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with X-Tray; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#define _WIN32_IE 0x0601
|
||||
|
||||
#include <windows.h>
|
||||
#include <stdio.h>
|
||||
#include <commctrl.h>
|
||||
#include <tchar.h>
|
||||
#include "utility.h"
|
||||
#include "plugin.h"
|
||||
#include "xtray.h"
|
||||
#include "xchat.h"
|
||||
#include "callbacks.h"
|
||||
#include "resource.h"
|
||||
#include "sdTray.h"
|
||||
#include "sdAlerts.h"
|
||||
|
||||
HWND g_hPrefTabEvents;
|
||||
HWND g_hPrefTabSettings;
|
||||
HWND g_hPrefTabAlerts;
|
||||
HWND g_hPrefTabAbout;
|
||||
bool g_bCanQuit;
|
||||
int g_iIsActive = 1;
|
||||
|
||||
|
||||
BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM lParam)
|
||||
{
|
||||
TCHAR szTitle[10];
|
||||
GetWindowText(hWnd, szTitle, 9);
|
||||
|
||||
if(_tcsstr(szTitle, _T("X-Chat [")))
|
||||
{
|
||||
g_hXchatWnd = hWnd;
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/***********************************************************************************************/
|
||||
/******* our xchat event call back, get the name and info for each event and save it ***********/
|
||||
/******* for our alerts later ***********/
|
||||
/***********************************************************************************************/
|
||||
int event_cb(char *word[], void *userdata)
|
||||
{
|
||||
int iEvent = (int)userdata;
|
||||
|
||||
if(iEvent > 10)
|
||||
return XCHAT_EAT_NONE;
|
||||
|
||||
/***************************************************************************************/
|
||||
/***** if the window is minimized or if we're allowed to show alerts when its not **/
|
||||
/***** and if the option to show the specified alert is true and if we're even **/
|
||||
/***** allowed to show alerts at all then we show them (a bit confusing but it works) **/
|
||||
/***************************************************************************************/
|
||||
if(((g_iIsActive == 0) || !(g_dwPrefs & (1<<PREF_OSBWM))) && (g_dwPrefs & (1<<PREF_AMAE)) && (g_dwPrefs & (1<<iEvent)))
|
||||
{
|
||||
/*********************************/
|
||||
/*********** Our Buffers *********/
|
||||
/*********************************/
|
||||
char szInfo[512];
|
||||
char szName[64];
|
||||
DWORD dwInfoFlags;
|
||||
int iTime = g_iTime*1000;
|
||||
char *szTemp = NULL;
|
||||
|
||||
if(g_dwPrefs & (1<<PREF_KAOI))
|
||||
{
|
||||
iTime = 0;
|
||||
}
|
||||
|
||||
switch(iEvent)
|
||||
{
|
||||
case CHAN_HILIGHT:
|
||||
_snprintf(szInfo, 512, "%s:\r\n%s", word[1], word[2]);
|
||||
_snprintf(szName, 64, "Hilight");
|
||||
dwInfoFlags = NIIF_INFO;
|
||||
break;
|
||||
case CHAN_TOPIC_CHANGE:
|
||||
_snprintf(szInfo, 512, "%s has changed the topic to %s", word[1], word[2]);
|
||||
_snprintf(szName, 64, "Topic Change: %s", word[3]);
|
||||
dwInfoFlags = NIIF_INFO;
|
||||
break;
|
||||
case CHAN_INVITE:
|
||||
_snprintf(szInfo, 512, "%s has invited you into %s", word[1], word[2]);
|
||||
_snprintf(szName, 64, "Invite");
|
||||
dwInfoFlags = NIIF_INFO;
|
||||
break;
|
||||
case CHAN_KICKED:
|
||||
_snprintf(szInfo, 512, "Kicked from %s by %s:\r\n%s", word[2], word[3], word[4]);
|
||||
_snprintf(szName, 64, "Kick");
|
||||
dwInfoFlags = NIIF_WARNING;
|
||||
break;
|
||||
case CHAN_BANNED:
|
||||
_snprintf(szInfo, 512, "Cannot join #%s You are banned.", word[1]);
|
||||
_snprintf(szName, 64, "Banned");
|
||||
dwInfoFlags = NIIF_WARNING;
|
||||
break;
|
||||
case CTCP_GENERIC:
|
||||
_snprintf(szInfo, 512, "%s:\r\nCTCP %s", word[2], word[1]);
|
||||
_snprintf(szName, 64, "CTCP");
|
||||
dwInfoFlags = NIIF_INFO;
|
||||
break;
|
||||
case PMSG_RECEIVE:
|
||||
_snprintf(szInfo, 512, "%s:\r\n%s", word[1], word[2]);
|
||||
_snprintf(szName, 64, "Private Message");
|
||||
dwInfoFlags = NIIF_INFO;
|
||||
break;
|
||||
case SERV_DISCONNECT:
|
||||
_snprintf(szInfo, 512, "Disconnected\r\nError: %s", word[1]);
|
||||
_snprintf(szName, 64, "Disconnect");
|
||||
dwInfoFlags = NIIF_ERROR;
|
||||
break;
|
||||
case SERV_KILLED:
|
||||
_snprintf(szInfo, 512, "Killed(%s(%s))", word[1], word[2]);
|
||||
_snprintf(szName, 64, "Server Admin has killed you");
|
||||
dwInfoFlags = NIIF_ERROR;
|
||||
break;
|
||||
case SERV_NOTICE:
|
||||
_snprintf(szInfo, 512, "Notice:\r\n%s: %s", word[1], word[2]);
|
||||
_snprintf(szName, 64, "Notice");
|
||||
dwInfoFlags = NIIF_INFO;
|
||||
break;
|
||||
case 11:
|
||||
_snprintf(szInfo, 512, ":\r\n%s: %s", word[1], word[2]);
|
||||
_snprintf(szName, 64, "Notice");
|
||||
dwInfoFlags = NIIF_INFO;
|
||||
break;
|
||||
}
|
||||
|
||||
/**************************************************************************************/
|
||||
/***** Use windows instead of balloons, and if its a window should we keep it open ****/
|
||||
/***** indefinately? ****/
|
||||
/**************************************************************************************/
|
||||
szTemp = xchat_strip_color(szInfo);
|
||||
|
||||
if(g_dwPrefs & (1<<PREF_UWIOB))
|
||||
{
|
||||
sdSystemAlert((HINSTANCE)g_hInstance, IDD_ALERT, szTemp, szName, iTime);
|
||||
}
|
||||
else
|
||||
{
|
||||
ShowBalloon(g_hXchatWnd, 1, szTemp, szName, iTime, dwInfoFlags);
|
||||
}
|
||||
|
||||
free(szTemp);
|
||||
}
|
||||
|
||||
if(g_dwPrefs & (1<<PREF_BLINK))
|
||||
{
|
||||
BlinkIcon(g_hXchatWnd, 1, g_hIcons[0], g_hIcons[(iEvent+1)], 700, 5);
|
||||
|
||||
}
|
||||
|
||||
/***********************************/
|
||||
/***** pass the events to xchat ****/
|
||||
/***********************************/
|
||||
return XCHAT_EAT_NONE;
|
||||
}
|
||||
|
||||
int command_cb(char *word[], char *word_eol[], void *userdata)
|
||||
{
|
||||
char szInfo[512];
|
||||
char *szTemp = NULL;
|
||||
int iTime = g_iTime*1000;
|
||||
|
||||
_snprintf(szInfo, 512, word_eol[2]);
|
||||
szTemp = xchat_strip_color(szInfo);
|
||||
|
||||
if(g_dwPrefs & (1<<PREF_KAOI))
|
||||
{
|
||||
iTime = 0;
|
||||
}
|
||||
|
||||
if(((g_iIsActive == 0) || !(g_dwPrefs & (1<<PREF_OSBWM))) && (g_dwPrefs & (1<<PREF_AMAE)))
|
||||
{
|
||||
if(g_dwPrefs & (1<<PREF_UWIOB))
|
||||
{
|
||||
sdSystemAlert((HINSTANCE)g_hInstance, IDD_ALERT, szTemp, "Alert", iTime);
|
||||
}
|
||||
else
|
||||
{
|
||||
ShowBalloon(g_hXchatWnd, 1, szTemp, "Alert", iTime, NIIF_INFO);
|
||||
}
|
||||
}
|
||||
|
||||
free(szTemp);
|
||||
|
||||
return XCHAT_EAT_ALL;
|
||||
}
|
||||
|
||||
LRESULT CALLBACK WindowProc(HWND hWnd, UINT msg, WPARAM wparam, LPARAM lparam)
|
||||
{
|
||||
switch(msg)
|
||||
{
|
||||
case WM_CLOSE:
|
||||
{
|
||||
if((g_dwPrefs & (1<<PREF_MIOC)) && (g_bCanQuit == false))
|
||||
{
|
||||
/*******************************************/
|
||||
/**** to autoaway or not to autoaway... ***/
|
||||
/*******************************************/
|
||||
if(g_dwPrefs & (1<<PREF_AOM))
|
||||
{
|
||||
xchat_globally_away(g_szAway);
|
||||
}
|
||||
|
||||
/**************************************************/
|
||||
/**** Win32 API call to hide the window and **/
|
||||
/**** save the fact that its minimized for later **/
|
||||
/**************************************************/
|
||||
g_iIsActive = 0;
|
||||
ShowWindow(hWnd, SW_HIDE);
|
||||
|
||||
return 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
if(g_hPrefDlg != NULL)
|
||||
{
|
||||
DestroyWindow(g_hPrefDlg);
|
||||
}
|
||||
|
||||
StopBlink(hWnd, 1, g_hIcons[0]);
|
||||
|
||||
if(sdAlertNum())
|
||||
{
|
||||
sdCloseAlerts();
|
||||
HoldClose();
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
case WM_SIZE:
|
||||
{
|
||||
/******************************************/
|
||||
/***** User wants to minimize xChat, ******/
|
||||
/***** are we allowed to go to tray? ******/
|
||||
/******************************************/
|
||||
if((g_dwPrefs & (1<<PREF_TOT)) && (wparam == SIZE_MINIMIZED))
|
||||
{
|
||||
/*******************************************/
|
||||
/**** to autoaway or not to autoaway... ***/
|
||||
/*******************************************/
|
||||
if(g_dwPrefs & (1<<PREF_AOM))
|
||||
{
|
||||
xchat_globally_away(g_szAway);
|
||||
}
|
||||
|
||||
/**************************************************/
|
||||
/**** Win32 API call to hide the window and **/
|
||||
/**** save the fact that its minimized for later **/
|
||||
/**************************************************/
|
||||
g_iIsActive = 0;
|
||||
ShowWindow(hWnd, SW_HIDE);
|
||||
}
|
||||
}
|
||||
break;
|
||||
/**********************************/
|
||||
/*** user clicked the tray icon ***/
|
||||
/**********************************/
|
||||
case WM_TRAYMSG:
|
||||
{
|
||||
switch(lparam)
|
||||
{
|
||||
case WM_LBUTTONDOWN:
|
||||
{
|
||||
if(!g_iIsActive)
|
||||
{
|
||||
/*********************************************************/
|
||||
/*** 0: its hiden, restore it and show it, if autoaway ***/
|
||||
/*** is on, set us as back ***/
|
||||
/*********************************************************/
|
||||
SendMessage(hWnd, WM_SYSCOMMAND, SC_RESTORE, 0);
|
||||
SetForegroundWindow(hWnd);
|
||||
g_iIsActive = 1;
|
||||
|
||||
if(g_dwPrefs & (1<<PREF_AOM))
|
||||
{
|
||||
xchat_globally_back();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
SendMessage(hWnd, WM_SYSCOMMAND, SC_MINIMIZE, 0);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case WM_RBUTTONDOWN:
|
||||
{
|
||||
/******************************************/
|
||||
/*** user wants to see the menu find out **/
|
||||
/*** where the mouse is and show it **/
|
||||
/******************************************/
|
||||
POINT pt;
|
||||
int iRet;
|
||||
|
||||
GetCursorPos(&pt);
|
||||
SetForegroundWindow(hWnd);
|
||||
|
||||
ModifyMenu(g_hTrayMenu, 2, (MF_POPUP | MF_BYPOSITION), (UINT)setServerMenu(), _T("Away"));
|
||||
|
||||
Sleep(175);
|
||||
|
||||
iRet = TrackPopupMenuEx(g_hTrayMenu, (TPM_RETURNCMD | TPM_LEFTALIGN), pt.x, pt.y, hWnd, NULL);
|
||||
|
||||
/***********************************/
|
||||
/*** nRet is the users selection, **/
|
||||
/*** process it **/
|
||||
/***********************************/
|
||||
sdTrayProc(hWnd, iRet);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
{
|
||||
/*****************************************************/
|
||||
/*** the taskbar has been restarted, re-add our icon */
|
||||
/*****************************************************/
|
||||
if(msg == RegisterWindowMessage(_T("TaskbarCreated")))
|
||||
{
|
||||
char szVersion[64];
|
||||
_snprintf(szVersion, 64, "X-Chat [%s]", xchat_get_info(ph, "version"));
|
||||
AddIcon(g_hXchatWnd, 1, g_hIcons[0], szVersion, (NIF_ICON | NIF_MESSAGE | NIF_TIP), WM_TRAYMSG);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
return CallWindowProc(g_hOldProc, hWnd, msg, wparam, lparam);
|
||||
}
|
||||
|
||||
/****************************************************/
|
||||
/*** process messages from the tray menu ************/
|
||||
/****************************************************/
|
||||
LRESULT CALLBACK sdTrayProc(HWND hWnd, int msg)
|
||||
{
|
||||
switch(msg)
|
||||
{
|
||||
case ACT_EXIT:
|
||||
{
|
||||
g_bCanQuit = true;
|
||||
PostMessage(hWnd, WM_CLOSE, 0, 0);
|
||||
}
|
||||
break;
|
||||
case ACT_RESTORE:
|
||||
{
|
||||
/***********************************************/
|
||||
/** user wants us to restore the xchat window **/
|
||||
/** and of autoaway is on, set as back **/
|
||||
/***********************************************/
|
||||
SendMessage(g_hXchatWnd, WM_SYSCOMMAND, SC_RESTORE, 0);
|
||||
SetForegroundWindow(hWnd);
|
||||
|
||||
if((!g_iIsActive) && (g_dwPrefs & (1<<PREF_AOM)))
|
||||
{
|
||||
xchat_globally_back();
|
||||
g_iIsActive = 1;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case ACT_SETTINGS:
|
||||
{
|
||||
ShowWindow(g_hPrefDlg, SW_SHOW);
|
||||
}
|
||||
break;
|
||||
case ACT_AWAY:
|
||||
{
|
||||
xchat_globally_away(g_szAway);
|
||||
}
|
||||
break;
|
||||
case ACT_BACK:
|
||||
{
|
||||
xchat_globally_back();
|
||||
}
|
||||
break;
|
||||
default:
|
||||
{
|
||||
if(msg > 0)
|
||||
{
|
||||
xchat_set_context(ph, xchat_find_server(msg-1));
|
||||
|
||||
if(!xchat_get_info(ph, "away"))
|
||||
{
|
||||
xchat_away(g_szAway);
|
||||
}
|
||||
else
|
||||
{
|
||||
xchat_back();
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
int CALLBACK PrefProc(HWND hWnd, UINT msg, WPARAM wparam, LPARAM lparam)
|
||||
{
|
||||
switch(msg)
|
||||
{
|
||||
case WM_INITDIALOG:
|
||||
{
|
||||
TCITEM tci1;
|
||||
TCITEM tci2;
|
||||
TCITEM tci3;
|
||||
TCITEM tci4;
|
||||
|
||||
tci1.mask = TCIF_TEXT;
|
||||
tci1.pszText = _T("Settings");
|
||||
tci1.cchTextMax = strlen("Settings");
|
||||
SendDlgItemMessage(hWnd, IDC_TAB_CONTROL, TCM_INSERTITEM, 0, (LPARAM)&tci1);
|
||||
|
||||
tci2.mask = TCIF_TEXT;
|
||||
tci2.pszText = _T("Alerts");
|
||||
tci2.cchTextMax = strlen("Alerts");
|
||||
SendDlgItemMessage(hWnd, IDC_TAB_CONTROL, TCM_INSERTITEM, 1, (LPARAM)&tci2);
|
||||
|
||||
tci3.mask = TCIF_TEXT;
|
||||
tci3.pszText = _T("Events");
|
||||
tci3.cchTextMax = strlen("Events");
|
||||
SendDlgItemMessage(hWnd, IDC_TAB_CONTROL, TCM_INSERTITEM, 2, (LPARAM)&tci3);
|
||||
|
||||
tci4.mask = TCIF_TEXT;
|
||||
tci4.pszText = _T("About");
|
||||
tci4.cchTextMax = strlen("About");
|
||||
SendDlgItemMessage(hWnd, IDC_TAB_CONTROL, TCM_INSERTITEM, 3, (LPARAM)&tci4);
|
||||
|
||||
|
||||
/***********************************************************************************/
|
||||
/***********************************************************************************/
|
||||
/***********************************************************************************/
|
||||
|
||||
g_hPrefTabSettings = CreateDialog((HINSTANCE)g_hInstance,
|
||||
MAKEINTRESOURCE(IDD_SETTINGS),
|
||||
hWnd,
|
||||
(DLGPROC)SettingsProc);
|
||||
SetDialog(g_hPrefTabSettings, IDD_SETTINGS);
|
||||
|
||||
g_hPrefTabAlerts = CreateDialog((HINSTANCE)g_hInstance,
|
||||
MAKEINTRESOURCE(IDD_ALERTS),
|
||||
hWnd,
|
||||
(DLGPROC)AlertsProc);
|
||||
SetDialog(g_hPrefTabAlerts, IDD_ALERTS);
|
||||
|
||||
g_hPrefTabEvents = CreateDialog((HINSTANCE)g_hInstance,
|
||||
MAKEINTRESOURCE(IDD_EVENTS),
|
||||
hWnd,
|
||||
(DLGPROC)EventsProc);
|
||||
SetDialog(g_hPrefTabEvents, IDD_EVENTS);
|
||||
|
||||
g_hPrefTabAbout = CreateDialog((HINSTANCE)g_hInstance,
|
||||
MAKEINTRESOURCE(IDD_ABOUT),
|
||||
hWnd,
|
||||
(DLGPROC)AboutProc);
|
||||
}
|
||||
break;
|
||||
case WM_SHOWWINDOW:
|
||||
{
|
||||
if(wparam)
|
||||
{
|
||||
SendDlgItemMessage(hWnd, IDC_TAB_CONTROL, TCM_SETCURSEL, 0, 0);
|
||||
ShowWindow(g_hPrefTabSettings, SW_SHOW);
|
||||
ShowWindow(g_hPrefTabAlerts, SW_HIDE);
|
||||
ShowWindow(g_hPrefTabEvents, SW_HIDE);
|
||||
ShowWindow(g_hPrefTabAbout, SW_HIDE);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case WM_NOTIFY:
|
||||
{
|
||||
NMHDR *pData = (NMHDR *)lparam;
|
||||
|
||||
switch(pData->code)
|
||||
{
|
||||
case TCN_SELCHANGE:
|
||||
{
|
||||
switch(SendDlgItemMessage(hWnd, IDC_TAB_CONTROL, TCM_GETCURSEL, 0, 0))
|
||||
{
|
||||
case 0:
|
||||
{
|
||||
ShowWindow(g_hPrefTabSettings, SW_SHOW);
|
||||
ShowWindow(g_hPrefTabAlerts, SW_HIDE);
|
||||
ShowWindow(g_hPrefTabEvents, SW_HIDE);
|
||||
ShowWindow(g_hPrefTabAbout, SW_HIDE);
|
||||
}
|
||||
break;
|
||||
case 1:
|
||||
{
|
||||
ShowWindow(g_hPrefTabSettings, SW_HIDE);
|
||||
ShowWindow(g_hPrefTabAlerts, SW_SHOW);
|
||||
ShowWindow(g_hPrefTabEvents, SW_HIDE);
|
||||
ShowWindow(g_hPrefTabAbout, SW_HIDE);
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
{
|
||||
ShowWindow(g_hPrefTabSettings, SW_HIDE);
|
||||
ShowWindow(g_hPrefTabAlerts, SW_HIDE);
|
||||
ShowWindow(g_hPrefTabEvents, SW_SHOW);
|
||||
ShowWindow(g_hPrefTabAbout, SW_HIDE);
|
||||
}
|
||||
break;
|
||||
case 3:
|
||||
{
|
||||
ShowWindow(g_hPrefTabSettings, SW_HIDE);
|
||||
ShowWindow(g_hPrefTabAlerts, SW_HIDE);
|
||||
ShowWindow(g_hPrefTabEvents, SW_HIDE);
|
||||
ShowWindow(g_hPrefTabAbout, SW_SHOW);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case WM_CLOSE:
|
||||
{
|
||||
ShowWindow(g_hPrefTabEvents, SW_HIDE);
|
||||
ShowWindow(g_hPrefTabSettings, SW_HIDE);
|
||||
ShowWindow(g_hPrefTabAlerts, SW_HIDE);
|
||||
ShowWindow(g_hPrefTabAbout, SW_HIDE);
|
||||
ShowWindow(hWnd, SW_HIDE);
|
||||
return TRUE;
|
||||
}
|
||||
break;
|
||||
case WM_COMMAND:
|
||||
{
|
||||
switch(wparam)
|
||||
{
|
||||
case IDC_PREF_OK:
|
||||
{
|
||||
CheckPrefs(g_hPrefTabEvents, IDD_EVENTS);
|
||||
CheckPrefs(g_hPrefTabSettings, IDD_SETTINGS);
|
||||
CheckPrefs(g_hPrefTabAlerts, IDD_ALERTS);
|
||||
|
||||
SavePrefs(0);
|
||||
|
||||
ShowWindow(g_hPrefTabEvents, SW_HIDE);
|
||||
ShowWindow(g_hPrefTabSettings, SW_HIDE);
|
||||
ShowWindow(g_hPrefTabAlerts, SW_HIDE);
|
||||
ShowWindow(g_hPrefTabAbout, SW_HIDE);
|
||||
ShowWindow(hWnd, SW_HIDE);
|
||||
return TRUE;
|
||||
}
|
||||
break;
|
||||
case IDC_PREF_CANCEL:
|
||||
{
|
||||
ShowWindow(g_hPrefTabEvents, SW_HIDE);
|
||||
ShowWindow(g_hPrefTabSettings, SW_HIDE);
|
||||
ShowWindow(g_hPrefTabAlerts, SW_HIDE);
|
||||
ShowWindow(g_hPrefTabAbout, SW_HIDE);
|
||||
ShowWindow(hWnd, SW_HIDE);
|
||||
return TRUE;
|
||||
}
|
||||
break;
|
||||
case IDC_PREF_APPLY:
|
||||
{
|
||||
CheckPrefs(g_hPrefTabEvents, IDD_EVENTS);
|
||||
CheckPrefs(g_hPrefTabSettings, IDD_SETTINGS);
|
||||
CheckPrefs(g_hPrefTabAlerts, IDD_ALERTS);
|
||||
|
||||
SavePrefs(0);
|
||||
return FALSE;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case WM_DESTROY:
|
||||
{
|
||||
SendMessage(g_hPrefTabEvents, WM_CLOSE, 0, 0);
|
||||
SendMessage(g_hPrefTabSettings, WM_CLOSE, 0, 0);
|
||||
SendMessage(g_hPrefTabAbout, WM_CLOSE, 0, 0);
|
||||
SendMessage(g_hPrefTabAlerts, WM_CLOSE, 0, 0);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/****************************************************/
|
||||
/****************************************************/
|
||||
/****************************************************/
|
||||
LRESULT CALLBACK AlertsProc(HWND hWnd, UINT msg, WPARAM wparam, LPARAM lparam)
|
||||
{
|
||||
switch(msg)
|
||||
{
|
||||
case WM_CLOSE:
|
||||
{
|
||||
DestroyWindow(hWnd);
|
||||
return TRUE;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case WM_COMMAND:
|
||||
{
|
||||
switch(LOWORD(wparam))
|
||||
{
|
||||
case PREF_AMAE:
|
||||
{
|
||||
SetToggle(hWnd, PREF_OSBWM, PREF_AMAE, TRUE);
|
||||
SetToggle(hWnd, PREF_UWIOB, PREF_AMAE, TRUE);
|
||||
SetToggle(hWnd, PREF_KAOI, PREF_AMAE, TRUE);
|
||||
|
||||
if(IsDlgButtonChecked(hWnd, PREF_AMAE))
|
||||
{
|
||||
SetToggle(hWnd, IDC_ALERT_HOTKEY, PREF_UWIOB, TRUE);
|
||||
SetToggle(hWnd, IDC_ALERT_HOTKEY_TEXT, PREF_UWIOB, TRUE);
|
||||
SetToggle(hWnd, IDC_ALERT_TIME, PREF_KAOI, FALSE);
|
||||
SetToggle(hWnd, IDC_ALERT_TIME_TEXT, PREF_KAOI, FALSE);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetToggle(hWnd, IDC_ALERT_HOTKEY, PREF_AMAE, TRUE);
|
||||
SetToggle(hWnd, IDC_ALERT_HOTKEY_TEXT, PREF_AMAE, TRUE);
|
||||
SetToggle(hWnd, IDC_ALERT_TIME, PREF_AMAE, TRUE);
|
||||
SetToggle(hWnd, IDC_ALERT_TIME_TEXT, PREF_AMAE, TRUE);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case PREF_UWIOB:
|
||||
{
|
||||
SetToggle(hWnd, IDC_ALERT_HOTKEY, PREF_UWIOB, TRUE);
|
||||
SetToggle(hWnd, IDC_ALERT_HOTKEY_TEXT, PREF_UWIOB, TRUE);
|
||||
}
|
||||
break;
|
||||
case PREF_KAOI:
|
||||
{
|
||||
SetToggle(hWnd, IDC_ALERT_TIME, PREF_KAOI, FALSE);
|
||||
SetToggle(hWnd, IDC_ALERT_TIME_TEXT, PREF_KAOI, FALSE);
|
||||
}
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/****************************************************/
|
||||
/****************************************************/
|
||||
/****************************************************/
|
||||
LRESULT CALLBACK AboutProc(HWND hWnd, UINT msg, WPARAM wparam, LPARAM lparam)
|
||||
{
|
||||
if(msg == WM_CLOSE)
|
||||
{
|
||||
DestroyWindow(hWnd);
|
||||
return true;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/*****************************************************/
|
||||
/** Process the events for our event dialog **********/
|
||||
/*****************************************************/
|
||||
LRESULT CALLBACK EventsProc(HWND hWnd, UINT msg, WPARAM wparam, LPARAM lparam)
|
||||
{
|
||||
if(msg == WM_CLOSE)
|
||||
{
|
||||
DestroyWindow(hWnd);
|
||||
return true;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/*****************************************************/
|
||||
/** Process the events for our settings dialog this **/
|
||||
/** is alot more complicated because options are **/
|
||||
/** enabled/disabled based on the state of others **/
|
||||
/*****************************************************/
|
||||
LRESULT CALLBACK SettingsProc(HWND hWnd, UINT msg, WPARAM wparam, LPARAM lparam)
|
||||
{
|
||||
if(msg == WM_CLOSE)
|
||||
{
|
||||
DestroyWindow(hWnd);
|
||||
return true;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/*****************************************************/
|
||||
/** this is the hotkey message processing function **/
|
||||
/** this window is always open and ready to be told **/
|
||||
/** if someone has hit the hotkey, if they did, we **/
|
||||
/** need to close out all of the tray alerts, for **/
|
||||
/** this I wrote sdCloseAlerts, more info there **/
|
||||
/*****************************************************/
|
||||
LRESULT CALLBACK HotKeyProc(HWND hWnd, UINT msg, WPARAM wparam, LPARAM lparam)
|
||||
{
|
||||
if(msg == WM_CLOSE)
|
||||
{
|
||||
DestroyWindow(hWnd);
|
||||
return true;
|
||||
}
|
||||
else if(msg == WM_HOTKEY)
|
||||
{
|
||||
sdCloseAlerts();
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
37
plugins/xtray/callbacks.h
Normal file
37
plugins/xtray/callbacks.h
Normal file
@ -0,0 +1,37 @@
|
||||
/* X-Tray
|
||||
* Copyright (C) 2005 Michael Hotaling <Mike.Hotaling@SinisterDevelopments.com>
|
||||
*
|
||||
* X-Tray is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* X-Tray is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with X-Tray; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#ifndef _H_CALLBACKS_H
|
||||
#define _H_CALLBACKS_H
|
||||
|
||||
int event_cb (char *word[], void *userdata);
|
||||
int command_cb (char *word[], char *word_eol[], void *userdata);
|
||||
|
||||
LRESULT CALLBACK WindowProc (HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam);
|
||||
BOOL CALLBACK EnumWindowsProc (HWND hWnd, LPARAM lParam);
|
||||
LRESULT CALLBACK sdTrayProc (HWND hwnd, int msg);
|
||||
|
||||
LRESULT CALLBACK AlertProc (HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam);
|
||||
LRESULT CALLBACK HotKeyProc (HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam);
|
||||
LRESULT CALLBACK EventsProc (HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam);
|
||||
LRESULT CALLBACK AboutProc (HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam);
|
||||
LRESULT CALLBACK AlertsProc (HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam);
|
||||
LRESULT CALLBACK SettingsProc (HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam);
|
||||
int CALLBACK PrefProc (HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam);
|
||||
|
||||
#endif
|
37
plugins/xtray/makefile.mak
Normal file
37
plugins/xtray/makefile.mak
Normal file
@ -0,0 +1,37 @@
|
||||
include "..\..\src\makeinc.mak"
|
||||
|
||||
TARGET = xtray.dll
|
||||
|
||||
TRAY_OBJECTS = \
|
||||
callbacks.obj \
|
||||
sdAlerts.obj \
|
||||
sdTray.obj \
|
||||
utility.obj \
|
||||
xchat.obj \
|
||||
xtray.obj
|
||||
|
||||
CPPFLAGS = $(CPPFLAGS) /D_STL70_ /D_STATIC_CPPLIB /EHsc
|
||||
|
||||
all: $(TRAY_OBJECTS) $(TARGET)
|
||||
|
||||
xtray.def:
|
||||
echo EXPORTS > xtray.def
|
||||
echo xchat_plugin_init >> xtray.def
|
||||
echo xchat_plugin_deinit >> xtray.def
|
||||
|
||||
.cpp.obj:
|
||||
$(CC) $(CPPFLAGS) /c $<
|
||||
|
||||
res:
|
||||
rc resource.rc
|
||||
|
||||
$(TARGET): $(TRAY_OBJECTS) xtray.def res
|
||||
$(LINK) /DLL /out:$(TARGET) $(LDFLAGS) $(TRAY_OBJECTS) ntstc_msvcrt.lib $(LIBS) /def:xtray.def resource.res
|
||||
|
||||
clean:
|
||||
del $(TARGET)
|
||||
del *.obj
|
||||
del xtray.def
|
||||
del resource.res
|
||||
del *.lib
|
||||
del *.exp
|
335
plugins/xtray/plugin.h
Normal file
335
plugins/xtray/plugin.h
Normal file
@ -0,0 +1,335 @@
|
||||
/* You can distribute this header with your plugins for easy compilation */
|
||||
#ifndef XCHAT_PLUGIN_H
|
||||
#define XCHAT_PLUGIN_H
|
||||
|
||||
#include <time.h>
|
||||
|
||||
#define XCHAT_IFACE_MAJOR 1
|
||||
#define XCHAT_IFACE_MINOR 9
|
||||
#define XCHAT_IFACE_MICRO 11
|
||||
#define XCHAT_IFACE_VERSION ((XCHAT_IFACE_MAJOR * 10000) + \
|
||||
(XCHAT_IFACE_MINOR * 100) + \
|
||||
(XCHAT_IFACE_MICRO))
|
||||
|
||||
#define XCHAT_PRI_HIGHEST 127
|
||||
#define XCHAT_PRI_HIGH 64
|
||||
#define XCHAT_PRI_NORM 0
|
||||
#define XCHAT_PRI_LOW (-64)
|
||||
#define XCHAT_PRI_LOWEST (-128)
|
||||
|
||||
#define XCHAT_FD_READ 1
|
||||
#define XCHAT_FD_WRITE 2
|
||||
#define XCHAT_FD_EXCEPTION 4
|
||||
#define XCHAT_FD_NOTSOCKET 8
|
||||
|
||||
#define XCHAT_EAT_NONE 0 /* pass it on through! */
|
||||
#define XCHAT_EAT_XCHAT 1 /* don't let xchat see this event */
|
||||
#define XCHAT_EAT_PLUGIN 2 /* don't let other plugins see this event */
|
||||
#define XCHAT_EAT_ALL (XCHAT_EAT_XCHAT|XCHAT_EAT_PLUGIN) /* don't let anything see this event */
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
typedef struct _xchat_plugin xchat_plugin;
|
||||
typedef struct _xchat_list xchat_list;
|
||||
typedef struct _xchat_hook xchat_hook;
|
||||
#ifndef PLUGIN_C
|
||||
typedef struct _xchat_context xchat_context;
|
||||
#endif
|
||||
|
||||
#ifndef PLUGIN_C
|
||||
struct _xchat_plugin
|
||||
{
|
||||
/* these are only used on win32 */
|
||||
xchat_hook *(*xchat_hook_command) (xchat_plugin *ph,
|
||||
const char *name,
|
||||
int pri,
|
||||
int (*callback) (char *word[], char *word_eol[], void *user_data),
|
||||
const char *help_text,
|
||||
void *userdata);
|
||||
xchat_hook *(*xchat_hook_server) (xchat_plugin *ph,
|
||||
const char *name,
|
||||
int pri,
|
||||
int (*callback) (char *word[], char *word_eol[], void *user_data),
|
||||
void *userdata);
|
||||
xchat_hook *(*xchat_hook_print) (xchat_plugin *ph,
|
||||
const char *name,
|
||||
int pri,
|
||||
int (*callback) (char *word[], void *user_data),
|
||||
void *userdata);
|
||||
xchat_hook *(*xchat_hook_timer) (xchat_plugin *ph,
|
||||
int timeout,
|
||||
int (*callback) (void *user_data),
|
||||
void *userdata);
|
||||
xchat_hook *(*xchat_hook_fd) (xchat_plugin *ph,
|
||||
int fd,
|
||||
int flags,
|
||||
int (*callback) (int fd, int flags, void *user_data),
|
||||
void *userdata);
|
||||
void *(*xchat_unhook) (xchat_plugin *ph,
|
||||
xchat_hook *hook);
|
||||
void (*xchat_print) (xchat_plugin *ph,
|
||||
const char *text);
|
||||
void (*xchat_printf) (xchat_plugin *ph,
|
||||
const char *format, ...);
|
||||
void (*xchat_command) (xchat_plugin *ph,
|
||||
const char *command);
|
||||
void (*xchat_commandf) (xchat_plugin *ph,
|
||||
const char *format, ...);
|
||||
int (*xchat_nickcmp) (xchat_plugin *ph,
|
||||
const char *s1,
|
||||
const char *s2);
|
||||
int (*xchat_set_context) (xchat_plugin *ph,
|
||||
xchat_context *ctx);
|
||||
xchat_context *(*xchat_find_context) (xchat_plugin *ph,
|
||||
const char *servname,
|
||||
const char *channel);
|
||||
xchat_context *(*xchat_get_context) (xchat_plugin *ph);
|
||||
const char *(*xchat_get_info) (xchat_plugin *ph,
|
||||
const char *id);
|
||||
int (*xchat_get_prefs) (xchat_plugin *ph,
|
||||
const char *name,
|
||||
const char **string,
|
||||
int *integer);
|
||||
xchat_list * (*xchat_list_get) (xchat_plugin *ph,
|
||||
const char *name);
|
||||
void (*xchat_list_free) (xchat_plugin *ph,
|
||||
xchat_list *xlist);
|
||||
const char * const * (*xchat_list_fields) (xchat_plugin *ph,
|
||||
const char *name);
|
||||
int (*xchat_list_next) (xchat_plugin *ph,
|
||||
xchat_list *xlist);
|
||||
const char * (*xchat_list_str) (xchat_plugin *ph,
|
||||
xchat_list *xlist,
|
||||
const char *name);
|
||||
int (*xchat_list_int) (xchat_plugin *ph,
|
||||
xchat_list *xlist,
|
||||
const char *name);
|
||||
void * (*xchat_plugingui_add) (xchat_plugin *ph,
|
||||
const char *filename,
|
||||
const char *name,
|
||||
const char *desc,
|
||||
const char *version,
|
||||
char *reserved);
|
||||
void (*xchat_plugingui_remove) (xchat_plugin *ph,
|
||||
void *handle);
|
||||
int (*xchat_emit_print) (xchat_plugin *ph,
|
||||
const char *event_name, ...);
|
||||
int (*xchat_read_fd) (xchat_plugin *ph,
|
||||
void *src,
|
||||
char *buf,
|
||||
int *len);
|
||||
time_t (*xchat_list_time) (xchat_plugin *ph,
|
||||
xchat_list *xlist,
|
||||
const char *name);
|
||||
char *(*xchat_gettext) (xchat_plugin *ph,
|
||||
const char *msgid);
|
||||
void (*xchat_send_modes) (xchat_plugin *ph,
|
||||
const char **targets,
|
||||
int ntargets,
|
||||
int modes_per_line,
|
||||
char sign,
|
||||
char mode);
|
||||
char *(*xchat_strip) (xchat_plugin *ph,
|
||||
const char *str,
|
||||
int len,
|
||||
int flags);
|
||||
void (*xchat_free) (xchat_plugin *ph,
|
||||
void *ptr);
|
||||
};
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
xchat_hook *
|
||||
xchat_hook_command (xchat_plugin *ph,
|
||||
const char *name,
|
||||
int pri,
|
||||
int (*callback) (char *word[], char *word_eol[], void *user_data),
|
||||
const char *help_text,
|
||||
void *userdata);
|
||||
|
||||
xchat_hook *
|
||||
xchat_hook_server (xchat_plugin *ph,
|
||||
const char *name,
|
||||
int pri,
|
||||
int (*callback) (char *word[], char *word_eol[], void *user_data),
|
||||
void *userdata);
|
||||
|
||||
xchat_hook *
|
||||
xchat_hook_print (xchat_plugin *ph,
|
||||
const char *name,
|
||||
int pri,
|
||||
int (*callback) (char *word[], void *user_data),
|
||||
void *userdata);
|
||||
|
||||
xchat_hook *
|
||||
xchat_hook_timer (xchat_plugin *ph,
|
||||
int timeout,
|
||||
int (*callback) (void *user_data),
|
||||
void *userdata);
|
||||
|
||||
xchat_hook *
|
||||
xchat_hook_fd (xchat_plugin *ph,
|
||||
int fd,
|
||||
int flags,
|
||||
int (*callback) (int fd, int flags, void *user_data),
|
||||
void *userdata);
|
||||
|
||||
void *
|
||||
xchat_unhook (xchat_plugin *ph,
|
||||
xchat_hook *hook);
|
||||
|
||||
void
|
||||
xchat_print (xchat_plugin *ph,
|
||||
const char *text);
|
||||
|
||||
void
|
||||
xchat_printf (xchat_plugin *ph,
|
||||
const char *format, ...);
|
||||
|
||||
void
|
||||
xchat_command (xchat_plugin *ph,
|
||||
const char *command);
|
||||
|
||||
void
|
||||
xchat_commandf (xchat_plugin *ph,
|
||||
const char *format, ...);
|
||||
|
||||
int
|
||||
xchat_nickcmp (xchat_plugin *ph,
|
||||
const char *s1,
|
||||
const char *s2);
|
||||
|
||||
int
|
||||
xchat_set_context (xchat_plugin *ph,
|
||||
xchat_context *ctx);
|
||||
|
||||
xchat_context *
|
||||
xchat_find_context (xchat_plugin *ph,
|
||||
const char *servname,
|
||||
const char *channel);
|
||||
|
||||
xchat_context *
|
||||
xchat_get_context (xchat_plugin *ph);
|
||||
|
||||
const char *
|
||||
xchat_get_info (xchat_plugin *ph,
|
||||
const char *id);
|
||||
|
||||
int
|
||||
xchat_get_prefs (xchat_plugin *ph,
|
||||
const char *name,
|
||||
const char **string,
|
||||
int *integer);
|
||||
|
||||
xchat_list *
|
||||
xchat_list_get (xchat_plugin *ph,
|
||||
const char *name);
|
||||
|
||||
void
|
||||
xchat_list_free (xchat_plugin *ph,
|
||||
xchat_list *xlist);
|
||||
|
||||
const char * const *
|
||||
xchat_list_fields (xchat_plugin *ph,
|
||||
const char *name);
|
||||
|
||||
int
|
||||
xchat_list_next (xchat_plugin *ph,
|
||||
xchat_list *xlist);
|
||||
|
||||
const char *
|
||||
xchat_list_str (xchat_plugin *ph,
|
||||
xchat_list *xlist,
|
||||
const char *name);
|
||||
|
||||
int
|
||||
xchat_list_int (xchat_plugin *ph,
|
||||
xchat_list *xlist,
|
||||
const char *name);
|
||||
|
||||
time_t
|
||||
xchat_list_time (xchat_plugin *ph,
|
||||
xchat_list *xlist,
|
||||
const char *name);
|
||||
|
||||
void *
|
||||
xchat_plugingui_add (xchat_plugin *ph,
|
||||
const char *filename,
|
||||
const char *name,
|
||||
const char *desc,
|
||||
const char *version,
|
||||
char *reserved);
|
||||
|
||||
void
|
||||
xchat_plugingui_remove (xchat_plugin *ph,
|
||||
void *handle);
|
||||
|
||||
int
|
||||
xchat_emit_print (xchat_plugin *ph,
|
||||
const char *event_name, ...);
|
||||
|
||||
char *
|
||||
xchat_gettext (xchat_plugin *ph,
|
||||
const char *msgid);
|
||||
|
||||
void
|
||||
xchat_send_modes (xchat_plugin *ph,
|
||||
const char **targets,
|
||||
int ntargets,
|
||||
int modes_per_line,
|
||||
char sign,
|
||||
char mode);
|
||||
|
||||
char *
|
||||
xchat_strip (xchat_plugin *ph,
|
||||
const char *str,
|
||||
int len,
|
||||
int flags);
|
||||
|
||||
void
|
||||
xchat_free (xchat_plugin *ph,
|
||||
void *ptr);
|
||||
|
||||
#if !defined(PLUGIN_C) && defined(WIN32)
|
||||
#ifndef XCHAT_PLUGIN_HANDLE
|
||||
#define XCHAT_PLUGIN_HANDLE (ph)
|
||||
#endif
|
||||
#define xchat_hook_command ((XCHAT_PLUGIN_HANDLE)->xchat_hook_command)
|
||||
#define xchat_hook_server ((XCHAT_PLUGIN_HANDLE)->xchat_hook_server)
|
||||
#define xchat_hook_print ((XCHAT_PLUGIN_HANDLE)->xchat_hook_print)
|
||||
#define xchat_hook_timer ((XCHAT_PLUGIN_HANDLE)->xchat_hook_timer)
|
||||
#define xchat_hook_fd ((XCHAT_PLUGIN_HANDLE)->xchat_hook_fd)
|
||||
#define xchat_unhook ((XCHAT_PLUGIN_HANDLE)->xchat_unhook)
|
||||
#define xchat_print ((XCHAT_PLUGIN_HANDLE)->xchat_print)
|
||||
#define xchat_printf ((XCHAT_PLUGIN_HANDLE)->xchat_printf)
|
||||
#define xchat_command ((XCHAT_PLUGIN_HANDLE)->xchat_command)
|
||||
#define xchat_commandf ((XCHAT_PLUGIN_HANDLE)->xchat_commandf)
|
||||
#define xchat_nickcmp ((XCHAT_PLUGIN_HANDLE)->xchat_nickcmp)
|
||||
#define xchat_set_context ((XCHAT_PLUGIN_HANDLE)->xchat_set_context)
|
||||
#define xchat_find_context ((XCHAT_PLUGIN_HANDLE)->xchat_find_context)
|
||||
#define xchat_get_context ((XCHAT_PLUGIN_HANDLE)->xchat_get_context)
|
||||
#define xchat_get_info ((XCHAT_PLUGIN_HANDLE)->xchat_get_info)
|
||||
#define xchat_get_prefs ((XCHAT_PLUGIN_HANDLE)->xchat_get_prefs)
|
||||
#define xchat_list_get ((XCHAT_PLUGIN_HANDLE)->xchat_list_get)
|
||||
#define xchat_list_free ((XCHAT_PLUGIN_HANDLE)->xchat_list_free)
|
||||
#define xchat_list_fields ((XCHAT_PLUGIN_HANDLE)->xchat_list_fields)
|
||||
#define xchat_list_str ((XCHAT_PLUGIN_HANDLE)->xchat_list_str)
|
||||
#define xchat_list_int ((XCHAT_PLUGIN_HANDLE)->xchat_list_int)
|
||||
#define xchat_list_time ((XCHAT_PLUGIN_HANDLE)->xchat_list_time)
|
||||
#define xchat_list_next ((XCHAT_PLUGIN_HANDLE)->xchat_list_next)
|
||||
#define xchat_plugingui_add ((XCHAT_PLUGIN_HANDLE)->xchat_plugingui_add)
|
||||
#define xchat_plugingui_remove ((XCHAT_PLUGIN_HANDLE)->xchat_plugingui_remove)
|
||||
#define xchat_emit_print ((XCHAT_PLUGIN_HANDLE)->xchat_emit_print)
|
||||
#define xchat_gettext ((XCHAT_PLUGIN_HANDLE)->xchat_gettext)
|
||||
#define xchat_send_modes ((XCHAT_PLUGIN_HANDLE)->xchat_send_modes)
|
||||
#define xchat_strip ((XCHAT_PLUGIN_HANDLE)->xchat_strip)
|
||||
#define xchat_free ((XCHAT_PLUGIN_HANDLE)->xchat_free)
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif
|
47
plugins/xtray/resource.h
Normal file
47
plugins/xtray/resource.h
Normal file
@ -0,0 +1,47 @@
|
||||
//{{NO_DEPENDENCIES}}
|
||||
// Microsoft Visual C++ generated include file.
|
||||
// Used by resource.rc
|
||||
//
|
||||
#define IDD_ALERTS 104
|
||||
#define IDD_EVENTS 105
|
||||
#define IDD_SETTINGS 106
|
||||
#define IDD_ALERT 107
|
||||
#define IDD_PREF 108
|
||||
#define IDD_ABOUT 109
|
||||
#define IDR_TRAY_MENU 110
|
||||
#define ICO_XCHAT 111
|
||||
#define ICO_BANNED 112
|
||||
#define ICO_CHANMSG 113
|
||||
#define ICO_DISCONNECTED 114
|
||||
#define ICO_HIGHLIGHT 115
|
||||
#define ICO_KICKED 116
|
||||
#define ICO_PMSG 117
|
||||
#define ICO_SNOTICE 118
|
||||
#define IDB_SD_LOGO 119
|
||||
#define IDC_PREF_OK 1014
|
||||
#define IDC_PREF_CANCEL 1015
|
||||
#define IDC_PREF_APPLY 1016
|
||||
#define IDC_AWAY_MSG 1017
|
||||
#define IDC_ALERT_TIME 1018
|
||||
#define IDC_TAB_CONTROL 1019
|
||||
#define IDC_ALERT_HOTKEY 1020
|
||||
#define IDC_ALERT_MSG 1021
|
||||
#define IDC_ALERT_HOTKEY_TEXT 1022
|
||||
#define IDC_ALERT_TIME_TEXT 1023
|
||||
#define ACT_EXIT 40001
|
||||
#define ACT_SETTINGS 40002
|
||||
#define ACT_AWAY 40003
|
||||
#define ACT_BACK 40004
|
||||
#define ACT_RESTORE 40005
|
||||
#define IDC_STATIC -1
|
||||
|
||||
// Next default values for new objects
|
||||
//
|
||||
#ifdef APSTUDIO_INVOKED
|
||||
#ifndef APSTUDIO_READONLY_SYMBOLS
|
||||
#define _APS_NEXT_RESOURCE_VALUE 120
|
||||
#define _APS_NEXT_COMMAND_VALUE 40006
|
||||
#define _APS_NEXT_CONTROL_VALUE 1024
|
||||
#define _APS_NEXT_SYMED_VALUE 101
|
||||
#endif
|
||||
#endif
|
318
plugins/xtray/resource.rc
Normal file
318
plugins/xtray/resource.rc
Normal file
@ -0,0 +1,318 @@
|
||||
// Microsoft Visual C++ generated resource script.
|
||||
//
|
||||
#include "resource.h"
|
||||
|
||||
#define APSTUDIO_READONLY_SYMBOLS
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Generated from the TEXTINCLUDE 2 resource.
|
||||
//
|
||||
#define APSTUDIO_HIDDEN_SYMBOLS
|
||||
#include "windows.h"
|
||||
#undef APSTUDIO_HIDDEN_SYMBOLS
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
#undef APSTUDIO_READONLY_SYMBOLS
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// English (U.S.) resources
|
||||
|
||||
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
|
||||
#ifdef _WIN32
|
||||
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
|
||||
#pragma code_page(1252)
|
||||
#endif //_WIN32
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Dialog
|
||||
//
|
||||
|
||||
IDD_EVENTS DIALOGEX 8, 20, 216, 143
|
||||
STYLE DS_SETFONT | DS_SETFOREGROUND | WS_CHILD
|
||||
FONT 8, "Tahoma", 0, 0, 0x0
|
||||
BEGIN
|
||||
GROUPBOX "X-Chat Events",IDC_STATIC,5,5,205,77
|
||||
CONTROL "Server Notice",9,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,
|
||||
145,32,55,10
|
||||
CONTROL "Topic Change",3,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,
|
||||
145,18,55,10
|
||||
CONTROL "Banned",4,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,18,
|
||||
49,10
|
||||
CONTROL "Kicked",5,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,32,
|
||||
49,10
|
||||
CONTROL "Killed",8,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,46,
|
||||
49,10
|
||||
CONTROL "Disconnect",10,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,
|
||||
60,49,10
|
||||
CONTROL "Private Message",7,"Button",BS_AUTOCHECKBOX |
|
||||
WS_TABSTOP,70,18,69,10
|
||||
CONTROL "CTCP",6,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,70,32,69,
|
||||
10
|
||||
CONTROL "Invite",2,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,70,46,
|
||||
69,10
|
||||
CONTROL "Highlight",1,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,70,
|
||||
60,69,10
|
||||
END
|
||||
|
||||
IDD_SETTINGS DIALOGEX 8, 20, 216, 143
|
||||
STYLE DS_SETFONT | WS_CHILD
|
||||
FONT 8, "Tahoma", 0, 0, 0x0
|
||||
BEGIN
|
||||
GROUPBOX "Options",IDC_STATIC,5,5,205,135
|
||||
CONTROL "Auto away on minimize",11,"Button",BS_AUTOCHECKBOX |
|
||||
WS_TABSTOP,16,60,100,10
|
||||
CONTROL "Minimize X-Chat to the system tray",12,"Button",
|
||||
BS_AUTOCHECKBOX | WS_TABSTOP,16,18,133,10
|
||||
CONTROL "Minimize to the tray instead of closing",17,"Button",
|
||||
BS_AUTOCHECKBOX | WS_TABSTOP,16,32,174,9
|
||||
EDITTEXT IDC_AWAY_MSG,33,86,169,50,ES_AUTOHSCROLL
|
||||
LTEXT "Away Msg:",IDC_STATIC,27,72,35,8
|
||||
CONTROL "Remove X-Chat from the taskbar ( Only show in tray )",
|
||||
20,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,46,191,9
|
||||
END
|
||||
|
||||
IDD_ALERT DIALOGEX 0, 0, 151, 28
|
||||
STYLE DS_LOCALEDIT | DS_SETFONT | DS_NOIDLEMSG | DS_CENTER | WS_CAPTION |
|
||||
WS_SYSMENU
|
||||
EXSTYLE WS_EX_NOPARENTNOTIFY | WS_EX_ACCEPTFILES | WS_EX_TOOLWINDOW
|
||||
CAPTION "Event Name"
|
||||
FONT 8, "Tahoma", 0, 0, 0x1
|
||||
BEGIN
|
||||
LTEXT "Event Text",IDC_ALERT_MSG,3,0,147,27
|
||||
END
|
||||
|
||||
IDD_PREF DIALOGEX 0, 0, 233, 190
|
||||
STYLE DS_SETFONT | DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION |
|
||||
WS_SYSMENU
|
||||
CAPTION "X-Tray Preferences"
|
||||
FONT 8, "Tahoma", 0, 0, 0x0
|
||||
BEGIN
|
||||
DEFPUSHBUTTON "Ok",IDC_PREF_OK,57,173,50,14
|
||||
PUSHBUTTON "Cancel",IDC_PREF_CANCEL,115,173,50,14
|
||||
PUSHBUTTON "Apply",IDC_PREF_APPLY,175,173,50,14
|
||||
CONTROL "Tab1",IDC_TAB_CONTROL,"SysTabControl32",0x0,7,7,218,159
|
||||
END
|
||||
|
||||
IDD_ABOUT DIALOGEX 8, 20, 216, 143
|
||||
STYLE DS_SETFONT | WS_CHILD
|
||||
FONT 8, "Tahoma", 0, 0, 0x0
|
||||
BEGIN
|
||||
CONTROL 119,IDC_STATIC,"Static",SS_BITMAP | SS_SUNKEN |
|
||||
WS_BORDER,3,6,88,81
|
||||
CTEXT "X-Tray\r\nBy: Michael Hotaling\r\n www.SinisterDevelopments.com",
|
||||
IDC_STATIC,95,33,118,30
|
||||
LTEXT "Folken\r\nBasket\r\nDonatzsky\r\nDaemon404",IDC_STATIC,
|
||||
15,103,64,33
|
||||
GROUPBOX "Special Thanks To:",IDC_STATIC,3,91,89,50
|
||||
GROUPBOX "Version Information:",IDC_STATIC,101,92,109,49
|
||||
LTEXT "1.2.3 PR",IDC_STATIC,170,105,33,8,0,WS_EX_RIGHT
|
||||
LTEXT "Compiled On: ",IDC_STATIC,110,116,46,8
|
||||
LTEXT "11/06/05",IDC_STATIC,174,117,30,8
|
||||
LTEXT "Version Number:",IDC_STATIC,110,105,54,8
|
||||
END
|
||||
|
||||
IDD_ALERTS DIALOGEX 8, 20, 216, 143
|
||||
STYLE DS_SETFONT | WS_CHILD
|
||||
FONT 8, "Tahoma", 0, 0, 0x0
|
||||
BEGIN
|
||||
GROUPBOX "Alerts",IDC_STATIC,5,5,205,117
|
||||
CONTROL "Only show alerts while minimized",14,"Button",
|
||||
BS_AUTOCHECKBOX | WS_TABSTOP,27,46,117,10
|
||||
CONTROL "Use tray alerts to notify me about events",13,"Button",
|
||||
BS_AUTOCHECKBOX | WS_TABSTOP,16,32,152,10
|
||||
CONTROL "Use window instead of balloons",15,"Button",
|
||||
BS_AUTOCHECKBOX | WS_TABSTOP,27,60,141,11
|
||||
EDITTEXT IDC_ALERT_TIME,137,101,61,12,ES_AUTOHSCROLL | ES_NUMBER,
|
||||
WS_EX_RIGHT
|
||||
LTEXT "Show alert for x seconds:",IDC_ALERT_TIME_TEXT,40,103,
|
||||
83,9
|
||||
CONTROL "Alert Hotkey",IDC_ALERT_HOTKEY,"msctls_hotkey32",
|
||||
WS_BORDER | WS_TABSTOP,137,74,61,13
|
||||
LTEXT "Close all alerts hotkey:",IDC_ALERT_HOTKEY_TEXT,39,75,
|
||||
76,10
|
||||
CONTROL "Leave alerts open indefinately",16,"Button",
|
||||
BS_AUTOCHECKBOX | WS_TABSTOP,27,88,115,11
|
||||
CONTROL "Blink Icon to alert me about events",18,"Button",
|
||||
BS_AUTOCHECKBOX | WS_TABSTOP,16,18,127,10
|
||||
END
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// DESIGNINFO
|
||||
//
|
||||
|
||||
#ifdef APSTUDIO_INVOKED
|
||||
GUIDELINES DESIGNINFO
|
||||
BEGIN
|
||||
IDD_EVENTS, DIALOG
|
||||
BEGIN
|
||||
BOTTOMMARGIN, 56
|
||||
END
|
||||
|
||||
IDD_SETTINGS, DIALOG
|
||||
BEGIN
|
||||
BOTTOMMARGIN, 66
|
||||
END
|
||||
|
||||
IDD_ALERT, DIALOG
|
||||
BEGIN
|
||||
RIGHTMARGIN, 150
|
||||
BOTTOMMARGIN, 26
|
||||
END
|
||||
|
||||
IDD_PREF, DIALOG
|
||||
BEGIN
|
||||
LEFTMARGIN, 7
|
||||
RIGHTMARGIN, 232
|
||||
TOPMARGIN, 7
|
||||
BOTTOMMARGIN, 176
|
||||
END
|
||||
|
||||
IDD_ABOUT, DIALOG
|
||||
BEGIN
|
||||
LEFTMARGIN, 7
|
||||
RIGHTMARGIN, 209
|
||||
TOPMARGIN, 7
|
||||
BOTTOMMARGIN, 136
|
||||
END
|
||||
|
||||
IDD_ALERTS, DIALOG
|
||||
BEGIN
|
||||
LEFTMARGIN, 7
|
||||
RIGHTMARGIN, 208
|
||||
TOPMARGIN, 7
|
||||
BOTTOMMARGIN, 136
|
||||
END
|
||||
END
|
||||
#endif // APSTUDIO_INVOKED
|
||||
|
||||
|
||||
#ifdef APSTUDIO_INVOKED
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// TEXTINCLUDE
|
||||
//
|
||||
|
||||
1 TEXTINCLUDE
|
||||
BEGIN
|
||||
"resource.h\0"
|
||||
END
|
||||
|
||||
2 TEXTINCLUDE
|
||||
BEGIN
|
||||
"#define APSTUDIO_HIDDEN_SYMBOLS\r\n"
|
||||
"#include ""windows.h""\r\n"
|
||||
"#undef APSTUDIO_HIDDEN_SYMBOLS\r\n"
|
||||
"\0"
|
||||
END
|
||||
|
||||
3 TEXTINCLUDE
|
||||
BEGIN
|
||||
"xtray.h\0"
|
||||
END
|
||||
|
||||
4 TEXTINCLUDE
|
||||
BEGIN
|
||||
"\r\n"
|
||||
"\0"
|
||||
END
|
||||
|
||||
#endif // APSTUDIO_INVOKED
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Version
|
||||
//
|
||||
|
||||
VS_VERSION_INFO VERSIONINFO
|
||||
FILEVERSION 1,2,3,0
|
||||
PRODUCTVERSION 1,2,3,0
|
||||
FILEFLAGSMASK 0x3fL
|
||||
#ifdef _DEBUG
|
||||
FILEFLAGS 0x1L
|
||||
#else
|
||||
FILEFLAGS 0x0L
|
||||
#endif
|
||||
FILEOS 0x40004L
|
||||
FILETYPE 0x2L
|
||||
FILESUBTYPE 0x0L
|
||||
BEGIN
|
||||
BLOCK "StringFileInfo"
|
||||
BEGIN
|
||||
BLOCK "040904b0"
|
||||
BEGIN
|
||||
VALUE "CompanyName", "SinisterDevelopments"
|
||||
VALUE "FileDescription", "X-Tray"
|
||||
VALUE "FileVersion", "1, 2, 3, 0"
|
||||
VALUE "InternalName", "X-Tray"
|
||||
VALUE "LegalCopyright", "Copyright © 2005"
|
||||
VALUE "OriginalFilename", "X-Tray.dll"
|
||||
VALUE "ProductName", "X-Tray - X-Chat Win32 System Tray Plugin"
|
||||
VALUE "ProductVersion", "1, 2, 3, 0"
|
||||
END
|
||||
END
|
||||
BLOCK "VarFileInfo"
|
||||
BEGIN
|
||||
VALUE "Translation", 0x409, 1200
|
||||
END
|
||||
END
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Menu
|
||||
//
|
||||
|
||||
IDR_TRAY_MENU MENU
|
||||
BEGIN
|
||||
POPUP "TRAY"
|
||||
BEGIN
|
||||
MENUITEM "Restore", ACT_RESTORE
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "Away", 65535
|
||||
MENUITEM "Settings", ACT_SETTINGS
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "Exit", ACT_EXIT
|
||||
END
|
||||
END
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Icon
|
||||
//
|
||||
|
||||
// Icon with lowest ID value placed first to ensure application icon
|
||||
// remains consistent on all systems.
|
||||
ICO_XCHAT ICON "icons\\xchat.ico"
|
||||
ICO_BANNED ICON "icons\\banned.ico"
|
||||
ICO_CHANMSG ICON "icons\\chan_msg.ico"
|
||||
ICO_HIGHLIGHT ICON "icons\\highlight.ico"
|
||||
ICO_KICKED ICON "icons\\kicked.ico"
|
||||
ICO_PMSG ICON "icons\\priv_msg-1-2-2.ico"
|
||||
ICO_SNOTICE ICON "icons\\server_notice.ico"
|
||||
ICO_DISCONNECTED ICON "icons\\disconnected.ico"
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Bitmap
|
||||
//
|
||||
|
||||
IDB_SD_LOGO BITMAP "bitmaps\\sd.bmp"
|
||||
#endif // English (U.S.) resources
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
|
||||
#ifndef APSTUDIO_INVOKED
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Generated from the TEXTINCLUDE 3 resource.
|
||||
//
|
||||
xtray.h
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
#endif // not APSTUDIO_INVOKED
|
||||
|
109
plugins/xtray/sdAlerts.cpp
Normal file
109
plugins/xtray/sdAlerts.cpp
Normal file
@ -0,0 +1,109 @@
|
||||
/* X-Tray
|
||||
* Copyright (C) 2005 Michael Hotaling <Mike.Hotaling@SinisterDevelopments.com>
|
||||
*
|
||||
* X-Tray is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* X-Tray is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with X-Tray; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#include <windows.h>
|
||||
#include <winuser.h>
|
||||
#include <stdio.h>
|
||||
#include "utility.h"
|
||||
#include "resource.h"
|
||||
#include "sdAlerts.h"
|
||||
|
||||
int g_iAlerts = 0;
|
||||
|
||||
void sdSystemAlert(HINSTANCE hModule, UINT uiDialog, char *szMsg, char *szName, unsigned int iTime)
|
||||
{
|
||||
TCHAR wszMsg[256];
|
||||
TCHAR wszName[64];
|
||||
|
||||
HWND hDialog;
|
||||
RECT rcWorkArea, rcDlg;
|
||||
int ixPos, iyPos;
|
||||
int iNumPerCol;
|
||||
|
||||
hDialog = CreateDialog(hModule, MAKEINTRESOURCE(uiDialog), NULL, (DLGPROC)sdAlertProc);
|
||||
|
||||
SystemParametersInfo(SPI_GETWORKAREA, 0, &rcWorkArea, 0);
|
||||
GetWindowRect(hDialog, &rcDlg);
|
||||
|
||||
iNumPerCol = ((rcWorkArea.bottom - rcWorkArea.top) / (rcDlg.bottom - rcDlg.top));
|
||||
ixPos = rcWorkArea.right - (rcDlg.right - rcDlg.left) + 1;
|
||||
iyPos = rcWorkArea.bottom - (rcDlg.bottom - rcDlg.top);
|
||||
|
||||
if((g_iAlerts >= iNumPerCol) && (iNumPerCol > 0))
|
||||
{
|
||||
ixPos -= ((g_iAlerts / iNumPerCol) * (rcDlg.right - rcDlg.left));
|
||||
iyPos -= ((g_iAlerts - (iNumPerCol * (g_iAlerts / iNumPerCol))) * (rcDlg.bottom - rcDlg.top));
|
||||
}
|
||||
else
|
||||
{
|
||||
iyPos -= (g_iAlerts * (rcDlg.bottom - rcDlg.top));
|
||||
}
|
||||
SetWindowPos(hDialog, HWND_TOPMOST, ixPos, iyPos, 0, 0, SWP_NOSIZE | SWP_NOACTIVATE);
|
||||
|
||||
ConvertString(szName, wszName, 64);
|
||||
ConvertString(szMsg, wszMsg, 256);
|
||||
|
||||
SetWindowText(hDialog, wszName);
|
||||
SetDlgItemText(hDialog, IDC_ALERT_MSG, wszMsg);
|
||||
ShowWindow(hDialog, SW_SHOWNA);
|
||||
|
||||
if(iTime > 0)
|
||||
{
|
||||
SetTimer(hDialog, 1, iTime, NULL);
|
||||
}
|
||||
|
||||
g_iAlerts++;
|
||||
}
|
||||
|
||||
void sdCloseAlerts()
|
||||
{
|
||||
PostMessage(HWND_BROADCAST, RegisterWindowMessage(TEXT("xTray:CloseAllAlertWindows")), 0, 0);
|
||||
}
|
||||
|
||||
LRESULT CALLBACK sdAlertProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
|
||||
{
|
||||
switch(msg)
|
||||
{
|
||||
case WM_CLOSE:
|
||||
if(g_iAlerts > 0){ g_iAlerts--; }
|
||||
DestroyWindow(hwnd);
|
||||
return TRUE;
|
||||
break;
|
||||
case WM_TIMER:
|
||||
if(g_iAlerts > 0){ g_iAlerts--; }
|
||||
AnimateWindow(hwnd, 600, AW_SLIDE | AW_HIDE | AW_VER_POSITIVE);
|
||||
DestroyWindow(hwnd);
|
||||
return TRUE;
|
||||
break;
|
||||
default:
|
||||
if(msg == RegisterWindowMessage(TEXT("xTray:CloseAllAlertWindows")))
|
||||
{
|
||||
if(g_iAlerts > 0){ g_iAlerts--; }
|
||||
DestroyWindow(hwnd);
|
||||
return TRUE;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
int sdAlertNum()
|
||||
{
|
||||
return g_iAlerts;
|
||||
}
|
26
plugins/xtray/sdAlerts.h
Normal file
26
plugins/xtray/sdAlerts.h
Normal file
@ -0,0 +1,26 @@
|
||||
/* X-Tray
|
||||
* Copyright (C) 2005 Michael Hotaling <Mike.Hotaling@SinisterDevelopments.com>
|
||||
*
|
||||
* X-Tray is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* X-Tray is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with X-Tray; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#ifndef _H_SDALERTS_H
|
||||
#define _H_SDALERTS_H
|
||||
|
||||
void sdSystemAlert (HINSTANCE, UINT, char *, char *, UINT);
|
||||
LRESULT CALLBACK sdAlertProc (HWND, UINT, WPARAM, LPARAM);
|
||||
int sdAlertNum ();
|
||||
void sdCloseAlerts ();
|
||||
#endif
|
207
plugins/xtray/sdTray.cpp
Normal file
207
plugins/xtray/sdTray.cpp
Normal file
@ -0,0 +1,207 @@
|
||||
/* X-Tray
|
||||
* Copyright (C) 2005 Michael Hotaling <Mike.Hotaling@SinisterDevelopments.com>
|
||||
*
|
||||
* X-Tray is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* X-Tray is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with X-Tray; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
#define _WIN32_IE 0x601
|
||||
#include <windows.h>
|
||||
#include <stdio.h>
|
||||
#include <tchar.h>
|
||||
#include "sdTray.h"
|
||||
#include "utility.h"
|
||||
|
||||
HANDLE hThread;
|
||||
iBlink *tData = NULL;
|
||||
|
||||
int AddIcon(HWND hwnd, UINT id, HICON hicon, char *szTip, unsigned short flags, unsigned int cbMsg)
|
||||
{
|
||||
NOTIFYICONDATA nidata;
|
||||
|
||||
nidata.cbSize = NOTIFYICONDATA_V2_SIZE;
|
||||
nidata.hIcon = hicon;
|
||||
nidata.hWnd = hwnd;
|
||||
nidata.uCallbackMessage = cbMsg;
|
||||
nidata.uFlags = flags;
|
||||
nidata.uID = id;
|
||||
|
||||
if(szTip != NULL)
|
||||
{
|
||||
TCHAR *szTemp = new TCHAR[64];
|
||||
|
||||
ConvertString(szTip, szTemp, 64);
|
||||
_tcsncpy(nidata.szTip, szTemp, 64);
|
||||
|
||||
delete[] szTemp;
|
||||
}
|
||||
|
||||
return Shell_NotifyIcon(NIM_ADD, &nidata);
|
||||
}
|
||||
|
||||
int RemoveIcon(HWND hwnd, UINT id)
|
||||
{
|
||||
if(hThread != NULL)
|
||||
{
|
||||
TerminateThread(hThread, 0);
|
||||
hThread = NULL;
|
||||
|
||||
delete tData;
|
||||
}
|
||||
|
||||
NOTIFYICONDATA nidata;
|
||||
|
||||
nidata.cbSize = NOTIFYICONDATA_V2_SIZE;
|
||||
nidata.hWnd = hwnd;
|
||||
nidata.uID = id;
|
||||
|
||||
return Shell_NotifyIcon(NIM_DELETE, &nidata);
|
||||
}
|
||||
|
||||
int SetIcon(HWND hwnd, UINT id, HICON hicon)
|
||||
{
|
||||
NOTIFYICONDATA nidata;
|
||||
|
||||
nidata.cbSize = NOTIFYICONDATA_V2_SIZE;
|
||||
nidata.hWnd = hwnd;
|
||||
nidata.uID = id;
|
||||
nidata.hIcon = hicon;
|
||||
nidata.uFlags = NIF_ICON;
|
||||
|
||||
return Shell_NotifyIcon(NIM_MODIFY, &nidata);
|
||||
}
|
||||
|
||||
int SetTooltip(HWND hwnd, UINT id, char *szTip)
|
||||
{
|
||||
NOTIFYICONDATA nidata;
|
||||
|
||||
nidata.cbSize = NOTIFYICONDATA_V2_SIZE;
|
||||
nidata.hWnd = hwnd;
|
||||
nidata.uID = id;
|
||||
nidata.uFlags = NIF_TIP;
|
||||
|
||||
if(szTip != NULL)
|
||||
{
|
||||
TCHAR *szTemp = new TCHAR[64];
|
||||
ConvertString(szTip, szTemp, 64);
|
||||
_tcsncpy(nidata.szTip, szTemp, 64);
|
||||
delete[] szTemp;
|
||||
}
|
||||
|
||||
return Shell_NotifyIcon(NIM_MODIFY, &nidata);
|
||||
}
|
||||
|
||||
int ShowBalloon(HWND hwnd, UINT id, char *szInfo, char *szTitle, UINT time, UINT infoFlags)
|
||||
{
|
||||
NOTIFYICONDATA nidata;
|
||||
|
||||
nidata.cbSize = NOTIFYICONDATA_V2_SIZE;
|
||||
nidata.hWnd = hwnd;
|
||||
nidata.uID = id;
|
||||
nidata.uFlags = NIF_INFO;
|
||||
nidata.dwInfoFlags = infoFlags;
|
||||
|
||||
if(time > 0)
|
||||
nidata.uTimeout = time;
|
||||
else
|
||||
nidata.uTimeout = 500000;
|
||||
|
||||
if(szInfo != NULL)
|
||||
{
|
||||
TCHAR *szTemp = new TCHAR[255];
|
||||
|
||||
ConvertString(szInfo, szTemp, 251);
|
||||
szTemp[250] = 0;
|
||||
|
||||
if(strlen(szInfo) > 255)
|
||||
{
|
||||
_sntprintf(szTemp, 255, _T("%s..."), szTemp);
|
||||
}
|
||||
_tcsncpy(nidata.szInfo, szTemp, 255);
|
||||
|
||||
delete[] szTemp;
|
||||
}
|
||||
if(szTitle != NULL)
|
||||
{
|
||||
TCHAR *wszTitle = new TCHAR[64];
|
||||
ConvertString(szTitle, wszTitle, 64);
|
||||
_tcsncpy(nidata.szInfoTitle, wszTitle, 64);
|
||||
delete[] wszTitle;
|
||||
}
|
||||
|
||||
return Shell_NotifyIcon(NIM_MODIFY, &nidata);
|
||||
}
|
||||
|
||||
|
||||
DWORD WINAPI BlinkThread(LPVOID lpParam)
|
||||
{
|
||||
NOTIFYICONDATA nidata;
|
||||
|
||||
nidata.cbSize = NOTIFYICONDATA_V2_SIZE;
|
||||
nidata.hWnd = tData->hwnd;
|
||||
nidata.uID = tData->id;
|
||||
nidata.uFlags = NIF_ICON;
|
||||
|
||||
for(UINT i = 0; i < tData->num; i++)
|
||||
{
|
||||
nidata.hIcon = tData->hBlink;
|
||||
Shell_NotifyIcon(NIM_MODIFY, &nidata);
|
||||
|
||||
Sleep(tData->time);
|
||||
|
||||
nidata.hIcon = tData->hBase;
|
||||
Shell_NotifyIcon(NIM_MODIFY, &nidata);
|
||||
|
||||
Sleep(tData->time);
|
||||
}
|
||||
|
||||
delete tData;
|
||||
hThread = NULL;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int BlinkIcon(HWND hwnd, UINT id, HICON hBase, HICON hBlink, UINT time, UINT num)
|
||||
{
|
||||
if(hThread != NULL)
|
||||
{
|
||||
StopBlink(hwnd, id, hBase);
|
||||
}
|
||||
|
||||
DWORD dwThreadID;
|
||||
tData = new iBlink;
|
||||
|
||||
tData->hwnd = hwnd;
|
||||
tData->id = id;
|
||||
tData->hBase = hBase;
|
||||
tData->hBlink = hBlink;
|
||||
tData->time = time;
|
||||
tData->num = num;
|
||||
|
||||
hThread = CreateThread(NULL, 0, BlinkThread, tData, 0, &dwThreadID);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void StopBlink(HWND hwnd, UINT id, HICON hBase)
|
||||
{
|
||||
if(hThread != NULL)
|
||||
{
|
||||
TerminateThread(hThread, 0);
|
||||
hThread = NULL;
|
||||
|
||||
delete tData;
|
||||
}
|
||||
|
||||
SetIcon(hwnd, id, hBase);
|
||||
}
|
39
plugins/xtray/sdTray.h
Normal file
39
plugins/xtray/sdTray.h
Normal file
@ -0,0 +1,39 @@
|
||||
/* X-Tray
|
||||
* Copyright (C) 2005 Michael Hotaling <Mike.Hotaling@SinisterDevelopments.com>
|
||||
*
|
||||
* X-Tray is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* X-Tray is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with X-Tray; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#ifndef _H_SDTRAY_H
|
||||
#define _H_SDTRAY_H
|
||||
|
||||
int AddIcon (HWND, UINT, HICON, char *, unsigned short, UINT);
|
||||
int ShowBalloon (HWND, UINT, char *, char *, UINT, UINT);
|
||||
int BlinkIcon (HWND, UINT, HICON, HICON, UINT, UINT);
|
||||
int SetTooltip (HWND, UINT, char *);
|
||||
int SetIcon (HWND, UINT, HICON);
|
||||
void StopBlink (HWND, UINT, HICON);
|
||||
int RemoveIcon (HWND, UINT);
|
||||
|
||||
typedef struct IBLINK
|
||||
{
|
||||
HICON hBase;
|
||||
HICON hBlink;
|
||||
HWND hwnd;
|
||||
UINT id;
|
||||
UINT time;
|
||||
UINT num;
|
||||
}iBlink;
|
||||
#endif
|
568
plugins/xtray/utility.cpp
Normal file
568
plugins/xtray/utility.cpp
Normal file
@ -0,0 +1,568 @@
|
||||
/* X-Tray
|
||||
* Copyright (C) 2005 Michael Hotaling <Mike.Hotaling@SinisterDevelopments.com>
|
||||
*
|
||||
* X-Tray is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* X-Tray is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with X-Tray; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#include <windows.h>
|
||||
#include <stdio.h>
|
||||
#include <commctrl.h>
|
||||
#include <tchar.h>
|
||||
#include "utility.h"
|
||||
#include "plugin.h"
|
||||
#include "xtray.h"
|
||||
#include "callbacks.h"
|
||||
#include "resource.h"
|
||||
|
||||
TCHAR BACKUP_INI_FILE[] = _T(".\\plugins\\config\\xTray.ini");
|
||||
struct HOTKEY g_hHotKey;
|
||||
|
||||
void SavePrefs(int iDlg)
|
||||
{
|
||||
/**************************************************************************************************/
|
||||
/********** allocate space for our string, and then set it to the currently logged on user ********/
|
||||
/**************************************************************************************************/
|
||||
DWORD dBuff = 257;
|
||||
TCHAR szUser[257];
|
||||
|
||||
GetUserName(szUser, &dBuff);
|
||||
|
||||
/**************************************************************************************************/
|
||||
/*********************** Test if the file exists, If it doesn't, Create It ************************/
|
||||
/**************************************************************************************************/
|
||||
TCHAR XTRAY_INI_FILE[1024];
|
||||
|
||||
#ifdef UNICODE
|
||||
char temp[1024];
|
||||
TCHAR TEMP_INI_FILE[1024];
|
||||
|
||||
_snprintf(temp, 1024, "%s\\xtray.ini", xchat_get_info(ph, "xchatdir"));
|
||||
ConvertString(temp, TEMP_INI_FILE, 1024);
|
||||
|
||||
// ok this one is really ugly
|
||||
// it checks to see if the file exists in two locations
|
||||
// X-Chat default config dir, if that fails it trys xchat\plugins\config
|
||||
// if neither one exists it tries to create it in
|
||||
// X-Chat default config dir, if that fails it trys xchat\plugins\config
|
||||
// In either case it writes \xFF\xFE to the file ( on creation )
|
||||
// so that we can save unicode away messages WritePrivateProfile doesn't
|
||||
// do this for us, though I think it really should
|
||||
|
||||
if(FileExists(TEMP_INI_FILE))
|
||||
{
|
||||
_tcscpy(XTRAY_INI_FILE, TEMP_INI_FILE);
|
||||
}
|
||||
else
|
||||
{
|
||||
if(FileExists(BACKUP_INI_FILE))
|
||||
{
|
||||
_tcscpy(XTRAY_INI_FILE, BACKUP_INI_FILE);
|
||||
}
|
||||
else
|
||||
{
|
||||
HANDLE xTemp;
|
||||
DWORD dwBytesTemp;
|
||||
|
||||
if(xTemp = CreateFile(TEMP_INI_FILE, GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL))
|
||||
{
|
||||
if(GetLastError() != ERROR_ALREADY_EXISTS)
|
||||
{
|
||||
WriteFile(xTemp, _T("\xFF\xFE"), 4, &dwBytesTemp, NULL);
|
||||
}
|
||||
CloseHandle(xTemp);
|
||||
}
|
||||
|
||||
if(FileExists(TEMP_INI_FILE))
|
||||
{
|
||||
_tcscpy(XTRAY_INI_FILE, TEMP_INI_FILE);
|
||||
}
|
||||
else
|
||||
{
|
||||
HANDLE xBackup;
|
||||
DWORD dwBytesBackup;
|
||||
|
||||
if(xBackup = CreateFile(TEMP_INI_FILE, GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL))
|
||||
{
|
||||
if(GetLastError() != ERROR_ALREADY_EXISTS)
|
||||
{
|
||||
WriteFile(xBackup, _T("\xFF\xFE"), 4, &dwBytesBackup, NULL);
|
||||
}
|
||||
|
||||
CloseHandle(xBackup);
|
||||
}
|
||||
|
||||
if(FileExists(BACKUP_INI_FILE))
|
||||
{
|
||||
_tcscpy(XTRAY_INI_FILE, BACKUP_INI_FILE);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#else
|
||||
_tcscpy(XTRAY_INI_FILE, BACKUP_INI_FILE);
|
||||
#endif
|
||||
|
||||
WritePrivateProfileInt(szUser, _T("SETTINGS"), g_dwPrefs, XTRAY_INI_FILE);
|
||||
WritePrivateProfileInt(szUser, _T("AOT"), g_iTime, XTRAY_INI_FILE);
|
||||
WritePrivateProfileInt(szUser, _T("KEY"), g_hHotKey.key, XTRAY_INI_FILE);
|
||||
WritePrivateProfileInt(szUser, _T("MOD"), g_hHotKey.mod, XTRAY_INI_FILE);
|
||||
WritePrivateProfileString(szUser, _T("AWAY"), g_szAway, XTRAY_INI_FILE);
|
||||
}
|
||||
|
||||
void LoadPrefs()
|
||||
{
|
||||
/**************************************************************************************************/
|
||||
/*********************** Our Settings Section *****************************************************/
|
||||
/**************************************************************************************************/
|
||||
DWORD dBuff = 257;
|
||||
TCHAR szUser[257];
|
||||
|
||||
GetUserName(szUser, &dBuff);
|
||||
|
||||
/**************************************************************************************************/
|
||||
/*********************** Test if the file exists, If it doesn't, Create It ************************/
|
||||
/**************************************************************************************************/
|
||||
TCHAR XTRAY_INI_FILE[1024];
|
||||
|
||||
#ifdef UNICODE
|
||||
char temp[1024];
|
||||
TCHAR TEMP_INI_FILE[1024];
|
||||
|
||||
_snprintf(temp, 1024, "%s\\xtray.ini", xchat_get_info(ph, "xchatdir"));
|
||||
ConvertString(temp, TEMP_INI_FILE, 1024);
|
||||
|
||||
if(FileExists(TEMP_INI_FILE))
|
||||
{
|
||||
_tcscpy(XTRAY_INI_FILE, TEMP_INI_FILE);
|
||||
}
|
||||
else
|
||||
{
|
||||
if(FileExists(BACKUP_INI_FILE))
|
||||
{
|
||||
_tcscpy(XTRAY_INI_FILE, BACKUP_INI_FILE);
|
||||
}
|
||||
else
|
||||
{
|
||||
HANDLE xTemp;
|
||||
DWORD dwBytesTemp;
|
||||
|
||||
if(xTemp = CreateFile(TEMP_INI_FILE, GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL))
|
||||
{
|
||||
if(GetLastError() != ERROR_ALREADY_EXISTS)
|
||||
{
|
||||
WriteFile(xTemp, _T("\xFF\xFE"), 4, &dwBytesTemp, NULL);
|
||||
}
|
||||
|
||||
CloseHandle(xTemp);
|
||||
}
|
||||
|
||||
if(FileExists(TEMP_INI_FILE))
|
||||
{
|
||||
_tcscpy(XTRAY_INI_FILE, TEMP_INI_FILE);
|
||||
}
|
||||
else
|
||||
{
|
||||
HANDLE xBackup;
|
||||
DWORD dwBytesBackup;
|
||||
|
||||
if(xBackup = CreateFile(TEMP_INI_FILE, GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL))
|
||||
{
|
||||
if(GetLastError() != ERROR_ALREADY_EXISTS)
|
||||
{
|
||||
WriteFile(xBackup, _T("\xFF\xFE"), 4, &dwBytesBackup, NULL);
|
||||
}
|
||||
|
||||
CloseHandle(xBackup);
|
||||
}
|
||||
|
||||
if(FileExists(BACKUP_INI_FILE))
|
||||
{
|
||||
_tcscpy(XTRAY_INI_FILE, BACKUP_INI_FILE);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#else
|
||||
_tcscpy(XTRAY_INI_FILE, BACKUP_INI_FILE);
|
||||
#endif
|
||||
|
||||
/**************************************************************************************************/
|
||||
/*************************** Get the value for each of our preferances ****************************/
|
||||
/**************************************************************************************************/
|
||||
g_dwPrefs = GetPrivateProfileInt(szUser, _T("SETTINGS"), 0, XTRAY_INI_FILE);
|
||||
|
||||
// backwards compatability
|
||||
// also allows us to set defaults if its a new installation
|
||||
if(g_dwPrefs == 0)
|
||||
{
|
||||
g_dwPrefs |= (GetPrivateProfileInt(szUser, _T("HILIGHT"), 1, XTRAY_INI_FILE)<<1);
|
||||
g_dwPrefs |= (GetPrivateProfileInt(szUser, _T("INVITE"), 1, XTRAY_INI_FILE)<<2);
|
||||
g_dwPrefs |= (GetPrivateProfileInt(szUser, _T("TOPIC"), 1, XTRAY_INI_FILE)<<3);
|
||||
g_dwPrefs |= (GetPrivateProfileInt(szUser, _T("BANNED"), 1, XTRAY_INI_FILE)<<4);
|
||||
g_dwPrefs |= (GetPrivateProfileInt(szUser, _T("KICKED"), 1, XTRAY_INI_FILE)<<5);
|
||||
g_dwPrefs |= (GetPrivateProfileInt(szUser, _T("CTCP"), 1, XTRAY_INI_FILE)<<6);
|
||||
g_dwPrefs |= (GetPrivateProfileInt(szUser, _T("PMSG"), 1, XTRAY_INI_FILE)<<7);
|
||||
g_dwPrefs |= (GetPrivateProfileInt(szUser, _T("KILLED"), 1, XTRAY_INI_FILE)<<8);
|
||||
g_dwPrefs |= (GetPrivateProfileInt(szUser, _T("NOTICE"), 1, XTRAY_INI_FILE)<<9);
|
||||
g_dwPrefs |= (GetPrivateProfileInt(szUser, _T("DISCONNECT"), 1, XTRAY_INI_FILE)<<10);
|
||||
|
||||
g_dwPrefs |= (GetPrivateProfileInt(szUser, _T("AOM"), 0, XTRAY_INI_FILE)<<11);
|
||||
g_dwPrefs |= (GetPrivateProfileInt(szUser, _T("TOT"), 1, XTRAY_INI_FILE)<<12);
|
||||
g_dwPrefs |= (GetPrivateProfileInt(szUser, _T("AMAE"), 1, XTRAY_INI_FILE)<<13);
|
||||
g_dwPrefs |= (GetPrivateProfileInt(szUser, _T("OSBWM"), 0, XTRAY_INI_FILE)<<14);
|
||||
g_dwPrefs |= (GetPrivateProfileInt(szUser, _T("UWIOB"), 0, XTRAY_INI_FILE)<<15);
|
||||
g_dwPrefs |= (GetPrivateProfileInt(szUser, _T("KAOI"), 0, XTRAY_INI_FILE)<<16);
|
||||
g_dwPrefs |= (GetPrivateProfileInt(szUser, _T("MIOC"), 0, XTRAY_INI_FILE)<<17);
|
||||
}
|
||||
|
||||
g_hHotKey.key = GetPrivateProfileInt(szUser, _T("KEY"), 84, XTRAY_INI_FILE);
|
||||
g_hHotKey.mod = GetPrivateProfileInt(szUser, _T("MOD"), (MOD_CONTROL | MOD_SHIFT), XTRAY_INI_FILE);
|
||||
g_iTime = GetPrivateProfileInt(szUser, _T("AOT"), 5, XTRAY_INI_FILE);
|
||||
|
||||
GetPrivateProfileString(szUser, _T("AWAY"), _T(""), g_szAway, 1024, XTRAY_INI_FILE);
|
||||
|
||||
/**************************************************************************************************/
|
||||
/******************************** Register our hotkey with windows ********************************/
|
||||
/**************************************************************************************************/
|
||||
if(g_dwPrefs & (1<<PREF_UWIOB))
|
||||
{
|
||||
RegisterHotKey(g_hHotkeyWnd, 1, g_hHotKey.mod, g_hHotKey.key);
|
||||
}
|
||||
}
|
||||
|
||||
void CheckPrefs(HWND hwnd, int iDlg)
|
||||
{
|
||||
/**************************************************************************************************/
|
||||
/**************** save the preferances based on the checkmarks/options ****************************/
|
||||
/**************************************************************************************************/
|
||||
switch(iDlg)
|
||||
{
|
||||
case IDD_EVENTS:
|
||||
{
|
||||
SetOption(hwnd, CHAN_HILIGHT, CHAN_HILIGHT);
|
||||
SetOption(hwnd, CHAN_INVITE, CHAN_INVITE);
|
||||
SetOption(hwnd, CHAN_TOPIC_CHANGE, CHAN_TOPIC_CHANGE);
|
||||
SetOption(hwnd, CHAN_BANNED, CHAN_BANNED);
|
||||
SetOption(hwnd, CHAN_KICKED, CHAN_KICKED);
|
||||
SetOption(hwnd, CTCP_GENERIC, CTCP_GENERIC);
|
||||
SetOption(hwnd, PMSG_RECEIVE, PMSG_RECEIVE);
|
||||
SetOption(hwnd, SERV_KILLED, SERV_KILLED);
|
||||
SetOption(hwnd, SERV_NOTICE, SERV_NOTICE);
|
||||
SetOption(hwnd, SERV_DISCONNECT, SERV_DISCONNECT);
|
||||
}
|
||||
break;
|
||||
case IDD_ALERTS:
|
||||
{
|
||||
SetOption(hwnd, PREF_AMAE, PREF_AMAE);
|
||||
SetOption(hwnd, PREF_OSBWM, PREF_OSBWM);
|
||||
SetOption(hwnd, PREF_UWIOB, PREF_UWIOB);
|
||||
SetOption(hwnd, PREF_KAOI, PREF_KAOI);
|
||||
SetOption(hwnd, PREF_BLINK, PREF_BLINK);
|
||||
|
||||
/**************************************************************************/
|
||||
/**************************************************************************/
|
||||
/**************************************************************************/
|
||||
TCHAR tTime[512];
|
||||
|
||||
GetWindowText(GetDlgItem(hwnd, IDC_ALERT_TIME), tTime, 511);
|
||||
|
||||
g_iTime = _tstoi(tTime);
|
||||
|
||||
/**************************************************************************/
|
||||
/**************** Get our Hotkey and save it **********/
|
||||
/**************** then remove the old hotkey and add the new one **********/
|
||||
/**************************************************************************/
|
||||
DWORD hHotkey;
|
||||
hHotkey = SendDlgItemMessage(hwnd, IDC_ALERT_HOTKEY, HKM_GETHOTKEY, 0, 0);
|
||||
|
||||
g_hHotKey.key = LOBYTE(hHotkey);
|
||||
g_hHotKey.mod = HIBYTE(hHotkey);
|
||||
|
||||
if(IsDlgButtonChecked(hwnd, PREF_UWIOB) == BST_CHECKED)
|
||||
{
|
||||
UnregisterHotKey(g_hHotkeyWnd, 1);
|
||||
RegisterHotKey(g_hHotkeyWnd, 1, g_hHotKey.mod, g_hHotKey.key);
|
||||
}
|
||||
else
|
||||
{
|
||||
UnregisterHotKey(g_hHotkeyWnd, 1);
|
||||
}
|
||||
|
||||
/*************************************************************************/
|
||||
/*********** Get and save the away msg and alert time ********************/
|
||||
/*************************************************************************/
|
||||
}
|
||||
break;
|
||||
case IDD_SETTINGS:
|
||||
{
|
||||
SetOption(hwnd, PREF_AOM, PREF_AOM);
|
||||
SetOption(hwnd, PREF_TOT, PREF_TOT);
|
||||
SetOption(hwnd, PREF_MIOC, PREF_MIOC);
|
||||
SetOption(hwnd, PREF_DNSIT, PREF_DNSIT);
|
||||
|
||||
GetDlgItemText(hwnd, IDC_AWAY_MSG, g_szAway, 511);
|
||||
|
||||
if(g_dwPrefs & (1<<PREF_DNSIT))
|
||||
{
|
||||
DWORD dwStyle;
|
||||
dwStyle = GetWindowLong(g_hXchatWnd, GWL_STYLE);
|
||||
dwStyle |= (1<<WS_CHILD);
|
||||
SetWindowLong(g_hXchatWnd, GWL_STYLE, dwStyle);
|
||||
#ifdef _WIN64
|
||||
SetWindowLong(g_hXchatWnd, GWLP_HWNDPARENT, (long)g_hHotkeyWnd);
|
||||
#else
|
||||
SetWindowLong(g_hXchatWnd, GWL_HWNDPARENT, (long)g_hHotkeyWnd);
|
||||
#endif
|
||||
}
|
||||
else
|
||||
{
|
||||
DWORD dwStyle;
|
||||
dwStyle = GetWindowLong(g_hXchatWnd, GWL_STYLE);
|
||||
dwStyle &= ~(1<<WS_CHILD);
|
||||
SetWindowLong(g_hXchatWnd, GWL_STYLE, dwStyle);
|
||||
#ifdef _WIN64
|
||||
SetWindowLong(g_hXchatWnd, GWLP_HWNDPARENT, NULL);
|
||||
#else
|
||||
SetWindowLong(g_hXchatWnd, GWL_HWNDPARENT, NULL);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void SetDialog(HWND hwnd, int iDlg)
|
||||
{
|
||||
switch(iDlg)
|
||||
{
|
||||
case IDD_EVENTS:
|
||||
{
|
||||
SetCheck(hwnd, CHAN_HILIGHT, CHAN_HILIGHT);
|
||||
SetCheck(hwnd, CHAN_INVITE, CHAN_INVITE);
|
||||
SetCheck(hwnd, CHAN_TOPIC_CHANGE, CHAN_TOPIC_CHANGE);
|
||||
SetCheck(hwnd, CHAN_BANNED, CHAN_BANNED);
|
||||
SetCheck(hwnd, CHAN_KICKED, CHAN_KICKED);
|
||||
SetCheck(hwnd, CTCP_GENERIC, CTCP_GENERIC);
|
||||
SetCheck(hwnd, PMSG_RECEIVE, PMSG_RECEIVE);
|
||||
SetCheck(hwnd, SERV_KILLED, SERV_KILLED);
|
||||
SetCheck(hwnd, SERV_NOTICE, SERV_NOTICE);
|
||||
SetCheck(hwnd, SERV_DISCONNECT, SERV_DISCONNECT);
|
||||
}
|
||||
break;
|
||||
case IDD_SETTINGS:
|
||||
{
|
||||
SetCheck(hwnd, PREF_TOT, PREF_TOT);
|
||||
SetCheck(hwnd, PREF_MIOC, PREF_MIOC);
|
||||
SetCheck(hwnd, PREF_AOM, PREF_AOM);
|
||||
SetCheck(hwnd, PREF_DNSIT, PREF_DNSIT);
|
||||
|
||||
SetDlgItemText(hwnd, IDC_AWAY_MSG, g_szAway);
|
||||
}
|
||||
break;
|
||||
case IDD_ALERTS:
|
||||
{
|
||||
|
||||
SetCheck(hwnd, PREF_BLINK, PREF_BLINK);
|
||||
SetCheck(hwnd, PREF_OSBWM, PREF_OSBWM);
|
||||
SetCheck(hwnd, PREF_UWIOB, PREF_UWIOB);
|
||||
SetCheck(hwnd, PREF_KAOI, PREF_KAOI);
|
||||
|
||||
/**********************************************************/
|
||||
/**********************************************************/
|
||||
/**********************************************************/
|
||||
if(SetCheck(hwnd, PREF_AMAE, PREF_AMAE) == false)
|
||||
{
|
||||
SetToggle(hwnd, PREF_OSBWM, PREF_AMAE, TRUE);
|
||||
SetToggle(hwnd, PREF_UWIOB, PREF_AMAE, TRUE);
|
||||
SetToggle(hwnd, PREF_KAOI, PREF_AMAE, TRUE);
|
||||
SetToggle(hwnd, IDC_ALERT_TIME, PREF_AMAE, TRUE);
|
||||
SetToggle(hwnd, IDC_ALERT_TIME_TEXT, PREF_AMAE, TRUE);
|
||||
SetToggle(hwnd, IDC_ALERT_HOTKEY, PREF_AMAE, TRUE);
|
||||
SetToggle(hwnd, IDC_ALERT_HOTKEY_TEXT, PREF_AMAE, TRUE);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
SetToggle(hwnd, IDC_ALERT_HOTKEY, PREF_UWIOB, TRUE);
|
||||
SetToggle(hwnd, IDC_ALERT_HOTKEY_TEXT, PREF_UWIOB, TRUE);
|
||||
SetToggle(hwnd, IDC_ALERT_TIME, PREF_KAOI, FALSE);
|
||||
SetToggle(hwnd, IDC_ALERT_TIME_TEXT, PREF_KAOI, FALSE);
|
||||
}
|
||||
|
||||
/**********************************************************/
|
||||
/**********************************************************/
|
||||
/**********************************************************/
|
||||
TCHAR tTime[255];
|
||||
SendDlgItemMessage(hwnd, IDC_ALERT_TIME, WM_SETTEXT, 0, (LPARAM)_itot(g_iTime, tTime, 10));
|
||||
SendDlgItemMessage(hwnd, IDC_ALERT_HOTKEY, HKM_SETHOTKEY, MAKEWORD(g_hHotKey.key, g_hHotKey.mod), 0);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
int SetCheck(HWND hDialog, unsigned int uiCheckBox, unsigned int uiPref)
|
||||
{
|
||||
if((g_dwPrefs & (1<<uiPref)))
|
||||
{
|
||||
CheckDlgButton(hDialog, uiCheckBox, BST_CHECKED);
|
||||
return 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
CheckDlgButton(hDialog, uiCheckBox, BST_UNCHECKED);
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int SetToggle(HWND hDialog, unsigned int uiCheckBox, unsigned int uiTestbox, bool offeqoff)
|
||||
{
|
||||
/**************************************************************************************************/
|
||||
/*********************** if(true) then if option is off turn toggle off ***************************/
|
||||
/*********************** if(false) then if option is off turn toggle on ***************************/
|
||||
/**************************************************************************************************/
|
||||
if(offeqoff)
|
||||
{
|
||||
if(IsDlgButtonChecked(hDialog, uiTestbox) == BST_CHECKED)
|
||||
{
|
||||
EnableWindow(GetDlgItem(hDialog, uiCheckBox), TRUE);
|
||||
return 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
EnableWindow(GetDlgItem(hDialog, uiCheckBox), FALSE);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if(IsDlgButtonChecked(hDialog, uiTestbox) == BST_CHECKED)
|
||||
{
|
||||
EnableWindow(GetDlgItem(hDialog, uiCheckBox), FALSE);
|
||||
return 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
EnableWindow(GetDlgItem(hDialog, uiCheckBox), TRUE);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int SetOption(HWND hDialog, unsigned int uiCheckBox, unsigned int uiPref)
|
||||
{
|
||||
if(IsDlgButtonChecked(hDialog, uiCheckBox) == BST_CHECKED)
|
||||
{
|
||||
g_dwPrefs |= (1<<uiPref);
|
||||
}
|
||||
else
|
||||
{
|
||||
g_dwPrefs &= ~(1<<uiPref);
|
||||
}
|
||||
|
||||
return (g_dwPrefs & (1<<uiPref));
|
||||
}
|
||||
|
||||
int WritePrivateProfileIntA(char *szSection, char *szItem, int iData, char *szPath)
|
||||
{
|
||||
char szData[33];
|
||||
itoa(iData, szData, 10);
|
||||
return WritePrivateProfileStringA(szSection, szItem, szData, szPath);
|
||||
}
|
||||
|
||||
int WritePrivateProfileIntW(wchar_t *wszSection, wchar_t *wszItem, int iData, wchar_t *wszPath)
|
||||
{
|
||||
wchar_t wszData[33];
|
||||
_itow(iData, wszData, 10);
|
||||
return WritePrivateProfileStringW(wszSection, wszItem, wszData, wszPath);
|
||||
}
|
||||
|
||||
// For cleanup ( Closing windows and the such )
|
||||
void HoldClose()
|
||||
{
|
||||
HANDLE hcThread;
|
||||
DWORD dwThreadID;
|
||||
hcThread = CreateThread(NULL, 0, HoldCloseThread, 0, 0, &dwThreadID);
|
||||
}
|
||||
|
||||
DWORD WINAPI HoldCloseThread(LPVOID lpParam)
|
||||
{
|
||||
Sleep(1000);
|
||||
PostMessage(g_hXchatWnd, WM_CLOSE, 0, 0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
bool FileExists(TCHAR *file)
|
||||
{
|
||||
HANDLE hTemp = CreateFile(file, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
|
||||
int nRet = GetLastError();
|
||||
CloseHandle(hTemp);
|
||||
|
||||
if(nRet == 0)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void ConvertString(const char *in, wchar_t *out, int size)
|
||||
{
|
||||
MultiByteToWideChar(CP_UTF8, 0, in, -1, out, size);
|
||||
}
|
||||
|
||||
void ConvertString(const wchar_t *in, char *out, int size)
|
||||
{
|
||||
WideCharToMultiByte(CP_UTF8, 0, in, (size - 1), out, size, NULL, NULL);
|
||||
}
|
||||
|
||||
void ConvertString(const char *in, char *out, int size)
|
||||
{
|
||||
strncpy(out, in, size);
|
||||
}
|
||||
|
||||
void ErrorDebug(LPTSTR lpszFunction)
|
||||
{
|
||||
TCHAR szBuf[80];
|
||||
LPVOID lpMsgBuf;
|
||||
DWORD dw = GetLastError();
|
||||
|
||||
FormatMessage(
|
||||
FORMAT_MESSAGE_ALLOCATE_BUFFER |
|
||||
FORMAT_MESSAGE_FROM_SYSTEM,
|
||||
NULL,
|
||||
dw,
|
||||
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
|
||||
(LPTSTR) &lpMsgBuf,
|
||||
0, NULL );
|
||||
|
||||
_stprintf(szBuf,
|
||||
_T("%s failed with error %d: %s"),
|
||||
lpszFunction, dw, lpMsgBuf);
|
||||
|
||||
MessageBox(NULL, szBuf, _T("Error"), MB_OK);
|
||||
|
||||
LocalFree(lpMsgBuf);
|
||||
}
|
||||
|
52
plugins/xtray/utility.h
Normal file
52
plugins/xtray/utility.h
Normal file
@ -0,0 +1,52 @@
|
||||
/* X-Tray
|
||||
* Copyright (C) 2005 Michael Hotaling <Mike.Hotaling@SinisterDevelopments.com>
|
||||
*
|
||||
* X-Tray is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* X-Tray is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with X-Tray; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#ifndef _H_UTILITY_H
|
||||
#define _H_UTILITY_H
|
||||
|
||||
int SetOption (HWND, unsigned int, unsigned int);
|
||||
int SetCheck (HWND, unsigned int, unsigned int);
|
||||
int SetToggle (HWND, unsigned int, unsigned int, bool);
|
||||
void ErrorDebug (LPTSTR lpszFunction);
|
||||
void SetDialog (HWND, int);
|
||||
void CheckPrefs (HWND, int);
|
||||
bool FileExists (TCHAR *);
|
||||
DWORD WINAPI HoldCloseThread (LPVOID);
|
||||
void SavePrefs (int);
|
||||
void LoadPrefs ();
|
||||
void HoldClose ();
|
||||
|
||||
void ConvertString(const char *in, wchar_t *out, int size);
|
||||
void ConvertString(const wchar_t *in, char *out, int size);
|
||||
void ConvertString(const char *in, char *out, int size);
|
||||
|
||||
int WritePrivateProfileIntA(char *, char *, int, char *);
|
||||
int WritePrivateProfileIntW(wchar_t *, wchar_t *, int, wchar_t *);
|
||||
|
||||
#ifdef UNICODE
|
||||
#define WritePrivateProfileInt WritePrivateProfileIntW
|
||||
#else
|
||||
#define WritePrivateProfileInt WritePrivateProfileIntA
|
||||
#endif
|
||||
|
||||
struct HOTKEY
|
||||
{
|
||||
WORD key;
|
||||
WORD mod;
|
||||
};
|
||||
#endif
|
319
plugins/xtray/xchat.cpp
Normal file
319
plugins/xtray/xchat.cpp
Normal file
@ -0,0 +1,319 @@
|
||||
/* X-Tray
|
||||
* Copyright (C) 1998, 2005 Peter Zelezny, Michael Hotaling <Mike.Hotaling@SinisterDevelopments.com>
|
||||
*
|
||||
* X-Tray is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* X-Tray is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with X-Tray; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#include <windows.h>
|
||||
#include <vector>
|
||||
#include <algorithm>
|
||||
#include <stdio.h>
|
||||
#include <tchar.h>
|
||||
#include "plugin.h"
|
||||
#include "xtray.h"
|
||||
#include "resource.h"
|
||||
#include "xchat.h"
|
||||
#include "utility.h"
|
||||
|
||||
// from util.c of xchat source code ( slightly modified to fit X-Tray Syntax )
|
||||
char *xchat_strip_color (char *text)
|
||||
{
|
||||
int nc = 0;
|
||||
int i = 0;
|
||||
int col = 0;
|
||||
int len = strlen(text);
|
||||
char *new_str = (char *)malloc(len + 2);
|
||||
|
||||
while (len > 0)
|
||||
{
|
||||
if ((col && isdigit(*text) && (nc < 2)) || (col && isdigit(*(text+1)) && (nc < 3) && (*text == ',')))
|
||||
{
|
||||
nc++;
|
||||
|
||||
if(*text == ',')
|
||||
{
|
||||
nc = 0;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
col = 0;
|
||||
|
||||
switch (*text)
|
||||
{
|
||||
case '\003': /*ATTR_COLOR: */
|
||||
{
|
||||
col = 1;
|
||||
nc = 0;
|
||||
}
|
||||
break;
|
||||
case '\007': /*ATTR_BEEP: */
|
||||
case '\017': /*ATTR_RESET: */
|
||||
case '\026': /*ATTR_REVERSE: */
|
||||
case '\002': /*ATTR_BOLD: */
|
||||
case '\037': /*ATTR_UNDERLINE: */
|
||||
break;
|
||||
default:
|
||||
{
|
||||
new_str[i] = *text;
|
||||
i++;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
text++;
|
||||
len--;
|
||||
}
|
||||
|
||||
new_str[i] = 0;
|
||||
|
||||
return new_str;
|
||||
}
|
||||
|
||||
void check_special_chars (char *cmd)
|
||||
{
|
||||
int occur = 0;
|
||||
int len = strlen (cmd);
|
||||
int i = 0, j = 0;
|
||||
char *buf;
|
||||
|
||||
if (!len)
|
||||
return;
|
||||
|
||||
buf = (char *)malloc (len + 1);
|
||||
|
||||
if (buf)
|
||||
{
|
||||
while (cmd[j])
|
||||
{
|
||||
switch (cmd[j])
|
||||
{
|
||||
case '%':
|
||||
{
|
||||
occur++;
|
||||
|
||||
switch (cmd[j + 1])
|
||||
{
|
||||
case 'R':
|
||||
buf[i] = '\026';
|
||||
break;
|
||||
case 'U':
|
||||
buf[i] = '\037';
|
||||
break;
|
||||
case 'B':
|
||||
buf[i] = '\002';
|
||||
break;
|
||||
case 'C':
|
||||
buf[i] = '\003';
|
||||
break;
|
||||
case 'O':
|
||||
buf[i] = '\017';
|
||||
break;
|
||||
case '%':
|
||||
buf[i] = '%';
|
||||
break;
|
||||
default:
|
||||
buf[i] = '%';
|
||||
j--;
|
||||
break;
|
||||
}
|
||||
|
||||
j++;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
{
|
||||
buf[i] = cmd[j];
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
j++;
|
||||
i++;
|
||||
}
|
||||
|
||||
buf[i] = 0;
|
||||
|
||||
if (occur)
|
||||
strcpy (cmd, buf);
|
||||
|
||||
free (buf);
|
||||
}
|
||||
}
|
||||
|
||||
void xchat_globally_away(TCHAR *tszAway)
|
||||
{
|
||||
char szTemp[512];
|
||||
char szAway[512];
|
||||
|
||||
ConvertString(tszAway, szAway, 512);
|
||||
_snprintf(szTemp, 512, "ALLSERV AWAY %s\0", szAway);
|
||||
check_special_chars(szTemp);
|
||||
xchat_exec(szTemp);
|
||||
}
|
||||
|
||||
void xchat_away(TCHAR *tszAway)
|
||||
{
|
||||
char szTemp[512];
|
||||
char szAway[512];
|
||||
|
||||
ConvertString(tszAway, szAway, 512);
|
||||
_snprintf(szTemp, 512, szAway);
|
||||
check_special_chars(szTemp);
|
||||
xchat_commandf(ph, "AWAY %s\0", szTemp);
|
||||
}
|
||||
|
||||
void xchat_globally_back()
|
||||
{
|
||||
std::vector<int> xs;
|
||||
std::vector<int>::iterator xsi;
|
||||
xchat_list *xl = xchat_list_get(ph, "channels");
|
||||
|
||||
if(xl)
|
||||
{
|
||||
while(xchat_list_next(ph, xl))
|
||||
{
|
||||
xsi = std::find(xs.begin(), xs.end(), xchat_list_int(ph, xl, "id"));
|
||||
|
||||
if((xsi == xs.end()) &&
|
||||
((strlen(xchat_list_str(ph, xl, "server")) > 0) ||
|
||||
(strlen(xchat_list_str(ph, xl, "channel")) > 0)))
|
||||
{
|
||||
xs.push_back(xchat_list_int(ph, xl, "id"));
|
||||
xchat_set_context(ph, (xchat_context *)xchat_list_str(ph, xl, "context"));
|
||||
xchat_back();
|
||||
}
|
||||
}
|
||||
|
||||
xchat_list_free(ph, xl);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
void xchat_back()
|
||||
{
|
||||
if(xchat_get_info(ph, "away"))
|
||||
{
|
||||
xchat_command(ph, "BACK");
|
||||
}
|
||||
}
|
||||
|
||||
HMENU setServerMenu()
|
||||
{
|
||||
HMENU sTemp = CreateMenu();
|
||||
TCHAR wszServer[128];
|
||||
TCHAR wszNick[128];
|
||||
TCHAR wszMenuEntry[256];
|
||||
|
||||
std::vector<int> xs;
|
||||
std::vector<int>::iterator xsi;
|
||||
xchat_list *xl = xchat_list_get(ph, "channels");
|
||||
|
||||
AppendMenu(sTemp, MF_STRING, ACT_AWAY, _T("Set Globally Away"));
|
||||
AppendMenu(sTemp, MF_STRING, ACT_BACK, _T("Set Globally Back"));
|
||||
AppendMenu(sTemp, MF_SEPARATOR, 0, NULL);
|
||||
|
||||
if(xl)
|
||||
{
|
||||
while(xchat_list_next(ph, xl))
|
||||
{
|
||||
xsi = std::find(xs.begin(), xs.end(), xchat_list_int(ph, xl, "id"));
|
||||
|
||||
if( (xsi == xs.end()) &&
|
||||
((strlen(xchat_list_str(ph, xl, "server")) > 0) ||
|
||||
(strlen(xchat_list_str(ph, xl, "channel")) > 0)))
|
||||
{
|
||||
xchat_set_context(ph, (xchat_context *)xchat_list_str(ph, xl, "context"));
|
||||
xs.push_back(xchat_list_int(ph, xl, "id"));
|
||||
|
||||
char *network = _strdup(xchat_list_str(ph, xl, "network"));
|
||||
char *server = _strdup(xchat_list_str(ph, xl, "server"));
|
||||
char *nick = _strdup(xchat_get_info(ph, "nick"));
|
||||
|
||||
if(network != NULL)
|
||||
{
|
||||
ConvertString(network, wszServer, 128);
|
||||
}
|
||||
else
|
||||
{
|
||||
ConvertString(server, wszServer, 128);
|
||||
}
|
||||
|
||||
if(server != NULL)
|
||||
{
|
||||
ConvertString(nick, wszNick, 128);
|
||||
_sntprintf(wszMenuEntry, 256, _T("%s @ %s\0"), wszNick, wszServer);
|
||||
|
||||
if(!xchat_get_info(ph, "away"))
|
||||
{
|
||||
AppendMenu(sTemp, MF_STRING, (xchat_list_int(ph, xl, "id") + 1), wszMenuEntry);
|
||||
}
|
||||
else
|
||||
{
|
||||
AppendMenu(sTemp, (MF_CHECKED | MF_STRING), (xchat_list_int(ph, xl, "id") + 1), wszMenuEntry);
|
||||
}
|
||||
}
|
||||
|
||||
free(network);
|
||||
free(server);
|
||||
free(nick);
|
||||
}
|
||||
}
|
||||
|
||||
xchat_list_free(ph, xl);
|
||||
}
|
||||
|
||||
return sTemp;
|
||||
}
|
||||
|
||||
struct _xchat_context *xchat_find_server(int find_id)
|
||||
{
|
||||
xchat_context *xc;
|
||||
xchat_list *xl = xchat_list_get(ph, "channels");
|
||||
int id;
|
||||
|
||||
if(!xl)
|
||||
return NULL;
|
||||
|
||||
while(xchat_list_next(ph, xl))
|
||||
{
|
||||
id = xchat_list_int(ph, xl, "id");
|
||||
|
||||
if(id == -1)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
else if(id == find_id)
|
||||
{
|
||||
xc = (xchat_context *)xchat_list_str(ph, xl, "context");
|
||||
|
||||
xchat_list_free(ph, xl);
|
||||
|
||||
return xc;
|
||||
}
|
||||
}
|
||||
|
||||
xchat_list_free(ph, xl);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void xchat_exec(char *command)
|
||||
{
|
||||
xchat_set_context(ph, xchat_find_context(ph, NULL, NULL));
|
||||
xchat_command(ph, command);
|
||||
}
|
32
plugins/xtray/xchat.h
Normal file
32
plugins/xtray/xchat.h
Normal file
@ -0,0 +1,32 @@
|
||||
/* X-Tray
|
||||
* Copyright (C) 2005 Michael Hotaling <Mike.Hotaling@SinisterDevelopments.com>
|
||||
*
|
||||
* X-Tray is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* X-Tray is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with X-Tray; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#ifndef _H_XCHAT_H
|
||||
#define _H_XCHAT_H
|
||||
|
||||
void xchat_exec (char *);
|
||||
char *xchat_strip_color (char *);
|
||||
void xchat_parse (char *);
|
||||
struct _xchat_context *xchat_find_server (int);
|
||||
void xchat_globally_away (TCHAR *);
|
||||
void xchat_away (TCHAR *);
|
||||
void xchat_globally_back ();
|
||||
void xchat_back ();
|
||||
HMENU setServerMenu ();
|
||||
|
||||
#endif
|
226
plugins/xtray/xtray.cpp
Normal file
226
plugins/xtray/xtray.cpp
Normal file
@ -0,0 +1,226 @@
|
||||
/* X-Tray
|
||||
* Copyright (C) 2005 Michael Hotaling <Mike.Hotaling@SinisterDevelopments.com>
|
||||
*
|
||||
* X-Tray is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* X-Tray is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with X-Tray; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#define _WIN32_IE 0x0601
|
||||
|
||||
#include <windows.h>
|
||||
#include <list>
|
||||
#include <string>
|
||||
#include <shobjidl.h>
|
||||
#include "resource.h"
|
||||
#include "callbacks.h"
|
||||
#include "plugin.h"
|
||||
#include "utility.h"
|
||||
#include "xtray.h"
|
||||
#include "sdTray.h"
|
||||
#include "sdAlerts.h"
|
||||
#include "plugin.h"
|
||||
|
||||
/*****************************************************/
|
||||
/**** Don't want to pollute the namespace do we? *****/
|
||||
/*****************************************************/
|
||||
std::list<xchat_hook *> g_vHooks;
|
||||
|
||||
/*****************************************************/
|
||||
/************ Global Identifiers *********************/
|
||||
/*****************************************************/
|
||||
WNDPROC g_hOldProc;
|
||||
xchat_plugin *ph;
|
||||
|
||||
/*****************************************************/
|
||||
/***************** Resources *************************/
|
||||
/*****************************************************/
|
||||
HWND g_hXchatWnd;
|
||||
HWND g_hHotkeyWnd;
|
||||
HWND g_hPrefDlg;
|
||||
HMENU g_hTrayMenu;
|
||||
HICON g_hIcons[11];
|
||||
HANDLE g_hInstance;
|
||||
/*****************************************************/
|
||||
/***************** Preferences ***********************/
|
||||
/*****************************************************/
|
||||
unsigned int g_dwPrefs;
|
||||
TCHAR g_szAway[512];
|
||||
int g_iTime;
|
||||
|
||||
|
||||
BOOL WINAPI DllMain(HANDLE hModule, DWORD fdwReason, LPVOID lpVoid)
|
||||
{
|
||||
if((fdwReason == DLL_PROCESS_ATTACH) || (fdwReason == DLL_THREAD_ATTACH))
|
||||
{
|
||||
g_hInstance = hModule;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
int xchat_plugin_init(xchat_plugin *plugin_handle, char **plugin_name, char **plugin_desc, char **plugin_version, char *arg)
|
||||
{
|
||||
ph = plugin_handle;
|
||||
|
||||
*plugin_name = "X-Tray";
|
||||
*plugin_desc = "Minimize X-Chat to the windows systemtray";
|
||||
*plugin_version = "1.2.3 PR";
|
||||
|
||||
/***************************************************************************************************************************/
|
||||
/************************* Load our preferances from xTray.ini *************************************************************/
|
||||
/***************************************************************************************************************************/
|
||||
LoadPrefs();
|
||||
|
||||
/***************************************************************************************************************************/
|
||||
/************************* Finds the xChat window and saves it for later use ***********************************************/
|
||||
/***************************************************************************************************************************/
|
||||
g_hXchatWnd = (HWND)xchat_get_info(ph, "win_ptr");
|
||||
|
||||
if(g_hXchatWnd == NULL)
|
||||
{
|
||||
EnumThreadWindows(GetCurrentThreadId(), EnumWindowsProc, 0);
|
||||
}
|
||||
|
||||
g_hOldProc = (WNDPROC)GetWindowLongPtr(g_hXchatWnd, GWLP_WNDPROC);
|
||||
SetWindowLong(g_hXchatWnd, GWLP_WNDPROC, (long)WindowProc);
|
||||
|
||||
/***************************************************************************************************************************/
|
||||
/************************* Grab the xChat Icon, Load our menu, create the window to receive the hotkey messages ***********/
|
||||
/************************* and register the windows message so we know if explorer crashes ***********/
|
||||
/***************************************************************************************************************************/
|
||||
g_hTrayMenu = GetSubMenu(LoadMenu((HINSTANCE)g_hInstance, MAKEINTRESOURCE(IDR_TRAY_MENU)), 0);
|
||||
g_hHotkeyWnd = CreateDialog((HINSTANCE)g_hInstance, MAKEINTRESOURCE(IDD_ALERT), NULL, (DLGPROC)HotKeyProc);
|
||||
g_hPrefDlg = CreateDialog((HINSTANCE)g_hInstance, MAKEINTRESOURCE(IDD_PREF), g_hXchatWnd, (DLGPROC)PrefProc);
|
||||
|
||||
g_hIcons[0] = (HICON)LoadImage((HINSTANCE)g_hInstance, MAKEINTRESOURCE(ICO_XCHAT), IMAGE_ICON, 16, 16, LR_DEFAULTCOLOR);
|
||||
g_hIcons[1] = (HICON)LoadImage((HINSTANCE)g_hInstance, MAKEINTRESOURCE(ICO_CHANMSG), IMAGE_ICON, 16, 16, LR_DEFAULTCOLOR);
|
||||
g_hIcons[2] = (HICON)LoadImage((HINSTANCE)g_hInstance, MAKEINTRESOURCE(ICO_HIGHLIGHT), IMAGE_ICON, 16, 16, LR_DEFAULTCOLOR);
|
||||
g_hIcons[5] = (HICON)LoadImage((HINSTANCE)g_hInstance, MAKEINTRESOURCE(ICO_BANNED), IMAGE_ICON, 16, 16, LR_DEFAULTCOLOR);
|
||||
g_hIcons[6] = (HICON)LoadImage((HINSTANCE)g_hInstance, MAKEINTRESOURCE(ICO_KICKED), IMAGE_ICON, 16, 16, LR_DEFAULTCOLOR);
|
||||
g_hIcons[8] = (HICON)LoadImage((HINSTANCE)g_hInstance, MAKEINTRESOURCE(ICO_PMSG), IMAGE_ICON, 16, 16, LR_DEFAULTCOLOR);
|
||||
g_hIcons[10]= (HICON)LoadImage((HINSTANCE)g_hInstance, MAKEINTRESOURCE(ICO_SNOTICE), IMAGE_ICON, 16, 16, LR_DEFAULTCOLOR);
|
||||
g_hIcons[11]= (HICON)LoadImage((HINSTANCE)g_hInstance, MAKEINTRESOURCE(ICO_DISCONNECTED), IMAGE_ICON, 16, 16, LR_DEFAULTCOLOR);
|
||||
|
||||
/***************************************************************************************************************************/
|
||||
/************************* Add our icon to the tray ************************************************************************/
|
||||
/***************************************************************************************************************************/
|
||||
char szVersion[64];
|
||||
_snprintf(szVersion, 64, "X-Chat [%s]", xchat_get_info(ph, "version"));
|
||||
AddIcon(g_hXchatWnd, 1, g_hIcons[0], szVersion, (NIF_ICON | NIF_MESSAGE | NIF_TIP), WM_TRAYMSG);
|
||||
|
||||
/***************************************************************************************************************************/
|
||||
/***************************************************************************************************************************/
|
||||
/***************************************************************************************************************************/
|
||||
if(g_dwPrefs & (1<<PREF_DNSIT))
|
||||
{
|
||||
DWORD dwStyle;
|
||||
dwStyle = GetWindowLong(g_hXchatWnd, GWL_STYLE);
|
||||
dwStyle |= (1<<WS_CHILD);
|
||||
SetWindowLong(g_hXchatWnd, GWL_STYLE, dwStyle);
|
||||
#ifdef _WIN64
|
||||
SetWindowLong(g_hXchatWnd, GWLP_HWNDPARENT, (long)g_hHotkeyWnd);
|
||||
#else
|
||||
SetWindowLong(g_hXchatWnd, GWL_HWNDPARENT, (long)g_hHotkeyWnd);
|
||||
#endif
|
||||
}
|
||||
|
||||
/***************************************************************************************************************************/
|
||||
/************************* Set our hooks and save them for later so we can unhook them *************************************/
|
||||
/***************************************************************************************************************************/
|
||||
g_vHooks.push_back(xchat_hook_print(ph, "Channel Msg Hilight", XCHAT_PRI_NORM, event_cb, (void *)CHAN_HILIGHT));
|
||||
g_vHooks.push_back(xchat_hook_print(ph, "Topic Change", XCHAT_PRI_NORM, event_cb, (void *)CHAN_TOPIC_CHANGE));
|
||||
g_vHooks.push_back(xchat_hook_print(ph, "Channel Action Hilight", XCHAT_PRI_NORM, event_cb, (void *)CHAN_HILIGHT));
|
||||
g_vHooks.push_back(xchat_hook_print(ph, "Channel INVITE", XCHAT_PRI_NORM, event_cb, (void *)CHAN_INVITE));
|
||||
g_vHooks.push_back(xchat_hook_print(ph, "You Kicked", XCHAT_PRI_NORM, event_cb, (void *)CHAN_KICKED));
|
||||
g_vHooks.push_back(xchat_hook_print(ph, "Banned", XCHAT_PRI_NORM, event_cb, (void *)CHAN_BANNED));
|
||||
g_vHooks.push_back(xchat_hook_print(ph, "CTCP Generic", XCHAT_PRI_NORM, event_cb, (void *)CTCP_GENERIC));
|
||||
g_vHooks.push_back(xchat_hook_print(ph, "Private Message", XCHAT_PRI_NORM, event_cb, (void *)PMSG_RECEIVE));
|
||||
g_vHooks.push_back(xchat_hook_print(ph, "Private Message to Dialog", XCHAT_PRI_NORM, event_cb, (void *)PMSG_RECEIVE));
|
||||
g_vHooks.push_back(xchat_hook_print(ph, "Disconnected", XCHAT_PRI_NORM, event_cb, (void *)SERV_DISCONNECT));
|
||||
g_vHooks.push_back(xchat_hook_print(ph, "Killed", XCHAT_PRI_NORM, event_cb, (void *)SERV_KILLED));
|
||||
g_vHooks.push_back(xchat_hook_print(ph, "Notice", XCHAT_PRI_NORM, event_cb, (void *)SERV_NOTICE));
|
||||
g_vHooks.push_back(xchat_hook_command(ph, "tray_alert", XCHAT_PRI_NORM, command_cb, "Create an Alert", NULL));
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
int xchat_plugin_deinit(xchat_plugin *plugin_handle)
|
||||
{
|
||||
/******************************************/
|
||||
/****** Remove the Icon from the tray *****/
|
||||
/******************************************/
|
||||
StopBlink(g_hXchatWnd, 1, g_hIcons[0]);
|
||||
RemoveIcon(g_hXchatWnd, 1);
|
||||
|
||||
/*******************************************/
|
||||
/*******************************************/
|
||||
/*******************************************/
|
||||
if(g_dwPrefs & (1<<PREF_DNSIT))
|
||||
{
|
||||
DWORD dwStyle;
|
||||
dwStyle = GetWindowLong(g_hXchatWnd, GWL_STYLE);
|
||||
dwStyle &= ~(1<<WS_CHILD);
|
||||
SetWindowLong(g_hXchatWnd, GWL_STYLE, dwStyle);
|
||||
#ifdef _WIN64
|
||||
SetWindowLong(g_hXchatWnd, GWLP_HWNDPARENT, NULL);
|
||||
#else
|
||||
SetWindowLong(g_hXchatWnd, GWL_HWNDPARENT, NULL);
|
||||
#endif
|
||||
}
|
||||
|
||||
/******************************************/
|
||||
/****** Unload our resources **************/
|
||||
/******************************************/
|
||||
DestroyMenu(g_hTrayMenu);
|
||||
|
||||
for(int i = 0; i <= 11; i++)
|
||||
{
|
||||
DestroyIcon(g_hIcons[i]);
|
||||
}
|
||||
|
||||
/******************************************/
|
||||
/****** Remove our window hook ************/
|
||||
/******************************************/
|
||||
SetWindowLong(g_hXchatWnd, GWLP_WNDPROC, (long)g_hOldProc);
|
||||
|
||||
/******************************************/
|
||||
/****** Remove our hotkey, and destroy ****/
|
||||
/****** the window that receives its ****/
|
||||
/****** messages ****/
|
||||
/******************************************/
|
||||
UnregisterHotKey(g_hHotkeyWnd, 1);
|
||||
DestroyWindow(g_hHotkeyWnd);
|
||||
DestroyWindow(g_hPrefDlg);
|
||||
|
||||
/******************************************/
|
||||
/************* Clean up Isle 7 ************/
|
||||
/******************************************/
|
||||
if(sdAlertNum())
|
||||
{
|
||||
sdCloseAlerts();
|
||||
}
|
||||
/******************************************/
|
||||
/****** remove our xchat_hook_*s **********/
|
||||
/******************************************/
|
||||
while(!g_vHooks.empty())
|
||||
{
|
||||
if(g_vHooks.back() != NULL)
|
||||
{
|
||||
xchat_unhook(ph, g_vHooks.back());
|
||||
}
|
||||
g_vHooks.pop_back();
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
65
plugins/xtray/xtray.h
Normal file
65
plugins/xtray/xtray.h
Normal file
@ -0,0 +1,65 @@
|
||||
/* X-Tray
|
||||
* Copyright (C) 2005 Michael Hotaling <Mike.Hotaling@SinisterDevelopments.com>
|
||||
*
|
||||
* X-Tray is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* X-Tray is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with X-Tray; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#ifndef _XTRAY_H
|
||||
#define _XTRAY_H
|
||||
|
||||
/******************** Globals *************************/
|
||||
extern HWND g_hXchatWnd;
|
||||
extern HWND g_hHotkeyWnd;
|
||||
extern HWND g_hPrefDlg;
|
||||
extern HMENU g_hTrayMenu;
|
||||
extern HICON g_hIcons[11];
|
||||
extern HANDLE g_hInstance;
|
||||
extern unsigned int g_dwPrefs;
|
||||
extern TCHAR g_szAway[512];
|
||||
extern int g_iTime;
|
||||
extern WNDPROC g_hOldProc;
|
||||
extern struct _xchat_plugin *ph;
|
||||
/******************************************************/
|
||||
|
||||
/******************** Messages ************************/
|
||||
#define WM_TRAYMSG WM_APP
|
||||
/******************************************************/
|
||||
|
||||
/********************* Events *************************/
|
||||
#define CHAN_HILIGHT 1
|
||||
#define CHAN_INVITE 2
|
||||
#define CHAN_TOPIC_CHANGE 3
|
||||
#define CHAN_BANNED 4
|
||||
#define CHAN_KICKED 5
|
||||
|
||||
#define CTCP_GENERIC 6
|
||||
#define PMSG_RECEIVE 7
|
||||
|
||||
#define SERV_KILLED 8
|
||||
#define SERV_NOTICE 9
|
||||
#define SERV_DISCONNECT 10
|
||||
|
||||
#define PREF_AOM 11 // away on minimize
|
||||
#define PREF_TOT 12 // Tray on Taskbar
|
||||
#define PREF_AMAE 13 // alert me about events
|
||||
#define PREF_OSBWM 14 // Only Show Balloon When Minimized
|
||||
#define PREF_UWIOB 15 // Use Window Instead of Balloon
|
||||
#define PREF_KAOI 16 // Keep alerts open indefinately
|
||||
#define PREF_MIOC 17 // Minimize instead of close
|
||||
#define PREF_BLINK 18 // blink icon
|
||||
#define PREF_CICO 19 // change icon - not implemented
|
||||
#define PREF_DNSIT 20 // Do not show in taskbar
|
||||
/******************************************************/
|
||||
#endif
|
230
src/common/dirent.h
Normal file
230
src/common/dirent.h
Normal file
@ -0,0 +1,230 @@
|
||||
/*****************************************************************************
|
||||
* dirent.h - dirent API for Microsoft Visual Studio
|
||||
*
|
||||
* Copyright (C) 2006 Toni Ronkko
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining
|
||||
* a copy of this software and associated documentation files (the
|
||||
* ``Software''), to deal in the Software without restriction, including
|
||||
* without limitation the rights to use, copy, modify, merge, publish,
|
||||
* distribute, sublicense, and/or sell copies of the Software, and to
|
||||
* permit persons to whom the Software is furnished to do so, subject to
|
||||
* the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included
|
||||
* in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
* IN NO EVENT SHALL TONI RONKKO BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
* OTHER DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
* Dec 15, 2009, John Cunningham
|
||||
* Added rewinddir member function
|
||||
*
|
||||
* Jan 18, 2008, Toni Ronkko
|
||||
* Using FindFirstFileA and WIN32_FIND_DATAA to avoid converting string
|
||||
* between multi-byte and unicode representations. This makes the
|
||||
* code simpler and also allows the code to be compiled under MingW. Thanks
|
||||
* to Azriel Fasten for the suggestion.
|
||||
*
|
||||
* Mar 4, 2007, Toni Ronkko
|
||||
* Bug fix: due to the strncpy_s() function this file only compiled in
|
||||
* Visual Studio 2005. Using the new string functions only when the
|
||||
* compiler version allows.
|
||||
*
|
||||
* Nov 2, 2006, Toni Ronkko
|
||||
* Major update: removed support for Watcom C, MS-DOS and Turbo C to
|
||||
* simplify the file, updated the code to compile cleanly on Visual
|
||||
* Studio 2005 with both unicode and multi-byte character strings,
|
||||
* removed rewinddir() as it had a bug.
|
||||
*
|
||||
* Aug 20, 2006, Toni Ronkko
|
||||
* Removed all remarks about MSVC 1.0, which is antiqued now. Simplified
|
||||
* comments by removing SGML tags.
|
||||
*
|
||||
* May 14 2002, Toni Ronkko
|
||||
* Embedded the function definitions directly to the header so that no
|
||||
* source modules need to be included in the Visual Studio project. Removed
|
||||
* all the dependencies to other projects so that this very header can be
|
||||
* used independently.
|
||||
*
|
||||
* May 28 1998, Toni Ronkko
|
||||
* First version.
|
||||
*****************************************************************************/
|
||||
#ifndef DIRENT_H
|
||||
#define DIRENT_H
|
||||
|
||||
#include <windows.h>
|
||||
#include <string.h>
|
||||
#include <assert.h>
|
||||
|
||||
|
||||
typedef struct dirent
|
||||
{
|
||||
char d_name[MAX_PATH + 1]; /* current dir entry (multi-byte char string) */
|
||||
WIN32_FIND_DATAA data; /* file attributes */
|
||||
} dirent;
|
||||
|
||||
|
||||
typedef struct DIR
|
||||
{
|
||||
dirent current; /* Current directory entry */
|
||||
int cached; /* Indicates un-processed entry in memory */
|
||||
HANDLE search_handle; /* File search handle */
|
||||
char patt[MAX_PATH + 3]; /* search pattern (3 = pattern + "\\*\0") */
|
||||
} DIR;
|
||||
|
||||
|
||||
/* Forward declarations */
|
||||
static DIR *opendir (const char *dirname);
|
||||
static struct dirent *readdir (DIR *dirp);
|
||||
static int closedir (DIR *dirp);
|
||||
static void rewinddir(DIR* dirp);
|
||||
|
||||
|
||||
/* Use the new safe string functions introduced in Visual Studio 2005 */
|
||||
#if defined(_MSC_VER) && _MSC_VER >= 1400
|
||||
# define STRNCPY(dest,src,size) strncpy_s((dest),(size),(src),_TRUNCATE)
|
||||
#else
|
||||
# define STRNCPY(dest,src,size) strncpy((dest),(src),(size))
|
||||
#endif
|
||||
|
||||
|
||||
/*****************************************************************************
|
||||
* Open directory stream DIRNAME for read and return a pointer to the
|
||||
* internal working area that is used to retrieve individual directory
|
||||
* entries.
|
||||
*/
|
||||
static DIR *opendir(const char *dirname)
|
||||
{
|
||||
DIR *dirp;
|
||||
assert (dirname != NULL);
|
||||
assert (strlen (dirname) < MAX_PATH);
|
||||
|
||||
/* construct new DIR structure */
|
||||
dirp = (DIR*) malloc (sizeof (struct DIR));
|
||||
if (dirp != NULL) {
|
||||
char *p;
|
||||
|
||||
/* take directory name... */
|
||||
STRNCPY (dirp->patt, dirname, sizeof(dirp->patt));
|
||||
dirp->patt[MAX_PATH] = '\0';
|
||||
|
||||
/* ... and append search pattern to it */
|
||||
p = strchr (dirp->patt, '\0');
|
||||
if (dirp->patt < p && *(p-1) != '\\' && *(p-1) != ':') {
|
||||
*p++ = '\\';
|
||||
}
|
||||
*p++ = '*';
|
||||
*p = '\0';
|
||||
|
||||
/* open stream and retrieve first file */
|
||||
dirp->search_handle = FindFirstFileA (dirp->patt, &dirp->current.data);
|
||||
if (dirp->search_handle == INVALID_HANDLE_VALUE) {
|
||||
/* invalid search pattern? */
|
||||
free (dirp);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* there is an un-processed directory entry in memory now */
|
||||
dirp->cached = 1;
|
||||
}
|
||||
|
||||
return dirp;
|
||||
}
|
||||
|
||||
|
||||
/*****************************************************************************
|
||||
* Read a directory entry, and return a pointer to a dirent structure
|
||||
* containing the name of the entry in d_name field. Individual directory
|
||||
* entries returned by this very function include regular files,
|
||||
* sub-directories, pseudo-directories "." and "..", but also volume labels,
|
||||
* hidden files and system files may be returned.
|
||||
*/
|
||||
static struct dirent *readdir(DIR *dirp)
|
||||
{
|
||||
assert (dirp != NULL);
|
||||
|
||||
if (dirp->search_handle == INVALID_HANDLE_VALUE) {
|
||||
/* directory stream was opened/rewound incorrectly or ended normally */
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* get next directory entry */
|
||||
if (dirp->cached != 0) {
|
||||
/* a valid directory entry already in memory */
|
||||
dirp->cached = 0;
|
||||
} else {
|
||||
/* read next directory entry from disk */
|
||||
if (FindNextFileA (dirp->search_handle, &dirp->current.data) == FALSE) {
|
||||
/* the very last file has been processed or an error occured */
|
||||
FindClose (dirp->search_handle);
|
||||
dirp->search_handle = INVALID_HANDLE_VALUE;
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
/* copy as a multibyte character string */
|
||||
STRNCPY ( dirp->current.d_name,
|
||||
dirp->current.data.cFileName,
|
||||
sizeof(dirp->current.d_name) );
|
||||
dirp->current.d_name[MAX_PATH] = '\0';
|
||||
|
||||
return &dirp->current;
|
||||
}
|
||||
|
||||
|
||||
/*****************************************************************************
|
||||
* Close directory stream opened by opendir() function. Close of the
|
||||
* directory stream invalidates the DIR structure as well as any previously
|
||||
* read directory entry.
|
||||
*/
|
||||
static int closedir(DIR *dirp)
|
||||
{
|
||||
assert (dirp != NULL);
|
||||
|
||||
/* release search handle */
|
||||
if (dirp->search_handle != INVALID_HANDLE_VALUE) {
|
||||
FindClose (dirp->search_handle);
|
||||
dirp->search_handle = INVALID_HANDLE_VALUE;
|
||||
}
|
||||
|
||||
/* release directory handle */
|
||||
free (dirp);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/*****************************************************************************
|
||||
* Resets the position of the directory stream to which dirp refers to the
|
||||
* beginning of the directory. It also causes the directory stream to refer
|
||||
* to the current state of the corresponding directory, as a call to opendir()
|
||||
* would have done. If dirp does not refer to a directory stream, the effect
|
||||
* is undefined.
|
||||
*/
|
||||
static void rewinddir(DIR* dirp)
|
||||
{
|
||||
/* release search handle */
|
||||
if (dirp->search_handle != INVALID_HANDLE_VALUE) {
|
||||
FindClose (dirp->search_handle);
|
||||
dirp->search_handle = INVALID_HANDLE_VALUE;
|
||||
}
|
||||
|
||||
/* open new search handle and retrieve first file */
|
||||
dirp->search_handle = FindFirstFileA (dirp->patt, &dirp->current.data);
|
||||
if (dirp->search_handle == INVALID_HANDLE_VALUE) {
|
||||
/* invalid search pattern? */
|
||||
free (dirp);
|
||||
return;
|
||||
}
|
||||
|
||||
/* there is an un-processed directory entry in memory now */
|
||||
dirp->cached = 1;
|
||||
}
|
||||
|
||||
|
||||
#endif /*DIRENT_H*/
|
13
src/common/makefile.mak
Normal file
13
src/common/makefile.mak
Normal file
@ -0,0 +1,13 @@
|
||||
include "..\makeinc.mak"
|
||||
|
||||
all: $(COMMON_OBJECTS) xchatcommon.lib
|
||||
|
||||
xchatcommon.lib: $(COMMON_OBJECTS)
|
||||
lib -out:xchatcommon.lib $(COMMON_OBJECTS)
|
||||
|
||||
.c.obj:
|
||||
$(CC) $(CFLAGS) $(GLIB) $<
|
||||
|
||||
clean:
|
||||
del *.obj
|
||||
del xchatcommon.lib
|
37
src/fe-gtk/makefile.mak
Normal file
37
src/fe-gtk/makefile.mak
Normal file
@ -0,0 +1,37 @@
|
||||
include "..\makeinc.mak"
|
||||
|
||||
!ifdef X64
|
||||
MACHINE_FLAG = /MACHINE:X64
|
||||
!else
|
||||
MACHINE_FLAG = /MACHINE:X86
|
||||
!endif
|
||||
|
||||
COMLIB = ..\common\xchatcommon.lib
|
||||
PROG = xchat.exe
|
||||
|
||||
all: $(PROG)
|
||||
|
||||
mmx_cmod.o: mmx_cmod.S
|
||||
gcc -DUNDERSCORE_SYMBOLS -c mmx_cmod.S
|
||||
|
||||
.c.obj:
|
||||
$(CC) $(CFLAGS) $(GLIB) $(GTK) $<
|
||||
|
||||
$(PROG): $(FEGTK_OBJECTS) $(COMLIB) xchat-icon.obj
|
||||
$(LINK) /out:$(PROG) /ENTRY:mainCRTStartup $(LDFLAGS) $(LIBS) $(FEGTK_OBJECTS) $(COMLIB) xchat-icon.obj
|
||||
@dir $(PROG)
|
||||
|
||||
xchat.rc:
|
||||
echo XC_ICON ICON "../../xchat.ico" > xchat.rc
|
||||
|
||||
xchat.res: xchat.rc ../../xchat.ico
|
||||
rc /r xchat.rc
|
||||
|
||||
xchat-icon.obj: xchat.res
|
||||
cvtres /NOLOGO $(MACHINE_FLAG) /OUT:xchat-icon.obj xchat.res
|
||||
|
||||
clean:
|
||||
del *.obj
|
||||
del $(PROG)
|
||||
del xchat.rc
|
||||
del xchat.RES
|
18
src/makefile.mak
Normal file
18
src/makefile.mak
Normal file
@ -0,0 +1,18 @@
|
||||
all:
|
||||
copy ..\plugins\xchat-plugin.h common
|
||||
@cd pixmaps
|
||||
@-$(MAKE) -f makefile.mak $@
|
||||
@cd ..\common
|
||||
@-$(MAKE) -f makefile.mak $@
|
||||
@cd ..\fe-gtk
|
||||
@-$(MAKE) -f makefile.mak $@
|
||||
|
||||
clean:
|
||||
del common\*.obj
|
||||
del common\xchatcommon.lib
|
||||
del fe-gtk\*.obj
|
||||
del fe-gtk\mmx_cmod.o
|
||||
del fe-gtk\xchat.exe
|
||||
del fe-gtk\xchat.rc
|
||||
del fe-gtk\xchat.RES
|
||||
del pixmaps\*.h
|
125
src/makeinc.mak
Normal file
125
src/makeinc.mak
Normal file
@ -0,0 +1,125 @@
|
||||
#uncomment this to have an x64 build
|
||||
#X64 = YES
|
||||
#OPENSSL = YES
|
||||
IPV6 = YES
|
||||
|
||||
CC = cl
|
||||
LINK = link
|
||||
CFLAGS = $(CFLAGS) /Ox /c /MD /nologo /DWIN32 /DG_DISABLE_CAST_CHECKS /Dstrcasecmp=stricmp /Dstrncasecmp=strnicmp /Dstrtoull=_strtoui64
|
||||
CPPFLAGS = /c /MD /nologo /DWIN32
|
||||
LDFLAGS = /subsystem:windows /nologo
|
||||
LIBS = $(LIBS) gdi32.lib shell32.lib user32.lib advapi32.lib imm32.lib ole32.lib winmm.lib
|
||||
!ifdef X64
|
||||
#############################################################
|
||||
#x64 config
|
||||
GLIB = -Ic:/mozilla-build/build/xchat-dev64/include/glib-2.0 -Ic:/mozilla-build/build/xchat-dev64/lib/glib-2.0/include
|
||||
GTK = -Ic:/mozilla-build/build/xchat-dev64/include/gtk-2.0 -Ic:/mozilla-build/build/xchat-dev64/lib/gtk-2.0/include -Ic:/mozilla-build/build/xchat-dev64/include/atk-1.0 -Ic:/mozilla-build/build/xchat-dev64/include/cairo -Ic:/mozilla-build/build/xchat-dev64/include/pango-1.0 -Ic:/mozilla-build/build/xchat-dev64/include/glib-2.0 -Ic:/mozilla-build/build/xchat-dev64/lib/glib-2.0/include -Ic:/mozilla-build/build/xchat-dev64/include/freetype2 -Ic:/mozilla-build/build/xchat-dev64/include -Ic:/mozilla-build/build/xchat-dev64/include/libpng14
|
||||
LIBS = $(LIBS) /libpath:c:/mozilla-build/build/xchat-dev64/lib gtk-win32-2.0.lib gdk-win32-2.0.lib atk-1.0.lib gio-2.0.lib gdk_pixbuf-2.0.lib pangowin32-1.0.lib gdi32.lib pangocairo-1.0.lib pango-1.0.lib cairo.lib gobject-2.0.lib gmodule-2.0.lib glib-2.0.lib intl.lib
|
||||
|
||||
CFLAGS = $(CFLAGS) /favor:AMD64
|
||||
CPPFLAGS = $(CPPFLAGS) /favor:AMD64 /D_WIN64
|
||||
LDFLAGS = $(LDFLAGS) msvcrt_win2003.obj
|
||||
|
||||
PERLPATH = c:\mozilla-build\perl-5.10-x64\lib\CORE
|
||||
PYTHONPATH = c:\mozilla-build\python-2.5-x64
|
||||
TCLPATH = c:\mozilla-build\tcl-8.6-x64
|
||||
!else
|
||||
#############################################################
|
||||
#x86 config
|
||||
GLIB = -Ic:/mozilla-build/build/xchat-dev32/include/glib-2.0 -Ic:/mozilla-build/build/xchat-dev32/lib/glib-2.0/include
|
||||
GTK = -Ic:/mozilla-build/build/xchat-dev32/include/gtk-2.0 -Ic:/mozilla-build/build/xchat-dev32/lib/gtk-2.0/include -Ic:/mozilla-build/build/xchat-dev32/include/atk-1.0 -Ic:/mozilla-build/build/xchat-dev32/include/cairo -Ic:/mozilla-build/build/xchat-dev32/include/pango-1.0 -Ic:/mozilla-build/build/xchat-dev32/include/glib-2.0 -Ic:/mozilla-build/build/xchat-dev32/lib/glib-2.0/include -Ic:/mozilla-build/build/xchat-dev32/include/freetype2 -Ic:/mozilla-build/build/xchat-dev32/include -Ic:/mozilla-build/build/xchat-dev32/include/libpng14
|
||||
LIBS = $(LIBS) /libpath:c:/mozilla-build/build/xchat-dev32/lib gtk-win32-2.0.lib gdk-win32-2.0.lib atk-1.0.lib gio-2.0.lib gdk_pixbuf-2.0.lib pangowin32-1.0.lib gdi32.lib pangocairo-1.0.lib pango-1.0.lib cairo.lib gobject-2.0.lib gmodule-2.0.lib glib-2.0.lib intl.lib
|
||||
|
||||
LDFLAGS = $(LDFLAGS) msvcrt_winxp.obj
|
||||
|
||||
PERLPATH = c:\mozilla-build\perl-5.10-x86\lib\CORE
|
||||
PYTHONPATH = c:\mozilla-build\python-2.5-x86
|
||||
TCLPATH = c:\mozilla-build\tcl-8.6-x86
|
||||
|
||||
MMX = YES
|
||||
!endif
|
||||
#############################################################
|
||||
|
||||
PERLLIB = perl510
|
||||
PERLOUTPUT = xcperl.dll
|
||||
|
||||
PYTHONLIB = python25
|
||||
PYTHONOUTPUT = xcpython.dll
|
||||
|
||||
TCLLIB = tcl86
|
||||
TCLOUTPUT = xctcl.dll
|
||||
|
||||
!ifdef IPV6
|
||||
CFLAGS = $(CFLAGS) -DUSE_IPV6
|
||||
LIBS = $(LIBS) ws2_32.lib
|
||||
!else
|
||||
LIBS = $(LIBS) wsock32.lib
|
||||
!endif
|
||||
|
||||
!ifdef OPENSSL
|
||||
CFLAGS = $(CFLAGS) /DUSE_OPENSSL
|
||||
LIBS = $(LIBS) libeay32.lib ssleay32.lib
|
||||
SSLOBJ = ssl.obj
|
||||
!endif
|
||||
|
||||
COMMON_OBJECTS = \
|
||||
cfgfiles.obj \
|
||||
chanopt.obj \
|
||||
ctcp.obj \
|
||||
dcc.obj \
|
||||
history.obj \
|
||||
identd.obj \
|
||||
ignore.obj \
|
||||
inbound.obj \
|
||||
modes.obj \
|
||||
network.obj \
|
||||
notify.obj \
|
||||
outbound.obj \
|
||||
plugin.obj \
|
||||
plugin-timer.obj \
|
||||
proto-irc.obj \
|
||||
server.obj \
|
||||
servlist.obj \
|
||||
$(SSLOBJ) \
|
||||
text.obj \
|
||||
tree.obj \
|
||||
url.obj \
|
||||
userlist.obj \
|
||||
util.obj \
|
||||
xchat.obj
|
||||
|
||||
FEGTK_OBJECTS = \
|
||||
about.obj \
|
||||
ascii.obj \
|
||||
banlist.obj \
|
||||
chanlist.obj \
|
||||
chanview.obj \
|
||||
custom-list.obj \
|
||||
dccgui.obj \
|
||||
editlist.obj \
|
||||
fe-gtk.obj \
|
||||
fkeys.obj \
|
||||
gtkutil.obj \
|
||||
ignoregui.obj \
|
||||
joind.obj \
|
||||
maingui.obj \
|
||||
menu.obj \
|
||||
notifygui.obj \
|
||||
palette.obj \
|
||||
pixmaps.obj \
|
||||
plugingui.obj \
|
||||
plugin-tray.obj \
|
||||
rawlog.obj \
|
||||
search.obj \
|
||||
servlistgui.obj \
|
||||
setup.obj \
|
||||
sexy-spell-entry.obj \
|
||||
textgui.obj \
|
||||
urlgrab.obj \
|
||||
userlistgui.obj \
|
||||
xtext.obj
|
||||
|
||||
!ifdef MMX
|
||||
FEGTK_OBJECTS = $(FEGTK_OBJECTS) mmx_cmod.o
|
||||
CFLAGS = $(CFLAGS) -DUSE_MMX
|
||||
!endif
|
18
src/pixmaps/makefile.mak
Normal file
18
src/pixmaps/makefile.mak
Normal file
@ -0,0 +1,18 @@
|
||||
CONV = gdk-pixbuf-csource
|
||||
|
||||
LIST = bookpng book.png \
|
||||
hoppng hop.png \
|
||||
oppng op.png \
|
||||
purplepng purple.png \
|
||||
redpng red.png \
|
||||
trayfilepng fileoffer.png \
|
||||
trayhilightpng highlight.png \
|
||||
traymsgpng message.png \
|
||||
voicepng voice.png \
|
||||
xchatpng ..\..\xchat.png
|
||||
|
||||
all:
|
||||
$(CONV) --build-list $(LIST) > inline_pngs.h
|
||||
|
||||
clean:
|
||||
del *.h
|
5385
xchat-wdk.patch
5385
xchat-wdk.patch
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user