# HG changeset patch
# User masca@cpw.pidgin.im
# Date 1266512344 0
# Node ID c5a7516418c732b59c4e123440960cb9e888e71b
# Parent cc6d733a192a1e780ea0ebc4b12a4ecf6514a654# Parent aacd0b257060d0843abf0d09c8d28157d22aa91e
propagate from branch 'im.pidgin.pidgin' (head 624bba8bd37445c496620c94bfe6da7da8af2ee4)
to branch 'im.pidgin.cpw.qulogic.msnp16' (head 44494e162429137be1f175f40827c1d31655e7d3)
diff -r cc6d733a192a -r c5a7516418c7 ChangeLog
--- a/ChangeLog Tue Feb 16 15:58:34 2010 +0000
+++ b/ChangeLog Thu Feb 18 16:59:04 2010 +0000
@@ -1,6 +1,24 @@
Pidgin and Finch: The Pimpin' Penguin IM Clients That're Good for the Soul
-version 2.6.6 (??/??/20??):
+version 2.7.0 (??/??/????):
+ General:
+ * Changed GTK+ minimum version requirement to 2.10.0.
+ * Changed GLib minimum version requirement to 2.12.0.
+
+ Pidgin:
+ * Moved the "Debugging Information" section of the About box to a
+ "Build Information" dialog accessible on the Help menu.
+ * Moved the Developer and Crazy Patch Writer information from the About
+ box to a "Developer Information" dialog accessible on the Help menu.
+ * Moved the Translator information from the About box to a "Translator
+ Information" dialog accessible on the Help menu.
+ * Use GtkStatusIcon for the docklet, providing better integration in
+ notification area.
+ * Added UI for sending attentions (buzz, nudge) on supporting protocols.
+ * Make the search dialog unobtrusive in the conversation window (by making
+ it look and behave like the search dialog in Firefox)
+
+version 2.6.6 (02/18/2010):
libpurple:
* Fix 'make check' on OS X. (David Fang)
* Fix a quirk in purple_markup_html_to_xhtml that caused some messages
@@ -26,6 +44,8 @@
Previously only icons between 48x48 and 50x50 were allowed.
MSN:
+ * Fix CVE-2010-0277, a possible remote crash when parsing an incoming
+ SLP message. (Discovered by Fabian Yamaguchi)
* File transfer requests will no longer cause a crash if you delete the
file before the other side accepts.
* Received files will no longer hold an extra lock after completion,
@@ -42,23 +62,24 @@
* Less likely to send messages to a contact's idle/inactive resource.
Previously, if a message was received from a specific resource,
responses would be sent to that resource until either it went offline
- or a message is received from another resource. Now, messages are sent
- to the bare JID upon receipt of any presence change from the contact.
+ or a message is received from another resource. Now, messages are
+ sent to the bare JID upon receipt of any presence change from the
+ contact.
* Added support for the SCRAM-SHA-1 SASL mechanism. This is only
available when built without Cyrus SASL support.
* When getting info on a domain-only (server) JID, show uptime
- (when given by the result of the "last query") and don't show status as
- offline.
+ (when given by the result of the "last query") and don't show status
+ as offline.
* Fix getting info on your own JID.
- * Wrap XHTML messages in
, as described in XEP-0071, for compatibility
- with some clients.
+ * Wrap XHTML messages in
, as described in XEP-0071, for
+ compatibility with some clients.
* Don't do an SRV lookup for a STUN server associated with the account
if one is already set globally in prefs.
- * Don't send custom smileys larger than the recommended maximum object size
- specified in the BoB XEP. This prevents a client from being
+ * Don't send custom smileys larger than the recommended maximum object
+ size specified in the BoB XEP. This prevents a client from being
disconnected by servers that dislike overly-large stanzas.
- * Fix receiving messages without markup over an Openfire BOSH connection
- (forcibly put the stanzas in the jabber:client namespace).
+ * Fix receiving messages without markup over an Openfire BOSH
+ connection (forcibly put the stanzas in the jabber:client namespace).
* The default value for the file transfer proxies is automatically
updated when an account connects, if it is still the old (broken)
default (from 'proxy.jabber.org' to 'proxy.eu.jabber.org').
@@ -72,6 +93,8 @@
Mohta)
Pidgin:
+ * Fix CVE-2010-0423, a denial of service attack due to the parsing
+ of large numbers of smileys. (Discovered by Antti Hayrynen)
* Correctly size conversation and status box entries when the
interior-focus style property is diabled. (Gabriel Schulhof)
* Correctly handle a multiline text field being required in a
@@ -95,11 +118,14 @@
tooltips will show for all tabs.
* The File Transfers and Debug Window windows are no longer created as
dialogs. These windows should now have minimize buttons in many
- environments in which they were previously missing (including Windows).
+ environments in which they were previously missing
+ (including Windows).
* Smiley themes with Windows line endings no longer cause theme
descriptions not to be displayed in the theme selector.
Finch:
+ * Fix CVE-2010-0420, a possible remote crash when handling chat room
+ buddy names.
* Rebindable 'move-first' and 'move-last' actions for tree widgets. So
it is possible to jump to the first or last entry in the buddy list
(and other such lists) by pressing home or end key (defaults)
@@ -131,11 +157,11 @@
* Actually emit the hold signal for media calls.
* Fix building the GnuTLS plugin with older versions of GnuTLS.
* Fix DNS TXT query resolution.
- * Don't send Proxy-Authorization headers to HTTP proxy servers until we've
- received a "407 Proxy Authentication Required" response from the server.
- (thecrux)
- * Added "MXit" protocol plugin, supported and maintained by the MXit folks
- themselves (MXit Lifestyle (Pty) Ltd.)
+ * Don't send Proxy-Authorization headers to HTTP proxy servers until
+ we've received a "407 Proxy Authentication Required" response from
+ the server. (thecrux)
+ * Added "MXit" protocol plugin, supported and maintained by the MXit
+ folks themselves (MXit Lifestyle (Pty) Ltd.)
General:
* New 'plugins' sub-command to 'debug' command (i.e. '/debug plugins')
@@ -166,14 +192,14 @@
as it has probably been reset.
XMPP:
- * Users connecting to Google Talk now have an "Initiate Chat" context menu
- option for their buddies. (Eion Robb)
+ * Users connecting to Google Talk now have an "Initiate Chat" context
+ menu option for their buddies. (Eion Robb)
* Fix a crash when attempting to validate an invalid JID.
* Resolve an issue when connecting to iChat Server when no resource
is specified.
* Try to automatically find a STUN server by using an SRV lookup on the
- account's domain, and use that for voice and video if found and the user
- didn't set one manually in prefs.
+ account's domain, and use that for voice and video if found and the
+ user didn't set one manually in prefs.
* Fix a crash when adding a buddy without an '@'.
* Don't show the option to send a file to a buddy if we know for certain
they don't support any file transfer method supported by libpurple.
@@ -197,23 +223,23 @@
* The userlist in a multiuser chat can be styled via gtkrc by using the
widget name "pidgin_conv_userlist". (Heiko Schmitt)
* Add a hold button to the media window.
- * Fix a bug where the conversation backlog stops scrolling in a very busy
- chat room.
+ * Fix a bug where the conversation backlog stops scrolling in a very
+ busy chat room.
* In the Conversation "Send To" menu, offline buddies appear grayed
out (but are still selectable). Previously, only offline buddies on
accounts that do not support offline messaging appeared grayed out.
Pidgin Preference and Preference Window Changes:
* Removed the "Use font from theme" and "Conversation Font" preferences
- for everyone except Windows users. The font can be controlled from the
- Pidgin GTK+ Theme Control plugin.
+ for everyone except Windows users. The font can be controlled from
+ the Pidgin GTK+ Theme Control plugin.
* Tabs in the Preferences window are now on the left side.
* The Browser tab is now visible for GNOME users.
* Added a Proxy tab shown no matter what environment Pidgin runs in.
- * The Browser and Proxy tabs show appropriate GNOME-specific messages and
- allow launching the correct applications to change the relevant GNOME
- preferences if found. These were previously together on the Network
- tab.
+ * The Browser and Proxy tabs show appropriate GNOME-specific messages
+ and allow launching the correct applications to change the relevant
+ GNOME preferences if found. These were previously together on the
+ Network tab.
* Moved the port range spin buttons on the Network tab to be beside the
checkbox that enables/disables them.
* Reorganized preferences on the Status/Idle tab to have one less
@@ -223,10 +249,10 @@
* Moved Buddy List Theme and Status Icon Theme selectors from Interface
tab to Themes tab.
* Moved Sound Theme selector from Sounds tab to Themes tab.
- * Changed the Smiley Theme selector to be consistent with the other theme
- selectors.
- * Rearranged tabs such that Interface is first and all remaining tabs are
- alphabetized in English.
+ * Changed the Smiley Theme selector to be consistent with the other
+ theme selectors.
+ * Rearranged tabs such that Interface is first and all remaining tabs
+ are alphabetized in English.
version 2.6.3 (10/16/2009):
General:
@@ -266,16 +292,17 @@
properly. In addition, it is no longer possible to add buddies of
the form "room@conference.example.net/User", where
room@conference.example.net is a MUC.
- * Don't crash when receiving "smileyfied" XHTML-IM from clients that don't
- support bits of binary (ie. when getting an empty in return)
+ * Don't crash when receiving "smileyfied" XHTML-IM from clients that
+ don't support bits of binary (ie. when getting an empty in
+ return)
* Fix bug where SSL/TLS was not required even though the
"require SSL/TLS" preference checked when connecting to servers
that use the older iq-based authentication. (CVE-2009-3026)
Yahoo!/Yahoo! JAPAN:
- * Accounts now have "Use account proxy for SSL connections" option. This
- option force-overrides the account specific proxy settings for SSL
- connections only and instead uses the global proxy configuration.
+ * Accounts now have "Use account proxy for SSL connections" option.
+ This option force-overrides the account specific proxy settings for
+ SSL connections only and instead uses the global proxy configuration.
Finch:
* Properly detect libpanel on OpenBSD. (Brad Smith)
@@ -317,8 +344,8 @@
* Various memory leaks fixed as reported by Josh Mueller.
* Properly handle an IRC buddy appearing in multiple groups.
* Escape HTML entities in usernames when written with the HTML logger.
- * Do not display MySpace status changes as incoming IMs. (Mark Doliner and
- Justin Williams)
+ * Do not display MySpace status changes as incoming IMs. (Mark Doliner
+ and Justin Williams)
DNS:
* DNS servers are re-read when DNS queries fail in case the system has
@@ -329,32 +356,34 @@
address configured.
* Fix a leak when the UI provides its own DNS resolving UI op.
(Aman Gupta)
- * Don't fork a DNS resolver process to resolve IP addresses. (Aman Gupta)
- * Internationalized Domain Names are supported when libpurple is compiled
- against the GNU IDN library.
+ * Don't fork a DNS resolver process to resolve IP addresses.
+ (Aman Gupta)
+ * Internationalized Domain Names are supported when libpurple is
+ compiled against the GNU IDN library.
Environment Variables:
* GnuTLS logging (disabled by default) can be controlled through the
PURPLE_GNUTLS_DEBUG environment variable, which is an integer between
0 and 9 (higher is more verbose). Higher values may reveal sensitive
information.
- * PURPLE_VERBOSE_DEBUG environment variable. Currently, this is an "on" or
- "off" variable. Set it to any value to turn it on and unset it to turn
- it off. This will optionally be used to only show less useful debug
- information on an as-needed basis.
- * PURPLE_LEAKCHECK_HELP environment variable. Currently, this is an "on"
+ * PURPLE_VERBOSE_DEBUG environment variable. Currently, this is an "on"
or "off" variable. Set it to any value to turn it on and unset it to
- turn it off. This will be used to perform various actions that are
- useful when running libpurple inside of Valgrind or similar programs.
- Currently, it keeps plugins in memory, allowing Valgrind to perform
- symbol resolution of leak traces at shutdown.
+ turn it off. This will optionally be used to only show less useful
+ debug information on an as-needed basis.
+ * PURPLE_LEAKCHECK_HELP environment variable. Currently, this is an
+ "on" or "off" variable. Set it to any value to turn it on and unset
+ it to turn it off. This will be used to perform various actions
+ that are useful when running libpurple inside of Valgrind or similar
+ programs. Currently, it keeps plugins in memory, allowing Valgrind
+ to perform symbol resolution of leak traces at shutdown.
AIM and ICQ:
* Preliminary support for a new authentication scheme called
"clientLogin."
* Fixed a bug where your away message sometimes would not get set when
you first sign on.
- * Make sure links in your away messages show up as links to other people.
+ * Make sure links in your away messages show up as links to other
+ people.
* For ICQ, Never change the privacy setting specified by the user.
Gadu-Gadu:
@@ -373,15 +402,16 @@
Topper, and Elliott Sales de Andrade)
* Show the invite message for buddies that requested authorization
from you on MSN.
- * Support sending an invite message to buddies when requesting authorization
- from them on MSN.
+ * Support sending an invite message to buddies when requesting
+ authorization from them on MSN.
* Timeout switchboard connections aggressively (60 seconds).
XMPP:
- * Voice & Video support with Jingle (XEP-0166, 0167, 0176, & 0177), voice
- support with GTalk and voice and video support with the GMail web
- client. (Mike "Maiku" Ruprecht)
- * Added a Service Discovery Browser plugin for Pidgin. (Andrei Mozzhuhin)
+ * Voice & Video support with Jingle (XEP-0166, 0167, 0176, & 0177),
+ voice support with GTalk and voice and video support with the GMail
+ web client. (Mike "Maiku" Ruprecht)
+ * Added a Service Discovery Browser plugin for Pidgin.
+ (Andrei Mozzhuhin)
* Support for in-band bytestreams for file transfers (XEP-0047). (Marcus
Lundblad)
* Support for sending and receiving attentions (equivalent to "buzz"
@@ -398,28 +428,30 @@
* Better support for receiving remote users' nicknames.
* /affiliate and /role will now list the room members with the specified
affiliation/role if possible. (Andrei Mozzhuhin)
- * Put section breaks between resources in "Get Info" to improve readability.
- * Silently remove invalid XML 1.0 entities (e.g. ASCII control characters)
- from sent messages.
+ * Put section breaks between resources in "Get Info" to improve
+ readability.
+ * Silently remove invalid XML 1.0 entities (e.g. ASCII control
+ characters) from sent messages.
* XHTML markup is only included in outgoing messages when the message
contains formatting.
- * Show when the user was last logged in when doing "Get Info" on an offline
- buddy, provided the server supports it.
+ * Show when the user was last logged in when doing "Get Info" on an
+ offline buddy, provided the server supports it.
* Support custom smileys in MUCs (only when all participants support the
- "Bits of Binary" extension, and a maximum of 10 participants are in the
- chat to avoid getting too many fetch requests).
+ "Bits of Binary" extension, and a maximum of 10 participants are in
+ the chat to avoid getting too many fetch requests).
* Fix an issue with Jabber (pre-XMPP) servers and the user's preference
to require SSL not being respected.
* Fix an issue where Cyrus SASL DIGEST MD5 authentication might fail if
the username, password, or realm (the JID domain) contain non-ASCII
characters.
- * Show emblem for mobile, handheld, and web clients and bots (if the other
- client supports it).
- * Google Talk mail notifications should now work for people for whom they
- inexplicably did not. (Thanks to yukam for determining the reason)
+ * Show emblem for mobile, handheld, and web clients and bots (if the
+ other client supports it).
+ * Google Talk mail notifications should now work for people for whom
+ they inexplicably did not. (Thanks to yukam for determining the
+ reason)
* New XMPP and Google Talk accounts require SSL by default.
- * Display kicks (and the reasons given) in chat rooms when an occupant is
- kicked.
+ * Display kicks (and the reasons given) in chat rooms when an occupant
+ is kicked.
* Fix issues with case-sensitivity of XMPP roster and case-insensitive
Purple groups.
* For contacts who advertise Entity Capabilities, only send rich text
diff -r cc6d733a192a -r c5a7516418c7 ChangeLog.API
--- a/ChangeLog.API Tue Feb 16 15:58:34 2010 +0000
+++ b/ChangeLog.API Thu Feb 18 16:59:04 2010 +0000
@@ -1,6 +1,37 @@
Pidgin and Finch: The Pimpin' Penguin IM Clients That're Good for the Soul
-version 2.6.6 (??/??/2010):
+version 2.7.0 (??/??/????):
+ libpurple:
+ Added:
+ * purple_account_get_name_for_display
+ * purple_buddy_get_media_caps
+ * purple_buddy_set_media_caps
+ * purple_contact_get_group
+ * purple_media_candidate_copy
+ * purple_media_codec_copy
+ * purple_media_manager_get_backend_type
+ * purple_media_manager_set_backend_type
+ * purple_network_get_all_local_system_ips, which returns all local
+ IPs on the system. On systems with the getifaddrs() function,
+ this will return both IPv4 and IPv6 addresses (excluding link-local
+ and loopback addresses). On others, it returns just IPv4 addresses.
+ * purple_prpl_got_media_caps
+ * purple_unescape_text
+ * purple_uuid_random
+ * media_caps to the PurpleBuddy struct
+ * buddy-caps-changed blist signal
+ * ui-caps-changed media manager signal
+ * sent-attention conversation signal
+ * got-attention conversation signal
+
+ Pidgin:
+ Added:
+ * pidgin_dialogs_buildinfo (should not be used by anything but Pidgin)
+ * pidgin_dialogs_developers (should not be used by anything but Pidgin)
+ * pidgin_dialogs_translators (should not be used by anything but Pidgin)
+ * gtk_imhtmltoolbar_switch_active_conversation
+
+version 2.6.6 (02/18/2010):
libpurple:
Changed:
* purple_xfer_cancel_local is now called instead of
diff -r cc6d733a192a -r c5a7516418c7 ChangeLog.win32
--- a/ChangeLog.win32 Tue Feb 16 15:58:34 2010 +0000
+++ b/ChangeLog.win32 Thu Feb 18 16:59:04 2010 +0000
@@ -1,5 +1,11 @@
+version 2.7.0 (??/??/????):
+ * Minimum required GTK+ version increased to 2.14.0
+ * Private GTK+ Runtime now used (GTK+ Installer no longer supported)
+ * Win9x no longer supported.
+ * Crash Report files (pidgin.RPT) are now generated in the ~/.purple
+ directory instead of the installation directory.
-version 2.6.6 (??/??/2010):
+version 2.6.6 (02/18/2010):
* Installer translations for: Norwegian nynorsk
version 2.6.5 (01/08/2010):
diff -r cc6d733a192a -r c5a7516418c7 Makefile.mingw
--- a/Makefile.mingw Tue Feb 16 15:58:34 2010 +0000
+++ b/Makefile.mingw Thu Feb 18 16:59:04 2010 +0000
@@ -37,6 +37,7 @@
)
STRIPPED_RELEASE_DIR = $(PIDGIN_TREE_TOP)/pidgin-$(PIDGIN_VERSION)-win32bin
+DEBUG_SYMBOLS_DIR = $(PIDGIN_TREE_TOP)/pidgin-$(PIDGIN_VERSION)-dbgsym
# Any *.dll or *.exe files included in win32-install-dir that we don't compile
@@ -71,7 +72,7 @@
#build an expression for `find` to use to ignore the above files
EXTERNAL_DLLS_FIND_EXP = $(patsubst %,-o -name %,$(EXTERNAL_DLLS))
-.PHONY: all docs install installer installer_nogtk installer_debug installers clean uninstall create_release_install_dir
+.PHONY: all docs install installer installer_offline installer_zip debug_symbols_zip installers clean uninstall create_release_install_dir generate_translations_installer_include $(PIDGIN_REVISION_H) $(PIDGIN_REVISION_RAW_TXT)
all: $(PIDGIN_CONFIG_H) $(PIDGIN_REVISION_H)
$(MAKE) -C $(PURPLE_TOP) -f $(MINGW_MAKEFILE)
@@ -89,29 +90,41 @@
$(MAKE) -C share/ca-certs -f $(MINGW_MAKEFILE) install
$(MAKE) -C share/sounds -f $(MINGW_MAKEFILE) install
+generate_translations_installer_include: create_release_install_dir
+ rm -f pidgin/win32/nsis/pidgin-translations.nsh
+ find $(STRIPPED_RELEASE_DIR)/locale -maxdepth 1 -mindepth 1 \
+ -exec basename {} ';' \
+ | sed -e s/^/\!insertmacro\ LANG_SECTION\ \"/ -e s/$$/\"/ \
+ > pidgin/win32/nsis/pidgin-translations.nsh
+
create_release_install_dir: install
rm -rf $(STRIPPED_RELEASE_DIR)
cp -R $(PIDGIN_INSTALL_DIR) $(STRIPPED_RELEASE_DIR)
find $(STRIPPED_RELEASE_DIR) \( -name '*.dll' -o -name '*.exe' \) \
- -not \( -false $(EXTERNAL_DLLS_FIND_EXP) \) -exec $(STRIP) --strip-unneeded {} ';'
+ -not \( -false $(EXTERNAL_DLLS_FIND_EXP) \) \
+ -exec $(STRIP) --strip-unneeded {} ';'
-installer: create_release_install_dir
- $(MAKENSIS) $(MAKENSISOPT)V3 $(MAKENSISOPT)DPIDGIN_VERSION="$(PIDGIN_VERSION)" $(MAKENSISOPT)DPIDGIN_PRODUCT_VERSION="$(PIDGIN_PRODUCT_VERSION)" $(MAKENSISOPT)DWITH_GTK $(MAKENSISOPT)DPIDGIN_INSTALL_DIR="$(STRIPPED_RELEASE_DIR)" $(MAKENSISOPT)DGTK_INSTALL_VERSION="$(GTK_INSTALL_VERSION)" pidgin/win32/nsis/pidgin-installer.nsi
+installer: create_release_install_dir generate_translations_installer_include
+ $(MAKENSIS) $(MAKENSISOPT)V3 $(MAKENSISOPT)DPIDGIN_VERSION="$(PIDGIN_VERSION)" $(MAKENSISOPT)DPIDGIN_PRODUCT_VERSION="$(PIDGIN_PRODUCT_VERSION)" $(MAKENSISOPT)DPIDGIN_INSTALL_DIR="$(STRIPPED_RELEASE_DIR)" $(MAKENSISOPT)DGTK_INSTALL_VERSION="$(GTK_INSTALL_VERSION)" pidgin/win32/nsis/pidgin-installer.nsi
mv pidgin/win32/nsis/pidgin-$(PIDGIN_VERSION).exe ./
-installer_nogtk: create_release_install_dir
- $(MAKENSIS) $(MAKENSISOPT)V3 $(MAKENSISOPT)DPIDGIN_VERSION="$(PIDGIN_VERSION)" $(MAKENSISOPT)DPIDGIN_PRODUCT_VERSION="$(PIDGIN_PRODUCT_VERSION)" $(MAKENSISOPT)DPIDGIN_INSTALL_DIR="$(STRIPPED_RELEASE_DIR)" $(MAKENSISOPT)DGTK_INSTALL_VERSION="$(GTK_INSTALL_VERSION)" pidgin/win32/nsis/pidgin-installer.nsi
- mv pidgin/win32/nsis/pidgin-$(PIDGIN_VERSION)-no-gtk.exe ./
-
-installer_debug: install
- $(MAKENSIS) $(MAKENSISOPT)V3 $(MAKENSISOPT)DPIDGIN_VERSION="$(PIDGIN_VERSION)" $(MAKENSISOPT)DPIDGIN_PRODUCT_VERSION="$(PIDGIN_PRODUCT_VERSION)" $(MAKENSISOPT)DPIDGIN_INSTALL_DIR="$(PIDGIN_INSTALL_DIR)" $(MAKENSISOPT)DDEBUG $(MAKENSISOPT)DGTK_INSTALL_VERSION="$(GTK_INSTALL_VERSION)" pidgin/win32/nsis/pidgin-installer.nsi
- mv pidgin/win32/nsis/pidgin-$(PIDGIN_VERSION)-debug.exe ./
+installer_offline: create_release_install_dir generate_translations_installer_include debug_symbols_zip
+ $(MAKENSIS) $(MAKENSISOPT)V3 $(MAKENSISOPT)DPIDGIN_VERSION="$(PIDGIN_VERSION)" $(MAKENSISOPT)DPIDGIN_PRODUCT_VERSION="$(PIDGIN_PRODUCT_VERSION)" $(MAKENSISOPT)DOFFLINE_INSTALLER $(MAKENSISOPT)DPIDGIN_INSTALL_DIR="$(STRIPPED_RELEASE_DIR)" $(MAKENSISOPT)DGTK_INSTALL_VERSION="$(GTK_INSTALL_VERSION)" pidgin/win32/nsis/pidgin-installer.nsi
+ mv pidgin/win32/nsis/pidgin-$(PIDGIN_VERSION)-offline.exe ./
installer_zip: create_release_install_dir
rm -f pidgin-$(PIDGIN_VERSION)-win32-bin.zip
zip -9 -r pidgin-$(PIDGIN_VERSION)-win32-bin.zip $(STRIPPED_RELEASE_DIR)
-installers: installer installer_nogtk installer_debug installer_zip
+debug_symbols_zip: install
+ rm -rf $(DEBUG_SYMBOLS_DIR) $(DEBUG_SYMBOLS_DIR).zip
+ mkdir $(DEBUG_SYMBOLS_DIR)
+ tar -cf - `find $(PIDGIN_INSTALL_DIR) \( -name '*.dll' -o -name '*.exe' \) \
+ -not \( -false $(EXTERNAL_DLLS_FIND_EXP) \) -print` \
+ | tar --strip 2 --xform s/$$/.dbgsym/ -xC $(DEBUG_SYMBOLS_DIR) -f -
+ zip -9 -r $(DEBUG_SYMBOLS_DIR).zip $(DEBUG_SYMBOLS_DIR)
+
+installers: installer installer_offline debug_symbols_zip installer_zip
Doxyfile.mingw: Doxyfile.in
sed -e "s/@PACKAGE@/pidgin/" -e "s/@VERSION@/$(PIDGIN_VERSION)/" -e "s/@top_srcdir@/$(PIDGIN_TREE_TOP)/g" -e "s/@enable_dot@/NO/" Doxyfile.in > Doxyfile.mingw
@@ -125,13 +138,12 @@
$(MAKE) -C $(PIDGIN_TOP) -f $(MINGW_MAKEFILE) clean
$(MAKE) -C $(PURPLE_TOP) -f $(MINGW_MAKEFILE) clean
$(MAKE) -C share/ca-certs -f $(MINGW_MAKEFILE) clean
- rm -f $(PIDGIN_CONFIG_H) $(PIDGIN_REVISION_H) $(PIDGIN_REVISION_RAW_TXT) ./VERSION pidgin-$(PIDGIN_VERSION)*.exe pidgin-$(PIDGIN_VERSION)-win32-bin.zip
+ rm -f $(PIDGIN_CONFIG_H) $(PIDGIN_REVISION_H) $(PIDGIN_REVISION_RAW_TXT) ./VERSION pidgin-$(PIDGIN_VERSION)*.exe pidgin-$(PIDGIN_VERSION)-win32-bin.zip $(DEBUG_SYMBOLS_DIR).zip
rm -rf doc/html Doxyfile.mingw
uninstall:
- rm -rf $(PURPLE_INSTALL_PERL_DIR) $(PIDGIN_INSTALL_PLUGINS_DIR) $(PURPLE_INSTALL_PO_DIR) $(PIDGIN_INSTALL_DIR) $(STRIPPED_RELEASE_DIR)
+ rm -rf $(PURPLE_INSTALL_PERL_DIR) $(PIDGIN_INSTALL_PLUGINS_DIR) $(PURPLE_INSTALL_PO_DIR) $(PIDGIN_INSTALL_DIR) $(STRIPPED_RELEASE_DIR) $(DEBUG_SYMBOLS_DIR)
rm -f ./VERSION
include $(PIDGIN_COMMON_TARGETS)
-.PHONY: $(PIDGIN_REVISION_H) $(PIDGIN_REVISION_RAW_TXT)
diff -r cc6d733a192a -r c5a7516418c7 NEWS
--- a/NEWS Tue Feb 16 15:58:34 2010 +0000
+++ b/NEWS Thu Feb 18 16:59:04 2010 +0000
@@ -2,7 +2,9 @@
Our development blog is available at: http://planet.pidgin.im
-2.6.6 (??/??/2010):
+2.6.6 (02/18/2010):
+ Mark: This release includes some great little changes and fixes a few
+ security-related bugs. See the ChangeLog for details.
2.6.5 (01/08/2010):
Paul: This release fixes a pretty serious bug in the MSN code, so we're
diff -r cc6d733a192a -r c5a7516418c7 configure.ac
--- a/configure.ac Tue Feb 16 15:58:34 2010 +0000
+++ b/configure.ac Thu Feb 18 16:59:04 2010 +0000
@@ -43,19 +43,19 @@
#
# Make sure to update finch/libgnt/configure.ac with libgnt version changes.
#
-m4_define([purple_lt_current], [6])
+m4_define([purple_lt_current], [7])
m4_define([purple_major_version], [2])
-m4_define([purple_minor_version], [6])
-m4_define([purple_micro_version], [6])
+m4_define([purple_minor_version], [7])
+m4_define([purple_micro_version], [0])
m4_define([purple_version_suffix], [devel])
m4_define([purple_version],
[purple_major_version.purple_minor_version.purple_micro_version])
m4_define([purple_display_version], purple_version[]m4_ifdef([purple_version_suffix],[purple_version_suffix]))
-m4_define([gnt_lt_current], [6])
+m4_define([gnt_lt_current], [7])
m4_define([gnt_major_version], [2])
-m4_define([gnt_minor_version], [6])
-m4_define([gnt_micro_version], [6])
+m4_define([gnt_minor_version], [7])
+m4_define([gnt_micro_version], [0])
m4_define([gnt_version_suffix], [devel])
m4_define([gnt_version],
[gnt_major_version.gnt_minor_version.gnt_micro_version])
@@ -211,6 +211,7 @@
[AC_CHECK_LIB(socket, getaddrinfo,
[AC_DEFINE([HAVE_GETADDRINFO]) LIBS="-lsocket -lsnl $LIBS"], , , -lnsl)])
AC_CHECK_FUNCS(inet_ntop)
+AC_CHECK_FUNCS(getifaddrs)
dnl Check for socklen_t (in Unix98)
AC_MSG_CHECKING(for socklen_t)
AC_TRY_COMPILE([
@@ -310,13 +311,13 @@
)
dnl #######################################################################
-dnl # Check for GLib 2.0 (required)
+dnl # Check for GLib 2.12 (required)
dnl #######################################################################
-PKG_CHECK_MODULES(GLIB, [glib-2.0 >= 2.4.0 gobject-2.0 gmodule-2.0 gthread-2.0], , [
+PKG_CHECK_MODULES(GLIB, [glib-2.0 >= 2.12.0 gobject-2.0 gmodule-2.0 gthread-2.0], , [
AC_MSG_RESULT(no)
AC_MSG_ERROR([
-You must have GLib 2.4.0 or newer development headers installed to build.
+You must have GLib 2.12.0 or newer development headers installed to build.
If you have these installed already you may need to install pkg-config so
I can find them.
@@ -352,7 +353,7 @@
[enable_consoleui=$enableval force_finch=$enableval], [enable_consoleui=yes force_finch=no])
dnl #######################################################################
-dnl # Check for GTK+ 2.0 and other things used by the GTK UI
+dnl # Check for GTK+ 2.10 and other things used by the GTK UI
dnl #######################################################################
AC_ARG_ENABLE(screensaver,
[AC_HELP_STRING([--disable-screensaver],
@@ -399,11 +400,11 @@
fi
if test "x$enable_gtkui" = "xyes" ; then
- PKG_CHECK_MODULES(GTK, [gtk+-2.0 >= 2.4.0], , [
+ PKG_CHECK_MODULES(GTK, [gtk+-2.0 >= 2.10.0], , [
AC_MSG_RESULT(no)
AC_MSG_ERROR([
-You must have GTK+ 2.4.0 or newer development headers installed to compile
+You must have GTK+ 2.10.0 or newer development headers installed to compile
Pidgin. If you want to build only Finch then specify --disable-gtkui when
running configure.
])])
@@ -2491,6 +2492,8 @@
pidgin/Makefile
pidgin/pidgin.pc
pidgin/pidgin-uninstalled.pc
+ pidgin/pidgin-2.pc
+ pidgin/pidgin-2-uninstalled.pc
pidgin/pixmaps/Makefile
pidgin/pixmaps/emotes/default/24/Makefile
pidgin/pixmaps/emotes/none/Makefile
@@ -2508,6 +2511,8 @@
libpurple/gconf/Makefile
libpurple/purple.pc
libpurple/purple-uninstalled.pc
+ libpurple/purple-2.pc
+ libpurple/purple-2-uninstalled.pc
libpurple/plugins/Makefile
libpurple/plugins/mono/Makefile
libpurple/plugins/mono/api/Makefile
diff -r cc6d733a192a -r c5a7516418c7 finch/finch.c
--- a/finch/finch.c Tue Feb 16 15:58:34 2010 +0000
+++ b/finch/finch.c Thu Feb 18 16:59:04 2010 +0000
@@ -431,9 +431,7 @@
g_thread_init(NULL);
g_set_prgname("Finch");
-#if GLIB_CHECK_VERSION(2,2,0)
g_set_application_name(_("Finch"));
-#endif
if (gnt_start(&argc, &argv)) {
gnt_main();
diff -r cc6d733a192a -r c5a7516418c7 finch/gntconv.c
--- a/finch/gntconv.c Tue Feb 16 15:58:34 2010 +0000
+++ b/finch/gntconv.c Thu Feb 18 16:59:04 2010 +0000
@@ -1318,7 +1318,6 @@
return PURPLE_CMD_RET_OK;
}
-#if GLIB_CHECK_VERSION(2,6,0)
static PurpleCmdRet
cmd_message_color(PurpleConversation *conv, const char *cmd, char **args, char **error, gpointer data)
{
@@ -1359,7 +1358,6 @@
return PURPLE_CMD_RET_OK;
}
-#endif
static PurpleCmdRet
users_command_cb(PurpleConversation *conv, const char *cmd, char **args, char **error, gpointer data)
@@ -1445,7 +1443,6 @@
PURPLE_CMD_FLAG_CHAT | PURPLE_CMD_FLAG_IM, NULL,
cmd_show_window, _("statuses: Show the savedstatuses window."), finch_savedstatus_show_all);
-#if GLIB_CHECK_VERSION(2,6,0)
/* Allow customizing the message colors using a command during run-time */
purple_cmd_register("msgcolor", "www", PURPLE_CMD_P_DEFAULT,
PURPLE_CMD_FLAG_CHAT | PURPLE_CMD_FLAG_IM, NULL,
@@ -1455,7 +1452,6 @@
" <foreground/background>: black, red, green, blue, white, gray, darkgray, magenta, cyan, default
", PIDGIN_NAME, DISPLAY_VERSION,
+ purple_core_get_version(), REVISION);
+
+ g_string_append_printf(str,
+ _("%s is a messaging client based on libpurple which is capable of "
+ "connecting to multiple messaging services at once. %s is written "
+ "in C using GTK+. %s is released, and may be modified and "
+ "redistributed, under the terms of the GPL version 2 (or later). "
+ "A copy of the GPL is distributed with %s. %s is copyrighted by "
+ "its contributors, a list of whom is also distributed with %s. "
+ "There is no warranty for %s.
"), PURPLE_WEBSITE,
+ "http://developer.pidgin.im/wiki/FAQ");
g_string_append_printf(str,
- _("%s is a graphical modular messaging client based on "
- "libpurple which is capable of connecting to "
- "AIM, MSN, Yahoo!, XMPP, ICQ, IRC, SILC, SIP/SIMPLE, "
- "Novell GroupWise, Lotus Sametime, Bonjour, Zephyr, "
- "MySpaceIM, Gadu-Gadu, and QQ all at once. "
- "It is written using GTK+.
"
- "You may modify and redistribute the program under "
- "the terms of the GPL (version 2 or later). A copy of the GPL is "
- "contained in the 'COPYING' file distributed with %s. "
- "%s is copyrighted by its contributors. See the 'COPYRIGHT' "
- "file for the complete list of contributors. We provide no "
- "warranty for this program.
"), PIDGIN_NAME, PIDGIN_NAME, PIDGIN_NAME);
+ _("Help from other Pidgin users is "
+ "available by e-mailing support@pidgin.im "
+ "This is a public mailing list! "
+ "(archive) "
+ "We can't help with third-party protocols or plugins! "
+ "This list's primary language is English. You are "
+ "welcome to post in another language, but the responses may "
+ "be less helpful. "));
- g_string_append(str, "URL: " PURPLE_WEBSITE "
"));
- g_string_append_printf(str,
- _("Help from other Pidgin users: "
- "support@pidgin.im "
- "This is a public mailing list! "
- "(archive) "
- "We can't help with 3rd party protocols or plugins! "
- "This list's primary language is English. You are "
- "welcome to post in another language, but the responses may "
- "be less helpful.
"));
- g_string_append_printf(str, _("IRC Channel: "
- "#pidgin on irc.freenode.net
", PIDGIN_NAME, DISPLAY_VERSION, purple_core_get_version(), REVISION);
- g_string_append_printf(str, "%s ", _("Debugging Information"));
+ g_string_append_printf(str, "%s ", _("Build Information"));
/* The following primarly intented for user/developer interaction and thus
ought not be translated */
@@ -704,31 +699,82 @@
/* End of not to be translated section */
- gtk_imhtml_append_text(GTK_IMHTML(text), str->str, GTK_IMHTML_NO_SCROLL);
- g_string_free(str, TRUE);
+ tmp = g_strdup_printf(_("%s Build Information"), PIDGIN_NAME);
+ buildinfo = pidgin_build_help_dialog(tmp, "buildinfo", str);
+ g_signal_connect(G_OBJECT(buildinfo), "destroy", G_CALLBACK(gtk_widget_destroyed), &buildinfo);
+ g_free(tmp);
+}
- gtk_text_buffer_get_start_iter(gtk_text_view_get_buffer(GTK_TEXT_VIEW(text)), &iter);
- gtk_text_buffer_place_cursor(gtk_text_view_get_buffer(GTK_TEXT_VIEW(text)), &iter);
+void pidgin_dialogs_developers(void)
+{
+ GString *str;
+ char *tmp;
+ static GtkWidget *developer_info = NULL;
+
+ if (developer_info != NULL) {
+ gtk_window_present(GTK_WINDOW(developer_info));
+ return;
+ }
- /* Close Button */
- button = pidgin_dialog_add_button(GTK_DIALOG(about), GTK_STOCK_CLOSE,
- G_CALLBACK(destroy_about), about);
+ str = g_string_sized_new(4096);
+
+ /* Current Developers */
+ g_string_append_printf(str, "%s: ",
+ _("Current Developers"));
+ add_developers(str, developers);
+ g_string_append(str, " ");
- g_signal_connect(G_OBJECT(about), "destroy",
- G_CALLBACK(destroy_about), G_OBJECT(about));
+ /* Crazy Patch Writers */
+ g_string_append_printf(str, "%s: ",
+ _("Crazy Patch Writers"));
+ add_developers(str, patch_writers);
+ g_string_append(str, " ");
+
+ /* Retired Developers */
+ g_string_append_printf(str, "%s: ",
+ _("Retired Developers"));
+ add_developers(str, retired_developers);
+ g_string_append(str, " ");
- /* this makes the sizes not work? */
- GTK_WIDGET_SET_FLAGS(button, GTK_CAN_DEFAULT);
- gtk_widget_grab_default(button);
+ /* Retired Crazy Patch Writers */
+ g_string_append_printf(str, "%s: ",
+ _("Retired Crazy Patch Writers"));
+ add_developers(str, retired_patch_writers);
+
+ tmp = g_strdup_printf(_("%s Developer Information"), PIDGIN_NAME);
+ developer_info = pidgin_build_help_dialog(tmp, "developer_info", str);
+ g_signal_connect(G_OBJECT(developer_info), "destroy", G_CALLBACK(gtk_widget_destroyed), &developer_info);
+ g_free(tmp);
+}
+
+void pidgin_dialogs_translators(void)
+{
+ GString *str;
+ char *tmp;
+ static GtkWidget *translator_info = NULL;
- /* Let's give'em something to talk about -- woah woah woah */
- buddylist = pidgin_blist_get_default_gtk_blist();
- if (buddylist)
- gtk_window_set_transient_for(GTK_WINDOW(about),
- GTK_WINDOW(buddylist->window));
+ if (translator_info != NULL) {
+ gtk_window_present(GTK_WINDOW(translator_info));
+ return;
+ }
+
+ str = g_string_sized_new(4096);
- gtk_widget_show_all(about);
- gtk_window_present(GTK_WINDOW(about));
+ /* Current Translators */
+ g_string_append_printf(str, "%s: ",
+ _("Current Translators"));
+ add_translators(str, translators);
+ g_string_append(str, " ");
+
+ /* Past Translators */
+ g_string_append_printf(str, "%s: ",
+ _("Past Translators"));
+ add_translators(str, past_translators);
+
+ tmp = g_strdup_printf(_("%s Translator Information"), PIDGIN_NAME);
+ translator_info = pidgin_build_help_dialog(tmp, "translator_info", str);
+ g_signal_connect(G_OBJECT(translator_info), "destroy", G_CALLBACK(gtk_widget_destroyed), &translator_info);
+ g_free(tmp);
}
static void
diff -r cc6d733a192a -r c5a7516418c7 pidgin/gtkdialogs.h
--- a/pidgin/gtkdialogs.h Tue Feb 16 15:58:34 2010 +0000
+++ b/pidgin/gtkdialogs.h Thu Feb 18 16:59:04 2010 +0000
@@ -33,6 +33,9 @@
/* Functions in gtkdialogs.c (these should actually stay in this file) */
void pidgin_dialogs_destroy_all(void);
void pidgin_dialogs_about(void);
+void pidgin_dialogs_buildinfo(void);
+void pidgin_dialogs_developers(void);
+void pidgin_dialogs_translators(void);
void pidgin_dialogs_im(void);
void pidgin_dialogs_im_with_user(PurpleAccount *, const char *);
void pidgin_dialogs_info(void);
diff -r cc6d733a192a -r c5a7516418c7 pidgin/gtkdocklet-gtk.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/pidgin/gtkdocklet-gtk.c Thu Feb 18 16:59:04 2010 +0000
@@ -0,0 +1,160 @@
+/*
+ * System tray icon (aka docklet) plugin for Purple
+ *
+ * Copyright (C) 2007 Anders Hasselqvist
+ *
+ * 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.
+ */
+
+#include "internal.h"
+#include "pidgin.h"
+#include "debug.h"
+#include "prefs.h"
+#include "pidginstock.h"
+#include "gtkdocklet.h"
+
+#if GTK_CHECK_VERSION(2,10,0)
+
+/* globals */
+GtkStatusIcon *docklet = NULL;
+
+static void
+docklet_gtk_status_activated_cb(GtkStatusIcon *status_icon, gpointer user_data)
+{
+ pidgin_docklet_clicked(1);
+}
+
+static void
+docklet_gtk_status_clicked_cb(GtkStatusIcon *status_icon, guint button, guint activate_time, gpointer user_data)
+{
+ pidgin_docklet_clicked(button);
+}
+
+static void
+docklet_gtk_status_update_icon(PurpleStatusPrimitive status, gboolean connecting, gboolean pending)
+{
+ const gchar *icon_name = NULL;
+
+ switch (status) {
+ case PURPLE_STATUS_OFFLINE:
+ icon_name = PIDGIN_STOCK_TRAY_OFFLINE;
+ break;
+ case PURPLE_STATUS_AWAY:
+ icon_name = PIDGIN_STOCK_TRAY_AWAY;
+ break;
+ case PURPLE_STATUS_UNAVAILABLE:
+ icon_name = PIDGIN_STOCK_TRAY_BUSY;
+ break;
+ case PURPLE_STATUS_EXTENDED_AWAY:
+ icon_name = PIDGIN_STOCK_TRAY_XA;
+ break;
+ case PURPLE_STATUS_INVISIBLE:
+ icon_name = PIDGIN_STOCK_TRAY_INVISIBLE;
+ break;
+ default:
+ icon_name = PIDGIN_STOCK_TRAY_AVAILABLE;
+ break;
+ }
+
+ if (pending)
+ icon_name = PIDGIN_STOCK_TRAY_PENDING;
+ if (connecting)
+ icon_name = PIDGIN_STOCK_TRAY_CONNECT;
+
+ if (icon_name) {
+ gtk_status_icon_set_from_icon_name(docklet, icon_name);
+ }
+}
+
+static void
+docklet_gtk_status_set_tooltip(gchar *tooltip)
+{
+ if (tooltip) {
+ gtk_status_icon_set_tooltip(docklet, tooltip);
+ } else {
+ gtk_status_icon_set_tooltip(docklet, NULL);
+ }
+}
+
+static void
+docklet_gtk_status_position_menu(GtkMenu *menu,
+ int *x, int *y, gboolean *push_in,
+ gpointer user_data)
+{
+ gtk_status_icon_position_menu(menu, x, y, push_in, docklet);
+}
+
+static void
+docklet_gtk_status_destroy(void)
+{
+ g_return_if_fail(docklet != NULL);
+
+ pidgin_docklet_remove();
+
+ g_object_unref(G_OBJECT(docklet));
+ docklet = NULL;
+
+ purple_debug_info("docklet", "GTK+ destroyed\n");
+}
+
+static void
+docklet_gtk_status_create(gboolean recreate)
+{
+ if (docklet) {
+ /* if this is being called when a tray icon exists, it's because
+ something messed up. try destroying it before we proceed,
+ although docklet_refcount may be all hosed. hopefully won't happen. */
+ purple_debug_warning("docklet", "trying to create icon but it already exists?\n");
+ docklet_gtk_status_destroy();
+ }
+
+ docklet = gtk_status_icon_new();
+ g_return_if_fail(docklet != NULL);
+
+ g_signal_connect(G_OBJECT(docklet), "activate", G_CALLBACK(docklet_gtk_status_activated_cb), NULL);
+ g_signal_connect(G_OBJECT(docklet), "popup-menu", G_CALLBACK(docklet_gtk_status_clicked_cb), NULL);
+
+ pidgin_docklet_embedded();
+ gtk_status_icon_set_visible(docklet, TRUE);
+ purple_debug_info("docklet", "GTK+ created\n");
+}
+
+static void
+docklet_gtk_status_create_ui_op(void)
+{
+ docklet_gtk_status_create(FALSE);
+}
+
+static struct docklet_ui_ops ui_ops =
+{
+ docklet_gtk_status_create_ui_op,
+ docklet_gtk_status_destroy,
+ docklet_gtk_status_update_icon,
+ NULL,
+ docklet_gtk_status_set_tooltip,
+ docklet_gtk_status_position_menu
+};
+
+void
+docklet_ui_init(void)
+{
+ pidgin_docklet_set_ui_ops(&ui_ops);
+ gtk_icon_theme_append_search_path(gtk_icon_theme_get_default(),
+ DATADIR G_DIR_SEPARATOR_S "pixmaps" G_DIR_SEPARATOR_S "pidgin" G_DIR_SEPARATOR_S "tray");
+}
+
+#endif /* GTK_CHECK_VERSION(2,10,0) */
+
diff -r cc6d733a192a -r c5a7516418c7 pidgin/gtkdocklet-x11.c
--- a/pidgin/gtkdocklet-x11.c Tue Feb 16 15:58:34 2010 +0000
+++ b/pidgin/gtkdocklet-x11.c Thu Feb 18 16:59:04 2010 +0000
@@ -34,6 +34,8 @@
#include "gtkdocklet.h"
#include
+#if !GTK_CHECK_VERSION(2,10,0)
+
#define SHORT_EMBED_TIMEOUT 5000
#define LONG_EMBED_TIMEOUT 15000
@@ -59,7 +61,7 @@
static void
docklet_x11_embedded_cb(GtkWidget *widget, void *data)
{
- purple_debug(PURPLE_DEBUG_INFO, "docklet", "embedded\n");
+ purple_debug(PURPLE_DEBUG_INFO, "docklet", "X11 embedded\n");
g_source_remove(embed_timeout);
embed_timeout = 0;
@@ -70,7 +72,7 @@
static void
docklet_x11_destroyed_cb(GtkWidget *widget, void *data)
{
- purple_debug(PURPLE_DEBUG_INFO, "docklet", "destroyed\n");
+ purple_debug(PURPLE_DEBUG_INFO, "docklet", "X11 destroyed\n");
pidgin_docklet_remove();
@@ -205,7 +207,6 @@
}
}
-#if GTK_CHECK_VERSION(2,2,0)
static void
docklet_x11_position_menu(GtkMenu *menu, int *x, int *y, gboolean *push_in,
gpointer user_data)
@@ -230,7 +231,6 @@
*push_in = TRUE;
}
-#endif
static void
docklet_x11_destroy(void)
@@ -254,7 +254,7 @@
image = NULL;
- purple_debug(PURPLE_DEBUG_INFO, "docklet", "destroyed\n");
+ purple_debug(PURPLE_DEBUG_INFO, "docklet", "X11 destroyed\n");
}
static gboolean
@@ -265,7 +265,7 @@
* loaded so that it can embed automatically if/when a notification
* area becomes available.
*/
- purple_debug_info("docklet", "failed to embed within timeout\n");
+ purple_debug_info("docklet", "X11 failed to embed within timeout\n");
pidgin_docklet_remove();
return FALSE;
@@ -328,7 +328,7 @@
}
}
- purple_debug(PURPLE_DEBUG_INFO, "docklet", "created\n");
+ purple_debug(PURPLE_DEBUG_INFO, "docklet", "X11 created\n");
}
static void
@@ -344,11 +344,7 @@
docklet_x11_update_icon,
docklet_x11_blank_icon,
docklet_x11_set_tooltip,
-#if GTK_CHECK_VERSION(2,2,0)
docklet_x11_position_menu
-#else
- NULL
-#endif
};
void
@@ -358,3 +354,6 @@
purple_prefs_add_none(PIDGIN_PREFS_ROOT "/docklet/x11");
purple_prefs_add_bool(PIDGIN_PREFS_ROOT "/docklet/x11/embedded", FALSE);
}
+
+#endif /* !GTK_CHECK_VERSION(2,10,0) */
+
diff -r cc6d733a192a -r c5a7516418c7 pidgin/gtkdocklet.h
--- a/pidgin/gtkdocklet.h Tue Feb 16 15:58:34 2010 +0000
+++ b/pidgin/gtkdocklet.h Thu Feb 18 16:59:04 2010 +0000
@@ -49,7 +49,7 @@
void pidgin_docklet_uninit(void);
void*pidgin_docklet_get_handle(void);
-/* function in gtkdocklet-{x11,win32}.c */
+/* function in gtkdocklet-{gtk,x11,win32}.c */
void docklet_ui_init(void);
#endif /* _GTKDOCKLET_H_ */
diff -r cc6d733a192a -r c5a7516418c7 pidgin/gtkexpander.c
--- a/pidgin/gtkexpander.c Tue Feb 16 15:58:34 2010 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,1659 +0,0 @@
-/* GTK - The GIMP Toolkit
- *
- * Copyright (C) 2003 Sun Microsystems, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 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
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02111-1301, USA.
- *
- * Authors:
- * Mark McLoughlin
- */
-
-/*
-#include
-*/
-
-#include
-#if !GTK_CHECK_VERSION(2,4,0)
-#include "gtkexpander.h"
-
-#include
-#include
-#include
-#include
-#include
-#include
-
-#define P_(x) (x)
-
-#define DEFAULT_EXPANDER_SIZE 10
-#define DEFAULT_EXPANDER_SPACING 2
-
-enum
-{
- PROP_0,
- PROP_EXPANDED,
- PROP_LABEL,
- PROP_USE_UNDERLINE,
- PROP_USE_MARKUP,
- PROP_SPACING,
- PROP_LABEL_WIDGET
-};
-
-struct _GtkExpanderPrivate
-{
- GtkWidget *label_widget;
- GdkWindow *event_window;
- gint spacing;
-
- GtkExpanderStyle expander_style;
- guint animation_timeout;
-
- guint expanded : 1;
- guint use_underline : 1;
- guint use_markup : 1;
- guint button_down : 1;
- guint prelight : 1;
-};
-
-static void gtk_expander_class_init (GtkExpanderClass *klass);
-static void gtk_expander_init (GtkExpander *expander);
-
-static void gtk_expander_set_property (GObject *object,
- guint prop_id,
- const GValue *value,
- GParamSpec *pspec);
-static void gtk_expander_get_property (GObject *object,
- guint prop_id,
- GValue *value,
- GParamSpec *pspec);
-
-static void gtk_expander_finalize (GObject *object);
-
-static void gtk_expander_destroy (GtkObject *object);
-
-static void gtk_expander_realize (GtkWidget *widget);
-static void gtk_expander_unrealize (GtkWidget *widget);
-static void gtk_expander_size_request (GtkWidget *widget,
- GtkRequisition *requisition);
-static void gtk_expander_size_allocate (GtkWidget *widget,
- GtkAllocation *allocation);
-static void gtk_expander_map (GtkWidget *widget);
-static void gtk_expander_unmap (GtkWidget *widget);
-static gboolean gtk_expander_expose (GtkWidget *widget,
- GdkEventExpose *event);
-static gboolean gtk_expander_button_press (GtkWidget *widget,
- GdkEventButton *event);
-static gboolean gtk_expander_button_release (GtkWidget *widget,
- GdkEventButton *event);
-static gboolean gtk_expander_enter_notify (GtkWidget *widget,
- GdkEventCrossing *event);
-static gboolean gtk_expander_leave_notify (GtkWidget *widget,
- GdkEventCrossing *event);
-static gboolean gtk_expander_focus (GtkWidget *widget,
- GtkDirectionType direction);
-static void gtk_expander_grab_notify (GtkWidget *widget,
- gboolean was_grabbed);
-static void gtk_expander_state_changed (GtkWidget *widget,
- GtkStateType previous_state);
-
-static void gtk_expander_add (GtkContainer *container,
- GtkWidget *widget);
-static void gtk_expander_remove (GtkContainer *container,
- GtkWidget *widget);
-static void gtk_expander_forall (GtkContainer *container,
- gboolean include_internals,
- GtkCallback callback,
- gpointer callback_data);
-
-static void gtk_expander_activate (GtkExpander *expander);
-
-static void get_expander_bounds (GtkExpander *expander,
- GdkRectangle *rect);
-
-static GtkBinClass *parent_class = NULL;
-
-GType
-gtk_expander_get_type (void)
-{
- static GType expander_type = 0;
-
- if (!expander_type)
- {
- static const GTypeInfo expander_info =
- {
- sizeof (GtkExpanderClass),
- NULL, /* base_init */
- NULL, /* base_finalize */
- (GClassInitFunc) gtk_expander_class_init,
- NULL, /* class_finalize */
- NULL, /* class_data */
- sizeof (GtkExpander),
- 0, /* n_preallocs */
- (GInstanceInitFunc) gtk_expander_init,
- };
-
- expander_type = g_type_register_static (GTK_TYPE_BIN,
- "GtkExpander",
- &expander_info, 0);
- }
-
- return expander_type;
-}
-
-static void
-gtk_expander_class_init (GtkExpanderClass *klass)
-{
- GObjectClass *gobject_class;
- GtkObjectClass *object_class;
- GtkWidgetClass *widget_class;
- GtkContainerClass *container_class;
-
- parent_class = g_type_class_peek_parent (klass);
-
- gobject_class = (GObjectClass *) klass;
- object_class = (GtkObjectClass *) klass;
- widget_class = (GtkWidgetClass *) klass;
- container_class = (GtkContainerClass *) klass;
-
- gobject_class->set_property = gtk_expander_set_property;
- gobject_class->get_property = gtk_expander_get_property;
- gobject_class->finalize = gtk_expander_finalize;
-
- object_class->destroy = gtk_expander_destroy;
-
- widget_class->realize = gtk_expander_realize;
- widget_class->unrealize = gtk_expander_unrealize;
- widget_class->size_request = gtk_expander_size_request;
- widget_class->size_allocate = gtk_expander_size_allocate;
- widget_class->map = gtk_expander_map;
- widget_class->unmap = gtk_expander_unmap;
- widget_class->expose_event = gtk_expander_expose;
- widget_class->button_press_event = gtk_expander_button_press;
- widget_class->button_release_event = gtk_expander_button_release;
- widget_class->enter_notify_event = gtk_expander_enter_notify;
- widget_class->leave_notify_event = gtk_expander_leave_notify;
- widget_class->focus = gtk_expander_focus;
- widget_class->grab_notify = gtk_expander_grab_notify;
- widget_class->state_changed = gtk_expander_state_changed;
-
- container_class->add = gtk_expander_add;
- container_class->remove = gtk_expander_remove;
- container_class->forall = gtk_expander_forall;
-
- klass->activate = gtk_expander_activate;
-
- g_object_class_install_property (gobject_class,
- PROP_EXPANDED,
- g_param_spec_boolean ("expanded",
- P_("Expanded"),
- P_("Whether the expander has been opened to reveal the child widget"),
- FALSE,
- G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
-
- g_object_class_install_property (gobject_class,
- PROP_LABEL,
- g_param_spec_string ("label",
- P_("Label"),
- P_("Text of the expander's label"),
- NULL,
- G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
-
- g_object_class_install_property (gobject_class,
- PROP_USE_UNDERLINE,
- g_param_spec_boolean ("use_underline",
- P_("Use underline"),
- P_("If set, an underline in the text indicates the next character should be used for the mnemonic accelerator key"),
- FALSE,
- G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
-
- g_object_class_install_property (gobject_class,
- PROP_USE_MARKUP,
- g_param_spec_boolean ("use_markup",
- P_("Use markup"),
- P_("The text of the label includes XML markup. See pango_parse_markup()"),
- FALSE,
- G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
-
- g_object_class_install_property (gobject_class,
- PROP_SPACING,
- g_param_spec_int ("spacing",
- P_("Spacing"),
- P_("Space to put between the label and the child"),
- 0,
- G_MAXINT,
- 0,
- G_PARAM_READWRITE));
-
- g_object_class_install_property (gobject_class,
- PROP_LABEL_WIDGET,
- g_param_spec_object ("label_widget",
- P_("Label widget"),
- P_("A widget to display in place of the usual expander label"),
- GTK_TYPE_WIDGET,
- G_PARAM_READWRITE));
-
- gtk_widget_class_install_style_property (widget_class,
- g_param_spec_int ("expander-size",
- P_("Expander Size"),
- P_("Size of the expander arrow"),
- 0,
- G_MAXINT,
- DEFAULT_EXPANDER_SIZE,
- G_PARAM_READABLE));
-
- gtk_widget_class_install_style_property (widget_class,
- g_param_spec_int ("expander-spacing",
- P_("Indicator Spacing"),
- P_("Spacing around expander arrow"),
- 0,
- G_MAXINT,
- DEFAULT_EXPANDER_SPACING,
- G_PARAM_READABLE));
-
- widget_class->activate_signal =
- g_signal_new ("activate",
- G_TYPE_FROM_CLASS (gobject_class),
- G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
- G_STRUCT_OFFSET (GtkExpanderClass, activate),
- NULL, NULL,
- gtk_marshal_VOID__VOID,
- G_TYPE_NONE, 0);
-}
-
-static void
-gtk_expander_finalize (GObject *obj)
-{
- GtkExpander *self = (GtkExpander *)obj;
-
- g_free(self->priv);
-
- G_OBJECT_CLASS(parent_class)->finalize (obj);
-}
-
-static void
-gtk_expander_init (GtkExpander *expander)
-{
- GtkExpanderPrivate *priv;
-
- expander->priv = priv = g_new0(GtkExpanderPrivate, 1);
-
- GTK_WIDGET_SET_FLAGS (expander, GTK_CAN_FOCUS);
- GTK_WIDGET_SET_FLAGS (expander, GTK_NO_WINDOW);
-
- priv->label_widget = NULL;
- priv->event_window = NULL;
- priv->spacing = 0;
-
- priv->expander_style = GTK_EXPANDER_COLLAPSED;
- priv->animation_timeout = 0;
-
- priv->expanded = FALSE;
- priv->use_underline = FALSE;
- priv->use_markup = FALSE;
- priv->button_down = FALSE;
- priv->prelight = FALSE;
-}
-
-static void
-gtk_expander_set_property (GObject *object,
- guint prop_id,
- const GValue *value,
- GParamSpec *pspec)
-{
- GtkExpander *expander = GTK_EXPANDER (object);
-
- switch (prop_id)
- {
- case PROP_EXPANDED:
- gtk_expander_set_expanded (expander, g_value_get_boolean (value));
- break;
- case PROP_LABEL:
- gtk_expander_set_label (expander, g_value_get_string (value));
- break;
- case PROP_USE_UNDERLINE:
- gtk_expander_set_use_underline (expander, g_value_get_boolean (value));
- break;
- case PROP_USE_MARKUP:
- gtk_expander_set_use_markup (expander, g_value_get_boolean (value));
- break;
- case PROP_SPACING:
- gtk_expander_set_spacing (expander, g_value_get_int (value));
- break;
- case PROP_LABEL_WIDGET:
- gtk_expander_set_label_widget (expander, g_value_get_object (value));
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- break;
- }
-}
-
-static void
-gtk_expander_get_property (GObject *object,
- guint prop_id,
- GValue *value,
- GParamSpec *pspec)
-{
- GtkExpander *expander = GTK_EXPANDER (object);
- GtkExpanderPrivate *priv = expander->priv;
-
- switch (prop_id)
- {
- case PROP_EXPANDED:
- g_value_set_boolean (value, priv->expanded);
- break;
- case PROP_LABEL:
- g_value_set_string (value, gtk_expander_get_label (expander));
- break;
- case PROP_USE_UNDERLINE:
- g_value_set_boolean (value, priv->use_underline);
- break;
- case PROP_USE_MARKUP:
- g_value_set_boolean (value, priv->use_markup);
- break;
- case PROP_SPACING:
- g_value_set_int (value, priv->spacing);
- break;
- case PROP_LABEL_WIDGET:
- g_value_set_object (value,
- priv->label_widget ?
- G_OBJECT (priv->label_widget) : NULL);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- break;
- }
-}
-
-static void
-gtk_expander_destroy (GtkObject *object)
-{
- GtkExpanderPrivate *priv = GTK_EXPANDER (object)->priv;
-
- if (priv->animation_timeout)
- {
- g_source_remove (priv->animation_timeout);
- priv->animation_timeout = 0;
- }
-
- GTK_OBJECT_CLASS (parent_class)->destroy (object);
-}
-
-static void
-gtk_expander_realize (GtkWidget *widget)
-{
- GtkExpanderPrivate *priv;
- GdkWindowAttr attributes;
- gint attributes_mask;
- gint border_width;
- GdkRectangle expander_rect;
-
- priv = GTK_EXPANDER (widget)->priv;
- GTK_WIDGET_SET_FLAGS (widget, GTK_REALIZED);
-
- border_width = GTK_CONTAINER (widget)->border_width;
-
- get_expander_bounds (GTK_EXPANDER (widget), &expander_rect);
-
- attributes.window_type = GDK_WINDOW_CHILD;
- attributes.x = widget->allocation.x + border_width;
- attributes.y = expander_rect.y;
- attributes.width = MAX (widget->allocation.width - 2 * border_width, 1);
- attributes.height = expander_rect.width;
- attributes.wclass = GDK_INPUT_ONLY;
- attributes.event_mask = gtk_widget_get_events (widget) |
- GDK_BUTTON_PRESS_MASK |
- GDK_BUTTON_RELEASE_MASK |
- GDK_ENTER_NOTIFY_MASK |
- GDK_LEAVE_NOTIFY_MASK;
-
- attributes_mask = GDK_WA_X | GDK_WA_Y;
-
- widget->window = gtk_widget_get_parent_window (widget);
- g_object_ref (widget->window);
-
- priv->event_window = gdk_window_new (gtk_widget_get_parent_window (widget),
- &attributes, attributes_mask);
- gdk_window_set_user_data (priv->event_window, widget);
-
- widget->style = gtk_style_attach (widget->style, widget->window);
- gtk_style_set_background (widget->style, widget->window, GTK_STATE_NORMAL);
-}
-
-static void
-gtk_expander_unrealize (GtkWidget *widget)
-{
- GtkExpanderPrivate *priv = GTK_EXPANDER (widget)->priv;
-
- if (priv->event_window)
- {
- gdk_window_set_user_data (priv->event_window, NULL);
- gdk_window_destroy (priv->event_window);
- priv->event_window = NULL;
- }
-
- GTK_WIDGET_CLASS (parent_class)->unrealize (widget);
-}
-
-static void
-gtk_expander_size_request (GtkWidget *widget,
- GtkRequisition *requisition)
-{
- GtkExpander *expander;
- GtkBin *bin;
- GtkExpanderPrivate *priv;
- gint border_width;
- gint expander_size;
- gint expander_spacing;
- gboolean interior_focus;
- gint focus_width;
- gint focus_pad;
-
- bin = GTK_BIN (widget);
- expander = GTK_EXPANDER (widget);
- priv = expander->priv;
-
- border_width = GTK_CONTAINER (widget)->border_width;
-
- gtk_widget_style_get (widget,
- "interior-focus", &interior_focus,
- "focus-line-width", &focus_width,
- "focus-padding", &focus_pad,
- "expander-size", &expander_size,
- "expander-spacing", &expander_spacing,
- NULL);
-
- requisition->width = expander_size + 2 * expander_spacing +
- 2 * focus_width + 2 * focus_pad;
- requisition->height = interior_focus ? (2 * focus_width + 2 * focus_pad) : 0;
-
- if (priv->label_widget && GTK_WIDGET_VISIBLE (priv->label_widget))
- {
- GtkRequisition label_requisition;
-
- gtk_widget_size_request (priv->label_widget, &label_requisition);
-
- requisition->width += label_requisition.width;
- requisition->height += label_requisition.height;
- }
-
- requisition->height = MAX (expander_size + 2 * expander_spacing, requisition->height);
-
- if (!interior_focus)
- requisition->height += 2 * focus_width + 2 * focus_pad;
-
- if (bin->child && GTK_WIDGET_CHILD_VISIBLE (bin->child))
- {
- GtkRequisition child_requisition;
-
- gtk_widget_size_request (bin->child, &child_requisition);
-
- requisition->width = MAX (requisition->width, child_requisition.width);
- requisition->height += child_requisition.height + priv->spacing;
- }
-
- requisition->width += 2 * border_width;
- requisition->height += 2 * border_width;
-}
-
-static void
-get_expander_bounds (GtkExpander *expander,
- GdkRectangle *rect)
-{
- GtkWidget *widget;
- GtkBin *bin;
- GtkExpanderPrivate *priv;
- gint border_width;
- gint expander_size;
- gint expander_spacing;
- gboolean interior_focus;
- gint focus_width;
- gint focus_pad;
- gboolean ltr;
-
- widget = GTK_WIDGET (expander);
- bin = GTK_BIN (expander);
- priv = expander->priv;
-
- border_width = GTK_CONTAINER (expander)->border_width;
-
- gtk_widget_style_get (widget,
- "interior-focus", &interior_focus,
- "focus-line-width", &focus_width,
- "focus-padding", &focus_pad,
- "expander-size", &expander_size,
- "expander-spacing", &expander_spacing,
- NULL);
-
- ltr = gtk_widget_get_direction (widget) != GTK_TEXT_DIR_RTL;
-
- rect->x = widget->allocation.x + border_width;
- rect->y = widget->allocation.y + border_width;
-
- if (ltr)
- rect->x += expander_spacing;
- else
- rect->x += widget->allocation.width - 2 * border_width -
- expander_spacing - expander_size;
-
- if (priv->label_widget && GTK_WIDGET_VISIBLE (priv->label_widget))
- {
- GtkAllocation label_allocation;
-
- label_allocation = priv->label_widget->allocation;
-
- if (expander_size < label_allocation.height)
- rect->y += focus_width + focus_pad + (label_allocation.height - expander_size) / 2;
- else
- rect->y += expander_spacing;
- }
- else
- {
- rect->y += expander_spacing;
- }
-
- if (!interior_focus)
- {
- if (ltr)
- rect->x += focus_width + focus_pad;
- else
- rect->x -= focus_width + focus_pad;
- rect->y += focus_width + focus_pad;
- }
-
- rect->width = rect->height = expander_size;
-}
-
-static void
-gtk_expander_size_allocate (GtkWidget *widget,
- GtkAllocation *allocation)
-{
- GtkExpander *expander;
- GtkBin *bin;
- GtkExpanderPrivate *priv;
- GtkRequisition child_requisition;
- gboolean child_visible = FALSE;
- gint border_width;
- gint expander_size;
- gint expander_spacing;
- gboolean interior_focus;
- gint focus_width;
- gint focus_pad;
- gint label_height;
-
- expander = GTK_EXPANDER (widget);
- bin = GTK_BIN (widget);
- priv = expander->priv;
-
- border_width = GTK_CONTAINER (widget)->border_width;
-
- gtk_widget_style_get (widget,
- "interior-focus", &interior_focus,
- "focus-line-width", &focus_width,
- "focus-padding", &focus_pad,
- "expander-size", &expander_size,
- "expander-spacing", &expander_spacing,
- NULL);
-
- child_requisition.width = 0;
- child_requisition.height = 0;
- if (bin->child && GTK_WIDGET_CHILD_VISIBLE (bin->child))
- {
- child_visible = TRUE;
- gtk_widget_get_child_requisition (bin->child, &child_requisition);
- }
-
- widget->allocation = *allocation;
-
- if (priv->label_widget && GTK_WIDGET_VISIBLE (priv->label_widget))
- {
- GtkAllocation label_allocation;
- GtkRequisition label_requisition;
- gboolean ltr;
-
- gtk_widget_get_child_requisition (priv->label_widget, &label_requisition);
-
- ltr = gtk_widget_get_direction (widget) != GTK_TEXT_DIR_RTL;
-
- if (ltr)
- label_allocation.x = (widget->allocation.x +
- border_width + focus_width + focus_pad +
- expander_size + 2 * expander_spacing);
- else
- label_allocation.x = (widget->allocation.x + widget->allocation.width -
- (label_requisition.width +
- border_width + focus_width + focus_pad +
- expander_size + 2 * expander_spacing));
-
- label_allocation.y = widget->allocation.y + border_width + focus_width + focus_pad;
-
- label_allocation.width = MIN (label_requisition.width,
- allocation->width - 2 * border_width -
- expander_size - 2 * expander_spacing -
- 2 * focus_width - 2 * focus_pad);
- label_allocation.width = MAX (label_allocation.width, 1);
-
- label_allocation.height = MIN (label_requisition.height,
- allocation->height - 2 * border_width -
- 2 * focus_width - 2 * focus_pad -
- (child_visible ? priv->spacing : 0));
- label_allocation.height = MAX (label_allocation.height, 1);
-
- gtk_widget_size_allocate (priv->label_widget, &label_allocation);
-
- label_height = label_allocation.height;
- }
- else
- {
- label_height = 0;
- }
-
- if (GTK_WIDGET_REALIZED (widget))
- {
- GdkRectangle rect;
-
- get_expander_bounds (expander, &rect);
-
- gdk_window_move_resize (priv->event_window,
- allocation->x + border_width, rect.y,
- MAX (allocation->width - 2 * border_width, 1), rect.width);
- }
-
- if (child_visible)
- {
- GtkAllocation child_allocation;
- gint top_height;
-
- top_height = MAX (2 * expander_spacing + expander_size,
- label_height +
- (interior_focus ? 2 * focus_width + 2 * focus_pad : 0));
-
- child_allocation.x = widget->allocation.x + border_width;
- child_allocation.y = widget->allocation.y + border_width + top_height + priv->spacing;
-
- if (!interior_focus)
- child_allocation.y += 2 * focus_width + 2 * focus_pad;
-
- child_allocation.width = MAX (allocation->width - 2 * border_width, 1);
-
- child_allocation.height = allocation->height - top_height -
- 2 * border_width - priv->spacing -
- (!interior_focus ? 2 * focus_width + 2 * focus_pad : 0);
- child_allocation.height = MAX (child_allocation.height, 1);
-
- gtk_widget_size_allocate (bin->child, &child_allocation);
- }
-}
-
-static void
-gtk_expander_map (GtkWidget *widget)
-{
- GtkExpanderPrivate *priv = GTK_EXPANDER (widget)->priv;
-
- if (priv->label_widget)
- gtk_widget_map (priv->label_widget);
-
- GTK_WIDGET_CLASS (parent_class)->map (widget);
-
- if (priv->event_window)
- gdk_window_show (priv->event_window);
-}
-
-static void
-gtk_expander_unmap (GtkWidget *widget)
-{
- GtkExpanderPrivate *priv = GTK_EXPANDER (widget)->priv;
-
- if (priv->event_window)
- gdk_window_hide (priv->event_window);
-
- GTK_WIDGET_CLASS (parent_class)->unmap (widget);
-
- if (priv->label_widget)
- gtk_widget_unmap (priv->label_widget);
-}
-
-static void
-gtk_expander_paint_prelight (GtkExpander *expander)
-{
- GtkWidget *widget;
- GtkContainer *container;
- GtkExpanderPrivate *priv;
- GdkRectangle area;
- gboolean interior_focus;
- int focus_width;
- int focus_pad;
- int expander_size;
- int expander_spacing;
-
- priv = expander->priv;
- widget = GTK_WIDGET (expander);
- container = GTK_CONTAINER (expander);
-
- gtk_widget_style_get (widget,
- "interior-focus", &interior_focus,
- "focus-line-width", &focus_width,
- "focus-padding", &focus_pad,
- "expander-size", &expander_size,
- "expander-spacing", &expander_spacing,
- NULL);
-
- area.x = widget->allocation.x + container->border_width;
- area.y = widget->allocation.y + container->border_width;
- area.width = widget->allocation.width - (2 * container->border_width);
-
- if (priv->label_widget && GTK_WIDGET_VISIBLE (priv->label_widget))
- area.height = priv->label_widget->allocation.height;
- else
- area.height = 0;
-
- area.height += interior_focus ? (focus_width + focus_pad) * 2 : 0;
- area.height = MAX (area.height, expander_size + 2 * expander_spacing);
- area.height += !interior_focus ? (focus_width + focus_pad) * 2 : 0;
-
- gtk_paint_flat_box (widget->style, widget->window,
- GTK_STATE_PRELIGHT,
- GTK_SHADOW_ETCHED_OUT,
- &area, widget, "expander",
- area.x, area.y,
- area.width, area.height);
-}
-
-static void
-gtk_expander_paint (GtkExpander *expander)
-{
- GtkWidget *widget;
- GdkRectangle clip;
- GtkStateType state;
-
- widget = GTK_WIDGET (expander);
-
- get_expander_bounds (expander, &clip);
-
- state = widget->state;
- if (expander->priv->prelight)
- {
- state = GTK_STATE_PRELIGHT;
-
- gtk_expander_paint_prelight (expander);
- }
-
- gtk_paint_expander (widget->style,
- widget->window,
- state,
- &clip,
- widget,
- "expander",
- clip.x + clip.width / 2,
- clip.y + clip.height / 2,
- expander->priv->expander_style);
-}
-
-static void
-gtk_expander_paint_focus (GtkExpander *expander,
- GdkRectangle *area)
-{
- GtkWidget *widget;
- GtkExpanderPrivate *priv;
- gint x, y, width, height;
- gboolean interior_focus;
- gint border_width;
- gint focus_width;
- gint focus_pad;
- gint expander_size;
- gint expander_spacing;
- gboolean ltr;
-
- widget = GTK_WIDGET (expander);
- priv = expander->priv;
-
- border_width = GTK_CONTAINER (widget)->border_width;
-
- gtk_widget_style_get (widget,
- "interior-focus", &interior_focus,
- "focus-line-width", &focus_width,
- "focus-padding", &focus_pad,
- "expander-size", &expander_size,
- "expander-spacing", &expander_spacing,
- NULL);
-
- ltr = gtk_widget_get_direction (widget) != GTK_TEXT_DIR_RTL;
-
- x = widget->allocation.x + border_width;
- y = widget->allocation.y + border_width;
-
- if (ltr && interior_focus)
- x += expander_spacing * 2 + expander_size;
-
- width = height = 0;
-
- if (priv->label_widget && GTK_WIDGET_VISIBLE (priv->label_widget))
- {
- GtkAllocation label_allocation = priv->label_widget->allocation;
-
- width = label_allocation.width;
- height = label_allocation.height;
- }
-
- if (!interior_focus)
- {
- width += expander_size + 2 * expander_spacing;
- height = MAX (height, expander_size + 2 * expander_spacing);
- }
-
- width += 2 * focus_pad + 2 * focus_width;
- height += 2 * focus_pad + 2 * focus_width;
-
- gtk_paint_focus (widget->style, widget->window, GTK_WIDGET_STATE (widget),
- area, widget, "expander",
- x, y, width, height);
-}
-
-static gboolean
-gtk_expander_expose (GtkWidget *widget,
- GdkEventExpose *event)
-{
- if (GTK_WIDGET_DRAWABLE (widget))
- {
- GtkExpander *expander = GTK_EXPANDER (widget);
-
- gtk_expander_paint (expander);
-
- if (GTK_WIDGET_HAS_FOCUS (expander))
- gtk_expander_paint_focus (expander, &event->area);
-
- GTK_WIDGET_CLASS (parent_class)->expose_event (widget, event);
- }
-
- return FALSE;
-}
-
-static gboolean
-gtk_expander_button_press (GtkWidget *widget,
- GdkEventButton *event)
-{
- GtkExpander *expander = GTK_EXPANDER (widget);
-
- if (event->button == 1 && event->window == expander->priv->event_window)
- {
- expander->priv->button_down = TRUE;
- return TRUE;
- }
-
- return FALSE;
-}
-
-static gboolean
-gtk_expander_button_release (GtkWidget *widget,
- GdkEventButton *event)
-{
- GtkExpander *expander = GTK_EXPANDER (widget);
-
- if (event->button == 1 && expander->priv->button_down)
- {
- gtk_widget_activate (widget);
- expander->priv->button_down = FALSE;
- return TRUE;
- }
-
- return FALSE;
-}
-
-static void
-gtk_expander_grab_notify (GtkWidget *widget,
- gboolean was_grabbed)
-{
- if (!was_grabbed)
- GTK_EXPANDER (widget)->priv->button_down = FALSE;
-}
-
-static void
-gtk_expander_state_changed (GtkWidget *widget,
- GtkStateType previous_state)
-{
- if (!GTK_WIDGET_IS_SENSITIVE (widget))
- GTK_EXPANDER (widget)->priv->button_down = FALSE;
-}
-
-static void
-gtk_expander_redraw_expander (GtkExpander *expander)
-{
- GtkWidget *widget;
-
- widget = GTK_WIDGET (expander);
-
- if (GTK_WIDGET_REALIZED (widget))
- gdk_window_invalidate_rect (widget->window, &widget->allocation, FALSE);
-}
-
-static gboolean
-gtk_expander_enter_notify (GtkWidget *widget,
- GdkEventCrossing *event)
-{
- GtkExpander *expander = GTK_EXPANDER (widget);
- GtkWidget *event_widget;
-
- event_widget = gtk_get_event_widget ((GdkEvent *) event);
-
- if (event_widget == widget &&
- event->detail != GDK_NOTIFY_INFERIOR)
- {
- expander->priv->prelight = TRUE;
-
- if (expander->priv->label_widget)
- gtk_widget_set_state (expander->priv->label_widget, GTK_STATE_PRELIGHT);
-
- gtk_expander_redraw_expander (expander);
- }
-
- return FALSE;
-}
-
-static gboolean
-gtk_expander_leave_notify (GtkWidget *widget,
- GdkEventCrossing *event)
-{
- GtkExpander *expander = GTK_EXPANDER (widget);
- GtkWidget *event_widget;
-
- event_widget = gtk_get_event_widget ((GdkEvent *) event);
-
- if (event_widget == widget &&
- event->detail != GDK_NOTIFY_INFERIOR)
- {
- expander->priv->prelight = FALSE;
-
- if (expander->priv->label_widget)
- gtk_widget_set_state (expander->priv->label_widget, GTK_STATE_NORMAL);
-
- gtk_expander_redraw_expander (expander);
- }
-
- return FALSE;
-}
-
-typedef enum
-{
- FOCUS_NONE,
- FOCUS_WIDGET,
- FOCUS_LABEL,
- FOCUS_CHILD
-} FocusSite;
-
-static gboolean
-focus_current_site (GtkExpander *expander,
- GtkDirectionType direction)
-{
- GtkWidget *current_focus;
-
- current_focus = GTK_CONTAINER (expander)->focus_child;
-
- if (!current_focus)
- return FALSE;
-
- return gtk_widget_child_focus (current_focus, direction);
-}
-
-static gboolean
-focus_in_site (GtkExpander *expander,
- FocusSite site,
- GtkDirectionType direction)
-{
- switch (site)
- {
- case FOCUS_WIDGET:
- gtk_widget_grab_focus (GTK_WIDGET (expander));
- return TRUE;
- case FOCUS_LABEL:
- if (expander->priv->label_widget)
- return gtk_widget_child_focus (expander->priv->label_widget, direction);
- else
- return FALSE;
- case FOCUS_CHILD:
- {
- GtkWidget *child = gtk_bin_get_child (GTK_BIN (expander));
-
- if (child && GTK_WIDGET_CHILD_VISIBLE (child))
- return gtk_widget_child_focus (child, direction);
- else
- return FALSE;
- }
- case FOCUS_NONE:
- break;
- }
-
- g_assert_not_reached ();
- return FALSE;
-}
-
-static FocusSite
-get_next_site (GtkExpander *expander,
- FocusSite site,
- GtkDirectionType direction)
-{
- gboolean ltr;
-
- ltr = gtk_widget_get_direction (GTK_WIDGET (expander)) != GTK_TEXT_DIR_RTL;
-
- switch (site)
- {
- case FOCUS_NONE:
- switch (direction)
- {
- case GTK_DIR_TAB_BACKWARD:
- case GTK_DIR_LEFT:
- case GTK_DIR_UP:
- return FOCUS_CHILD;
- case GTK_DIR_TAB_FORWARD:
- case GTK_DIR_DOWN:
- case GTK_DIR_RIGHT:
- return FOCUS_WIDGET;
- }
- case FOCUS_WIDGET:
- switch (direction)
- {
- case GTK_DIR_TAB_BACKWARD:
- case GTK_DIR_UP:
- return FOCUS_NONE;
- case GTK_DIR_LEFT:
- return ltr ? FOCUS_NONE : FOCUS_LABEL;
- case GTK_DIR_TAB_FORWARD:
- case GTK_DIR_DOWN:
- return FOCUS_LABEL;
- case GTK_DIR_RIGHT:
- return ltr ? FOCUS_LABEL : FOCUS_NONE;
- break;
- }
- case FOCUS_LABEL:
- switch (direction)
- {
- case GTK_DIR_TAB_BACKWARD:
- case GTK_DIR_UP:
- return FOCUS_WIDGET;
- case GTK_DIR_LEFT:
- return ltr ? FOCUS_WIDGET : FOCUS_CHILD;
- case GTK_DIR_TAB_FORWARD:
- case GTK_DIR_DOWN:
- return FOCUS_CHILD;
- case GTK_DIR_RIGHT:
- return ltr ? FOCUS_CHILD : FOCUS_WIDGET;
- break;
- }
- case FOCUS_CHILD:
- switch (direction)
- {
- case GTK_DIR_TAB_BACKWARD:
- case GTK_DIR_LEFT:
- case GTK_DIR_UP:
- return FOCUS_LABEL;
- case GTK_DIR_TAB_FORWARD:
- case GTK_DIR_DOWN:
- case GTK_DIR_RIGHT:
- return FOCUS_NONE;
- }
- }
-
- g_assert_not_reached ();
- return FOCUS_NONE;
-}
-
-static gboolean
-gtk_expander_focus (GtkWidget *widget,
- GtkDirectionType direction)
-{
- GtkExpander *expander = GTK_EXPANDER (widget);
-
- if (!focus_current_site (expander, direction))
- {
- GtkWidget *old_focus_child;
- gboolean widget_is_focus;
- FocusSite site = FOCUS_NONE;
-
- widget_is_focus = gtk_widget_is_focus (widget);
- old_focus_child = GTK_CONTAINER (widget)->focus_child;
-
- if (old_focus_child && old_focus_child == expander->priv->label_widget)
- site = FOCUS_LABEL;
- else if (old_focus_child)
- site = FOCUS_CHILD;
- else if (widget_is_focus)
- site = FOCUS_WIDGET;
-
- while ((site = get_next_site (expander, site, direction)) != FOCUS_NONE)
- {
- if (focus_in_site (expander, site, direction))
- return TRUE;
- }
-
- return FALSE;
- }
-
- return TRUE;
-}
-
-static void
-gtk_expander_add (GtkContainer *container,
- GtkWidget *widget)
-{
- GTK_CONTAINER_CLASS (parent_class)->add (container, widget);
-
- gtk_widget_set_child_visible (widget, GTK_EXPANDER (container)->priv->expanded);
- gtk_widget_queue_resize (GTK_WIDGET (container));
-}
-
-static void
-gtk_expander_remove (GtkContainer *container,
- GtkWidget *widget)
-{
- GtkExpander *expander = GTK_EXPANDER (container);
-
- if (GTK_EXPANDER (expander)->priv->label_widget == widget)
- gtk_expander_set_label_widget (expander, NULL);
- else
- GTK_CONTAINER_CLASS (parent_class)->remove (container, widget);
-}
-
-static void
-gtk_expander_forall (GtkContainer *container,
- gboolean include_internals,
- GtkCallback callback,
- gpointer callback_data)
-{
- GtkBin *bin = GTK_BIN (container);
- GtkExpanderPrivate *priv = GTK_EXPANDER (container)->priv;
-
- if (bin->child)
- (* callback) (bin->child, callback_data);
-
- if (priv->label_widget)
- (* callback) (priv->label_widget, callback_data);
-}
-
-static void
-gtk_expander_activate (GtkExpander *expander)
-{
- gtk_expander_set_expanded (expander, !expander->priv->expanded);
-}
-
-
-/**
- * gtk_expander_new:
- * @label: the text of the label
- *
- * Creates a new expander using @label as the text of the label.
- *
- * Return value: a new #GtkExpander widget.
- *
- * Since: 2.4
- **/
-GtkWidget *
-gtk_expander_new (const gchar *label)
-{
- return g_object_new (GTK_TYPE_EXPANDER, "label", label, NULL);
-}
-
-/**
- * gtk_expander_new_with_mnemonic:
- * @label: the text of the label with an underscore in front of the
- * mnemonic character
- *
- * Creates a new expander using @label as the text of the label.
- * If characters in @label are preceded by an underscore, they are underlined.
- * If you need a literal underscore character in a label, use '__' (two
- * underscores). The first underlined character represents a keyboard
- * accelerator called a mnemonic.
- * Pressing Alt and that key activates the button.
- *
- * Return value: a new #GtkExpander widget.
- *
- * Since: 2.4
- **/
-GtkWidget *
-gtk_expander_new_with_mnemonic (const gchar *label)
-{
- return g_object_new (GTK_TYPE_EXPANDER,
- "label", label,
- "use_underline", TRUE,
- NULL);
-}
-
-static gboolean
-gtk_expander_animation_timeout (GtkExpander *expander)
-{
- GtkExpanderPrivate *priv = expander->priv;
- GdkRectangle area;
- gboolean finish = FALSE;
-
- GDK_THREADS_ENTER();
-
- if (GTK_WIDGET_REALIZED (expander))
- {
- get_expander_bounds (expander, &area);
- gdk_window_invalidate_rect (GTK_WIDGET (expander)->window, &area, TRUE);
- }
-
- if (priv->expanded)
- {
- if (priv->expander_style == GTK_EXPANDER_COLLAPSED)
- {
- priv->expander_style = GTK_EXPANDER_SEMI_EXPANDED;
- }
- else
- {
- priv->expander_style = GTK_EXPANDER_EXPANDED;
- finish = TRUE;
- }
- }
- else
- {
- if (priv->expander_style == GTK_EXPANDER_EXPANDED)
- {
- priv->expander_style = GTK_EXPANDER_SEMI_COLLAPSED;
- }
- else
- {
- priv->expander_style = GTK_EXPANDER_COLLAPSED;
- finish = TRUE;
- }
- }
-
- if (finish)
- {
- priv->animation_timeout = 0;
- if (GTK_BIN (expander)->child)
- gtk_widget_set_child_visible (GTK_BIN (expander)->child, priv->expanded);
- gtk_widget_queue_resize (GTK_WIDGET (expander));
- }
-
- GDK_THREADS_LEAVE();
-
- return !finish;
-}
-
-static void
-gtk_expander_start_animation (GtkExpander *expander)
-{
- GtkExpanderPrivate *priv = expander->priv;
-
- if (priv->animation_timeout)
- g_source_remove (priv->animation_timeout);
-
- priv->animation_timeout =
- g_timeout_add (50,
- (GSourceFunc) gtk_expander_animation_timeout,
- expander);
-}
-
-/**
- * gtk_expander_set_expanded:
- * @expander: a #GtkExpander
- * @expanded: whether the child widget is revealed
- *
- * Sets the state of the expander. Set to %TRUE, if you want
- * the child widget to be revealed, and %FALSE if you want the
- * child widget to be hidden.
- *
- * Since: 2.4
- **/
-void
-gtk_expander_set_expanded (GtkExpander *expander,
- gboolean expanded)
-{
- GtkExpanderPrivate *priv;
-
- g_return_if_fail (GTK_IS_EXPANDER (expander));
-
- priv = expander->priv;
-
- expanded = expanded != FALSE;
-
- if (priv->expanded != expanded)
- {
- priv->expanded = expanded;
-
- if (GTK_WIDGET_REALIZED (expander))
- {
- gtk_expander_start_animation (expander);
- }
- else
- {
- priv->expander_style = expanded ? GTK_EXPANDER_EXPANDED :
- GTK_EXPANDER_COLLAPSED;
-
- if (GTK_BIN (expander)->child)
- {
- gtk_widget_set_child_visible (GTK_BIN (expander)->child, priv->expanded);
- gtk_widget_queue_resize (GTK_WIDGET (expander));
- }
- }
-
- g_object_notify (G_OBJECT (expander), "expanded");
- }
-}
-
-/**
- * gtk_expander_get_expanded:
- * @expander:a #GtkExpander
- *
- * Queries a #GtkExpander and returns its current state. Returns %TRUE
- * if the child widget is revealed.
- *
- * See gtk_expander_set_expanded().
- *
- * Return value: the current state of the expander.
- *
- * Since: 2.4
- **/
-gboolean
-gtk_expander_get_expanded (GtkExpander *expander)
-{
- g_return_val_if_fail (GTK_IS_EXPANDER (expander), FALSE);
-
- return expander->priv->expanded;
-}
-
-/**
- * gtk_expander_set_spacing:
- * @expander: a #GtkExpander
- * @spacing: distance between the expander and child in pixels.
- *
- * Sets the spacing field of @expander, which is the number of pixels to
- * place between expander and the child.
- *
- * Since: 2.4
- **/
-void
-gtk_expander_set_spacing (GtkExpander *expander,
- gint spacing)
-{
- g_return_if_fail (GTK_IS_EXPANDER (expander));
- g_return_if_fail (spacing >= 0);
-
- if (expander->priv->spacing != spacing)
- {
- expander->priv->spacing = spacing;
-
- gtk_widget_queue_resize (GTK_WIDGET (expander));
-
- g_object_notify (G_OBJECT (expander), "spacing");
- }
-}
-
-/**
- * gtk_expander_get_spacing:
- * @expander: a #GtkExpander
- *
- * Gets the value set by gtk_expander_set_spacing().
- *
- * Return value: spacing between the expander and child.
- *
- * Since: 2.4
- **/
-gint
-gtk_expander_get_spacing (GtkExpander *expander)
-{
- g_return_val_if_fail (GTK_IS_EXPANDER (expander), 0);
-
- return expander->priv->spacing;
-}
-
-/**
- * gtk_expander_set_label:
- * @expander: a #GtkExpander
- * @label: a string
- *
- * Sets the text of the label of the expander to @label.
- *
- * This will also clear any previously set labels.
- *
- * Since: 2.4
- **/
-void
-gtk_expander_set_label (GtkExpander *expander,
- const gchar *label)
-{
- g_return_if_fail (GTK_IS_EXPANDER (expander));
-
- if (!label)
- {
- gtk_expander_set_label_widget (expander, NULL);
- }
- else
- {
- GtkWidget *child;
-
- child = gtk_label_new (label);
- gtk_label_set_use_underline (GTK_LABEL (child), expander->priv->use_underline);
- gtk_label_set_use_markup (GTK_LABEL (child), expander->priv->use_markup);
- gtk_widget_show (child);
-
- gtk_expander_set_label_widget (expander, child);
- }
-
- g_object_notify (G_OBJECT (expander), "label");
-}
-
-/**
- * gtk_expander_get_label:
- * @expander: a #GtkExpander
- *
- * Fetches the text from the label of the expander, as set by
- * gtk_expander_set_label(). If the label text has not
- * been set the return value will be %NULL. This will be the
- * case if you create an empty button with gtk_button_new() to
- * use as a container.
- *
- * Return value: The text of the label widget. This string is owned
- * by the widget and must not be modified or freed.
- *
- * Since: 2.4
- **/
-G_CONST_RETURN char *
-gtk_expander_get_label (GtkExpander *expander)
-{
- GtkExpanderPrivate *priv;
-
- g_return_val_if_fail (GTK_IS_EXPANDER (expander), NULL);
-
- priv = expander->priv;
-
- if (priv->label_widget && GTK_IS_LABEL (priv->label_widget))
- return gtk_label_get_text (GTK_LABEL (priv->label_widget));
- else
- return NULL;
-}
-
-/**
- * gtk_expander_set_use_underline:
- * @expander: a #GtkExpander
- * @use_underline: %TRUE if underlines in the text indicate mnemonics
- *
- * If true, an underline in the text of the expander label indicates
- * the next character should be used for the mnemonic accelerator key.
- *
- * Since: 2.4
- **/
-void
-gtk_expander_set_use_underline (GtkExpander *expander,
- gboolean use_underline)
-{
- GtkExpanderPrivate *priv;
-
- g_return_if_fail (GTK_IS_EXPANDER (expander));
-
- priv = expander->priv;
-
- use_underline = use_underline != FALSE;
-
- if (priv->use_underline != use_underline)
- {
- priv->use_underline = use_underline;
-
- if (priv->label_widget && GTK_IS_LABEL (priv->label_widget))
- gtk_label_set_use_underline (GTK_LABEL (priv->label_widget), use_underline);
-
- g_object_notify (G_OBJECT (expander), "use-underline");
- }
-}
-
-/**
- * gtk_expander_get_use_underline:
- * @expander: a #GtkExpander
- *
- * Returns whether an embedded underline in the expander label indicates a
- * mnemonic. See gtk_expander_set_use_underline().
- *
- * Return value: %TRUE if an embedded underline in the expander label
- * indicates the mnemonic accelerator keys.
- *
- * Since: 2.4
- **/
-gboolean
-gtk_expander_get_use_underline (GtkExpander *expander)
-{
- g_return_val_if_fail (GTK_IS_EXPANDER (expander), FALSE);
-
- return expander->priv->use_underline;
-}
-
-/**
- * gtk_expander_set_use_markup:
- * @expander: a #GtkExpander
- * @use_markup: %TRUE if the label's text should be parsed for markup
- *
- * Sets whether the text of the label contains markup in Pango's text markup
- * language. See gtk_label_set_markup().
- *
- * Since: 2.4
- **/
-void
-gtk_expander_set_use_markup (GtkExpander *expander,
- gboolean use_markup)
-{
- GtkExpanderPrivate *priv;
-
- g_return_if_fail (GTK_IS_EXPANDER (expander));
-
- priv = expander->priv;
-
- use_markup = use_markup != FALSE;
-
- if (priv->use_markup != use_markup)
- {
- priv->use_markup = use_markup;
-
- if (priv->label_widget && GTK_IS_LABEL (priv->label_widget))
- gtk_label_set_use_markup (GTK_LABEL (priv->label_widget), use_markup);
-
- g_object_notify (G_OBJECT (expander), "use-markup");
- }
-}
-
-/**
- * gtk_expander_get_use_markup:
- * @expander: a #GtkExpander
- *
- * Returns whether the label's text is interpreted as marked up with
- * the Pango text markup
- * language. See gtk_expander_set_use_markup ().
- *
- * Return value: %TRUE if the label's text will be parsed for markup
- *
- * Since: 2.4
- **/
-gboolean
-gtk_expander_get_use_markup (GtkExpander *expander)
-{
- g_return_val_if_fail (GTK_IS_EXPANDER (expander), FALSE);
-
- return expander->priv->use_markup;
-}
-
-/**
- * gtk_expander_set_label_widget:
- * @expander: a #GtkExpander
- * @label_widget: the new label widget
- *
- * Set the label widget for the expander. This is the widget
- * that will appear embedded alongside the expander arrow.
- *
- * Since: 2.4
- **/
-void
-gtk_expander_set_label_widget (GtkExpander *expander,
- GtkWidget *label_widget)
-{
- GtkExpanderPrivate *priv;
-
- g_return_if_fail (GTK_IS_EXPANDER (expander));
- g_return_if_fail (label_widget == NULL || GTK_IS_WIDGET (label_widget));
- g_return_if_fail (label_widget == NULL || label_widget->parent == NULL);
-
- priv = expander->priv;
-
- if (priv->label_widget == label_widget)
- return;
-
- if (priv->label_widget)
- {
- gtk_widget_set_state (priv->label_widget, GTK_STATE_NORMAL);
- gtk_widget_unparent (priv->label_widget);
- }
-
- priv->label_widget = label_widget;
-
- if (label_widget)
- {
- priv->label_widget = label_widget;
-
- gtk_widget_set_parent (label_widget, GTK_WIDGET (expander));
-
- if (priv->prelight)
- gtk_widget_set_state (label_widget, GTK_STATE_PRELIGHT);
- }
-
- if (GTK_WIDGET_VISIBLE (expander))
- gtk_widget_queue_resize (GTK_WIDGET (expander));
-
- g_object_freeze_notify (G_OBJECT (expander));
- g_object_notify (G_OBJECT (expander), "label-widget");
- g_object_notify (G_OBJECT (expander), "label");
- g_object_thaw_notify (G_OBJECT (expander));
-}
-
-/**
- * gtk_expander_get_label_widget:
- * @expander: a #GtkExpander
- *
- * Retrieves the label widget for the frame. See
- * gtk_expander_set_label_widget().
- *
- * Return value: the label widget, or %NULL if there is none.
- *
- * Since: 2.4
- **/
-GtkWidget *
-gtk_expander_get_label_widget (GtkExpander *expander)
-{
- g_return_val_if_fail (GTK_IS_EXPANDER (expander), NULL);
-
- return expander->priv->label_widget;
-}
-
-#define __GTK_EXPANDER_C__
-
-#endif /* Gtk 2.4 */
diff -r cc6d733a192a -r c5a7516418c7 pidgin/gtkexpander.h
--- a/pidgin/gtkexpander.h Tue Feb 16 15:58:34 2010 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,91 +0,0 @@
-/* GTK - The GIMP Toolkit
- *
- * Copyright (C) 2003 Sun Microsystems, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 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
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02111-1301, USA.
- *
- * Authors:
- * Mark McLoughlin
- */
-
-#ifndef __GTK_EXPANDER_H__
-#define __GTK_EXPANDER_H__
-
-#include
-
-G_BEGIN_DECLS
-
-#define GTK_TYPE_EXPANDER (gtk_expander_get_type ())
-#define GTK_EXPANDER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_EXPANDER, GtkExpander))
-#define GTK_EXPANDER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GTK_TYPE_EXPANDER, GtkExpanderClass))
-#define GTK_IS_EXPANDER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTK_TYPE_EXPANDER))
-#define GTK_IS_EXPANDER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_EXPANDER))
-#define GTK_EXPANDER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_EXPANDER, GtkExpanderClass))
-
-typedef struct _GtkExpander GtkExpander;
-typedef struct _GtkExpanderClass GtkExpanderClass;
-typedef struct _GtkExpanderPrivate GtkExpanderPrivate;
-
-struct _GtkExpander
-{
- GtkBin bin;
-
- GtkExpanderPrivate *priv;
-};
-
-struct _GtkExpanderClass
-{
- GtkBinClass parent_class;
-
- /* Key binding signal; to get notification on the expansion
- * state connect to notify:expanded.
- */
- void (* activate) (GtkExpander *expander);
-};
-
-GType gtk_expander_get_type (void) G_GNUC_CONST;
-
-GtkWidget *gtk_expander_new (const gchar *label);
-GtkWidget *gtk_expander_new_with_mnemonic (const gchar *label);
-
-void gtk_expander_set_expanded (GtkExpander *expander,
- gboolean expanded);
-gboolean gtk_expander_get_expanded (GtkExpander *expander);
-
-/* Spacing between the expander/label and the child */
-void gtk_expander_set_spacing (GtkExpander *expander,
- gint spacing);
-gint gtk_expander_get_spacing (GtkExpander *expander);
-
-void gtk_expander_set_label (GtkExpander *expander,
- const gchar *label);
-G_CONST_RETURN gchar *gtk_expander_get_label (GtkExpander *expander);
-
-void gtk_expander_set_use_underline (GtkExpander *expander,
- gboolean use_underline);
-gboolean gtk_expander_get_use_underline (GtkExpander *expander);
-
-void gtk_expander_set_use_markup (GtkExpander *expander,
- gboolean use_markup);
-gboolean gtk_expander_get_use_markup (GtkExpander *expander);
-
-void gtk_expander_set_label_widget (GtkExpander *expander,
- GtkWidget *label_widget);
-GtkWidget *gtk_expander_get_label_widget (GtkExpander *expander);
-
-G_END_DECLS
-
-#endif /* __GTK_EXPANDER_H__ */
diff -r cc6d733a192a -r c5a7516418c7 pidgin/gtkft.c
--- a/pidgin/gtkft.c Tue Feb 16 15:58:34 2010 +0000
+++ b/pidgin/gtkft.c Thu Feb 18 16:59:04 2010 +0000
@@ -32,10 +32,8 @@
#include "prpl.h"
#include "util.h"
-#include "gtkcellrendererprogress.h"
#include "gtkft.h"
#include "prefs.h"
-#include "gtkexpander.h"
#include "pidginstock.h"
#include "gtkutils.h"
@@ -460,27 +458,15 @@
#ifdef _WIN32
/* If using Win32... */
int code;
- if (G_WIN32_HAVE_WIDECHAR_API ()) {
- wchar_t *wc_filename = g_utf8_to_utf16(
- purple_xfer_get_local_filename(
- dialog->selected_xfer),
- -1, NULL, NULL, NULL);
-
- code = (int) ShellExecuteW(NULL, NULL, wc_filename, NULL, NULL,
- SW_SHOW);
+ wchar_t *wc_filename = g_utf8_to_utf16(
+ purple_xfer_get_local_filename(
+ dialog->selected_xfer),
+ -1, NULL, NULL, NULL);
- g_free(wc_filename);
- } else {
- char *l_filename = g_locale_from_utf8(
- purple_xfer_get_local_filename(
- dialog->selected_xfer),
- -1, NULL, NULL, NULL);
+ code = (int) ShellExecuteW(NULL, NULL, wc_filename, NULL, NULL,
+ SW_SHOW);
- code = (int) ShellExecuteA(NULL, NULL, l_filename, NULL, NULL,
- SW_SHOW);
-
- g_free(l_filename);
- }
+ g_free(wc_filename);
if (code == SE_ERR_ASSOCINCOMPLETE || code == SE_ERR_NOASSOC)
{
@@ -621,7 +607,7 @@
gtk_tree_view_append_column(GTK_TREE_VIEW(tree), column);
/* Progress bar column */
- renderer = pidgin_cell_renderer_progress_new();
+ renderer = gtk_cell_renderer_progress_new();
column = gtk_tree_view_column_new_with_attributes(_("Progress"), renderer,
"percentage", COLUMN_PROGRESS, NULL);
gtk_tree_view_column_set_resizable(GTK_TREE_VIEW_COLUMN(column), TRUE);
diff -r cc6d733a192a -r c5a7516418c7 pidgin/gtkimhtml.c
--- a/pidgin/gtkimhtml.c Tue Feb 16 15:58:34 2010 +0000
+++ b/pidgin/gtkimhtml.c Thu Feb 18 16:59:04 2010 +0000
@@ -63,18 +63,8 @@
#include
-/* GTK+ < 2.4.x hack, see pidgin.h for details. */
-#if (!GTK_CHECK_VERSION(2,4,0))
-#define GTK_WRAP_WORD_CHAR GTK_WRAP_WORD
-#endif
-
#define TOOLTIP_TIMEOUT 500
-/* GTK+ 2.0 hack */
-#if (!GTK_CHECK_VERSION(2,2,0))
-#define gtk_widget_get_clipboard(x, y) gtk_clipboard_get(y)
-#endif
-
static GtkTextViewClass *parent_class = NULL;
struct scalable_data {
@@ -552,10 +542,8 @@
gtk_window_set_title(GTK_WINDOW(imhtml->tip_window), "GtkIMHtml");
gtk_window_set_resizable (GTK_WINDOW (imhtml->tip_window), FALSE);
gtk_widget_set_name (imhtml->tip_window, "gtk-tooltips");
-#if GTK_CHECK_VERSION(2,10,0)
gtk_window_set_type_hint (GTK_WINDOW (imhtml->tip_window),
GDK_WINDOW_TYPE_HINT_TOOLTIP);
-#endif
g_signal_connect_swapped (G_OBJECT (imhtml->tip_window), "expose_event",
G_CALLBACK (gtk_imhtml_tip_paint), imhtml);
@@ -760,32 +748,6 @@
return FALSE;
}
-#if (!GTK_CHECK_VERSION(2,2,0))
-/*
- * XXX - This should be removed eventually.
- *
- * This function exists to work around a gross bug in GtkTextView.
- * Basically, we short circuit ctrl+a and ctrl+end because they make
- * el program go boom.
- *
- * It's supposed to be fixed in gtk2.2. You can view the bug report at
- * http://bugzilla.gnome.org/show_bug.cgi?id=107939
- */
-static gboolean
-gtk_key_pressed_cb(GtkIMHtml *imhtml, GdkEventKey *event, gpointer data)
-{
- if (event->state & GDK_CONTROL_MASK) {
- switch (event->keyval) {
- case 'a':
- case GDK_Home:
- case GDK_End:
- return TRUE;
- }
- }
- return FALSE;
-}
-#endif /* !(GTK+ >= 2.2.0) */
-
static gint
gtk_imhtml_expose_event (GtkWidget *widget,
GdkEventExpose *event)
@@ -1700,10 +1662,6 @@
g_signal_connect(G_OBJECT(imhtml), "motion-notify-event", G_CALLBACK(gtk_motion_event_notify), NULL);
g_signal_connect(G_OBJECT(imhtml), "leave-notify-event", G_CALLBACK(gtk_leave_event_notify), NULL);
g_signal_connect(G_OBJECT(imhtml), "enter-notify-event", G_CALLBACK(gtk_enter_event_notify), NULL);
-#if (!GTK_CHECK_VERSION(2,2,0))
- /* See the comment for gtk_key_pressed_cb */
- g_signal_connect(G_OBJECT(imhtml), "key_press_event", G_CALLBACK(gtk_key_pressed_cb), NULL);
-#endif
g_signal_connect(G_OBJECT(imhtml), "button_press_event", G_CALLBACK(gtk_imhtml_button_press_event), NULL);
g_signal_connect(G_OBJECT(imhtml->text_buffer), "insert-text", G_CALLBACK(preinsert_cb), imhtml);
g_signal_connect(G_OBJECT(imhtml->text_buffer), "delete_range", G_CALLBACK(delete_cb), imhtml);
@@ -2173,70 +2131,61 @@
return (*len > 0);
}
-GtkIMHtmlSmiley *
-gtk_imhtml_smiley_get(GtkIMHtml *imhtml,
- const gchar *sml,
- const gchar *text)
-{
- GtkSmileyTree *t;
+static GtkIMHtmlSmiley *gtk_imhtml_smiley_get_from_tree(GtkSmileyTree *t, const gchar *text)
+{
const gchar *x = text;
- if (sml == NULL)
- t = imhtml->default_smilies;
- else
- t = g_hash_table_lookup(imhtml->smiley_data, sml);
-
+ gchar *pos;
if (t == NULL)
- return sml ? gtk_imhtml_smiley_get(imhtml, NULL, text) : NULL;
+ return NULL;
while (*x) {
- gchar *pos;
-
- if (!t->values) {
- return sml ? gtk_imhtml_smiley_get(imhtml, NULL, text) : NULL;
- }
-
- pos = strchr (t->values->str, *x);
- if (pos) {
- t = t->children [GPOINTER_TO_INT(pos) - GPOINTER_TO_INT(t->values->str)];
- } else {
- return sml ? gtk_imhtml_smiley_get(imhtml, NULL, text) : NULL;
- }
+ if (!t->values)
+ return NULL;
+
+ pos = strchr(t->values->str, *x);
+ if (!pos)
+ return NULL;
+
+ t = t->children[GPOINTER_TO_INT(pos) - GPOINTER_TO_INT(t->values->str)];
x++;
}
return t->image;
}
+GtkIMHtmlSmiley *
+gtk_imhtml_smiley_get(GtkIMHtml *imhtml, const gchar *sml, const gchar *text)
+{
+ GtkIMHtmlSmiley *ret;
+
+ /* Look for custom smileys first */
+ if (sml != NULL) {
+ ret = gtk_imhtml_smiley_get_from_tree(g_hash_table_lookup(imhtml->smiley_data, sml), text);
+ if (ret != NULL)
+ return ret;
+ }
+
+ /* Fall back to check for default smileys */
+ return gtk_imhtml_smiley_get_from_tree(imhtml->default_smilies, text);
+}
+
static GdkPixbufAnimation *
gtk_smiley_get_image(GtkIMHtmlSmiley *smiley)
{
- if (!smiley->icon && smiley->file) {
- smiley->icon = gdk_pixbuf_animation_new_from_file(smiley->file, NULL);
- } else if (!smiley->icon && smiley->loader) {
- smiley->icon = gdk_pixbuf_loader_get_animation(smiley->loader);
- if (smiley->icon)
- g_object_ref(G_OBJECT(smiley->icon));
+ if (!smiley->icon) {
+ if (smiley->file) {
+ smiley->icon = gdk_pixbuf_animation_new_from_file(smiley->file, NULL);
+ } else if (smiley->loader) {
+ smiley->icon = gdk_pixbuf_loader_get_animation(smiley->loader);
+ if (smiley->icon)
+ g_object_ref(G_OBJECT(smiley->icon));
+ }
}
return smiley->icon;
}
-static GdkPixbufAnimation *
-gtk_smiley_tree_image (GtkIMHtml *imhtml,
- const gchar *sml,
- const gchar *text)
-{
- GtkIMHtmlSmiley *smiley;
-
- smiley = gtk_imhtml_smiley_get(imhtml,sml,text);
-
- if (!smiley)
- return NULL;
-
- return gtk_smiley_get_image(smiley);
-}
-
#define VALID_TAG(x) do { \
if (!g_ascii_strncasecmp (string, x ">", strlen (x ">"))) { \
if (tag) *tag = g_strndup (string, strlen (x)); \
@@ -2695,6 +2644,8 @@
ws = g_malloc(len + 1);
ws[0] = '\0';
+ g_object_set_data(G_OBJECT(imhtml), "gtkimhtml_numsmileys_thismsg", GINT_TO_POINTER(0));
+
gtk_text_buffer_begin_user_action(imhtml->text_buffer);
while (pos < len) {
if (*c == '<' && gtk_imhtml_is_tag (c + 1, &tag, &tlen, &type)) {
@@ -3547,6 +3498,8 @@
}
gtk_text_buffer_delete(imhtml->text_buffer, start, end);
+ g_object_set_data(G_OBJECT(imhtml), "gtkimhtml_numsmileys_total", GINT_TO_POINTER(0));
+
g_object_unref(object);
}
@@ -3703,22 +3656,12 @@
image->filesel = NULL;
if (save->data && save->datasize) {
-#if GLIB_CHECK_VERSION(2,8,0)
g_file_set_contents(filename, save->data, save->datasize, &error);
-#else
- purple_util_write_data_to_file_absolute(filename, save->data, save->datasize);
-#endif
} else {
gchar *type = NULL;
-#if GTK_CHECK_VERSION(2,2,0)
GSList *formats = gdk_pixbuf_get_formats();
-#else
- char *basename = g_path_get_basename(filename);
- char *ext = strrchr(basename, '.');
-#endif
char *newfilename;
-#if GTK_CHECK_VERSION(2,2,0)
while (formats) {
GdkPixbufFormat *format = formats->data;
gchar **extensions = gdk_pixbuf_format_get_extensions(format);
@@ -3745,31 +3688,14 @@
}
g_slist_free(formats);
-#else
- /* this is really ugly code, but I think it will work */
- if (ext) {
- ext++;
- if (!g_ascii_strcasecmp(ext, "jpeg") || !g_ascii_strcasecmp(ext, "jpg"))
- type = g_strdup("jpeg");
- else if (!g_ascii_strcasecmp(ext, "png"))
- type = g_strdup("png");
- }
-
- g_free(basename);
-#endif
/* If I can't find a valid type, I will just tell the user about it and then assume
it's a png */
if (!type){
char *basename, *tmp;
char *dirname;
-#if GTK_CHECK_VERSION(2,4,0)
GtkWidget *dialog = gtk_message_dialog_new_with_markup(NULL, 0, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK,
_("Unrecognized file type\n\nDefaulting to PNG."));
-#else
- GtkWidget *dialog = gtk_message_dialog_new(NULL, 0, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK,
- _("Unrecognized file type\n\nDefaulting to PNG."));
-#endif
g_signal_connect_swapped(dialog, "response", G_CALLBACK (gtk_widget_destroy), dialog);
gtk_widget_show(dialog);
@@ -3798,20 +3724,14 @@
}
if (error){
-#if GTK_CHECK_VERSION(2,4,0)
GtkWidget *dialog = gtk_message_dialog_new_with_markup(NULL, 0, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK,
_("Error saving image\n\n%s"), error->message);
-#else
- GtkWidget *dialog = gtk_message_dialog_new(NULL, 0, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK,
- _("Error saving image\n\n%s"), error->message);
-#endif
g_signal_connect_swapped(dialog, "response", G_CALLBACK (gtk_widget_destroy), dialog);
gtk_widget_show(dialog);
g_error_free(error);
}
}
-#if GTK_CHECK_VERSION(2,4,0) /* FILECHOOSER */
static void
image_save_check_if_exists_cb(GtkWidget *widget, gint response, GtkIMHtmlImageSave *save)
{
@@ -3825,32 +3745,6 @@
}
filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(widget));
-#else /* FILECHOOSER */
-static void
-image_save_check_if_exists_cb(GtkWidget *button, GtkIMHtmlImageSave *save)
-{
- gchar *filename;
- GtkIMHtmlImage *image = (GtkIMHtmlImage *)save->image;
-
- filename = g_strdup(gtk_file_selection_get_filename(GTK_FILE_SELECTION(image->filesel)));
-
- if (g_file_test(filename, G_FILE_TEST_IS_DIR)) {
- gchar *dirname;
- /* append a / is needed */
- if (filename[strlen(filename) - 1] != G_DIR_SEPARATOR) {
- dirname = g_strconcat(filename, G_DIR_SEPARATOR_S, NULL);
- } else {
- dirname = g_strdup(filename);
- }
- gtk_file_selection_set_filename(GTK_FILE_SELECTION(image->filesel), dirname);
- g_free(dirname);
- g_free(filename);
- return;
- }
-#endif /* FILECHOOSER */
-#if 0 /* mismatched curly braces */
- }
-#endif
/*
* XXX - We should probably prompt the user to determine if they really
@@ -3868,15 +3762,6 @@
g_free(filename);
}
-#if !GTK_CHECK_VERSION(2,4,0) /* FILECHOOSER */
-static void
-image_save_cancel_cb(GtkIMHtmlImage *image)
-{
- gtk_widget_destroy(image->filesel);
- image->filesel = NULL;
-}
-#endif /* FILECHOOSER */
-
static void
gtk_imhtml_image_save(GtkWidget *w, GtkIMHtmlImageSave *save)
{
@@ -3887,7 +3772,6 @@
return;
}
-#if GTK_CHECK_VERSION(2,4,0) /* FILECHOOSER */
image->filesel = gtk_file_chooser_dialog_new(_("Save Image"),
NULL,
GTK_FILE_CHOOSER_ACTION_SAVE,
@@ -3899,17 +3783,6 @@
gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(image->filesel), image->filename);
g_signal_connect(G_OBJECT(GTK_FILE_CHOOSER(image->filesel)), "response",
G_CALLBACK(image_save_check_if_exists_cb), save);
-#else /* FILECHOOSER */
- image->filesel = gtk_file_selection_new(_("Save Image"));
- if (image->filename != NULL)
- gtk_file_selection_set_filename(GTK_FILE_SELECTION(image->filesel), image->filename);
- g_signal_connect_swapped(G_OBJECT(GTK_FILE_SELECTION(image->filesel)), "delete_event",
- G_CALLBACK(image_save_cancel_cb), image);
- g_signal_connect_swapped(G_OBJECT(GTK_FILE_SELECTION(image->filesel)->cancel_button),
- "clicked", G_CALLBACK(image_save_cancel_cb), image);
- g_signal_connect(G_OBJECT(GTK_FILE_SELECTION(image->filesel)->ok_button), "clicked",
- G_CALLBACK(image_save_check_if_exists_cb), save);
-#endif /* FILECHOOSER */
gtk_widget_show(image->filesel);
}
@@ -4983,12 +4856,33 @@
GdkPixbufAnimation *annipixbuf = NULL;
GtkWidget *icon = NULL;
GtkTextChildAnchor *anchor = NULL;
- char *unescaped = purple_unescape_html(smiley);
- GtkIMHtmlSmiley *imhtml_smiley = gtk_imhtml_smiley_get(imhtml, sml, unescaped);
+ char *unescaped;
+ GtkIMHtmlSmiley *imhtml_smiley;
GtkWidget *ebox = NULL;
+ int numsmileys_thismsg, numsmileys_total;
+
+ /*
+ * This GtkIMHtml has the maximum number of smileys allowed, so don't
+ * add any more. We do this for performance reasons, because smileys
+ * are apparently pretty inefficient. Hopefully we can remove this
+ * restriction when we're using a better HTML widget.
+ */
+ numsmileys_thismsg = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(imhtml), "gtkimhtml_numsmileys_thismsg"));
+ if (numsmileys_thismsg >= 30) {
+ gtk_text_buffer_insert(imhtml->text_buffer, iter, smiley, -1);
+ return;
+ }
+ numsmileys_total = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(imhtml), "gtkimhtml_numsmileys_total"));
+ if (numsmileys_total >= 300) {
+ gtk_text_buffer_insert(imhtml->text_buffer, iter, smiley, -1);
+ return;
+ }
+
+ unescaped = purple_unescape_html(smiley);
+ imhtml_smiley = gtk_imhtml_smiley_get(imhtml, sml, unescaped);
if (imhtml->format_functions & GTK_IMHTML_SMILEY) {
- annipixbuf = gtk_smiley_tree_image(imhtml, sml, unescaped);
+ annipixbuf = imhtml_smiley ? gtk_smiley_get_image(imhtml_smiley) : NULL;
if (annipixbuf) {
if (gdk_pixbuf_animation_is_static_image(annipixbuf)) {
pixbuf = gdk_pixbuf_animation_get_static_image(annipixbuf);
@@ -5020,9 +4914,7 @@
if (imhtml_smiley && imhtml_smiley->flags & GTK_IMHTML_SMILEY_CUSTOM) {
ebox = gtk_event_box_new();
-#if GTK_CHECK_VERSION(2,4,0)
gtk_event_box_set_visible_window(GTK_EVENT_BOX(ebox), FALSE);
-#endif
gtk_widget_show(ebox);
}
@@ -5042,6 +4934,9 @@
if (ebox)
gtk_container_add(GTK_CONTAINER(ebox), icon);
gtk_text_view_add_child_at_anchor(GTK_TEXT_VIEW(imhtml), ebox ? ebox : icon, anchor);
+
+ g_object_set_data(G_OBJECT(imhtml), "gtkimhtml_numsmileys_thismsg", GINT_TO_POINTER(numsmileys_thismsg + 1));
+ g_object_set_data(G_OBJECT(imhtml), "gtkimhtml_numsmileys_total", GINT_TO_POINTER(numsmileys_total + 1));
} else if (imhtml_smiley != NULL && (imhtml->format_functions & GTK_IMHTML_SMILEY)) {
anchor = gtk_text_buffer_create_child_anchor(imhtml->text_buffer, iter);
imhtml_smiley->anchors = g_slist_append(imhtml_smiley->anchors, g_object_ref(anchor));
@@ -5054,6 +4949,9 @@
g_object_set_data_full(G_OBJECT(anchor), "gtkimhtml_htmltext", g_strdup(smiley), g_free);
gtk_text_view_add_child_at_anchor(GTK_TEXT_VIEW(imhtml), ebox, anchor);
}
+
+ g_object_set_data(G_OBJECT(imhtml), "gtkimhtml_numsmileys_thismsg", GINT_TO_POINTER(numsmileys_thismsg + 1));
+ g_object_set_data(G_OBJECT(imhtml), "gtkimhtml_numsmileys_total", GINT_TO_POINTER(numsmileys_total + 1));
} else {
gtk_text_buffer_insert(imhtml->text_buffer, iter, smiley, -1);
}
diff -r cc6d733a192a -r c5a7516418c7 pidgin/gtkimhtmltoolbar.c
--- a/pidgin/gtkimhtmltoolbar.c Tue Feb 16 15:58:34 2010 +0000
+++ b/pidgin/gtkimhtmltoolbar.c Thu Feb 18 16:59:04 2010 +0000
@@ -33,6 +33,7 @@
#include "request.h"
#include "pidginstock.h"
#include "util.h"
+#include "debug.h"
#include "gtkdialogs.h"
#include "gtkimhtmltoolbar.h"
@@ -478,35 +479,19 @@
GtkTextIter iter;
GtkTextMark *ins;
-#if GTK_CHECK_VERSION(2,4,0) /* FILECHOOSER */
if (response != GTK_RESPONSE_ACCEPT)
-#else /* FILECHOOSER */
- if (response != GTK_RESPONSE_OK)
-#endif /* FILECHOOSER */
{
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toolbar->image), FALSE);
return;
}
-#if GTK_CHECK_VERSION(2,4,0) /* FILECHOOSER */
filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(widget));
-#else /* FILECHOOSER */
- filename = g_strdup(gtk_file_selection_get_filename(GTK_FILE_SELECTION(widget)));
-#endif /* FILECHOOSER */
if (filename == NULL) {
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toolbar->image), FALSE);
return;
}
-#if !GTK_CHECK_VERSION(2,4,0) /* FILECHOOSER */
- if (pidgin_check_if_dir(filename, GTK_FILE_SELECTION(widget))) {
- g_free(filename);
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toolbar->image), FALSE);
- return;
- }
-#endif /* FILECHOOSER */
-
/* The following triggers a callback that closes the widget */
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toolbar->image), FALSE);
@@ -549,7 +534,6 @@
GtkWidget *window;
if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(toolbar->image))) {
-#if GTK_CHECK_VERSION(2,4,0) /* FILECHOOSER */
window = gtk_file_chooser_dialog_new(_("Insert Image"),
NULL,
GTK_FILE_CHOOSER_ACTION_OPEN,
@@ -559,12 +543,6 @@
gtk_dialog_set_default_response(GTK_DIALOG(window), GTK_RESPONSE_ACCEPT);
g_signal_connect(G_OBJECT(GTK_FILE_CHOOSER(window)),
"response", G_CALLBACK(do_insert_image_cb), toolbar);
-#else /* FILECHOOSER */
- window = gtk_file_selection_new(_("Insert Image"));
- gtk_dialog_set_default_response(GTK_DIALOG(window), GTK_RESPONSE_OK);
- g_signal_connect(G_OBJECT(GTK_FILE_SELECTION(window)),
- "response", G_CALLBACK(do_insert_image_cb), toolbar);
-#endif /* FILECHOOSER */
gtk_widget_show(window);
toolbar->image_dialog = window;
@@ -921,6 +899,17 @@
gtk_widget_grab_focus(toolbar->imhtml);
}
+static void send_attention_cb(GtkWidget *attention, GtkIMHtmlToolbar *toolbar)
+{
+ PurpleConversation *conv =
+ g_object_get_data(G_OBJECT(toolbar), "active_conv");
+ const gchar *who = purple_conversation_get_name(conv);
+ PurpleConnection *gc = purple_conversation_get_gc(conv);
+
+ toggle_button_set_active_block(GTK_TOGGLE_BUTTON(attention), FALSE, toolbar);
+ purple_prpl_send_attention(gc, who, 0);
+}
+
static void update_buttons_cb(GtkIMHtml *imhtml, GtkIMHtmlButtons buttons, GtkIMHtmlToolbar *toolbar)
{
gtk_widget_set_sensitive(GTK_WIDGET(toolbar->bold), buttons & GTK_IMHTML_BOLD);
@@ -1241,6 +1230,8 @@
{PIDGIN_STOCK_TOOLBAR_INSERT_LINK, insert_link_cb, &toolbar->link, _("Insert Link")},
{"", NULL, NULL, NULL},
{PIDGIN_STOCK_TOOLBAR_SMILEY, insert_smiley_cb, &toolbar->smiley, _("Insert Smiley")},
+ /*{PIDGIN_STOCK_TOOLBAR_SEND_ATTENTION, send_attention_cb,
+ g_object_get_data(G_OBJECT(toolbar->imhtml), "attention"), _("Send Attention")},*/
{NULL, NULL, NULL, NULL}
};
int iter;
@@ -1258,6 +1249,13 @@
button = gtk_vseparator_new();
gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0);
}
+ /* create the attention button (this is a bit hacky to not break ABI) */
+ button = pidgin_pixbuf_toolbar_button_from_stock(PIDGIN_STOCK_TOOLBAR_SEND_ATTENTION);
+ g_signal_connect(G_OBJECT(button), "clicked",
+ G_CALLBACK(send_attention_cb), toolbar);
+ g_object_set_data(G_OBJECT(toolbar), "attention", button);
+ gtk_tooltips_set_tip(toolbar->tooltips, button, _("Send Attention"), NULL);
+ gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(toolbar), hbox, FALSE, FALSE, 0);
g_object_set_data(G_OBJECT(toolbar), "wide-view", hbox);
@@ -1306,6 +1304,7 @@
GtkWidget *insert_button;
GtkWidget *font_button;
GtkWidget *smiley_button;
+ GtkWidget *attention_button;
GtkWidget *font_menu;
GtkWidget *insert_menu;
GtkWidget *menuitem;
@@ -1447,6 +1446,35 @@
g_signal_connect_swapped(G_OBJECT(smiley_button), "clicked", G_CALLBACK(gtk_button_clicked), toolbar->smiley);
gtk_widget_show_all(smiley_button);
+ /* Sep */
+ sep = gtk_vseparator_new();
+ gtk_box_pack_start(GTK_BOX(box), sep, FALSE, FALSE, 0);
+ gtk_widget_show_all(sep);
+
+ /* Attention */
+ attention_button = gtk_button_new();
+ gtk_button_set_relief(GTK_BUTTON(attention_button), GTK_RELIEF_NONE);
+ bbox = gtk_hbox_new(FALSE, 3);
+ gtk_container_add(GTK_CONTAINER(attention_button), bbox);
+ image = gtk_image_new_from_stock(PIDGIN_STOCK_TOOLBAR_SEND_ATTENTION,
+ gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_EXTRA_SMALL));
+ gtk_box_pack_start(GTK_BOX(bbox), image, FALSE, FALSE, 0);
+ label = gtk_label_new_with_mnemonic(_("_Attention!"));
+ gtk_box_pack_start(GTK_BOX(bbox), label, FALSE, FALSE, 0);
+ gtk_box_pack_start(GTK_BOX(box), attention_button, FALSE, FALSE, 0);
+ g_signal_connect_swapped(G_OBJECT(attention_button), "clicked",
+ G_CALLBACK(gtk_button_clicked),
+ g_object_get_data(G_OBJECT(toolbar), "attention"));
+ gtk_widget_show_all(attention_button);
+
+ g_signal_connect(G_OBJECT(g_object_get_data(G_OBJECT(toolbar), "attention")),
+ "notify::sensitive",
+ G_CALLBACK(button_sensitiveness_changed), attention_button);
+
+ /* set attention button to be greyed out until we get a conversation */
+ gtk_widget_set_sensitive(g_object_get_data(G_OBJECT(toolbar), "attention"),
+ FALSE);
+
gtk_box_pack_start(GTK_BOX(hbox), box, FALSE, FALSE, 0);
g_object_set_data(G_OBJECT(hbox), "lean-view", box);
gtk_widget_show(box);
@@ -1457,9 +1485,7 @@
G_CALLBACK(purple_prefs_trigger_callback), PIDGIN_PREFS_ROOT "/conversations/toolbar/wide",
NULL, G_CONNECT_AFTER | G_CONNECT_SWAPPED);
-#if GTK_CHECK_VERSION(2,4,0)
gtk_event_box_set_visible_window(GTK_EVENT_BOX(event), FALSE);
-#endif
gtk_widget_add_events(event, GDK_BUTTON_PRESS_MASK);
gtk_box_pack_start(GTK_BOX(hbox), event, TRUE, TRUE, 0);
@@ -1524,3 +1550,21 @@
g_free(toolbar->sml);
toolbar->sml = g_strdup(proto_id);
}
+
+void gtk_imhtmltoolbar_switch_active_conversation(GtkIMHtmlToolbar *toolbar,
+ PurpleConversation *conv)
+{
+ PurpleConnection *gc = purple_conversation_get_gc(conv);
+ PurplePlugin *prpl = purple_connection_get_prpl(gc);
+ GtkWidget *attention =
+ g_object_get_data(G_OBJECT(toolbar), "attention");
+
+ g_object_set_data(G_OBJECT(toolbar), "active_conv", conv);
+
+ /* gray out attention button on protocols that don't support it
+ for the time being it is always disabled for chats */
+ gtk_widget_set_sensitive(attention,
+ conv && prpl && purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_IM &&
+ PURPLE_PLUGIN_PROTOCOL_INFO(prpl)->send_attention != NULL);
+}
+
diff -r cc6d733a192a -r c5a7516418c7 pidgin/gtkimhtmltoolbar.h
--- a/pidgin/gtkimhtmltoolbar.h Tue Feb 16 15:58:34 2010 +0000
+++ b/pidgin/gtkimhtmltoolbar.h Thu Feb 18 16:59:04 2010 +0000
@@ -90,6 +90,11 @@
void gtk_imhtmltoolbar_attach (GtkIMHtmlToolbar *toolbar, GtkWidget *imhtml);
void gtk_imhtmltoolbar_associate_smileys (GtkIMHtmlToolbar *toolbar, const char *proto_id);
+/**
+ * @since 2.7.0
+ */
+void gtk_imhtmltoolbar_switch_active_conversation(GtkIMHtmlToolbar *toolbar,
+ PurpleConversation *conv);
#ifdef __cplusplus
}
diff -r cc6d733a192a -r c5a7516418c7 pidgin/gtklog.c
--- a/pidgin/gtklog.c Tue Feb 16 15:58:34 2010 +0000
+++ b/pidgin/gtklog.c Thu Feb 18 16:59:04 2010 +0000
@@ -252,7 +252,6 @@
GtkTreePath *path = gtk_tree_model_get_path(GTK_TREE_MODEL(treestore), iter);
gboolean first = !gtk_tree_path_prev(path);
-#if GTK_CHECK_VERSION(2,2,0)
if (!gtk_tree_store_remove(treestore, iter) && first)
{
/* iter was the last child at its level */
@@ -263,9 +262,7 @@
gtk_tree_store_remove(treestore, iter);
}
}
-#else
- gtk_tree_store_remove(treestore, iter);
-#endif
+
gtk_tree_path_free(path);
}
diff -r cc6d733a192a -r c5a7516418c7 pidgin/gtkmain.c
--- a/pidgin/gtkmain.c Tue Feb 16 15:58:34 2010 +0000
+++ b/pidgin/gtkmain.c Thu Feb 18 16:59:04 2010 +0000
@@ -805,9 +805,7 @@
return 1;
}
-#if GLIB_CHECK_VERSION(2,2,0)
g_set_application_name(PIDGIN_NAME);
-#endif /* glib-2.0 >= 2.2.0 */
#ifdef _WIN32
winpidgin_init(hint);
diff -r cc6d733a192a -r c5a7516418c7 pidgin/gtkmenutray.c
--- a/pidgin/gtkmenutray.c Tue Feb 16 15:58:34 2010 +0000
+++ b/pidgin/gtkmenutray.c Thu Feb 18 16:59:04 2010 +0000
@@ -138,9 +138,7 @@
static void
pidgin_menu_tray_init(PidginMenuTray *menu_tray) {
GtkWidget *widget = GTK_WIDGET(menu_tray);
-#if GTK_CHECK_VERSION(2,2,0)
GtkSettings *settings;
-#endif
gint height = -1;
gtk_menu_item_set_right_justified(GTK_MENU_ITEM(menu_tray), TRUE);
@@ -148,15 +146,11 @@
if(!GTK_IS_WIDGET(menu_tray->tray))
menu_tray->tray = gtk_hbox_new(FALSE, 0);
-#if GTK_CHECK_VERSION(2,2,0)
settings =
gtk_settings_get_for_screen(gtk_widget_get_screen(widget));
if(gtk_icon_size_lookup_for_settings(settings, GTK_ICON_SIZE_MENU,
NULL, &height))
-#else
- if(gtk_icon_size_lookup(GTK_ICON_SIZE_MENU, NULL, &height))
-#endif
{
gtk_widget_set_size_request(widget, -1, height);
}
diff -r cc6d733a192a -r c5a7516418c7 pidgin/gtknotify.c
--- a/pidgin/gtknotify.c Tue Feb 16 15:58:34 2010 +0000
+++ b/pidgin/gtknotify.c Thu Feb 18 16:59:04 2010 +0000
@@ -627,12 +627,7 @@
PIDGIN_MAIL_DATA, &data, -1);
if (data && data->account == account) {
if (clear) {
-#if GTK_CHECK_VERSION(2,2,0)
advanced = gtk_tree_store_remove(treemodel, &iter);
-#else
- gtk_tree_store_remove(treemodel, &iter);
- advanced = (iter.stamp == 0) ? FALSE : TRUE;
-#endif
mail_dialog->total_count -= data->count;
if (data->purple_has_handle)
diff -r cc6d733a192a -r c5a7516418c7 pidgin/gtkplugin.c
--- a/pidgin/gtkplugin.c Tue Feb 16 15:58:34 2010 +0000
+++ b/pidgin/gtkplugin.c Thu Feb 18 16:59:04 2010 +0000
@@ -670,15 +670,11 @@
gtk_misc_set_alignment(GTK_MISC(label), 0, 0);
website_button = gtk_event_box_new();
-#if GTK_CHECK_VERSION(2,4,0)
gtk_event_box_set_visible_window(GTK_EVENT_BOX(website_button), FALSE);
-#endif
plugin_website = GTK_LABEL(gtk_label_new(NULL));
-#if GTK_CHECK_VERSION(2,6,0)
g_object_set(G_OBJECT(plugin_website),
"ellipsize", PANGO_ELLIPSIZE_MIDDLE, NULL);
-#endif
gtk_misc_set_alignment(GTK_MISC(plugin_website), 0, 0);
gtk_container_add(GTK_CONTAINER(website_button),
GTK_WIDGET(plugin_website));
@@ -778,10 +774,8 @@
"markup", 1,
"foreground-set", 3,
NULL);
-#if GTK_CHECK_VERSION(2,6,0)
gtk_tree_view_column_set_expand (col, TRUE);
g_object_set(rendt, "ellipsize", PANGO_ELLIPSIZE_END, NULL);
-#endif
gtk_tree_view_append_column (GTK_TREE_VIEW(event_view), col);
gtk_tree_view_column_set_sort_column_id(col, 1);
g_object_unref(G_OBJECT(ls));
diff -r cc6d733a192a -r c5a7516418c7 pidgin/gtkpounce.c
--- a/pidgin/gtkpounce.c Tue Feb 16 15:58:34 2010 +0000
+++ b/pidgin/gtkpounce.c Thu Feb 18 16:59:04 2010 +0000
@@ -1063,15 +1063,6 @@
return FALSE;
}
-#if !GTK_CHECK_VERSION(2,2,0)
-static void
-count_selected_helper(GtkTreeModel *model, GtkTreePath *path,
- GtkTreeIter *iter, gpointer user_data)
-{
- (*(gint *)user_data)++;
-}
-#endif
-
static void
pounces_manager_connection_cb(PurpleConnection *gc, GtkWidget *add_button)
{
@@ -1163,11 +1154,7 @@
PouncesManager *dialog = user_data;
int num_selected = 0;
-#if GTK_CHECK_VERSION(2,2,0)
num_selected = gtk_tree_selection_count_selected_rows(sel);
-#else
- gtk_tree_selection_selected_foreach(sel, count_selected_helper, &num_selected);
-#endif
gtk_widget_set_sensitive(dialog->modify_button, (num_selected > 0));
gtk_widget_set_sensitive(dialog->delete_button, (num_selected > 0));
diff -r cc6d733a192a -r c5a7516418c7 pidgin/gtkprefs.c
--- a/pidgin/gtkprefs.c Tue Feb 16 15:58:34 2010 +0000
+++ b/pidgin/gtkprefs.c Thu Feb 18 16:59:04 2010 +0000
@@ -900,11 +900,9 @@
gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(combo_box), cell_rend, "pixbuf", 0, NULL);
cell_rend = gtk_cell_renderer_text_new();
- gtk_cell_layout_pack_start(GTK_CELL_LAYOUT (combo_box), cell_rend, FALSE);
+ gtk_cell_layout_pack_start(GTK_CELL_LAYOUT (combo_box), cell_rend, TRUE);
gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(combo_box), cell_rend, "markup", 1, NULL);
- /* TODO: We need to force a size or something, or each theme dropdown ends
- up as just "..." */
-#if 0 && GTK_CHECK_VERSION(2,6,0)
+#if GTK_CHECK_VERSION(2,6,0)
g_object_set(cell_rend, "ellipsize", PANGO_ELLIPSIZE_END, NULL);
#endif
@@ -1084,7 +1082,7 @@
g_signal_connect(G_OBJECT(prefs_blist_themes_combo_box), "changed",
(GCallback)prefs_set_blist_theme_cb, NULL);
gtk_size_group_add_widget(combo_sg, prefs_blist_themes_combo_box);
- gtk_box_pack_start(GTK_BOX(themesel_hbox), prefs_blist_themes_combo_box, FALSE, FALSE, 0);
+ gtk_box_pack_start(GTK_BOX(themesel_hbox), prefs_blist_themes_combo_box, TRUE, TRUE, 0);
gtk_box_pack_start(GTK_BOX(vbox), themesel_hbox, FALSE, FALSE, 0);
@@ -1102,7 +1100,7 @@
g_signal_connect(G_OBJECT(prefs_status_themes_combo_box), "changed",
(GCallback)prefs_set_status_icon_theme_cb, NULL);
gtk_size_group_add_widget(combo_sg, prefs_status_themes_combo_box);
- gtk_box_pack_start(GTK_BOX(themesel_hbox), prefs_status_themes_combo_box, FALSE, FALSE, 0);
+ gtk_box_pack_start(GTK_BOX(themesel_hbox), prefs_status_themes_combo_box, TRUE, TRUE, 0);
gtk_box_pack_start(GTK_BOX(vbox), themesel_hbox, FALSE, FALSE, 0);
@@ -1120,7 +1118,7 @@
g_signal_connect(G_OBJECT(prefs_sound_themes_combo_box), "changed",
(GCallback)prefs_set_sound_theme_cb, NULL);
gtk_size_group_add_widget(combo_sg, prefs_sound_themes_combo_box);
- gtk_box_pack_start(GTK_BOX(themesel_hbox), prefs_sound_themes_combo_box, FALSE, FALSE, 0);
+ gtk_box_pack_start(GTK_BOX(themesel_hbox), prefs_sound_themes_combo_box, TRUE, TRUE, 0);
gtk_box_pack_start(GTK_BOX(vbox), themesel_hbox, FALSE, FALSE, 0);
@@ -1138,7 +1136,7 @@
g_signal_connect(G_OBJECT(prefs_smiley_themes_combo_box), "changed",
(GCallback)prefs_set_smiley_theme_cb, NULL);
gtk_size_group_add_widget(combo_sg, prefs_smiley_themes_combo_box);
- gtk_box_pack_start(GTK_BOX(themesel_hbox), prefs_smiley_themes_combo_box, FALSE, FALSE, 0);
+ gtk_box_pack_start(GTK_BOX(themesel_hbox), prefs_smiley_themes_combo_box, TRUE, TRUE, 0);
gtk_box_pack_start(GTK_BOX(vbox), themesel_hbox, FALSE, FALSE, 0);
@@ -1413,10 +1411,8 @@
_("Bottom"), GTK_POS_BOTTOM,
_("Left"), GTK_POS_LEFT,
_("Right"), GTK_POS_RIGHT,
-#if GTK_CHECK_VERSION(2,6,0)
_("Left Vertical"), GTK_POS_LEFT|8,
_("Right Vertical"), GTK_POS_RIGHT|8,
-#endif
NULL);
gtk_size_group_add_widget(sg, label);
gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
@@ -1511,7 +1507,7 @@
PIDGIN_PREFS_ROOT "/conversations/minimum_entry_lines",
1, 8, NULL);
-#if GTK_CHECK_VERSION(2,4,0) && defined _WIN32
+#ifdef _WIN32
{
GtkWidget *fontpref, *font_button, *hbox;
const char *font_name;
@@ -2723,12 +2719,7 @@
static int
prefs_notebook_add_page(const char *text, GtkWidget *page, int ind)
{
-#if GTK_CHECK_VERSION(2,4,0)
return gtk_notebook_append_page(GTK_NOTEBOOK(prefsnotebook), page, gtk_label_new(text));
-#else
- gtk_notebook_append_page(GTK_NOTEBOOK(prefsnotebook), page, gtk_label_new(text));
- return gtk_notebook_page_num(GTK_NOTEBOOK(prefsnotebook), page);
-#endif
}
static void
diff -r cc6d733a192a -r c5a7516418c7 pidgin/gtkrequest.c
--- a/pidgin/gtkrequest.c Tue Feb 16 15:58:34 2010 +0000
+++ b/pidgin/gtkrequest.c Thu Feb 18 16:59:04 2010 +0000
@@ -626,9 +626,7 @@
/* Create the dialog. */
data->dialog = dialog = gtk_dialog_new();
-#if GTK_CHECK_VERSION(2,10,0)
gtk_window_set_deletable(GTK_WINDOW(data->dialog), FALSE);
-#endif
if (title != NULL)
gtk_window_set_title(GTK_WINDOW(dialog), title);
@@ -1503,7 +1501,6 @@
}
}
-#if GTK_CHECK_VERSION(2,4,0) /* FILECHOOSER */
static void
file_ok_check_if_exists_cb(GtkWidget *widget, gint response, PidginRequestData *data)
{
@@ -1528,51 +1525,6 @@
}
g_free(current_folder);
}
-
-#else /* FILECHOOSER */
-
-static void
-file_ok_check_if_exists_cb(GtkWidget *button, PidginRequestData *data)
-{
- const gchar *name;
- gchar *current_folder;
-
- generic_response_start(data);
-
- name = gtk_file_selection_get_filename(GTK_FILE_SELECTION(data->dialog));
-
- /* If name is a directory then change directories */
- if (data->type == PURPLE_REQUEST_FILE) {
- if (pidgin_check_if_dir(name, GTK_FILE_SELECTION(data->dialog)))
- return;
- }
-
- current_folder = g_path_get_dirname(name);
-
- g_free(data->u.file.name);
- if (data->type == PURPLE_REQUEST_FILE)
- data->u.file.name = g_strdup(name);
- else
- {
- if (g_file_test(name, G_FILE_TEST_IS_DIR))
- data->u.file.name = g_strdup(name);
- else
- data->u.file.name = g_strdup(current_folder);
- }
-
- if (current_folder != NULL) {
- if (data->u.file.savedialog) {
- purple_prefs_set_path(PIDGIN_PREFS_ROOT "/filelocations/last_save_folder", current_folder);
- } else {
- purple_prefs_set_path(PIDGIN_PREFS_ROOT "/filelocations/last_open_folder", current_folder);
- }
- g_free(current_folder);
- }
-
-#endif /* FILECHOOSER */
-#if 0 /* mismatched curly braces */
- }
-#endif
if ((data->u.file.savedialog == TRUE) &&
(g_file_test(data->u.file.name, G_FILE_TEST_EXISTS))) {
purple_request_action(data, NULL, _("That file already exists"),
@@ -1585,20 +1537,6 @@
file_yes_no_cb(data, 1);
}
-#if !GTK_CHECK_VERSION(2,4,0) /* FILECHOOSER */
-static gboolean
-file_cancel_cb(PidginRequestData *data)
-{
- generic_response_start(data);
-
- if (data->cbs[0] != NULL)
- ((PurpleRequestFileCb)data->cbs[0])(data->user_data, NULL);
-
- purple_request_close(data->type, data);
- return FALSE;
-}
-#endif /* FILECHOOSER */
-
static void *
pidgin_request_file(const char *title, const char *filename,
gboolean savedialog,
@@ -1609,9 +1547,7 @@
PidginRequestData *data;
GtkWidget *filesel;
const gchar *current_folder;
-#if GTK_CHECK_VERSION(2,4,0)
gboolean folder_set = FALSE;
-#endif
data = g_new0(PidginRequestData, 1);
data->type = PURPLE_REQUEST_FILE;
@@ -1622,7 +1558,6 @@
data->cbs[1] = ok_cb;
data->u.file.savedialog = savedialog;
-#if GTK_CHECK_VERSION(2,4,0) /* FILECHOOSER */
filesel = gtk_file_chooser_dialog_new(
title ? title : (savedialog ? _("Save File...")
: _("Open File...")),
@@ -1668,30 +1603,6 @@
#endif
g_signal_connect(G_OBJECT(GTK_FILE_CHOOSER(filesel)), "response",
G_CALLBACK(file_ok_check_if_exists_cb), data);
-#else /* FILECHOOSER */
- filesel = gtk_file_selection_new(
- title ? title : (savedialog ? _("Save File...")
- : _("Open File...")));
- if (savedialog) {
- current_folder = purple_prefs_get_path(PIDGIN_PREFS_ROOT "/filelocations/last_save_folder");
- } else {
- current_folder = purple_prefs_get_path(PIDGIN_PREFS_ROOT "/filelocations/last_open_folder");
- }
- if (current_folder != NULL) {
- gchar *path = g_strdup_printf("%s%s", current_folder, G_DIR_SEPARATOR_S);
- gtk_file_selection_set_filename(GTK_FILE_SELECTION(filesel), path);
- g_free(path);
- }
- if (filename != NULL)
- gtk_file_selection_set_filename(GTK_FILE_SELECTION(filesel), filename);
-
- g_signal_connect_swapped(G_OBJECT(GTK_FILE_SELECTION(filesel)), "delete_event",
- G_CALLBACK(file_cancel_cb), data);
- g_signal_connect_swapped(G_OBJECT(GTK_FILE_SELECTION(filesel)->cancel_button),
- "clicked", G_CALLBACK(file_cancel_cb), data);
- g_signal_connect(G_OBJECT(GTK_FILE_SELECTION(filesel)->ok_button), "clicked",
- G_CALLBACK(file_ok_check_if_exists_cb), data);
-#endif /* FILECHOOSER */
pidgin_auto_parent_window(filesel);
@@ -1719,7 +1630,6 @@
data->cbs[1] = ok_cb;
data->u.file.savedialog = FALSE;
-#if GTK_CHECK_VERSION(2,4,0) /* FILECHOOSER */
dirsel = gtk_file_chooser_dialog_new(
title ? title : _("Select Folder..."),
NULL,
@@ -1734,16 +1644,6 @@
g_signal_connect(G_OBJECT(GTK_FILE_CHOOSER(dirsel)), "response",
G_CALLBACK(file_ok_check_if_exists_cb), data);
-#else
- dirsel = gtk_file_selection_new(title ? title : _("Select Folder..."));
-
- g_signal_connect_swapped(G_OBJECT(dirsel), "delete_event",
- G_CALLBACK(file_cancel_cb), data);
- g_signal_connect_swapped(G_OBJECT(GTK_FILE_SELECTION(dirsel)->cancel_button),
- "clicked", G_CALLBACK(file_cancel_cb), data);
- g_signal_connect(G_OBJECT(GTK_FILE_SELECTION(dirsel)->ok_button), "clicked",
- G_CALLBACK(file_ok_check_if_exists_cb), data);
-#endif
data->dialog = dirsel;
pidgin_auto_parent_window(dirsel);
diff -r cc6d733a192a -r c5a7516418c7 pidgin/gtksavedstatuses.c
--- a/pidgin/gtksavedstatuses.c Tue Feb 16 15:58:34 2010 +0000
+++ b/pidgin/gtksavedstatuses.c Thu Feb 18 16:59:04 2010 +0000
@@ -34,7 +34,6 @@
#include "util.h"
#include "gtkblist.h"
-#include "gtkexpander.h"
#include "pidgin.h"
#include "gtkimhtml.h"
#include "gtkimhtmltoolbar.h"
@@ -180,23 +179,6 @@
return FALSE;
}
-#if !GTK_CHECK_VERSION(2,2,0)
-static void
-count_selected_helper(GtkTreeModel *model, GtkTreePath *path,
- GtkTreeIter *iter, gpointer user_data)
-{
- (*(gint *)user_data)++;
-}
-
-static void
-list_selected_helper(GtkTreeModel *model, GtkTreePath *path,
- GtkTreeIter *iter, gpointer user_data)
-{
- GList **list = (GList **)user_data;
- *list = g_list_append(*list, gtk_tree_path_copy(path));
-}
-#endif
-
static void
status_window_use_cb(GtkButton *button, StatusWindow *dialog)
{
@@ -207,11 +189,7 @@
selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(dialog->treeview));
-#if GTK_CHECK_VERSION(2,2,0)
num_selected = gtk_tree_selection_count_selected_rows(selection);
-#else
- gtk_tree_selection_selected_foreach(selection, count_selected_helper, &num_selected);
-#endif
if (num_selected != 1)
/*
* This shouldn't happen because the "Use" button should have
@@ -219,11 +197,7 @@
*/
return;
-#if GTK_CHECK_VERSION(2,2,0)
list = gtk_tree_selection_get_selected_rows(selection, NULL);
-#else
- gtk_tree_selection_selected_foreach(selection, list_selected_helper, &list);
-#endif
if (gtk_tree_model_get_iter(GTK_TREE_MODEL(dialog->model),
&iter, list->data))
@@ -311,11 +285,7 @@
gpointer handle;
selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(dialog->treeview));
-#if GTK_CHECK_VERSION(2,2,0)
sel_paths = gtk_tree_selection_get_selected_rows(selection, NULL);
-#else
- gtk_tree_selection_selected_foreach(selection, list_selected_helper, &sel_paths);
-#endif
/* This is ugly because we're not allowed to modify the model from within
* gtk_tree_selection_selected_foreach() and the GtkTreePaths can become invalid
@@ -365,11 +335,7 @@
int num_selected;
GtkTreeModel *model = GTK_TREE_MODEL(dialog->model);
-#if GTK_CHECK_VERSION(2,2,0)
sel_paths = gtk_tree_selection_get_selected_rows(sel, NULL);
-#else
- gtk_tree_selection_selected_foreach(sel, list_selected_helper, &sel_paths);
-#endif
for (tmp = sel_paths, num_selected = 0; tmp; tmp = tmp->next, num_selected++) {
GtkTreeIter iter;
@@ -521,9 +487,7 @@
gtk_tree_view_column_pack_start(column, renderer, TRUE);
gtk_tree_view_column_add_attribute(column, renderer, "text",
STATUS_WINDOW_COLUMN_TITLE);
-#if GTK_CHECK_VERSION(2,6,0)
g_object_set(renderer, "ellipsize", PANGO_ELLIPSIZE_END, NULL);
-#endif
column = gtk_tree_view_column_new();
gtk_tree_view_column_set_title(column, _("Type"));
@@ -550,9 +514,7 @@
gtk_tree_view_column_pack_start(column, renderer, TRUE);
gtk_tree_view_column_add_attribute(column, renderer, "text",
STATUS_WINDOW_COLUMN_MESSAGE);
-#if GTK_CHECK_VERSION(2,6,0)
g_object_set(renderer, "ellipsize", PANGO_ELLIPSIZE_END, NULL);
-#endif
/* Enable CTRL+F searching */
gtk_tree_view_set_search_column(GTK_TREE_VIEW(treeview), STATUS_WINDOW_COLUMN_TITLE);
@@ -1862,9 +1824,7 @@
g_object_set(G_OBJECT(icon_rend),
"stock-size", gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_EXTRA_SMALL),
NULL);
-#if GTK_CHECK_VERSION(2,6,0)
g_object_set(text_rend, "ellipsize", PANGO_ELLIPSIZE_END, NULL);
-#endif
gtk_combo_box_set_active(GTK_COMBO_BOX(combobox), index);
g_signal_connect(G_OBJECT(combobox), "changed", G_CALLBACK(status_menu_cb), callback);
diff -r cc6d733a192a -r c5a7516418c7 pidgin/gtkscrollbook.c
--- a/pidgin/gtkscrollbook.c Tue Feb 16 15:58:34 2010 +0000
+++ b/pidgin/gtkscrollbook.c Thu Feb 18 16:59:04 2010 +0000
@@ -80,11 +80,7 @@
{
int index, count;
index = gtk_notebook_get_current_page(GTK_NOTEBOOK(scroll_book->notebook));
-#if GTK_CHECK_VERSION(2,2,0)
count = gtk_notebook_get_n_pages(GTK_NOTEBOOK(scroll_book->notebook));
-#else
- count = g_list_length(GTK_NOTEBOOK(scroll_book->notebook)->children);
-#endif
if (index + 1 < count)
gtk_notebook_set_current_page(GTK_NOTEBOOK(scroll_book->notebook), index + 1);
@@ -130,11 +126,7 @@
{
int count;
int index = gtk_notebook_get_current_page(GTK_NOTEBOOK(scroll_book->notebook));
-#if GTK_CHECK_VERSION(2,2,0)
count = gtk_notebook_get_n_pages(GTK_NOTEBOOK(scroll_book->notebook));
-#else
- count = g_list_length(GTK_NOTEBOOK(scroll_book->notebook)->children);
-#endif
refresh_scroll_box(scroll_book, index, count);
}
@@ -149,11 +141,7 @@
switch_page_cb(GtkNotebook *notebook, GtkNotebookPage *page, guint page_num, PidginScrollBook *scroll_book)
{
int count;
-#if GTK_CHECK_VERSION(2,2,0)
count = gtk_notebook_get_n_pages(GTK_NOTEBOOK(scroll_book->notebook));
-#else
- count = g_list_length(GTK_NOTEBOOK(scroll_book->notebook)->children);
-#endif
refresh_scroll_box(scroll_book, page_num, count);
}
@@ -268,9 +256,7 @@
/* Close */
eb = gtk_event_box_new();
gtk_box_pack_end(GTK_BOX(scroll_book->hbox), eb, FALSE, FALSE, 0);
-#if GTK_CHECK_VERSION(2,4,0)
gtk_event_box_set_visible_window(GTK_EVENT_BOX(eb), FALSE);
-#endif
gtk_widget_set_events(eb, GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK);
close_button = gtk_label_new("×");
g_signal_connect(G_OBJECT(eb), "enter-notify-event", G_CALLBACK(close_button_entered_cb), close_button);
diff -r cc6d733a192a -r c5a7516418c7 pidgin/gtksession.c
--- a/pidgin/gtksession.c Tue Feb 16 15:58:34 2010 +0000
+++ b/pidgin/gtksession.c Thu Feb 18 16:59:04 2010 +0000
@@ -163,10 +163,8 @@
ret[j++] = g_strdup(config_dir);
}
-#if GTK_CHECK_VERSION(2,2,0)
ret[j++] = g_strdup("--display");
ret[j++] = g_strdup((gchar *)gdk_display_get_name(gdk_display_get_default()));
-#endif
ret[j++] = NULL;
diff -r cc6d733a192a -r c5a7516418c7 pidgin/gtksound.c
--- a/pidgin/gtksound.c Tue Feb 16 15:58:34 2010 +0000
+++ b/pidgin/gtksound.c Thu Feb 18 16:59:04 2010 +0000
@@ -72,7 +72,8 @@
{N_("Others talk in chat"), "chat_msg_recv", "receive.wav"},
/* this isn't a terminator, it's the buddy pounce default sound event ;-) */
{NULL, "pounce_default", "alert.wav"},
- {N_("Someone says your username in chat"), "nick_said", "alert.wav"}
+ {N_("Someone says your username in chat"), "nick_said", "alert.wav"},
+ {N_("Attention received"), "got_attention", "alert.wav"}
};
static gboolean
@@ -144,7 +145,7 @@
char *message, PurpleConversation *conv,
PurpleMessageFlags flags, PurpleSoundEventID event)
{
- if (flags & PURPLE_MESSAGE_DELAYED)
+ if (flags & PURPLE_MESSAGE_DELAYED || flags & PURPLE_MESSAGE_NOTIFY)
return;
if (conv==NULL)
@@ -199,7 +200,7 @@
{
PurpleConvChat *chat;
- if (flags & PURPLE_MESSAGE_DELAYED)
+ if (flags & PURPLE_MESSAGE_DELAYED || flags & PURPLE_MESSAGE_NOTIFY)
return;
chat = purple_conversation_get_chat_data(conv);
@@ -219,6 +220,13 @@
play_conv_event(conv, event);
}
+static void
+got_attention_cb(PurpleAccount *account, const char *who,
+ PurpleConversation *conv, guint type, PurpleSoundEventID event)
+{
+ play_conv_event(conv, event);
+}
+
/*
* We mute sounds for the 10 seconds after you log in so that
* you don't get flooded with sounds when the blist shows all
@@ -299,6 +307,10 @@
purple_prefs_add_bool(PIDGIN_PREFS_ROOT "/sound/enabled/pounce_default", TRUE);
purple_prefs_add_path(PIDGIN_PREFS_ROOT "/sound/file/pounce_default", "");
purple_prefs_add_string(PIDGIN_PREFS_ROOT "/sound/theme", "");
+ purple_prefs_add_bool(PIDGIN_PREFS_ROOT "/sound/enabled/sent_attention", TRUE);
+ purple_prefs_add_path(PIDGIN_PREFS_ROOT "/sound/file/sent_attention", "");
+ purple_prefs_add_bool(PIDGIN_PREFS_ROOT "/sound/enabled/got_attention", TRUE);
+ purple_prefs_add_path(PIDGIN_PREFS_ROOT "/sound/file/got_attention", "");
purple_prefs_add_bool(PIDGIN_PREFS_ROOT "/sound/conv_focus", TRUE);
purple_prefs_add_bool(PIDGIN_PREFS_ROOT "/sound/mute", FALSE);
purple_prefs_add_path(PIDGIN_PREFS_ROOT "/sound/command", "");
@@ -345,6 +357,12 @@
purple_signal_connect(conv_handle, "received-chat-msg",
gtk_sound_handle, PURPLE_CALLBACK(chat_msg_received_cb),
GINT_TO_POINTER(PURPLE_SOUND_CHAT_SAY));
+ purple_signal_connect(conv_handle, "got-attention", gtk_sound_handle,
+ PURPLE_CALLBACK(got_attention_cb),
+ GINT_TO_POINTER(PURPLE_SOUND_GOT_ATTENTION));
+ /* for the time being, don't handle sent-attention here, since playing a
+ sound would result induplicate sounds. And fixing that would require changing the
+ conversation signal for msg-recv */
}
static void
@@ -539,18 +557,12 @@
#else /* _WIN32 */
purple_debug_info("sound", "Playing %s\n", filename);
- if (G_WIN32_HAVE_WIDECHAR_API ()) {
+ {
wchar_t *wc_filename = g_utf8_to_utf16(filename,
-1, NULL, NULL, NULL);
if (!PlaySoundW(wc_filename, NULL, SND_ASYNC | SND_FILENAME))
purple_debug(PURPLE_DEBUG_ERROR, "sound", "Error playing sound.\n");
g_free(wc_filename);
- } else {
- char *l_filename = g_locale_from_utf8(filename,
- -1, NULL, NULL, NULL);
- if (!PlaySoundA(l_filename, NULL, SND_ASYNC | SND_FILENAME))
- purple_debug(PURPLE_DEBUG_ERROR, "sound", "Error playing sound.\n");
- g_free(l_filename);
}
#endif /* _WIN32 */
diff -r cc6d733a192a -r c5a7516418c7 pidgin/gtkstatusbox.c
--- a/pidgin/gtkstatusbox.c Tue Feb 16 15:58:34 2010 +0000
+++ b/pidgin/gtkstatusbox.c Thu Feb 18 16:59:04 2010 +0000
@@ -1180,7 +1180,6 @@
return FALSE;
}
-#if GTK_CHECK_VERSION(2,6,0)
static gboolean
dropdown_store_row_separator_func(GtkTreeModel *model,
GtkTreeIter *iter, gpointer data)
@@ -1194,7 +1193,6 @@
return FALSE;
}
-#endif
static void
cache_pixbufs(PidginStatusBox *status_box)
@@ -1305,11 +1303,9 @@
static void
pidgin_status_box_list_position (PidginStatusBox *status_box, int *x, int *y, int *width, int *height)
{
-#if GTK_CHECK_VERSION(2,2,0)
GdkScreen *screen;
gint monitor_num;
GdkRectangle monitor;
-#endif
GtkRequisition popup_req;
GtkPolicyType hpolicy, vpolicy;
@@ -1335,7 +1331,6 @@
*height = popup_req.height;
-#if GTK_CHECK_VERSION(2,2,0)
screen = gtk_widget_get_screen (GTK_WIDGET (status_box));
monitor_num = gdk_screen_get_monitor_at_window (screen,
GTK_WIDGET (status_box)->window);
@@ -1368,7 +1363,6 @@
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (status_box->scrolled_window),
hpolicy, vpolicy);
}
-#endif
}
static gboolean
@@ -1376,29 +1370,20 @@
guint32 activate_time,
gboolean grab_keyboard)
{
- if ((gdk_pointer_grab (window, TRUE,
+ if ((gdk_pointer_grab (window, TRUE,
GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK |
GDK_POINTER_MOTION_MASK,
NULL, NULL, activate_time) == 0))
- {
- if (!grab_keyboard ||
- gdk_keyboard_grab (window, TRUE,
- activate_time) == 0)
- return TRUE;
- else
{
-#if GTK_CHECK_VERSION(2,2,0)
- gdk_display_pointer_ungrab (gdk_drawable_get_display (window),
- activate_time);
-#else
- gdk_pointer_ungrab(activate_time);
- gdk_keyboard_ungrab(activate_time);
-#endif
- return FALSE;
+ if (!grab_keyboard || gdk_keyboard_grab (window, TRUE, activate_time) == 0)
+ return TRUE;
+ else {
+ gdk_display_pointer_ungrab (gdk_drawable_get_display (window), activate_time);
+ return FALSE;
+ }
}
- }
-
- return FALSE;
+
+ return FALSE;
}
@@ -1793,9 +1778,7 @@
gtk_box_pack_start(GTK_BOX(status_box->hbox), status_box->vsep, FALSE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(status_box->hbox), status_box->arrow, FALSE, FALSE, 0);
gtk_widget_show_all(status_box->toggle_button);
-#if GTK_CHECK_VERSION(2,4,0)
gtk_button_set_focus_on_click(GTK_BUTTON(status_box->toggle_button), FALSE);
-#endif
text_rend = gtk_cell_renderer_text_new();
icon_rend = gtk_cell_renderer_pixbuf_new();
@@ -1809,14 +1792,10 @@
}
gtk_window_set_resizable (GTK_WINDOW (status_box->popup_window), FALSE);
-#if GTK_CHECK_VERSION(2,10,0)
gtk_window_set_type_hint (GTK_WINDOW (status_box->popup_window),
GDK_WINDOW_TYPE_HINT_POPUP_MENU);
-#endif
-#if GTK_CHECK_VERSION(2,2,0)
gtk_window_set_screen (GTK_WINDOW (status_box->popup_window),
gtk_widget_get_screen (GTK_WIDGET (status_box)));
-#endif
status_box->popup_frame = gtk_frame_new (NULL);
gtk_frame_set_shadow_type (GTK_FRAME (status_box->popup_frame),
GTK_SHADOW_ETCHED_IN);
@@ -1843,10 +1822,8 @@
gtk_tree_selection_set_mode (sel, GTK_SELECTION_BROWSE);
gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (status_box->tree_view),
FALSE);
-#if GTK_CHECK_VERSION(2,6,0)
gtk_tree_view_set_hover_selection (GTK_TREE_VIEW (status_box->tree_view),
TRUE);
-#endif
gtk_tree_view_set_model (GTK_TREE_VIEW (status_box->tree_view),
GTK_TREE_MODEL(status_box->dropdown_store));
status_box->column = gtk_tree_view_column_new ();
@@ -1864,9 +1841,7 @@
gtk_tree_view_set_search_equal_func(GTK_TREE_VIEW(status_box->tree_view),
pidgin_tree_view_search_equal_func, NULL, NULL);
-#if GTK_CHECK_VERSION(2, 6, 0)
g_object_set(text_rend, "ellipsize", PANGO_ELLIPSIZE_END, NULL);
-#endif
status_box->icon_rend = gtk_cell_renderer_pixbuf_new();
status_box->text_rend = gtk_cell_renderer_text_new();
@@ -1877,9 +1852,7 @@
gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(status_box->cell_view), status_box->icon_rend, "stock-id", ICON_STOCK_COLUMN, NULL);
gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(status_box->cell_view), status_box->text_rend, "markup", TEXT_COLUMN, NULL);
gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(status_box->cell_view), emblem_rend, "pixbuf", EMBLEM_COLUMN, "visible", EMBLEM_VISIBLE_COLUMN, NULL);
-#if GTK_CHECK_VERSION(2, 6, 0)
g_object_set(status_box->text_rend, "ellipsize", PANGO_ELLIPSIZE_END, NULL);
-#endif
status_box->vbox = gtk_vbox_new(0, FALSE);
status_box->sw = pidgin_create_imhtml(FALSE, &status_box->imhtml, NULL, NULL);
@@ -1924,9 +1897,7 @@
g_signal_connect(G_OBJECT(status_box->tree_view), "cursor-changed",
G_CALLBACK(treeview_cursor_changed_cb), status_box->dropdown_store);
-#if GTK_CHECK_VERSION(2,6,0)
gtk_tree_view_set_row_separator_func(GTK_TREE_VIEW(status_box->tree_view), dropdown_store_row_separator_func, NULL, NULL);
-#endif
status_box->token_status_account = check_active_accounts_for_identical_statuses();
@@ -2210,14 +2181,12 @@
{
/* Don't do anything unless GTK actually supports
* gtk_combo_box_set_row_separator_func */
-#if GTK_CHECK_VERSION(2,6,0)
GtkTreeIter iter;
gtk_list_store_append(status_box->dropdown_store, &iter);
gtk_list_store_set(status_box->dropdown_store, &iter,
TYPE_COLUMN, PIDGIN_STATUS_BOX_TYPE_SEPARATOR,
-1);
-#endif
}
void
@@ -2241,7 +2210,6 @@
static void
pixbuf_size_prepared_cb(GdkPixbufLoader *loader, int width, int height, gpointer data)
{
-#if GTK_CHECK_VERSION(2,2,0)
int w, h;
GtkIconSize icon_size = gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_MEDIUM);
gtk_icon_size_lookup(icon_size, &w, &h);
@@ -2250,7 +2218,6 @@
else if (width > height)
h = height * w / width;
gdk_pixbuf_loader_set_size(loader, w, h);
-#endif
}
static void
diff -r cc6d733a192a -r c5a7516418c7 pidgin/gtkutils.c
--- a/pidgin/gtkutils.c Tue Feb 16 15:58:34 2010 +0000
+++ b/pidgin/gtkutils.c Thu Feb 18 16:59:04 2010 +0000
@@ -1247,7 +1247,6 @@
gboolean *push_in,
gpointer data)
{
-#if GTK_CHECK_VERSION(2,2,0)
GtkWidget *widget;
GtkRequisition requisition;
GdkScreen *screen;
@@ -1388,7 +1387,6 @@
{
*y = monitor.y;
}
-#endif
}
@@ -1630,7 +1628,6 @@
char key[64];
const char *itemname = NULL;
-#if GTK_CHECK_VERSION(2,6,0)
const char * const *langs;
int i;
langs = g_get_language_names();
@@ -1639,15 +1636,7 @@
itemname = purple_desktop_item_get_string(item, key);
break;
}
-#else
- const char *lang = g_getenv("LANG");
- char *dot;
- dot = strchr(lang, '.');
- if (dot)
- *dot = '\0';
- g_snprintf(key, sizeof(key), "Name[%s]", lang);
- itemname = purple_desktop_item_get_string(item, key);
-#endif
+
if (!itemname)
itemname = purple_desktop_item_get_string(item, "Name");
@@ -1664,10 +1653,13 @@
purple_desktop_item_get_string(item, "URL"), itemname);
break;
default:
- /* I don't know if we really want to do anything here. Most of the desktop item types are crap like
- * "MIME Type" (I have no clue how that would be a desktop item) and "Comment"... nothing we can really
- * send. The only logical one is "Application," but do we really want to send a binary and nothing else?
- * Probably not. I'll just give an error and return. */
+ /* I don't know if we really want to do anything here. Most of
+ * the desktop item types are crap like "MIME Type" (I have no
+ * clue how that would be a desktop item) and "Comment"...
+ * nothing we can really send. The only logical one is
+ * "Application," but do we really want to send a binary and
+ * nothing else? Probably not. I'll just give an error and
+ * return. */
/* The original patch sent the icon used by the launcher. That's probably wrong */
purple_notify_error(NULL, NULL, _("Cannot send launcher"),
_("You dragged a desktop launcher. Most "
@@ -1862,10 +1854,6 @@
return menuitem;
}
-#if GTK_CHECK_VERSION(2,3,0)
-# define NEW_STYLE_COMPLETION
-#endif
-
typedef struct
{
GtkWidget *entry;
@@ -1874,97 +1862,9 @@
PidginFilterBuddyCompletionEntryFunc filter_func;
gpointer filter_func_user_data;
-#ifdef NEW_STYLE_COMPLETION
GtkListStore *store;
-#else
- GCompletion *completion;
- gboolean completion_started;
- GList *log_items;
-#endif /* NEW_STYLE_COMPLETION */
} PidginCompletionData;
-#ifndef NEW_STYLE_COMPLETION
-static gboolean
-completion_entry_event(GtkEditable *entry, GdkEventKey *event,
- PidginCompletionData *data)
-{
- int pos, end_pos;
-
- if (event->type == GDK_KEY_PRESS && event->keyval == GDK_Tab)
- {
- gtk_editable_get_selection_bounds(entry, &pos, &end_pos);
-
- if (data->completion_started &&
- pos != end_pos && pos > 1 &&
- end_pos == strlen(gtk_entry_get_text(GTK_ENTRY(entry))))
- {
- gtk_editable_select_region(entry, 0, 0);
- gtk_editable_set_position(entry, -1);
-
- return TRUE;
- }
- }
- else if (event->type == GDK_KEY_PRESS && event->length > 0)
- {
- char *prefix, *nprefix;
-
- gtk_editable_get_selection_bounds(entry, &pos, &end_pos);
-
- if (data->completion_started &&
- pos != end_pos && pos > 1 &&
- end_pos == strlen(gtk_entry_get_text(GTK_ENTRY(entry))))
- {
- char *temp;
-
- temp = gtk_editable_get_chars(entry, 0, pos);
- prefix = g_strconcat(temp, event->string, NULL);
- g_free(temp);
- }
- else if (pos == end_pos && pos > 1 &&
- end_pos == strlen(gtk_entry_get_text(GTK_ENTRY(entry))))
- {
- prefix = g_strconcat(gtk_entry_get_text(GTK_ENTRY(entry)),
- event->string, NULL);
- }
- else
- return FALSE;
-
- pos = strlen(prefix);
- nprefix = NULL;
-
- g_completion_complete(data->completion, prefix, &nprefix);
-
- if (nprefix != NULL)
- {
- gtk_entry_set_text(GTK_ENTRY(entry), nprefix);
- gtk_editable_set_position(entry, pos);
- gtk_editable_select_region(entry, pos, -1);
-
- data->completion_started = TRUE;
-
- g_free(nprefix);
- g_free(prefix);
-
- return TRUE;
- }
-
- g_free(prefix);
- }
-
- return FALSE;
-}
-
-static void
-destroy_completion_data(GtkWidget *w, PidginCompletionData *data)
-{
- g_list_foreach(data->completion->items, (GFunc)g_free, NULL);
- g_completion_free(data->completion);
-
- g_free(data);
-}
-#endif /* !NEW_STYLE_COMPLETION */
-
-#ifdef NEW_STYLE_COMPLETION
static gboolean buddyname_completion_match_func(GtkEntryCompletion *completion,
const gchar *key, GtkTreeIter *iter, gpointer user_data)
{
@@ -2098,7 +1998,6 @@
g_free(normalized_buddyname);
}
-#endif /* NEW_STYLE_COMPLETION */
static void get_log_set_name(PurpleLogSet *set, gpointer value, PidginCompletionData *data)
{
@@ -2113,14 +2012,8 @@
entry.entry.logged_buddy = set;
if (filter_func(&entry, user_data)) {
-#ifdef NEW_STYLE_COMPLETION
add_buddyname_autocomplete_entry(data->store,
NULL, NULL, set->account, set->name);
-#else
- /* Steal the name for the GCompletion. */
- data->log_items = g_list_append(data->log_items, set->name);
- set->name = set->normalized_name = NULL;
-#endif /* NEW_STYLE_COMPLETION */
}
}
}
@@ -2133,14 +2026,7 @@
gpointer user_data = data->filter_func_user_data;
GHashTable *sets;
-#ifdef NEW_STYLE_COMPLETION
gtk_list_store_clear(data->store);
-#else
- GList *item = g_list_append(NULL, NULL);
-
- g_list_foreach(data->completion->items, (GFunc)g_free, NULL);
- g_completion_clear_items(data->completion);
-#endif /* NEW_STYLE_COMPLETION */
for (gnode = purple_get_blist()->root; gnode != NULL; gnode = gnode->next)
{
@@ -2159,35 +2045,21 @@
entry.entry.buddy = (PurpleBuddy *) bnode;
if (filter_func(&entry, user_data)) {
-#ifdef NEW_STYLE_COMPLETION
add_buddyname_autocomplete_entry(data->store,
((PurpleContact *)cnode)->alias,
purple_buddy_get_contact_alias(entry.entry.buddy),
entry.entry.buddy->account,
entry.entry.buddy->name
);
-#else
- item->data = g_strdup(entry.entry.buddy->name);
- g_completion_add_items(data->completion, item);
-#endif /* NEW_STYLE_COMPLETION */
}
}
}
}
-#ifndef NEW_STYLE_COMPLETION
- g_list_free(item);
- data->log_items = NULL;
-#endif /* NEW_STYLE_COMPLETION */
-
sets = purple_log_get_log_sets();
g_hash_table_foreach(sets, (GHFunc)get_log_set_name, data);
g_hash_table_destroy(sets);
-#ifndef NEW_STYLE_COMPLETION
- g_completion_add_items(data->completion, data->log_items);
- g_list_free(data->log_items);
-#endif /* NEW_STYLE_COMPLETION */
}
static void
@@ -2208,7 +2080,6 @@
{
PidginCompletionData *data;
-#ifdef NEW_STYLE_COMPLETION
/*
* Store the displayed completion value, the buddy name, the UTF-8
* normalized & casefolded buddy name, the UTF-8 normalized &
@@ -2252,33 +2123,6 @@
gtk_entry_completion_set_text_column(completion, 0);
-#else /* !NEW_STYLE_COMPLETION */
-
- data = g_new0(PidginCompletionData, 1);
-
- data->entry = entry;
- data->accountopt = accountopt;
- if (filter_func == NULL) {
- data->filter_func = pidgin_screenname_autocomplete_default_filter;
- data->filter_func_user_data = NULL;
- } else {
- data->filter_func = filter_func;
- data->filter_func_user_data = user_data;
- }
- data->completion = g_completion_new(NULL);
- data->completion_started = FALSE;
-
- add_completion_list(data);
-
- g_completion_set_compare(data->completion, g_ascii_strncasecmp);
-
- g_signal_connect(G_OBJECT(entry), "event",
- G_CALLBACK(completion_entry_event), data);
- g_signal_connect(G_OBJECT(entry), "destroy",
- G_CALLBACK(destroy_completion_data), data);
-
-#endif /* !NEW_STYLE_COMPLETION */
-
purple_signal_connect(purple_connections_get_handle(), "signed-on", entry,
PURPLE_CALLBACK(repopulate_autocomplete), data);
purple_signal_connect(purple_connections_get_handle(), "signed-off", entry,
@@ -2322,11 +2166,7 @@
gdk_window_set_cursor(widget->window, cursor);
gdk_cursor_unref(cursor);
-#if GTK_CHECK_VERSION(2,4,0)
gdk_display_flush(gdk_drawable_get_display(GDK_DRAWABLE(widget->window)));
-#else
- gdk_flush();
-#endif
}
void pidgin_clear_cursor(GtkWidget *widget)
@@ -2347,23 +2187,6 @@
gpointer data;
};
-#if !GTK_CHECK_VERSION(2,4,0) /* FILECHOOSER */
-static void
-icon_filesel_delete_cb(GtkWidget *w, struct _icon_chooser *dialog)
-{
- if (dialog->icon_filesel != NULL)
- gtk_widget_destroy(dialog->icon_filesel);
-
- if (dialog->callback)
- dialog->callback(NULL, dialog->data);
-
- g_free(dialog);
-}
-#endif /* FILECHOOSER */
-
-
-
-#if GTK_CHECK_VERSION(2,4,0) /* FILECHOOSER */
static void
icon_filesel_choose_cb(GtkWidget *widget, gint response, struct _icon_chooser *dialog)
{
@@ -2387,33 +2210,7 @@
g_free(current_folder);
}
-#else /* FILECHOOSER */
-static void
-icon_filesel_choose_cb(GtkWidget *w, struct _icon_chooser *dialog)
-{
- char *filename, *current_folder;
-
- filename = g_strdup(gtk_file_selection_get_filename(
- GTK_FILE_SELECTION(dialog->icon_filesel)));
-
- /* If they typed in a directory, change there */
- if (pidgin_check_if_dir(filename,
- GTK_FILE_SELECTION(dialog->icon_filesel)))
- {
- g_free(filename);
- return;
- }
-
- current_folder = g_path_get_dirname(filename);
- if (current_folder != NULL) {
- purple_prefs_set_path(PIDGIN_PREFS_ROOT "/filelocations/last_icon_folder", current_folder);
- g_free(current_folder);
- }
-
-#endif /* FILECHOOSER */
-#if 0 /* mismatched curly braces */
- }
-#endif
+
if (dialog->callback)
dialog->callback(filename, dialog->data);
gtk_widget_destroy(dialog->icon_filesel);
@@ -2423,11 +2220,7 @@
static void
-#if GTK_CHECK_VERSION(2,4,0) /* FILECHOOSER */
icon_preview_change_cb(GtkFileChooser *widget, struct _icon_chooser *dialog)
-#else /* FILECHOOSER */
-icon_preview_change_cb(GtkTreeSelection *sel, struct _icon_chooser *dialog)
-#endif /* FILECHOOSER */
{
GdkPixbuf *pixbuf, *scale;
int height, width;
@@ -2435,13 +2228,8 @@
struct stat st;
char *filename;
-#if GTK_CHECK_VERSION(2,4,0) /* FILECHOOSER */
filename = gtk_file_chooser_get_preview_filename(
GTK_FILE_CHOOSER(dialog->icon_filesel));
-#else /* FILECHOOSER */
- filename = g_strdup(gtk_file_selection_get_filename(
- GTK_FILE_SELECTION(dialog->icon_filesel)));
-#endif /* FILECHOOSER */
if (!filename || g_stat(filename, &st) || !(pixbuf = gdk_pixbuf_new_from_file(filename, NULL)))
{
@@ -2477,20 +2265,13 @@
GtkWidget *pidgin_buddy_icon_chooser_new(GtkWindow *parent, void(*callback)(const char *, gpointer), gpointer data) {
struct _icon_chooser *dialog = g_new0(struct _icon_chooser, 1);
-#if GTK_CHECK_VERSION(2,4,0) /* FILECHOOSER */
GtkWidget *vbox;
-#else
- GtkWidget *hbox;
- GtkWidget *tv;
- GtkTreeSelection *sel;
-#endif /* FILECHOOSER */
const char *current_folder;
dialog->callback = callback;
dialog->data = data;
current_folder = purple_prefs_get_path(PIDGIN_PREFS_ROOT "/filelocations/last_icon_folder");
-#if GTK_CHECK_VERSION(2,4,0) /* FILECHOOSER */
dialog->icon_filesel = gtk_file_chooser_dialog_new(_("Buddy Icon"),
parent,
@@ -2521,39 +2302,6 @@
g_signal_connect(G_OBJECT(dialog->icon_filesel), "response",
G_CALLBACK(icon_filesel_choose_cb), dialog);
icon_preview_change_cb(NULL, dialog);
-#else /* FILECHOOSER */
- dialog->icon_filesel = gtk_file_selection_new(_("Buddy Icon"));
- dialog->icon_preview = gtk_image_new();
- dialog->icon_text = gtk_label_new(NULL);
- if ((current_folder != NULL) && (*current_folder != '\0'))
- gtk_file_selection_set_filename(GTK_FILE_SELECTION(dialog->icon_filesel),
- current_folder);
-
- gtk_widget_set_size_request(GTK_WIDGET(dialog->icon_preview),-1, 50);
- hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_BOX_SPACE);
- gtk_box_pack_start(
- GTK_BOX(GTK_FILE_SELECTION(dialog->icon_filesel)->main_vbox),
- hbox, FALSE, FALSE, 0);
- gtk_box_pack_end(GTK_BOX(hbox), dialog->icon_preview,
- FALSE, FALSE, 0);
- gtk_box_pack_end(GTK_BOX(hbox), dialog->icon_text, FALSE, FALSE, 0);
-
- tv = GTK_FILE_SELECTION(dialog->icon_filesel)->file_list;
- sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(tv));
-
- g_signal_connect(G_OBJECT(sel), "changed",
- G_CALLBACK(icon_preview_change_cb), dialog);
- g_signal_connect(
- G_OBJECT(GTK_FILE_SELECTION(dialog->icon_filesel)->ok_button),
- "clicked",
- G_CALLBACK(icon_filesel_choose_cb), dialog);
- g_signal_connect(
- G_OBJECT(GTK_FILE_SELECTION(dialog->icon_filesel)->cancel_button),
- "clicked",
- G_CALLBACK(icon_filesel_delete_cb), dialog);
- g_signal_connect(G_OBJECT(dialog->icon_filesel), "destroy",
- G_CALLBACK(icon_filesel_delete_cb), dialog);
-#endif /* FILECHOOSER */
#ifdef _WIN32
g_signal_connect(G_OBJECT(dialog->icon_filesel), "show",
@@ -2564,7 +2312,6 @@
}
-#if GTK_CHECK_VERSION(2,2,0)
static gboolean
str_array_match(char **a, char **b)
{
@@ -2578,22 +2325,16 @@
return TRUE;
return FALSE;
}
-#endif
gpointer
pidgin_convert_buddy_icon(PurplePlugin *plugin, const char *path, size_t *len)
{
PurplePluginProtocolInfo *prpl_info;
-#if GTK_CHECK_VERSION(2,2,0)
char **prpl_formats;
int width, height;
char **pixbuf_formats = NULL;
GdkPixbufFormat *format;
GdkPixbuf *pixbuf;
-#if !GTK_CHECK_VERSION(2,4,0)
- GdkPixbufLoader *loader;
-#endif
-#endif
gchar *contents;
gsize length;
@@ -2602,22 +2343,8 @@
g_return_val_if_fail(prpl_info->icon_spec.format != NULL, NULL);
-#if GTK_CHECK_VERSION(2,2,0)
-#if GTK_CHECK_VERSION(2,4,0)
format = gdk_pixbuf_get_file_info(path, &width, &height);
-#else
- loader = gdk_pixbuf_loader_new();
- if (g_file_get_contents(path, &contents, &length, NULL)) {
- gdk_pixbuf_loader_write(loader, contents, length, NULL);
- g_free(contents);
- }
- gdk_pixbuf_loader_close(loader, NULL);
- pixbuf = gdk_pixbuf_loader_get_pixbuf(loader);
- width = gdk_pixbuf_get_width(pixbuf);
- height = gdk_pixbuf_get_height(pixbuf);
- format = gdk_pixbuf_loader_get_format(loader);
- g_object_unref(G_OBJECT(loader));
-#endif
+
if (format == NULL)
return NULL;
@@ -2629,25 +2356,18 @@
prpl_info->icon_spec.max_width >= width &&
prpl_info->icon_spec.min_height <= height &&
prpl_info->icon_spec.max_height >= height))) /* The icon is the correct size */
-#endif
{
-#if GTK_CHECK_VERSION(2,2,0)
g_strfreev(prpl_formats);
g_strfreev(pixbuf_formats);
-#endif
+
/* We don't need to scale the image. */
-
contents = NULL;
if (!g_file_get_contents(path, &contents, &length, NULL))
{
g_free(contents);
-#if GTK_CHECK_VERSION(2,2,0) && !GTK_CHECK_VERSION(2,4,0)
- g_object_unref(G_OBJECT(pixbuf));
-#endif
return NULL;
}
}
-#if GTK_CHECK_VERSION(2,2,0)
else
{
int i;
@@ -2769,156 +2489,8 @@
if (len)
*len = length;
return contents;
-#else
- /*
- * The chosen icon wasn't the right size, and we're using
- * GTK+ 2.0 so we can't scale it.
- */
- return NULL;
-#endif
}
-#if !GTK_CHECK_VERSION(2,6,0)
-static void
-_gdk_file_scale_size_prepared_cb (GdkPixbufLoader *loader,
- int width,
- int height,
- gpointer data)
-{
- struct {
- gint width;
- gint height;
- gboolean preserve_aspect_ratio;
- } *info = data;
-
- g_return_if_fail (width > 0 && height > 0);
-
- if (info->preserve_aspect_ratio &&
- (info->width > 0 || info->height > 0)) {
- if (info->width < 0)
- {
- width = width * (double)info->height/(double)height;
- height = info->height;
- }
- else if (info->height < 0)
- {
- height = height * (double)info->width/(double)width;
- width = info->width;
- }
- else if ((double)height * (double)info->width >
- (double)width * (double)info->height) {
- width = 0.5 + (double)width * (double)info->height / (double)height;
- height = info->height;
- } else {
- height = 0.5 + (double)height * (double)info->width / (double)width;
- width = info->width;
- }
- } else {
- if (info->width > 0)
- width = info->width;
- if (info->height > 0)
- height = info->height;
- }
-
-#if GTK_CHECK_VERSION(2,2,0) /* 2.0 users are going to have very strangely sized things */
- gdk_pixbuf_loader_set_size (loader, width, height);
-#else
-#warning nosnilmot could not be bothered to fix this properly for you
-#warning ... good luck ... your images may end up strange sizes
-#endif
-}
-
-GdkPixbuf *
-gdk_pixbuf_new_from_file_at_scale(const char *filename, int width, int height,
- gboolean preserve_aspect_ratio,
- GError **error)
-{
- GdkPixbufLoader *loader;
- GdkPixbuf *pixbuf;
- guchar buffer [4096];
- int length;
- FILE *f;
- struct {
- gint width;
- gint height;
- gboolean preserve_aspect_ratio;
- } info;
- GdkPixbufAnimation *animation;
- GdkPixbufAnimationIter *iter;
- gboolean has_frame;
-
- g_return_val_if_fail (filename != NULL, NULL);
- g_return_val_if_fail (width > 0 || width == -1, NULL);
- g_return_val_if_fail (height > 0 || height == -1, NULL);
-
- f = g_fopen (filename, "rb");
- if (!f) {
- gint save_errno = errno;
- gchar *display_name = g_filename_to_utf8 (filename, -1, NULL, NULL, NULL);
- g_set_error (error, G_FILE_ERROR, g_file_error_from_errno (save_errno),
- _("Failed to open file '%s': %s"),
- display_name ? display_name : "(unknown)",
- g_strerror (save_errno));
- g_free (display_name);
- return NULL;
- }
-
- loader = gdk_pixbuf_loader_new ();
-
- info.width = width;
- info.height = height;
- info.preserve_aspect_ratio = preserve_aspect_ratio;
-
- g_signal_connect (loader, "size-prepared", G_CALLBACK (_gdk_file_scale_size_prepared_cb), &info);
-
- has_frame = FALSE;
- while (!has_frame && !feof (f) && !ferror (f)) {
- length = fread (buffer, 1, sizeof (buffer), f);
- if (length > 0)
- if (!gdk_pixbuf_loader_write (loader, buffer, length, error)) {
- gdk_pixbuf_loader_close (loader, NULL);
- fclose (f);
- g_object_unref (loader);
- return NULL;
- }
-
- animation = gdk_pixbuf_loader_get_animation (loader);
- if (animation) {
- iter = gdk_pixbuf_animation_get_iter (animation, 0);
- if (!gdk_pixbuf_animation_iter_on_currently_loading_frame (iter)) {
- has_frame = TRUE;
- }
- g_object_unref (iter);
- }
- }
-
- fclose (f);
-
- if (!gdk_pixbuf_loader_close (loader, error) && !has_frame) {
- g_object_unref (loader);
- return NULL;
- }
-
- pixbuf = gdk_pixbuf_loader_get_pixbuf (loader);
-
- if (!pixbuf) {
- gchar *display_name = g_filename_to_utf8 (filename, -1, NULL, NULL, NULL);
- g_object_unref (loader);
- g_set_error (error, GDK_PIXBUF_ERROR, GDK_PIXBUF_ERROR_FAILED,
- _("Failed to load image '%s': reason not known, probably a corrupt image file"),
- display_name ? display_name : "(unknown)");
- g_free (display_name);
- return NULL;
- }
-
- g_object_ref (pixbuf);
-
- g_object_unref (loader);
-
- return pixbuf;
-}
-#endif /* ! Gtk 2.6.0 */
-
void pidgin_set_custom_buddy_icon(PurpleAccount *account, const char *who, const char *filename)
{
PurpleBuddy *buddy;
@@ -2951,34 +2523,10 @@
void pidgin_set_urgent(GtkWindow *window, gboolean urgent)
{
-#if GTK_CHECK_VERSION(2,8,0)
- gtk_window_set_urgency_hint(window, urgent);
-#elif defined _WIN32
+#if defined _WIN32
winpidgin_window_flash(window, urgent);
-#elif defined GDK_WINDOWING_X11
- GdkWindow *gdkwin;
- XWMHints *hints;
-
- g_return_if_fail(window != NULL);
-
- gdkwin = GTK_WIDGET(window)->window;
-
- g_return_if_fail(gdkwin != NULL);
-
- hints = XGetWMHints(GDK_WINDOW_XDISPLAY(gdkwin),
- GDK_WINDOW_XWINDOW(gdkwin));
- if(!hints)
- hints = XAllocWMHints();
-
- if (urgent)
- hints->flags |= XUrgencyHint;
- else
- hints->flags &= ~XUrgencyHint;
- XSetWMHints(GDK_WINDOW_XDISPLAY(gdkwin),
- GDK_WINDOW_XWINDOW(gdkwin), hints);
- XFree(hints);
#else
- /* do something else? */
+ gtk_window_set_urgency_hint(window, urgent);
#endif
}
@@ -3287,31 +2835,6 @@
return dim_grey_string;
}
-#if !GTK_CHECK_VERSION(2,2,0)
-GtkTreePath *
-gtk_tree_path_new_from_indices (gint first_index, ...)
-{
- int arg;
- va_list args;
- GtkTreePath *path;
-
- path = gtk_tree_path_new ();
-
- va_start (args, first_index);
- arg = first_index;
-
- while (arg != -1)
- {
- gtk_tree_path_append_index (path, arg);
- arg = va_arg (args, gint);
- }
-
- va_end (args);
-
- return path;
-}
-#endif
-
static void
combo_box_changed_cb(GtkComboBox *combo_box, GtkEntry *entry)
{
@@ -3457,7 +2980,6 @@
return FALSE;
#endif
#else
-#if GTK_CHECK_VERSION(2,4,0)
/* This finds the currently active window and makes that the parent window. */
GList *windows = NULL;
GtkWidget *parent = NULL;
@@ -3500,7 +3022,6 @@
gtk_window_set_transient_for(GTK_WINDOW(widget), GTK_WINDOW(parent));
return TRUE;
}
-#endif
return FALSE;
#endif
}
@@ -3584,23 +3105,13 @@
#ifdef _WIN32
/* If using Win32... */
int code;
- if (G_WIN32_HAVE_WIDECHAR_API()) {
- wchar_t *wc_filename = g_utf8_to_utf16(
- uri, -1, NULL, NULL, NULL);
-
- code = (int)ShellExecuteW(NULL, NULL, wc_filename, NULL, NULL,
- SW_SHOW);
-
- g_free(wc_filename);
- } else {
- char *l_filename = g_locale_from_utf8(
- uri, -1, NULL, NULL, NULL);
-
- code = (int)ShellExecuteA(NULL, NULL, l_filename, NULL, NULL,
- SW_SHOW);
-
- g_free(l_filename);
- }
+ wchar_t *wc_filename = g_utf8_to_utf16(
+ uri, -1, NULL, NULL, NULL);
+
+ code = (int)ShellExecuteW(NULL, NULL, wc_filename, NULL, NULL,
+ SW_SHOW);
+
+ g_free(wc_filename);
if (code == SE_ERR_ASSOCINCOMPLETE || code == SE_ERR_NOASSOC)
{
@@ -3697,13 +3208,10 @@
gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
/* Open Containing Directory */
-#if GTK_CHECK_VERSION(2,6,0)
img = gtk_image_new_from_stock(GTK_STOCK_DIRECTORY, GTK_ICON_SIZE_MENU);
item = gtk_image_menu_item_new_with_mnemonic(_("Open _Containing Directory"));
gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(item), img);
-#else
- item = gtk_menu_item_new_with_mnemonic(_("Open _Containing Directory"));
-#endif
+
g_signal_connect(G_OBJECT(item), "activate", G_CALLBACK(open_containing_cb), (gpointer)url);
gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
@@ -3769,13 +3277,10 @@
url = gtk_imhtml_link_get_url(link);
/* Play Sound */
-#if GTK_CHECK_VERSION(2,6,0)
img = gtk_image_new_from_stock(GTK_STOCK_MEDIA_PLAY, GTK_ICON_SIZE_MENU);
item = gtk_image_menu_item_new_with_mnemonic(_("_Play Sound"));
gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(item), img);
-#else
- item = gtk_menu_item_new_with_mnemonic(_("_Play Sound"));
-#endif
+
g_signal_connect_swapped(G_OBJECT(item), "activate", G_CALLBACK(gtk_imhtml_link_activate), link);
gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
@@ -3897,17 +3402,18 @@
do {
DWORD nameSize = 256;
- char start[256];
- /* I don't think we need to worry about non-ASCII protocol names */
- ret = RegEnumKeyExA(HKEY_CLASSES_ROOT, idx++, start, &nameSize,
+ wchar_t start[256];
+ ret = RegEnumKeyExW(HKEY_CLASSES_ROOT, idx++, start, &nameSize,
NULL, NULL, NULL, NULL);
if (ret == ERROR_SUCCESS) {
HKEY reg_key = NULL;
- ret = RegOpenKeyExA(HKEY_CLASSES_ROOT, start, 0, KEY_READ, ®_key);
+ ret = RegOpenKeyExW(HKEY_CLASSES_ROOT, start, 0, KEY_READ, ®_key);
if (ret == ERROR_SUCCESS) {
- ret = RegQueryValueExA(reg_key, "URL Protocol", NULL, NULL, NULL, NULL);
+ ret = RegQueryValueExW(reg_key, L"URL Protocol", NULL, NULL, NULL, NULL);
if (ret == ERROR_SUCCESS) {
- gchar *protocol = g_strdup_printf("%s:", start);
+ gchar *utf8 = g_utf16_to_utf8(start, -1, NULL, NULL, NULL);
+ gchar *protocol = g_strdup_printf("%s:", utf8);
+ g_free(utf8);
registered_url_handlers = g_slist_prepend(registered_url_handlers, protocol);
/* We still pass everything to the "http" "open" handler for security reasons */
gtk_imhtml_class_register_protocol(protocol, url_clicked_cb, link_context_menu);
diff -r cc6d733a192a -r c5a7516418c7 pidgin/gtkutils.h
--- a/pidgin/gtkutils.h Tue Feb 16 15:58:34 2010 +0000
+++ b/pidgin/gtkutils.h Thu Feb 18 16:59:04 2010 +0000
@@ -648,17 +648,6 @@
*/
gpointer pidgin_convert_buddy_icon(PurplePlugin *plugin, const char *path, size_t *len);
-#if !GTK_CHECK_VERSION(2,6,0)
-/**
- * Creates a new pixbuf by loading an image from a file. The image will
- * be scaled to fit in the requested size, optionally preserving the image's
- * aspect ratio.
- */
-GdkPixbuf *gdk_pixbuf_new_from_file_at_scale(const char *filename, int width, int height,
- gboolean preserve_aspect_ratio,
- GError **error);
-#endif
-
#if !(defined PIDGIN_DISABLE_DEPRECATED) || (defined _PIDGIN_GTKUTILS_C_)
/**
* Set or unset a custom buddyicon for a user.
@@ -760,20 +749,6 @@
*/
const char *pidgin_get_dim_grey_string(GtkWidget *widget);
-#if !GTK_CHECK_VERSION(2,2,0)
-/**
- * This is copied from Gtk to support Gtk 2.0
- *
- * Creates a new path with @a first_index and the varargs as indices.
- *
- * @param first_index first integer
- * @param ... list of integers terminated by -1
- *
- * @return A newly created GtkTreePath.
- */
-GtkTreePath *gtk_tree_path_new_from_indices (gint first_index, ...);
-#endif
-
/**
* Create a simple text GtkComboBoxEntry equivalent
*
diff -r cc6d733a192a -r c5a7516418c7 pidgin/gtkwhiteboard.c
--- a/pidgin/gtkwhiteboard.c Tue Feb 16 15:58:34 2010 +0000
+++ b/pidgin/gtkwhiteboard.c Thu Feb 18 16:59:04 2010 +0000
@@ -767,7 +767,6 @@
int result;
-#if GTK_CHECK_VERSION(2,4,0) /* FILECHOOSER */
dialog = gtk_file_chooser_dialog_new (_("Save File"),
GTK_WINDOW(gtkwb->window),
GTK_FILE_CHOOSER_ACTION_SAVE,
@@ -786,21 +785,15 @@
else
gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (dialog), filename_for_existing_document);
*/
-#else
- dialog = gtk_file_selection_new(_("Save File"));
- gtk_file_selection_set_filename(GTK_FILE_SELECTION(dialog), "whiteboard.jpg");
-#endif
+
result = gtk_dialog_run(GTK_DIALOG(dialog));
if(result == GTK_RESPONSE_ACCEPT)
{
char *filename;
-#if GTK_CHECK_VERSION(2,4,0) /* FILECHOOSER */
filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog));
-#else
- filename = g_strdup(gtk_file_selection_get_filename(GTK_FILE_SELECTION(dialog)));
-#endif
+
gtk_widget_destroy(dialog);
/* Makes an icon from the whiteboard's canvas 'image' */
diff -r cc6d733a192a -r c5a7516418c7 pidgin/minidialog.c
--- a/pidgin/minidialog.c Tue Feb 16 15:58:34 2010 +0000
+++ b/pidgin/minidialog.c Thu Feb 18 16:59:04 2010 +0000
@@ -339,26 +339,20 @@
param_spec = g_param_spec_string("title", "title",
"String specifying the mini-dialog's title", NULL,
-#if GTK_CHECK_VERSION(2,8,0)
G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB |
-#endif
G_PARAM_READWRITE);
g_object_class_install_property (object_class, PROP_TITLE, param_spec);
param_spec = g_param_spec_string("description", "description",
"Description text for the mini-dialog, if desired", NULL,
-#if GTK_CHECK_VERSION(2,8,0)
G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB |
-#endif
G_PARAM_READWRITE);
g_object_class_install_property (object_class, PROP_DESCRIPTION, param_spec);
param_spec = g_param_spec_string("icon-name", "icon-name",
"String specifying the Gtk stock name of the dialog's icon",
NULL,
-#if GTK_CHECK_VERSION(2,8,0)
G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB |
-#endif
G_PARAM_READWRITE);
g_object_class_install_property (object_class, PROP_ICON_NAME, param_spec);
}
diff -r cc6d733a192a -r c5a7516418c7 pidgin/pidgin-2-uninstalled.pc.in
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/pidgin/pidgin-2-uninstalled.pc.in Thu Feb 18 16:59:04 2010 +0000
@@ -0,0 +1,21 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+datarootdir=@datarootdir@
+datadir=@datadir@
+sysconfdir=@sysconfdir@
+
+abs_srcdir=@abs_srcdir@
+abs_builddir=@abs_builddir@
+
+abs_top_srcdir=@abs_top_srcdir@
+abs_top_builddir=@abs_top_builddir@
+
+plugindir=${libdir}/pidgin
+
+Name: Pidgin
+Description: Pidgin is a GTK2-based instant messenger application.
+Version: @VERSION@
+Requires: gtk+-2.0 purple
+Cflags: -I${abs_top_srcdir}
diff -r cc6d733a192a -r c5a7516418c7 pidgin/pidgin-2.pc.in
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/pidgin/pidgin-2.pc.in Thu Feb 18 16:59:04 2010 +0000
@@ -0,0 +1,15 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+datarootdir=@datarootdir@
+datadir=@datadir@
+sysconfdir=@sysconfdir@
+
+plugindir=${libdir}/pidgin
+
+Name: Pidgin
+Description: Pidgin is a GTK2-based instant messenger application.
+Version: @VERSION@
+Requires: gtk+-2.0 purple
+Cflags: -I${includedir}
diff -r cc6d733a192a -r c5a7516418c7 pidgin/pidgin-uninstalled.pc.in
--- a/pidgin/pidgin-uninstalled.pc.in Tue Feb 16 15:58:34 2010 +0000
+++ b/pidgin/pidgin-uninstalled.pc.in Thu Feb 18 16:59:04 2010 +0000
@@ -9,6 +9,8 @@
abs_srcdir=@abs_srcdir@
abs_builddir=@abs_builddir@
+plugindir=${libdir}/pidgin
+
Name: Pidgin
Description: Pidgin is a GTK2-based instant messenger application.
Version: @VERSION@
diff -r cc6d733a192a -r c5a7516418c7 pidgin/pidgin.h
--- a/pidgin/pidgin.h Tue Feb 16 15:58:34 2010 +0000
+++ b/pidgin/pidgin.h Thu Feb 18 16:59:04 2010 +0000
@@ -57,33 +57,6 @@
#endif
/*
- * This is backwards-compatibility code for older versions of GTK+ (< 2.4.x)
- * It defines the new wrap behavior (unknown in earlier versions)
- * as the old (slightly buggy) wrap behavior.
- * It also includes our back-ported GtkExpander
- */
-/** @cond */
-#if (!GTK_CHECK_VERSION(2,4,0))
-# define GTK_WRAP_WORD_CHAR GTK_WRAP_WORD
-# include "gtkexpander.h"
-#endif
-/** @endcond */
-
-/*
- * We include the sources for GtkComboBox and GtkCellView because
- * they don't exist in older versions of GTK+, and we use them
- * in a few places.
- */
-#if !GTK_CHECK_VERSION(2,6,0)
-# include "gtkcellview.h"
-# include "gtkcellviewmenuitem.h"
-# include "pidgincombobox.h"
-# if !GTK_CHECK_VERSION(2,4,0)
-# include "gtkcelllayout.h"
-# endif /* Less than GTK+ 2.4 */
-#endif /* Less than GTK+ 2.6 */
-
-/*
* Spacings between components, as defined by the
* GNOME Human Interface Guidelines.
*/
diff -r cc6d733a192a -r c5a7516418c7 pidgin/pidgin.pc.in
--- a/pidgin/pidgin.pc.in Tue Feb 16 15:58:34 2010 +0000
+++ b/pidgin/pidgin.pc.in Thu Feb 18 16:59:04 2010 +0000
@@ -6,6 +6,8 @@
datadir=@datadir@
sysconfdir=@sysconfdir@
+plugindir=${libdir}/pidgin
+
Name: Pidgin
Description: Pidgin is a GTK2-based instant messenger application.
Version: @VERSION@
diff -r cc6d733a192a -r c5a7516418c7 pidgin/pidgincombobox.c
--- a/pidgin/pidgincombobox.c Tue Feb 16 15:58:34 2010 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,3749 +0,0 @@
-/* pidgincombobox.c
- * Copyright (C) 2002, 2003 Kristian Rietveld
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 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
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02111-1301, USA.
- */
-
-/*
-#include
-*/
-#include
-#if !GTK_CHECK_VERSION(2,6,0)
-#include "pidgincombobox.h"
-
-#if !GTK_CHECK_VERSION(2,4,0)
-#include
-#include
-#include "gtkcelllayout.h"
-#include
-#include "gtkcellview.h"
-#include "gtkcellviewmenuitem.h"
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-/*
-#include
-*/
-#include
-#include
-#include
-
-#include
-
-#include
-
-#include
-#include
-
-#define P_(x) (x)
-
-/* WELCOME, to THE house of evil code */
-
-typedef struct _ComboCellInfo ComboCellInfo;
-struct _ComboCellInfo
-{
- GtkCellRenderer *cell;
- GSList *attributes;
-
- GtkCellLayoutDataFunc func;
- gpointer func_data;
- GDestroyNotify destroy;
-
- guint expand : 1;
- guint pack : 1;
-};
-
-struct _GtkComboBoxPrivate
-{
- GtkTreeModel *model;
-
- gint col_column;
- gint row_column;
-
- gint wrap_width;
-
- gint active_item;
-
- GtkWidget *tree_view;
- GtkTreeViewColumn *column;
-
- GtkWidget *cell_view;
- GtkWidget *cell_view_frame;
-
- GtkWidget *button;
- GtkWidget *box;
- GtkWidget *arrow;
- GtkWidget *separator;
-
- GtkWidget *popup_widget;
- GtkWidget *popup_window;
- GtkWidget *popup_frame;
-
- guint inserted_id;
- guint deleted_id;
- guint reordered_id;
- guint changed_id;
-
- gint width;
- GSList *cells;
-
- guint popup_in_progress : 1;
- guint destroying : 1;
-};
-
-/* While debugging this evil code, I have learned that
- * there are actually 4 modes to this widget, which can
- * be characterized as follows
- *
- * 1) menu mode, no child added
- *
- * tree_view -> NULL
- * cell_view -> GtkCellView, regular child
- * cell_view_frame -> NULL
- * button -> GtkToggleButton set_parent to combo
- * box -> child of button
- * arrow -> child of box
- * separator -> child of box
- * popup_widget -> GtkMenu
- * popup_window -> NULL
- * popup_frame -> NULL
- *
- * 2) menu mode, child added
- *
- * tree_view -> NULL
- * cell_view -> NULL
- * cell_view_frame -> NULL
- * button -> GtkToggleButton set_parent to combo
- * box -> NULL
- * arrow -> GtkArrow, child of button
- * separator -> NULL
- * popup_widget -> GtkMenu
- * popup_window -> NULL
- * popup_frame -> NULL
- *
- * 3) list mode, no child added
- *
- * tree_view -> GtkTreeView, child of popup_frame
- * cell_view -> GtkCellView, regular child
- * cell_view_frame -> GtkFrame, set parent to combo
- * button -> GtkToggleButton, set_parent to combo
- * box -> NULL
- * arrow -> GtkArrow, child of button
- * separator -> NULL
- * popup_widget -> tree_view
- * popup_window -> GtkWindow
- * popup_frame -> GtkFrame, child of popup_window
- *
- * 4) list mode, child added
- *
- * tree_view -> GtkTreeView, child of popup_frame
- * cell_view -> NULL
- * cell_view_frame -> NULL
- * button -> GtkToggleButton, set_parent to combo
- * box -> NULL
- * arrow -> GtkArrow, child of button
- * separator -> NULL
- * popup_widget -> tree_view
- * popup_window -> GtkWindow
- * popup_frame -> GtkFrame, child of popup_window
- *
- */
-
-enum {
- CHANGED,
- LAST_SIGNAL
-};
-
-enum {
- PROP_0,
- PROP_MODEL,
- PROP_WRAP_WIDTH,
- PROP_ROW_SPAN_COLUMN,
- PROP_COLUMN_SPAN_COLUMN,
- PROP_ACTIVE
-};
-
-static GtkBinClass *parent_class = NULL;
-static guint combo_box_signals[LAST_SIGNAL] = {0,};
-
-#define BONUS_PADDING 4
-
-
-/* common */
-static void gtk_combo_box_class_init (GtkComboBoxClass *klass);
-static void gtk_combo_box_cell_layout_init (GtkCellLayoutIface *iface);
-static void gtk_combo_box_init (GtkComboBox *combo_box);
-static void gtk_combo_box_finalize (GObject *object);
-static void gtk_combo_box_destroy (GtkObject *object);
-
-static void gtk_combo_box_set_property (GObject *object,
- guint prop_id,
- const GValue *value,
- GParamSpec *spec);
-static void gtk_combo_box_get_property (GObject *object,
- guint prop_id,
- GValue *value,
- GParamSpec *spec);
-
-static void gtk_combo_box_state_changed (GtkWidget *widget,
- GtkStateType previous);
-static void gtk_combo_box_style_set (GtkWidget *widget,
- GtkStyle *previous);
-static void gtk_combo_box_button_toggled (GtkWidget *widget,
- gpointer data);
-static void gtk_combo_box_add (GtkContainer *container,
- GtkWidget *widget);
-static void gtk_combo_box_remove (GtkContainer *container,
- GtkWidget *widget);
-
-static ComboCellInfo *gtk_combo_box_get_cell_info (GtkComboBox *combo_box,
- GtkCellRenderer *cell);
-
-static void gtk_combo_box_menu_show (GtkWidget *menu,
- gpointer user_data);
-static void gtk_combo_box_menu_hide (GtkWidget *menu,
- gpointer user_data);
-
-static void gtk_combo_box_set_popup_widget (GtkComboBox *combo_box,
- GtkWidget *popup);
-#if GTK_CHECK_VERSION(2,2,0)
-static void gtk_combo_box_menu_position_below (GtkMenu *menu,
- gint *x,
- gint *y,
- gint *push_in,
- gpointer user_data);
-static void gtk_combo_box_menu_position_over (GtkMenu *menu,
- gint *x,
- gint *y,
- gint *push_in,
- gpointer user_data);
-static void gtk_combo_box_menu_position (GtkMenu *menu,
- gint *x,
- gint *y,
- gint *push_in,
- gpointer user_data);
-#endif
-
-static gint gtk_combo_box_calc_requested_width (GtkComboBox *combo_box,
- GtkTreePath *path);
-static void gtk_combo_box_remeasure (GtkComboBox *combo_box);
-
-static void gtk_combo_box_unset_model (GtkComboBox *combo_box);
-
-static void gtk_combo_box_size_request (GtkWidget *widget,
- GtkRequisition *requisition);
-static void gtk_combo_box_size_allocate (GtkWidget *widget,
- GtkAllocation *allocation);
-static void gtk_combo_box_forall (GtkContainer *container,
- gboolean include_internals,
- GtkCallback callback,
- gpointer callback_data);
-static gboolean gtk_combo_box_expose_event (GtkWidget *widget,
- GdkEventExpose *event);
-static gboolean gtk_combo_box_scroll_event (GtkWidget *widget,
- GdkEventScroll *event);
-static void gtk_combo_box_set_active_internal (GtkComboBox *combo_box,
- gint index);
-static gboolean gtk_combo_box_key_press (GtkWidget *widget,
- GdkEventKey *event,
- gpointer data);
-
-/* listening to the model */
-static void gtk_combo_box_model_row_inserted (GtkTreeModel *model,
- GtkTreePath *path,
- GtkTreeIter *iter,
- gpointer user_data);
-static void gtk_combo_box_model_row_deleted (GtkTreeModel *model,
- GtkTreePath *path,
- gpointer user_data);
-static void gtk_combo_box_model_rows_reordered (GtkTreeModel *model,
- GtkTreePath *path,
- GtkTreeIter *iter,
- gint *new_order,
- gpointer user_data);
-static void gtk_combo_box_model_row_changed (GtkTreeModel *model,
- GtkTreePath *path,
- GtkTreeIter *iter,
- gpointer data);
-
-/* list */
-static void gtk_combo_box_list_position (GtkComboBox *combo_box,
- gint *x,
- gint *y,
- gint *width,
- gint *height);
-
-static void gtk_combo_box_list_setup (GtkComboBox *combo_box);
-static void gtk_combo_box_list_destroy (GtkComboBox *combo_box);
-
-static void gtk_combo_box_list_remove_grabs (GtkComboBox *combo_box);
-
-static gboolean gtk_combo_box_list_button_released (GtkWidget *widget,
- GdkEventButton *event,
- gpointer data);
-static gboolean gtk_combo_box_list_key_press (GtkWidget *widget,
- GdkEventKey *event,
- gpointer data);
-static gboolean gtk_combo_box_list_button_pressed (GtkWidget *widget,
- GdkEventButton *event,
- gpointer data);
-
-static void gtk_combo_box_list_row_changed (GtkTreeModel *model,
- GtkTreePath *path,
- GtkTreeIter *iter,
- gpointer data);
-
-/* menu */
-static void gtk_combo_box_menu_setup (GtkComboBox *combo_box,
- gboolean add_children);
-static void gtk_combo_box_menu_fill (GtkComboBox *combo_box);
-static void gtk_combo_box_menu_destroy (GtkComboBox *combo_box);
-
-static void gtk_combo_box_item_get_size (GtkComboBox *combo_box,
- gint index,
- gint *cols,
- gint *rows);
-static void gtk_combo_box_relayout_item (GtkComboBox *combo_box,
- gint index);
-static void gtk_combo_box_relayout (GtkComboBox *combo_box);
-
-static gboolean gtk_combo_box_menu_button_press (GtkWidget *widget,
- GdkEventButton *event,
- gpointer user_data);
-static void gtk_combo_box_menu_item_activate (GtkWidget *item,
- gpointer user_data);
-static void gtk_combo_box_menu_row_inserted (GtkTreeModel *model,
- GtkTreePath *path,
- GtkTreeIter *iter,
- gpointer user_data);
-static void gtk_combo_box_menu_row_deleted (GtkTreeModel *model,
- GtkTreePath *path,
- gpointer user_data);
-static void gtk_combo_box_menu_rows_reordered (GtkTreeModel *model,
- GtkTreePath *path,
- GtkTreeIter *iter,
- gint *new_order,
- gpointer user_data);
-static void gtk_combo_box_menu_row_changed (GtkTreeModel *model,
- GtkTreePath *path,
- GtkTreeIter *iter,
- gpointer data);
-static gboolean gtk_combo_box_menu_key_press (GtkWidget *widget,
- GdkEventKey *event,
- gpointer data);
-
-/* cell layout */
-static void gtk_combo_box_cell_layout_pack_start (GtkCellLayout *layout,
- GtkCellRenderer *cell,
- gboolean expand);
-static void gtk_combo_box_cell_layout_pack_end (GtkCellLayout *layout,
- GtkCellRenderer *cell,
- gboolean expand);
-static void gtk_combo_box_cell_layout_clear (GtkCellLayout *layout);
-static void gtk_combo_box_cell_layout_add_attribute (GtkCellLayout *layout,
- GtkCellRenderer *cell,
- const gchar *attribute,
- gint column);
-static void gtk_combo_box_cell_layout_set_cell_data_func (GtkCellLayout *layout,
- GtkCellRenderer *cell,
- GtkCellLayoutDataFunc func,
- gpointer func_data,
- GDestroyNotify destroy);
-static void gtk_combo_box_cell_layout_clear_attributes (GtkCellLayout *layout,
- GtkCellRenderer *cell);
-static void gtk_combo_box_cell_layout_reorder (GtkCellLayout *layout,
- GtkCellRenderer *cell,
- gint position);
-static gboolean gtk_combo_box_mnemonic_activate (GtkWidget *widget,
- gboolean group_cycling);
-
-static void cell_view_sync_cells (GtkComboBox *combo_box,
- GtkCellView *cell_view);
-
-#if !GTK_CHECK_VERSION(2,4,0)
-static void gtk_menu_attach (GtkMenu *menu,
- GtkWidget *child,
- guint left_attach,
- guint right_attach,
- guint top_attach,
- guint bottom_attach);
-#endif
-
-GType
-gtk_combo_box_get_type (void)
-{
- static GType combo_box_type = 0;
-
- if (!combo_box_type)
- {
- static const GTypeInfo combo_box_info =
- {
- sizeof (GtkComboBoxClass),
- NULL, /* base_init */
- NULL, /* base_finalize */
- (GClassInitFunc) gtk_combo_box_class_init,
- NULL, /* class_finalize */
- NULL, /* class_data */
- sizeof (GtkComboBox),
- 0,
- (GInstanceInitFunc) gtk_combo_box_init
- };
-
- static const GInterfaceInfo cell_layout_info =
- {
- (GInterfaceInitFunc) gtk_combo_box_cell_layout_init,
- NULL,
- NULL
- };
-
- combo_box_type = g_type_register_static (GTK_TYPE_BIN,
- "PidginComboBox",
- &combo_box_info,
- 0);
-
- g_type_add_interface_static (combo_box_type,
- GTK_TYPE_CELL_LAYOUT,
- &cell_layout_info);
- }
-
- return combo_box_type;
-}
-
-/* common */
-static void
-gtk_combo_box_class_init (GtkComboBoxClass *klass)
-{
- GObjectClass *object_class;
- GtkBindingSet *binding_set;
- GtkObjectClass *gtk_object_class;
- GtkContainerClass *container_class;
- GtkWidgetClass *widget_class;
-
- binding_set = gtk_binding_set_by_class (klass);
-
- container_class = (GtkContainerClass *)klass;
- container_class->forall = gtk_combo_box_forall;
- container_class->add = gtk_combo_box_add;
- container_class->remove = gtk_combo_box_remove;
-
- widget_class = (GtkWidgetClass *)klass;
- widget_class->size_allocate = gtk_combo_box_size_allocate;
- widget_class->size_request = gtk_combo_box_size_request;
- widget_class->expose_event = gtk_combo_box_expose_event;
- widget_class->scroll_event = gtk_combo_box_scroll_event;
- widget_class->mnemonic_activate = gtk_combo_box_mnemonic_activate;
- widget_class->style_set = gtk_combo_box_style_set;
- widget_class->state_changed = gtk_combo_box_state_changed;
-
- gtk_object_class = (GtkObjectClass *)klass;
- gtk_object_class->destroy = gtk_combo_box_destroy;
-
- object_class = (GObjectClass *)klass;
- object_class->finalize = gtk_combo_box_finalize;
- object_class->set_property = gtk_combo_box_set_property;
- object_class->get_property = gtk_combo_box_get_property;
-
- parent_class = g_type_class_peek_parent (klass);
-
- /* signals */
- combo_box_signals[CHANGED] =
- g_signal_new ("changed",
- G_OBJECT_CLASS_TYPE (klass),
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (GtkComboBoxClass, changed),
- NULL, NULL,
- g_cclosure_marshal_VOID__VOID,
- G_TYPE_NONE, 0);
-
- /* properties */
- g_object_class_install_property (object_class,
- PROP_MODEL,
- g_param_spec_object ("model",
- P_("ComboBox model"),
- P_("The model for the combo box"),
- GTK_TYPE_TREE_MODEL,
- G_PARAM_READWRITE));
-
- g_object_class_install_property (object_class,
- PROP_WRAP_WIDTH,
- g_param_spec_int ("wrap_width",
- P_("Wrap width"),
- P_("Wrap width for layouting the items in a grid"),
- 0,
- G_MAXINT,
- 0,
- G_PARAM_READWRITE));
-
- g_object_class_install_property (object_class,
- PROP_ROW_SPAN_COLUMN,
- g_param_spec_int ("row_span_column",
- P_("Row span column"),
- P_("TreeModel column containing the row span values"),
- 0,
- G_MAXINT,
- 0,
- G_PARAM_READWRITE));
-
- g_object_class_install_property (object_class,
- PROP_COLUMN_SPAN_COLUMN,
- g_param_spec_int ("column_span_column",
- P_("Column span column"),
-
- P_("TreeModel column containing the column span values"),
- 0,
- G_MAXINT,
- 0,
- G_PARAM_READWRITE));
-
- g_object_class_install_property (object_class,
- PROP_ACTIVE,
- g_param_spec_int ("active",
- P_("Active item"),
- P_("The item which is currently active"),
- -1,
- G_MAXINT,
- -1,
- G_PARAM_READWRITE));
-
- gtk_widget_class_install_style_property (widget_class,
- g_param_spec_boolean ("appears-as-list",
- P_("Appears as list"),
- P_("Whether combobox dropdowns should look like lists rather than menus"),
- FALSE,
- G_PARAM_READABLE));
-}
-
-static void
-gtk_combo_box_cell_layout_init (GtkCellLayoutIface *iface)
-{
- iface->pack_start = gtk_combo_box_cell_layout_pack_start;
- iface->pack_end = gtk_combo_box_cell_layout_pack_end;
- iface->clear = gtk_combo_box_cell_layout_clear;
- iface->add_attribute = gtk_combo_box_cell_layout_add_attribute;
- iface->set_cell_data_func = gtk_combo_box_cell_layout_set_cell_data_func;
- iface->clear_attributes = gtk_combo_box_cell_layout_clear_attributes;
- iface->reorder = gtk_combo_box_cell_layout_reorder;
-}
-
-static void
-gtk_combo_box_init (GtkComboBox *combo_box)
-{
- combo_box->priv = g_new0(GtkComboBoxPrivate,1);
-
- combo_box->priv->cell_view = gtk_cell_view_new ();
- gtk_widget_set_parent (combo_box->priv->cell_view, GTK_WIDGET (combo_box));
- GTK_BIN (combo_box)->child = combo_box->priv->cell_view;
- gtk_widget_show (combo_box->priv->cell_view);
-
- combo_box->priv->width = 0;
- combo_box->priv->wrap_width = 0;
-
- combo_box->priv->active_item = -1;
- combo_box->priv->col_column = -1;
- combo_box->priv->row_column = -1;
-}
-
-static void
-gtk_combo_box_set_property (GObject *object,
- guint prop_id,
- const GValue *value,
- GParamSpec *pspec)
-{
- GtkComboBox *combo_box = GTK_COMBO_BOX (object);
-
- switch (prop_id)
- {
- case PROP_MODEL:
- gtk_combo_box_set_model (combo_box, g_value_get_object (value));
- break;
-
- case PROP_WRAP_WIDTH:
- gtk_combo_box_set_wrap_width (combo_box, g_value_get_int (value));
- break;
-
- case PROP_ROW_SPAN_COLUMN:
- gtk_combo_box_set_row_span_column (combo_box, g_value_get_int (value));
- break;
-
- case PROP_COLUMN_SPAN_COLUMN:
- gtk_combo_box_set_column_span_column (combo_box, g_value_get_int (value));
- break;
-
- case PROP_ACTIVE:
- gtk_combo_box_set_active (combo_box, g_value_get_int (value));
- break;
-
- default:
- break;
- }
-}
-
-static void
-gtk_combo_box_get_property (GObject *object,
- guint prop_id,
- GValue *value,
- GParamSpec *pspec)
-{
- GtkComboBox *combo_box = GTK_COMBO_BOX (object);
-
- switch (prop_id)
- {
- case PROP_MODEL:
- g_value_set_object (value, combo_box->priv->model);
- break;
-
- case PROP_WRAP_WIDTH:
- g_value_set_int (value, combo_box->priv->wrap_width);
- break;
-
- case PROP_ROW_SPAN_COLUMN:
- g_value_set_int (value, combo_box->priv->row_column);
- break;
-
- case PROP_COLUMN_SPAN_COLUMN:
- g_value_set_int (value, combo_box->priv->col_column);
- break;
-
- case PROP_ACTIVE:
- g_value_set_int (value, gtk_combo_box_get_active (combo_box));
- break;
-
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- break;
- }
-}
-
-static void
-gtk_combo_box_state_changed (GtkWidget *widget,
- GtkStateType previous)
-{
- GtkComboBox *combo_box = GTK_COMBO_BOX (widget);
-
- if (GTK_WIDGET_REALIZED (widget))
- {
- if (combo_box->priv->tree_view && combo_box->priv->cell_view)
- gtk_cell_view_set_background_color (GTK_CELL_VIEW (combo_box->priv->cell_view),
- &widget->style->base[GTK_WIDGET_STATE (widget)]);
- }
-
- gtk_widget_queue_draw (widget);
-}
-
-static void
-gtk_combo_box_check_appearance (GtkComboBox *combo_box)
-{
- gboolean appears_as_list;
-
- /* if wrap_width > 0, then we are in grid-mode and forced to use
- * unix style
- */
- if (combo_box->priv->wrap_width)
- appears_as_list = FALSE;
- else
- gtk_widget_style_get (GTK_WIDGET (combo_box),
- "appears-as-list", &appears_as_list,
- NULL);
-
- if (appears_as_list)
- {
- /* Destroy all the menu mode widgets, if they exist. */
- if (GTK_IS_MENU (combo_box->priv->popup_widget))
- gtk_combo_box_menu_destroy (combo_box);
-
- /* Create the list mode widgets, if they don't already exist. */
- if (!GTK_IS_TREE_VIEW (combo_box->priv->tree_view))
- gtk_combo_box_list_setup (combo_box);
- }
- else
- {
- /* Destroy all the list mode widgets, if they exist. */
- if (GTK_IS_TREE_VIEW (combo_box->priv->tree_view))
- gtk_combo_box_list_destroy (combo_box);
-
- /* Create the menu mode widgets, if they don't already exist. */
- if (!GTK_IS_MENU (combo_box->priv->popup_widget))
- gtk_combo_box_menu_setup (combo_box, TRUE);
- }
-}
-
-static void
-gtk_combo_box_style_set (GtkWidget *widget,
- GtkStyle *previous)
-{
- GtkComboBox *combo_box = GTK_COMBO_BOX (widget);
-
- gtk_combo_box_check_appearance (combo_box);
-
- if (combo_box->priv->tree_view && combo_box->priv->cell_view)
- gtk_cell_view_set_background_color (GTK_CELL_VIEW (combo_box->priv->cell_view),
- &widget->style->base[GTK_WIDGET_STATE (widget)]);
-}
-
-static void
-gtk_combo_box_button_toggled (GtkWidget *widget,
- gpointer data)
-{
- GtkComboBox *combo_box = GTK_COMBO_BOX (data);
-
- if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)))
- {
- if (!combo_box->priv->popup_in_progress)
- gtk_combo_box_popup (combo_box);
- }
- else
- gtk_combo_box_popdown (combo_box);
-}
-
-static void
-gtk_combo_box_add (GtkContainer *container,
- GtkWidget *widget)
-{
- GtkComboBox *combo_box = GTK_COMBO_BOX (container);
-
- if (combo_box->priv->cell_view && combo_box->priv->cell_view->parent)
- {
- gtk_widget_unparent (combo_box->priv->cell_view);
- GTK_BIN (container)->child = NULL;
- gtk_widget_queue_resize (GTK_WIDGET (container));
- }
-
- gtk_widget_set_parent (widget, GTK_WIDGET (container));
- GTK_BIN (container)->child = widget;
-
- if (combo_box->priv->cell_view &&
- widget != combo_box->priv->cell_view)
- {
- /* since the cell_view was unparented, it's gone now */
- combo_box->priv->cell_view = NULL;
-
- if (!combo_box->priv->tree_view && combo_box->priv->separator)
- {
- gtk_container_remove (GTK_CONTAINER (combo_box->priv->separator->parent),
- combo_box->priv->separator);
- combo_box->priv->separator = NULL;
-
- gtk_widget_queue_resize (GTK_WIDGET (container));
- }
- else if (combo_box->priv->cell_view_frame)
- {
- gtk_widget_unparent (combo_box->priv->cell_view_frame);
- combo_box->priv->cell_view_frame = NULL;
- }
- }
-}
-
-static void
-gtk_combo_box_remove (GtkContainer *container,
- GtkWidget *widget)
-{
- GtkComboBox *combo_box = GTK_COMBO_BOX (container);
- gboolean appears_as_list;
-
- gtk_widget_unparent (widget);
- GTK_BIN (container)->child = NULL;
-
- if (combo_box->priv->destroying)
- return;
-
- gtk_widget_queue_resize (GTK_WIDGET (container));
-
- if (!combo_box->priv->tree_view)
- appears_as_list = FALSE;
- else
- appears_as_list = TRUE;
-
- if (appears_as_list)
- gtk_combo_box_list_destroy (combo_box);
- else if (GTK_IS_MENU (combo_box->priv->popup_widget))
- {
- gtk_combo_box_menu_destroy (combo_box);
- gtk_menu_detach (GTK_MENU (combo_box->priv->popup_widget));
- combo_box->priv->popup_widget = NULL;
- }
-
- if (!combo_box->priv->cell_view)
- {
- combo_box->priv->cell_view = gtk_cell_view_new ();
- gtk_widget_set_parent (combo_box->priv->cell_view, GTK_WIDGET (container));
- GTK_BIN (container)->child = combo_box->priv->cell_view;
-
- gtk_widget_show (combo_box->priv->cell_view);
- gtk_cell_view_set_model (GTK_CELL_VIEW (combo_box->priv->cell_view),
- combo_box->priv->model);
- cell_view_sync_cells (combo_box, GTK_CELL_VIEW (combo_box->priv->cell_view));
- }
-
-
- if (appears_as_list)
- gtk_combo_box_list_setup (combo_box);
- else
- gtk_combo_box_menu_setup (combo_box, TRUE);
-
- gtk_combo_box_set_active_internal (combo_box, combo_box->priv->active_item);
-}
-
-static ComboCellInfo *
-gtk_combo_box_get_cell_info (GtkComboBox *combo_box,
- GtkCellRenderer *cell)
-{
- GSList *i;
-
- for (i = combo_box->priv->cells; i; i = i->next)
- {
- ComboCellInfo *info = (ComboCellInfo *)i->data;
-
- if (info && info->cell == cell)
- return info;
- }
-
- return NULL;
-}
-
-static void
-gtk_combo_box_menu_show (GtkWidget *menu,
- gpointer user_data)
-{
- GtkComboBox *combo_box = GTK_COMBO_BOX (user_data);
-
- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (combo_box->priv->button),
- TRUE);
- combo_box->priv->popup_in_progress = FALSE;
-}
-
-static void
-gtk_combo_box_menu_hide (GtkWidget *menu,
- gpointer user_data)
-{
- GtkComboBox *combo_box = GTK_COMBO_BOX (user_data);
-
- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (combo_box->priv->button),
- FALSE);
-}
-
-static void
-gtk_combo_box_detacher (GtkWidget *widget,
- GtkMenu *menu)
-{
- GtkComboBox *combo_box;
-
- g_return_if_fail (GTK_IS_COMBO_BOX (widget));
-
- combo_box = GTK_COMBO_BOX (widget);
- g_return_if_fail (combo_box->priv->popup_widget == (GtkWidget*) menu);
-
- g_signal_handlers_disconnect_by_func (menu,
- gtk_combo_box_menu_show,
- combo_box);
- g_signal_handlers_disconnect_by_func (menu,
- gtk_combo_box_menu_hide,
- combo_box);
-
- combo_box->priv->popup_widget = NULL;
-}
-
-static void
-gtk_combo_box_set_popup_widget (GtkComboBox *combo_box,
- GtkWidget *popup)
-{
- if (GTK_IS_MENU (combo_box->priv->popup_widget))
- {
- gtk_menu_detach (GTK_MENU (combo_box->priv->popup_widget));
- combo_box->priv->popup_widget = NULL;
- }
- else if (combo_box->priv->popup_widget)
- {
- gtk_container_remove (GTK_CONTAINER (combo_box->priv->popup_frame),
- combo_box->priv->popup_widget);
- g_object_unref (G_OBJECT (combo_box->priv->popup_widget));
- combo_box->priv->popup_widget = NULL;
- }
-
- if (GTK_IS_MENU (popup))
- {
- if (combo_box->priv->popup_window)
- {
- gtk_widget_destroy (combo_box->priv->popup_window);
- combo_box->priv->popup_window = NULL;
- combo_box->priv->popup_frame = NULL;
- }
-
- combo_box->priv->popup_widget = popup;
-
- g_signal_connect (popup, "show",
- G_CALLBACK (gtk_combo_box_menu_show), combo_box);
- g_signal_connect (popup, "hide",
- G_CALLBACK (gtk_combo_box_menu_hide), combo_box);
-
- gtk_menu_attach_to_widget (GTK_MENU (popup),
- GTK_WIDGET (combo_box),
- gtk_combo_box_detacher);
- }
- else
- {
- if (!combo_box->priv->popup_window)
- {
- combo_box->priv->popup_window = gtk_window_new (GTK_WINDOW_POPUP);
- gtk_window_set_resizable (GTK_WINDOW (combo_box->priv->popup_window), FALSE);
-#if GTK_CHECK_VERSION(2,2,0)
- gtk_window_set_screen (GTK_WINDOW (combo_box->priv->popup_window),
- gtk_widget_get_screen (GTK_WIDGET (combo_box)));
-#endif
-
- combo_box->priv->popup_frame = gtk_frame_new (NULL);
- gtk_frame_set_shadow_type (GTK_FRAME (combo_box->priv->popup_frame),
- GTK_SHADOW_ETCHED_IN);
- gtk_container_add (GTK_CONTAINER (combo_box->priv->popup_window),
- combo_box->priv->popup_frame);
-
- gtk_widget_show (combo_box->priv->popup_frame);
- }
-
- gtk_container_add (GTK_CONTAINER (combo_box->priv->popup_frame),
- popup);
- gtk_widget_show (popup);
- g_object_ref (G_OBJECT (popup));
- combo_box->priv->popup_widget = popup;
- }
-}
-
-#if GTK_CHECK_VERSION(2,2,0)
-static void
-gtk_combo_box_menu_position_below (GtkMenu *menu,
- gint *x,
- gint *y,
- gint *push_in,
- gpointer user_data)
-{
- GtkComboBox *combo_box = GTK_COMBO_BOX (user_data);
- gint sx, sy;
- GtkWidget *child;
- GtkRequisition req;
- GdkScreen *screen;
- gint monitor_num;
- GdkRectangle monitor;
-
- /* FIXME: is using the size request here broken? */
- child = GTK_BIN (combo_box)->child;
-
- gdk_window_get_origin (child->window, &sx, &sy);
-
- if (GTK_WIDGET_NO_WINDOW (child))
- {
- sx += child->allocation.x;
- sy += child->allocation.y;
- }
-
- gtk_widget_size_request (GTK_WIDGET (menu), &req);
-
- if (gtk_widget_get_direction (GTK_WIDGET (combo_box)) == GTK_TEXT_DIR_LTR)
- *x = sx;
- else
- *x = sx + child->allocation.width - req.width;
- *y = sy;
-
- screen = gtk_widget_get_screen (GTK_WIDGET (combo_box));
- monitor_num = gdk_screen_get_monitor_at_window (screen,
- GTK_WIDGET (combo_box)->window);
- gdk_screen_get_monitor_geometry (screen, monitor_num, &monitor);
-
- if (*x < monitor.x)
- *x = monitor.x;
- else if (*x + req.width > monitor.x + monitor.width)
- *x = monitor.x + monitor.width - req.width;
-
- if (monitor.y + monitor.height - *y - child->allocation.height >= req.height)
- *y += child->allocation.height;
- else if (*y - monitor.y >= req.height)
- *y -= req.height;
- else if (monitor.y + monitor.height - *y - child->allocation.height > *y - monitor.y)
- *y += child->allocation.height;
- else
- *y -= req.height;
-
- *push_in = FALSE;
-}
-
-static void
-gtk_combo_box_menu_position_over (GtkMenu *menu,
- gint *x,
- gint *y,
- gboolean *push_in,
- gpointer user_data)
-{
- GtkComboBox *combo_box;
- GtkWidget *active;
- GtkWidget *child;
- GtkWidget *widget;
- GtkRequisition requisition;
- GList *children;
- gint screen_width;
- gint menu_xpos;
- gint menu_ypos;
- gint menu_width;
-
- g_return_if_fail (GTK_IS_COMBO_BOX (user_data));
-
- combo_box = GTK_COMBO_BOX (user_data);
- widget = GTK_WIDGET (combo_box);
-
- gtk_widget_get_child_requisition (GTK_WIDGET (menu), &requisition);
- menu_width = requisition.width;
-
- active = gtk_menu_get_active (GTK_MENU (combo_box->priv->popup_widget));
- gdk_window_get_origin (widget->window, &menu_xpos, &menu_ypos);
-
- menu_xpos += widget->allocation.x;
- menu_ypos += widget->allocation.y + widget->allocation.height / 2 - 2;
-
- if (active != NULL)
- {
- gtk_widget_get_child_requisition (active, &requisition);
- menu_ypos -= requisition.height / 2;
- }
-
- children = GTK_MENU_SHELL (combo_box->priv->popup_widget)->children;
- while (children)
- {
- child = children->data;
-
- if (active == child)
- break;
-
- if (GTK_WIDGET_VISIBLE (child))
- {
- gtk_widget_get_child_requisition (child, &requisition);
- menu_ypos -= requisition.height;
- }
-
- children = children->next;
- }
-
- if (gtk_widget_get_direction (widget) == GTK_TEXT_DIR_RTL)
- menu_xpos = menu_xpos + widget->allocation.width - menu_width;
-
- /* Clamp the position on screen */
- screen_width = gdk_screen_get_width (gtk_widget_get_screen (widget));
-
- if (menu_xpos < 0)
- menu_xpos = 0;
- else if ((menu_xpos + menu_width) > screen_width)
- menu_xpos -= ((menu_xpos + menu_width) - screen_width);
-
- *x = menu_xpos;
- *y = menu_ypos;
-
- *push_in = TRUE;
-}
-
-static void
-gtk_combo_box_menu_position (GtkMenu *menu,
- gint *x,
- gint *y,
- gint *push_in,
- gpointer user_data)
-{
- GtkComboBox *combo_box;
- GtkWidget *menu_item;
-
- combo_box = GTK_COMBO_BOX (user_data);
-
- if (combo_box->priv->wrap_width > 0 || combo_box->priv->cell_view == NULL)
- gtk_combo_box_menu_position_below (menu, x, y, push_in, user_data);
- else
- {
- menu_item = gtk_menu_get_active (GTK_MENU (combo_box->priv->popup_widget));
- if (menu_item)
- gtk_menu_shell_select_item (GTK_MENU_SHELL (combo_box->priv->popup_widget),
- menu_item);
-
- gtk_combo_box_menu_position_over (menu, x, y, push_in, user_data);
- }
-
-}
-#endif /* Gtk 2.2 */
-
-static void
-gtk_combo_box_list_position (GtkComboBox *combo_box,
- gint *x,
- gint *y,
- gint *width,
- gint *height)
-{
- GtkWidget *sample;
- GtkRequisition popup_req;
-#if GTK_CHECK_VERSION(2,2,0)
- GdkScreen *screen;
- gint monitor_num;
- GdkRectangle monitor;
-#endif
-
- sample = GTK_BIN (combo_box)->child;
-
- *width = sample->allocation.width;
- gtk_widget_size_request (combo_box->priv->popup_window, &popup_req);
- *height = popup_req.height;
-
- gdk_window_get_origin (sample->window, x, y);
-
- if (combo_box->priv->cell_view_frame)
- {
- *x -= GTK_CONTAINER (combo_box->priv->cell_view_frame)->border_width +
- GTK_WIDGET (combo_box->priv->cell_view_frame)->style->xthickness;
- *width += 2 * (GTK_CONTAINER (combo_box->priv->cell_view_frame)->border_width +
- GTK_WIDGET (combo_box->priv->cell_view_frame)->style->xthickness);
- }
-
- if (GTK_WIDGET_NO_WINDOW (sample))
- {
- *x += sample->allocation.x;
- *y += sample->allocation.y;
- }
-
-#if GTK_CHECK_VERSION(2,2,0)
- screen = gtk_widget_get_screen (GTK_WIDGET (combo_box));
- monitor_num = gdk_screen_get_monitor_at_window (screen,
- GTK_WIDGET (combo_box)->window);
- gdk_screen_get_monitor_geometry (screen, monitor_num, &monitor);
-
- if (*x < monitor.x)
- *x = monitor.x;
- else if (*x + *width > monitor.x + monitor.width)
- *x = monitor.x + monitor.width - *width;
-
- if (*y + sample->allocation.height + *height <= monitor.y + monitor.height)
- *y += sample->allocation.height;
- else
- *y -= *height;
-#endif /* Gtk 2.2 */
-}
-
-/**
- * gtk_combo_box_popup:
- * @combo_box: a #GtkComboBox
- *
- * Pops up the menu or dropdown list of @combo_box.
- *
- * This function is mostly intended for use by accessibility technologies;
- * applications should have little use for it.
- *
- * Since: 2.4
- **/
-void
-gtk_combo_box_popup (GtkComboBox *combo_box)
-{
- gint x, y, width, height;
-
- g_return_if_fail (GTK_IS_COMBO_BOX (combo_box));
-
- if (GTK_WIDGET_MAPPED (combo_box->priv->popup_widget))
- return;
-
- if (GTK_IS_MENU (combo_box->priv->popup_widget))
- {
- gtk_menu_set_active (GTK_MENU (combo_box->priv->popup_widget),
- combo_box->priv->active_item);
-
- if (combo_box->priv->wrap_width == 0)
- {
- GtkRequisition requisition;
-
- width = GTK_WIDGET (combo_box)->allocation.width;
- gtk_widget_size_request (combo_box->priv->popup_widget, &requisition);
-
- gtk_widget_set_size_request (combo_box->priv->popup_widget,
- MAX (width, requisition.width), -1);
- }
-
- gtk_menu_popup (GTK_MENU (combo_box->priv->popup_widget),
- NULL, NULL,
-#if GTK_CHECK_VERSION(2,2,0)
- gtk_combo_box_menu_position,
-#else
- NULL,
-#endif
- combo_box, 0, 0);
- return;
- }
-
- gtk_widget_show_all (combo_box->priv->popup_frame);
- gtk_combo_box_list_position (combo_box, &x, &y, &width, &height);
-
- gtk_widget_set_size_request (combo_box->priv->popup_window, width, -1);
- gtk_window_move (GTK_WINDOW (combo_box->priv->popup_window), x, y);
-
- /* popup */
- gtk_widget_show (combo_box->priv->popup_window);
-
- gtk_widget_grab_focus (combo_box->priv->popup_window);
- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (combo_box->priv->button),
- TRUE);
-
- if (!GTK_WIDGET_HAS_FOCUS (combo_box->priv->tree_view))
- {
- gdk_keyboard_grab (combo_box->priv->popup_window->window,
- FALSE, GDK_CURRENT_TIME);
- gtk_widget_grab_focus (combo_box->priv->tree_view);
- }
-
- gtk_grab_add (combo_box->priv->popup_window);
- gdk_pointer_grab (combo_box->priv->popup_window->window, TRUE,
- GDK_BUTTON_PRESS_MASK |
- GDK_BUTTON_RELEASE_MASK |
- GDK_POINTER_MOTION_MASK,
- NULL, NULL, GDK_CURRENT_TIME);
-
- gtk_grab_add (combo_box->priv->tree_view);
-}
-
-/**
- * gtk_combo_box_popdown:
- * @combo_box: a #GtkComboBox
- *
- * Hides the menu or dropdown list of @combo_box.
- *
- * This function is mostly intended for use by accessibility technologies;
- * applications should have little use for it.
- *
- * Since: 2.4
- **/
-void
-gtk_combo_box_popdown (GtkComboBox *combo_box)
-{
- g_return_if_fail (GTK_IS_COMBO_BOX (combo_box));
-
- if (!GTK_WIDGET_REALIZED (GTK_WIDGET (combo_box)))
- return;
-
- if (GTK_IS_MENU (combo_box->priv->popup_widget))
- {
- gtk_menu_popdown (GTK_MENU (combo_box->priv->popup_widget));
- return;
- }
-
- gtk_combo_box_list_remove_grabs (combo_box);
- gtk_widget_hide_all (combo_box->priv->popup_window);
- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (combo_box->priv->button),
- FALSE);
-}
-
-static gint
-gtk_combo_box_calc_requested_width (GtkComboBox *combo_box,
- GtkTreePath *path)
-{
- gint padding;
- GtkRequisition req;
-
- if (combo_box->priv->cell_view)
- gtk_widget_style_get (combo_box->priv->cell_view,
- "focus-line-width", &padding,
- NULL);
- else
- padding = 0;
-
- /* add some pixels for good measure */
- padding += BONUS_PADDING;
-
- if (combo_box->priv->cell_view)
- gtk_cell_view_get_size_of_row (GTK_CELL_VIEW (combo_box->priv->cell_view),
- path, &req);
- else
- req.width = 0;
-
- return req.width + padding;
-}
-
-static void
-gtk_combo_box_remeasure (GtkComboBox *combo_box)
-{
- GtkTreeIter iter;
- GtkTreePath *path;
- gint padding = 0;
-
- if (!combo_box->priv->model ||
- !gtk_tree_model_get_iter_first (combo_box->priv->model, &iter))
- return;
-
- combo_box->priv->width = 0;
-
-#if GTK_CHECK_VERSION(2,2,0)
- path = gtk_tree_path_new_from_indices (0, -1);
-#else
- path = gtk_tree_path_new_first();
-#endif
-
- if (combo_box->priv->cell_view)
- gtk_widget_style_get (combo_box->priv->cell_view,
- "focus-line-width", &padding,
- NULL);
- else
- padding = 0;
-
- /* add some pixels for good measure */
- padding += BONUS_PADDING;
-
- do
- {
- GtkRequisition req;
-
- if (combo_box->priv->cell_view)
- gtk_cell_view_get_size_of_row (GTK_CELL_VIEW (combo_box->priv->cell_view),
- path, &req);
- else
- req.width = 0;
-
- combo_box->priv->width = MAX (combo_box->priv->width,
- req.width + padding);
-
- gtk_tree_path_next (path);
- }
- while (gtk_tree_model_iter_next (combo_box->priv->model, &iter));
-
- gtk_tree_path_free (path);
-}
-
-static void
-gtk_combo_box_size_request (GtkWidget *widget,
- GtkRequisition *requisition)
-{
- gint width, height;
- GtkRequisition bin_req;
-
- GtkComboBox *combo_box = GTK_COMBO_BOX (widget);
-
- /* common */
- gtk_widget_size_request (GTK_BIN (widget)->child, &bin_req);
- gtk_combo_box_remeasure (combo_box);
- bin_req.width = MAX (bin_req.width, combo_box->priv->width);
-
- gtk_combo_box_check_appearance (combo_box);
-
- if (!combo_box->priv->tree_view)
- {
- /* menu mode */
-
- if (combo_box->priv->cell_view)
- {
- GtkRequisition button_req, sep_req, arrow_req;
- gint border_width, xthickness, ythickness;
-
- gtk_widget_size_request (combo_box->priv->button, &button_req);
- border_width = GTK_CONTAINER (combo_box->priv->button)->border_width;
- xthickness = combo_box->priv->button->style->xthickness;
- ythickness = combo_box->priv->button->style->ythickness;
-
- bin_req.width = MAX (bin_req.width, combo_box->priv->width);
-
- gtk_widget_size_request (combo_box->priv->separator, &sep_req);
- gtk_widget_size_request (combo_box->priv->arrow, &arrow_req);
-
- height = MAX (sep_req.height, arrow_req.height);
- height = MAX (height, bin_req.height);
-
- width = bin_req.width + sep_req.width + arrow_req.width;
-
- height += border_width + 1 + ythickness * 2 + 4;
- width += border_width + 1 + xthickness * 2 + 4;
-
- requisition->width = width;
- requisition->height = height;
- }
- else
- {
- GtkRequisition but_req;
-
- gtk_widget_size_request (combo_box->priv->button, &but_req);
-
- requisition->width = bin_req.width + but_req.width;
- requisition->height = MAX (bin_req.height, but_req.height);
- }
- }
- else
- {
- /* list mode */
- GtkRequisition button_req, frame_req;
-
- /* sample + frame */
- *requisition = bin_req;
-
- if (combo_box->priv->cell_view_frame)
- {
- gtk_widget_size_request (combo_box->priv->cell_view_frame, &frame_req);
- requisition->width += 2 *
- (GTK_CONTAINER (combo_box->priv->cell_view_frame)->border_width +
- GTK_WIDGET (combo_box->priv->cell_view_frame)->style->xthickness);
- requisition->height += 2 *
- (GTK_CONTAINER (combo_box->priv->cell_view_frame)->border_width +
- GTK_WIDGET (combo_box->priv->cell_view_frame)->style->ythickness);
- }
-
- /* the button */
- gtk_widget_size_request (combo_box->priv->button, &button_req);
-
- requisition->height = MAX (requisition->height, button_req.height);
- requisition->width += button_req.width;
- }
-}
-
-static void
-gtk_combo_box_size_allocate (GtkWidget *widget,
- GtkAllocation *allocation)
-{
- GtkComboBox *combo_box = GTK_COMBO_BOX (widget);
- GtkAllocation child;
- GtkRequisition req;
- gboolean is_rtl = gtk_widget_get_direction (widget) == GTK_TEXT_DIR_RTL;
-
- widget->allocation = *allocation;
-
- gtk_combo_box_check_appearance (combo_box);
-
- if (!combo_box->priv->tree_view)
- {
- if (combo_box->priv->cell_view)
- {
- gint border_width, xthickness, ythickness;
- gint width;
-
- /* menu mode */
- gtk_widget_size_allocate (combo_box->priv->button, allocation);
-
- /* set some things ready */
- border_width = GTK_CONTAINER (combo_box->priv->button)->border_width;
- xthickness = combo_box->priv->button->style->xthickness;
- ythickness = combo_box->priv->button->style->ythickness;
-
- child.x = allocation->x + border_width + 1 + xthickness + 2;
- child.y = allocation->y + border_width + 1 + ythickness + 2;
-
- width = MAX(1, allocation->width - (border_width + 1 + xthickness * 2 + 4));
-
- /* handle the children */
- gtk_widget_size_request (combo_box->priv->arrow, &req);
- child.width = req.width;
- child.height = MAX(1, allocation->height - 2 * (child.y - allocation->y));
- if (!is_rtl)
- child.x += width - req.width;
- gtk_widget_size_allocate (combo_box->priv->arrow, &child);
- if (is_rtl)
- child.x += req.width;
- gtk_widget_size_request (combo_box->priv->separator, &req);
- child.width = req.width;
- if (!is_rtl)
- child.x -= req.width;
- gtk_widget_size_allocate (combo_box->priv->separator, &child);
-
- if (is_rtl)
- {
- child.x += req.width;
- child.width = MAX(1, allocation->x + allocation->width
- - (border_width + 1 + xthickness + 2) - child.x);
- }
- else
- {
- child.width = child.x;
- child.x = allocation->x + border_width + 1 + xthickness + 2;
- child.width = MAX(1, child.width - child.x);
- }
-
- gtk_widget_size_allocate (GTK_BIN (widget)->child, &child);
- }
- else
- {
- gtk_widget_size_request (combo_box->priv->button, &req);
- if (is_rtl)
- child.x = allocation->x;
- else
- child.x = allocation->x + allocation->width - req.width;
- child.y = allocation->y;
- child.width = req.width;
- child.height = allocation->height;
- gtk_widget_size_allocate (combo_box->priv->button, &child);
-
- if (is_rtl)
- child.x = allocation->x + req.width;
- else
- child.x = allocation->x;
- child.y = allocation->y;
- child.width = MAX(1, allocation->width - req.width);
- gtk_widget_size_allocate (GTK_BIN (widget)->child, &child);
- }
- }
- else
- {
- /* list mode */
-
- /* button */
- gtk_widget_size_request (combo_box->priv->button, &req);
- if (is_rtl)
- child.x = allocation->x;
- else
- child.x = allocation->x + allocation->width - req.width;
- child.y = allocation->y;
- child.width = req.width;
- child.height = allocation->height;
- gtk_widget_size_allocate (combo_box->priv->button, &child);
-
- /* frame */
- if (is_rtl)
- child.x = allocation->x + req.width;
- else
- child.x = allocation->x;
- child.y = allocation->y;
- child.width = MAX (1, allocation->width - req.width);
- child.height = allocation->height;
-
- if (combo_box->priv->cell_view_frame)
- {
- gtk_widget_size_allocate (combo_box->priv->cell_view_frame, &child);
-
- /* the sample */
- child.x +=
- GTK_CONTAINER (combo_box->priv->cell_view_frame)->border_width +
- GTK_WIDGET (combo_box->priv->cell_view_frame)->style->xthickness;
- child.y +=
- GTK_CONTAINER (combo_box->priv->cell_view_frame)->border_width +
- GTK_WIDGET (combo_box->priv->cell_view_frame)->style->ythickness;
- child.width -= 2 * (
- GTK_CONTAINER (combo_box->priv->cell_view_frame)->border_width +
- GTK_WIDGET (combo_box->priv->cell_view_frame)->style->xthickness);
- child.width = MAX(1,child.width);
- child.height -= 2 * (
- GTK_CONTAINER (combo_box->priv->cell_view_frame)->border_width +
- GTK_WIDGET (combo_box->priv->cell_view_frame)->style->ythickness);
- child.height = MAX(1,child.height);
- }
-
- gtk_widget_size_allocate (GTK_BIN (combo_box)->child, &child);
- }
-}
-
-static void
-gtk_combo_box_unset_model (GtkComboBox *combo_box)
-{
- if (combo_box->priv->model)
- {
- g_signal_handler_disconnect (combo_box->priv->model,
- combo_box->priv->inserted_id);
- g_signal_handler_disconnect (combo_box->priv->model,
- combo_box->priv->deleted_id);
- g_signal_handler_disconnect (combo_box->priv->model,
- combo_box->priv->reordered_id);
- g_signal_handler_disconnect (combo_box->priv->model,
- combo_box->priv->changed_id);
- }
-
- /* menu mode */
- if (!combo_box->priv->tree_view)
- {
- if (combo_box->priv->popup_widget)
- gtk_container_foreach (GTK_CONTAINER (combo_box->priv->popup_widget),
- (GtkCallback)gtk_widget_destroy, NULL);
- }
-
- if (combo_box->priv->model)
- {
- g_object_unref (G_OBJECT (combo_box->priv->model));
- combo_box->priv->model = NULL;
- }
-
- if (combo_box->priv->cell_view)
- gtk_cell_view_set_displayed_row (GTK_CELL_VIEW (combo_box->priv->cell_view), NULL);
-}
-
-static void
-gtk_combo_box_forall (GtkContainer *container,
- gboolean include_internals,
- GtkCallback callback,
- gpointer callback_data)
-{
- GtkComboBox *combo_box = GTK_COMBO_BOX (container);
-
- if (include_internals)
- {
- if (combo_box->priv->button)
- (* callback) (combo_box->priv->button, callback_data);
- if (combo_box->priv->cell_view_frame)
- (* callback) (combo_box->priv->cell_view_frame, callback_data);
- }
-
- if (GTK_BIN (container)->child)
- (* callback) (GTK_BIN (container)->child, callback_data);
-}
-
-static gboolean
-gtk_combo_box_expose_event (GtkWidget *widget,
- GdkEventExpose *event)
-{
- GtkComboBox *combo_box = GTK_COMBO_BOX (widget);
-
- if (!combo_box->priv->tree_view)
- {
- gtk_container_propagate_expose (GTK_CONTAINER (widget),
- combo_box->priv->button, event);
- }
- else
- {
- gtk_container_propagate_expose (GTK_CONTAINER (widget),
- combo_box->priv->button, event);
-
- if (combo_box->priv->cell_view_frame)
- gtk_container_propagate_expose (GTK_CONTAINER (widget),
- combo_box->priv->cell_view_frame, event);
- }
-
- gtk_container_propagate_expose (GTK_CONTAINER (widget),
- GTK_BIN (widget)->child, event);
-
- return FALSE;
-}
-
-static gboolean
-gtk_combo_box_scroll_event (GtkWidget *widget,
- GdkEventScroll *event)
-{
- GtkComboBox *combo_box = GTK_COMBO_BOX (widget);
- gint index;
- gint items;
-
- index = gtk_combo_box_get_active (combo_box);
-
- if (index != -1)
- {
- items = gtk_tree_model_iter_n_children (combo_box->priv->model, NULL);
-
- if (event->direction == GDK_SCROLL_UP)
- index--;
- else
- index++;
-
- gtk_combo_box_set_active (combo_box, CLAMP (index, 0, items - 1));
- }
-
- return TRUE;
-}
-
-/*
- * menu style
- */
-
-static void
-cell_view_sync_cells (GtkComboBox *combo_box,
- GtkCellView *cell_view)
-{
- GSList *k;
-
- for (k = combo_box->priv->cells; k; k = k->next)
- {
- GSList *j;
- ComboCellInfo *info = (ComboCellInfo *)k->data;
-
- if (info->pack == GTK_PACK_START)
- gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (cell_view),
- info->cell, info->expand);
- else if (info->pack == GTK_PACK_END)
- gtk_cell_layout_pack_end (GTK_CELL_LAYOUT (cell_view),
- info->cell, info->expand);
-
- gtk_cell_layout_set_cell_data_func (GTK_CELL_LAYOUT (cell_view),
- info->cell,
- info->func, info->func_data, NULL);
-
- for (j = info->attributes; j; j = j->next->next)
- {
- gtk_cell_layout_add_attribute (GTK_CELL_LAYOUT (cell_view),
- info->cell,
- j->data,
- GPOINTER_TO_INT (j->next->data));
- }
- }
-}
-
-static void
-gtk_combo_box_menu_setup (GtkComboBox *combo_box,
- gboolean add_children)
-{
- GtkWidget *menu;
-
- if (combo_box->priv->cell_view)
- {
- combo_box->priv->button = gtk_toggle_button_new ();
- g_signal_connect (combo_box->priv->button, "toggled",
- G_CALLBACK (gtk_combo_box_button_toggled), combo_box);
- g_signal_connect_after (combo_box->priv->button, "key_press_event",
- G_CALLBACK (gtk_combo_box_key_press), combo_box);
- gtk_widget_set_parent (combo_box->priv->button,
- GTK_BIN (combo_box)->child->parent);
-
- combo_box->priv->box = gtk_hbox_new (FALSE, 0);
- gtk_container_add (GTK_CONTAINER (combo_box->priv->button),
- combo_box->priv->box);
-
- combo_box->priv->separator = gtk_vseparator_new ();
- gtk_container_add (GTK_CONTAINER (combo_box->priv->box),
- combo_box->priv->separator);
-
- combo_box->priv->arrow = gtk_arrow_new (GTK_ARROW_DOWN, GTK_SHADOW_NONE);
- gtk_container_add (GTK_CONTAINER (combo_box->priv->box),
- combo_box->priv->arrow);
-
- gtk_widget_show_all (combo_box->priv->button);
- }
- else
- {
- combo_box->priv->button = gtk_toggle_button_new ();
- g_signal_connect (combo_box->priv->button, "toggled",
- G_CALLBACK (gtk_combo_box_button_toggled), combo_box);
- g_signal_connect_after (combo_box, "key_press_event",
- G_CALLBACK (gtk_combo_box_key_press), combo_box);
- gtk_widget_set_parent (combo_box->priv->button,
- GTK_BIN (combo_box)->child->parent);
-
- combo_box->priv->arrow = gtk_arrow_new (GTK_ARROW_DOWN, GTK_SHADOW_NONE);
- gtk_container_add (GTK_CONTAINER (combo_box->priv->button),
- combo_box->priv->arrow);
- gtk_widget_show_all (combo_box->priv->button);
- }
-
- g_signal_connect (combo_box->priv->button, "button_press_event",
- G_CALLBACK (gtk_combo_box_menu_button_press),
- combo_box);
-
- /* create our funky menu */
- menu = gtk_menu_new ();
- g_signal_connect (menu, "key_press_event",
- G_CALLBACK (gtk_combo_box_menu_key_press), combo_box);
- gtk_combo_box_set_popup_widget (combo_box, menu);
-
- /* add items */
- if (add_children)
- gtk_combo_box_menu_fill (combo_box);
-
-}
-
-static void
-gtk_combo_box_menu_fill (GtkComboBox *combo_box)
-{
- gint i, items;
- GtkWidget *menu;
- GtkWidget *tmp;
-
- if (!combo_box->priv->model)
- return;
-
- items = gtk_tree_model_iter_n_children (combo_box->priv->model, NULL);
- menu = combo_box->priv->popup_widget;
-
- for (i = 0; i < items; i++)
- {
- GtkTreePath *path;
-#if GTK_CHECK_VERSION(2,2,0)
- path = gtk_tree_path_new_from_indices (i, -1);
-#else
- char buf[32];
- g_snprintf(buf, sizeof(buf), "%d", i);
- path = gtk_tree_path_new_from_string(buf);
-#endif
- tmp = gtk_cell_view_menu_item_new_from_model (combo_box->priv->model,
- path);
- g_signal_connect (tmp, "activate",
- G_CALLBACK (gtk_combo_box_menu_item_activate),
- combo_box);
-
- cell_view_sync_cells (combo_box,
- GTK_CELL_VIEW (GTK_BIN (tmp)->child));
-
- gtk_menu_shell_append (GTK_MENU_SHELL (menu), tmp);
-
- if (combo_box->priv->wrap_width)
- gtk_combo_box_relayout_item (combo_box, i);
-
- gtk_widget_show (tmp);
-
- gtk_tree_path_free (path);
- }
-}
-
-static void
-gtk_combo_box_menu_destroy (GtkComboBox *combo_box)
-{
- g_signal_handlers_disconnect_matched (combo_box->priv->button,
- G_SIGNAL_MATCH_DATA,
- 0, 0, NULL,
- gtk_combo_box_menu_button_press, NULL);
-
- /* unparent will remove our latest ref */
- gtk_widget_unparent (combo_box->priv->button);
-
- combo_box->priv->box = NULL;
- combo_box->priv->button = NULL;
- combo_box->priv->arrow = NULL;
- combo_box->priv->separator = NULL;
-
- /* changing the popup window will unref the menu and the children */
-}
-
-/*
- * grid
- */
-
-static void
-gtk_combo_box_item_get_size (GtkComboBox *combo_box,
- gint index_,
- gint *cols,
- gint *rows)
-{
- GtkTreeIter iter;
-
- gtk_tree_model_iter_nth_child (combo_box->priv->model, &iter, NULL, index_);
-
- if (cols)
- {
- if (combo_box->priv->col_column == -1)
- *cols = 1;
- else
- gtk_tree_model_get (combo_box->priv->model, &iter,
- combo_box->priv->col_column, cols,
- -1);
- }
-
- if (rows)
- {
- if (combo_box->priv->row_column == -1)
- *rows = 1;
- else
- gtk_tree_model_get (combo_box->priv->model, &iter,
- combo_box->priv->row_column, rows,
- -1);
- }
-}
-
-static gboolean
-menu_occupied (GtkMenu *menu,
- guint left_attach,
- guint right_attach,
- guint top_attach,
- guint bottom_attach)
-{
- GList *i;
-
- g_return_val_if_fail (GTK_IS_MENU (menu), TRUE);
- g_return_val_if_fail (left_attach < right_attach, TRUE);
- g_return_val_if_fail (top_attach < bottom_attach, TRUE);
-
- for (i = GTK_MENU_SHELL (menu)->children; i; i = i->next)
- {
- guint l, r, b, t;
- gboolean h_intersect = FALSE;
- gboolean v_intersect = FALSE;
-
- gtk_container_child_get (GTK_CONTAINER (menu), i->data,
- "left_attach", &l,
- "right_attach", &r,
- "bottom_attach", &b,
- "top_attach", &t,
- NULL);
-
- /* look if this item intersects with the given coordinates */
- h_intersect = left_attach <= l && l <= right_attach;
- h_intersect &= left_attach <= r && r <= right_attach;
-
- v_intersect = top_attach <= t && t <= bottom_attach;
- v_intersect &= top_attach <= b && b <= bottom_attach;
-
- if (h_intersect && v_intersect)
- return TRUE;
- }
-
- return FALSE;
-}
-
-static void
-gtk_combo_box_relayout_item (GtkComboBox *combo_box,
- gint index)
-{
- gint current_col = 0, current_row = 0;
- gint rows, cols;
- GList *list, *nth;
- GtkWidget *item, *last;
- GtkWidget *menu;
-
- menu = combo_box->priv->popup_widget;
- if (!GTK_IS_MENU_SHELL (menu))
- return;
-
- list = gtk_container_get_children (GTK_CONTAINER (menu));
- nth = g_list_nth (list, index);
- item = nth->data;
- if (nth->prev)
- last = nth->prev->data;
- else
- last = NULL;
- g_list_free (list);
-
- gtk_combo_box_item_get_size (combo_box, index, &cols, &rows);
-
- if (combo_box->priv->col_column == -1 &&
- combo_box->priv->row_column == -1 &&
- last)
- {
- gtk_container_child_get (GTK_CONTAINER (menu),
- last,
- "right_attach", ¤t_col,
- "top_attach", ¤t_row,
- NULL);
- if (current_col + cols > combo_box->priv->wrap_width)
- {
- current_col = 0;
- current_row++;
- }
- }
- else
- {
- /* look for a good spot */
- while (1)
- {
- if (current_col + cols > combo_box->priv->wrap_width)
- {
- current_col = 0;
- current_row++;
- }
-
- if (!menu_occupied (GTK_MENU (menu),
- current_col, current_col + cols,
- current_row, current_row + rows))
- break;
-
- current_col++;
- }
- }
-
- /* set attach props */
- gtk_menu_attach (GTK_MENU (menu), item,
- current_col, current_col + cols,
- current_row, current_row + rows);
-}
-
-static void
-gtk_combo_box_relayout (GtkComboBox *combo_box)
-{
- GList *list, *j;
- GtkWidget *menu;
-
- menu = combo_box->priv->popup_widget;
-
- /* do nothing unless we are in menu style and realized */
- if (combo_box->priv->tree_view || !GTK_IS_MENU_SHELL (menu))
- return;
-
- /* get rid of all children */
- list = gtk_container_get_children (GTK_CONTAINER (menu));
-
- for (j = g_list_last (list); j; j = j->prev)
- gtk_container_remove (GTK_CONTAINER (menu), j->data);
-
- g_list_free (list);
-
- /* and relayout */
- gtk_combo_box_menu_fill (combo_box);
-}
-
-/* callbacks */
-static gboolean
-gtk_combo_box_menu_button_press (GtkWidget *widget,
- GdkEventButton *event,
- gpointer user_data)
-{
- GtkComboBox *combo_box = GTK_COMBO_BOX (user_data);
-
- if (! GTK_IS_MENU (combo_box->priv->popup_widget))
- return FALSE;
-
- if (event->type == GDK_BUTTON_PRESS && event->button == 1)
- {
- combo_box->priv->popup_in_progress = TRUE;
-
- gtk_menu_set_active (GTK_MENU (combo_box->priv->popup_widget),
- combo_box->priv->active_item);
-
- if (combo_box->priv->wrap_width == 0)
- {
- GtkRequisition requisition;
- gint width;
-
- width = GTK_WIDGET (combo_box)->allocation.width;
- gtk_widget_size_request (combo_box->priv->popup_widget, &requisition);
-
- gtk_widget_set_size_request (combo_box->priv->popup_widget,
- MAX (width, requisition.width), -1);
- }
-
- gtk_menu_popup (GTK_MENU (combo_box->priv->popup_widget),
- NULL, NULL,
-#if GTK_CHECK_VERSION(2,2,0)
- gtk_combo_box_menu_position,
-#else
- NULL,
-#endif
- combo_box, event->button, event->time);
-
- return TRUE;
- }
-
- return FALSE;
-}
-
-static void
-gtk_combo_box_menu_item_activate (GtkWidget *item,
- gpointer user_data)
-{
- gint index;
- GtkWidget *menu;
- GtkComboBox *combo_box = GTK_COMBO_BOX (user_data);
-
- menu = combo_box->priv->popup_widget;
- g_return_if_fail (GTK_IS_MENU (menu));
-
- index = g_list_index (GTK_MENU_SHELL (menu)->children, item);
-
- gtk_combo_box_set_active (combo_box, index);
-}
-
-static void
-gtk_combo_box_model_row_inserted (GtkTreeModel *model,
- GtkTreePath *path,
- GtkTreeIter *iter,
- gpointer user_data)
-{
- GtkComboBox *combo_box = GTK_COMBO_BOX (user_data);
- gint index = gtk_tree_path_get_indices (path)[0];
-
- if (combo_box->priv->active_item >= index)
- combo_box->priv->active_item++;
-
- if (!combo_box->priv->tree_view)
- gtk_combo_box_menu_row_inserted (model, path, iter, user_data);
-}
-
-static void
-gtk_combo_box_model_row_deleted (GtkTreeModel *model,
- GtkTreePath *path,
- gpointer user_data)
-{
- GtkComboBox *combo_box = GTK_COMBO_BOX (user_data);
- gint index = gtk_tree_path_get_indices (path)[0];
-
- if (!combo_box->priv->tree_view)
- gtk_combo_box_menu_row_deleted (model, path, user_data);
-
- if (index == combo_box->priv->active_item)
- {
- gint items = gtk_tree_model_iter_n_children (model, NULL);
-
- if (items == 0)
- gtk_combo_box_set_active_internal (combo_box, -1);
- else if (index == items)
- gtk_combo_box_set_active_internal (combo_box, index - 1);
- else
- gtk_combo_box_set_active_internal (combo_box, index);
- }
- else if (combo_box->priv->active_item > index)
- combo_box->priv->active_item--;
-}
-
-static void
-gtk_combo_box_model_rows_reordered (GtkTreeModel *model,
- GtkTreePath *path,
- GtkTreeIter *iter,
- gint *new_order,
- gpointer user_data)
-{
- GtkComboBox *combo_box = GTK_COMBO_BOX (user_data);
- gint items = gtk_tree_model_iter_n_children (model, NULL);
- gint i;
-
- for (i = 0; i < items; i++)
- if (new_order[i] == combo_box->priv->active_item)
- {
- combo_box->priv->active_item = i;
- break;
- }
-
- if (!combo_box->priv->tree_view)
- gtk_combo_box_menu_rows_reordered (model, path, iter, new_order, user_data);
-}
-
-static void
-gtk_combo_box_model_row_changed (GtkTreeModel *model,
- GtkTreePath *path,
- GtkTreeIter *iter,
- gpointer user_data)
-{
- GtkComboBox *combo_box = GTK_COMBO_BOX (user_data);
- gint index = gtk_tree_path_get_indices (path)[0];
-
- if (index == combo_box->priv->active_item &&
- combo_box->priv->cell_view)
- gtk_widget_queue_resize (GTK_WIDGET (combo_box->priv->cell_view));
-
- if (combo_box->priv->tree_view)
- gtk_combo_box_list_row_changed (model, path, iter, user_data);
- else
- gtk_combo_box_menu_row_changed (model, path, iter, user_data);
-}
-
-
-static void
-gtk_combo_box_menu_row_inserted (GtkTreeModel *model,
- GtkTreePath *path,
- GtkTreeIter *iter,
- gpointer user_data)
-{
- GtkWidget *menu;
- GtkWidget *item;
- GtkComboBox *combo_box = GTK_COMBO_BOX (user_data);
-
- if (!combo_box->priv->popup_widget)
- return;
-
- menu = combo_box->priv->popup_widget;
- g_return_if_fail (GTK_IS_MENU (menu));
-
- item = gtk_cell_view_menu_item_new_from_model (model, path);
- g_signal_connect (item, "activate",
- G_CALLBACK (gtk_combo_box_menu_item_activate),
- combo_box);
-
- cell_view_sync_cells (combo_box, GTK_CELL_VIEW (GTK_BIN (item)->child));
-
- gtk_menu_shell_insert (GTK_MENU_SHELL (menu), item,
- gtk_tree_path_get_indices (path)[0]);
- gtk_widget_show (item);
-}
-
-static void
-gtk_combo_box_menu_row_deleted (GtkTreeModel *model,
- GtkTreePath *path,
- gpointer user_data)
-{
- gint index;
- GtkWidget *menu;
- GtkWidget *item;
- GtkComboBox *combo_box = GTK_COMBO_BOX (user_data);
-
- if (!combo_box->priv->popup_widget)
- return;
-
- index = gtk_tree_path_get_indices (path)[0];
-
- menu = combo_box->priv->popup_widget;
- g_return_if_fail (GTK_IS_MENU (menu));
-
- item = g_list_nth_data (GTK_MENU_SHELL (menu)->children, index);
- g_return_if_fail (GTK_IS_MENU_ITEM (item));
-
- gtk_container_remove (GTK_CONTAINER (menu), item);
-}
-
-static void
-gtk_combo_box_menu_rows_reordered (GtkTreeModel *model,
- GtkTreePath *path,
- GtkTreeIter *iter,
- gint *new_order,
- gpointer user_data)
-{
- GtkComboBox *combo_box = GTK_COMBO_BOX (user_data);
-
- gtk_combo_box_relayout (combo_box);
-}
-
-static void
-gtk_combo_box_menu_row_changed (GtkTreeModel *model,
- GtkTreePath *path,
- GtkTreeIter *iter,
- gpointer user_data)
-{
- GtkComboBox *combo_box = GTK_COMBO_BOX (user_data);
- gint width;
-
- if (!combo_box->priv->popup_widget)
- return;
-
- if (combo_box->priv->wrap_width)
- gtk_combo_box_relayout_item (combo_box,
- gtk_tree_path_get_indices (path)[0]);
-
- width = gtk_combo_box_calc_requested_width (combo_box, path);
-
- if (width > combo_box->priv->width)
- {
- if (combo_box->priv->cell_view)
- {
- gtk_widget_set_size_request (combo_box->priv->cell_view, width, -1);
- gtk_widget_queue_resize (combo_box->priv->cell_view);
- }
- combo_box->priv->width = width;
- }
-}
-
-/*
- * list style
- */
-
-static void
-gtk_combo_box_list_setup (GtkComboBox *combo_box)
-{
- GSList *i;
- GtkTreeSelection *sel;
-
- combo_box->priv->button = gtk_toggle_button_new ();
- gtk_widget_set_parent (combo_box->priv->button,
- GTK_BIN (combo_box)->child->parent);
- g_signal_connect (combo_box->priv->button, "button_press_event",
- G_CALLBACK (gtk_combo_box_list_button_pressed), combo_box);
- g_signal_connect (combo_box->priv->button, "toggled",
- G_CALLBACK (gtk_combo_box_button_toggled), combo_box);
- g_signal_connect_after (combo_box, "key_press_event",
- G_CALLBACK (gtk_combo_box_key_press), combo_box);
-
- combo_box->priv->arrow = gtk_arrow_new (GTK_ARROW_DOWN, GTK_SHADOW_NONE);
- gtk_container_add (GTK_CONTAINER (combo_box->priv->button),
- combo_box->priv->arrow);
- combo_box->priv->separator = NULL;
- gtk_widget_show_all (combo_box->priv->button);
-
- if (combo_box->priv->cell_view)
- {
- combo_box->priv->cell_view_frame = gtk_frame_new (NULL);
- gtk_widget_set_parent (combo_box->priv->cell_view_frame,
- GTK_BIN (combo_box)->child->parent);
- gtk_frame_set_shadow_type (GTK_FRAME (combo_box->priv->cell_view_frame),
- GTK_SHADOW_IN);
-
- gtk_cell_view_set_background_color (GTK_CELL_VIEW (combo_box->priv->cell_view),
- >K_WIDGET (combo_box)->style->base[GTK_WIDGET_STATE (combo_box)]);
-
- combo_box->priv->box = gtk_event_box_new ();
- /*
- gtk_event_box_set_visible_window (GTK_EVENT_BOX (combo_box->priv->box),
- FALSE);
- */
-
- gtk_container_add (GTK_CONTAINER (combo_box->priv->cell_view_frame),
- combo_box->priv->box);
-
- gtk_widget_show_all (combo_box->priv->cell_view_frame);
-
- g_signal_connect (combo_box->priv->box, "button_press_event",
- G_CALLBACK (gtk_combo_box_list_button_pressed),
- combo_box);
- }
-
- combo_box->priv->tree_view = gtk_tree_view_new ();
- sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (combo_box->priv->tree_view));
- gtk_tree_selection_set_mode (sel, GTK_SELECTION_BROWSE);
- gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (combo_box->priv->tree_view),
- FALSE);
- /*
- _gtk_tree_view_set_hover_selection (GTK_TREE_VIEW (combo_box->priv->tree_view),
- TRUE);
- */
- if (combo_box->priv->model)
- gtk_tree_view_set_model (GTK_TREE_VIEW (combo_box->priv->tree_view),
- combo_box->priv->model);
-
- g_signal_connect (combo_box->priv->tree_view, "button_press_event",
- G_CALLBACK (gtk_combo_box_list_button_pressed),
- combo_box);
- g_signal_connect (combo_box->priv->tree_view, "button_release_event",
- G_CALLBACK (gtk_combo_box_list_button_released),
- combo_box);
- g_signal_connect (combo_box->priv->tree_view, "key_press_event",
- G_CALLBACK (gtk_combo_box_list_key_press),
- combo_box);
-
- combo_box->priv->column = gtk_tree_view_column_new ();
- gtk_tree_view_append_column (GTK_TREE_VIEW (combo_box->priv->tree_view),
- combo_box->priv->column);
-
- /* sync up */
- for (i = combo_box->priv->cells; i; i = i->next)
- {
- GSList *j;
- ComboCellInfo *info = (ComboCellInfo *)i->data;
-
- if (info->pack == GTK_PACK_START)
- gtk_tree_view_column_pack_start (combo_box->priv->column,
- info->cell, info->expand);
- else if (info->pack == GTK_PACK_END)
- gtk_tree_view_column_pack_end (combo_box->priv->column,
- info->cell, info->expand);
-
- for (j = info->attributes; j; j = j->next->next)
- {
- gtk_tree_view_column_add_attribute (combo_box->priv->column,
- info->cell,
- j->data,
- GPOINTER_TO_INT (j->next->data));
- }
- }
-
- if (combo_box->priv->active_item != -1)
- {
- GtkTreePath *path;
-
-#if GTK_CHECK_VERSION(2,2,0)
- path = gtk_tree_path_new_from_indices (combo_box->priv->active_item, -1);
-#else
- char buf[32];
- g_snprintf(buf, sizeof(buf), "%d", combo_box->priv->active_item);
- path = gtk_tree_path_new_from_string(buf);
-#endif
- if (path)
- {
- gtk_tree_view_set_cursor (GTK_TREE_VIEW (combo_box->priv->tree_view),
- path, NULL, FALSE);
- gtk_tree_path_free (path);
- }
- }
-
- /* set sample/popup widgets */
- gtk_combo_box_set_popup_widget (combo_box, combo_box->priv->tree_view);
-
- gtk_widget_show (combo_box->priv->tree_view);
-}
-
-static void
-gtk_combo_box_list_destroy (GtkComboBox *combo_box)
-{
- /* disconnect signals */
- g_signal_handlers_disconnect_matched (combo_box->priv->tree_view,
- G_SIGNAL_MATCH_DATA,
- 0, 0, NULL, NULL, combo_box);
- g_signal_handlers_disconnect_matched (combo_box->priv->button,
- G_SIGNAL_MATCH_DATA,
- 0, 0, NULL,
- gtk_combo_box_list_button_pressed,
- NULL);
- if (combo_box->priv->box)
- g_signal_handlers_disconnect_matched (combo_box->priv->box,
- G_SIGNAL_MATCH_DATA,
- 0, 0, NULL,
- gtk_combo_box_list_button_pressed,
- NULL);
-
- /* destroy things (unparent will kill the latest ref from us)
- * last unref on button will destroy the arrow
- */
- gtk_widget_unparent (combo_box->priv->button);
- combo_box->priv->button = NULL;
- combo_box->priv->arrow = NULL;
-
- if (combo_box->priv->cell_view)
- {
- g_object_set (G_OBJECT (combo_box->priv->cell_view),
- "background_set", FALSE,
- NULL);
- }
-
- if (combo_box->priv->cell_view_frame)
- {
- gtk_widget_unparent (combo_box->priv->cell_view_frame);
- combo_box->priv->cell_view_frame = NULL;
- combo_box->priv->box = NULL;
- }
-
- gtk_widget_destroy (combo_box->priv->tree_view);
-
- combo_box->priv->tree_view = NULL;
- combo_box->priv->popup_widget = NULL;
-}
-
-/* callbacks */
-static void
-gtk_combo_box_list_remove_grabs (GtkComboBox *combo_box)
-{
- if (combo_box->priv->tree_view &&
- GTK_WIDGET_HAS_GRAB (combo_box->priv->tree_view))
- {
- gtk_grab_remove (combo_box->priv->tree_view);
- }
-
- if (combo_box->priv->popup_window &&
- GTK_WIDGET_HAS_GRAB (combo_box->priv->popup_window))
- {
- gtk_grab_remove (combo_box->priv->popup_window);
- gdk_keyboard_ungrab (GDK_CURRENT_TIME);
- gdk_pointer_ungrab (GDK_CURRENT_TIME);
- }
-}
-
-static gboolean
-gtk_combo_box_list_button_pressed (GtkWidget *widget,
- GdkEventButton *event,
- gpointer data)
-{
- GtkComboBox *combo_box = GTK_COMBO_BOX (data);
-
- GtkWidget *ewidget = gtk_get_event_widget ((GdkEvent *)event);
-
- if (ewidget == combo_box->priv->tree_view)
- return TRUE;
-
- if ((ewidget != combo_box->priv->button && ewidget != combo_box->priv->box) ||
- gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (combo_box->priv->button)))
- return FALSE;
-
- gtk_combo_box_popup (combo_box);
-
- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (combo_box->priv->button),
- TRUE);
-
- combo_box->priv->popup_in_progress = TRUE;
-
- return TRUE;
-}
-
-static gboolean
-gtk_combo_box_list_button_released (GtkWidget *widget,
- GdkEventButton *event,
- gpointer data)
-{
- gboolean ret;
- GtkTreePath *path = NULL;
-
- GtkComboBox *combo_box = GTK_COMBO_BOX (data);
-
- gboolean popup_in_progress = FALSE;
-
- GtkWidget *ewidget = gtk_get_event_widget ((GdkEvent *)event);
-
- if (combo_box->priv->popup_in_progress)
- {
- popup_in_progress = TRUE;
- combo_box->priv->popup_in_progress = FALSE;
- }
-
- if (ewidget != combo_box->priv->tree_view)
- {
- if (ewidget == combo_box->priv->button &&
- !popup_in_progress &&
- gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (combo_box->priv->button)))
- {
- gtk_combo_box_popdown (combo_box);
- return TRUE;
- }
-
- /* released outside treeview */
- if (ewidget != combo_box->priv->button)
- {
- gtk_combo_box_popdown (combo_box);
-
- return TRUE;
- }
-
- return FALSE;
- }
-
- /* select something cool */
- ret = gtk_tree_view_get_path_at_pos (GTK_TREE_VIEW (widget),
- event->x, event->y,
- &path,
- NULL, NULL, NULL);
-
- if (!ret)
- return TRUE; /* clicked outside window? */
-
- gtk_combo_box_set_active (combo_box, gtk_tree_path_get_indices (path)[0]);
- gtk_combo_box_popdown (combo_box);
-
- gtk_tree_path_free (path);
-
- return TRUE;
-}
-
-static gboolean
-gtk_combo_box_key_press (GtkWidget *widget,
- GdkEventKey *event,
- gpointer data)
-{
- GtkComboBox *combo_box = GTK_COMBO_BOX (data);
- guint state = event->state & gtk_accelerator_get_default_mod_mask ();
- gint items = 0;
- gint index = gtk_combo_box_get_active (combo_box);
- gint new_index;
-
- if (combo_box->priv->model)
- items = gtk_tree_model_iter_n_children (combo_box->priv->model, NULL);
-
- if ((event->keyval == GDK_Down || event->keyval == GDK_KP_Down) &&
- state == GDK_MOD1_MASK)
- {
- gtk_combo_box_popup (combo_box);
-
- return TRUE;
- }
-
- switch (event->keyval)
- {
- case GDK_Down:
- case GDK_KP_Down:
- new_index = index + 1;
- break;
- case GDK_Up:
- case GDK_KP_Up:
- new_index = index - 1;
- break;
- case GDK_Page_Up:
- case GDK_KP_Page_Up:
- case GDK_Home:
- case GDK_KP_Home:
- new_index = 0;
- break;
- case GDK_Page_Down:
- case GDK_KP_Page_Down:
- case GDK_End:
- case GDK_KP_End:
- new_index = items - 1;
- break;
- default:
- return FALSE;
- }
-
- if (items > 0)
- gtk_combo_box_set_active (combo_box, CLAMP (new_index, 0, items - 1));
-
- return TRUE;
-}
-
-static gboolean
-gtk_combo_box_menu_key_press (GtkWidget *widget,
- GdkEventKey *event,
- gpointer data)
-{
- GtkComboBox *combo_box = GTK_COMBO_BOX (data);
- guint state = event->state & gtk_accelerator_get_default_mod_mask ();
-
- if ((event->keyval == GDK_Up || event->keyval == GDK_KP_Up) &&
- state == GDK_MOD1_MASK)
- {
- gtk_combo_box_popdown (combo_box);
-
- return TRUE;
- }
-
- return FALSE;
-}
-
-static gboolean
-gtk_combo_box_list_key_press (GtkWidget *widget,
- GdkEventKey *event,
- gpointer data)
-{
- GtkComboBox *combo_box = GTK_COMBO_BOX (data);
- guint state = event->state & gtk_accelerator_get_default_mod_mask ();
-
- if (event->keyval == GDK_Escape ||
- ((event->keyval == GDK_Up || event->keyval == GDK_KP_Up) &&
- state == GDK_MOD1_MASK))
- {
- /* reset active item -- this is incredibly lame and ugly */
- gtk_combo_box_set_active (combo_box,
- gtk_combo_box_get_active (combo_box));
-
- gtk_combo_box_popdown (combo_box);
-
- return TRUE;
- }
-
- if (event->keyval == GDK_Return || event->keyval == GDK_KP_Enter ||
- event->keyval == GDK_space || event->keyval == GDK_KP_Space)
- {
- gboolean ret = FALSE;
- GtkTreeIter iter;
- GtkTreeModel *model = NULL;
-
- if (combo_box->priv->model)
- {
- GtkTreeSelection *sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (combo_box->priv->tree_view));
-
- ret = gtk_tree_selection_get_selected (sel, &model, &iter);
- }
- if (ret)
- {
- GtkTreePath *path;
-
- path = gtk_tree_model_get_path (model, &iter);
- if (path)
- {
- gtk_combo_box_set_active (combo_box, gtk_tree_path_get_indices (path)[0]);
- gtk_tree_path_free (path);
- }
- }
-
- gtk_combo_box_popdown (combo_box);
-
- return TRUE;
- }
-
- return FALSE;
-}
-
-static void
-gtk_combo_box_list_row_changed (GtkTreeModel *model,
- GtkTreePath *path,
- GtkTreeIter *iter,
- gpointer data)
-{
- GtkComboBox *combo_box = GTK_COMBO_BOX (data);
- gint width;
-
- width = gtk_combo_box_calc_requested_width (combo_box, path);
-
- if (width > combo_box->priv->width)
- {
- if (combo_box->priv->cell_view)
- {
- gtk_widget_set_size_request (combo_box->priv->cell_view, width, -1);
- gtk_widget_queue_resize (combo_box->priv->cell_view);
- }
- combo_box->priv->width = width;
- }
-}
-
-/*
- * GtkCellLayout implementation
- */
-static void
-gtk_combo_box_cell_layout_pack_start (GtkCellLayout *layout,
- GtkCellRenderer *cell,
- gboolean expand)
-{
- ComboCellInfo *info;
- GtkComboBox *combo_box;
- GtkWidget *menu;
-
- g_return_if_fail (GTK_IS_COMBO_BOX (layout));
- g_return_if_fail (GTK_IS_CELL_RENDERER (cell));
-
- combo_box = GTK_COMBO_BOX (layout);
-
- g_object_ref (G_OBJECT (cell));
- gtk_object_sink (GTK_OBJECT (cell));
-
- info = g_new0 (ComboCellInfo, 1);
- info->cell = cell;
- info->expand = expand;
- info->pack = GTK_PACK_START;
-
- combo_box->priv->cells = g_slist_append (combo_box->priv->cells, info);
-
- if (combo_box->priv->cell_view)
- gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combo_box->priv->cell_view),
- cell, expand);
-
- if (combo_box->priv->column)
- gtk_tree_view_column_pack_start (combo_box->priv->column, cell, expand);
-
- menu = combo_box->priv->popup_widget;
- if (GTK_IS_MENU (menu))
- {
- GList *i, *list;
-
- list = gtk_container_get_children (GTK_CONTAINER (menu));
- for (i = list; i; i = i->next)
- {
- GtkCellView *view;
-
- if (GTK_IS_CELL_VIEW_MENU_ITEM (i->data))
- view = GTK_CELL_VIEW (GTK_BIN (i->data)->child);
- else
- view = GTK_CELL_VIEW (i->data);
-
- gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (view), cell, expand);
- }
- g_list_free (list);
- }
-}
-
-static void
-gtk_combo_box_cell_layout_pack_end (GtkCellLayout *layout,
- GtkCellRenderer *cell,
- gboolean expand)
-{
- ComboCellInfo *info;
- GtkComboBox *combo_box;
- GtkWidget *menu;
-
- g_return_if_fail (GTK_IS_COMBO_BOX (layout));
- g_return_if_fail (GTK_IS_CELL_RENDERER (cell));
-
- combo_box = GTK_COMBO_BOX (layout);
-
- g_object_ref (G_OBJECT (cell));
- gtk_object_sink (GTK_OBJECT (cell));
-
- info = g_new0 (ComboCellInfo, 1);
- info->cell = cell;
- info->expand = expand;
- info->pack = GTK_PACK_END;
-
- combo_box->priv->cells = g_slist_append (combo_box->priv->cells, info);
-
- if (combo_box->priv->cell_view)
- gtk_cell_layout_pack_end (GTK_CELL_LAYOUT (combo_box->priv->cell_view),
- cell, expand);
-
- if (combo_box->priv->column)
- gtk_tree_view_column_pack_end (combo_box->priv->column, cell, expand);
-
- menu = combo_box->priv->popup_widget;
- if (GTK_IS_MENU (menu))
- {
- GList *i, *list;
-
- list = gtk_container_get_children (GTK_CONTAINER (menu));
- for (i = list; i; i = i->next)
- {
- GtkCellView *view;
-
- if (GTK_IS_CELL_VIEW_MENU_ITEM (i->data))
- view = GTK_CELL_VIEW (GTK_BIN (i->data)->child);
- else
- view = GTK_CELL_VIEW (i->data);
-
- gtk_cell_layout_pack_end (GTK_CELL_LAYOUT (view), cell, expand);
- }
- g_list_free (list);
- }
-}
-
-static void
-gtk_combo_box_cell_layout_clear (GtkCellLayout *layout)
-{
- GtkWidget *menu;
- GtkComboBox *combo_box;
- GSList *i;
-
- g_return_if_fail (GTK_IS_COMBO_BOX (layout));
-
- combo_box = GTK_COMBO_BOX (layout);
-
- if (combo_box->priv->cell_view)
- gtk_cell_layout_clear (GTK_CELL_LAYOUT (combo_box->priv->cell_view));
-
- if (combo_box->priv->column)
- gtk_tree_view_column_clear (combo_box->priv->column);
-
- for (i = combo_box->priv->cells; i; i = i->next)
- {
- ComboCellInfo *info = (ComboCellInfo *)i->data;
-
- gtk_combo_box_cell_layout_clear_attributes (layout, info->cell);
- g_object_unref (G_OBJECT (info->cell));
- g_free (info);
- i->data = NULL;
- }
- g_slist_free (combo_box->priv->cells);
- combo_box->priv->cells = NULL;
-
- menu = combo_box->priv->popup_widget;
- if (GTK_IS_MENU (menu))
- {
- GList *i, *list;
-
- list = gtk_container_get_children (GTK_CONTAINER (menu));
- for (i = list; i; i = i->next)
- {
- GtkCellView *view;
-
- if (GTK_IS_CELL_VIEW_MENU_ITEM (i->data))
- view = GTK_CELL_VIEW (GTK_BIN (i->data)->child);
- else
- view = GTK_CELL_VIEW (i->data);
-
- gtk_cell_layout_clear (GTK_CELL_LAYOUT (view));
- }
- g_list_free (list);
- }
-}
-
-static void
-gtk_combo_box_cell_layout_add_attribute (GtkCellLayout *layout,
- GtkCellRenderer *cell,
- const gchar *attribute,
- gint column)
-{
- ComboCellInfo *info;
- GtkComboBox *combo_box;
- GtkWidget *menu;
-
- g_return_if_fail (GTK_IS_COMBO_BOX (layout));
- g_return_if_fail (GTK_IS_CELL_RENDERER (cell));
-
- combo_box = GTK_COMBO_BOX (layout);
-
- info = gtk_combo_box_get_cell_info (combo_box, cell);
-
- info->attributes = g_slist_prepend (info->attributes,
- GINT_TO_POINTER (column));
- info->attributes = g_slist_prepend (info->attributes,
- g_strdup (attribute));
-
- if (combo_box->priv->cell_view)
- gtk_cell_layout_add_attribute (GTK_CELL_LAYOUT (combo_box->priv->cell_view),
- cell, attribute, column);
-
- if (combo_box->priv->column)
- gtk_cell_layout_add_attribute (GTK_CELL_LAYOUT (combo_box->priv->column),
- cell, attribute, column);
-
- menu = combo_box->priv->popup_widget;
- if (GTK_IS_MENU (menu))
- {
- GList *i, *list;
-
- list = gtk_container_get_children (GTK_CONTAINER (menu));
- for (i = list; i; i = i->next)
- {
- GtkCellView *view;
-
- if (GTK_IS_CELL_VIEW_MENU_ITEM (i->data))
- view = GTK_CELL_VIEW (GTK_BIN (i->data)->child);
- else
- view = GTK_CELL_VIEW (i->data);
-
- gtk_cell_layout_add_attribute (GTK_CELL_LAYOUT (view), cell,
- attribute, column);
- }
- g_list_free (list);
- }
-
- gtk_widget_queue_resize (GTK_WIDGET (combo_box));
-}
-
-static void
-gtk_combo_box_cell_layout_set_cell_data_func (GtkCellLayout *layout,
- GtkCellRenderer *cell,
- GtkCellLayoutDataFunc func,
- gpointer func_data,
- GDestroyNotify destroy)
-{
- ComboCellInfo *info;
- GtkComboBox *combo_box;
- GtkWidget *menu;
-
- g_return_if_fail (GTK_IS_COMBO_BOX (layout));
-
- combo_box = GTK_COMBO_BOX (layout);
-
- info = gtk_combo_box_get_cell_info (combo_box, cell);
- g_return_if_fail (info != NULL);
-
- if (info->destroy)
- {
- GDestroyNotify d = info->destroy;
-
- info->destroy = NULL;
- d (info->func_data);
- }
-
- info->func = func;
- info->func_data = func_data;
- info->destroy = destroy;
-
- if (combo_box->priv->cell_view)
- gtk_cell_layout_set_cell_data_func (GTK_CELL_LAYOUT (combo_box->priv->cell_view), cell, func, func_data, NULL);
-
- if (combo_box->priv->column)
- gtk_cell_layout_set_cell_data_func (GTK_CELL_LAYOUT (combo_box->priv->column), cell, func, func_data, NULL);
-
- menu = combo_box->priv->popup_widget;
- if (GTK_IS_MENU (menu))
- {
- GList *i, *list;
-
- list = gtk_container_get_children (GTK_CONTAINER (menu));
- for (i = list; i; i = i->next)
- {
- GtkCellView *view;
-
- if (GTK_IS_CELL_VIEW_MENU_ITEM (i->data))
- view = GTK_CELL_VIEW (GTK_BIN (i->data)->child);
- else
- view = GTK_CELL_VIEW (i->data);
-
- gtk_cell_layout_set_cell_data_func (GTK_CELL_LAYOUT (view), cell,
- func, func_data, NULL);
- }
- g_list_free (list);
- }
-
- gtk_widget_queue_resize (GTK_WIDGET (combo_box));
-}
-
-static void
-gtk_combo_box_cell_layout_clear_attributes (GtkCellLayout *layout,
- GtkCellRenderer *cell)
-{
- ComboCellInfo *info;
- GtkComboBox *combo_box;
- GtkWidget *menu;
- GSList *list;
-
- g_return_if_fail (GTK_IS_COMBO_BOX (layout));
- g_return_if_fail (GTK_IS_CELL_RENDERER (cell));
-
- combo_box = GTK_COMBO_BOX (layout);
-
- info = gtk_combo_box_get_cell_info (combo_box, cell);
- if (info)
- {
- list = info->attributes;
- while (list && list->next)
- {
- g_free (list->data);
- list = list->next->next;
- }
- g_slist_free (info->attributes);
- info->attributes = NULL;
- }
-
- if (combo_box->priv->cell_view)
- gtk_cell_layout_clear_attributes (GTK_CELL_LAYOUT (combo_box->priv->cell_view), cell);
-
- if (combo_box->priv->column)
- gtk_cell_layout_clear_attributes (GTK_CELL_LAYOUT (combo_box->priv->column), cell);
-
- menu = combo_box->priv->popup_widget;
- if (GTK_IS_MENU (menu))
- {
- GList *i, *list;
-
- list = gtk_container_get_children (GTK_CONTAINER (menu));
- for (i = list; i; i = i->next)
- {
- GtkCellView *view;
-
- if (GTK_IS_CELL_VIEW_MENU_ITEM (i->data))
- view = GTK_CELL_VIEW (GTK_BIN (i->data)->child);
- else
- view = GTK_CELL_VIEW (i->data);
-
- gtk_cell_layout_clear_attributes (GTK_CELL_LAYOUT (view), cell);
- }
- g_list_free (list);
- }
-
- gtk_widget_queue_resize (GTK_WIDGET (combo_box));
-}
-
-static void
-gtk_combo_box_cell_layout_reorder (GtkCellLayout *layout,
- GtkCellRenderer *cell,
- gint position)
-{
- ComboCellInfo *info;
- GtkComboBox *combo_box;
- GtkWidget *menu;
- GSList *link;
-
- g_return_if_fail (GTK_IS_COMBO_BOX (layout));
- g_return_if_fail (GTK_IS_CELL_RENDERER (cell));
-
- combo_box = GTK_COMBO_BOX (layout);
-
- info = gtk_combo_box_get_cell_info (combo_box, cell);
-
- g_return_if_fail (info != NULL);
- g_return_if_fail (position >= 0);
-
- link = g_slist_find (combo_box->priv->cells, info);
-
- g_return_if_fail (link != NULL);
-
- combo_box->priv->cells = g_slist_delete_link (combo_box->priv->cells, link);
- combo_box->priv->cells = g_slist_insert (combo_box->priv->cells, info,
- position);
-
- if (combo_box->priv->cell_view)
- gtk_cell_layout_reorder (GTK_CELL_LAYOUT (combo_box->priv->cell_view),
- cell, position);
-
- if (combo_box->priv->column)
- gtk_cell_layout_reorder (GTK_CELL_LAYOUT (combo_box->priv->column),
- cell, position);
-
- menu = combo_box->priv->popup_widget;
- if (GTK_IS_MENU (menu))
- {
- GList *i, *list;
-
- list = gtk_container_get_children (GTK_CONTAINER (menu));
- for (i = list; i; i = i->next)
- {
- GtkCellView *view;
-
- if (GTK_IS_CELL_VIEW_MENU_ITEM (i->data))
- view = GTK_CELL_VIEW (GTK_BIN (i->data)->child);
- else
- view = GTK_CELL_VIEW (i->data);
-
- gtk_cell_layout_reorder (GTK_CELL_LAYOUT (view), cell, position);
- }
- g_list_free (list);
- }
-
- gtk_widget_queue_draw (GTK_WIDGET (combo_box));
-}
-
-/*
- * public API
- */
-
-/**
- * gtk_combo_box_new:
- *
- * Creates a new empty #GtkComboBox.
- *
- * Return value: A new #GtkComboBox.
- *
- * Since: 2.4
- */
-GtkWidget *
-gtk_combo_box_new (void)
-{
- return GTK_WIDGET (g_object_new (GTK_TYPE_COMBO_BOX, NULL));
-}
-
-/**
- * gtk_combo_box_new_with_model:
- * @model: A #GtkTreeModel.
- *
- * Creates a new #GtkComboBox with the model initialized to @model.
- *
- * Return value: A new #GtkComboBox.
- *
- * Since: 2.4
- */
-GtkWidget *
-gtk_combo_box_new_with_model (GtkTreeModel *model)
-{
- GtkComboBox *combo_box;
-
- g_return_val_if_fail (GTK_IS_TREE_MODEL (model), NULL);
-
- combo_box = GTK_COMBO_BOX (g_object_new (GTK_TYPE_COMBO_BOX,
- "model", model,
- NULL));
-
- return GTK_WIDGET (combo_box);
-}
-
-/**
- * gtk_combo_box_set_wrap_width:
- * @combo_box: A #GtkComboBox.
- * @width: Preferred number of columns.
- *
- * Sets the wrap width of @combo_box to be @width. The wrap width is basically
- * the preferred number of columns when you want to the popup to be layed out
- * in a table.
- *
- * Since: 2.4
- */
-void
-gtk_combo_box_set_wrap_width (GtkComboBox *combo_box,
- gint width)
-{
- g_return_if_fail (GTK_IS_COMBO_BOX (combo_box));
- g_return_if_fail (width >= 0);
-
- if (width != combo_box->priv->wrap_width)
- {
- combo_box->priv->wrap_width = width;
-
- gtk_combo_box_check_appearance (combo_box);
- gtk_combo_box_relayout (combo_box);
-
- g_object_notify (G_OBJECT (combo_box), "wrap_width");
- }
-}
-
-/**
- * gtk_combo_box_set_row_span_column:
- * @combo_box: A #GtkComboBox.
- * @row_span: A column in the model passed during construction.
- *
- * Sets the column with row span information for @combo_box to be @row_span.
- * The row span column contains integers which indicate how many rows
- * an item should span.
- *
- * Since: 2.4
- */
-void
-gtk_combo_box_set_row_span_column (GtkComboBox *combo_box,
- gint row_span)
-{
- gint col;
-
- g_return_if_fail (GTK_IS_COMBO_BOX (combo_box));
-
- col = gtk_tree_model_get_n_columns (combo_box->priv->model);
- g_return_if_fail (row_span >= 0 && row_span < col);
-
- if (row_span != combo_box->priv->row_column)
- {
- combo_box->priv->row_column = row_span;
-
- gtk_combo_box_relayout (combo_box);
-
- g_object_notify (G_OBJECT (combo_box), "row_span_column");
- }
-}
-
-/**
- * gtk_combo_box_set_column_span_column:
- * @combo_box: A #GtkComboBox.
- * @column_span: A column in the model passed during construction.
- *
- * Sets the column with column span information for @combo_box to be
- * @column_span. The column span column contains integers which indicate
- * how many columns an item should span.
- *
- * Since: 2.4
- */
-void
-gtk_combo_box_set_column_span_column (GtkComboBox *combo_box,
- gint column_span)
-{
- gint col;
-
- g_return_if_fail (GTK_IS_COMBO_BOX (combo_box));
-
- col = gtk_tree_model_get_n_columns (combo_box->priv->model);
- g_return_if_fail (column_span >= 0 && column_span < col);
-
- if (column_span != combo_box->priv->col_column)
- {
- combo_box->priv->col_column = column_span;
-
- gtk_combo_box_relayout (combo_box);
-
- g_object_notify (G_OBJECT (combo_box), "column_span_column");
- }
-}
-
-/**
- * gtk_combo_box_get_active:
- * @combo_box: A #GtkComboBox.
- *
- * Returns the index of the currently active item, or -1 if there's no
- * active item.
- *
- * Return value: An integer which is the index of the currently active item, or
- * -1 if there's no active item.
- *
- * Since: 2.4
- */
-gint
-gtk_combo_box_get_active (GtkComboBox *combo_box)
-{
- g_return_val_if_fail (GTK_IS_COMBO_BOX (combo_box), 0);
-
- return combo_box->priv->active_item;
-}
-
-/**
- * gtk_combo_box_set_active:
- * @combo_box: A #GtkComboBox.
- * @index_: An index in the model passed during construction, or -1 to have
- * no active item.
- *
- * Sets the active item of @combo_box to be the item at @index.
- *
- * Since: 2.4
- */
-void
-gtk_combo_box_set_active (GtkComboBox *combo_box,
- gint index_)
-{
- g_return_if_fail (GTK_IS_COMBO_BOX (combo_box));
- /* -1 means "no item selected" */
- g_return_if_fail (index_ >= -1);
-
- if (combo_box->priv->active_item == index_)
- return;
-
- gtk_combo_box_set_active_internal (combo_box, index_);
-}
-
-static void
-gtk_combo_box_set_active_internal (GtkComboBox *combo_box,
- gint index)
-{
- GtkTreePath *path;
-
- combo_box->priv->active_item = index;
-
- if (index == -1)
- {
- if (combo_box->priv->tree_view)
- gtk_tree_selection_unselect_all (gtk_tree_view_get_selection (GTK_TREE_VIEW (combo_box->priv->tree_view)));
- else
- {
- GtkMenu *menu = GTK_MENU (combo_box->priv->popup_widget);
-
- if (GTK_IS_MENU (menu))
- gtk_menu_set_active (menu, -1);
- }
-
- if (combo_box->priv->cell_view)
- gtk_cell_view_set_displayed_row (GTK_CELL_VIEW (combo_box->priv->cell_view), NULL);
- }
- else
- {
-#if GTK_CHECK_VERSION(2,2,0)
- path = gtk_tree_path_new_from_indices (index, -1);
-#else
- char buf[32];
- g_snprintf(buf, sizeof(buf), "%d", index);
- path = gtk_tree_path_new_from_string(buf);
-#endif
-
- if (combo_box->priv->tree_view)
- gtk_tree_view_set_cursor (GTK_TREE_VIEW (combo_box->priv->tree_view), path, NULL, FALSE);
- else
- {
- GtkMenu *menu = GTK_MENU (combo_box->priv->popup_widget);
-
- if (GTK_IS_MENU (menu))
- gtk_menu_set_active (GTK_MENU (menu), index);
- }
-
- if (combo_box->priv->cell_view)
- gtk_cell_view_set_displayed_row (GTK_CELL_VIEW (combo_box->priv->cell_view), path);
-
- gtk_tree_path_free (path);
- }
-
- g_signal_emit_by_name (combo_box, "changed", NULL, NULL);
-}
-
-
-/**
- * gtk_combo_box_get_active_iter:
- * @combo_box: A #GtkComboBox
- * @iter: The uninitialized #GtkTreeIter.
- *
- * Sets @iter to point to the current active item, if it exists.
- *
- * Return value: %TRUE, if @iter was set
- *
- * Since: 2.4
- **/
-gboolean
-gtk_combo_box_get_active_iter (GtkComboBox *combo_box,
- GtkTreeIter *iter)
-{
- GtkTreePath *path;
- gint active;
- gboolean retval;
-#if !GTK_CHECK_VERSION(2,2,0)
- char buf[32];
-#endif
-
- g_return_val_if_fail (GTK_IS_COMBO_BOX (combo_box), FALSE);
-
- active = gtk_combo_box_get_active (combo_box);
- if (active < 0)
- return FALSE;
-
-#if GTK_CHECK_VERSION(2,2,0)
- path = gtk_tree_path_new_from_indices (active, -1);
-#else
- g_snprintf(buf, sizeof(buf), "%d", active);
- path = gtk_tree_path_new_from_string(buf);
-#endif
- retval = gtk_tree_model_get_iter (gtk_combo_box_get_model (combo_box),
- iter, path);
- gtk_tree_path_free (path);
-
- return retval;
-}
-
-/**
- * gtk_combo_box_set_active_iter:
- * @combo_box: A #GtkComboBox
- * @iter: The #GtkTreeIter.
- *
- * Sets the current active item to be the one referenced by @iter.
- * @iter must correspond to a path of depth one.
- *
- * Since: 2.4
- **/
-void
-gtk_combo_box_set_active_iter (GtkComboBox *combo_box,
- GtkTreeIter *iter)
-{
- GtkTreePath *path;
-
- g_return_if_fail (GTK_IS_COMBO_BOX (combo_box));
-
- path = gtk_tree_model_get_path (gtk_combo_box_get_model (combo_box), iter);
- g_return_if_fail (path != NULL);
- g_return_if_fail (gtk_tree_path_get_depth (path) == 1);
-
- gtk_combo_box_set_active (combo_box, gtk_tree_path_get_indices (path)[0]);
- gtk_tree_path_free (path);
-}
-
-/**
- * gtk_combo_box_set_model:
- * @combo_box: A #GtkComboBox.
- * @model: A #GtkTreeModel.
- *
- * Sets the model used by @combo_box to be @model. Will unset a previously set
- * model (if applicable). If @model is %NULL, then it will unset the model.
- *
- * Note that this function does not clear the cell renderers, you have to
- * call gtk_combo_box_cell_layout_clear() yourself if you need to set up
- * different cell renderers for the new model.
- *
- * Since: 2.4
- */
-void
-gtk_combo_box_set_model (GtkComboBox *combo_box,
- GtkTreeModel *model)
-{
- g_return_if_fail (GTK_IS_COMBO_BOX (combo_box));
-
- if (!model)
- {
- gtk_combo_box_unset_model (combo_box);
- return;
- }
-
- g_return_if_fail (GTK_IS_TREE_MODEL (model));
-
- if (model == combo_box->priv->model)
- return;
-
- if (combo_box->priv->model)
- gtk_combo_box_unset_model (combo_box);
-
- combo_box->priv->model = model;
- g_object_ref (G_OBJECT (combo_box->priv->model));
-
- combo_box->priv->inserted_id =
- g_signal_connect (combo_box->priv->model, "row_inserted",
- G_CALLBACK (gtk_combo_box_model_row_inserted),
- combo_box);
- combo_box->priv->deleted_id =
- g_signal_connect (combo_box->priv->model, "row_deleted",
- G_CALLBACK (gtk_combo_box_model_row_deleted),
- combo_box);
- combo_box->priv->reordered_id =
- g_signal_connect (combo_box->priv->model, "rows_reordered",
- G_CALLBACK (gtk_combo_box_model_rows_reordered),
- combo_box);
- combo_box->priv->changed_id =
- g_signal_connect (combo_box->priv->model, "row_changed",
- G_CALLBACK (gtk_combo_box_model_row_changed),
- combo_box);
-
- if (combo_box->priv->tree_view)
- {
- /* list mode */
- gtk_tree_view_set_model (GTK_TREE_VIEW (combo_box->priv->tree_view),
- combo_box->priv->model);
- }
- else
- {
- /* menu mode */
- if (combo_box->priv->popup_widget)
- gtk_combo_box_menu_fill (combo_box);
-
- }
-
- if (combo_box->priv->cell_view)
- gtk_cell_view_set_model (GTK_CELL_VIEW (combo_box->priv->cell_view),
- combo_box->priv->model);
-}
-
-/**
- * gtk_combo_box_get_model
- * @combo_box: A #GtkComboBox.
- *
- * Returns the #GtkTreeModel which is acting as data source for @combo_box.
- *
- * Return value: A #GtkTreeModel which was passed during construction.
- *
- * Since: 2.4
- */
-GtkTreeModel *
-gtk_combo_box_get_model (GtkComboBox *combo_box)
-{
- g_return_val_if_fail (GTK_IS_COMBO_BOX (combo_box), NULL);
-
- return combo_box->priv->model;
-}
-
-
-/* convenience API for simple text combos */
-
-/**
- * gtk_combo_box_new_text:
- *
- * Convenience function which constructs a new text combo box, which is a
- * #GtkComboBox just displaying strings. If you use this function to create
- * a text combo box, you should only manipulate its data source with the
- * following convenience functions: gtk_combo_box_append_text(),
- * gtk_combo_box_insert_text(), gtk_combo_box_prepend_text() and
- * gtk_combo_box_remove_text().
- *
- * Return value: A new text combo box.
- *
- * Since: 2.4
- */
-GtkWidget *
-gtk_combo_box_new_text (void)
-{
- GtkWidget *combo_box;
- GtkCellRenderer *cell;
- GtkListStore *store;
-
- store = gtk_list_store_new (1, G_TYPE_STRING);
- combo_box = gtk_combo_box_new_with_model (GTK_TREE_MODEL (store));
- g_object_unref (store);
-
- cell = gtk_cell_renderer_text_new ();
- gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combo_box), cell, TRUE);
- gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (combo_box), cell,
- "text", 0,
- NULL);
-
- return combo_box;
-}
-
-/**
- * gtk_combo_box_append_text:
- * @combo_box: A #GtkComboBox constructed using gtk_combo_box_new_text().
- * @text: A string.
- *
- * Appends @string to the list of strings stored in @combo_box. Note that
- * you can only use this function with combo boxes constructed with
- * gtk_combo_box_new_text().
- *
- * Since: 2.4
- */
-void
-gtk_combo_box_append_text (GtkComboBox *combo_box,
- const gchar *text)
-{
- GtkTreeIter iter;
- GtkListStore *store;
-
- g_return_if_fail (GTK_IS_COMBO_BOX (combo_box));
- g_return_if_fail (GTK_IS_LIST_STORE (combo_box->priv->model));
- g_return_if_fail (text != NULL);
-
- store = GTK_LIST_STORE (combo_box->priv->model);
-
- gtk_list_store_append (store, &iter);
- gtk_list_store_set (store, &iter, 0, text, -1);
-}
-
-/**
- * gtk_combo_box_insert_text:
- * @combo_box: A #GtkComboBox constructed using gtk_combo_box_new_text().
- * @position: An index to insert @text.
- * @text: A string.
- *
- * Inserts @string at @position in the list of strings stored in @combo_box.
- * Note that you can only use this function with combo boxes constructed
- * with gtk_combo_box_new_text().
- *
- * Since: 2.4
- */
-void
-gtk_combo_box_insert_text (GtkComboBox *combo_box,
- gint position,
- const gchar *text)
-{
- GtkTreeIter iter;
- GtkListStore *store;
-
- g_return_if_fail (GTK_IS_COMBO_BOX (combo_box));
- g_return_if_fail (GTK_IS_LIST_STORE (combo_box->priv->model));
- g_return_if_fail (position >= 0);
- g_return_if_fail (text != NULL);
-
- store = GTK_LIST_STORE (combo_box->priv->model);
-
- gtk_list_store_insert (store, &iter, position);
- gtk_list_store_set (store, &iter, 0, text, -1);
-}
-
-/**
- * gtk_combo_box_prepend_text:
- * @combo_box: A #GtkComboBox constructed with gtk_combo_box_new_text().
- * @text: A string.
- *
- * Prepends @string to the list of strings stored in @combo_box. Note that
- * you can only use this function with combo boxes constructed with
- * gtk_combo_box_new_text().
- *
- * Since: 2.4
- */
-void
-gtk_combo_box_prepend_text (GtkComboBox *combo_box,
- const gchar *text)
-{
- GtkTreeIter iter;
- GtkListStore *store;
-
- g_return_if_fail (GTK_IS_COMBO_BOX (combo_box));
- g_return_if_fail (GTK_IS_LIST_STORE (combo_box->priv->model));
- g_return_if_fail (text != NULL);
-
- store = GTK_LIST_STORE (combo_box->priv->model);
-
- gtk_list_store_prepend (store, &iter);
- gtk_list_store_set (store, &iter, 0, text, -1);
-}
-
-/**
- * gtk_combo_box_remove_text:
- * @combo_box: A #GtkComboBox constructed with gtk_combo_box_new_text().
- * @position: Index of the item to remove.
- *
- * Removes the string at @position from @combo_box. Note that you can only use
- * this function with combo boxes constructed with gtk_combo_box_new_text().
- *
- * Since: 2.4
- */
-void
-gtk_combo_box_remove_text (GtkComboBox *combo_box,
- gint position)
-{
- GtkTreeIter iter;
- GtkListStore *store;
-
- g_return_if_fail (GTK_IS_COMBO_BOX (combo_box));
- g_return_if_fail (GTK_IS_LIST_STORE (combo_box->priv->model));
- g_return_if_fail (position >= 0);
-
- store = GTK_LIST_STORE (combo_box->priv->model);
-
- if (gtk_tree_model_iter_nth_child (combo_box->priv->model, &iter,
- NULL, position))
- gtk_list_store_remove (store, &iter);
-}
-
-static gboolean
-gtk_combo_box_mnemonic_activate (GtkWidget *widget,
- gboolean group_cycling)
-{
- GtkComboBox *combo_box = GTK_COMBO_BOX (widget);
-
- gtk_widget_grab_focus (combo_box->priv->button);
-
- return TRUE;
-}
-
-static void
-gtk_combo_box_destroy (GtkObject *object)
-{
- GtkComboBox *combo_box = GTK_COMBO_BOX (object);
-
- gtk_combo_box_popdown (combo_box);
-
- combo_box->priv->destroying = 1;
-
- GTK_OBJECT_CLASS (parent_class)->destroy (object);
- combo_box->priv->cell_view = NULL;
-
- combo_box->priv->destroying = 0;
-}
-
-static void
-gtk_combo_box_finalize (GObject *object)
-{
- GtkComboBox *combo_box = GTK_COMBO_BOX (object);
- GSList *i;
-
- if (GTK_IS_MENU (combo_box->priv->popup_widget))
- {
- gtk_combo_box_menu_destroy (combo_box);
- gtk_menu_detach (GTK_MENU (combo_box->priv->popup_widget));
- combo_box->priv->popup_widget = NULL;
- }
-
- if (GTK_IS_TREE_VIEW (combo_box->priv->tree_view))
- gtk_combo_box_list_destroy (combo_box);
-
- if (combo_box->priv->popup_window)
- gtk_widget_destroy (combo_box->priv->popup_window);
-
- gtk_combo_box_unset_model (combo_box);
-
- for (i = combo_box->priv->cells; i; i = i->next)
- {
- ComboCellInfo *info = (ComboCellInfo *)i->data;
- GSList *list = info->attributes;
-
- if (info->destroy)
- info->destroy (info->func_data);
-
- while (list && list->next)
- {
- g_free (list->data);
- list = list->next->next;
- }
- g_slist_free (info->attributes);
-
- g_object_unref (G_OBJECT (info->cell));
- g_free (info);
- }
- g_slist_free (combo_box->priv->cells);
-
- g_free (combo_box->priv);
-
- G_OBJECT_CLASS (parent_class)->finalize (object);
-}
-
-
-/**
- * Code below this point has been pulled in from gtkmenu.c in 2.4.14
- * and is needed to provide gtk_menu_attach()
- */
-
-typedef struct
-{
- gint left_attach;
- gint right_attach;
- gint top_attach;
- gint bottom_attach;
- gint effective_left_attach;
- gint effective_right_attach;
- gint effective_top_attach;
- gint effective_bottom_attach;
-} AttachInfo;
-
-#define ATTACH_INFO_KEY "gtk-menu-child-attach-info-key"
-
-static AttachInfo *
-get_attach_info (GtkWidget *child)
-{
- GObject *object = G_OBJECT (child);
- AttachInfo *ai = g_object_get_data (object, ATTACH_INFO_KEY);
-
- if (!ai)
- {
- ai = g_new0 (AttachInfo, 1);
- g_object_set_data_full (object, ATTACH_INFO_KEY, ai, g_free);
- }
-
- return ai;
-}
-
-/**
- * gtk_menu_attach:
- * @menu: a #GtkMenu.
- * @child: a #GtkMenuItem.
- * @left_attach: The column number to attach the left side of the item to.
- * @right_attach: The column number to attach the right side of the item to.
- * @top_attach: The row number to attach the top of the item to.
- * @bottom_attach: The row number to attach the bottom of the item to.
- *
- * Adds a new #GtkMenuItem to a (table) menu. The number of 'cells' that
- * an item will occupy is specified by @left_attach, @right_attach,
- * @top_attach and @bottom_attach. These each represent the leftmost,
- * rightmost, uppermost and lower column and row numbers of the table.
- * (Columns and rows are indexed from zero).
- *
- * Note that this function is not related to gtk_menu_detach().
- *
- * Since: 2.4
- **/
-static void
-gtk_menu_attach (GtkMenu *menu,
- GtkWidget *child,
- guint left_attach,
- guint right_attach,
- guint top_attach,
- guint bottom_attach)
-{
- GtkMenuShell *menu_shell;
-
- g_return_if_fail (GTK_IS_MENU (menu));
- g_return_if_fail (GTK_IS_MENU_ITEM (child));
- g_return_if_fail (child->parent == NULL ||
- child->parent == GTK_WIDGET (menu));
- g_return_if_fail (left_attach < right_attach);
- g_return_if_fail (top_attach < bottom_attach);
-
- menu_shell = GTK_MENU_SHELL (menu);
-
- if (!child->parent)
- {
- AttachInfo *ai = get_attach_info (child);
-
- ai->left_attach = left_attach;
- ai->right_attach = right_attach;
- ai->top_attach = top_attach;
- ai->bottom_attach = bottom_attach;
-
- menu_shell->children = g_list_append (menu_shell->children, child);
-
- gtk_widget_set_parent (child, GTK_WIDGET (menu));
-
- /*
- menu_queue_resize (menu);
- */
- }
- else
- {
- gtk_container_child_set (GTK_CONTAINER (child->parent), child,
- "left_attach", left_attach,
- "right_attach", right_attach,
- "top_attach", top_attach,
- "bottom_attach", bottom_attach,
- NULL);
- }
-}
-#endif /* Gtk 2.4 */
-
-gchar *
-gtk_combo_box_get_active_text (GtkComboBox *combo_box)
-{
- GtkTreeIter iter;
- gchar *text = NULL;
-
- /* g_return_val_if_fail (GTK_IS_LIST_STORE (combo_box->priv->model), NULL); */
-
- if (gtk_combo_box_get_active_iter (combo_box, &iter))
- gtk_tree_model_get (gtk_combo_box_get_model(combo_box), &iter,
- 0, &text, -1);
- return text;
-}
-
-#endif
diff -r cc6d733a192a -r c5a7516418c7 pidgin/pidgincombobox.h
--- a/pidgin/pidgincombobox.h Tue Feb 16 15:58:34 2010 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,114 +0,0 @@
-/* gtkcombobox.h
- * Copyright (C) 2002, 2003 Kristian Rietveld
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 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
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02111-1301, USA.
- */
-
-#ifndef __PIDGIN_COMBO_BOX_H__
-#define __PIDGIN_COMBO_BOX_H__
-
-#ifndef __GTK_COMBO_BOX_H__
-#define __GTK_COMBO_BOX_H__
-
-#include
-#include
-#include
-
-G_BEGIN_DECLS
-
-#define GTK_TYPE_COMBO_BOX (gtk_combo_box_get_type ())
-#define GTK_COMBO_BOX(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_COMBO_BOX, GtkComboBox))
-#define GTK_COMBO_BOX_CLASS(vtable) (G_TYPE_CHECK_CLASS_CAST ((vtable), GTK_TYPE_COMBO_BOX, GtkComboBoxClass))
-#define GTK_IS_COMBO_BOX(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTK_TYPE_COMBO_BOX))
-#define GTK_IS_COMBO_BOX_CLASS(vtable) (G_TYPE_CHECK_CLASS_TYPE ((vtable), GTK_TYPE_COMBO_BOX))
-#define GTK_COMBO_BOX_GET_CLASS(inst) (G_TYPE_INSTANCE_GET_CLASS ((inst), GTK_TYPE_COMBO_BOX, GtkComboBoxClass))
-
-typedef struct _GtkComboBox GtkComboBox;
-typedef struct _GtkComboBoxClass GtkComboBoxClass;
-typedef struct _GtkComboBoxPrivate GtkComboBoxPrivate;
-
-struct _GtkComboBox
-{
- GtkBin parent_instance;
-
- /*< private >*/
- GtkComboBoxPrivate *priv;
-};
-
-struct _GtkComboBoxClass
-{
- GtkBinClass parent_class;
-
- /* signals */
- void (* changed) (GtkComboBox *combo_box);
-
- /* Padding for future expansion */
- void (*_gtk_reserved0) (void);
- void (*_gtk_reserved1) (void);
- void (*_gtk_reserved2) (void);
- void (*_gtk_reserved3) (void);
-};
-
-
-/* construction */
-GType gtk_combo_box_get_type (void);
-GtkWidget *gtk_combo_box_new (void);
-GtkWidget *gtk_combo_box_new_with_model (GtkTreeModel *model);
-
-/* grids */
-void gtk_combo_box_set_wrap_width (GtkComboBox *combo_box,
- gint width);
-void gtk_combo_box_set_row_span_column (GtkComboBox *combo_box,
- gint row_span);
-void gtk_combo_box_set_column_span_column (GtkComboBox *combo_box,
- gint column_span);
-
-/* get/set active item */
-gint gtk_combo_box_get_active (GtkComboBox *combo_box);
-void gtk_combo_box_set_active (GtkComboBox *combo_box,
- gint index_);
-gboolean gtk_combo_box_get_active_iter (GtkComboBox *combo_box,
- GtkTreeIter *iter);
-void gtk_combo_box_set_active_iter (GtkComboBox *combo_box,
- GtkTreeIter *iter);
-
-/* getters and setters */
-void gtk_combo_box_set_model (GtkComboBox *combo_box,
- GtkTreeModel *model);
-GtkTreeModel *gtk_combo_box_get_model (GtkComboBox *combo_box);
-
-/* convenience -- text */
-GtkWidget *gtk_combo_box_new_text (void);
-void gtk_combo_box_append_text (GtkComboBox *combo_box,
- const gchar *text);
-void gtk_combo_box_insert_text (GtkComboBox *combo_box,
- gint position,
- const gchar *text);
-void gtk_combo_box_prepend_text (GtkComboBox *combo_box,
- const gchar *text);
-void gtk_combo_box_remove_text (GtkComboBox *combo_box,
- gint position);
-/* programmatic control */
-void gtk_combo_box_popup (GtkComboBox *combo_box);
-void gtk_combo_box_popdown (GtkComboBox *combo_box);
-
-G_END_DECLS
-
-#endif /* __GTK_COMBO_BOX_H__ */
-
-gchar *gtk_combo_box_get_active_text (GtkComboBox *combo_box);
-
-#endif /* __PIDGIN_COMBOX_BOX_H__ */
diff -r cc6d733a192a -r c5a7516418c7 pidgin/pidginstock.c
--- a/pidgin/pidginstock.c Tue Feb 16 15:58:34 2010 +0000
+++ b/pidgin/pidginstock.c Thu Feb 18 16:59:04 2010 +0000
@@ -53,49 +53,29 @@
} const stock_icons[] = {
{ PIDGIN_STOCK_ACTION, NULL, GTK_STOCK_EXECUTE },
-#if GTK_CHECK_VERSION(2,6,0)
{ PIDGIN_STOCK_ALIAS, NULL, GTK_STOCK_EDIT },
-#else
- { PIDGIN_STOCK_ALIAS, "buttons", "edit.png" },
-#endif
{ PIDGIN_STOCK_CHAT, NULL, GTK_STOCK_JUMP_TO },
{ PIDGIN_STOCK_CLEAR, NULL, GTK_STOCK_CLEAR },
{ PIDGIN_STOCK_CLOSE_TABS, NULL, GTK_STOCK_CLOSE },
{ PIDGIN_STOCK_DEBUG, NULL, GTK_STOCK_PROPERTIES },
{ PIDGIN_STOCK_DOWNLOAD, NULL, GTK_STOCK_GO_DOWN },
-#if GTK_CHECK_VERSION(2,6,0)
{ PIDGIN_STOCK_DISCONNECT, NULL, GTK_STOCK_DISCONNECT },
-#else
- { PIDGIN_STOCK_DISCONNECT, "icons", "stock_disconnect_16.png" },
-#endif
{ PIDGIN_STOCK_FGCOLOR, "buttons", "change-fgcolor-small.png" },
-#if GTK_CHECK_VERSION(2,6,0)
{ PIDGIN_STOCK_EDIT, NULL, GTK_STOCK_EDIT },
-#else
- { PIDGIN_STOCK_EDIT, "buttons", "edit.png" },
-#endif
{ PIDGIN_STOCK_FILE_CANCELED, NULL, GTK_STOCK_CANCEL },
{ PIDGIN_STOCK_FILE_DONE, NULL, GTK_STOCK_APPLY },
{ PIDGIN_STOCK_IGNORE, NULL, GTK_STOCK_DIALOG_ERROR },
{ PIDGIN_STOCK_INVITE, NULL, GTK_STOCK_JUMP_TO },
{ PIDGIN_STOCK_MODIFY, NULL, GTK_STOCK_PREFERENCES },
{ PIDGIN_STOCK_ADD, NULL, GTK_STOCK_ADD },
-#if GTK_CHECK_VERSION(2,6,0)
{ PIDGIN_STOCK_PAUSE, NULL, GTK_STOCK_MEDIA_PAUSE },
-#else
- { PIDGIN_STOCK_PAUSE, "buttons", "pause.png" },
-#endif
{ PIDGIN_STOCK_POUNCE, NULL, GTK_STOCK_REDO },
{ PIDGIN_STOCK_OPEN_MAIL, NULL, GTK_STOCK_JUMP_TO },
{ PIDGIN_STOCK_SIGN_ON, NULL, GTK_STOCK_EXECUTE },
{ PIDGIN_STOCK_SIGN_OFF, NULL, GTK_STOCK_CLOSE },
{ PIDGIN_STOCK_TYPED, "pidgin", "typed.png" },
{ PIDGIN_STOCK_UPLOAD, NULL, GTK_STOCK_GO_UP },
-#if GTK_CHECK_VERSION(2,8,0)
{ PIDGIN_STOCK_INFO, NULL, GTK_STOCK_INFO },
-#else
- { PIDGIN_STOCK_INFO, "buttons", "info.png" },
-#endif
};
static const GtkStockItem stock_items[] =
@@ -204,6 +184,7 @@
{ PIDGIN_STOCK_TOOLBAR_VIDEO_CALL, "toolbar", "video-call.png", FALSE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, NULL },
{ PIDGIN_STOCK_TOOLBAR_AUDIO_VIDEO_CALL, "toolbar", "audio-video-call.png", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
#endif
+ { PIDGIN_STOCK_TOOLBAR_SEND_ATTENTION, "toolbar", "get-attention.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }
};
const SizedStockIcon sized_status_icons [] = {
@@ -218,17 +199,22 @@
{ PIDGIN_STOCK_STATUS_LOGOUT, "status", "log-out.png", TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, NULL },
{ PIDGIN_STOCK_STATUS_OFFLINE, "status", "offline.png", TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, PIDGIN_STOCK_STATUS_OFFLINE_I },
{ PIDGIN_STOCK_STATUS_PERSON, "status", "person.png", TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, NULL },
- { PIDGIN_STOCK_STATUS_MESSAGE, "toolbar", "message-new.png", TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
+ { PIDGIN_STOCK_STATUS_MESSAGE, "toolbar", "message-new.png", TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }
+};
- { PIDGIN_STOCK_TRAY_AVAILABLE, "tray", "tray-online.png", FALSE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, NULL },
- { PIDGIN_STOCK_TRAY_INVISIBLE, "tray", "tray-invisible.png", FALSE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, NULL },
- { PIDGIN_STOCK_TRAY_AWAY, "tray", "tray-away.png", FALSE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, NULL },
- { PIDGIN_STOCK_TRAY_BUSY, "tray", "tray-busy.png", FALSE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, NULL },
- { PIDGIN_STOCK_TRAY_XA, "tray", "tray-extended-away.png", FALSE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, NULL },
- { PIDGIN_STOCK_TRAY_OFFLINE, "tray", "tray-offline.png", FALSE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, NULL },
- { PIDGIN_STOCK_TRAY_CONNECT, "tray", "tray-connecting.png", FALSE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, NULL },
- { PIDGIN_STOCK_TRAY_PENDING, "tray", "tray-new-im.png", FALSE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, NULL },
- { PIDGIN_STOCK_TRAY_EMAIL, "tray", "tray-message.png", FALSE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, NULL }
+const SizedStockIcon sized_tray_icons [] = {
+#define SIZED_TRAY_ICON(name) \
+ { name, "tray/hicolor", "status/" name ".png", FALSE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, NULL }
+ SIZED_TRAY_ICON( PIDGIN_STOCK_TRAY_AVAILABLE ),
+ SIZED_TRAY_ICON( PIDGIN_STOCK_TRAY_INVISIBLE ),
+ SIZED_TRAY_ICON( PIDGIN_STOCK_TRAY_AWAY ),
+ SIZED_TRAY_ICON( PIDGIN_STOCK_TRAY_BUSY ),
+ SIZED_TRAY_ICON( PIDGIN_STOCK_TRAY_XA ),
+ SIZED_TRAY_ICON( PIDGIN_STOCK_TRAY_OFFLINE ),
+ SIZED_TRAY_ICON( PIDGIN_STOCK_TRAY_CONNECT ),
+ SIZED_TRAY_ICON( PIDGIN_STOCK_TRAY_PENDING ),
+ SIZED_TRAY_ICON( PIDGIN_STOCK_TRAY_EMAIL )
+#undef SIZED_TRAY_ICON
};
/*****************************************************************************
@@ -239,7 +225,6 @@
find_file_common(const char *name)
{
gchar *filename;
-#if GLIB_CHECK_VERSION(2,6,0)
const gchar *userdir;
const gchar * const *sysdirs;
@@ -256,7 +241,6 @@
return filename;
g_free(filename);
}
-#endif
filename = g_build_filename(DATADIR, name, NULL);
if (g_file_test(filename, G_FILE_TEST_EXISTS))
return filename;
@@ -413,11 +397,9 @@
static void
reload_settings(void)
{
-#if GTK_CHECK_VERSION(2,4,0)
GtkSettings *setting = NULL;
setting = gtk_settings_get_default();
gtk_rc_reset_styles(setting);
-#endif
}
/*****************************************************************************
@@ -480,6 +462,33 @@
}
}
+ for (i = 0; i < G_N_ELEMENTS(sized_tray_icons); i++)
+ {
+ normal = gtk_icon_set_new();
+ if (sized_tray_icons[i].translucent_name)
+ translucent = gtk_icon_set_new();
+
+#define ADD_SIZED_ICON(name, size) \
+ if (sized_tray_icons[i].name) { \
+ add_sized_icon(normal, name, PIDGIN_ICON_THEME(theme), size, sized_tray_icons[i], FALSE); \
+ if (sized_tray_icons[i].translucent_name) \
+ add_sized_icon(translucent, name, PIDGIN_ICON_THEME(theme), size, sized_tray_icons[i], TRUE); \
+ }
+ ADD_SIZED_ICON(extra_small, "16x16");
+ ADD_SIZED_ICON(small, "22x22");
+ ADD_SIZED_ICON(medium, "32x32");
+ ADD_SIZED_ICON(large, "48x48");
+#undef ADD_SIZED_ICON
+
+ gtk_icon_factory_add(icon_factory, sized_tray_icons[i].name, normal);
+ gtk_icon_set_unref(normal);
+
+ if (sized_tray_icons[i].translucent_name) {
+ gtk_icon_factory_add(icon_factory, sized_tray_icons[i].translucent_name, translucent);
+ gtk_icon_set_unref(translucent);
+ }
+ }
+
gtk_widget_destroy(win);
g_object_unref(G_OBJECT(icon_factory));
reload_settings();
diff -r cc6d733a192a -r c5a7516418c7 pidgin/pidginstock.h
--- a/pidgin/pidginstock.h Tue Feb 16 15:58:34 2010 +0000
+++ b/pidgin/pidginstock.h Thu Feb 18 16:59:04 2010 +0000
@@ -159,6 +159,7 @@
#define PIDGIN_STOCK_TOOLBAR_VIDEO_CALL "pidgin-video-call"
#define PIDGIN_STOCK_TOOLBAR_AUDIO_VIDEO_CALL "pidgin-audio-video-call"
#endif
+#define PIDGIN_STOCK_TOOLBAR_SEND_ATTENTION "pidgin-send-attention"
/* Tray icons */
#define PIDGIN_STOCK_TRAY_AVAILABLE "pidgin-tray-available"
diff -r cc6d733a192a -r c5a7516418c7 pidgin/pidgintooltip.c
--- a/pidgin/pidgintooltip.c Tue Feb 16 15:58:34 2010 +0000
+++ b/pidgin/pidgintooltip.c Thu Feb 18 16:59:04 2010 +0000
@@ -119,9 +119,7 @@
tipwindow = gtk_window_new(GTK_WINDOW_POPUP);
name = gtk_window_get_title(GTK_WINDOW(pidgin_tooltip.widget));
-#if GTK_CHECK_VERSION(2,10,0)
gtk_window_set_type_hint(GTK_WINDOW(tipwindow), GDK_WINDOW_TYPE_HINT_TOOLTIP);
-#endif
gtk_widget_set_app_paintable(tipwindow, TRUE);
gtk_window_set_title(GTK_WINDOW(tipwindow), name ? name : _("Pidgin Tooltip"));
gtk_window_set_resizable(GTK_WINDOW(tipwindow), FALSE);
@@ -136,41 +134,26 @@
{
int sig;
int scr_w, scr_h, x, y, dy;
-#if GTK_CHECK_VERSION(2,2,0)
int mon_num;
GdkScreen *screen = NULL;
-#endif
GdkRectangle mon_size;
GtkWidget *tipwindow = pidgin_tooltip.tipwindow;
-#if GTK_CHECK_VERSION(2,2,0)
gdk_display_get_pointer(gdk_display_get_default(), &screen, &x, &y, NULL);
mon_num = gdk_screen_get_monitor_at_point(screen, x, y);
gdk_screen_get_monitor_geometry(screen, mon_num, &mon_size);
scr_w = mon_size.width + mon_size.x;
scr_h = mon_size.height + mon_size.y;
-#else
- scr_w = gdk_screen_width();
- scr_h = gdk_screen_height();
- gdk_window_get_pointer(NULL, &x, &y, NULL);
- mon_size.x = 0;
- mon_size.y = 0;
-#endif
-#if GTK_CHECK_VERSION(2,4,0)
dy = gdk_display_get_default_cursor_size(gdk_display_get_default()) / 2;
-#else
- dy = 0;
-#endif
-#if GTK_CHECK_VERSION(2,2,0)
if (w > mon_size.width)
w = mon_size.width - 10;
if (h > mon_size.height)
h = mon_size.height - 10;
-#endif
+
x -= ((w >> 1) + 4);
if ((y + h + 4) > scr_h)
diff -r cc6d733a192a -r c5a7516418c7 pidgin/pixmaps/Makefile.am
--- a/pidgin/pixmaps/Makefile.am Tue Feb 16 15:58:34 2010 +0000
+++ b/pidgin/pixmaps/Makefile.am Thu Feb 18 16:59:04 2010 +0000
@@ -446,7 +446,8 @@
toolbar/16/send-file.png \
toolbar/16/transfer.png \
toolbar/16/unblock.png \
- toolbar/16/video-call.png
+ toolbar/16/video-call.png \
+ toolbar/16/get-attention.png
TOOLBAR_22_SCALABLE = \
toolbar/22/scalable/select-avatar.svg \
@@ -485,48 +486,48 @@
tray/16/offline_4bit.ico
TRAY_16 = \
- tray/16/tray-away.png \
- tray/16/tray-busy.png \
- tray/16/tray-invisible.png \
- tray/16/tray-connecting.png \
- tray/16/tray-extended-away.png \
- tray/16/tray-message.png \
- tray/16/tray-new-im.png \
- tray/16/tray-offline.png \
- tray/16/tray-online.png
+ tray/hicolor/16x16/status/pidgin-tray-away.png \
+ tray/hicolor/16x16/status/pidgin-tray-busy.png \
+ tray/hicolor/16x16/status/pidgin-tray-invisible.png \
+ tray/hicolor/16x16/status/pidgin-tray-connect.png \
+ tray/hicolor/16x16/status/pidgin-tray-xa.png \
+ tray/hicolor/16x16/status/pidgin-tray-email.png \
+ tray/hicolor/16x16/status/pidgin-tray-pending.png \
+ tray/hicolor/16x16/status/pidgin-tray-offline.png \
+ tray/hicolor/16x16/status/pidgin-tray-available.png
TRAY_22 = \
- tray/22/tray-away.png \
- tray/22/tray-busy.png \
- tray/22/tray-connecting.png \
- tray/22/tray-extended-away.png \
- tray/22/tray-invisible.png \
- tray/22/tray-message.png \
- tray/22/tray-new-im.png \
- tray/22/tray-offline.png \
- tray/22/tray-online.png
+ tray/hicolor/22x22/status/pidgin-tray-away.png \
+ tray/hicolor/22x22/status/pidgin-tray-busy.png \
+ tray/hicolor/22x22/status/pidgin-tray-connect.png \
+ tray/hicolor/22x22/status/pidgin-tray-xa.png \
+ tray/hicolor/22x22/status/pidgin-tray-invisible.png \
+ tray/hicolor/22x22/status/pidgin-tray-email.png \
+ tray/hicolor/22x22/status/pidgin-tray-pending.png \
+ tray/hicolor/22x22/status/pidgin-tray-offline.png \
+ tray/hicolor/22x22/status/pidgin-tray-available.png
TRAY_32 = \
- tray/32/tray-away.png \
- tray/32/tray-busy.png \
- tray/32/tray-connecting.png \
- tray/32/tray-extended-away.png \
- tray/32/tray-invisible.png \
- tray/32/tray-message.png \
- tray/32/tray-new-im.png \
- tray/32/tray-offline.png \
- tray/32/tray-online.png
+ tray/hicolor/32x32/status/pidgin-tray-away.png \
+ tray/hicolor/32x32/status/pidgin-tray-busy.png \
+ tray/hicolor/32x32/status/pidgin-tray-connect.png \
+ tray/hicolor/32x32/status/pidgin-tray-xa.png \
+ tray/hicolor/32x32/status/pidgin-tray-invisible.png \
+ tray/hicolor/32x32/status/pidgin-tray-email.png \
+ tray/hicolor/32x32/status/pidgin-tray-pending.png \
+ tray/hicolor/32x32/status/pidgin-tray-offline.png \
+ tray/hicolor/32x32/status/pidgin-tray-available.png
TRAY_48 = \
- tray/48/tray-away.png \
- tray/48/tray-busy.png \
- tray/48/tray-connecting.png \
- tray/48/tray-extended-away.png \
- tray/48/tray-invisible.png \
- tray/48/tray-message.png \
- tray/48/tray-new-im.png \
- tray/48/tray-offline.png \
- tray/48/tray-online.png
+ tray/hicolor/48x48/status/pidgin-tray-away.png \
+ tray/hicolor/48x48/status/pidgin-tray-busy.png \
+ tray/hicolor/48x48/status/pidgin-tray-connect.png \
+ tray/hicolor/48x48/status/pidgin-tray-xa.png \
+ tray/hicolor/48x48/status/pidgin-tray-invisible.png \
+ tray/hicolor/48x48/status/pidgin-tray-email.png \
+ tray/hicolor/48x48/status/pidgin-tray-pending.png \
+ tray/hicolor/48x48/status/pidgin-tray-offline.png \
+ tray/hicolor/48x48/status/pidgin-tray-available.png
EXTRA_DIST = \
edit.png \
diff -r cc6d733a192a -r c5a7516418c7 pidgin/pixmaps/tray/16/tray-away.png
Binary file pidgin/pixmaps/tray/16/tray-away.png has changed
diff -r cc6d733a192a -r c5a7516418c7 pidgin/pixmaps/tray/16/tray-busy.png
Binary file pidgin/pixmaps/tray/16/tray-busy.png has changed
diff -r cc6d733a192a -r c5a7516418c7 pidgin/pixmaps/tray/16/tray-connecting.png
Binary file pidgin/pixmaps/tray/16/tray-connecting.png has changed
diff -r cc6d733a192a -r c5a7516418c7 pidgin/pixmaps/tray/16/tray-extended-away.png
Binary file pidgin/pixmaps/tray/16/tray-extended-away.png has changed
diff -r cc6d733a192a -r c5a7516418c7 pidgin/pixmaps/tray/16/tray-invisible.png
Binary file pidgin/pixmaps/tray/16/tray-invisible.png has changed
diff -r cc6d733a192a -r c5a7516418c7 pidgin/pixmaps/tray/16/tray-message.png
Binary file pidgin/pixmaps/tray/16/tray-message.png has changed
diff -r cc6d733a192a -r c5a7516418c7 pidgin/pixmaps/tray/16/tray-new-im.png
Binary file pidgin/pixmaps/tray/16/tray-new-im.png has changed
diff -r cc6d733a192a -r c5a7516418c7 pidgin/pixmaps/tray/16/tray-offline.png
Binary file pidgin/pixmaps/tray/16/tray-offline.png has changed
diff -r cc6d733a192a -r c5a7516418c7 pidgin/pixmaps/tray/16/tray-online.png
Binary file pidgin/pixmaps/tray/16/tray-online.png has changed
diff -r cc6d733a192a -r c5a7516418c7 pidgin/pixmaps/tray/22/tray-away.png
Binary file pidgin/pixmaps/tray/22/tray-away.png has changed
diff -r cc6d733a192a -r c5a7516418c7 pidgin/pixmaps/tray/22/tray-busy.png
Binary file pidgin/pixmaps/tray/22/tray-busy.png has changed
diff -r cc6d733a192a -r c5a7516418c7 pidgin/pixmaps/tray/22/tray-connecting.png
Binary file pidgin/pixmaps/tray/22/tray-connecting.png has changed
diff -r cc6d733a192a -r c5a7516418c7 pidgin/pixmaps/tray/22/tray-extended-away.png
Binary file pidgin/pixmaps/tray/22/tray-extended-away.png has changed
diff -r cc6d733a192a -r c5a7516418c7 pidgin/pixmaps/tray/22/tray-invisible.png
Binary file pidgin/pixmaps/tray/22/tray-invisible.png has changed
diff -r cc6d733a192a -r c5a7516418c7 pidgin/pixmaps/tray/22/tray-message.png
Binary file pidgin/pixmaps/tray/22/tray-message.png has changed
diff -r cc6d733a192a -r c5a7516418c7 pidgin/pixmaps/tray/22/tray-new-im.png
Binary file pidgin/pixmaps/tray/22/tray-new-im.png has changed
diff -r cc6d733a192a -r c5a7516418c7 pidgin/pixmaps/tray/22/tray-offline.png
Binary file pidgin/pixmaps/tray/22/tray-offline.png has changed
diff -r cc6d733a192a -r c5a7516418c7 pidgin/pixmaps/tray/22/tray-online.png
Binary file pidgin/pixmaps/tray/22/tray-online.png has changed
diff -r cc6d733a192a -r c5a7516418c7 pidgin/pixmaps/tray/32/tray-away.png
Binary file pidgin/pixmaps/tray/32/tray-away.png has changed
diff -r cc6d733a192a -r c5a7516418c7 pidgin/pixmaps/tray/32/tray-busy.png
Binary file pidgin/pixmaps/tray/32/tray-busy.png has changed
diff -r cc6d733a192a -r c5a7516418c7 pidgin/pixmaps/tray/32/tray-connecting.png
Binary file pidgin/pixmaps/tray/32/tray-connecting.png has changed
diff -r cc6d733a192a -r c5a7516418c7 pidgin/pixmaps/tray/32/tray-extended-away.png
Binary file pidgin/pixmaps/tray/32/tray-extended-away.png has changed
diff -r cc6d733a192a -r c5a7516418c7 pidgin/pixmaps/tray/32/tray-invisible.png
Binary file pidgin/pixmaps/tray/32/tray-invisible.png has changed
diff -r cc6d733a192a -r c5a7516418c7 pidgin/pixmaps/tray/32/tray-message.png
Binary file pidgin/pixmaps/tray/32/tray-message.png has changed
diff -r cc6d733a192a -r c5a7516418c7 pidgin/pixmaps/tray/32/tray-new-im.png
Binary file pidgin/pixmaps/tray/32/tray-new-im.png has changed
diff -r cc6d733a192a -r c5a7516418c7 pidgin/pixmaps/tray/32/tray-offline.png
Binary file pidgin/pixmaps/tray/32/tray-offline.png has changed
diff -r cc6d733a192a -r c5a7516418c7 pidgin/pixmaps/tray/32/tray-online.png
Binary file pidgin/pixmaps/tray/32/tray-online.png has changed
diff -r cc6d733a192a -r c5a7516418c7 pidgin/pixmaps/tray/48/tray-away.png
Binary file pidgin/pixmaps/tray/48/tray-away.png has changed
diff -r cc6d733a192a -r c5a7516418c7 pidgin/pixmaps/tray/48/tray-busy.png
Binary file pidgin/pixmaps/tray/48/tray-busy.png has changed
diff -r cc6d733a192a -r c5a7516418c7 pidgin/pixmaps/tray/48/tray-connecting.png
Binary file pidgin/pixmaps/tray/48/tray-connecting.png has changed
diff -r cc6d733a192a -r c5a7516418c7 pidgin/pixmaps/tray/48/tray-extended-away.png
Binary file pidgin/pixmaps/tray/48/tray-extended-away.png has changed
diff -r cc6d733a192a -r c5a7516418c7 pidgin/pixmaps/tray/48/tray-invisible.png
Binary file pidgin/pixmaps/tray/48/tray-invisible.png has changed
diff -r cc6d733a192a -r c5a7516418c7 pidgin/pixmaps/tray/48/tray-message.png
Binary file pidgin/pixmaps/tray/48/tray-message.png has changed
diff -r cc6d733a192a -r c5a7516418c7 pidgin/pixmaps/tray/48/tray-new-im.png
Binary file pidgin/pixmaps/tray/48/tray-new-im.png has changed
diff -r cc6d733a192a -r c5a7516418c7 pidgin/pixmaps/tray/48/tray-offline.png
Binary file pidgin/pixmaps/tray/48/tray-offline.png has changed
diff -r cc6d733a192a -r c5a7516418c7 pidgin/pixmaps/tray/48/tray-online.png
Binary file pidgin/pixmaps/tray/48/tray-online.png has changed
diff -r cc6d733a192a -r c5a7516418c7 pidgin/pixmaps/tray/hicolor/16x16/status/pidgin-tray-available.png
Binary file pidgin/pixmaps/tray/hicolor/16x16/status/pidgin-tray-available.png has changed
diff -r cc6d733a192a -r c5a7516418c7 pidgin/pixmaps/tray/hicolor/16x16/status/pidgin-tray-away.png
Binary file pidgin/pixmaps/tray/hicolor/16x16/status/pidgin-tray-away.png has changed
diff -r cc6d733a192a -r c5a7516418c7 pidgin/pixmaps/tray/hicolor/16x16/status/pidgin-tray-busy.png
Binary file pidgin/pixmaps/tray/hicolor/16x16/status/pidgin-tray-busy.png has changed
diff -r cc6d733a192a -r c5a7516418c7 pidgin/pixmaps/tray/hicolor/16x16/status/pidgin-tray-connect.png
Binary file pidgin/pixmaps/tray/hicolor/16x16/status/pidgin-tray-connect.png has changed
diff -r cc6d733a192a -r c5a7516418c7 pidgin/pixmaps/tray/hicolor/16x16/status/pidgin-tray-email.png
Binary file pidgin/pixmaps/tray/hicolor/16x16/status/pidgin-tray-email.png has changed
diff -r cc6d733a192a -r c5a7516418c7 pidgin/pixmaps/tray/hicolor/16x16/status/pidgin-tray-invisible.png
Binary file pidgin/pixmaps/tray/hicolor/16x16/status/pidgin-tray-invisible.png has changed
diff -r cc6d733a192a -r c5a7516418c7 pidgin/pixmaps/tray/hicolor/16x16/status/pidgin-tray-offline.png
Binary file pidgin/pixmaps/tray/hicolor/16x16/status/pidgin-tray-offline.png has changed
diff -r cc6d733a192a -r c5a7516418c7 pidgin/pixmaps/tray/hicolor/16x16/status/pidgin-tray-pending.png
Binary file pidgin/pixmaps/tray/hicolor/16x16/status/pidgin-tray-pending.png has changed
diff -r cc6d733a192a -r c5a7516418c7 pidgin/pixmaps/tray/hicolor/16x16/status/pidgin-tray-xa.png
Binary file pidgin/pixmaps/tray/hicolor/16x16/status/pidgin-tray-xa.png has changed
diff -r cc6d733a192a -r c5a7516418c7 pidgin/pixmaps/tray/hicolor/22x22/status/pidgin-tray-available.png
Binary file pidgin/pixmaps/tray/hicolor/22x22/status/pidgin-tray-available.png has changed
diff -r cc6d733a192a -r c5a7516418c7 pidgin/pixmaps/tray/hicolor/22x22/status/pidgin-tray-away.png
Binary file pidgin/pixmaps/tray/hicolor/22x22/status/pidgin-tray-away.png has changed
diff -r cc6d733a192a -r c5a7516418c7 pidgin/pixmaps/tray/hicolor/22x22/status/pidgin-tray-busy.png
Binary file pidgin/pixmaps/tray/hicolor/22x22/status/pidgin-tray-busy.png has changed
diff -r cc6d733a192a -r c5a7516418c7 pidgin/pixmaps/tray/hicolor/22x22/status/pidgin-tray-connect.png
Binary file pidgin/pixmaps/tray/hicolor/22x22/status/pidgin-tray-connect.png has changed
diff -r cc6d733a192a -r c5a7516418c7 pidgin/pixmaps/tray/hicolor/22x22/status/pidgin-tray-email.png
Binary file pidgin/pixmaps/tray/hicolor/22x22/status/pidgin-tray-email.png has changed
diff -r cc6d733a192a -r c5a7516418c7 pidgin/pixmaps/tray/hicolor/22x22/status/pidgin-tray-invisible.png
Binary file pidgin/pixmaps/tray/hicolor/22x22/status/pidgin-tray-invisible.png has changed
diff -r cc6d733a192a -r c5a7516418c7 pidgin/pixmaps/tray/hicolor/22x22/status/pidgin-tray-offline.png
Binary file pidgin/pixmaps/tray/hicolor/22x22/status/pidgin-tray-offline.png has changed
diff -r cc6d733a192a -r c5a7516418c7 pidgin/pixmaps/tray/hicolor/22x22/status/pidgin-tray-pending.png
Binary file pidgin/pixmaps/tray/hicolor/22x22/status/pidgin-tray-pending.png has changed
diff -r cc6d733a192a -r c5a7516418c7 pidgin/pixmaps/tray/hicolor/22x22/status/pidgin-tray-xa.png
Binary file pidgin/pixmaps/tray/hicolor/22x22/status/pidgin-tray-xa.png has changed
diff -r cc6d733a192a -r c5a7516418c7 pidgin/pixmaps/tray/hicolor/32x32/status/pidgin-tray-available.png
Binary file pidgin/pixmaps/tray/hicolor/32x32/status/pidgin-tray-available.png has changed
diff -r cc6d733a192a -r c5a7516418c7 pidgin/pixmaps/tray/hicolor/32x32/status/pidgin-tray-away.png
Binary file pidgin/pixmaps/tray/hicolor/32x32/status/pidgin-tray-away.png has changed
diff -r cc6d733a192a -r c5a7516418c7 pidgin/pixmaps/tray/hicolor/32x32/status/pidgin-tray-busy.png
Binary file pidgin/pixmaps/tray/hicolor/32x32/status/pidgin-tray-busy.png has changed
diff -r cc6d733a192a -r c5a7516418c7 pidgin/pixmaps/tray/hicolor/32x32/status/pidgin-tray-connect.png
Binary file pidgin/pixmaps/tray/hicolor/32x32/status/pidgin-tray-connect.png has changed
diff -r cc6d733a192a -r c5a7516418c7 pidgin/pixmaps/tray/hicolor/32x32/status/pidgin-tray-email.png
Binary file pidgin/pixmaps/tray/hicolor/32x32/status/pidgin-tray-email.png has changed
diff -r cc6d733a192a -r c5a7516418c7 pidgin/pixmaps/tray/hicolor/32x32/status/pidgin-tray-invisible.png
Binary file pidgin/pixmaps/tray/hicolor/32x32/status/pidgin-tray-invisible.png has changed
diff -r cc6d733a192a -r c5a7516418c7 pidgin/pixmaps/tray/hicolor/32x32/status/pidgin-tray-offline.png
Binary file pidgin/pixmaps/tray/hicolor/32x32/status/pidgin-tray-offline.png has changed
diff -r cc6d733a192a -r c5a7516418c7 pidgin/pixmaps/tray/hicolor/32x32/status/pidgin-tray-pending.png
Binary file pidgin/pixmaps/tray/hicolor/32x32/status/pidgin-tray-pending.png has changed
diff -r cc6d733a192a -r c5a7516418c7 pidgin/pixmaps/tray/hicolor/32x32/status/pidgin-tray-xa.png
Binary file pidgin/pixmaps/tray/hicolor/32x32/status/pidgin-tray-xa.png has changed
diff -r cc6d733a192a -r c5a7516418c7 pidgin/pixmaps/tray/hicolor/48x48/status/pidgin-tray-available.png
Binary file pidgin/pixmaps/tray/hicolor/48x48/status/pidgin-tray-available.png has changed
diff -r cc6d733a192a -r c5a7516418c7 pidgin/pixmaps/tray/hicolor/48x48/status/pidgin-tray-away.png
Binary file pidgin/pixmaps/tray/hicolor/48x48/status/pidgin-tray-away.png has changed
diff -r cc6d733a192a -r c5a7516418c7 pidgin/pixmaps/tray/hicolor/48x48/status/pidgin-tray-busy.png
Binary file pidgin/pixmaps/tray/hicolor/48x48/status/pidgin-tray-busy.png has changed
diff -r cc6d733a192a -r c5a7516418c7 pidgin/pixmaps/tray/hicolor/48x48/status/pidgin-tray-connect.png
Binary file pidgin/pixmaps/tray/hicolor/48x48/status/pidgin-tray-connect.png has changed
diff -r cc6d733a192a -r c5a7516418c7 pidgin/pixmaps/tray/hicolor/48x48/status/pidgin-tray-email.png
Binary file pidgin/pixmaps/tray/hicolor/48x48/status/pidgin-tray-email.png has changed
diff -r cc6d733a192a -r c5a7516418c7 pidgin/pixmaps/tray/hicolor/48x48/status/pidgin-tray-invisible.png
Binary file pidgin/pixmaps/tray/hicolor/48x48/status/pidgin-tray-invisible.png has changed
diff -r cc6d733a192a -r c5a7516418c7 pidgin/pixmaps/tray/hicolor/48x48/status/pidgin-tray-offline.png
Binary file pidgin/pixmaps/tray/hicolor/48x48/status/pidgin-tray-offline.png has changed
diff -r cc6d733a192a -r c5a7516418c7 pidgin/pixmaps/tray/hicolor/48x48/status/pidgin-tray-pending.png
Binary file pidgin/pixmaps/tray/hicolor/48x48/status/pidgin-tray-pending.png has changed
diff -r cc6d733a192a -r c5a7516418c7 pidgin/pixmaps/tray/hicolor/48x48/status/pidgin-tray-xa.png
Binary file pidgin/pixmaps/tray/hicolor/48x48/status/pidgin-tray-xa.png has changed
diff -r cc6d733a192a -r c5a7516418c7 pidgin/plugins/gestures/gestures.c
--- a/pidgin/plugins/gestures/gestures.c Tue Feb 16 15:58:34 2010 +0000
+++ b/pidgin/plugins/gestures/gestures.c Thu Feb 18 16:59:04 2010 +0000
@@ -57,11 +57,7 @@
{
int count, current;
-#if GTK_CHECK_VERSION(2,2,0)
count = gtk_notebook_get_n_pages(GTK_NOTEBOOK(win->notebook));
-#else
- count = g_list_length(GTK_NOTEBOOK(win->notebook)->children);
-#endif
current = gtk_notebook_get_current_page(GTK_NOTEBOOK(win->notebook));
if (dir == GTK_DIR_LEFT)
diff -r cc6d733a192a -r c5a7516418c7 pidgin/plugins/perl/common/Makefile.mingw
--- a/pidgin/plugins/perl/common/Makefile.mingw Tue Feb 16 15:58:34 2010 +0000
+++ b/pidgin/plugins/perl/common/Makefile.mingw Thu Feb 18 16:59:04 2010 +0000
@@ -25,6 +25,7 @@
-I$(PIDGIN_TOP)/win32 \
-I$(GTK_TOP)/include \
-I$(GTK_TOP)/include/atk-1.0 \
+ -I$(GTK_TOP)/include/cairo \
-I$(GTK_TOP)/include/glib-2.0 \
-I$(GTK_TOP)/include/gtk-2.0 \
-I$(GTK_TOP)/include/pango-1.0 \
diff -r cc6d733a192a -r c5a7516418c7 pidgin/plugins/pidginrc.c
--- a/pidgin/plugins/pidginrc.c Tue Feb 16 15:58:34 2010 +0000
+++ b/pidgin/plugins/pidginrc.c Thu Feb 18 16:59:04 2010 +0000
@@ -201,17 +201,13 @@
purplerc_make_changes(void)
{
GString *str = make_gtkrc_string();
-#if GTK_CHECK_VERSION(2,4,0)
GtkSettings *setting = NULL;
-#endif
gtk_rc_parse_string(str->str);
g_string_free(str, TRUE);
-#if GTK_CHECK_VERSION(2,4,0)
setting = gtk_settings_get_default();
gtk_rc_reset_styles(setting);
-#endif
}
static void
diff -r cc6d733a192a -r c5a7516418c7 pidgin/plugins/spellchk.c
--- a/pidgin/plugins/spellchk.c Tue Feb 16 15:58:34 2010 +0000
+++ b/pidgin/plugins/spellchk.c Thu Feb 18 16:59:04 2010 +0000
@@ -2081,24 +2081,11 @@
g_string_free(data, TRUE);
}
-#if !GTK_CHECK_VERSION(2,2,0)
-static void
-count_selected_helper(GtkTreeModel *model, GtkTreePath *path,
- GtkTreeIter *iter, gpointer user_data)
-{
- (*(gint *)user_data)++;
-}
-#endif
-
static void on_selection_changed(GtkTreeSelection *sel,
gpointer data)
{
gint num_selected;
-#if GTK_CHECK_VERSION(2,2,0)
num_selected = gtk_tree_selection_count_selected_rows(sel);
-#else
- gtk_tree_selection_selected_foreach(sel, count_selected_helper, &num_selected);
-#endif
gtk_widget_set_sensitive((GtkWidget*)data, (num_selected > 0));
}
diff -r cc6d733a192a -r c5a7516418c7 pidgin/plugins/xmppconsole.c
--- a/pidgin/plugins/xmppconsole.c Tue Feb 16 15:58:34 2010 +0000
+++ b/pidgin/plugins/xmppconsole.c Thu Feb 18 16:59:04 2010 +0000
@@ -26,9 +26,6 @@
#include "xmlnode.h"
#include "gtkimhtml.h"
-#if !GTK_CHECK_VERSION(2,4,0)
-#include "pidgincombobox.h"
-#endif
#include "gtkutils.h"
typedef struct {
@@ -733,9 +730,7 @@
GtkTextBuffer *buffer;
GtkWidget *toolbar;
GList *connections;
-#if GTK_CHECK_VERSION(2,4,0)
GtkToolItem *button;
-#endif
if (console) {
gtk_window_present(GTK_WINDOW(console->window));
@@ -782,32 +777,17 @@
gtk_container_add(GTK_CONTAINER(sw), console->imhtml);
toolbar = gtk_toolbar_new();
-#if GTK_CHECK_VERSION(2,4,0)
button = gtk_tool_button_new(NULL, "");
g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(iq_clicked_cb), NULL);
gtk_container_add(GTK_CONTAINER(toolbar), GTK_WIDGET(button));
-#else
- gtk_toolbar_append_item(GTK_TOOLBAR(toolbar), "",
- _("Insert an stanza."), "foo", NULL, GTK_SIGNAL_FUNC(iq_clicked_cb), NULL);
-#endif
-#if GTK_CHECK_VERSION(2,4,0)
button = gtk_tool_button_new(NULL, "");
g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(presence_clicked_cb), NULL);
gtk_container_add(GTK_CONTAINER(toolbar), GTK_WIDGET(button));
-#else
- gtk_toolbar_append_item(GTK_TOOLBAR(toolbar), "",
- _("Insert a stanza."), NULL, gtk_label_new(NULL), GTK_SIGNAL_FUNC(presence_clicked_cb), NULL);
-#endif
-#if GTK_CHECK_VERSION(2,4,0)
button = gtk_tool_button_new(NULL, "");
g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(message_clicked_cb), NULL);
gtk_container_add(GTK_CONTAINER(toolbar), GTK_WIDGET(button));
-#else
- gtk_toolbar_append_item(GTK_TOOLBAR(toolbar), "",
- _("Insert a stanza."), "foo", gtk_label_new(NULL), GTK_SIGNAL_FUNC(message_clicked_cb), NULL);
-#endif
gtk_box_pack_start(GTK_BOX(vbox), toolbar, FALSE, FALSE, 0);
diff -r cc6d733a192a -r c5a7516418c7 pidgin/win32/gtkdocklet-win32.c
--- a/pidgin/win32/gtkdocklet-win32.c Tue Feb 16 15:58:34 2010 +0000
+++ b/pidgin/win32/gtkdocklet-win32.c Thu Feb 18 16:59:04 2010 +0000
@@ -585,12 +585,7 @@
G_CALLBACK(dummy_button_cb), NULL);
image = gtk_image_new();
-#if GLIB_CHECK_VERSION(2,10,0)
g_object_ref_sink(image);
-#else
- g_object_ref(image);
- gtk_object_sink(GTK_OBJECT(image));
-#endif
osinfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
GetVersionEx(&osinfo);
diff -r cc6d733a192a -r c5a7516418c7 pidgin/win32/gtkwin32dep.c
--- a/pidgin/win32/gtkwin32dep.c Tue Feb 16 15:58:34 2010 +0000
+++ b/pidgin/win32/gtkwin32dep.c Thu Feb 18 16:59:04 2010 +0000
@@ -142,58 +142,34 @@
void winpidgin_shell_execute(const char *target, const char *verb, const char *clazz) {
+ SHELLEXECUTEINFOW wsinfo;
+ wchar_t *w_uri, *w_verb, *w_clazz = NULL;
+
g_return_if_fail(target != NULL);
g_return_if_fail(verb != NULL);
- if (G_WIN32_HAVE_WIDECHAR_API()) {
- SHELLEXECUTEINFOW wsinfo;
- wchar_t *w_uri, *w_verb, *w_clazz = NULL;
-
- w_uri = g_utf8_to_utf16(target, -1, NULL, NULL, NULL);
- w_verb = g_utf8_to_utf16(verb, -1, NULL, NULL, NULL);
-
- memset(&wsinfo, 0, sizeof(wsinfo));
- wsinfo.cbSize = sizeof(wsinfo);
- wsinfo.lpVerb = w_verb;
- wsinfo.lpFile = w_uri;
- wsinfo.nShow = SW_SHOWNORMAL;
- wsinfo.fMask |= SEE_MASK_FLAG_NO_UI;
- if (clazz != NULL) {
- w_clazz = g_utf8_to_utf16(clazz, -1, NULL, NULL, NULL);
- wsinfo.fMask |= SEE_MASK_CLASSNAME;
- wsinfo.lpClass = w_clazz;
- }
-
- if(!ShellExecuteExW(&wsinfo))
- purple_debug_error("winpidgin", "Error opening URI: %s error: %d\n",
- target, (int) wsinfo.hInstApp);
+ w_uri = g_utf8_to_utf16(target, -1, NULL, NULL, NULL);
+ w_verb = g_utf8_to_utf16(verb, -1, NULL, NULL, NULL);
- g_free(w_uri);
- g_free(w_verb);
- g_free(w_clazz);
- } else {
- SHELLEXECUTEINFOA sinfo;
- gchar *locale_uri;
-
- locale_uri = g_locale_from_utf8(target, -1, NULL, NULL, NULL);
+ memset(&wsinfo, 0, sizeof(wsinfo));
+ wsinfo.cbSize = sizeof(wsinfo);
+ wsinfo.lpVerb = w_verb;
+ wsinfo.lpFile = w_uri;
+ wsinfo.nShow = SW_SHOWNORMAL;
+ wsinfo.fMask |= SEE_MASK_FLAG_NO_UI;
+ if (clazz != NULL) {
+ w_clazz = g_utf8_to_utf16(clazz, -1, NULL, NULL, NULL);
+ wsinfo.fMask |= SEE_MASK_CLASSNAME;
+ wsinfo.lpClass = w_clazz;
+ }
- memset(&sinfo, 0, sizeof(sinfo));
- sinfo.cbSize = sizeof(sinfo);
- sinfo.lpVerb = verb;
- sinfo.lpFile = locale_uri;
- sinfo.nShow = SW_SHOWNORMAL;
- sinfo.fMask |= SEE_MASK_FLAG_NO_UI;
- if (clazz != NULL) {
- sinfo.fMask |= SEE_MASK_CLASSNAME;
- sinfo.lpClass = clazz;
- }
+ if(!ShellExecuteExW(&wsinfo))
+ purple_debug_error("winpidgin", "Error opening URI: %s error: %d\n",
+ target, (int) wsinfo.hInstApp);
- if(!ShellExecuteExA(&sinfo))
- purple_debug_error("winpidgin", "Error opening URI: %s error: %d\n",
- target, (int) sinfo.hInstApp);
-
- g_free(locale_uri);
- }
+ g_free(w_uri);
+ g_free(w_verb);
+ g_free(w_clazz);
}
diff -r cc6d733a192a -r c5a7516418c7 pidgin/win32/nsis/available.lst
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/pidgin/win32/nsis/available.lst Thu Feb 18 16:59:04 2010 +0000
@@ -0,0 +1,127 @@
+#This file is from ftp://ftp.services.openoffice.org/pub/OpenOffice.org/contrib/dictionaries/available.lst
+af,ZA,af_ZA,Afrikaans (South Africa),af_ZA.zip
+ak,GH,ak_GH,Akan (Ghana),ak_GH.zip
+sq,AL,sq_AL,Albanian (Albania),sq_AL.zip
+bg,BG,bg_BG,Bulgarian (Bulgaria),bg_BG.zip
+ca,ES,ca_ES,Catalan (Spain),ca_ES.zip
+hr,HR,hr_HR,Croatian (Croatia),hr_HR.zip
+cs,CZ,cs_CZ,Czech (Czech Republic),cs_CZ.zip
+da,DK,da_DK,Danish (Denmark),da_DK.zip
+nl,NL,nl_NL,Dutch (Netherlands),nl_NL.zip
+nl,NL,nl_med,Dutch Medical (Netherlands),nl_med.zip
+nl,BE,nl_NL,Dutch (Belgium),nl_NL.zip
+nl,BE,nl_NL,Dutch Medical (Belgium),nl_NL.zip
+en,AU,en_AU,English (Australia),en_AU.zip
+en,CA,en_CA,English (Canada),en_CA.zip
+en,NZ,en_NZ,English (New Zealand),en_NZ.zip
+en,ZA,en_ZA,English (South Africa),en_ZA.zip
+en,GB,en_GB,English (United Kingdom),en_GB.zip
+en,US,en_US,English (United States),en_US.zip
+cop,EG,cop_EG,Coptic (Egypt),cop_EG.zip
+eo,ANY,eo_l3,Esperanto,eo.zip
+et,EE,et_EE,Estonian (Estonia),et_EE.zip
+fo,FO,fo_FO,Faroese (Faroe Islands),fo_FO.zip
+fr,BE,fr_FR,Français Réforme 1990 & Classique (Belgium),fr_FR_1-3-2.zip
+fr,CA,fr_FR,Français Réforme 1990 & Classique (Canada),fr_FR_1-3-2.zip
+fr,FR,fr_FR,Français Réforme 1990 & Classique (France),fr_FR_1-3-2.zip
+fr,LU,fr_FR,Français Réforme 1990 & Classique (Luxembourg),fr_FR_1-3-2.zip
+fr,MC,fr_FR,Français Réforme 1990 & Classique (Monaco),fr_FR_1-3-2.zip
+fr,CH,fr_FR,Français Réforme 1990 & Classique (Switzerland),fr_FR_1-3-2.zip
+fr,BE,fr_FR-classique,Français Classique (Belgium),fr_FR-classique_1-3-2.zip
+fr,CA,fr_FR-classique,Français Classique (Canada),fr_FR-classique_1-3-2.zip
+fr,FR,fr_FR-classique,Français Classique (France),fr_FR-classique_1-3-2.zip
+fr,LU,fr_FR-classique,Français Classique (Luxembourg),fr_FR-classique_1-3-2.zip
+fr,MC,fr_FR-classique,Français Classique (Monaco),fr_FR-classique_1-3-2.zip
+fr,CH,fr_FR-classique,Français Classique (Switzerland),fr_FR-classique_1-3-2.zip
+fr,BE,fr_FR-1990,Français Réforme 1990 (Belgium),fr_FR-1990_1-3-2.zip
+fr,CA,fr_FR-1990,Français Réforme 1990 (Canada),fr_FR-1990_1-3-2.zip
+fr,FR,fr_FR-1990,Français Réforme 1990 (France),fr_FR-1990_1-3-2.zip
+fr,LU,fr_FR-1990,Français Réforme 1990 (Luxembourg),fr_FR-1990_1-3-2.zip
+fr,MC,fr_FR-1990,Français Réforme 1990 (Monaco),fr_FR-1990_1-3-2.zip
+fr,CH,fr_FR-1990,Français Réforme 1990 (Switzerland),fr_FR-1990_1-3-2.zip
+fy,NL,fy_NL,Frisian (Netherlands),fy_NL.zip
+gl,ES,gl_ES,Galician (Spain),gl_ES.zip
+gsc,FR,gsc_FR,Gascon (France),gsc_FR.zip
+de,AT,de_DE,German (Austria Base),de_DE.zip
+de,AT,de_AT,German (Austria Extension),de_AT.zip
+de,AT,de_AT_frami,German (Austria) neu 08/2006 (frami),de_AT_frami.zip
+de,DE,de_DE,German (Germany),de_DE.zip
+de,DE,de_DE_frami,German (Germany) neu 08/2006 (frami),de_DE_frami.zip
+de,LI,de_CH,German (Liechtenstein),de_CH.zip
+de,LI,de_CH_frami,German (Liechtenstein) neu 08/2006 (frami),de_CH_frami.zip
+de,LU,de_DE,German (Luxembourg),de_DE.zip
+de,LU,de_DE_frami,German (Luxembourg) neu 08/2006 (frami),de_DE_frami.zip
+de,CH,de_CH,German (Switzerland),de_CH.zip
+de,CT,de_CH_frami,German (Switzerland) neu 08/2006 (frami),de_CH_frami.zip
+el,GR,el_GR,Greek (Greece),el_GR.zip
+gu,IN,gu_IN,Gujarati (India),gu_IN.zip
+gd,GB,gd_GB,Scots Gaelic (Scotland),gd_GB.zip
+he,IL,he_IL,Hebrew (Israel),he_IL.zip
+hil,PH,hil_PH,Hiligaynon (Philippines),hil_PH.zip
+hu,HU,hu_HU,Hungarian (Hungary),hu_HU.zip
+hu,HU,hu_HU_comb,Hungarian (Hungary) collected compounds,hu_HU_comb.zip
+id,ID,id_ID,Indonesian (Indonesia),id_ID.zip
+ia,ANY,ia_ANY,Interlingua (ANY locale),ia_ANY.zip
+ga,IE,ga_IE,Irish (Ireland),ga_IE.zip
+it,IT,it_IT,Italian (Italy),it_IT.zip
+it,CH,it_IT,Italian (Switzerland),it_IT.zip
+sw,KE,sw_KE,Kiswahili (Africa),sw_KE.zip
+lv,LV,lv_LV,Latvian (Latvia),lv_LV.zip
+ku,TR,ku_TR,Kurdish (Turkey),ku_TR.zip
+ku,TR,ku_TR,Kurdish (Syria),ku_TR.zip
+it,IT,la,Latin (for x-register),la.zip
+lt,LT,lt_LT,Lithuanian (Lithuania),lt_LT.zip
+mk,MK,mk_MK,Macedonian (Macedonia),mk_MK.zip
+ms,MY,ms_MY,Malay (Malaysia),ms_MY.zip
+mi,NZ,mi_NZ,Maori (New Zealand),mi_NZ.zip
+mr,IN,mr_IN,Marathi (India),mr_IN.zip
+mos,BF,mos_BF,Moore,ms_BF.zip
+nr,ZA,nr_ZA,Ndebele (South Africa),nr_ZA.zip
+ne,NP,ne_NP,Nepali (Nepal),ne_NP.zip
+ns,ZA,ns_ZA,Northern Sotho (South Africa),ns_ZA.zip
+nb,NO,nb_NO,Norwegian Bokmaal (Norway),nb_NO.zip
+nn,NO,nn_NO,Norwegian Nynorsk (Norway),nn_NO.zip
+oc,FR,oc_FR,Occitan (Languedoc),oc_FR.zip
+pl,PL,pl_PL,Polish (Poland),pl_PL.zip
+pt,BR,pt_BR,Portuguese (Brazil),pt_BR.zip
+pt,PT,pt_PT,Portuguese (Portugal),pt_PT.zip
+ro,RO,ro_RO,Romanian (Romania),ro_RO.zip
+ru,RU,ru_RU,Russian (Russia),ru_RU.zip
+ru,RU,ru_RU_ye,Russian_ye (Russia),ru_RU_ye.zip
+ru,RU,ru_RU_yo,Russian_yo (Russia),ru_RU_yo.zip
+tn,ZA,tn_ZA,Setswana (Africa),tn_ZA.zip
+sk,SK,sk_SK,Slovak (Slovakia),sk_SK.zip
+sl,SI,sl_SI,Slovenian (Slovenia),sl_SI.zip
+st,ZA,st_ZA,Southern Sotho (South Africa),st_ZA.zip
+es,AR,es_AR,Spanish (Argentina),es_AR.zip
+es,BZ,es_HN,Spanish (Belize),es_HN.zip
+es,BO,es_BO,Spanish (Bolivia),es_BO.zip
+es,CL,es_CL,Spanish (Chile),es_CL.zip
+es,CO,es_CO,Spanish (Colombia),es_CO.zip
+es,CR,es_CR,Spanish (Costa Rica),es_CR.zip
+es,CU,es_CU,Spanish (Cuba),es_CU.zip
+es,DO,es_DO,Spanish (Dominican Republic),es_DO.zip
+es,EC,es_EC,Spanish (Ecuador),es_EC.zip
+es,SV,es_SV,Spanish (El Salvador),es_SV.zip
+es,GT,es_GT,Spanish (Guatemala),es_GT.zip
+es,HN,es_HN,Spanish (Honduras),es_HN.zip
+es,MX,es_MX,Spanish (Mexico),es_MX.zip
+es,NI,es_NI,Spanish (Nicaragua),es_NI.zip
+es,PA,es_PA,Spanish (Panama),es_PA.zip
+es,PY,es_PY,Spanish (Paraguay),es_PY.zip
+es,PE,es_PE,Spanish (Peru),es_PE.zip
+es,PR,es_PR,Spanish (Puerto Rico),es_PR.zip
+es,ES,es_ES,Spanish (Spain),es_ES.zip
+es,UY,es_UY,Spanish (Uruguay),es_UY.zip
+es,VE,es_VE,Spanish (Venezuela),es_VE.zip
+ss,ZA,ss_ZA,Swati (South Africa),ss_ZA.zip
+sv,SE,sv_SE,Swedish (Sweden),sv_SE.zip
+ts,ZA,ts_ZA,Tsonga (South Africa),ts_ZA.zip
+uk,UA,uk_UA,Ukrainian (Ukraine),uk_UA.zip
+ur,IN,ur_PK,Urdu (India),ur_PK.zip
+ur,PK,ur_PK,Urdu (Pakistan),ur_PK.zip
+ve,ZA,ve_ZA,Venda (South Africa),ve_ZA.zip
+vi,VN,vi_VN,Vietnamese (Viet-Nam),vi_VN.zip
+cy,GB,cy_GB,Welsh (Wales),cy_GB.zip
+xh,ZA,xh_ZA,Xhosa (South Africa),xh_ZA.zip
+zu,ZA,zu_ZA,Zulu (South Africa),zu_ZA.zip
diff -r cc6d733a192a -r c5a7516418c7 pidgin/win32/nsis/langmacros.nsh
--- a/pidgin/win32/nsis/langmacros.nsh Tue Feb 16 15:58:34 2010 +0000
+++ b/pidgin/win32/nsis/langmacros.nsh Thu Feb 18 16:59:04 2010 +0000
@@ -31,7 +31,6 @@
; Startup checks
!insertmacro PIDGIN_MACRO_LANGSTRING_INSERT INSTALLER_IS_RUNNING ${CUR_LANG}
!insertmacro PIDGIN_MACRO_LANGSTRING_INSERT PIDGIN_IS_RUNNING ${CUR_LANG}
- !insertmacro PIDGIN_MACRO_LANGSTRING_INSERT GTK_INSTALLER_NEEDED ${CUR_LANG}
; License Page
!insertmacro PIDGIN_MACRO_LANGSTRING_INSERT PIDGIN_LICENSE_BUTTON ${CUR_LANG}
@@ -48,10 +47,7 @@
!insertmacro PIDGIN_MACRO_LANGSTRING_INSERT PIDGIN_SHORTCUTS_SECTION_DESCRIPTION ${CUR_LANG}
!insertmacro PIDGIN_MACRO_LANGSTRING_INSERT PIDGIN_DESKTOP_SHORTCUT_DESC ${CUR_LANG}
!insertmacro PIDGIN_MACRO_LANGSTRING_INSERT PIDGIN_STARTMENU_SHORTCUT_DESC ${CUR_LANG}
-
- ; GTK+ Directory Page
- !insertmacro PIDGIN_MACRO_LANGSTRING_INSERT GTK_UPGRADE_PROMPT ${CUR_LANG}
- !insertmacro PIDGIN_MACRO_LANGSTRING_INSERT GTK_WINDOWS_INCOMPATIBLE ${CUR_LANG}
+ !insertmacro PIDGIN_MACRO_LANGSTRING_INSERT DEBUG_SYMBOLS_SECTION_TITLE ${CUR_LANG}
; Installer Finish Page
!insertmacro PIDGIN_MACRO_LANGSTRING_INSERT PIDGIN_FINISH_VISIT_WEB_SITE ${CUR_LANG}
@@ -59,10 +55,6 @@
; Pidgin Section Prompts and Texts
!insertmacro PIDGIN_MACRO_LANGSTRING_INSERT PIDGIN_PROMPT_CONTINUE_WITHOUT_UNINSTALL ${CUR_LANG}
- ; GTK+ Section Prompts
- !insertmacro PIDGIN_MACRO_LANGSTRING_INSERT GTK_INSTALL_ERROR ${CUR_LANG}
- !insertmacro PIDGIN_MACRO_LANGSTRING_INSERT GTK_BAD_INSTALL_PATH ${CUR_LANG}
-
; URI Handler section
!insertmacro PIDGIN_MACRO_LANGSTRING_INSERT URI_HANDLERS_SECTION_TITLE ${CUR_LANG}
@@ -99,6 +91,9 @@
!insertmacro PIDGIN_MACRO_LANGSTRING_INSERT PIDGIN_SPELLCHECK_SWEDISH ${CUR_LANG}
!insertmacro PIDGIN_MACRO_LANGSTRING_INSERT PIDGIN_SPELLCHECK_UKRAINIAN ${CUR_LANG}
+ !insertmacro PIDGIN_MACRO_LANGSTRING_INSERT PIDGIN_DEBUGSYMBOLS_ERROR ${CUR_LANG}
+ !insertmacro PIDGIN_MACRO_LANGSTRING_INSERT PIDGIN_GTK_DOWNLOAD_ERROR ${CUR_LANG}
+
!undef CUR_LANG
!macroend
diff -r cc6d733a192a -r c5a7516418c7 pidgin/win32/nsis/pidgin-installer.nsi
--- a/pidgin/win32/nsis/pidgin-installer.nsi Tue Feb 16 15:58:34 2010 +0000
+++ b/pidgin/win32/nsis/pidgin-installer.nsi Thu Feb 18 16:59:04 2010 +0000
@@ -8,11 +8,9 @@
;--------------------------------
;Global Variables
Var name
-Var GTK_FOLDER
Var ISSILENT
Var STARTUP_RUN_KEY
Var SPELLCHECK_SEL
-Var LANGUAGE_SET
;--------------------------------
;Configuration
@@ -20,14 +18,10 @@
;The name var is set in .onInit
Name $name
-!ifdef WITH_GTK
-OutFile "pidgin-${PIDGIN_VERSION}.exe"
+!ifdef OFFLINE_INSTALLER
+OutFile "pidgin-${PIDGIN_VERSION}-offline.exe"
!else
-!ifdef DEBUG
-OutFile "pidgin-${PIDGIN_VERSION}-debug.exe"
-!else
-OutFile "pidgin-${PIDGIN_VERSION}-no-gtk.exe"
-!endif
+OutFile "pidgin-${PIDGIN_VERSION}.exe"
!endif
SetCompressor /SOLID lzma
@@ -41,6 +35,7 @@
!include "Sections.nsh"
!include "WinVer.nsh"
!include "LogicLib.nsh"
+!include "Memento.nsh"
!include "FileFunc.nsh"
!insertmacro GetParameters
@@ -52,11 +47,13 @@
!insertmacro WordFind
!insertmacro un.WordFind
+!include "TextFunc.nsh"
+
;--------------------------------
;Defines
!define PIDGIN_NSIS_INCLUDE_PATH "."
-!define PIDGIN_INSTALLER_DEPS "..\..\..\..\win32-dev\pidgin-inst-deps"
+!define PIDGIN_INSTALLER_DEPS "..\..\..\..\win32-dev\pidgin-inst-deps-0.2"
; Remove these and the stuff that uses them at some point
!define OLD_GAIM_REG_KEY "SOFTWARE\gaim"
@@ -70,16 +67,16 @@
!define STARTUP_RUN_KEY "SOFTWARE\Microsoft\Windows\CurrentVersion\Run"
!define PIDGIN_UNINST_EXE "pidgin-uninst.exe"
-!define GTK_MIN_VERSION "2.6.10"
-!define GTK_REG_KEY "SOFTWARE\GTK\2.0"
+!define GTK_MIN_VERSION "2.14.0"
!define PERL_REG_KEY "SOFTWARE\Perl"
!define PERL_DLL "perl510.dll"
-!define GTK_DEFAULT_INSTALL_PATH "$COMMONFILES\GTK\2.0"
-!define GTK_RUNTIME_INSTALLER "..\..\..\..\gtk_installer\gtk-runtime-${GTK_INSTALL_VERSION}*.exe"
!define ASPELL_REG_KEY "SOFTWARE\Aspell"
!define DOWNLOADER_URL "http://pidgin.im/win32/download_redir.php"
+!define MEMENTO_REGISTRY_ROOT HKLM
+!define MEMENTO_REGISTRY_KEY "${PIDGIN_UNINSTALL_KEY}"
+
;--------------------------------
;Version resource
VIProductVersion "${PIDGIN_PRODUCT_VERSION}"
@@ -87,14 +84,10 @@
VIAddVersionKey "FileVersion" "${PIDGIN_VERSION}"
VIAddVersionKey "ProductVersion" "${PIDGIN_VERSION}"
VIAddVersionKey "LegalCopyright" ""
-!ifdef WITH_GTK
-VIAddVersionKey "FileDescription" "Pidgin Installer (w/ GTK+ Installer)"
+!ifdef OFFLINE_INSTALLER
+VIAddVersionKey "FileDescription" "Pidgin Installer (Offline)"
!else
-!ifdef DEBUG
-VIAddVersionKey "FileDescription" "Pidgin Installer (Debug Version)"
-!else
-VIAddVersionKey "FileDescription" "Pidgin Installer (w/o GTK+ Installer)"
-!endif
+VIAddVersionKey "FileDescription" "Pidgin Installer"
!endif
;--------------------------------
@@ -139,14 +132,6 @@
!insertmacro MUI_PAGE_LICENSE "../../../COPYING"
!insertmacro MUI_PAGE_COMPONENTS
-!ifdef WITH_GTK
- ; GTK+ install dir page
- !define MUI_PAGE_CUSTOMFUNCTION_PRE preGtkDirPage
- !define MUI_PAGE_CUSTOMFUNCTION_LEAVE postGtkDirPage
- !define MUI_DIRECTORYPAGE_VARIABLE $GTK_FOLDER
- !insertmacro MUI_PAGE_DIRECTORY
-!endif
-
; Pidgin install dir page
!insertmacro MUI_PAGE_DIRECTORY
@@ -317,7 +302,7 @@
IfErrors uninstall_problem
; Ready to uninstall..
ClearErrors
- ExecWait '"$TEMP\$R6" /S _?=$R1'
+ ExecWait '"$TEMP\$R6" /S /KEEPGTK=1 _?=$R1'
IfErrors exec_error
Delete "$TEMP\$R6"
Goto done
@@ -348,77 +333,38 @@
;--------------------------------
;GTK+ Runtime Install Section
-!ifdef WITH_GTK
Section $(GTK_SECTION_TITLE) SecGtk
- Call CheckUserInstallRights
- Pop $R1
-
- SetOutPath $TEMP
- SetOverwrite on
- File /oname=gtk-runtime.exe ${GTK_RUNTIME_INSTALLER}
- SetOverwrite off
-
- Call DoWeNeedGtk
- Pop $R0
- Pop $R6
+ InitPluginsDir
+ StrCpy $R1 "$PLUGINSDIR\gtk.zip"
+!ifdef OFFLINE_INSTALLER
- StrCmp $R0 "0" have_gtk
- StrCmp $R0 "1" upgrade_gtk
- StrCmp $R0 "2" upgrade_gtk
- ;StrCmp $R0 "3" no_gtk no_gtk
+ SetOutPath $PLUGINSDIR
+ File /oname=gtk.zip "..\..\..\..\gtk_installer\gtk-runtime-${GTK_INSTALL_VERSION}.zip"
- ;no_gtk:
- StrCmp $R1 "NONE" gtk_no_install_rights
- ClearErrors
- ExecWait '"$TEMP\gtk-runtime.exe" /L=$LANGUAGE $ISSILENT /D=$GTK_FOLDER'
- IfErrors gtk_install_error done
-
- upgrade_gtk:
- StrCpy $GTK_FOLDER $R6
- StrCmp $R0 "2" +2 ; Upgrade isn't optional
- MessageBox MB_YESNO $(GTK_UPGRADE_PROMPT) /SD IDYES IDNO done
- ClearErrors
- ExecWait '"$TEMP\gtk-runtime.exe" /L=$LANGUAGE $ISSILENT /D=$GTK_FOLDER'
- IfErrors gtk_install_error done
+!else
- gtk_install_error:
- Delete "$TEMP\gtk-runtime.exe"
- MessageBox MB_OK $(GTK_INSTALL_ERROR) /SD IDOK
- Quit
-
- have_gtk:
- StrCpy $GTK_FOLDER $R6
- StrCmp $R1 "NONE" done ; If we have no rights, we can't re-install
- ; Even if we have a sufficient version of GTK+, we give user choice to re-install.
- ClearErrors
- ExecWait '"$TEMP\gtk-runtime.exe" /L=$LANGUAGE $ISSILENT'
- IfErrors gtk_install_error
- Goto done
+ ; We need to download the GTK+ runtime
+ retry:
+ StrCpy $R2 "${DOWNLOADER_URL}?version=${PIDGIN_VERSION}>k_version=${GTK_INSTALL_VERSION}&dl_pkg=gtk"
+ DetailPrint "Downloading GTK+ Runtime ... ($R2)"
+ NSISdl::download /TIMEOUT=10000 $R2 $R1
+ Pop $R0
+ StrCmp $R0 "cancel" done
+ StrCmp $R0 "success" +2
+ MessageBox MB_RETRYCANCEL "$(PIDGIN_GTK_DOWNLOAD_ERROR) : $R1" /SD IDCANCEL IDRETRY retry IDCANCEL done
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ; end got_install rights
+!endif
+
+ SetOutPath "$INSTDIR"
- gtk_no_install_rights:
- ; Install GTK+ to Pidgin install dir
- StrCpy $GTK_FOLDER $INSTDIR
- ClearErrors
- ExecWait '"$TEMP\gtk-runtime.exe" /L=$LANGUAGE $ISSILENT /D=$GTK_FOLDER'
- IfErrors gtk_install_error
- SetOverwrite on
- ClearErrors
- CopyFiles /FILESONLY "$GTK_FOLDER\bin\*.dll" $GTK_FOLDER
- SetOverwrite off
- IfErrors gtk_install_error
- Delete "$GTK_FOLDER\bin\*.dll"
- Goto done
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ; end gtk_no_install_rights
+ nsisunz::UnzipToLog $R1 "$INSTDIR"
+ Pop $R0
+ StrCmp $R0 "success" +2
+ DetailPrint "$R0" ;print error message to log
done:
- Delete "$TEMP\gtk-runtime.exe"
SectionEnd ; end of GTK+ section
-!endif
;--------------------------------
;Pidgin Install Section
@@ -430,15 +376,12 @@
Call CheckUserInstallRights
Pop $R0
- ; Get GTK+ lib dir if we have it..
-
- StrCmp $R0 "NONE" pidgin_none
+ StrCmp $R0 "NONE" pidgin_install_files
StrCmp $R0 "HKLM" pidgin_hklm pidgin_hkcu
pidgin_hklm:
- ReadRegStr $R1 HKLM ${GTK_REG_KEY} "Path"
WriteRegStr HKLM "${HKLM_APP_PATHS_KEY}" "" "$INSTDIR\pidgin.exe"
- WriteRegStr HKLM "${HKLM_APP_PATHS_KEY}" "Path" "$R1\bin"
+ WriteRegStr HKLM "${HKLM_APP_PATHS_KEY}" "Path" "$INSTDIR\Gtk\bin"
WriteRegStr HKLM ${PIDGIN_REG_KEY} "" "$INSTDIR"
WriteRegStr HKLM ${PIDGIN_REG_KEY} "Version" "${PIDGIN_VERSION}"
WriteRegStr HKLM "${PIDGIN_UNINSTALL_KEY}" "DisplayName" "Pidgin"
@@ -452,10 +395,6 @@
Goto pidgin_install_files
pidgin_hkcu:
- ReadRegStr $R1 HKCU ${GTK_REG_KEY} "Path"
- StrCmp $R1 "" 0 +2
- ReadRegStr $R1 HKLM ${GTK_REG_KEY} "Path"
-
WriteRegStr HKCU ${PIDGIN_REG_KEY} "" "$INSTDIR"
WriteRegStr HKCU ${PIDGIN_REG_KEY} "Version" "${PIDGIN_VERSION}"
WriteRegStr HKCU "${PIDGIN_UNINSTALL_KEY}" "DisplayName" "Pidgin"
@@ -466,9 +405,6 @@
WriteRegStr HKCU "${PIDGIN_UNINSTALL_KEY}" "UninstallString" "$INSTDIR\${PIDGIN_UNINST_EXE}"
Goto pidgin_install_files
- pidgin_none:
- ReadRegStr $R1 HKLM ${GTK_REG_KEY} "Path"
-
pidgin_install_files:
SetOutPath "$INSTDIR"
; Pidgin files
@@ -478,18 +414,8 @@
Delete "$INSTDIR\plugins\liboscar.dll"
Delete "$INSTDIR\plugins\libjabber.dll"
- File /r ..\..\..\${PIDGIN_INSTALL_DIR}\*.*
- !ifdef DEBUG
+ File /r /x locale ..\..\..\${PIDGIN_INSTALL_DIR}\*.*
File "${PIDGIN_INSTALLER_DEPS}\exchndl.dll"
- !endif
-
- ; Install shfolder.dll if need be..
- SearchPath $R4 "shfolder.dll"
- StrCmp $R4 "" 0 got_shfolder
- SetOutPath "$SYSDIR"
- File "${PIDGIN_INSTALLER_DEPS}\shfolder.dll"
- SetOutPath "$INSTDIR"
- got_shfolder:
; Check if Perl is installed, if so add it to the AppPaths
ReadRegStr $R2 HKLM ${PERL_REG_KEY} ""
@@ -574,6 +500,22 @@
SectionGroupEnd
;--------------------------------
+;Translations
+
+!macro LANG_SECTION lang
+ ${MementoUnselectedSection} "${lang}" SecLang_${lang}
+ SetOutPath "$INSTDIR\locale\${lang}\LC_MESSAGES"
+ File /oname=pidgin.mo "..\..\..\${PIDGIN_INSTALL_DIR}\locale\${lang}\LC_MESSAGES\pidgin.mo"
+ SetOutPath "$INSTDIR"
+ ${MementoSectionEnd}
+!macroend
+SectionGroup $(TRANSLATIONS_SECTION_TITLE) SecTranslations
+ # pidgin-translations is generated based on the contents of the locale directory
+ !include "pidgin-translations.nsh"
+SectionGroupEnd
+${MementoSectionDone}
+
+;--------------------------------
;Spell Checking
SectionGroup /e $(PIDGIN_SPELLCHECK_SECTION_TITLE) SecSpellCheck
@@ -667,6 +609,37 @@
SectionEnd
SectionGroupEnd
+Section /o $(DEBUG_SYMBOLS_SECTION_TITLE) SecDebugSymbols
+ InitPluginsDir
+
+ ; We need to download and extract the debug symbols
+ StrCpy $R1 "$PLUGINSDIR\pidgin-${PIDGIN_VERSION}-dbgsym.zip"
+!ifdef OFFLINE_INSTALLER
+
+ SetOutPath $PLUGINSDIR
+ File /oname=pidgin-${PIDGIN_VERSION}-dbgsym.zip "..\..\..\..\gtk_installer\gtk-runtime-${GTK_INSTALL_VERSION}.zip"
+
+!else
+
+ retry:
+ StrCpy $R2 "${DOWNLOADER_URL}?version=${PIDGIN_VERSION}&dl_pkg=dbgsym"
+ DetailPrint "Downloading Debug Symbols... ($R2)"
+ NSISdl::download /TIMEOUT=10000 $R2 $R1
+ Pop $R0
+ StrCmp $R0 "cancel" done
+ StrCmp $R0 "success" +2
+ MessageBox MB_RETRYCANCEL "$(PIDGIN_DEBUGSYMBOLS_ERROR) : $R2" /SD IDCANCEL IDRETRY retry IDCANCEL done
+
+!endif
+
+ nsisunz::UnzipToLog $R1 "$INSTDIR"
+ Pop $R0
+ StrCmp $R0 "success" +2
+ DetailPrint "$R0" ;print error message to log
+
+ done:
+SectionEnd
+
;--------------------------------
;Uninstaller Section
@@ -819,11 +792,20 @@
Delete "$INSTDIR\softokn3.dll"
Delete "$INSTDIR\ssl3.dll"
Delete "$INSTDIR\${PIDGIN_UNINST_EXE}"
- !ifdef DEBUG
Delete "$INSTDIR\exchndl.dll"
- !endif
Delete "$INSTDIR\install.log"
+ ; Remove the debug symbols
+ RMDir /r "$INSTDIR\pidgin-${PIDGIN_VERSION}-dbgsym"
+
+ ; Remove the local GTK+ copy (if we're not just upgrading)
+ ${GetParameters} $R0
+ ClearErrors
+ ${GetOptions} "$R3" "/KEEPGTK=" $R1
+ IfErrors +2
+ StrCmp $R1 "1" +2
+ RMDir /r "$INSTDIR\Gtk"
+
;Try to remove Pidgin install dir (only if empty)
RMDir "$INSTDIR"
@@ -849,10 +831,8 @@
!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
!insertmacro MUI_DESCRIPTION_TEXT ${SecPidgin} \
$(PIDGIN_SECTION_DESCRIPTION)
-!ifdef WITH_GTK
!insertmacro MUI_DESCRIPTION_TEXT ${SecGtk} \
$(GTK_SECTION_DESCRIPTION)
-!endif
!insertmacro MUI_DESCRIPTION_TEXT ${SecShortcuts} \
$(PIDGIN_SHORTCUTS_SECTION_DESCRIPTION)
@@ -1145,93 +1125,42 @@
; Call DoWeNeedGtk
; First Pop:
; 0 - We have the correct version
-; Second Pop: Key where Version was found
; 1 - We have an old version that should work, prompt user for optional upgrade
-; Second Pop: HKLM or HKCU depending on where GTK was found.
; 2 - We have an old version that needs to be upgraded
-; Second Pop: HKLM or HKCU depending on where GTK was found.
; 3 - We don't have Gtk+ at all
-; Second Pop: "NONE, HKLM or HKCU" depending on our rights..
;
Function DoWeNeedGtk
- ; Logic should be:
- ; - Check what user rights we have (HKLM or HKCU)
- ; - If HKLM rights..
- ; - Only check HKLM key for GTK+
- ; - If installed to HKLM, check it and return.
- ; - If HKCU rights..
- ; - First check HKCU key for GTK+
- ; - if good or bad exists stop and ret.
- ; - If no hkcu gtk+ install, check HKLM
- ; - If HKLM ver exists but old, return as if no ver exits.
- ; - If no rights
- ; - Check HKLM
Push $0
Push $1
- Push $2
- Push $3
- Call CheckUserInstallRights
- Pop $1
- StrCmp $1 "HKLM" check_hklm
- StrCmp $1 "HKCU" check_hkcu check_hklm
- check_hkcu:
- ReadRegStr $0 HKCU ${GTK_REG_KEY} "Version"
- StrCpy $2 "HKCU"
- StrCmp $0 "" check_hklm have_gtk
+ IfFileExists "$INSTDIR\Gtk\CONTENTS" +3
+ Push "3"
+ Goto done
- check_hklm:
- ReadRegStr $0 HKLM ${GTK_REG_KEY} "Version"
- StrCpy $2 "HKLM"
- StrCmp $0 "" no_gtk have_gtk
-
- have_gtk:
- ; GTK+ is already installed; check version.
- ; Change this to not even run the GTK installer if this version is already installed.
- ${VersionCompare} ${GTK_INSTALL_VERSION} $0 $3
- IntCmp $3 1 +1 good_version good_version
- ${VersionCompare} ${GTK_MIN_VERSION} $0 $3
+ ClearErrors
+ ${ConfigRead} "$INSTDIR\Gtk\CONTENTS" "Bundle Version " $0
+ IfErrors 0 +3
+ Push "3"
+ Goto done
- ; Bad version. If hklm ver and we have hkcu or no rights.. return no gtk
- StrCmp $1 "NONE" no_gtk ; if no rights.. can't upgrade
- StrCmp $1 "HKCU" 0 +2 ; if HKLM can upgrade..
- StrCmp $2 "HKLM" no_gtk ; have hkcu rights.. if found hklm ver can't upgrade..
- Push $2
- IntCmp $3 1 +3
- Push "1" ; Optional Upgrade
- Goto done
- Push "2" ; Mandatory Upgrade
- Goto done
+ ${VersionCompare} ${GTK_INSTALL_VERSION} $0 $1
+ IntCmp $1 1 +3
+ Push "0" ; Have a good version
+ Goto done
- good_version:
- StrCmp $2 "HKLM" have_hklm_gtk have_hkcu_gtk
- have_hkcu_gtk:
- ; Have HKCU version
- ReadRegStr $0 HKCU ${GTK_REG_KEY} "Path"
- Goto good_version_cont
-
- have_hklm_gtk:
- ReadRegStr $0 HKLM ${GTK_REG_KEY} "Path"
- Goto good_version_cont
-
- good_version_cont:
- Push $0 ; The path to existing GTK+
- Push "0"
- Goto done
-
- no_gtk:
- Push $1 ; our rights
- Push "3"
- Goto done
+ ${VersionCompare} ${GTK_MIN_VERSION} $0 $1
+ IntCmp $1 1 +3
+ Push "1" ; Optional Upgrade
+ Goto done
+ Push "2" ; Mandatory Upgrade
+ Goto done
done:
- ; The top two items on the stack are what we want to return
- Exch 4
+ ; The item on the stack is what we want to return
+ Exch
Pop $1
- Exch 4
+ Exch
Pop $0
- Pop $3
- Pop $2
FunctionEnd
@@ -1302,6 +1231,8 @@
DeleteRegValue HKCU "${OLD_GAIM_REG_KEY}" "Installer Language"
WriteRegStr HKCU "${PIDGIN_REG_KEY}" "Installer Language" "$R0"
+ ${MementoSectionRestore}
+
!insertmacro SetSectionFlag ${SecSpellCheck} ${SF_RO}
!insertmacro UnselectSection ${SecSpellCheck}
@@ -1346,12 +1277,10 @@
IfSilent 0 +2
StrCpy $ISSILENT "/NOUI"
- StrCpy $LANGUAGE_SET "0"
ClearErrors
${GetOptions} "$R3" "/L=" $R1
- IfErrors +4
+ IfErrors +3
StrCpy $LANGUAGE $R1
- StrCpy $LANGUAGE_SET "1"
Goto skip_lang
; Select Language
@@ -1416,17 +1345,14 @@
FunctionEnd
Function .onInstSuccess
- ; NSIS doesn't appear to save the language when in Silent Mode, so we do so manually
- IfSilent 0 done
- StrCmp $LANGUAGE_SET "0" done
+ ${MementoSectionSave}
- WriteRegStr "${MUI_LANGDLL_REGISTRY_ROOT}" "${MUI_LANGDLL_REGISTRY_KEY}" "${MUI_LANGDLL_REGISTRY_VALUENAME}" $LANGUAGE
-
- done:
FunctionEnd
+
Function un.onInit
+
Call un.RunCheck
StrCpy $name "Pidgin ${PIDGIN_VERSION}"
;LogSet on
@@ -1440,107 +1366,23 @@
Function preWelcomePage
Push $R0
-
-!ifndef WITH_GTK
- ; If this installer dosn't have GTK, check whether we need it.
- ; We do this here and not in .onInit because language change in
- ; .onInit doesn't take effect until it is finished.
- Call DoWeNeedGtk
- Pop $R0
- Pop $GTK_FOLDER
-
- IntCmp $R0 1 done done
- MessageBox MB_OK $(GTK_INSTALLER_NEEDED) /SD IDOK
- Quit
-
- done:
-
-!else
Push $R1
- Push $R2
Call DoWeNeedGtk
Pop $R0
- Pop $R2
- IntCmp $R0 1 gtk_selection_done gtk_not_mandatory
+ IntCmp $R0 1 done gtk_not_mandatory
; Make the GTK+ Section RO if it is required.
!insertmacro SetSectionFlag ${SecGtk} ${SF_RO}
- Goto gtk_selection_done
+ Goto done
gtk_not_mandatory:
; Don't select the GTK+ section if we already have this version or newer installed
!insertmacro UnselectSection ${SecGtk}
- gtk_selection_done:
-
- ; If on Win95/98/ME warn them that the GTK+ version wont work
- ${Unless} ${IsNT}
- !insertmacro UnselectSection ${SecGtk}
- !insertmacro SetSectionFlag ${SecGtk} ${SF_RO}
- MessageBox MB_OK $(GTK_WINDOWS_INCOMPATIBLE) /SD IDOK
- IntCmp $R0 1 done done ; Upgrade isn't optional - abort if we don't have a suitable version
- Quit
- ${EndIf}
done:
- Pop $R2
- Pop $R1
-!endif
- Pop $R0
-FunctionEnd
-
-!ifdef WITH_GTK
-Function preGtkDirPage
- Push $R0
- Push $R1
- Call DoWeNeedGtk
- Pop $R0
- Pop $R1
-
- IntCmp $R0 2 +2 +2 no_gtk
- StrCmp $R0 "3" no_gtk no_gtk
-
- ; Don't show dir selector.. Upgrades are done to existing path..
Pop $R1
Pop $R0
- Abort
-
- no_gtk:
- StrCmp $R1 "NONE" 0 no_gtk_cont
- ; Got no install rights..
- Pop $R1
- Pop $R0
- Abort
- no_gtk_cont:
- ; Suggest path..
- StrCmp $R1 "HKCU" 0 hklm1
- ${GetParent} $SMPROGRAMS $R0
- ${GetParent} $R0 $R0
- StrCpy $R0 "$R0\GTK\2.0"
- Goto got_path
- hklm1:
- StrCpy $R0 "${GTK_DEFAULT_INSTALL_PATH}"
-
- got_path:
- StrCpy $name "GTK+ ${GTK_INSTALL_VERSION}"
- StrCpy $GTK_FOLDER $R0
- Pop $R1
- Pop $R0
FunctionEnd
-Function postGtkDirPage
- Push $R0
- StrCpy $name "Pidgin ${PIDGIN_VERSION}"
- Push $GTK_FOLDER
- Call VerifyDir
- Pop $R0
- StrCmp $R0 "0" 0 done
- MessageBox MB_OK $(GTK_BAD_INSTALL_PATH) /SD IDOK
- Pop $R0
- Abort
- done:
- Pop $R0
-FunctionEnd
-!endif
-
; SpellChecker Related Functions
;-------------------------------
@@ -1668,6 +1510,8 @@
Pop $R0 ;This is the language code
Push $R1
+ InitPluginsDir
+
IfErrors done ; We weren't able to convert the section to lang code
retry:
@@ -1702,12 +1546,12 @@
IntCmp $R0 15 installed
; If this is the check after installation, don't infinite loop on failure
- StrCmp $R1 "$TEMP\aspell_installer.exe" 0 +3
+ StrCmp $R1 "$PLUGINSDIR\aspell_installer.exe" 0 +3
StrCpy $R0 $(ASPELL_INSTALL_FAILED)
Goto done
; We need to download and install aspell
- StrCpy $R1 "$TEMP\aspell_installer.exe"
+ StrCpy $R1 "$PLUGINSDIR\aspell_installer.exe"
StrCpy $R2 "${DOWNLOADER_URL}?version=${PIDGIN_VERSION}&dl_pkg=aspell_core"
DetailPrint "Downloading Aspell... ($R2)"
NSISdl::download /TIMEOUT=10000 $R2 $R1
@@ -1743,12 +1587,12 @@
StrCmp $R2 "" 0 installed
; If this is the check after installation, don't infinite loop on failure
- StrCmp $R1 "$TEMP\aspell_dict-$R0.exe" 0 +3
+ StrCmp $R1 "$PLUGINSDIR\aspell_dict-$R0.exe" 0 +3
StrCpy $R0 $(ASPELL_INSTALL_FAILED)
Goto done
; We need to download and install aspell
- StrCpy $R1 "$TEMP\aspell_dict-$R0.exe"
+ StrCpy $R1 "$PLUGINSDIR\aspell_dict-$R0.exe"
StrCpy $R3 "${DOWNLOADER_URL}?version=${PIDGIN_VERSION}&dl_pkg=lang_$R0"
DetailPrint "Downloading the Aspell $R0 Dictionary... ($R3)"
NSISdl::download /TIMEOUT=10000 $R3 $R1
@@ -1758,10 +1602,10 @@
Goto done
; Use a specific temporary $OUTDIR for each dictionary because the installer doesn't clean up after itself
StrCpy $R4 "$OUTDIR"
- SetOutPath "$TEMP\aspell_dict-$R0"
+ SetOutPath "$PLUGINSDIR\aspell_dict-$R0"
ExecWait '"$R1"'
SetOutPath "$R4"
- RMDir /r "$TEMP\aspell_dict-$R0"
+ RMDir /r "$PLUGINSDIR\aspell_dict-$R0"
Delete $R1
Goto check ; Check that it is now installed correctly
diff -r cc6d733a192a -r c5a7516418c7 pidgin/win32/nsis/translations/afrikaans.nsh
--- a/pidgin/win32/nsis/translations/afrikaans.nsh Tue Feb 16 15:58:34 2010 +0000
+++ b/pidgin/win32/nsis/translations/afrikaans.nsh Thu Feb 18 16:59:04 2010 +0000
@@ -12,7 +12,6 @@
; Startup Checks
!define INSTALLER_IS_RUNNING "Die installeerder loop reeds."
!define PIDGIN_IS_RUNNING "Pidgin loop reeds rens. Verlaat Pidgin eers en probeer dan weer."
-!define GTK_INSTALLER_NEEDED "Die GTK+-looptydomgewing is f soek f moet opgegradeer word.$\rInstalleer asb. v{GTK_MIN_VERSION} of hor van die GTK+-looptyd"
; License Page
!define PIDGIN_LICENSE_BUTTON "Volgende >"
@@ -31,8 +30,6 @@
!define PIDGIN_STARTMENU_SHORTCUT_DESC "Skep 'n Begin-kieslysinskrywing vir Pidgin"
; GTK+ Directory Page
-!define GTK_UPGRADE_PROMPT "'n Ou weergawe van die GTK+-looptyd is gevind. Wil u opgradeer?$\rLet wel: $(^Name) werk dalk net as u so maak."
-!define GTK_WINDOWS_INCOMPATIBLE "Windows 95/98/Me is onversoenbaar met GTK+ 2.8.0 en nuwer. GTK+ ${GTK_INSTALL_VERSION} sal nie installeer nie.$\rIndien u nie GTK+ ${GTK_MIN_VERSION} of nuwer reeds genstalleer het nie, sal die installasie nou staak."
; Installer Finish Page
!define PIDGIN_FINISH_VISIT_WEB_SITE "Besoek die WinPidgin-webblad"
@@ -41,8 +38,6 @@
!define PIDGIN_PROMPT_CONTINUE_WITHOUT_UNINSTALL "Kan nie die tans genstalleerde weergawe van Pidgin verwyder nie. Die nuwe weergawe sal genstalleer word sonder om die huidige een te verwyder."
; GTK+ Section Prompts
-!define GTK_INSTALL_ERROR "Fout met installering van GTK+-looptyd."
-!define GTK_BAD_INSTALL_PATH "Die pad wat u verskaf het, is ontoeganklik of kan nie geskep word nie."
; URL Handler section
!define URI_HANDLERS_SECTION_TITLE "URI-hanteerders"
diff -r cc6d733a192a -r c5a7516418c7 pidgin/win32/nsis/translations/albanian.nsh
--- a/pidgin/win32/nsis/translations/albanian.nsh Tue Feb 16 15:58:34 2010 +0000
+++ b/pidgin/win32/nsis/translations/albanian.nsh Thu Feb 18 16:59:04 2010 +0000
@@ -8,8 +8,6 @@
;; Author: Besnik Bleta
;;
-; Startup GTK+ check
-!define GTK_INSTALLER_NEEDED "Ose mungon mjedisi GTK+ runtime ose lyp përditësim.$\rJu lutem instaloni GTK+ runtime v${GTK_MIN_VERSION} ose më të vonshëm"
; License Page
!define PIDGIN_LICENSE_BUTTON "Më tej >"
@@ -23,14 +21,11 @@
; GTK+ Directory Page
-!define GTK_UPGRADE_PROMPT "U gjet një version i vjetër për GTK+ runtime. Doni të përditësohet?$\rShënim: Pidgin-i mund të mos punojë nëse nuk e bëni."
; Installer Finish Page
!define PIDGIN_FINISH_VISIT_WEB_SITE "Vizitoni Faqen Web të Pidgin-it për Windows"
; GTK+ Section Prompts
-!define GTK_INSTALL_ERROR "gabim gjatë instalimit të GTK+ runtime."
-!define GTK_BAD_INSTALL_PATH "Shtegu që treguat nuk mund të arrihet ose krijohet."
; Uninstall Section Prompts
!define un.PIDGIN_UNINSTALL_ERROR_1 "Çinstaluesi nuk gjeti dot zëra regjistri për Pidgin-in.$\rKa mundësi që këtë zbatim ta ketë instaluar një tjetër përdorues."
diff -r cc6d733a192a -r c5a7516418c7 pidgin/win32/nsis/translations/arabic.nsh
--- a/pidgin/win32/nsis/translations/arabic.nsh Tue Feb 16 15:58:34 2010 +0000
+++ b/pidgin/win32/nsis/translations/arabic.nsh Thu Feb 18 16:59:04 2010 +0000
@@ -9,7 +9,6 @@
; Startup Checks
!define INSTALLER_IS_RUNNING " ."
!define PIDGIN_IS_RUNNING " . ."
-!define GTK_INSTALLER_NEEDED " + (GTK+) .$\r v${GTK_MIN_VERSION} +"
; License Page
!define PIDGIN_LICENSE_BUTTON " >"
@@ -29,8 +28,6 @@
!define PIDGIN_STARTMENU_SHORTCUT_DESC " "
; GTK+ Directory Page
-!define GTK_UPGRADE_PROMPT " +. ˿$\r: $(^Name) ."
-!define GTK_WINDOWS_INCOMPATIBLE " 95/98/Me + 2.8.0 . + ${GTK_INSTALL_VERSION} .$\r + ${GTK_MIN_VERSION} ."
; Installer Finish Page
!define PIDGIN_FINISH_VISIT_WEB_SITE " "
@@ -39,8 +36,6 @@
!define PIDGIN_PROMPT_CONTINUE_WITHOUT_UNINSTALL " . ."
; GTK+ Section Prompts
-!define GTK_INSTALL_ERROR " +."
-!define GTK_BAD_INSTALL_PATH " ."
; URL Handler section
!define URI_HANDLERS_SECTION_TITLE " "
diff -r cc6d733a192a -r c5a7516418c7 pidgin/win32/nsis/translations/basque.nsh
--- a/pidgin/win32/nsis/translations/basque.nsh Tue Feb 16 15:58:34 2010 +0000
+++ b/pidgin/win32/nsis/translations/basque.nsh Thu Feb 18 16:59:04 2010 +0000
@@ -1,80 +1,75 @@
-;;
-;; basque.nsh
-;;Abio-menua - Istanteko Mezularitza
-;; Basque language strings for the Windows Pidgin NSIS installer.
-;; Windows Code page: 1252
-;;
-;; Author: Mikel Pascual Aldabaldetreku , 2007.
-
-; Startup Checks
-!define INSTALLER_IS_RUNNING "Instalatzailea martxan dago."
-!define PIDGIN_IS_RUNNING "Pidgin istantzia bat dago martxan. Pidgin itxi eta berriro saiatu."
-!define GTK_INSTALLER_NEEDED "GTK+ exekuzio-ingurunea falta da, edo eguneratu egin beharko litzateke.$\rGTK+ exekuzio-ingurunearen ${GTK_MIN_VERSION} bertsioa edo berriagoa instalatu"
-
-; License Page
-!define PIDGIN_LICENSE_BUTTON "Jarraitu >"
-!define PIDGIN_LICENSE_BOTTOM_TEXT "GNU Lizentzia Orokor Publikopean (GPL) argitaratzen da $(^Name). Informatzeko helburu soilarekin aurkezten da hemen lizentzia. $_CLICK"
-
-; Components Page
-!define PIDGIN_SECTION_TITLE "Pidgin Istanteko Mezularitza Bezeroa (beharrezkoa)"
-!define GTK_SECTION_TITLE "GTK+ exekuzio ingurunea (beharrezkoa)"
-!define PIDGIN_SHORTCUTS_SECTION_TITLE "Lasterbideak"
-!define PIDGIN_DESKTOP_SHORTCUT_SECTION_TITLE "Mahaigaina"
-!define PIDGIN_STARTMENU_SHORTCUT_SECTION_TITLE "Abio-menua"
-!define PIDGIN_SECTION_DESCRIPTION "Funtsezko Pidgin fitxategi eta dll-ak"
-!define GTK_SECTION_DESCRIPTION "Plataforma anitzeko GUI tresna-sorta, Pidgin-ek erabilia"
-
-!define PIDGIN_SHORTCUTS_SECTION_DESCRIPTION "Pidgin abiarazteko lasterbideak"
-!define PIDGIN_DESKTOP_SHORTCUT_DESC "Pidgin-entzako lasterbidea Mahaigainean"
-!define PIDGIN_STARTMENU_SHORTCUT_DESC "Pidgin-entzako lasterbidea Abio-Menuan"
-
-; GTK+ Directory Page
-!define GTK_UPGRADE_PROMPT "GTK+ exekuzio-ingurunearen bertsio zahar bat aurkitu da. Eguneratu egin nahi al duzu?$\rOharra: Bestela, posible da $(^Name) ez ibiltzea."
-!define GTK_WINDOWS_INCOMPATIBLE "GTK+ 2.8.0 eta berriagoekin bateraezinak dira Windows 95/98/Me. Ez da GTK+ ${GTK_INSTALL_VERSION} instalatuko.$\rJadanik ez badaukazu GTK+ ${GTK_MIN_VERSION} edo berriagorik instalatuta, bertan behera utziko da instalazioa."
-
-; Installer Finish Page
-!define PIDGIN_FINISH_VISIT_WEB_SITE "Pidgin Webgunera etorri"
-
-; Pidgin Section Prompts and Texts
-!define PIDGIN_PROMPT_CONTINUE_WITHOUT_UNINSTALL "Ezin izan da jadanik instalatuta zegoen Pidgin bertsioa kendu. Aurreko bertsioa kendu gabe instalatuko da bertsio berria."
-
-; GTK+ Section Prompts
-!define GTK_INSTALL_ERROR "Errorea GTK+ exekuzio-ingurunea instalatzean."
-!define GTK_BAD_INSTALL_PATH "The path you entered can not be accessed or created."
-
-; URL Handler section
-!define URI_HANDLERS_SECTION_TITLE "URI Kudeatzaileak"
-
-; Uninstall Section Prompts
-!define un.PIDGIN_UNINSTALL_ERROR_1 "Ezin izan dira Pidgin-en erregistro-sarrerak aurkitu.$\rZiurrenik, beste erabiltzaile batek instalatu zuen aplikazio hau."
-!define un.PIDGIN_UNINSTALL_ERROR_2 "Ez daukazu aplikazio hau kentzeko baimenik."
-
-; Spellcheck Section Prompts
-!define PIDGIN_SPELLCHECK_SECTION_TITLE "Zuzentzaile Ortografikoa"
-!define PIDGIN_SPELLCHECK_ERROR "Errorea Zuzentzaile Ortografikoa instalatzean"
-!define PIDGIN_SPELLCHECK_DICT_ERROR "Errorea Zuzentzaile Ortografikoarentzako hiztegia instalatzean"
-!define PIDGIN_SPELLCHECK_SECTION_DESCRIPTION "Zuzentzaile Ortografikoa. (Internet konexioa behar du instalatzeko)"
-!define ASPELL_INSTALL_FAILED "Ezin izan da instalatu"
-!define PIDGIN_SPELLCHECK_BRETON "Britaniera"
-!define PIDGIN_SPELLCHECK_CATALAN "Katalana"
-!define PIDGIN_SPELLCHECK_CZECH "Txekiera"
-!define PIDGIN_SPELLCHECK_WELSH "Gaelikoa"
-!define PIDGIN_SPELLCHECK_DANISH "Daniera"
-!define PIDGIN_SPELLCHECK_GERMAN "Alemana"
-!define PIDGIN_SPELLCHECK_GREEK "Grekoa"
-!define PIDGIN_SPELLCHECK_ENGLISH "Ingelesa"
-!define PIDGIN_SPELLCHECK_ESPERANTO "Esperantoa"
-!define PIDGIN_SPELLCHECK_SPANISH "Gaztelania"
-!define PIDGIN_SPELLCHECK_FAROESE "Faroera"
-!define PIDGIN_SPELLCHECK_FRENCH "Frantsesa"
-!define PIDGIN_SPELLCHECK_ITALIAN "Italiera"
-!define PIDGIN_SPELLCHECK_DUTCH "Nederlandera"
-!define PIDGIN_SPELLCHECK_NORWEGIAN "Norvegiera"
-!define PIDGIN_SPELLCHECK_POLISH "Poloniera"
-!define PIDGIN_SPELLCHECK_PORTUGUESE "Portugesa"
-!define PIDGIN_SPELLCHECK_ROMANIAN "Errumaniera"
-!define PIDGIN_SPELLCHECK_RUSSIAN "Errusiera"
-!define PIDGIN_SPELLCHECK_SLOVAK "Eslovakiera"
-!define PIDGIN_SPELLCHECK_SWEDISH "Suediera"
-!define PIDGIN_SPELLCHECK_UKRAINIAN "Ukraniera"
-
+;;
+;; basque.nsh
+;;Abio-menua - Istanteko Mezularitza
+;; Basque language strings for the Windows Pidgin NSIS installer.
+;; Windows Code page: 1252
+;;
+;; Author: Mikel Pascual Aldabaldetreku , 2007.
+
+; Startup Checks
+!define INSTALLER_IS_RUNNING "Instalatzailea martxan dago."
+!define PIDGIN_IS_RUNNING "Pidgin istantzia bat dago martxan. Pidgin itxi eta berriro saiatu."
+
+; License Page
+!define PIDGIN_LICENSE_BUTTON "Jarraitu >"
+!define PIDGIN_LICENSE_BOTTOM_TEXT "GNU Lizentzia Orokor Publikopean (GPL) argitaratzen da $(^Name). Informatzeko helburu soilarekin aurkezten da hemen lizentzia. $_CLICK"
+
+; Components Page
+!define PIDGIN_SECTION_TITLE "Pidgin Istanteko Mezularitza Bezeroa (beharrezkoa)"
+!define GTK_SECTION_TITLE "GTK+ exekuzio ingurunea (beharrezkoa)"
+!define PIDGIN_SHORTCUTS_SECTION_TITLE "Lasterbideak"
+!define PIDGIN_DESKTOP_SHORTCUT_SECTION_TITLE "Mahaigaina"
+!define PIDGIN_STARTMENU_SHORTCUT_SECTION_TITLE "Abio-menua"
+!define PIDGIN_SECTION_DESCRIPTION "Funtsezko Pidgin fitxategi eta dll-ak"
+!define GTK_SECTION_DESCRIPTION "Plataforma anitzeko GUI tresna-sorta, Pidgin-ek erabilia"
+
+!define PIDGIN_SHORTCUTS_SECTION_DESCRIPTION "Pidgin abiarazteko lasterbideak"
+!define PIDGIN_DESKTOP_SHORTCUT_DESC "Pidgin-entzako lasterbidea Mahaigainean"
+!define PIDGIN_STARTMENU_SHORTCUT_DESC "Pidgin-entzako lasterbidea Abio-Menuan"
+
+; GTK+ Directory Page
+
+; Installer Finish Page
+!define PIDGIN_FINISH_VISIT_WEB_SITE "Pidgin Webgunera etorri"
+
+; Pidgin Section Prompts and Texts
+!define PIDGIN_PROMPT_CONTINUE_WITHOUT_UNINSTALL "Ezin izan da jadanik instalatuta zegoen Pidgin bertsioa kendu. Aurreko bertsioa kendu gabe instalatuko da bertsio berria."
+
+; GTK+ Section Prompts
+
+; URL Handler section
+!define URI_HANDLERS_SECTION_TITLE "URI Kudeatzaileak"
+
+; Uninstall Section Prompts
+!define un.PIDGIN_UNINSTALL_ERROR_1 "Ezin izan dira Pidgin-en erregistro-sarrerak aurkitu.$\rZiurrenik, beste erabiltzaile batek instalatu zuen aplikazio hau."
+!define un.PIDGIN_UNINSTALL_ERROR_2 "Ez daukazu aplikazio hau kentzeko baimenik."
+
+; Spellcheck Section Prompts
+!define PIDGIN_SPELLCHECK_SECTION_TITLE "Zuzentzaile Ortografikoa"
+!define PIDGIN_SPELLCHECK_ERROR "Errorea Zuzentzaile Ortografikoa instalatzean"
+!define PIDGIN_SPELLCHECK_DICT_ERROR "Errorea Zuzentzaile Ortografikoarentzako hiztegia instalatzean"
+!define PIDGIN_SPELLCHECK_SECTION_DESCRIPTION "Zuzentzaile Ortografikoa. (Internet konexioa behar du instalatzeko)"
+!define ASPELL_INSTALL_FAILED "Ezin izan da instalatu"
+!define PIDGIN_SPELLCHECK_BRETON "Britaniera"
+!define PIDGIN_SPELLCHECK_CATALAN "Katalana"
+!define PIDGIN_SPELLCHECK_CZECH "Txekiera"
+!define PIDGIN_SPELLCHECK_WELSH "Gaelikoa"
+!define PIDGIN_SPELLCHECK_DANISH "Daniera"
+!define PIDGIN_SPELLCHECK_GERMAN "Alemana"
+!define PIDGIN_SPELLCHECK_GREEK "Grekoa"
+!define PIDGIN_SPELLCHECK_ENGLISH "Ingelesa"
+!define PIDGIN_SPELLCHECK_ESPERANTO "Esperantoa"
+!define PIDGIN_SPELLCHECK_SPANISH "Gaztelania"
+!define PIDGIN_SPELLCHECK_FAROESE "Faroera"
+!define PIDGIN_SPELLCHECK_FRENCH "Frantsesa"
+!define PIDGIN_SPELLCHECK_ITALIAN "Italiera"
+!define PIDGIN_SPELLCHECK_DUTCH "Nederlandera"
+!define PIDGIN_SPELLCHECK_NORWEGIAN "Norvegiera"
+!define PIDGIN_SPELLCHECK_POLISH "Poloniera"
+!define PIDGIN_SPELLCHECK_PORTUGUESE "Portugesa"
+!define PIDGIN_SPELLCHECK_ROMANIAN "Errumaniera"
+!define PIDGIN_SPELLCHECK_RUSSIAN "Errusiera"
+!define PIDGIN_SPELLCHECK_SLOVAK "Eslovakiera"
+!define PIDGIN_SPELLCHECK_SWEDISH "Suediera"
+!define PIDGIN_SPELLCHECK_UKRAINIAN "Ukraniera"
+
diff -r cc6d733a192a -r c5a7516418c7 pidgin/win32/nsis/translations/bulgarian.nsh
--- a/pidgin/win32/nsis/translations/bulgarian.nsh Tue Feb 16 15:58:34 2010 +0000
+++ b/pidgin/win32/nsis/translations/bulgarian.nsh Thu Feb 18 16:59:04 2010 +0000
@@ -8,9 +8,6 @@
;;
-; Startup GTK+ check
-!define GTK_INSTALLER_NEEDED "GTK+ runtime .$\r v${GTK_MIN_VERSION} -"
-
; Components Page
!define PIDGIN_SECTION_TITLE "Pidgin ( )"
!define GTK_SECTION_TITLE "GTK+ Runtime (required)"
@@ -19,11 +16,8 @@
; GTK+ Directory Page
-!define GTK_UPGRADE_PROMPT " GTK+ runtime . ?$\rNote: Pidgin ."
; GTK+ Section Prompts
-!define GTK_INSTALL_ERROR " GTK+ runtime."
-!define GTK_BAD_INSTALL_PATH " ."
; Uninstall Section Prompts
!define un.PIDGIN_UNINSTALL_ERROR_1 " Pidgin.$\r ."
diff -r cc6d733a192a -r c5a7516418c7 pidgin/win32/nsis/translations/catalan.nsh
--- a/pidgin/win32/nsis/translations/catalan.nsh Tue Feb 16 15:58:34 2010 +0000
+++ b/pidgin/win32/nsis/translations/catalan.nsh Thu Feb 18 16:59:04 2010 +0000
@@ -12,7 +12,6 @@
; Startup Checks
!define INSTALLER_IS_RUNNING "L'instal.lador encara est executant-se."
!define PIDGIN_IS_RUNNING "Hi ha una instncia del Pidgin executant-se. Surt del Pidgin i torna a intentar-ho."
-!define GTK_INSTALLER_NEEDED "L'entorn d'execuci GTK+ no existeix o necessita sser actualitzat.$\rSius plau instal.la la versi${GTK_MIN_VERSION} o superior de l'entonr GTK+"
; License Page
!define PIDGIN_LICENSE_BUTTON "Segent >"
@@ -34,14 +33,11 @@
; GTK+ Directory Page
-!define GTK_UPGRADE_PROMPT "S'ha trobat una versi antiga de l'entorn d'execuci GTK. Vols actualitzar-la?$\rNota: $(^Name) no funcionar sino ho fas."
; Installer Finish Page
!define PIDGIN_FINISH_VISIT_WEB_SITE "Visita la pgina web de Pidgin per Windows"
; GTK+ Section Prompts
-!define GTK_INSTALL_ERROR "Error installlant l'entorn d'execuci GTK+."
-!define GTK_BAD_INSTALL_PATH "El directori que has introdut no pot sser accedit o creat."
; Uninstall Section Prompts
!define un.PIDGIN_UNINSTALL_ERROR_1 "L'instal.lador podria no trobar les entrades del registre de Pidgin.$\rProbablement un altre usuari ha instal.lat aquesta aplicaci."
diff -r cc6d733a192a -r c5a7516418c7 pidgin/win32/nsis/translations/czech.nsh
--- a/pidgin/win32/nsis/translations/czech.nsh Tue Feb 16 15:58:34 2010 +0000
+++ b/pidgin/win32/nsis/translations/czech.nsh Thu Feb 18 16:59:04 2010 +0000
@@ -8,8 +8,6 @@
;; Version 2
;;
-; Startup GTK+ check
-!define GTK_INSTALLER_NEEDED "GTK+ runtime buto chyb, nebo je poteba provst upgrade.$\rProvete instalaci verze${GTK_MIN_VERSION} nebo vy."
; License Page
!define PIDGIN_LICENSE_BUTTON "Dal >"
@@ -23,14 +21,11 @@
; GTK+ Directory Page
-!define GTK_UPGRADE_PROMPT "Byla nalezena star verze GTK+ runtime. Chcete provst upgrade?$\rUpozornn: Bez upgradu $(^Name) nemus pracovat sprvn."
; Installer Finish Page
!define PIDGIN_FINISH_VISIT_WEB_SITE "Navtvit Windows Pidgin Web Page"
; GTK+ Section Prompts
-!define GTK_INSTALL_ERROR "Chyba pi instalaci GTK+ runtime."
-!define GTK_BAD_INSTALL_PATH "Zadan cesta je nedostupn, nebo ji nelze vytvoit."
; Uninstall Section Prompts
!define un.PIDGIN_UNINSTALL_ERROR_1 "Odinstaln proces neme najt zznamy pro Pidgin v registrech.$\rPravdpodobn instalaci tto aplikace provedl jin uivatel."
diff -r cc6d733a192a -r c5a7516418c7 pidgin/win32/nsis/translations/danish.nsh
--- a/pidgin/win32/nsis/translations/danish.nsh Tue Feb 16 15:58:34 2010 +0000
+++ b/pidgin/win32/nsis/translations/danish.nsh Thu Feb 18 16:59:04 2010 +0000
@@ -8,9 +8,6 @@
;; Version 2
;;
-; Startup GTK+ check
-!define GTK_INSTALLER_NEEDED "GTK+ runtime environment enten mangler eller skal opgraderes.$\rInstallr venligst GTK+ runtime version v${GTK_MIN_VERSION} eller hjere."
-
; License Page
!define PIDGIN_LICENSE_BUTTON "Nste >"
!define PIDGIN_LICENSE_BOTTOM_TEXT "$(^Name) er frigivet under GPL licensen. Licensen er kun medtaget her til generel orientering. $_CLICK"
@@ -23,14 +20,11 @@
; GTK+ Directory Page
-!define GTK_UPGRADE_PROMPT "Der blev fundet en ldre version af GTK+ runtime. nsker du at opgradere?$\rNB: $(^Name) virker muligvis ikke uden denne opgradering."
; Installer Finish Page
!define PIDGIN_FINISH_VISIT_WEB_SITE "Besg Windows Pidgin's hjemmeside"
; GTK+ Section Prompts
-!define GTK_INSTALL_ERROR "Fejl under installeringen af GTK+ runtime."
-!define GTK_BAD_INSTALL_PATH "Stien du har angivet kan ikke findes eller oprettes."
; Uninstall Section Prompts
!define un.PIDGIN_UNINSTALL_ERROR_1 "Afinstallationen kunne ikke finde Pidgin i registreringsdatabasen.$\rMuligvis har en anden bruger installeret programmet."
diff -r cc6d733a192a -r c5a7516418c7 pidgin/win32/nsis/translations/dutch.nsh
--- a/pidgin/win32/nsis/translations/dutch.nsh Tue Feb 16 15:58:34 2010 +0000
+++ b/pidgin/win32/nsis/translations/dutch.nsh Thu Feb 18 16:59:04 2010 +0000
@@ -11,7 +11,6 @@
; Startup Checks
!define INSTALLER_IS_RUNNING "Er is al een installatie actief."
!define PIDGIN_IS_RUNNING "Pidgin wordt op dit moment uitgevoerd. Sluit Pidgin af en start de installatie opnieuw."
-!define GTK_INSTALLER_NEEDED "De GTK+ runtime-omgeving is niet aanwezig of moet vernieuwd worden.$\rInstalleer v${GTK_MIN_VERSION} of nieuwer van de GTK+ runtime-omgeving"
; License Page
@@ -26,14 +25,11 @@
; GTK+ Directory Page
-!define GTK_UPGRADE_PROMPT "Er is een oude versie van GTK+ gevonden. Wilt u deze bijwerken?$\rLet op: $(^Name) werkt misschien niet als u dit niet doet."
; Installer Finish Page
!define PIDGIN_FINISH_VISIT_WEB_SITE "Neem een kijkje op de Windows Pidgin webpagina"
; GTK+ Section Prompts
-!define GTK_INSTALL_ERROR "Fout bij installatie van GTK+ runtime omgeving."
-!define GTK_BAD_INSTALL_PATH "Het door u gegeven pad kan niet benaderd worden."
; Uninstall Section Prompts
!define un.PIDGIN_UNINSTALL_ERROR_1 "Het verwijderingsprogramma voor Pidgin kon geen register-ingangen voor Pidgin vinden.$\rWaarschijnlijk heeft een andere gebruiker het programma genstalleerd."
diff -r cc6d733a192a -r c5a7516418c7 pidgin/win32/nsis/translations/english.nsh
--- a/pidgin/win32/nsis/translations/english.nsh Tue Feb 16 15:58:34 2010 +0000
+++ b/pidgin/win32/nsis/translations/english.nsh Thu Feb 18 16:59:04 2010 +0000
@@ -14,7 +14,6 @@
; Startup Checks
!insertmacro PIDGIN_MACRO_DEFAULT_STRING INSTALLER_IS_RUNNING "The installer is already running."
!insertmacro PIDGIN_MACRO_DEFAULT_STRING PIDGIN_IS_RUNNING "An instance of Pidgin is currently running. Please exit Pidgin and try again."
-!insertmacro PIDGIN_MACRO_DEFAULT_STRING GTK_INSTALLER_NEEDED "The GTK+ runtime environment is either missing or needs to be upgraded.$\rPlease install v${GTK_MIN_VERSION} or higher of the GTK+ runtime"
; License Page
!insertmacro PIDGIN_MACRO_DEFAULT_STRING PIDGIN_LICENSE_BUTTON "Next >"
@@ -32,10 +31,9 @@
!insertmacro PIDGIN_MACRO_DEFAULT_STRING PIDGIN_SHORTCUTS_SECTION_DESCRIPTION "Shortcuts for starting Pidgin"
!insertmacro PIDGIN_MACRO_DEFAULT_STRING PIDGIN_DESKTOP_SHORTCUT_DESC "Create a shortcut to Pidgin on the Desktop"
!insertmacro PIDGIN_MACRO_DEFAULT_STRING PIDGIN_STARTMENU_SHORTCUT_DESC "Create a Start Menu entry for Pidgin"
+!insertmacro PIDGIN_MACRO_DEFAULT_STRING DEBUG_SYMBOLS_SECTION_TITLE "Debug Symbols (for reporting crashes)"
; GTK+ Directory Page
-!insertmacro PIDGIN_MACRO_DEFAULT_STRING GTK_UPGRADE_PROMPT "An old version of the GTK+ runtime was found. Do you wish to upgrade?$\rNote: $(^Name) may not work unless you do."
-!insertmacro PIDGIN_MACRO_DEFAULT_STRING GTK_WINDOWS_INCOMPATIBLE "Windows 95/98/Me are incompatible with GTK+ 2.8.0 or newer. GTK+ ${GTK_INSTALL_VERSION} will not be installed.$\rIf you don't have GTK+ ${GTK_MIN_VERSION} or newer already installed, installation will now abort."
; Installer Finish Page
!insertmacro PIDGIN_MACRO_DEFAULT_STRING PIDGIN_FINISH_VISIT_WEB_SITE "Visit the Pidgin Web Page"
@@ -44,8 +42,6 @@
!insertmacro PIDGIN_MACRO_DEFAULT_STRING PIDGIN_PROMPT_CONTINUE_WITHOUT_UNINSTALL "Unable to uninstall the currently installed version of Pidgin. The new version will be installed without removing the currently installed version."
; GTK+ Section Prompts
-!insertmacro PIDGIN_MACRO_DEFAULT_STRING GTK_INSTALL_ERROR "Error installing GTK+ runtime."
-!insertmacro PIDGIN_MACRO_DEFAULT_STRING GTK_BAD_INSTALL_PATH "The path you entered can not be accessed or created."
; URL Handler section
!insertmacro PIDGIN_MACRO_DEFAULT_STRING URI_HANDLERS_SECTION_TITLE "URI Handlers"
@@ -83,3 +79,6 @@
!insertmacro PIDGIN_MACRO_DEFAULT_STRING PIDGIN_SPELLCHECK_SWEDISH "Swedish"
!insertmacro PIDGIN_MACRO_DEFAULT_STRING PIDGIN_SPELLCHECK_UKRAINIAN "Ukrainian"
+!insertmacro PIDGIN_MACRO_DEFAULT_STRING PIDGIN_DEBUGSYMBOLS_ERROR "Error Installing Debug Symbols"
+
+!insertmacro PIDGIN_MACRO_DEFAULT_STRING PIDGIN_GTK_DOWNLOAD_ERROR "Error Downloading the GTK+ Runtime"
diff -r cc6d733a192a -r c5a7516418c7 pidgin/win32/nsis/translations/finnish.nsh
--- a/pidgin/win32/nsis/translations/finnish.nsh Tue Feb 16 15:58:34 2010 +0000
+++ b/pidgin/win32/nsis/translations/finnish.nsh Thu Feb 18 16:59:04 2010 +0000
@@ -13,7 +13,6 @@
; Startup checks
!define INSTALLER_IS_RUNNING "Asennusohjelma on jo kynniss."
!define PIDGIN_IS_RUNNING "Pidgin on tll hetkell kynniss. Poistu Pidginist ja yrit uudelleen."
-!define GTK_INSTALLER_NEEDED "Ajonaikainen GTK+-ymprist joko puuttuu tai tarvitsee pivityst.$\rOle hyv ja asenna v${GTK_MIN_VERSION} tai uudempi ajonaikainen GTK+-ymprist."
; License Page
!define PIDGIN_LICENSE_BUTTON "Seuraava >"
@@ -33,14 +32,11 @@
!define PIDGIN_STARTMENU_SHORTCUT_DESC "Tee Pidgin-pikakuvake kynnistysvalikkoon"
; GTK+ Directory Page
-!define GTK_UPGRADE_PROMPT "Vanha versio ajonaikaisesta GTK+-ympristst lytynyt. Tahdotko pivitt?$\rHuomio: $(^Name) ei vlttmtt toimi mikli jtt pivittmtt."
; Installer Finish Page
!define PIDGIN_FINISH_VISIT_WEB_SITE "Vieraile Pidginin WWW-sivustolla"
; GTK+ Section Prompts
-!define GTK_INSTALL_ERROR "Virhe asennettaessa ajonaikaista GTK+-ymprist."
-!define GTK_BAD_INSTALL_PATH "Antamasi polku ei toimi tai sit ei voi luoda."
; URL Handler section
!define URI_HANDLERS_SECTION_TITLE "URI-ksittelijt"
diff -r cc6d733a192a -r c5a7516418c7 pidgin/win32/nsis/translations/french.nsh
--- a/pidgin/win32/nsis/translations/french.nsh Tue Feb 16 15:58:34 2010 +0000
+++ b/pidgin/win32/nsis/translations/french.nsh Thu Feb 18 16:59:04 2010 +0000
@@ -1,4 +1,3 @@
-;; vim:syn=winbatch:fileencoding=cp1252:
;;
;; french.nsh
;;
@@ -15,7 +14,6 @@
; Startup Checks
!define INSTALLER_IS_RUNNING "Le programme d'installation est dj en cours d'excution."
!define PIDGIN_IS_RUNNING "Une instance de Pidgin est en cours d'excution. Veuillez quitter Pidgin et ressayer."
-!define GTK_INSTALLER_NEEDED "Les bibliothques de l'environnement GTK+ ne sont pas installes ou ont besoin d'une mise jour.$\rVeuillez installer la version ${GTK_MIN_VERSION} ou plus rcente des bibliothques GTK+."
; License Page
!define PIDGIN_LICENSE_BUTTON "Suivant >"
@@ -35,8 +33,6 @@
!define PIDGIN_STARTMENU_SHORTCUT_DESC "Crer un raccourci pour Pidgin dans le menu Dmarrer"
; GTK+ Directory Page
-!define GTK_UPGRADE_PROMPT "Une ancienne version des bibliothques GTK+ a t trouve. Voulez-vous la mettre jour ?$\rNote : $(^Name) peut ne pas fonctionner si vous ne le faites pas."
-!define GTK_WINDOWS_INCOMPATIBLE "Windows 95/98/Me est incompatible avec GTK+ version 2.8.0 ou plus rcentes. GTK+ ${GTK_INSTALL_VERSION} ne sera pas install.$\rSi vous n'avez pas install GTK+ version ${GTK_MIN_VERSION} ou pkus rcente, l'installation s'arrtera."
; Installer Finish Page
!define PIDGIN_FINISH_VISIT_WEB_SITE "Visitez la page web de Pidgin Windows"
@@ -45,8 +41,6 @@
!define PIDGIN_PROMPT_CONTINUE_WITHOUT_UNINSTALL "Impossible de dsinstaller la version de Pidgin en place. La nouvelle version sera installe sans supprimer la version en place."
; GTK+ Section Prompts
-!define GTK_INSTALL_ERROR "Erreur lors de l'installation des bibliothques GTK+"
-!define GTK_BAD_INSTALL_PATH "Le dossier d'installation ne peut pas tre cr ou n'est pas accessible."
; URL Handler section
!define URI_HANDLERS_SECTION_TITLE "Gestion des liens (URI)"
diff -r cc6d733a192a -r c5a7516418c7 pidgin/win32/nsis/translations/galician.nsh
--- a/pidgin/win32/nsis/translations/galician.nsh Tue Feb 16 15:58:34 2010 +0000
+++ b/pidgin/win32/nsis/translations/galician.nsh Thu Feb 18 16:59:04 2010 +0000
@@ -9,7 +9,6 @@
;;
; Startup GTK+ check
-!define GTK_INSTALLER_NEEDED "O entorno de execucin de GTK+ falta ou necesita ser actualizado.$\rPor favor, instale a versin v${GTK_MIN_VERSION} do executable GTK+ ou algunha posterior."
; License Page
!define PIDGIN_LICENSE_BUTTON "Seguinte >"
@@ -23,14 +22,11 @@
; GTK+ Directory Page
-!define GTK_UPGRADE_PROMPT "Atopouse unha versin antiga do executable de GTK+. Desexa actualizala?$\rObservacin: $(^Name) non funcionar a menos que o faga."
; Installer Finish Page
!define PIDGIN_FINISH_VISIT_WEB_SITE "Visite a pxina Web de Pidgin Windows"
; GTK+ Section Prompts
-!define GTK_INSTALL_ERROR "Erro ao instalar o executable GTK+."
-!define GTK_BAD_INSTALL_PATH "Non se puido acceder ou crear a ruta que vd. indicou."
; Uninstall Section Prompts
!define un.PIDGIN_UNINSTALL_ERROR_1 "O desinstalador non puido atopar as entradas no rexistro de Pidgin.$\r probable que outro usuario instalara a aplicacin."
diff -r cc6d733a192a -r c5a7516418c7 pidgin/win32/nsis/translations/german.nsh
--- a/pidgin/win32/nsis/translations/german.nsh Tue Feb 16 15:58:34 2010 +0000
+++ b/pidgin/win32/nsis/translations/german.nsh Thu Feb 18 16:59:04 2010 +0000
@@ -1,82 +1,77 @@
-;; vim:syn=winbatch:encoding=cp1252:
-;;
-;; german.nsh
-;;
-;; German language strings for the Windows Pidgin NSIS installer.
-;; Windows Code page: 1252
-;;
-;; Author: Bjoern Voigt , 2008.
-;; Version 3
-;;
-
-; Startup checks
-!define INSTALLER_IS_RUNNING "Der Installer luft schon."
-!define PIDGIN_IS_RUNNING "Eine Instanz von Pidgin luft momentan schon. Beenden Sie Pidgin und versuchen Sie es nochmal."
-!define GTK_INSTALLER_NEEDED "Die GTK+ Runtime Umgebung fehlt entweder oder muss aktualisiert werden.$\rBitte installieren Sie v${GTK_MIN_VERSION} oder hher der GTK+ Runtime"
-
-; License Page
-!define PIDGIN_LICENSE_BUTTON "Weiter >"
-!define PIDGIN_LICENSE_BOTTOM_TEXT "$(^Name) wird unter der GNU General Public License (GPL) verffentlicht. Die Lizenz dient hier nur der Information. $_CLICK"
-
-; Components Page
-!define PIDGIN_SECTION_TITLE "Pidgin Instant Messaging Client (erforderlich)"
-!define GTK_SECTION_TITLE "GTK+ Runtime Umgebung (erforderlich)"
-!define PIDGIN_SHORTCUTS_SECTION_TITLE "Verknpfungen"
-!define PIDGIN_DESKTOP_SHORTCUT_SECTION_TITLE "Desktop"
-!define PIDGIN_STARTMENU_SHORTCUT_SECTION_TITLE "Startmen"
-!define PIDGIN_SECTION_DESCRIPTION "Pidgin-Basisdateien und -DLLs"
-!define GTK_SECTION_DESCRIPTION "Ein Multi-Plattform-GUI-Toolkit, verwendet von Pidgin"
-
-!define PIDGIN_SHORTCUTS_SECTION_DESCRIPTION "Verknpfungen zum Starten von Pidgin"
-!define PIDGIN_DESKTOP_SHORTCUT_DESC "Erstellt eine Verknpfung zu Pidgin auf dem Desktop"
-!define PIDGIN_STARTMENU_SHORTCUT_DESC "Erstellt einen Eintrag fr Pidgin im Startmen"
-
-; GTK+ Directory Page
-!define GTK_UPGRADE_PROMPT "Eine alte Version der GTK+ Runtime wurde gefunden. Mchten Sie aktualisieren?$\rHinweis: $(^Name) funktioniert evtl. nicht, wenn Sie nicht aktualisieren."
-!define GTK_WINDOWS_INCOMPATIBLE "Windows 95/98/Me sind inkompatibel zu GTK+ 2.8.0 oder neuer. GTK+ ${GTK_INSTALL_VERSION} wird nicht installiert.$\rWenn Sie nicht GTK+ ${GTK_MIN_VERSION} oder neuer installiert haben, wird die Installation jetzt abgebrochen."
-
-; Installer Finish Page
-!define PIDGIN_FINISH_VISIT_WEB_SITE "Besuchen Sie die Pidgin Webseite"
-
-; Pidgin Section Prompts and Texts
-!define PIDGIN_PROMPT_CONTINUE_WITHOUT_UNINSTALL "Die aktuell installierte Version von Pidgin kann nicht deinstalliert werden. Die neue Version wird installiert, ohne dass die aktuell installierte Version gelscht wird."
-
-; GTK+ Section Prompts
-!define GTK_INSTALL_ERROR "Fehler beim Installieren der GTK+ Runtime."
-!define GTK_BAD_INSTALL_PATH "Der Pfad, den Sie eingegeben haben, existiert nicht und kann nicht erstellt werden."
-
-; URL Handler section
-!define URI_HANDLERS_SECTION_TITLE "URI-Behandlung"
-
-; Uninstall Section Prompts
-!define un.PIDGIN_UNINSTALL_ERROR_1 "Der Deinstaller konnte keine Registrierungsschlssel fr Pidgin finden.$\rEs ist wahrscheinlich, da ein anderer Benutzer diese Anwendung installiert hat."
-!define un.PIDGIN_UNINSTALL_ERROR_2 "Sie haben keine Berechtigung, diese Anwendung zu deinstallieren."
-
-; Spellcheck Section Prompts
-!define PIDGIN_SPELLCHECK_SECTION_TITLE "Untersttzung fr Rechtschreibkontrolle"
-!define PIDGIN_SPELLCHECK_ERROR "Fehler bei der Installation der Rechtschreibkontrolle"
-!define PIDGIN_SPELLCHECK_DICT_ERROR "Fehler bei der Installation des Wrterbuches fr die Rechtschreibkontrolle"
-!define PIDGIN_SPELLCHECK_SECTION_DESCRIPTION "Untersttzung fr Rechtschreibkontrolle. (Fr die Installation ist eine Internet-Verbindung ntig)"
-!define ASPELL_INSTALL_FAILED "Installation gescheitert"
-!define PIDGIN_SPELLCHECK_BRETON "Bretonisch"
-!define PIDGIN_SPELLCHECK_CATALAN "Katalanisch"
-!define PIDGIN_SPELLCHECK_CZECH "Tschechisch"
-!define PIDGIN_SPELLCHECK_WELSH "Walisisch"
-!define PIDGIN_SPELLCHECK_DANISH "Dnisch"
-!define PIDGIN_SPELLCHECK_GERMAN "Deutsch"
-!define PIDGIN_SPELLCHECK_GREEK "Griechisch"
-!define PIDGIN_SPELLCHECK_ENGLISH "Englisch"
-!define PIDGIN_SPELLCHECK_ESPERANTO "Esperanto"
-!define PIDGIN_SPELLCHECK_SPANISH "Spanisch"
-!define PIDGIN_SPELLCHECK_FAROESE "Farersprache"
-!define PIDGIN_SPELLCHECK_FRENCH "Franzsisch"
-!define PIDGIN_SPELLCHECK_ITALIAN "Italienisch"
-!define PIDGIN_SPELLCHECK_DUTCH "Hollndisch"
-!define PIDGIN_SPELLCHECK_NORWEGIAN "Norwegisch"
-!define PIDGIN_SPELLCHECK_POLISH "Polnisch"
-!define PIDGIN_SPELLCHECK_PORTUGUESE "Portugiesisch"
-!define PIDGIN_SPELLCHECK_ROMANIAN "Rumnisch"
-!define PIDGIN_SPELLCHECK_RUSSIAN "Russisch"
-!define PIDGIN_SPELLCHECK_SLOVAK "Slowakisch"
-!define PIDGIN_SPELLCHECK_SWEDISH "Schwedisch"
-!define PIDGIN_SPELLCHECK_UKRAINIAN "Ukrainisch"
+;; vim:syn=winbatch:encoding=cp1252:
+;;
+;; german.nsh
+;;
+;; German language strings for the Windows Pidgin NSIS installer.
+;; Windows Code page: 1252
+;;
+;; Author: Bjoern Voigt , 2008.
+;; Version 3
+;;
+
+; Startup checks
+!define INSTALLER_IS_RUNNING "Der Installer luft schon."
+!define PIDGIN_IS_RUNNING "Eine Instanz von Pidgin luft momentan schon. Beenden Sie Pidgin und versuchen Sie es nochmal."
+
+; License Page
+!define PIDGIN_LICENSE_BUTTON "Weiter >"
+!define PIDGIN_LICENSE_BOTTOM_TEXT "$(^Name) wird unter der GNU General Public License (GPL) verffentlicht. Die Lizenz dient hier nur der Information. $_CLICK"
+
+; Components Page
+!define PIDGIN_SECTION_TITLE "Pidgin Instant Messaging Client (erforderlich)"
+!define GTK_SECTION_TITLE "GTK+ Runtime Umgebung (erforderlich)"
+!define PIDGIN_SHORTCUTS_SECTION_TITLE "Verknpfungen"
+!define PIDGIN_DESKTOP_SHORTCUT_SECTION_TITLE "Desktop"
+!define PIDGIN_STARTMENU_SHORTCUT_SECTION_TITLE "Startmen"
+!define PIDGIN_SECTION_DESCRIPTION "Pidgin-Basisdateien und -DLLs"
+!define GTK_SECTION_DESCRIPTION "Ein Multi-Plattform-GUI-Toolkit, verwendet von Pidgin"
+
+!define PIDGIN_SHORTCUTS_SECTION_DESCRIPTION "Verknpfungen zum Starten von Pidgin"
+!define PIDGIN_DESKTOP_SHORTCUT_DESC "Erstellt eine Verknpfung zu Pidgin auf dem Desktop"
+!define PIDGIN_STARTMENU_SHORTCUT_DESC "Erstellt einen Eintrag fr Pidgin im Startmen"
+
+; GTK+ Directory Page
+
+; Installer Finish Page
+!define PIDGIN_FINISH_VISIT_WEB_SITE "Besuchen Sie die Pidgin Webseite"
+
+; Pidgin Section Prompts and Texts
+!define PIDGIN_PROMPT_CONTINUE_WITHOUT_UNINSTALL "Die aktuell installierte Version von Pidgin kann nicht deinstalliert werden. Die neue Version wird installiert, ohne dass die aktuell installierte Version gelscht wird."
+
+; GTK+ Section Prompts
+
+; URL Handler section
+!define URI_HANDLERS_SECTION_TITLE "URI-Behandlung"
+
+; Uninstall Section Prompts
+!define un.PIDGIN_UNINSTALL_ERROR_1 "Der Deinstaller konnte keine Registrierungsschlssel fr Pidgin finden.$\rEs ist wahrscheinlich, da ein anderer Benutzer diese Anwendung installiert hat."
+!define un.PIDGIN_UNINSTALL_ERROR_2 "Sie haben keine Berechtigung, diese Anwendung zu deinstallieren."
+
+; Spellcheck Section Prompts
+!define PIDGIN_SPELLCHECK_SECTION_TITLE "Untersttzung fr Rechtschreibkontrolle"
+!define PIDGIN_SPELLCHECK_ERROR "Fehler bei der Installation der Rechtschreibkontrolle"
+!define PIDGIN_SPELLCHECK_DICT_ERROR "Fehler bei der Installation des Wrterbuches fr die Rechtschreibkontrolle"
+!define PIDGIN_SPELLCHECK_SECTION_DESCRIPTION "Untersttzung fr Rechtschreibkontrolle. (Fr die Installation ist eine Internet-Verbindung ntig)"
+!define ASPELL_INSTALL_FAILED "Installation gescheitert"
+!define PIDGIN_SPELLCHECK_BRETON "Bretonisch"
+!define PIDGIN_SPELLCHECK_CATALAN "Katalanisch"
+!define PIDGIN_SPELLCHECK_CZECH "Tschechisch"
+!define PIDGIN_SPELLCHECK_WELSH "Walisisch"
+!define PIDGIN_SPELLCHECK_DANISH "Dnisch"
+!define PIDGIN_SPELLCHECK_GERMAN "Deutsch"
+!define PIDGIN_SPELLCHECK_GREEK "Griechisch"
+!define PIDGIN_SPELLCHECK_ENGLISH "Englisch"
+!define PIDGIN_SPELLCHECK_ESPERANTO "Esperanto"
+!define PIDGIN_SPELLCHECK_SPANISH "Spanisch"
+!define PIDGIN_SPELLCHECK_FAROESE "Farersprache"
+!define PIDGIN_SPELLCHECK_FRENCH "Franzsisch"
+!define PIDGIN_SPELLCHECK_ITALIAN "Italienisch"
+!define PIDGIN_SPELLCHECK_DUTCH "Hollndisch"
+!define PIDGIN_SPELLCHECK_NORWEGIAN "Norwegisch"
+!define PIDGIN_SPELLCHECK_POLISH "Polnisch"
+!define PIDGIN_SPELLCHECK_PORTUGUESE "Portugiesisch"
+!define PIDGIN_SPELLCHECK_ROMANIAN "Rumnisch"
+!define PIDGIN_SPELLCHECK_RUSSIAN "Russisch"
+!define PIDGIN_SPELLCHECK_SLOVAK "Slowakisch"
+!define PIDGIN_SPELLCHECK_SWEDISH "Schwedisch"
+!define PIDGIN_SPELLCHECK_UKRAINIAN "Ukrainisch"
diff -r cc6d733a192a -r c5a7516418c7 pidgin/win32/nsis/translations/hebrew.nsh
--- a/pidgin/win32/nsis/translations/hebrew.nsh Tue Feb 16 15:58:34 2010 +0000
+++ b/pidgin/win32/nsis/translations/hebrew.nsh Thu Feb 18 16:59:04 2010 +0000
@@ -1,83 +1,78 @@
-;;
-;; hebrew.nsh
-;;
-;; Hebrew language strings for the Windows Pidgin NSIS installer.
-;; Windows Code page: 1255
-;;
-;; Updated: Shalom Craimer
-;; Origional Author: Eugene Shcherbina
-;; Version 3
-;;
-
-; Startup checks
-!define INSTALLER_IS_RUNNING " ."
-!define PIDGIN_IS_RUNNING " ' . ' ."
-!define GTK_INSTALLER_NEEDED ". GTK+ $\r v${GTK_MIN_VERSION} .GTK+ "
-
-; License Page
-!define PIDGIN_LICENSE_BUTTON " >"
-!define PIDGIN_LICENSE_BOTTOM_TEXT "$(^Name) . .GPL $_CLICK"
-
-; Components Page
-!define PIDGIN_SECTION_TITLE "() .Pidgin "
-!define GTK_SECTION_TITLE "() .GTK+ "
-!define PIDGIN_SHORTCUTS_SECTION_TITLE " "
-!define PIDGIN_DESKTOP_SHORTCUT_SECTION_TITLE " "
-!define PIDGIN_STARTMENU_SHORTCUT_SECTION_TITLE " "
-!define PIDGIN_SECTION_DESCRIPTION ". DLL- Pidgin "
-!define GTK_SECTION_DESCRIPTION "-, ' GUI "
-
-!define PIDGIN_SHORTCUTS_SECTION_DESCRIPTION "- '"
-!define PIDGIN_DESKTOP_SHORTCUT_DESC " - ' "
-!define PIDGIN_STARTMENU_SHORTCUT_DESC " - ' "
-
-; GTK+ Directory Page
-!define GTK_UPGRADE_PROMPT "A?. GTK+ $\rNote: . $(^Name)"
-!define GTK_WINDOWS_INCOMPATIBLE " 95/98/ -GTK+ 2.8.0 . GTK+ ${GTK_INSTALL_VERSION} .$\r GTK+ ${GTK_MIN_VERSION} , ."
-
-; Installer Finish Page
-!define PIDGIN_FINISH_VISIT_WEB_SITE ".Pidgin "
-
-; Pidgin Section Prompts and Texts
-!define PIDGIN_PROMPT_CONTINUE_WITHOUT_UNINSTALL " '. ."
-
-; GTK+ Section Prompts
-!define GTK_INSTALL_ERROR ".GTK+ "
-!define GTK_BAD_INSTALL_PATH ". "
-
-; URL Handler section
-!define URI_HANDLERS_SECTION_TITLE " URI"
-
-; Uninstall Section Prompts
-!define un.PIDGIN_UNINSTALL_ERROR_1 ".GTK+ $\r. "
-!define un.PIDGIN_UNINSTALL_ERROR_2 ". "
-
-; Spellcheck Section Prompts
-!define PIDGIN_SPELLCHECK_SECTION_TITLE " "
-!define PIDGIN_SPELLCHECK_ERROR " "
-!define PIDGIN_SPELLCHECK_DICT_ERROR " "
-!define PIDGIN_SPELLCHECK_SECTION_DESCRIPTION " ( )"
-!define ASPELL_INSTALL_FAILED " "
-!define PIDGIN_SPELLCHECK_BRETON ""
-!define PIDGIN_SPELLCHECK_CATALAN ""
-!define PIDGIN_SPELLCHECK_CZECH "'"
-!define PIDGIN_SPELLCHECK_WELSH ""
-!define PIDGIN_SPELLCHECK_DANISH ""
-!define PIDGIN_SPELLCHECK_GERMAN ""
-!define PIDGIN_SPELLCHECK_GREEK ""
-!define PIDGIN_SPELLCHECK_ENGLISH ""
-!define PIDGIN_SPELLCHECK_ESPERANTO ""
-!define PIDGIN_SPELLCHECK_SPANISH ""
-!define PIDGIN_SPELLCHECK_FAROESE ""
-!define PIDGIN_SPELLCHECK_FRENCH ""
-!define PIDGIN_SPELLCHECK_ITALIAN ""
-!define PIDGIN_SPELLCHECK_DUTCH ""
-!define PIDGIN_SPELLCHECK_NORWEGIAN ""
-!define PIDGIN_SPELLCHECK_POLISH ""
-!define PIDGIN_SPELLCHECK_PORTUGUESE ""
-!define PIDGIN_SPELLCHECK_ROMANIAN ""
-!define PIDGIN_SPELLCHECK_RUSSIAN ""
-!define PIDGIN_SPELLCHECK_SLOVAK ""
-!define PIDGIN_SPELLCHECK_SWEDISH ""
-!define PIDGIN_SPELLCHECK_UKRAINIAN ""
-
+;;
+;; hebrew.nsh
+;;
+;; Hebrew language strings for the Windows Pidgin NSIS installer.
+;; Windows Code page: 1255
+;;
+;; Updated: Shalom Craimer
+;; Origional Author: Eugene Shcherbina
+;; Version 3
+;;
+
+; Startup checks
+!define INSTALLER_IS_RUNNING " ."
+!define PIDGIN_IS_RUNNING " ' . ' ."
+
+; License Page
+!define PIDGIN_LICENSE_BUTTON " >"
+!define PIDGIN_LICENSE_BOTTOM_TEXT "$(^Name) . .GPL $_CLICK"
+
+; Components Page
+!define PIDGIN_SECTION_TITLE "() .Pidgin "
+!define GTK_SECTION_TITLE "() .GTK+ "
+!define PIDGIN_SHORTCUTS_SECTION_TITLE " "
+!define PIDGIN_DESKTOP_SHORTCUT_SECTION_TITLE " "
+!define PIDGIN_STARTMENU_SHORTCUT_SECTION_TITLE " "
+!define PIDGIN_SECTION_DESCRIPTION ". DLL- Pidgin "
+!define GTK_SECTION_DESCRIPTION "-, ' GUI "
+
+!define PIDGIN_SHORTCUTS_SECTION_DESCRIPTION "- '"
+!define PIDGIN_DESKTOP_SHORTCUT_DESC " - ' "
+!define PIDGIN_STARTMENU_SHORTCUT_DESC " - ' "
+
+; GTK+ Directory Page
+
+; Installer Finish Page
+!define PIDGIN_FINISH_VISIT_WEB_SITE ".Pidgin "
+
+; Pidgin Section Prompts and Texts
+!define PIDGIN_PROMPT_CONTINUE_WITHOUT_UNINSTALL " '. ."
+
+; GTK+ Section Prompts
+
+; URL Handler section
+!define URI_HANDLERS_SECTION_TITLE " URI"
+
+; Uninstall Section Prompts
+!define un.PIDGIN_UNINSTALL_ERROR_1 ".GTK+ $\r. "
+!define un.PIDGIN_UNINSTALL_ERROR_2 ". "
+
+; Spellcheck Section Prompts
+!define PIDGIN_SPELLCHECK_SECTION_TITLE " "
+!define PIDGIN_SPELLCHECK_ERROR " "
+!define PIDGIN_SPELLCHECK_DICT_ERROR " "
+!define PIDGIN_SPELLCHECK_SECTION_DESCRIPTION " ( )"
+!define ASPELL_INSTALL_FAILED " "
+!define PIDGIN_SPELLCHECK_BRETON ""
+!define PIDGIN_SPELLCHECK_CATALAN ""
+!define PIDGIN_SPELLCHECK_CZECH "'"
+!define PIDGIN_SPELLCHECK_WELSH ""
+!define PIDGIN_SPELLCHECK_DANISH ""
+!define PIDGIN_SPELLCHECK_GERMAN ""
+!define PIDGIN_SPELLCHECK_GREEK ""
+!define PIDGIN_SPELLCHECK_ENGLISH ""
+!define PIDGIN_SPELLCHECK_ESPERANTO ""
+!define PIDGIN_SPELLCHECK_SPANISH ""
+!define PIDGIN_SPELLCHECK_FAROESE ""
+!define PIDGIN_SPELLCHECK_FRENCH ""
+!define PIDGIN_SPELLCHECK_ITALIAN ""
+!define PIDGIN_SPELLCHECK_DUTCH ""
+!define PIDGIN_SPELLCHECK_NORWEGIAN ""
+!define PIDGIN_SPELLCHECK_POLISH ""
+!define PIDGIN_SPELLCHECK_PORTUGUESE ""
+!define PIDGIN_SPELLCHECK_ROMANIAN ""
+!define PIDGIN_SPELLCHECK_RUSSIAN ""
+!define PIDGIN_SPELLCHECK_SLOVAK ""
+!define PIDGIN_SPELLCHECK_SWEDISH ""
+!define PIDGIN_SPELLCHECK_UKRAINIAN ""
+
diff -r cc6d733a192a -r c5a7516418c7 pidgin/win32/nsis/translations/hungarian.nsh
--- a/pidgin/win32/nsis/translations/hungarian.nsh Tue Feb 16 15:58:34 2010 +0000
+++ b/pidgin/win32/nsis/translations/hungarian.nsh Thu Feb 18 16:59:04 2010 +0000
@@ -9,7 +9,6 @@
;;
; Startup Checks
-!define GTK_INSTALLER_NEEDED "A GTK+ futtat krnyezet hinyzik vagy frisstse szksges.$\rKrem teleptse a v${GTK_MIN_VERSION} vagy magasabb verzij GTK+ futtat krnyezetet."
!define INSTALLER_IS_RUNNING "A telept mr fut."
!define PIDGIN_IS_RUNNING "Jelenleg fut a Pidgin egy pldnya. Lpjen ki a Pidginbl s azutn prblja jra."
@@ -31,8 +30,6 @@
!define PIDGIN_STARTMENU_SHORTCUT_DESC "Start Men bejegyzs ltrehozsa a Pidginhez"
; GTK+ Directory Page
-!define GTK_UPGRADE_PROMPT "Egy rgi verzij GTK+ futtatkrnyezet van teleptve. Kvnja frissteni?$\rMegjegyzs: a Pidgin nem fog mkdni, ha nem frissti."
-!define GTK_WINDOWS_INCOMPATIBLE "A Windows 95/98/Me nem kompatibillisek a GTK+ 2.8.0 vagy jabb vltozatokkal. A GTK+ ${GTK_INSTALL_VERSION} nem kerl teleptsre. $\rHa a GTK+ ${GTK_MIN_VERSION} vagy jabb mg nincs teleptve, akkor a telepts most megszakad."
; Installer Finish Page
!define PIDGIN_FINISH_VISIT_WEB_SITE "A Windows Pidgin weboldalnak felkeresse"
@@ -42,8 +39,6 @@
; GTK+ Section Prompts
-!define GTK_INSTALL_ERROR "Hiba a GTK+ futtatkrnyezet teleptse kzben."
-!define GTK_BAD_INSTALL_PATH "A megadott elrsi t nem rhet el, vagy nem hozhat ltre."
!define URI_HANDLERS_SECTION_TITLE "URI kezelk"
diff -r cc6d733a192a -r c5a7516418c7 pidgin/win32/nsis/translations/italian.nsh
--- a/pidgin/win32/nsis/translations/italian.nsh Tue Feb 16 15:58:34 2010 +0000
+++ b/pidgin/win32/nsis/translations/italian.nsh Thu Feb 18 16:59:04 2010 +0000
@@ -11,7 +11,6 @@
; Startup Checks
!define INSTALLER_IS_RUNNING "Il programma di installazione gi in esecuzione"
!define PIDGIN_IS_RUNNING " attualmente in esecuzione un'istanza di Pidgin. Esci da Pidgin e riprova."
-!define GTK_INSTALLER_NEEDED "L'ambiente di runtime GTK+ non presente o deve essere aggiornato.$\rInstallare GTK+ versione ${GTK_MIN_VERSION} o maggiore"
; License Page
!define PIDGIN_LICENSE_BUTTON "Avanti >"
@@ -31,8 +30,6 @@
!define PIDGIN_STARTMENU_SHORTCUT_DESC "Crea una voce per Pidgin nel Menu Avvio"
; GTK+ Directory Page
-!define GTK_UPGRADE_PROMPT " stata trovata una versione precedente di GTK+. Vuoi aggiornarla?$\rNota: $(^Name) potrebbe non funzionare senza l'aggiornamento."
-!define GTK_WINDOWS_INCOMPATIBLE "Windows 95/98/Me non incompatible con GTK+ 2.8.0 o successivo. GTK+ ${GTK_INSTALL_VERSION} non sar installato.$\rSe non hai GTK+ ${GTK_MIN_VERSION} o successivo gi installato sul tuo computer, questa installazione sar interrotta."
; Installer Finish Page
!define PIDGIN_FINISH_VISIT_WEB_SITE "Visita la pagina web di Pidgin"
@@ -41,8 +38,6 @@
!define PIDGIN_PROMPT_CONTINUE_WITHOUT_UNINSTALL "Impossibile rimuovere la versione di Pidgin attualmente presente sul tuo computer. La nuova versione sar installata senza rimuovere la versione precedente."
; GTK+ Section Prompts
-!define GTK_INSTALL_ERROR "Error nell'installazione del runtime GTK+."
-!define GTK_BAD_INSTALL_PATH "Il percorso scelto non pu essere raggiunto o creato."
; URL Handler section
!define URI_HANDLERS_SECTION_TITLE "Gestori degli URI"
diff -r cc6d733a192a -r c5a7516418c7 pidgin/win32/nsis/translations/japanese.nsh
--- a/pidgin/win32/nsis/translations/japanese.nsh Tue Feb 16 15:58:34 2010 +0000
+++ b/pidgin/win32/nsis/translations/japanese.nsh Thu Feb 18 16:59:04 2010 +0000
@@ -12,7 +12,6 @@
; Startup Checks
!define INSTALLER_IS_RUNNING "CXg[ɎsĂ܂"
!define PIDGIN_IS_RUNNING "Pidgin sĂ܂BPidgin IĂēxsĂ"
-!define GTK_INSTALLER_NEEDED "GTK+^C̓AbvO[hKv܂B$\rv${GTK_MIN_VERSION}͂ȏGTK+^CCXg[ĂB"
; License Page
!define PIDGIN_LICENSE_BUTTON " >"
@@ -33,14 +32,11 @@
!define PIDGIN_STARTMENU_SHORTCUT_DESC "X^[gj[ Pidgin ̍ڂ쐬"
; GTK+ Directory Page
-!define GTK_UPGRADE_PROMPT "Âo[WGTK+^C܂BAbvO[h܂?$\r: $(^Name)̓AbvO[hȂ蓮Ȃł傤B"
; Installer Finish Page
!define PIDGIN_FINISH_VISIT_WEB_SITE "Windows PidginWeby[WKĂB"
; GTK+ Section Prompts
-!define GTK_INSTALL_ERROR "GTK+^C̃CXg[ŃG[܂B"
-!define GTK_BAD_INSTALL_PATH "Ȃ̓͂pXɃANZX܂͍쐬ł܂B"
; Uninstall Section Prompts
!define un.PIDGIN_UNINSTALL_ERROR_1 "ACXg[PidgiñWXgGgł܂łB$\r炭ʂ̃[UɃCXg[ꂽł傤B"
diff -r cc6d733a192a -r c5a7516418c7 pidgin/win32/nsis/translations/korean.nsh
--- a/pidgin/win32/nsis/translations/korean.nsh Tue Feb 16 15:58:34 2010 +0000
+++ b/pidgin/win32/nsis/translations/korean.nsh Thu Feb 18 16:59:04 2010 +0000
@@ -7,8 +7,6 @@
;; Author: Kyung-uk Son
;;
-; Startup GTK+ check
-!define GTK_INSTALLER_NEEDED "GTK+ Ÿ ȯ濡 ְų ̵尡 ʿմϴ.$\rGTK+ Ÿ ȯ v${GTK_MIN_VERSION}̳ ̻ ġּ."
; Components Page
!define PIDGIN_SECTION_TITLE " (ʼ)"
@@ -17,11 +15,8 @@
!define GTK_SECTION_DESCRIPTION " ϴ Ƽ ÷ GUI Ŷ"
; GTK+ Directory Page
-!define GTK_UPGRADE_PROMPT " GTK+ Ÿ ãҽϴ. ̵ұ?$\rNote: ̵ ֽϴ."
; GTK+ Section Prompts
-!define GTK_INSTALL_ERROR "GTK+ Ÿ ġ ."
-!define GTK_BAD_INSTALL_PATH "ԷϽ ο ų ϴ."
; Uninstall Section Prompts
!define un.PIDGIN_UNINSTALL_ERROR_1 "ν緯 Ʈ Ʈ ã ϴ.$\r α ٸ ġ ϴ."
diff -r cc6d733a192a -r c5a7516418c7 pidgin/win32/nsis/translations/kurdish.nsh
--- a/pidgin/win32/nsis/translations/kurdish.nsh Tue Feb 16 15:58:34 2010 +0000
+++ b/pidgin/win32/nsis/translations/kurdish.nsh Thu Feb 18 16:59:04 2010 +0000
@@ -12,7 +12,6 @@
; Startup Checks
!define INSTALLER_IS_RUNNING "Sazker jixwe dimee."
!define PIDGIN_IS_RUNNING "Pidgin niha jixwe dimee. Ji Pidgin derkeve careke din biceribne."
-!define GTK_INSTALLER_NEEDED "Derdora runtime ya GTK+ an tune an rojanekirina w pwst e. $\rJi kerema xwe v${GTK_MIN_VERSION} an bilindtir a GTK+ saz bike."
; License Page
!define PIDGIN_LICENSE_BUTTON "P >"
@@ -32,14 +31,11 @@
!define PIDGIN_STARTMENU_SHORTCUT_DESC "Pidgin binivse menuya destpk"
; GTK+ Directory Page
-!define GTK_UPGRADE_PROMPT "Guhertoyeke kevn a GTK+ hatiye dtin. Tu dixwaz bilind bik?$\rNot: Heke tu nek, dibe ku $(^Name) naxebite."
; Installer Finish Page
!define PIDGIN_FINISH_VISIT_WEB_SITE "Were Malpera Pidgin a Windows"
; GTK+ Section Prompts
-!define GTK_INSTALL_ERROR "Di sazkirina GTK+ de ewt derket."
-!define GTK_BAD_INSTALL_PATH "rya te nivsand nay gihitin an afirandin."
; Uninstall Section Prompts
!define un.PIDGIN_UNINSTALL_ERROR_1 "Raker tketiyn registry yn Pidgin nedt. $\rQey bikarhnereke din v bername saz kir."
diff -r cc6d733a192a -r c5a7516418c7 pidgin/win32/nsis/translations/lithuanian.nsh
--- a/pidgin/win32/nsis/translations/lithuanian.nsh Tue Feb 16 15:58:34 2010 +0000
+++ b/pidgin/win32/nsis/translations/lithuanian.nsh Thu Feb 18 16:59:04 2010 +0000
@@ -9,7 +9,6 @@
; Startup Checks
!define INSTALLER_IS_RUNNING "Diegimo programa jau paleista."
!define PIDGIN_IS_RUNNING "iuo metu Pidgin yra paleistas. Udarykite i program ir pabandykite i naujo."
-!define GTK_INSTALLER_NEEDED "GTK+ vykdymo meto aplinkos nra arba ji turi bti atnaujinta.$\rdiekite v${GTK_MIN_VERSION} arba naujesn GTK+ vykdymo meto aplinkos versij"
; License Page
!define PIDGIN_LICENSE_BUTTON "Toliau >"
@@ -29,8 +28,6 @@
!define PIDGIN_STARTMENU_SHORTCUT_DESC "Sukurti pradinio meniu ra, skirt Pidgin."
; GTK+ Directory Page
-!define GTK_UPGRADE_PROMPT "Rasta sena GTK+ vykdymo meto aplinkos versija. Ar norite j atnaujinti?$\rPastaba: $(^Name) gali neveikti, jeigu to nepadarysite."
-!define GTK_WINDOWS_INCOMPATIBLE "Windows 95/98/Me yra nesuderinami su GTK+ 2.8.0 ir naujesnmis versijomis. GTK+ ${GTK_INSTALL_VERSION} nebus diegta.$\rJeigu neturite sidieg GTK+ ${GTK_MIN_VERSION} ar naujesns versijos, diegimas dabar bus nutrauktas."
; Installer Finish Page
!define PIDGIN_FINISH_VISIT_WEB_SITE "Aplankyti Pidgin tinklalap"
@@ -39,8 +36,6 @@
!define PIDGIN_PROMPT_CONTINUE_WITHOUT_UNINSTALL "Nepavyko idiegti anksiau diegtos Pidgin versijos. Nauja versija bus diegta neidiegus senosios."
; GTK+ Section Prompts
-!define GTK_INSTALL_ERROR "GTK+ vykdymo meto aplinkos diegimo klaida"
-!define GTK_BAD_INSTALL_PATH "Js vestas kelias negali bti pasiektas ar sukurtas."
; URL Handler section
!define URI_HANDLERS_SECTION_TITLE "URI dorokls"
diff -r cc6d733a192a -r c5a7516418c7 pidgin/win32/nsis/translations/norwegian.nsh
--- a/pidgin/win32/nsis/translations/norwegian.nsh Tue Feb 16 15:58:34 2010 +0000
+++ b/pidgin/win32/nsis/translations/norwegian.nsh Thu Feb 18 16:59:04 2010 +0000
@@ -11,7 +11,6 @@
; Startup Checks
!define INSTALLER_IS_RUNNING "Installeren kjrer allerede."
!define PIDGIN_IS_RUNNING "En instans av Pidgin kjrer fra fr. Avslutt Pidgin og prv igjen."
-!define GTK_INSTALLER_NEEDED "GTK+ runtime environment mangler eller trenger en oppgradering.$\rVennligst installr GTK+ v${GTK_MIN_VERSION} eller hyere"
; License Page
!define PIDGIN_LICENSE_BUTTON "Neste >"
@@ -31,14 +30,11 @@
!define PIDGIN_STARTMENU_SHORTCUT_DESC "Legg til Pidgin i Startmenyen"
; GTK+ Directory Page
-!define GTK_UPGRADE_PROMPT "En eldre versjon av GTK+ runtime ble funnet. nsker du oppgradere?$\rMerk: $(^Name) vil kanskje ikke virke hvis du ikke oppgraderer."
; Installer Finish Page
!define PIDGIN_FINISH_VISIT_WEB_SITE "Besk Pidgin for Windows' Nettside"
; GTK+ Section Prompts
-!define GTK_INSTALL_ERROR "En feil oppstod ved installering av GTK+ runtime."
-!define GTK_BAD_INSTALL_PATH "Stien du oppga kan ikke aksesseres eller lages."
; Uninstall Section Prompts
!define un.PIDGIN_UNINSTALL_ERROR_1 "Avinstalleringsprogrammet kunne ikke finne noen registeroppfring for Pidgin.$\rTrolig har en annen bruker avinstallert denne applikasjonen."
diff -r cc6d733a192a -r c5a7516418c7 pidgin/win32/nsis/translations/persian.nsh
--- a/pidgin/win32/nsis/translations/persian.nsh Tue Feb 16 15:58:34 2010 +0000
+++ b/pidgin/win32/nsis/translations/persian.nsh Thu Feb 18 16:59:04 2010 +0000
@@ -13,7 +13,6 @@
; Startup Checks
!define INSTALLER_IS_RUNNING "ȝ ."
!define PIDGIN_IS_RUNNING " . ."
-!define GTK_INSTALLER_NEEDED " GTK+ .$\r ${GTK_MIN_VERSION} GTK+ "
; License Page
!define PIDGIN_LICENSE_BUTTON " >"
@@ -33,8 +32,6 @@
!define PIDGIN_STARTMENU_SHORTCUT_DESC " "
; GTK+ Directory Page
-!define GTK_UPGRADE_PROMPT " GTK+ . Ͽ$\r: $(^Name) ."
-!define GTK_WINDOWS_INCOMPATIBLE " 95/98/Me GTK+ 2.8.0 Ґ . GTK+ ${GTK_INSTALL_VERSION} .$\r ǐ GTK+ ${GTK_MIN_VERSION} ϡ ."
; Installer Finish Page
!define PIDGIN_FINISH_VISIT_WEB_SITE " "
@@ -43,8 +40,6 @@
!define PIDGIN_PROMPT_CONTINUE_WITHOUT_UNINSTALL " . ."
; GTK+ Section Prompts
-!define GTK_INSTALL_ERROR " GTK+."
-!define GTK_BAD_INSTALL_PATH " ."
; URL Handler section
!define URI_HANDLERS_SECTION_TITLE " "
diff -r cc6d733a192a -r c5a7516418c7 pidgin/win32/nsis/translations/polish.nsh
--- a/pidgin/win32/nsis/translations/polish.nsh Tue Feb 16 15:58:34 2010 +0000
+++ b/pidgin/win32/nsis/translations/polish.nsh Thu Feb 18 16:59:04 2010 +0000
@@ -8,13 +8,6 @@
;; Note: If translating this file, replace '!insertmacro PIDGIN_MACRO_DEFAULT_STRING'
;; with '!define'.
-; Make sure to update the PIDGIN_MACRO_LANGUAGEFILE_END macro in
-; langmacros.nsh when updating this file
-
-; Startup Checks
-!define INSTALLER_IS_RUNNING "Instalator jest ju uruchomiony."
-!define PIDGIN_IS_RUNNING "Program Pidgin jest obecnie uruchomiony. Prosz zakoczy dziaanie programu Pidgin i sprbowa ponownie."
-!define GTK_INSTALLER_NEEDED "Brak biblioteki GTK+ lub wymaga zaktualizowania.$\rProsz zainstalowa wersj ${GTK_MIN_VERSION} lub wysz biblioteki GTK+"
; License Page
!define PIDGIN_LICENSE_BUTTON "Dalej >"
@@ -27,7 +20,6 @@
!define PIDGIN_DESKTOP_SHORTCUT_SECTION_TITLE "Pulpit"
!define PIDGIN_STARTMENU_SHORTCUT_SECTION_TITLE "Menu Start"
!define PIDGIN_SECTION_DESCRIPTION "Gwne pliki programu Pidgin i biblioteki DLL"
-!define GTK_SECTION_DESCRIPTION "Wieloplatformowy zestaw narzdzi do tworzenia interfejsu graficznego, uywany przez program Pidgin"
!define PIDGIN_SHORTCUTS_SECTION_DESCRIPTION "Skrty do uruchamiania programu Pidgin"
!define PIDGIN_DESKTOP_SHORTCUT_DESC "Utworzenie skrtu do programu Pidgin na pulpicie"
@@ -40,46 +32,10 @@
; Installer Finish Page
!define PIDGIN_FINISH_VISIT_WEB_SITE "Odwied stron WWW programu Pidgin"
-; Pidgin Section Prompts and Texts
-!define PIDGIN_PROMPT_CONTINUE_WITHOUT_UNINSTALL "Nie mona odinstalowa obecnie zainstalowanej wersji programu Pidgin. Nowa wersja zostanie zainstalowana bez usuwania obecnie zainstalowanej wersji."
-
; GTK+ Section Prompts
!define GTK_INSTALL_ERROR "Bd podczas instalowania biblioteki GTK+."
!define GTK_BAD_INSTALL_PATH "Nie mona uzyska dostpu do podanej cieki lub jej utworzy."
-; URL Handler section
-!define URI_HANDLERS_SECTION_TITLE "Obsuga adresw URI"
-
; Uninstall Section Prompts
!define un.PIDGIN_UNINSTALL_ERROR_1 "Instalator nie moe odnale wpisw w rejestrze dla programu Pidgin.$\rMoliwe, e inny uytkownik zainstalowa ten program."
-!define un.PIDGIN_UNINSTALL_ERROR_2 "Brak uprawnie do odinstalowania tego programu."
-
-; Spellcheck Section Prompts
-!define PIDGIN_SPELLCHECK_SECTION_TITLE "Obsuga sprawdzania pisowni"
-!define PIDGIN_SPELLCHECK_ERROR "Bd podczas instalowania sprawdzania pisowni"
-!define PIDGIN_SPELLCHECK_DICT_ERROR "Bd podczas instalowania sownika dla sprawdzania pisowni"
-!define PIDGIN_SPELLCHECK_SECTION_DESCRIPTION "Obsuga sprawdzania pisowni (do jej instalacji wymagane jest poczenie z Internetem)."
-!define ASPELL_INSTALL_FAILED "Instalacja nie powioda si"
-!define PIDGIN_SPELLCHECK_BRETON "bretoski"
-!define PIDGIN_SPELLCHECK_CATALAN "kataloski"
-!define PIDGIN_SPELLCHECK_CZECH "czeski"
-!define PIDGIN_SPELLCHECK_WELSH "walijski"
-!define PIDGIN_SPELLCHECK_DANISH "duski"
-!define PIDGIN_SPELLCHECK_GERMAN "niemiecki"
-!define PIDGIN_SPELLCHECK_GREEK "grecki"
-!define PIDGIN_SPELLCHECK_ENGLISH "angielski"
-!define PIDGIN_SPELLCHECK_ESPERANTO "esperanto"
-!define PIDGIN_SPELLCHECK_SPANISH "hiszpaski"
-!define PIDGIN_SPELLCHECK_FAROESE "farerski"
-!define PIDGIN_SPELLCHECK_FRENCH "francuski"
-!define PIDGIN_SPELLCHECK_ITALIAN "woski"
-!define PIDGIN_SPELLCHECK_DUTCH "holenderski"
-!define PIDGIN_SPELLCHECK_NORWEGIAN "norweski"
-!define PIDGIN_SPELLCHECK_POLISH "polski"
-!define PIDGIN_SPELLCHECK_PORTUGUESE "portugalski"
-!define PIDGIN_SPELLCHECK_ROMANIAN "rumuski"
-!define PIDGIN_SPELLCHECK_RUSSIAN "rosyjski"
-!define PIDGIN_SPELLCHECK_SLOVAK "sowacki"
-!define PIDGIN_SPELLCHECK_SWEDISH "szwedzki"
-!define PIDGIN_SPELLCHECK_UKRAINIAN "ukraiski"
-
+!define un.PIDGIN_UNINSTALL_ERROR_2 "Brak uprawnie do odinstalowania tego programu."
\ No newline at end of file
diff -r cc6d733a192a -r c5a7516418c7 pidgin/win32/nsis/translations/portuguese-br.nsh
--- a/pidgin/win32/nsis/translations/portuguese-br.nsh Tue Feb 16 15:58:34 2010 +0000
+++ b/pidgin/win32/nsis/translations/portuguese-br.nsh Thu Feb 18 16:59:04 2010 +0000
@@ -8,8 +8,6 @@
;; Version 3
;;
-; Startup GTK+ check
-!define GTK_INSTALLER_NEEDED "O ambiente de tempo de execuo do GTK+ est ausente ou precisa ser atualizado.$\rFavor instalar a verso v${GTK_MIN_VERSION} ou superior do ambiente de tempo de execuo do GTK+."
; License Page
!define PIDGIN_LICENSE_BUTTON "Avanar >"
@@ -29,11 +27,8 @@
!define PIDGIN_STARTMENU_SHORTCUT_DESC "Crie uma entrada no Menu Iniciar para o Pidgin"
; GTK+ Directory Page
-!define GTK_UPGRADE_PROMPT "Uma verso antiga do ambiente de tempo de execuo do GTK+ foi encontrada. Voc deseja atualiz-lo?$\rNota: O $(^Name) poder no funcionar a menos que voc o faa."
; GTK+ Section Prompts
-!define GTK_INSTALL_ERROR "Erro ao instalar o ambiente de tempo de execuo do GTK+."
-!define GTK_BAD_INSTALL_PATH "O caminho que voc digitou no pde ser acessado ou criado."
; Installer Finish Page
!define PIDGIN_FINISH_VISIT_WEB_SITE "Visite a pgina da web do Pidgin para Windows"
@@ -44,7 +39,6 @@
!define INSTALLER_IS_RUNNING "O instalador j est em execuo."
!define PIDGIN_IS_RUNNING "Uma instncia do Pidgin est em execuo. Feche o Pidgin e tente novamente."
-!define GTK_WINDOWS_INCOMPATIBLE "O Windows 95/98/Me incompatvel com o GTK+ 2.8.0 ou superior. O GTK+ ${GTK_INSTALL_VERSION} no ser instalado.$\rSe voc no possuir o GTK+ verso ${GTK_MIN_VERSION} ou superior j instalado, o instalador ir fechar agora."
!define PIDGIN_PROMPT_CONTINUE_WITHOUT_UNINSTALL "No foi possvel desinstalar a verso do Pidgin que est instalada atualmente. A nova verso ser instalada sem que a verso antiga seja removida."
!define URI_HANDLERS_SECTION_TITLE "Handlers para endereos"
!define PIDGIN_SPELLCHECK_SECTION_TITLE "Suporte a verificao ortogrfica"
diff -r cc6d733a192a -r c5a7516418c7 pidgin/win32/nsis/translations/portuguese.nsh
--- a/pidgin/win32/nsis/translations/portuguese.nsh Tue Feb 16 15:58:34 2010 +0000
+++ b/pidgin/win32/nsis/translations/portuguese.nsh Thu Feb 18 16:59:04 2010 +0000
@@ -11,7 +11,6 @@
; Startup Checks
!define INSTALLER_IS_RUNNING "O instalador j est a ser executado."
!define PIDGIN_IS_RUNNING "Uma instncia do Pidgin j est a ser executada. Saia do Pidgin e tente de novo."
-!define GTK_INSTALLER_NEEDED "O ambiente de GTK+ est ausente ou precisa de ser actualizado.$\rPor favor instale a verso v${GTK_MIN_VERSION} ou mais recente do ambiente de GTK+."
; License Page
!define PIDGIN_LICENSE_BUTTON "Seguinte >"
@@ -31,14 +30,11 @@
!define PIDGIN_STARTMENU_SHORTCUT_DESC "Criar uma entrada para o Pidgin na Barra de Iniciar"
; GTK+ Directory Page
-!define GTK_UPGRADE_PROMPT "Foi encontrada uma verso antiga do ambiente de execuo GTK+. Deseja actualiz-lo?$\rNota: O $(^Name) poder no funcionar se no o fizer."
; Installer Finish Page
!define PIDGIN_FINISH_VISIT_WEB_SITE "Visite a Pgina Web do Pidgin para Windows"
; GTK+ Section Prompts
-!define GTK_INSTALL_ERROR "Erro ao instalar o ambiente de execuo GTK+."
-!define GTK_BAD_INSTALL_PATH "O caminho que digitou no pode ser acedido nem criado."
; Uninstall Section Prompts
!define un.PIDGIN_UNINSTALL_ERROR_1 "O desinstalador no encontrou entradas de registo do Pidgin.$\r provvel que outro utilizador tenha instalado este programa."
diff -r cc6d733a192a -r c5a7516418c7 pidgin/win32/nsis/translations/romanian.nsh
--- a/pidgin/win32/nsis/translations/romanian.nsh Tue Feb 16 15:58:34 2010 +0000
+++ b/pidgin/win32/nsis/translations/romanian.nsh Thu Feb 18 16:59:04 2010 +0000
@@ -10,7 +10,6 @@
; Startup Checks
!define INSTALLER_IS_RUNNING "Instalarea este deja pornit."
!define PIDGIN_IS_RUNNING "O instan a programului Pidgin este deja pornit. nchidei-o i ncercai din nou."
-!define GTK_INSTALLER_NEEDED "Mediul GTK+ nu e prezent sau avei o versiune prea veche.$\rInstalai cel puin versiunea v${GTK_MIN_VERSION} a mediului GTK+"
; License Page
!define PIDGIN_LICENSE_BUTTON "nainte >"
@@ -30,14 +29,11 @@
!define PIDGIN_STARTMENU_SHORTCUT_DESC "Creeaz o intrare Pidgin n meniul Start"
; GTK+ Directory Page
-!define GTK_UPGRADE_PROMPT "Avei o versiune veche a mediului GTK+. Dorii s o actualizai?$\rNot: E posibil ca $(^Name) s nu funcioneze cu versiunea veche."
; Installer Finish Page
!define PIDGIN_FINISH_VISIT_WEB_SITE "Vizitai pagina de web Windows Pidgin"
; GTK+ Section Prompts
-!define GTK_INSTALL_ERROR "Eroare la instalarea mediului GTK+."
-!define GTK_BAD_INSTALL_PATH "Directorul specificat nu poate fi accesat sau creat."
; Uninstall Section Prompts
!define un.PIDGIN_UNINSTALL_ERROR_1 "Programul de dezinstalare nu a gsit intrri Pidgin n regitri.$\rProbabil un alt utilizator a instalat aceast aplicaie."
diff -r cc6d733a192a -r c5a7516418c7 pidgin/win32/nsis/translations/russian.nsh
--- a/pidgin/win32/nsis/translations/russian.nsh Tue Feb 16 15:58:34 2010 +0000
+++ b/pidgin/win32/nsis/translations/russian.nsh Thu Feb 18 16:59:04 2010 +0000
@@ -8,9 +8,6 @@
;; Version 2
;;
-; Startup GTK+ check
-!define GTK_INSTALLER_NEEDED " GTK+ .$\r v${GTK_MIN_VERSION} GTK+."
-
; License Page
!define PIDGIN_LICENSE_BUTTON " >"
!define PIDGIN_LICENSE_BOTTOM_TEXT "$(^Name) GPL. . $_CLICK"
@@ -22,14 +19,11 @@
!define GTK_SECTION_DESCRIPTION " , Pidgin."
; GTK+ Directory Page
-!define GTK_UPGRADE_PROMPT " GTK+. ?$\r: Pidgin ."
; Installer Finish Page
!define PIDGIN_FINISH_VISIT_WEB_SITE " - Pidgin Windows."
; GTK+ Section Prompts
-!define GTK_INSTALL_ERROR " GTK+."
-!define GTK_BAD_INSTALL_PATH " ."
; Uninstall Section Prompts
!define un.PIDGIN_UNINSTALL_ERROR_1 " Pidgin ..$\r ."
diff -r cc6d733a192a -r c5a7516418c7 pidgin/win32/nsis/translations/serbian-latin.nsh
--- a/pidgin/win32/nsis/translations/serbian-latin.nsh Tue Feb 16 15:58:34 2010 +0000
+++ b/pidgin/win32/nsis/translations/serbian-latin.nsh Thu Feb 18 16:59:04 2010 +0000
@@ -7,8 +7,6 @@
;; Author: Danilo Segan
;;
-; Startup GTK+ check
-!define GTK_INSTALLER_NEEDED "GTK+ okolina za izvravanje ili nije naena ili se moraunaprediti.$\rMolimo instalirajte v${GTK_MIN_VERSION} ili veu GTK+ okoline za izvravanje"
; Components Page
!define PIDGIN_SECTION_TITLE "Pidgin klijent za brze poruke (neophodno)"
@@ -17,11 +15,8 @@
!define GTK_SECTION_DESCRIPTION "Skup orua za grafiko okruenje, za vie platformi, koristi ga Pidgin "
; GTK+ Directory Page
-!define GTK_UPGRADE_PROMPT "Naena je stara verzija GTK+ izvrne okoline. Da li elite da je unapredite?$\rPrimedba: Ukoliko to ne uradite, $(^Name) moda nee raditi."
; GTK+ Section Prompts
-!define GTK_INSTALL_ERROR "Greka prilikom instalacije GTK+ okoline za izvravanje."
-!define GTK_BAD_INSTALL_PATH "Putanja koju ste naveli se ne moe ni napraviti niti joj se moe prii."
; Uninstall Section Prompts
!define un.PIDGIN_UNINSTALL_ERROR_1 "Program za uklanjanje instalacije ne moe da pronae stavke registra za Pidgin.$\rVerovatno je ovu aplikaciju instalirao drugi korisnik."
diff -r cc6d733a192a -r c5a7516418c7 pidgin/win32/nsis/translations/simp-chinese.nsh
--- a/pidgin/win32/nsis/translations/simp-chinese.nsh Tue Feb 16 15:58:34 2010 +0000
+++ b/pidgin/win32/nsis/translations/simp-chinese.nsh Thu Feb 18 16:59:04 2010 +0000
@@ -11,7 +11,6 @@
; Startup GTK+ check
!define INSTALLER_IS_RUNNING "װѾС"
!define PIDGIN_IS_RUNNING "Pidgin ʵС˳ Pidgin ȻһΡ"
-!define GTK_INSTALLER_NEEDED "ȱ GTK+ ʱ̻Ҫ¸û$\r밲װ v${GTK_MIN_VERSION} ߰汾 GTK+ ʱ̻"
; License Page
!define PIDGIN_LICENSE_BUTTON "һ >"
@@ -31,14 +30,11 @@
!define PIDGIN_STARTMENU_SHORTCUT_DESC "ڿʼ˵д Pidgin Ŀݷʽ"
; GTK+ Directory Page
-!define GTK_UPGRADE_PROMPT "˾ɰ汾 GTK+ ʱ̡Ҫ?$\rע: $(^Name) "
; Finish Page
!define PIDGIN_FINISH_VISIT_WEB_SITE " Windows Pidgin ҳ"
; GTK+ Section Prompts
-!define GTK_INSTALL_ERROR "װ GTK+ ʱʧܡ"
-!define GTK_BAD_INSTALL_PATH "ʻ·"
; Uninstall Section Prompts
!define un.PIDGIN_UNINSTALL_ERROR_1 "жسҲ Pidgin עĿ$\rûװ˴˳"
diff -r cc6d733a192a -r c5a7516418c7 pidgin/win32/nsis/translations/slovak.nsh
--- a/pidgin/win32/nsis/translations/slovak.nsh Tue Feb 16 15:58:34 2010 +0000
+++ b/pidgin/win32/nsis/translations/slovak.nsh Thu Feb 18 16:59:04 2010 +0000
@@ -11,7 +11,6 @@
; Startup Checks
!define INSTALLER_IS_RUNNING "Intalcia je u spusten"
!define PIDGIN_IS_RUNNING "Pidgin je prve spusten. Vypnite ho a skste znova."
-!define GTK_INSTALLER_NEEDED "GTK+ runtime prostredie chba alebo mus by upgradovan.$\rNaintalujte, prosm, GTK+ runtime verziu v${GTK_MIN_VERSION}, alebo noviu"
; License Page
!define PIDGIN_LICENSE_BUTTON "alej >"
@@ -31,14 +30,11 @@
!define PIDGIN_STARTMENU_SHORTCUT_DESC "Vytvori odkaz na Pidgin v tart Menu"
; GTK+ Directory Page
-!define GTK_UPGRADE_PROMPT "Bola njden staria verzia GTK+ runtime. Prajete si upgradova sasn verziu?$\rPoznmka: $(^Name) nemus po upgradovan fungova sprvne."
; Installer Finish Page
!define PIDGIN_FINISH_VISIT_WEB_SITE "Navtvi webstrnku Windows Pidgin"
; GTK+ Section Prompts
-!define GTK_INSTALL_ERROR "Chyba pri intalcii GTK+ runtime."
-!define GTK_BAD_INSTALL_PATH "Zadan cesta nie je prstupn alebo ju nie je mon vytvori."
; Uninstall Section Prompts
!define un.PIDGIN_UNINSTALL_ERROR_1 "Intaltoru sa nepodarilo njs poloky v registri pre Pidgin.$\rJe mon, e tto aplikciu naintaloval in pouvate."
diff -r cc6d733a192a -r c5a7516418c7 pidgin/win32/nsis/translations/slovenian.nsh
--- a/pidgin/win32/nsis/translations/slovenian.nsh Tue Feb 16 15:58:34 2010 +0000
+++ b/pidgin/win32/nsis/translations/slovenian.nsh Thu Feb 18 16:59:04 2010 +0000
@@ -11,7 +11,6 @@
; Startup GTK+ check
!define INSTALLER_IS_RUNNING "Nameanje e poteka."
!define PIDGIN_IS_RUNNING "Trenutno e tee ena razliica Pidgina. Prosimo, zaprite aplikacijo in poskusite znova."
-!define GTK_INSTALLER_NEEDED "Izvajalno okolje GTK+ manjka ali pa ga je potrebno nadgraditi.$\rProsimo, namestite v${GTK_MIN_VERSION} ali novejo razliico izvajalnega okolja GTK+"
; License Page
!define PIDGIN_LICENSE_BUTTON "Naprej >"
@@ -31,8 +30,6 @@
!define PIDGIN_STARTMENU_SHORTCUT_DESC "Ustvari izbiro Pidgin v meniju Start"
; GTK+ Directory Page
-!define GTK_UPGRADE_PROMPT "Nameeno imate starejo razliico izvajalnega okolja GTK+. Jo elite nadgraditi?$\rOpomba: e je ne boste nadgradili, $(^Name) morda ne bo deloval."
-!define GTK_WINDOWS_INCOMPATIBLE "Okolja Windows 95/98/Me z GTK+ 2.8.0 ali novejimi niso zdruljiva. GTK+ ${GTK_INSTALL_VERSION} will not be installed.$\rIf you don't have GTK+ ${GTK_MIN_VERSION} ali noveji je e nameen, zato se bo namestitev zdaj prekinila."
; Installer Finish Page
!define PIDGIN_FINISH_VISIT_WEB_SITE "Obiite spletno stran Windows Pidgin"
@@ -41,8 +38,6 @@
!define PIDGIN_PROMPT_CONTINUE_WITHOUT_UNINSTALL "Trenutno nameene razliice Pidgina ni mogoe odstraniti. Nova razliica bo nameena brez odstranitve trenutno nameene razliice."
; GTK+ Section Prompts
-!define GTK_INSTALL_ERROR "Napaka pri namestitvi izvajalnega okolja GTK+."
-!define GTK_BAD_INSTALL_PATH "Pot, ki ste jo vnesli, ni dosegljiva ali je ni mogoe ustvariti."
; URL Handler section
!define URI_HANDLERS_SECTION_TITLE "URI Handlers"
diff -r cc6d733a192a -r c5a7516418c7 pidgin/win32/nsis/translations/spanish.nsh
--- a/pidgin/win32/nsis/translations/spanish.nsh Tue Feb 16 15:58:34 2010 +0000
+++ b/pidgin/win32/nsis/translations/spanish.nsh Thu Feb 18 16:59:04 2010 +0000
@@ -8,9 +8,6 @@
;; Version 2
;;
-; Startup GTK+ check
-!define GTK_INSTALLER_NEEDED "El entorno de ejecucin de GTK+ falta o necesita ser actualizado.$\rPor favor, instale la versin v${GTK_MIN_VERSION} del ejecutable GTK+ o alguna posterior."
-
; License Page
!define PIDGIN_LICENSE_BUTTON "Siguiente >"
!define PIDGIN_LICENSE_BOTTOM_TEXT "$(^Name) se distribuye bajo la licencia GPL. Esta licencia se incluye aqu slo con propsito informativo: $_CLICK"
@@ -22,14 +19,11 @@
!define GTK_SECTION_DESCRIPTION "Una suite de herramientas GUI multiplataforma, utilizada por Pidgin"
; GTK+ Directory Page
-!define GTK_UPGRADE_PROMPT "Se ha encontrado una versin antiga del ejecutable de GTK+. Desea actualizarla?$\rObservacin: $(^Name) no funcionar a menos que lo haga."
; Installer Finish Page
!define PIDGIN_FINISH_VISIT_WEB_SITE "Visite la pgina Web de Pidgin Windows"
; GTK+ Section Prompts
-!define GTK_INSTALL_ERROR "Error al instalar el ejecutable GTK+."
-!define GTK_BAD_INSTALL_PATH "No se pudo acceder o crear la ruta que vd. indic."
; Uninstall Section Prompts
!define un.PIDGIN_UNINSTALL_ERROR_1 "El desinstalador no pudo encontrar las entradas en el registro de Pidgin.$\rEs probable que otro usuario instalara la aplicacin."
diff -r cc6d733a192a -r c5a7516418c7 pidgin/win32/nsis/translations/swedish.nsh
--- a/pidgin/win32/nsis/translations/swedish.nsh Tue Feb 16 15:58:34 2010 +0000
+++ b/pidgin/win32/nsis/translations/swedish.nsh Thu Feb 18 16:59:04 2010 +0000
@@ -1,80 +1,76 @@
-;;
-;; swedish.nsh
-;;
-;; Swedish language strings for the Windows Pidgin NSIS installer.
-;; Windows Code page: 1252
-;;
-;; Author: Tore Lundqvist , 2003.
-;; Author: Peter Hjalmarsson , 2005.
-;; Version 3
-
-; Startup Checks
-!define INSTALLER_IS_RUNNING "Installationsprogrammet krs redan."
-!define PIDGIN_IS_RUNNING "En instans av Pidgin krs redan. Avsluta Pidgin och frsk igen."
-!define GTK_INSTALLER_NEEDED "Krmiljn GTK+ r antingen inte installerat eller behver uppgraderas.$\rVar god installera v${GTK_MIN_VERSION} eller hgre av GTK+-krmiljn."
-
-; License Page
-!define PIDGIN_LICENSE_BUTTON "Nsta >"
-!define PIDGIN_LICENSE_BOTTOM_TEXT "$(^Name) r utgivet under GPL. Licensen finns tillgnglig hr fr informationssyften enbart. $_CLICK"
-
-; Components Page
-!define PIDGIN_SECTION_TITLE "Pidgin Snabbmeddelandeklient (obligatorisk)"
-!define GTK_SECTION_TITLE "GTK+-krmilj (obligatorisk)"
-!define PIDGIN_SHORTCUTS_SECTION_TITLE "Genvgar"
-!define PIDGIN_DESKTOP_SHORTCUT_SECTION_TITLE "Skrivbord"
-!define PIDGIN_STARTMENU_SHORTCUT_SECTION_TITLE "Startmeny"
-!define PIDGIN_SECTION_DESCRIPTION "Pidgins krnfiler och DLL:er"
-!define GTK_SECTION_DESCRIPTION "En GUI-verktygsuppsttning fr flera olika plattformar som Pidgin anvnder."
-
-!define PIDGIN_SHORTCUTS_SECTION_DESCRIPTION "Genvgar fr att starta Pidgin"
-!define PIDGIN_DESKTOP_SHORTCUT_DESC "Skapar en genvg till Pidgin p skrivbordet"
-!define PIDGIN_STARTMENU_SHORTCUT_DESC "Skapar ett tillgg i startmenyn fr Pidgin"
-
-; GTK+ Directory Page
-!define GTK_UPGRADE_PROMPT "En ldre version av GTK+ runtime hittades, vill du uppgradera den?$\rOBS! $(^Name) kommer kanske inte att fungera om du inte uppgraderar."
-
-; Installer Finish Page
-!define PIDGIN_FINISH_VISIT_WEB_SITE "Besk Windows-Pidgin hemsida"
-
-; Pidgin Section Prompts and Texts
-!define PIDGIN_PROMPT_CONTINUE_WITHOUT_UNINSTALL "Kunde inte avinstallera den nuvarande versionen av Pidgin. Den nya versionen kommer att installeras utan att ta bort den fr nrvarande installerade versionen."
-
-; GTK+ Section Prompts
-!define GTK_INSTALL_ERROR "Fel vid installation av GTK+ runtime."
-!define GTK_BAD_INSTALL_PATH "Den skvg du angivit gr inte att komma t eller skapa."
-
-; URL Handler section
-!define URI_HANDLERS_SECTION_TITLE "URI Hanterare"
-
-; Uninstall Section Prompts
-!define un.PIDGIN_UNINSTALL_ERROR_1 "Avinstalleraren kunde inte hitta registervrden fr Pidgin.$\rAntagligen har en annan anvndare installerat applikationen."
-!define un.PIDGIN_UNINSTALL_ERROR_2 "Du har inte rttigheter att avinstallera den hr applikationen."
-
-; Spellcheck Section Prompts
-!define PIDGIN_SPELLCHECK_SECTION_TITLE "Std fr rttstavning"
-!define PIDGIN_SPELLCHECK_ERROR "Fel vid installation fr rttstavning"
-!define PIDGIN_SPELLCHECK_DICT_ERROR "Fel vid installation av rttstavningsordlista"
-!define PIDGIN_SPELLCHECK_SECTION_DESCRIPTION "Std fr Rttstavning. (Internetanslutning krvs fr installation)"
-!define ASPELL_INSTALL_FAILED "Installationen misslyckades"
-!define PIDGIN_SPELLCHECK_BRETON "Bretonska"
-!define PIDGIN_SPELLCHECK_CATALAN "Katalanska"
-!define PIDGIN_SPELLCHECK_CZECH "Tjeckiska"
-!define PIDGIN_SPELLCHECK_WELSH "Kymriska"
-!define PIDGIN_SPELLCHECK_DANISH "Danska"
-!define PIDGIN_SPELLCHECK_GERMAN "Tyska"
-!define PIDGIN_SPELLCHECK_GREEK "Grekiska"
-!define PIDGIN_SPELLCHECK_ENGLISH "Engelska"
-!define PIDGIN_SPELLCHECK_ESPERANTO "Esperanto"
-!define PIDGIN_SPELLCHECK_SPANISH "Spanska"
-!define PIDGIN_SPELLCHECK_FAROESE "Friska"
-!define PIDGIN_SPELLCHECK_FRENCH "Franska"
-!define PIDGIN_SPELLCHECK_ITALIAN "Italienska"
-!define PIDGIN_SPELLCHECK_DUTCH "Nederlndska"
-!define PIDGIN_SPELLCHECK_NORWEGIAN "Norska"
-!define PIDGIN_SPELLCHECK_POLISH "Polska"
-!define PIDGIN_SPELLCHECK_PORTUGUESE "Portugisiska"
-!define PIDGIN_SPELLCHECK_ROMANIAN "Rumnska"
-!define PIDGIN_SPELLCHECK_RUSSIAN "Ryska"
-!define PIDGIN_SPELLCHECK_SLOVAK "Slovakiska"
-!define PIDGIN_SPELLCHECK_SWEDISH "Svenska"
-!define PIDGIN_SPELLCHECK_UKRAINIAN "Ukrainska"
+;;
+;; swedish.nsh
+;;
+;; Swedish language strings for the Windows Pidgin NSIS installer.
+;; Windows Code page: 1252
+;;
+;; Author: Tore Lundqvist , 2003.
+;; Author: Peter Hjalmarsson , 2005.
+;; Version 3
+
+; Startup Checks
+!define INSTALLER_IS_RUNNING "Installationsprogrammet krs redan."
+!define PIDGIN_IS_RUNNING "En instans av Pidgin krs redan. Avsluta Pidgin och frsk igen."
+
+; License Page
+!define PIDGIN_LICENSE_BUTTON "Nsta >"
+!define PIDGIN_LICENSE_BOTTOM_TEXT "$(^Name) r utgivet under GPL. Licensen finns tillgnglig hr fr informationssyften enbart. $_CLICK"
+
+; Components Page
+!define PIDGIN_SECTION_TITLE "Pidgin Snabbmeddelandeklient (obligatorisk)"
+!define GTK_SECTION_TITLE "GTK+-krmilj (obligatorisk)"
+!define PIDGIN_SHORTCUTS_SECTION_TITLE "Genvgar"
+!define PIDGIN_DESKTOP_SHORTCUT_SECTION_TITLE "Skrivbord"
+!define PIDGIN_STARTMENU_SHORTCUT_SECTION_TITLE "Startmeny"
+!define PIDGIN_SECTION_DESCRIPTION "Pidgins krnfiler och DLL:er"
+!define GTK_SECTION_DESCRIPTION "En GUI-verktygsuppsttning fr flera olika plattformar som Pidgin anvnder."
+
+!define PIDGIN_SHORTCUTS_SECTION_DESCRIPTION "Genvgar fr att starta Pidgin"
+!define PIDGIN_DESKTOP_SHORTCUT_DESC "Skapar en genvg till Pidgin p skrivbordet"
+!define PIDGIN_STARTMENU_SHORTCUT_DESC "Skapar ett tillgg i startmenyn fr Pidgin"
+
+; GTK+ Directory Page
+
+; Installer Finish Page
+!define PIDGIN_FINISH_VISIT_WEB_SITE "Besk Windows-Pidgin hemsida"
+
+; Pidgin Section Prompts and Texts
+!define PIDGIN_PROMPT_CONTINUE_WITHOUT_UNINSTALL "Kunde inte avinstallera den nuvarande versionen av Pidgin. Den nya versionen kommer att installeras utan att ta bort den fr nrvarande installerade versionen."
+
+; GTK+ Section Prompts
+
+; URL Handler section
+!define URI_HANDLERS_SECTION_TITLE "URI Hanterare"
+
+; Uninstall Section Prompts
+!define un.PIDGIN_UNINSTALL_ERROR_1 "Avinstalleraren kunde inte hitta registervrden fr Pidgin.$\rAntagligen har en annan anvndare installerat applikationen."
+!define un.PIDGIN_UNINSTALL_ERROR_2 "Du har inte rttigheter att avinstallera den hr applikationen."
+
+; Spellcheck Section Prompts
+!define PIDGIN_SPELLCHECK_SECTION_TITLE "Std fr rttstavning"
+!define PIDGIN_SPELLCHECK_ERROR "Fel vid installation fr rttstavning"
+!define PIDGIN_SPELLCHECK_DICT_ERROR "Fel vid installation av rttstavningsordlista"
+!define PIDGIN_SPELLCHECK_SECTION_DESCRIPTION "Std fr Rttstavning. (Internetanslutning krvs fr installation)"
+!define ASPELL_INSTALL_FAILED "Installationen misslyckades"
+!define PIDGIN_SPELLCHECK_BRETON "Bretonska"
+!define PIDGIN_SPELLCHECK_CATALAN "Katalanska"
+!define PIDGIN_SPELLCHECK_CZECH "Tjeckiska"
+!define PIDGIN_SPELLCHECK_WELSH "Kymriska"
+!define PIDGIN_SPELLCHECK_DANISH "Danska"
+!define PIDGIN_SPELLCHECK_GERMAN "Tyska"
+!define PIDGIN_SPELLCHECK_GREEK "Grekiska"
+!define PIDGIN_SPELLCHECK_ENGLISH "Engelska"
+!define PIDGIN_SPELLCHECK_ESPERANTO "Esperanto"
+!define PIDGIN_SPELLCHECK_SPANISH "Spanska"
+!define PIDGIN_SPELLCHECK_FAROESE "Friska"
+!define PIDGIN_SPELLCHECK_FRENCH "Franska"
+!define PIDGIN_SPELLCHECK_ITALIAN "Italienska"
+!define PIDGIN_SPELLCHECK_DUTCH "Nederlndska"
+!define PIDGIN_SPELLCHECK_NORWEGIAN "Norska"
+!define PIDGIN_SPELLCHECK_POLISH "Polska"
+!define PIDGIN_SPELLCHECK_PORTUGUESE "Portugisiska"
+!define PIDGIN_SPELLCHECK_ROMANIAN "Rumnska"
+!define PIDGIN_SPELLCHECK_RUSSIAN "Ryska"
+!define PIDGIN_SPELLCHECK_SLOVAK "Slovakiska"
+!define PIDGIN_SPELLCHECK_SWEDISH "Svenska"
+!define PIDGIN_SPELLCHECK_UKRAINIAN "Ukrainska"
diff -r cc6d733a192a -r c5a7516418c7 pidgin/win32/nsis/translations/trad-chinese.nsh
--- a/pidgin/win32/nsis/translations/trad-chinese.nsh Tue Feb 16 15:58:34 2010 +0000
+++ b/pidgin/win32/nsis/translations/trad-chinese.nsh Thu Feb 18 16:59:04 2010 +0000
@@ -13,7 +13,6 @@
; Startup Checks
!define INSTALLER_IS_RUNNING "w˵{b椤C"
!define PIDGIN_IS_RUNNING "Pidgin b椤AХoӵ{AwˡC"
-!define GTK_INSTALLER_NEEDED "䤣ŦX GTK+ ҩάOݭnQsC$\rЦw v${GTK_MIN_VERSION} ΥHW GTK+ ҡC"
; License Page
!define PIDGIN_LICENSE_BUTTON "U@B >"
@@ -33,8 +32,6 @@
!define PIDGIN_STARTMENU_SHORTCUT_DESC "b}l\إ߱|"
; GTK+ Directory Page
-!define GTK_UPGRADE_PROMPT "o{@ª GTK+ ҡCznNɯŶܡH$\rЪ`NGpGzɯšA $(^Name) iLkTQC"
-!define GTK_WINDOWS_INCOMPATIBLE "۪ 2.8.0 }lAGTK P Windows 95/98/Me wAۮeAGTK+ ${GTK_INSTALL_VERSION} ]N|QwˡC$\rpGtΤwgw˪ GTK+ ${GTK_MIN_VERSION} ΧsAw˵{NHYC"
; Installer Finish Page
!define PIDGIN_FINISH_VISIT_WEB_SITE "X Windows Pidgin "
@@ -43,8 +40,6 @@
!define PIDGIN_PROMPT_CONTINUE_WITHOUT_UNINSTALL "Lkثeww˪ PidginAsNbgªpUiwˡC"
; GTK+ Section Prompts
-!define GTK_INSTALL_ERROR "w GTK+ ҮɵoͿ~C"
-!define GTK_BAD_INSTALL_PATH "zҿJw˥ؿLksΫإߡC"
; URL Handler section
!define URI_HANDLERS_SECTION_TITLE "URI Bz{"
diff -r cc6d733a192a -r c5a7516418c7 pidgin/win32/nsis/translations/valencian.nsh
--- a/pidgin/win32/nsis/translations/valencian.nsh Tue Feb 16 15:58:34 2010 +0000
+++ b/pidgin/win32/nsis/translations/valencian.nsh Thu Feb 18 16:59:04 2010 +0000
@@ -14,7 +14,6 @@
; Startup Checks
!define INSTALLER_IS_RUNNING "L'instalador encara est eixecutant-se."
!define PIDGIN_IS_RUNNING "Una instancia de Pidgin est eixecutant-se. Ix del Pidgin i torna a intentar-ho."
-!define GTK_INSTALLER_NEEDED "L'entorn d'eixecucio GTK+ no es troba o necessita ser actualisat.$\rPer favor instala la versio${GTK_MIN_VERSION} o superior de l'entorn GTK+"
; License Page
!define PIDGIN_LICENSE_BUTTON "Segent >"
@@ -34,14 +33,11 @@
!define PIDGIN_STARTMENU_SHORTCUT_DESC "Crear una entrada per a Pidgin en Menu Inici"
; GTK+ Directory Page
-!define GTK_UPGRADE_PROMPT "Una versio antiua de l'entorn GTK+ fon trobada. Vols actualisar-la?$\rNota: $(^Name) no funcionar si no ho fas."
; Installer Finish Page
!define PIDGIN_FINISH_VISIT_WEB_SITE "Visita la pagina de Pidgin per a Windows"
; GTK+ Section Prompts
-!define GTK_INSTALL_ERROR "Erro instalant l'entorn GTK+."
-!define GTK_BAD_INSTALL_PATH "La ruta introduida no pot ser accedida o creada."
; Uninstall Section Prompts
!define un.PIDGIN_UNINSTALL_ERROR_1 "El desinstalador podria no trobar les entrades del registre de Pidgin.$\rProbablement un atre usuari instal esta aplicacio."
diff -r cc6d733a192a -r c5a7516418c7 pidgin/win32/nsis/translations/vietnamese.nsh
--- a/pidgin/win32/nsis/translations/vietnamese.nsh Tue Feb 16 15:58:34 2010 +0000
+++ b/pidgin/win32/nsis/translations/vietnamese.nsh Thu Feb 18 16:59:04 2010 +0000
@@ -9,9 +9,6 @@
;; it does, these translations can not be used.
;;
-; Startup GTK+ check
-!define GTK_INSTALLER_NEEDED "The GTK+ runtime environment không có hoặc cần được nâng cấp.$\rHãy cài đặt GTK+ runtime v${GTK_MIN_VERSION} hoặc mới hơn"
-
; License Page
!define PIDGIN_LICENSE_BUTTON "Tiếp theo >"
!define PIDGIN_LICENSE_BOTTOM_TEXT "$(^Name) được phát hành theo giấy phép GPL. Giấy phép thấy ở đây chỉ là để cung cấp thông tin mà thôi. $_CLICK"
@@ -23,14 +20,11 @@
!define GTK_SECTION_DESCRIPTION "Bộ công cụ giao diện đồ họa đa nền để dùng cho Pidgin"
; GTK+ Directory Page
-!define GTK_UPGRADE_PROMPT "Phát hiện thấy có phiên bản cũ của GTK+ runtime. Bạn muốn nâng cấp không?$\rNote: $(^Name) có thể không chạy nếu không nâng cấp."
; Installer Finish Page
!define PIDGIN_FINISH_VISIT_WEB_SITE "Hãy xem trang chủ Windows Pidgin"
; GTK+ Section Prompts
-!define GTK_INSTALL_ERROR "Lỗi cài đặt GTK+ runtime."
-!define GTK_BAD_INSTALL_PATH "Đường dẫn mà bạn nhập có thể không truy cập được hay không tạo được."
; Uninstall Section Prompts
!define un.PIDGIN_UNINSTALL_ERROR_1 "Trình gỡ cài đặt không tìm được các registry entry cho Pidgin.$\rCó thể là chương trình được người dùng khác cài đặt."
diff -r cc6d733a192a -r c5a7516418c7 pidgin/win32/untar.c
--- a/pidgin/win32/untar.c Tue Feb 16 15:58:34 2010 +0000
+++ b/pidgin/win32/untar.c Thu Feb 18 16:59:04 2010 +0000
@@ -80,14 +80,7 @@
#include "untar.h"
#include
-#if GLIB_CHECK_VERSION(2,6,0)
-# include
-#else
-#define mkdir(a,b) _mkdir((a))
-#define g_mkdir mkdir
-#define g_fopen fopen
-#define g_unlink unlink
-#endif
+#include
#define untar_error( error, args... ) purple_debug(PURPLE_DEBUG_ERROR, "untar", error, ## args )
#define untar_warning( warning, args... ) purple_debug(PURPLE_DEBUG_WARNING, "untar", warning, ## args )
diff -r cc6d733a192a -r c5a7516418c7 pidgin/win32/winpidgin.c
--- a/pidgin/win32/winpidgin.c Tue Feb 16 15:58:34 2010 +0000
+++ b/pidgin/win32/winpidgin.c Thu Feb 18 16:59:04 2010 +0000
@@ -26,33 +26,23 @@
*/
/* This is for ATTACH_PARENT_PROCESS */
+#define UNICODE
+#define _UNICODE
#ifndef _WIN32_WINNT
#define _WIN32_WINNT 0x501
#endif
#include
+#include
#include
#include
#include
#include
-
-/* These will hopefully be in the win32api next time it is updated - at which point, we'll remove them */
-#ifndef LANG_PERSIAN
-#define LANG_PERSIAN 0x29
-#endif
-#ifndef LANG_BOSNIAN
-#define SUBLANG_BOSNIAN_BOSNIA_HERZEGOVINA_LATIN 0x05
-#define SUBLANG_BOSNIAN_BOSNIA_HERZEGOVINA_CYRILLIC 0x08
-#endif
-#ifndef SUBLANG_CROATIAN_BOSNIA_HERZEGOVINA_LATIN
-#define SUBLANG_CROATIAN_BOSNIA_HERZEGOVINA_LATIN 0x04
-#endif
-#ifndef LANG_XHOSA
-#define LANG_XHOSA 0x34
-#endif
-
+#include
+#include
+#include "config.h"
typedef int (CALLBACK* LPFNPIDGINMAIN)(HINSTANCE, int, char**);
-typedef void (CALLBACK* LPFNSETDLLDIRECTORY)(LPCTSTR);
+typedef void (CALLBACK* LPFNSETDLLDIRECTORY)(LPCWSTR);
typedef BOOL (CALLBACK* LPFNATTACHCONSOLE)(DWORD);
static BOOL portable_mode = FALSE;
@@ -63,19 +53,19 @@
static LPFNPIDGINMAIN pidgin_main = NULL;
static LPFNSETDLLDIRECTORY MySetDllDirectory = NULL;
-static const char *get_win32_error_message(DWORD err) {
- static char err_msg[512];
+static const TCHAR *get_win32_error_message(DWORD err) {
+ static TCHAR err_msg[512];
FormatMessage(
FORMAT_MESSAGE_FROM_SYSTEM,
NULL, err,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
- (LPTSTR) &err_msg, sizeof(err_msg), NULL);
+ (LPTSTR) &err_msg, sizeof(err_msg) / sizeof(TCHAR), NULL);
return err_msg;
}
-static BOOL read_reg_string(HKEY key, char* sub_key, char* val_name, LPBYTE data, LPDWORD data_len) {
+static BOOL read_reg_string(HKEY key, TCHAR *sub_key, TCHAR *val_name, LPBYTE data, LPDWORD data_len) {
HKEY hkey;
BOOL ret = FALSE;
LONG retv;
@@ -86,11 +76,11 @@
NULL, NULL, data, data_len)))
ret = TRUE;
else {
- const char *err_msg = get_win32_error_message(retv);
+ const TCHAR *err_msg = get_win32_error_message(retv);
- printf("Could not read reg key '%s' subkey '%s' value: '%s'.\nMessage: (%ld) %s\n",
- (key == HKEY_LOCAL_MACHINE) ? "HKLM"
- : ((key == HKEY_CURRENT_USER) ? "HKCU" : "???"),
+ _tprintf(_T("Could not read reg key '%s' subkey '%s' value: '%s'.\nMessage: (%ld) %s\n"),
+ (key == HKEY_LOCAL_MACHINE) ? _T("HKLM")
+ : ((key == HKEY_CURRENT_USER) ? _T("HKCU") : _T("???")),
sub_key, val_name, retv, err_msg);
}
RegCloseKey(hkey);
@@ -99,23 +89,36 @@
TCHAR szBuf[80];
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, retv, 0,
- (LPTSTR) &szBuf, sizeof(szBuf), NULL);
- printf("Could not open reg subkey: %s\nError: (%ld) %s\n",
+ (LPTSTR) &szBuf, sizeof(szBuf) / sizeof(TCHAR), NULL);
+ _tprintf(_T("Could not open reg subkey: %s\nError: (%ld) %s\n"),
sub_key, retv, szBuf);
}
return ret;
}
-static void common_dll_prep(const char *path) {
+static void common_dll_prep(const TCHAR *path) {
HMODULE hmod;
HKEY hkey;
+ struct _stat stat_buf;
+ TCHAR test_path[MAX_PATH + 1];
- printf("GTK+ path found: %s\n", path);
+ _sntprintf(test_path, sizeof(test_path) / sizeof(TCHAR),
+ _T("%s\\libgtk-win32-2.0-0.dll"), path);
+ test_path[sizeof(test_path) / sizeof(TCHAR) - 1] = _T('\0');
- if ((hmod = GetModuleHandle("kernel32.dll"))) {
+ if (_tstat(test_path, &stat_buf) != 0) {
+ printf("Unable to determine GTK+ path. \n"
+ "Assuming GTK+ is in the PATH.\n");
+ return;
+ }
+
+
+ _tprintf(_T("GTK+ path found: %s\n"), path);
+
+ if ((hmod = GetModuleHandle(_T("kernel32.dll")))) {
MySetDllDirectory = (LPFNSETDLLDIRECTORY) GetProcAddress(
- hmod, "SetDllDirectoryA");
+ hmod, "SetDllDirectoryW");
if (!MySetDllDirectory)
printf("SetDllDirectory not supported\n");
} else
@@ -141,20 +144,21 @@
*/
osinfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
GetVersionEx(&osinfo);
- if ((osinfo.dwMajorVersion == 5 &&
- osinfo.dwMinorVersion == 0 &&
- strcmp(osinfo.szCSDVersion, "Service Pack 3") >= 0) ||
- (osinfo.dwMajorVersion == 5 &&
- osinfo.dwMinorVersion == 1 &&
- strcmp(osinfo.szCSDVersion, "") >= 0)
+ if ((osinfo.dwMajorVersion == 5
+ && osinfo.dwMinorVersion == 0
+ && _tcscmp(osinfo.szCSDVersion, _T("Service Pack 3")) >= 0)
+ ||
+ (osinfo.dwMajorVersion == 5
+ && osinfo.dwMinorVersion == 1
+ && _tcscmp(osinfo.szCSDVersion, _T("")) >= 0)
) {
DWORD regval = 1;
DWORD reglen = sizeof(DWORD);
printf("Using Win2k (SP3+) / WinXP (No SP)... Checking SafeDllSearch\n");
read_reg_string(HKEY_LOCAL_MACHINE,
- "System\\CurrentControlSet\\Control\\Session Manager",
- "SafeDllSearchMode",
+ _T("System\\CurrentControlSet\\Control\\Session Manager"),
+ _T("SafeDllSearchMode"),
(LPBYTE) ®val,
®len);
@@ -162,16 +166,16 @@
printf("Trying to set SafeDllSearchMode to 0\n");
regval = 0;
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE,
- "System\\CurrentControlSet\\Control\\Session Manager",
+ _T("System\\CurrentControlSet\\Control\\Session Manager"),
0, KEY_SET_VALUE, &hkey
) == ERROR_SUCCESS) {
if (RegSetValueEx(hkey,
- "SafeDllSearchMode", 0,
+ _T("SafeDllSearchMode"), 0,
REG_DWORD, (LPBYTE) ®val,
sizeof(DWORD)
) != ERROR_SUCCESS)
printf("Error writing SafeDllSearchMode. Error: %u\n",
- (UINT) GetLastError());
+ (UINT) GetLastError());
RegCloseKey(hkey);
} else
printf("Error opening Session Manager key for writing. Error: %u\n",
@@ -182,29 +186,23 @@
}
}
-static void portable_mode_dll_prep(const char *pidgin_dir) {
+static void portable_mode_dll_prep(const TCHAR *pidgin_dir) {
/* need to be able to fit MAX_PATH + "PIDGIN_ASPELL_DIR=\\Aspell\\bin" in path2 */
- char path[MAX_PATH + 1];
- char path2[MAX_PATH + 33];
- const char *prev = NULL;
+ TCHAR path[MAX_PATH + 1];
+ TCHAR path2[MAX_PATH + 33];
+ const TCHAR *prev = NULL;
/* We assume that GTK+ is installed under \\path\to\Pidgin\..\GTK
* First we find \\path\to
*/
- if (*pidgin_dir) {
+ if (*pidgin_dir)
/* pidgin_dir points to \\path\to\Pidgin */
- const char *tmp = pidgin_dir;
-
- while ((tmp = strchr(tmp, '\\'))) {
- prev = tmp;
- tmp++;
- }
- }
+ prev = _tcsrchr(pidgin_dir, _T('\\'));
if (prev) {
int cnt = (prev - pidgin_dir);
- strncpy(path, pidgin_dir, cnt);
- path[cnt] = '\0';
+ _tcsncpy(path, pidgin_dir, cnt);
+ path[cnt] = _T('\0');
} else {
printf("Unable to determine current executable path. \n"
"This will prevent the settings dir from being set.\n"
@@ -213,160 +211,141 @@
}
/* Set $HOME so that the GTK+ settings get stored in the right place */
- _snprintf(path2, sizeof(path2), "HOME=%s", path);
- _putenv(path2);
+ _sntprintf(path2, sizeof(path2) / sizeof(TCHAR), _T("HOME=%s"), path);
+ _tputenv(path2);
/* Set up the settings dir base to be \\path\to
* The actual settings dir will be \\path\to\.purple */
- _snprintf(path2, sizeof(path2), "PURPLEHOME=%s", path);
- printf("Setting settings dir: %s\n", path2);
- _putenv(path2);
+ _sntprintf(path2, sizeof(path2) / sizeof(TCHAR), _T("PURPLEHOME=%s"), path);
+ _tprintf(_T("Setting settings dir: %s\n"), path2);
+ _tputenv(path2);
- _snprintf(path2, sizeof(path2), "PIDGIN_ASPELL_DIR=%s\\Aspell\\bin", path);
- printf("%s\n", path2);
- _putenv(path2);
+ _sntprintf(path2, sizeof(path2) / sizeof(TCHAR), _T("PIDGIN_ASPELL_DIR=%s\\Aspell\\bin"), path);
+ _tprintf(_T("%s\n"), path2);
+ _tputenv(path2);
/* set the GTK+ path to be \\path\to\GTK\bin */
- strcat(path, "\\GTK\\bin");
+ _tcscat(path, _T("\\GTK\\bin"));
common_dll_prep(path);
}
-static void dll_prep() {
- char path[MAX_PATH + 1];
- HKEY hkey;
- char gtkpath[MAX_PATH + 1];
- DWORD plen;
+static void dll_prep(const TCHAR *pidgin_dir) {
+ TCHAR gtk_path[MAX_PATH + 1];
+ gtk_path[0] = _T('\0');
- plen = sizeof(gtkpath);
- hkey = HKEY_CURRENT_USER;
- if (!read_reg_string(hkey, "SOFTWARE\\GTK\\2.0", "Path",
- (LPBYTE) >kpath, &plen)) {
- hkey = HKEY_LOCAL_MACHINE;
- if (!read_reg_string(hkey, "SOFTWARE\\GTK\\2.0", "Path",
- (LPBYTE) >kpath, &plen)) {
- printf("GTK+ Path Registry Key not found. "
- "Assuming GTK+ is in the PATH.\n");
- return;
- }
+ if (*pidgin_dir) {
+ _sntprintf(gtk_path, sizeof(gtk_path) / sizeof(TCHAR), _T("%s\\Gtk\\bin"), pidgin_dir);
+ gtk_path[sizeof(gtk_path) / sizeof(TCHAR)] = _T('\0');
}
- /* this value is replaced during a successful RegQueryValueEx() */
- plen = sizeof(path);
- /* Determine GTK+ dll path .. */
- if (!read_reg_string(hkey, "SOFTWARE\\GTK\\2.0", "DllPath",
- (LPBYTE) &path, &plen)) {
- strcpy(path, gtkpath);
- strcat(path, "\\bin");
- }
-
- common_dll_prep(path);
+ common_dll_prep(gtk_path);
}
-static char* winpidgin_lcid_to_posix(LCID lcid) {
- char *posix = NULL;
+static TCHAR* winpidgin_lcid_to_posix(LCID lcid) {
+ TCHAR *posix = NULL;
int lang_id = PRIMARYLANGID(lcid);
int sub_id = SUBLANGID(lcid);
switch (lang_id) {
- case LANG_AFRIKAANS: posix = "af"; break;
- case LANG_ARABIC: posix = "ar"; break;
- case LANG_AZERI: posix = "az"; break;
- case LANG_BENGALI: posix = "bn"; break;
- case LANG_BULGARIAN: posix = "bg"; break;
- case LANG_CATALAN: posix = "ca"; break;
- case LANG_CZECH: posix = "cs"; break;
- case LANG_DANISH: posix = "da"; break;
- case LANG_ESTONIAN: posix = "et"; break;
- case LANG_PERSIAN: posix = "fa"; break;
- case LANG_GERMAN: posix = "de"; break;
- case LANG_GREEK: posix = "el"; break;
+ case LANG_AFRIKAANS: posix = _T("af"); break;
+ case LANG_ARABIC: posix = _T("ar"); break;
+ case LANG_AZERI: posix = _T("az"); break;
+ case LANG_BENGALI: posix = _T("bn"); break;
+ case LANG_BULGARIAN: posix = _T("bg"); break;
+ case LANG_CATALAN: posix = _T("ca"); break;
+ case LANG_CZECH: posix = _T("cs"); break;
+ case LANG_DANISH: posix = _T("da"); break;
+ case LANG_ESTONIAN: posix = _T("et"); break;
+ case LANG_PERSIAN: posix = _T("fa"); break;
+ case LANG_GERMAN: posix = _T("de"); break;
+ case LANG_GREEK: posix = _T("el"); break;
case LANG_ENGLISH:
switch (sub_id) {
case SUBLANG_ENGLISH_UK:
- posix = "en_GB"; break;
+ posix = _T("en_GB"); break;
case SUBLANG_ENGLISH_AUS:
- posix = "en_AU"; break;
+ posix = _T("en_AU"); break;
case SUBLANG_ENGLISH_CAN:
- posix = "en_CA"; break;
+ posix = _T("en_CA"); break;
default:
- posix = "en"; break;
+ posix = _T("en"); break;
}
break;
- case LANG_SPANISH: posix = "es"; break;
- case LANG_BASQUE: posix = "eu"; break;
- case LANG_FINNISH: posix = "fi"; break;
- case LANG_FRENCH: posix = "fr"; break;
- case LANG_GALICIAN: posix = "gl"; break;
- case LANG_GUJARATI: posix = "gu"; break;
- case LANG_HEBREW: posix = "he"; break;
- case LANG_HINDI: posix = "hi"; break;
- case LANG_HUNGARIAN: posix = "hu"; break;
+ case LANG_SPANISH: posix = _T("es"); break;
+ case LANG_BASQUE: posix = _T("eu"); break;
+ case LANG_FINNISH: posix = _T("fi"); break;
+ case LANG_FRENCH: posix = _T("fr"); break;
+ case LANG_GALICIAN: posix = _T("gl"); break;
+ case LANG_GUJARATI: posix = _T("gu"); break;
+ case LANG_HEBREW: posix = _T("he"); break;
+ case LANG_HINDI: posix = _T("hi"); break;
+ case LANG_HUNGARIAN: posix = _T("hu"); break;
case LANG_ICELANDIC: break;
- case LANG_INDONESIAN: posix = "id"; break;
- case LANG_ITALIAN: posix = "it"; break;
- case LANG_JAPANESE: posix = "ja"; break;
- case LANG_GEORGIAN: posix = "ka"; break;
- case LANG_KANNADA: posix = "kn"; break;
- case LANG_KOREAN: posix = "ko"; break;
- case LANG_LITHUANIAN: posix = "lt"; break;
- case LANG_MACEDONIAN: posix = "mk"; break;
- case LANG_DUTCH: posix = "nl"; break;
- case LANG_NEPALI: posix = "ne"; break;
+ case LANG_INDONESIAN: posix = _T("id"); break;
+ case LANG_ITALIAN: posix = _T("it"); break;
+ case LANG_JAPANESE: posix = _T("ja"); break;
+ case LANG_GEORGIAN: posix = _T("ka"); break;
+ case LANG_KANNADA: posix = _T("kn"); break;
+ case LANG_KOREAN: posix = _T("ko"); break;
+ case LANG_LITHUANIAN: posix = _T("lt"); break;
+ case LANG_MACEDONIAN: posix = _T("mk"); break;
+ case LANG_DUTCH: posix = _T("nl"); break;
+ case LANG_NEPALI: posix = _T("ne"); break;
case LANG_NORWEGIAN:
switch (sub_id) {
case SUBLANG_NORWEGIAN_BOKMAL:
- posix = "nb"; break;
+ posix = _T("nb"); break;
case SUBLANG_NORWEGIAN_NYNORSK:
- posix = "nn"; break;
+ posix = _T("nn"); break;
}
break;
- case LANG_PUNJABI: posix = "pa"; break;
- case LANG_POLISH: posix = "pl"; break;
- case LANG_PASHTO: posix = "ps"; break;
+ case LANG_PUNJABI: posix = _T("pa"); break;
+ case LANG_POLISH: posix = _T("pl"); break;
+ case LANG_PASHTO: posix = _T("ps"); break;
case LANG_PORTUGUESE:
switch (sub_id) {
case SUBLANG_PORTUGUESE_BRAZILIAN:
- posix = "pt_BR"; break;
+ posix = _T("pt_BR"); break;
default:
- posix = "pt"; break;
+ posix = _T("pt"); break;
}
break;
- case LANG_ROMANIAN: posix = "ro"; break;
- case LANG_RUSSIAN: posix = "ru"; break;
- case LANG_SLOVAK: posix = "sk"; break;
- case LANG_SLOVENIAN: posix = "sl"; break;
- case LANG_ALBANIAN: posix = "sq"; break;
+ case LANG_ROMANIAN: posix = _T("ro"); break;
+ case LANG_RUSSIAN: posix = _T("ru"); break;
+ case LANG_SLOVAK: posix = _T("sk"); break;
+ case LANG_SLOVENIAN: posix = _T("sl"); break;
+ case LANG_ALBANIAN: posix = _T("sq"); break;
/* LANG_CROATIAN == LANG_SERBIAN == LANG_BOSNIAN */
case LANG_SERBIAN:
switch (sub_id) {
case SUBLANG_SERBIAN_LATIN:
- posix = "sr@Latn"; break;
+ posix = _T("sr@Latn"); break;
case SUBLANG_SERBIAN_CYRILLIC:
- posix = "sr"; break;
+ posix = _T("sr"); break;
case SUBLANG_BOSNIAN_BOSNIA_HERZEGOVINA_CYRILLIC:
case SUBLANG_BOSNIAN_BOSNIA_HERZEGOVINA_LATIN:
- posix = "bs"; break;
+ posix = _T("bs"); break;
case SUBLANG_CROATIAN_BOSNIA_HERZEGOVINA_LATIN:
- posix = "hr"; break;
+ posix = _T("hr"); break;
}
break;
- case LANG_SWEDISH: posix = "sv"; break;
- case LANG_TAMIL: posix = "ta"; break;
- case LANG_TELUGU: posix = "te"; break;
- case LANG_THAI: posix = "th"; break;
- case LANG_TURKISH: posix = "tr"; break;
- case LANG_UKRAINIAN: posix = "uk"; break;
- case LANG_VIETNAMESE: posix = "vi"; break;
- case LANG_XHOSA: posix = "xh"; break;
+ case LANG_SWEDISH: posix = _T("sv"); break;
+ case LANG_TAMIL: posix = _T("ta"); break;
+ case LANG_TELUGU: posix = _T("te"); break;
+ case LANG_THAI: posix = _T("th"); break;
+ case LANG_TURKISH: posix = _T("tr"); break;
+ case LANG_UKRAINIAN: posix = _T("uk"); break;
+ case LANG_VIETNAMESE: posix = _T("vi"); break;
+ case LANG_XHOSA: posix = _T("xh"); break;
case LANG_CHINESE:
switch (sub_id) {
case SUBLANG_CHINESE_SIMPLIFIED:
- posix = "zh_CN"; break;
+ posix = _T("zh_CN"); break;
case SUBLANG_CHINESE_TRADITIONAL:
- posix = "zh_TW"; break;
+ posix = _T("zh_TW"); break;
default:
- posix = "zh"; break;
+ posix = _T("zh"); break;
}
break;
case LANG_URDU: break;
@@ -397,8 +376,8 @@
/* Deal with exceptions */
if (posix == NULL) {
switch (lcid) {
- case 0x0455: posix = "my_MM"; break; /* Myanmar (Burmese) */
- case 9999: posix = "ku"; break; /* Kurdish (from NSIS) */
+ case 0x0455: posix = _T("my_MM"); break; /* Myanmar (Burmese) */
+ case 9999: posix = _T("ku"); break; /* Kurdish (from NSIS) */
}
}
@@ -410,19 +389,19 @@
- Check NSIS Installer Language reg value
- Use default user locale
*/
-static const char *winpidgin_get_locale() {
- const char *locale = NULL;
+static const TCHAR *winpidgin_get_locale() {
+ const TCHAR *locale = NULL;
LCID lcid;
- char data[10];
- DWORD datalen = 10;
+ TCHAR data[10];
+ DWORD datalen = sizeof(data) / sizeof(TCHAR);
/* Check if user set PIDGINLANG env var */
- if ((locale = getenv("PIDGINLANG")))
+ if ((locale = _tgetenv(_T("PIDGINLANG"))))
return locale;
- if (!portable_mode && read_reg_string(HKEY_CURRENT_USER, "SOFTWARE\\pidgin",
- "Installer Language", (LPBYTE) &data, &datalen)) {
- if ((locale = winpidgin_lcid_to_posix(atoi(data))))
+ if (!portable_mode && read_reg_string(HKEY_CURRENT_USER, _T("SOFTWARE\\pidgin"),
+ _T("Installer Language"), (LPBYTE) &data, &datalen)) {
+ if ((locale = winpidgin_lcid_to_posix(_ttoi(data))))
return locale;
}
@@ -430,39 +409,39 @@
if ((locale = winpidgin_lcid_to_posix(lcid)))
return locale;
- return "en";
+ return _T("en");
}
static void winpidgin_set_locale() {
- const char *locale = NULL;
- char envstr[25];
+ const TCHAR *locale;
+ TCHAR envstr[25];
locale = winpidgin_get_locale();
- _snprintf(envstr, 25, "LANG=%s", locale);
- printf("Setting locale: %s\n", envstr);
- _putenv(envstr);
+ _sntprintf(envstr, sizeof(envstr) / sizeof(TCHAR), _T("LANG=%s"), locale);
+ _tprintf(_T("Setting locale: %s\n"), envstr);
+ _tputenv(envstr);
}
static void winpidgin_add_stuff_to_path() {
- char perl_path[MAX_PATH + 1];
- char *ppath = NULL;
- char mit_kerberos_path[MAX_PATH + 1];
- char *mpath = NULL;
+ TCHAR perl_path[MAX_PATH + 1];
+ TCHAR *ppath = NULL;
+ TCHAR mit_kerberos_path[MAX_PATH + 1];
+ TCHAR *mpath = NULL;
DWORD plen;
printf("%s", "Looking for Perl... ");
- plen = sizeof(perl_path);
- if (read_reg_string(HKEY_LOCAL_MACHINE, "SOFTWARE\\Perl", "",
+ plen = sizeof(perl_path) / sizeof(TCHAR);
+ if (read_reg_string(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\Perl"), _T(""),
(LPBYTE) &perl_path, &plen)) {
/* We *could* check for perl510.dll, but it seems unnecessary. */
- printf("found in '%s'.\n", perl_path);
+ _tprintf(_T("found in '%s'.\n"), perl_path);
- if (perl_path[strlen(perl_path) - 1] != '\\')
- strcat(perl_path, "\\");
- strcat(perl_path, "bin");
+ if (perl_path[_tcslen(perl_path) - 1] != _T('\\'))
+ _tcscat(perl_path, _T("\\"));
+ _tcscat(perl_path, _T("bin"));
ppath = perl_path;
} else
@@ -470,48 +449,47 @@
printf("%s", "Looking for MIT Kerberos... ");
- plen = sizeof(mit_kerberos_path);
- if (read_reg_string(HKEY_LOCAL_MACHINE, "SOFTWARE\\MIT\\Kerberos", "InstallDir",
+ plen = sizeof(mit_kerberos_path) / sizeof(TCHAR);
+ if (read_reg_string(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\MIT\\Kerberos"), _T("InstallDir"),
(LPBYTE) &mit_kerberos_path, &plen)) {
/* We *could* check for gssapi32.dll */
- printf("found in '%s'.\n", mit_kerberos_path);
+ _tprintf(_T("found in '%s'.\n"), mit_kerberos_path);
- if (mit_kerberos_path[strlen(mit_kerberos_path) - 1] != '\\')
- strcat(mit_kerberos_path, "\\");
- strcat(mit_kerberos_path, "bin");
+ if (mit_kerberos_path[_tcslen(mit_kerberos_path) - 1] != _T('\\'))
+ _tcscat(mit_kerberos_path, _T("\\"));
+ _tcscat(mit_kerberos_path, _T("bin"));
mpath = mit_kerberos_path;
} else
printf("%s", "not found.\n");
if (ppath != NULL || mpath != NULL) {
- const char *path = getenv("PATH");
- BOOL add_ppath = ppath != NULL && (path == NULL || !strstr(path, ppath));
- BOOL add_mpath = mpath != NULL && (path == NULL || !strstr(path, mpath));
- char *newpath;
+ const TCHAR *path = _tgetenv(_T("PATH"));
+ BOOL add_ppath = ppath != NULL && (path == NULL || !_tcsstr(path, ppath));
+ BOOL add_mpath = mpath != NULL && (path == NULL || !_tcsstr(path, mpath));
+ TCHAR *newpath;
int newlen;
if (add_ppath || add_mpath) {
/* Enough to add "PATH=" + path + ";" + ppath + ";" + mpath + \0 */
- newlen = 6 + (path ? strlen(path) + 1 : 0);
+ newlen = 6 + (path ? _tcslen(path) + 1 : 0);
if (add_ppath)
- newlen += strlen(ppath) + 1;
+ newlen += _tcslen(ppath) + 1;
if (add_mpath)
- newlen += strlen(mpath) + 1;
- newpath = malloc(newlen);
- *newpath = '\0';
+ newlen += _tcslen(mpath) + 1;
+ newpath = malloc(newlen * sizeof(TCHAR));
- _snprintf(newpath, newlen, "PATH=%s%s%s%s%s%s",
- path ? path : "",
- path ? ";" : "",
- add_ppath ? ppath : "",
- add_ppath ? ";" : "",
- add_mpath ? mpath : "",
- add_mpath ? ";" : "");
+ _sntprintf(newpath, newlen, _T("PATH=%s%s%s%s%s%s"),
+ path ? path : _T(""),
+ path ? _T(";") : _T(""),
+ add_ppath ? ppath : _T(""),
+ add_ppath ? _T(";") : _T(""),
+ add_mpath ? mpath : _T(""),
+ add_mpath ? _T(";") : _T(""));
- printf("New PATH: %s\n", newpath);
+ _tprintf(_T("New PATH: %s\n"), newpath);
- _putenv(newpath);
+ _tputenv(newpath);
free(newpath);
}
}
@@ -523,7 +501,7 @@
static BOOL winpidgin_set_running(BOOL fail_if_running) {
HANDLE h;
- if ((h = CreateMutex(NULL, FALSE, "pidgin_is_running"))) {
+ if ((h = CreateMutex(NULL, FALSE, _T("pidgin_is_running")))) {
DWORD err = GetLastError();
if (err == ERROR_ALREADY_EXISTS) {
if (fail_if_running) {
@@ -531,14 +509,14 @@
printf("An instance of Pidgin is already running.\n");
- if((msg_win = FindWindowEx(NULL, NULL, TEXT("WinpidginMsgWinCls"), NULL)))
+ if((msg_win = FindWindowEx(NULL, NULL, _T("WinpidginMsgWinCls"), NULL)))
if(SendMessage(msg_win, PIDGIN_WM_FOCUS_REQUEST, (WPARAM) NULL, (LPARAM) NULL))
return FALSE;
/* If we get here, the focus request wasn't successful */
MessageBox(NULL,
- "An instance of Pidgin is already running",
+ _T("An instance of Pidgin is already running"),
NULL, MB_OK | MB_TOPMOST);
return FALSE;
@@ -549,80 +527,98 @@
return TRUE;
}
-#define PROTO_HANDLER_SWITCH "--protocolhandler="
+#define PROTO_HANDLER_SWITCH L"--protocolhandler="
-static void handle_protocol(char *cmd) {
- char *remote_msg, *tmp1, *tmp2;
- int len;
+static void handle_protocol(wchar_t *cmd) {
+ char *remote_msg, *utf8msg;
+ wchar_t *tmp1, *tmp2;
+ int len, wlen;
SIZE_T len_written;
HWND msg_win;
DWORD pid;
HANDLE process;
/* The start of the message */
- tmp1 = cmd + strlen(PROTO_HANDLER_SWITCH);
+ tmp1 = cmd + wcslen(PROTO_HANDLER_SWITCH);
/* The end of the message */
- if ((tmp2 = strchr(tmp1, ' ')))
- len = (tmp2 - tmp1);
+ if ((tmp2 = wcschr(tmp1, L' ')))
+ wlen = (tmp2 - tmp1);
else
- len = strlen(tmp1);
+ wlen = wcslen(tmp1);
- if (len == 0) {
+ if (wlen == 0) {
printf("No protocol message specified.\n");
return;
}
- if (!(msg_win = FindWindowEx(NULL, NULL, TEXT("WinpidginMsgWinCls"), NULL))) {
+ if (!(msg_win = FindWindowEx(NULL, NULL, _T("WinpidginMsgWinCls"), NULL))) {
printf("Unable to find an instance of Pidgin to handle protocol message.\n");
return;
}
+ len = WideCharToMultiByte(CP_UTF8, 0, tmp1,
+ wlen, NULL, 0, NULL, NULL);
+ if (len) {
+ utf8msg = malloc(len * sizeof(char));
+ len = WideCharToMultiByte(CP_UTF8, 0, tmp1,
+ wlen, utf8msg, len, NULL, NULL);
+ }
+
+ if (len == 0) {
+ printf("No protocol message specified.\n");
+ return;
+ }
+
GetWindowThreadProcessId(msg_win, &pid);
if (!(process = OpenProcess(PROCESS_VM_OPERATION | PROCESS_VM_WRITE, FALSE, pid))) {
DWORD dw = GetLastError();
- const char *err_msg = get_win32_error_message(dw);
- printf("Unable to open Pidgin process. (%u) %s\n", (UINT) dw, err_msg);
+ const TCHAR *err_msg = get_win32_error_message(dw);
+ _tprintf(_T("Unable to open Pidgin process. (%u) %s\n"), (UINT) dw, err_msg);
return;
}
- printf("Trying to handle protocol message:\n'%.*s'\n", len, tmp1);
+ wprintf(L"Trying to handle protocol message:\n'%.*s'\n", wlen, tmp1);
- /* MEM_COMMIT initializes the memory to zero,
- * so we don't need to worry that our section of tmp1 isn't nul-terminated */
+ /* MEM_COMMIT initializes the memory to zero
+ * so we don't need to worry that our section of utf8msg isn't nul-terminated */
if ((remote_msg = (char*) VirtualAllocEx(process, NULL, len + 1, MEM_COMMIT, PAGE_READWRITE))) {
- if (WriteProcessMemory(process, remote_msg, tmp1, len, &len_written)) {
- if (!SendMessage(msg_win, PIDGIN_WM_PROTOCOL_HANDLE, len_written, (LPARAM) remote_msg))
+ if (WriteProcessMemory(process, remote_msg, utf8msg, len, &len_written)) {
+ if (!SendMessageA(msg_win, PIDGIN_WM_PROTOCOL_HANDLE, len_written, (LPARAM) remote_msg))
printf("Unable to send protocol message to Pidgin instance.\n");
} else {
DWORD dw = GetLastError();
- const char *err_msg = get_win32_error_message(dw);
- printf("Unable to write to remote memory. (%u) %s\n", (UINT) dw, err_msg);
+ const TCHAR *err_msg = get_win32_error_message(dw);
+ _tprintf(_T("Unable to write to remote memory. (%u) %s\n"), (UINT) dw, err_msg);
}
VirtualFreeEx(process, remote_msg, 0, MEM_RELEASE);
} else {
DWORD dw = GetLastError();
- const char *err_msg = get_win32_error_message(dw);
- printf("Unable to allocate remote memory. (%u) %s\n", (UINT) dw, err_msg);
+ const TCHAR *err_msg = get_win32_error_message(dw);
+ _tprintf(_T("Unable to allocate remote memory. (%u) %s\n"), (UINT) dw, err_msg);
}
CloseHandle(process);
+ free(utf8msg);
}
int _stdcall
WinMain (struct HINSTANCE__ *hInstance, struct HINSTANCE__ *hPrevInstance,
char *lpszCmdLine, int nCmdShow) {
- char errbuf[512];
- char pidgin_dir[MAX_PATH];
- char exe_name[MAX_PATH];
+ TCHAR errbuf[512];
+ TCHAR pidgin_dir[MAX_PATH];
+ TCHAR exe_name[MAX_PATH];
HMODULE hmod;
- char *tmp;
- int pidgin_argc = __argc;
- char **pidgin_argv = __argv;
- int i;
- BOOL debug = FALSE, help = FALSE, version = FALSE, multiple = FALSE;
+ TCHAR *tmp;
+ wchar_t *wtmp;
+ int pidgin_argc;
+ char **pidgin_argv; /* This is in utf-8 */
+ int i, j, k;
+ BOOL debug = FALSE, help = FALSE, version = FALSE, multiple = FALSE, success;
+ LPWSTR *szArglist;
+ LPWSTR cmdLine;
/* If debug or help or version flag used, create console for output */
for (i = 1; i < __argc; i++) {
@@ -655,7 +651,7 @@
* (_istty() doesn't work for stuff using the GUI subsystem) */
if (_fileno(stdout) == -1 || _fileno(stdout) == -2) {
LPFNATTACHCONSOLE MyAttachConsole = NULL;
- if ((hmod = GetModuleHandle("kernel32.dll"))) {
+ if ((hmod = GetModuleHandle(_T("kernel32.dll")))) {
MyAttachConsole =
(LPFNATTACHCONSOLE)
GetProcAddress(hmod, "AttachConsole");
@@ -668,68 +664,104 @@
}
}
+ cmdLine = GetCommandLineW();
+
/* If this is a protocol handler invocation, deal with it accordingly */
- if ((tmp = strstr(lpszCmdLine, PROTO_HANDLER_SWITCH)) != NULL) {
- handle_protocol(tmp);
+ if ((wtmp = wcsstr(cmdLine, PROTO_HANDLER_SWITCH)) != NULL) {
+ handle_protocol(wtmp);
return 0;
}
/* Load exception handler if we have it */
if (GetModuleFileName(NULL, pidgin_dir, MAX_PATH) != 0) {
- char *prev = NULL;
- tmp = pidgin_dir;
/* primitive dirname() */
- while ((tmp = strchr(tmp, '\\'))) {
- prev = tmp;
- tmp++;
- }
+ tmp = _tcsrchr(pidgin_dir, _T('\\'));
- if (prev) {
- prev[0] = '\0';
+ if (tmp) {
+ HMODULE hmod;
+ tmp[0] = _T('\0');
+
+ /* tmp++ will now point to the executable file name */
+ _tcscpy(exe_name, tmp + 1);
- /* prev++ will now point to the executable file name */
- strcpy(exe_name, prev + 1);
+ _tcscat(pidgin_dir, _T("\\exchndl.dll"));
+ if ((hmod = LoadLibrary(pidgin_dir))) {
+ FARPROC proc;
+ /* exchndl.dll is built without UNICODE */
+ char debug_dir[MAX_PATH];
+ printf("Loaded exchndl.dll\n");
+ /* Temporarily override exchndl.dll's logfile
+ * to something sane (Pidgin will override it
+ * again when it initializes) */
+ proc = GetProcAddress(hmod, "SetLogFile");
+ if (proc) {
+ if (GetTempPathA(sizeof(debug_dir) * sizeof(char), debug_dir) != 0) {
+ strcat(debug_dir, "pidgin.RPT");
+ printf(" Setting exchndl.dll LogFile to %s\n",
+ debug_dir);
+ (proc)(debug_dir);
+ }
+ }
+ proc = GetProcAddress(hmod, "SetDebugInfoDir");
+ if (proc) {
+ char *pidgin_dir_ansi = NULL;
+ tmp[0] = _T('\0');
+#ifdef _UNICODE
+ i = WideCharToMultiByte(CP_ACP, 0, pidgin_dir,
+ -1, NULL, 0, NULL, NULL);
+ if (i != 0) {
+ pidgin_dir_ansi = malloc(i * sizeof(char));
+ i = WideCharToMultiByte(CP_ACP, 0, pidgin_dir,
+ -1, pidgin_dir_ansi, i, NULL, NULL);
+ if (i == 0) {
+ free(pidgin_dir_ansi);
+ pidgin_dir_ansi = NULL;
+ }
+ }
+#else
+ pidgin_dir_ansi = pidgin_dir;
+#endif
+ if (pidgin_dir_ansi != NULL) {
+ _snprintf(debug_dir, sizeof(debug_dir) / sizeof(char),
+ "%s\\pidgin-%s-dbgsym",
+ pidgin_dir_ansi, VERSION);
+ debug_dir[sizeof(debug_dir) / sizeof(char) - 1] = '\0';
+ printf(" Setting exchndl.dll DebugInfoDir to %s\n",
+ debug_dir);
+ (proc)(debug_dir);
+#ifdef _UNICODE
+ free(pidgin_dir_ansi);
+#endif
+ }
+ }
- strcat(pidgin_dir, "\\exchndl.dll");
- if (LoadLibrary(pidgin_dir))
- printf("Loaded exchndl.dll\n");
+ }
- prev[0] = '\0';
+ tmp[0] = _T('\0');
}
} else {
DWORD dw = GetLastError();
- const char *err_msg = get_win32_error_message(dw);
- _snprintf(errbuf, 512,
- "Error getting module filename.\nError: (%u) %s",
+ const TCHAR *err_msg = get_win32_error_message(dw);
+ _sntprintf(errbuf, 512,
+ _T("Error getting module filename.\nError: (%u) %s"),
(UINT) dw, err_msg);
- printf("%s\n", errbuf);
+ _tprintf(_T("%s\n"), errbuf);
MessageBox(NULL, errbuf, NULL, MB_OK | MB_TOPMOST);
- pidgin_dir[0] = '\0';
+ pidgin_dir[0] = _T('\0');
}
/* Determine if we're running in portable mode */
- if (strstr(lpszCmdLine, "--portable-mode")
- || (exe_name != NULL && strstr(exe_name, "-portable.exe"))) {
- int i = 0, c = 0;
-
+ if (wcsstr(cmdLine, L"--portable-mode")
+ || (exe_name != NULL && _tcsstr(exe_name, _T("-portable.exe")))) {
printf("Running in PORTABLE mode.\n");
portable_mode = TRUE;
-
- /* Remove the --portable-mode arg from the args passed to pidgin so it doesn't choke */
- pidgin_argv = malloc(sizeof(char*) * pidgin_argc);
- for (; i < __argc; i++) {
- if (strstr(__argv[i], "--portable-mode") == NULL)
- pidgin_argv[c++] = __argv[i];
- else
- pidgin_argc--;
- }
}
if (portable_mode)
portable_mode_dll_prep(pidgin_dir);
else if (!getenv("PIDGIN_NO_DLL_CHECK"))
- dll_prep();
+ dll_prep(pidgin_dir);
winpidgin_set_locale();
@@ -741,23 +773,53 @@
return 0;
/* Now we are ready for Pidgin .. */
- if ((hmod = LoadLibrary("pidgin.dll")))
+ if ((hmod = LoadLibrary(_T("pidgin.dll"))))
pidgin_main = (LPFNPIDGINMAIN) GetProcAddress(hmod, "pidgin_main");
if (!pidgin_main) {
DWORD dw = GetLastError();
BOOL mod_not_found = (dw == ERROR_MOD_NOT_FOUND || dw == ERROR_DLL_NOT_FOUND);
- const char *err_msg = get_win32_error_message(dw);
+ const TCHAR *err_msg = get_win32_error_message(dw);
- _snprintf(errbuf, 512, "Error loading pidgin.dll.\nError: (%u) %s%s%s",
+ _sntprintf(errbuf, 512, _T("Error loading pidgin.dll.\nError: (%u) %s%s%s"),
(UINT) dw, err_msg,
- mod_not_found ? "\n" : "",
- mod_not_found ? "This probably means that GTK+ can't be found." : "");
- printf("%s\n", errbuf);
- MessageBox(NULL, errbuf, TEXT("Error"), MB_OK | MB_TOPMOST);
+ mod_not_found ? _T("\n") : _T(""),
+ mod_not_found ? _T("This probably means that GTK+ can't be found.") : _T(""));
+ _tprintf(_T("%s\n"), errbuf);
+ MessageBox(NULL, errbuf, _T("Error"), MB_OK | MB_TOPMOST);
return 0;
}
+ /* Convert argv to utf-8*/
+ szArglist = CommandLineToArgvW(cmdLine, &j);
+ pidgin_argc = j;
+ pidgin_argv = malloc(pidgin_argc* sizeof(char*));
+ k = 0;
+ for (i = 0; i < j; i++) {
+ success = FALSE;
+ /* Remove the --portable-mode arg from the args passed to pidgin so it doesn't choke */
+ if (wcsstr(szArglist[i], L"--portable-mode") == NULL) {
+ int len = WideCharToMultiByte(CP_UTF8, 0, szArglist[i],
+ -1, NULL, 0, NULL, NULL);
+ if (len != 0) {
+ char *arg = malloc(len * sizeof(char));
+ len = WideCharToMultiByte(CP_UTF8, 0, szArglist[i],
+ -1, arg, len, NULL, NULL);
+ if (len != 0) {
+ pidgin_argv[k++] = arg;
+ success = TRUE;
+ }
+ }
+ if (!success)
+ wprintf(L"Error converting argument '%s' to UTF-8\n",
+ szArglist[i]);
+ }
+ if (!success)
+ pidgin_argc--;
+ }
+ LocalFree(szArglist);
+
+
return pidgin_main(hInstance, pidgin_argc, pidgin_argv);
}
diff -r cc6d733a192a -r c5a7516418c7 po/ChangeLog
--- a/po/ChangeLog Tue Feb 16 15:58:34 2010 +0000
+++ b/po/ChangeLog Thu Feb 18 16:59:04 2010 +0000
@@ -1,5 +1,7 @@
Pidgin and Finch: The Pimpin' Penguin IM Clients That're Good for the Soul
+version 2.7.0
+
version 2.6.6
* Afrikaans translation updated (Friedel Wolff)
* Albanian translation updated (Besnik Bleta)
diff -r cc6d733a192a -r c5a7516418c7 po/POTFILES.in
--- a/po/POTFILES.in Tue Feb 16 15:58:34 2010 +0000
+++ b/po/POTFILES.in Thu Feb 18 16:59:04 2010 +0000
@@ -50,8 +50,7 @@
libpurple/ft.c
libpurple/gconf/purple.schemas.in
libpurple/log.c
-libpurple/media.c
-libpurple/mediamanager.c
+libpurple/media/backend-fs2.c
libpurple/plugin.c
libpurple/plugins/autoaccept.c
libpurple/plugins/buddynote.c
diff -r cc6d733a192a -r c5a7516418c7 po/ca.po
--- a/po/ca.po Tue Feb 16 15:58:34 2010 +0000
+++ b/po/ca.po Thu Feb 18 16:59:04 2010 +0000
@@ -33,8 +33,8 @@
msgstr ""
"Project-Id-Version: Pidgin\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-11-29 22:28+0100\n"
-"PO-Revision-Date: 2009-11-29 22:39+0100\n"
+"POT-Creation-Date: 2010-02-16 09:18+0100\n"
+"PO-Revision-Date: 2010-02-16 23:08+0100\n"
"Last-Translator: Josep Puigdemont i Casamajó \n"
"Language-Team: Catalan \n"
"MIME-Version: 1.0\n"
@@ -1987,6 +1987,9 @@
msgid "%s is not a regular file. Cowardly refusing to overwrite it.\n"
msgstr "%s no és un fitxer normal, no se sobreescriurà.\n"
+msgid "File is not readable."
+msgstr "No ha estat possible llegir el fitxer."
+
#, c-format
msgid "%s wants to send you %s (%s)"
msgstr "%s us vol enviar %s (%s)"
@@ -3845,6 +3848,13 @@
msgid "Server requires plaintext authentication over an unencrypted stream"
msgstr "El servidor requereix autenticació de text sobre un flux no xifrat"
+#. This should never happen!
+msgid "Invalid response from server"
+msgstr "La resposta del servidor no és vàlida"
+
+msgid "Server does not use any supported authentication method"
+msgstr "No hi ha cap mètode d'autenticació compatible amb aquest servidor"
+
#, c-format
msgid ""
"%s requires plaintext authentication over an unencrypted connection. Allow "
@@ -3856,25 +3866,35 @@
msgid "Plaintext Authentication"
msgstr "Autenticació de text"
-msgid "SASL authentication failed"
-msgstr "Ha fallat l'autenticació SASL"
-
-msgid "Invalid response from server"
-msgstr "La resposta del servidor no és vàlida"
-
-msgid "Server does not use any supported authentication method"
-msgstr "No hi ha cap mètode d'autenticació compatible amb aquest servidor"
-
msgid "You require encryption, but it is not available on this server."
msgstr "Requeriu xifratge, però no està disponible en aquest servidor."
msgid "Invalid challenge from server"
msgstr "Repte del servidor invàlid"
+msgid "Server thinks authentication is complete, but client does not"
+msgstr "El servidor creu que s'ha completat l'autenticació, però el client no"
+
+msgid "SASL authentication failed"
+msgstr "Ha fallat l'autenticació SASL"
+
#, c-format
msgid "SASL error: %s"
msgstr "Error SASL: %s"
+# FIXME: canonicalize -> normalitzar (josep)
+msgid "Unable to canonicalize username"
+msgstr "No s'ha pogut normalitzar el nom d'usuari"
+
+msgid "Unable to canonicalize password"
+msgstr "No s'ha pogut normalitzar la contrasenya"
+
+msgid "Malicious challenge from server"
+msgstr "Desafiament malició del servidor"
+
+msgid "Unexpected response from server"
+msgstr "S'ha rebut una resposta inesperada del servidor"
+
msgid "The BOSH connection manager terminated your session."
msgstr "El gestor de connexions BOSH ha tancat la connexió."
@@ -3975,13 +3995,17 @@
msgid "Resource"
msgstr "Recurs"
+# FIXME
+msgid "Uptime"
+msgstr "Temps connectat"
+
+msgid "Logged Off"
+msgstr "Desconnectat"
+
#, c-format
msgid "%s ago"
msgstr "fa %s"
-msgid "Logged Off"
-msgstr "Desconnectat"
-
# Segons la viquipèdia
msgid "Middle Name"
msgstr "Nom del mig"
@@ -4172,13 +4196,6 @@
msgid "Ping timed out"
msgstr "S'ha esgitat el temps d'espera (ping)"
-msgid ""
-"Unable to find alternative XMPP connection methods after failing to connect "
-"directly."
-msgstr ""
-"No s'ha pogut trobar cap mètode alternatiu de connexió XMPP després de no "
-"haver pogut connectar directament."
-
msgid "Invalid XMPP ID"
msgstr "ID de l'XMPP invàlid"
@@ -4734,6 +4751,11 @@
msgid "(Code %s)"
msgstr "(Codi %s)"
+msgid "A custom smiley in the message is too large to send."
+msgstr ""
+"No es pot enviar una de les emoticones personalitzades del missatge atès que "
+"és massa llarga."
+
msgid "XML Parse error"
msgstr "Error en l'anàlisi de l'XML"
@@ -4776,13 +4798,13 @@
msgstr "Us han fet fora (%s)"
msgid "An error occurred on the in-band bytestream transfer\n"
-msgstr ""
+msgstr "S'ha produit un error en el fluxe de transferència de dades en banda\n"
msgid "Transfer was closed."
msgstr "La transferència s'ha tancat."
msgid "Failed to open in-band bytestream"
-msgstr ""
+msgstr "No s'ha pogut obrir el fluxe de transferència de dades en banda"
#, c-format
msgid "Unable to send file to %s, user does not support file transfers"
@@ -5149,6 +5171,10 @@
msgid "Your new MSN friendly name is too long."
msgstr "El vostre nom amistós nou d'MSN és massa llarg."
+#, c-format
+msgid "Set friendly name for %s."
+msgstr "Establiu el nom amistós de %s."
+
msgid "Set your friendly name."
msgstr "Establiu el vostre nom amistós."
@@ -6771,7 +6797,10 @@
msgid "Server port"
msgstr "Port en el servidor"
-#. Note to translators: %s in this string is a URL
+#, c-format
+msgid "Received unexpected response from %s: %s"
+msgstr "S'ha rebut una resposta inesperada de %s: %s"
+
#, c-format
msgid "Received unexpected response from %s"
msgstr "S'ha rebut una resposta inesperada de %s"
@@ -6790,6 +6819,13 @@
msgid "Error requesting %s: %s"
msgstr "S'ha produït un error en sol·licitar %s: %s"
+msgid ""
+"Server requested that you fill out a CAPTCHA in order to sign in, but this "
+"client does not currently support CAPTCHAs."
+msgstr ""
+"El servidor requereix que ompliu el CAPTCHA per poder entrar, però aquest "
+"client encara no permet l'ús de CAPTCHA."
+
msgid "AOL does not allow your screen name to authenticate here"
msgstr "AOL no permet que us autentiqueu amb aquest nom d'usuari aquí"
@@ -7352,13 +7388,6 @@
"[No s'ha pogut mostrar el missatge d'aquest usuari perquè contenia caràcters "
"invàlids.]"
-msgid ""
-"The last action you attempted could not be performed because you are over "
-"the rate limit. Please wait 10 seconds and try again.\n"
-msgstr ""
-"No s'ha pogut realitzar la darrera acció que havíeu intentat perquè esteu "
-"per sobre del límit. Espereu 10 segons i torneu-ho a provar.\n"
-
#, c-format
msgid "You have been disconnected from chat room %s."
msgstr "Se us ha desconnectat de la conversa %s."
@@ -12040,15 +12069,15 @@
msgid "Lao"
msgstr "Lasià"
-msgid "Lithuanian"
-msgstr "Lituà"
-
msgid "Macedonian"
msgstr "Macedoni"
msgid "Mongolian"
msgstr "Mongol"
+msgid "Marathi"
+msgstr "Marathi"
+
msgid "Malay"
msgstr "Malai"
@@ -12067,6 +12096,9 @@
msgid "Occitan"
msgstr "Occità"
+msgid "Oriya"
+msgstr "Oriya"
+
msgid "Punjabi"
msgstr "Punjabi"
@@ -12148,6 +12180,9 @@
msgid "Amharic"
msgstr "Amhàric"
+msgid "Lithuanian"
+msgstr "Lituà"
+
#, c-format
msgid "About %s"
msgstr "Quant al %s"
@@ -13816,6 +13851,10 @@
msgid "_Save File"
msgstr "_Desa el fitxer"
+# Nota: com que és una pissarra, fem servir esborrar.
+msgid "Do you really want to clear?"
+msgstr "Esteu segur que voleu esborrar-ho?"
+
msgid "Select color"
msgstr "Seleccioneu un color"
@@ -15036,6 +15075,20 @@
msgid "This plugin is useful for debbuging XMPP servers or clients."
msgstr "Aquest connector és útil per a depurar servidors i clients XMPP."
+#~ msgid ""
+#~ "Unable to find alternative XMPP connection methods after failing to "
+#~ "connect directly."
+#~ msgstr ""
+#~ "No s'ha pogut trobar cap mètode alternatiu de connexió XMPP després de no "
+#~ "haver pogut connectar directament."
+
+#~ msgid ""
+#~ "The last action you attempted could not be performed because you are over "
+#~ "the rate limit. Please wait 10 seconds and try again.\n"
+#~ msgstr ""
+#~ "No s'ha pogut realitzar la darrera acció que havíeu intentat perquè esteu "
+#~ "per sobre del límit. Espereu 10 segons i torneu-ho a provar.\n"
+
#~ msgid "(Default)"
#~ msgstr "(Predeterminat)"
diff -r cc6d733a192a -r c5a7516418c7 po/ca@valencia.po
--- a/po/ca@valencia.po Tue Feb 16 15:58:34 2010 +0000
+++ b/po/ca@valencia.po Thu Feb 18 16:59:04 2010 +0000
@@ -3,7 +3,7 @@
# Copyright (C) unknown, Robert Millan
# Copyright (C) December 2003 (from 2003-12-12 until 2003-12-18),
# January (2004-01-07,12), Xan
-# Copyright (c) 2004, 2005, 2006, 2007, 2008, 2009
+# Copyright (c) 2004, 2005, 2006, 2007, 2008, 2009, 2010
# Josep Puigdemont i Casamajó
#
# This file is distributed under the same license as the Pidgin package.
@@ -33,8 +33,8 @@
msgstr ""
"Project-Id-Version: Pidgin\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-11-28 18:48+0100\n"
-"PO-Revision-Date: 2009-11-28 21:57+0100\n"
+"POT-Creation-Date: 2010-02-16 09:18+0100\n"
+"PO-Revision-Date: 2010-02-16 23:08+0100\n"
"Last-Translator: Josep Puigdemont i Casamajó \n"
"Language-Team: Catalan \n"
"MIME-Version: 1.0\n"
@@ -66,7 +66,7 @@
"Forma d'ús: %s [OPCIÓ]...\n"
"\n"
" -c, --config=DIR utilitza DIR per als fitxers de configuració\n"
-" -d, --debug mostra missatges de depuració a la eixida d'error\n"
+" -d, --debug mostra missatges de depuració a l'eixida d'error\n"
" estàndard \n"
" -h, --help mostra esta ajuda i ix\n"
" -n, --nologin no entra automàticament\n"
@@ -1987,6 +1987,9 @@
msgid "%s is not a regular file. Cowardly refusing to overwrite it.\n"
msgstr "%s no és un fitxer normal, no se sobreescriurà.\n"
+msgid "File is not readable."
+msgstr "No ha estat possible llegir el fitxer."
+
#, c-format
msgid "%s wants to send you %s (%s)"
msgstr "%s vos vol enviar %s (%s)"
@@ -2337,7 +2340,7 @@
msgstr "Estableix el paràmetre d'acceptació automàtica"
msgid "_Save"
-msgstr "De_sa"
+msgstr "Al_ça"
msgid "_Cancel"
msgstr "_Cancel·la"
@@ -2680,11 +2683,11 @@
"WARNING: This plugin is still alpha code and may crash frequently. Use it "
"at your own risk!"
msgstr ""
-"Quan es visualitzin els registres, este connector inclourà registres "
+"Quan es visualitzen els registres, este connector inclourà registres "
"d'altres clients de MI. De moment, es poden incloure els d'Adium, MSN "
"Messenger, aMSN, i Trillian.\n"
"\n"
-"Avís: este connector encara està en desenvolupament i pot ser que es pengi."
+"Avís: este connector encara està en desenvolupament i pot ser que es penge."
msgid "Mono Plugin Loader"
msgstr "Carregador de connectors Mono"
@@ -3845,6 +3848,13 @@
msgid "Server requires plaintext authentication over an unencrypted stream"
msgstr "El servidor requereix autenticació de text sobre un flux no xifrat"
+#. This should never happen!
+msgid "Invalid response from server"
+msgstr "La resposta del servidor no és vàlida"
+
+msgid "Server does not use any supported authentication method"
+msgstr "No hi ha cap mètode d'autenticació compatible amb este servidor"
+
#, c-format
msgid ""
"%s requires plaintext authentication over an unencrypted connection. Allow "
@@ -3856,25 +3866,35 @@
msgid "Plaintext Authentication"
msgstr "Autenticació de text"
-msgid "SASL authentication failed"
-msgstr "Ha fallat l'autenticació SASL"
-
-msgid "Invalid response from server"
-msgstr "La resposta del servidor no és vàlida"
-
-msgid "Server does not use any supported authentication method"
-msgstr "No hi ha cap mètode d'autenticació compatible amb este servidor"
-
msgid "You require encryption, but it is not available on this server."
msgstr "Requeriu xifratge, però no està disponible en este servidor."
msgid "Invalid challenge from server"
msgstr "Repte del servidor invàlid"
+msgid "Server thinks authentication is complete, but client does not"
+msgstr "El servidor creu que s'ha completat l'autenticació, però el client no"
+
+msgid "SASL authentication failed"
+msgstr "Ha fallat l'autenticació SASL"
+
#, c-format
msgid "SASL error: %s"
msgstr "Error SASL: %s"
+# FIXME: canonicalize -> normalitzar (josep)
+msgid "Unable to canonicalize username"
+msgstr "No s'ha pogut normalitzar el nom d'usuari"
+
+msgid "Unable to canonicalize password"
+msgstr "No s'ha pogut normalitzar la contrasenya"
+
+msgid "Malicious challenge from server"
+msgstr "Desafiament malició del servidor"
+
+msgid "Unexpected response from server"
+msgstr "S'ha rebut una resposta inesperada del servidor"
+
msgid "The BOSH connection manager terminated your session."
msgstr "El gestor de connexions BOSH ha tancat la connexió."
@@ -3975,13 +3995,17 @@
msgid "Resource"
msgstr "Recurs"
+# FIXME
+msgid "Uptime"
+msgstr "Temps connectat"
+
+msgid "Logged Off"
+msgstr "Desconnectat"
+
#, c-format
msgid "%s ago"
msgstr "fa %s"
-msgid "Logged Off"
-msgstr "Desconnectat"
-
# Segons la viquipèdia
msgid "Middle Name"
msgstr "Nom del mig"
@@ -4172,13 +4196,6 @@
msgid "Ping timed out"
msgstr "S'ha esgitat el temps d'espera (ping)"
-msgid ""
-"Unable to find alternative XMPP connection methods after failing to connect "
-"directly."
-msgstr ""
-"No s'ha pogut trobar cap mètode alternatiu de connexió XMPP després de no "
-"haver pogut connectar directament."
-
msgid "Invalid XMPP ID"
msgstr "ID de l'XMPP invàlid"
@@ -4734,6 +4751,11 @@
msgid "(Code %s)"
msgstr "(Codi %s)"
+msgid "A custom smiley in the message is too large to send."
+msgstr ""
+"No es pot enviar una de les emoticones personalitzades del missatge atès que "
+"és massa llarga."
+
msgid "XML Parse error"
msgstr "Error en l'anàlisi de l'XML"
@@ -4776,13 +4798,13 @@
msgstr "Vos han fet fora (%s)"
msgid "An error occurred on the in-band bytestream transfer\n"
-msgstr ""
+msgstr "S'ha produit un error en el fluxe de transferència de dades en banda\n"
msgid "Transfer was closed."
msgstr "La transferència s'ha tancat."
msgid "Failed to open in-band bytestream"
-msgstr ""
+msgstr "No s'ha pogut obrir el fluxe de transferència de dades en banda"
#, c-format
msgid "Unable to send file to %s, user does not support file transfers"
@@ -5133,15 +5155,15 @@
"no està implementat."
msgid "Nudge"
-msgstr "Donar un colp de colze"
+msgstr "Donar un cop de colze"
#, c-format
msgid "%s has nudged you!"
-msgstr "%s vos ha donat un colp de colze!"
+msgstr "%s vos ha donat un cop de colze!"
#, c-format
msgid "Nudging %s..."
-msgstr "S'està donant un colp de colze a %s..."
+msgstr "S'està donant un cop de colze a %s..."
msgid "Email Address..."
msgstr "Correu electrònic..."
@@ -5149,6 +5171,10 @@
msgid "Your new MSN friendly name is too long."
msgstr "El vostre nom amistós nou d'MSN és massa llarg."
+#, c-format
+msgid "Set friendly name for %s."
+msgstr "Establiu el nom amistós de %s."
+
msgid "Set your friendly name."
msgstr "Establiu el vostre nom amistós."
@@ -5483,7 +5509,7 @@
msgstr "Mostra emoticones personalitzades"
msgid "nudge: nudge a user to get their attention"
-msgstr "nudge: doneu un colp de colze a un usuari perquè vos pare atenció"
+msgstr "nudge: doneu un cop de colze a un usuari perquè vos pare atenció"
msgid "Windows Live ID authentication:Unable to connect"
msgstr "Autenticació amb el Windows Live ID: no s'ha pogut connectar"
@@ -5493,7 +5519,7 @@
#, c-format
msgid "%s just sent you a Nudge!"
-msgstr "%s vos ha donat un colp de colze!"
+msgstr "%s vos ha donat un cop de colze!"
msgid "The following users are missing from your addressbook"
msgstr "Manquen estos usuaris a la vostra llista d'amics"
@@ -6346,7 +6372,7 @@
msgstr "Este nom d'usuari està disponible. Voleu fer-lo servir?"
msgid "ONCE SET, THIS CANNOT BE CHANGED!"
-msgstr "Una vegada l'hagueu establit no el podreu canviar!"
+msgstr "Un cop l'hagueu establit no el podreu canviar!"
msgid "MySpaceIM - Please Set a Username"
msgstr "MySpaceIM - Establiu un nom d'usuari"
@@ -6771,7 +6797,10 @@
msgid "Server port"
msgstr "Port en el servidor"
-#. Note to translators: %s in this string is a URL
+#, c-format
+msgid "Received unexpected response from %s: %s"
+msgstr "S'ha rebut una resposta inesperada de %s: %s"
+
#, c-format
msgid "Received unexpected response from %s"
msgstr "S'ha rebut una resposta inesperada de %s"
@@ -6790,6 +6819,13 @@
msgid "Error requesting %s: %s"
msgstr "S'ha produït un error en sol·licitar %s: %s"
+msgid ""
+"Server requested that you fill out a CAPTCHA in order to sign in, but this "
+"client does not currently support CAPTCHAs."
+msgstr ""
+"El servidor requereix que ompliu el CAPTCHA per poder entrar, però este "
+"client encara no permet l'ús de CAPTCHA."
+
msgid "AOL does not allow your screen name to authenticate here"
msgstr "AOL no permet que vos autentiqueu amb este nom d'usuari ací"
@@ -7352,13 +7388,6 @@
"[No s'ha pogut mostrar el missatge d'este usuari perquè contenia caràcters "
"invàlids.]"
-msgid ""
-"The last action you attempted could not be performed because you are over "
-"the rate limit. Please wait 10 seconds and try again.\n"
-msgstr ""
-"No s'ha pogut realitzar la darrera acció que havíeu intentat perquè esteu "
-"per sobre del límit. Espereu 10 segons i torneu-ho a provar.\n"
-
#, c-format
msgid "You have been disconnected from chat room %s."
msgstr "Se vos ha desconnectat de la conversa %s."
@@ -9495,10 +9524,10 @@
msgstr "Serveis en línia"
msgid "Let others see what services you are using"
-msgstr "Permet que els altres vegin quins serveis feu servir"
+msgstr "Permet que els altres vegen quins serveis feu servir"
msgid "Let others see what computer you are using"
-msgstr "Permet que els altres vegin quin ordinador feu servir"
+msgstr "Permet que els altres vegen quin ordinador feu servir"
msgid "Your VCard File"
msgstr "El fitxer de la vostra VCard"
@@ -9514,7 +9543,7 @@
"information. Please fill the information you would like other users to see "
"about yourself."
msgstr ""
-"Podeu permetre que altres usuaris vegin informació sobre el vostre estat en "
+"Podeu permetre que altres usuaris vegen informació sobre el vostre estat en "
"línia, així com informació personal. Empleneu la informació que vulgueu que "
"altres usuaris puguen veure."
@@ -10877,7 +10906,7 @@
msgstr "_Bàsic"
msgid "Create _this new account on the server"
-msgstr "Crea _aquest compte nou al servidor"
+msgstr "Crea _este compte nou al servidor"
msgid "P_roxy"
msgstr "Servidor _intermediari"
@@ -12040,15 +12069,15 @@
msgid "Lao"
msgstr "Lasià"
-msgid "Lithuanian"
-msgstr "Lituà"
-
msgid "Macedonian"
msgstr "Macedoni"
msgid "Mongolian"
msgstr "Mongol"
+msgid "Marathi"
+msgstr "Marathi"
+
msgid "Malay"
msgstr "Malai"
@@ -12067,6 +12096,9 @@
msgid "Occitan"
msgstr "Occità"
+msgid "Oriya"
+msgstr "Oriya"
+
msgid "Punjabi"
msgstr "Punjabi"
@@ -12148,6 +12180,9 @@
msgid "Amharic"
msgstr "Amhàric"
+msgid "Lithuanian"
+msgstr "Lituà"
+
#, c-format
msgid "About %s"
msgstr "Quant al %s"
@@ -12780,7 +12815,7 @@
msgstr "empra DIR per a fitxers de configuració"
msgid "print debugging messages to stdout"
-msgstr "escriu missatges de depuració a la eixida estàndard"
+msgstr "escriu missatges de depuració a l'eixida estàndard"
msgid "force online, regardless of network status"
msgstr "força estar en línia, independentment de l'estat de la xarxa"
@@ -13816,6 +13851,10 @@
msgid "_Save File"
msgstr "Al_ça el fitxer"
+# Nota: com que és una pissarra, fem servir esborrar.
+msgid "Do you really want to clear?"
+msgstr "Esteu segur que voleu esborrar-ho?"
+
msgid "Select color"
msgstr "Seleccioneu un color"
@@ -15036,6 +15075,20 @@
msgid "This plugin is useful for debbuging XMPP servers or clients."
msgstr "Este connector és útil per a depurar servidors i clients XMPP."
+#~ msgid ""
+#~ "Unable to find alternative XMPP connection methods after failing to "
+#~ "connect directly."
+#~ msgstr ""
+#~ "No s'ha pogut trobar cap mètode alternatiu de connexió XMPP després de no "
+#~ "haver pogut connectar directament."
+
+#~ msgid ""
+#~ "The last action you attempted could not be performed because you are over "
+#~ "the rate limit. Please wait 10 seconds and try again.\n"
+#~ msgstr ""
+#~ "No s'ha pogut realitzar la darrera acció que havíeu intentat perquè esteu "
+#~ "per sobre del límit. Espereu 10 segons i torneu-ho a provar.\n"
+
#~ msgid "(Default)"
#~ msgstr "(Predeterminat)"
diff -r cc6d733a192a -r c5a7516418c7 po/fi.po
--- a/po/fi.po Tue Feb 16 15:58:34 2010 +0000
+++ b/po/fi.po Thu Feb 18 16:59:04 2010 +0000
@@ -1,7 +1,7 @@
# Piidgin Finnish translation
# Copyright (C) 2002 Tero Kuusela
# Copyright (C) 2003-2005 Arto Alakulju
-# Copyright (C) 2005-2009 Timo Jyrinki
+# Copyright (C) 2005-2010 Timo Jyrinki
#
# This file is distributed under the same license as the Pidgin package.
#
@@ -10,8 +10,8 @@
msgstr ""
"Project-Id-Version: Pidgin\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-11-14 20:34-0500\n"
-"PO-Revision-Date: 2009-08-30 16:48+0300\n"
+"POT-Creation-Date: 2010-02-18 15:01+0200\n"
+"PO-Revision-Date: 2010-02-18 15:01+0200\n"
"Last-Translator: Timo Jyrinki \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
@@ -630,9 +630,8 @@
msgid "Enable Sounds"
msgstr "Ota äänet käyttöön"
-#, fuzzy
msgid "You are not connected."
-msgstr "Yhdistäminen ei onnistu"
+msgstr "Et ole yhdistettynä."
msgid " "
msgstr " "
@@ -1555,6 +1554,7 @@
msgid "Online"
msgstr "Linjoilla"
+#. primative, no, id, name
msgid "Offline"
msgstr "Poissa linjoilta"
@@ -1942,6 +1942,9 @@
msgid "%s is not a regular file. Cowardly refusing to overwrite it.\n"
msgstr "%s ei ole tavallinen tiedosto. Ei suostuta ylikirjoittamaan sitä.\n"
+msgid "File is not readable."
+msgstr "Tiedosto ei ole luettavissa."
+
#, c-format
msgid "%s wants to send you %s (%s)"
msgstr "%s on lähettämässä sinulle %s (%s)"
@@ -2213,25 +2216,19 @@
msgid "A non-recoverable Farsight2 error has occurred."
msgstr "Korjaamaton Farsight2-virhe."
-#, fuzzy
+msgid "Error with your microphone"
+msgstr "Virhe mikrofonin kanssa"
+
+msgid "Error with your webcam"
+msgstr "Virhe web-kameran kanssa"
+
msgid "Conference error"
-msgstr "Virhe neuvottelussa."
-
-#, fuzzy
-msgid "Error with your microphone"
-msgstr "Virhe mikrofonin kanssa."
-
-#, fuzzy
-msgid "Error with your webcam"
-msgstr "Virhe web-kameran kanssa."
+msgstr "Virhe neuvottelussa"
#, c-format
msgid "Error creating session: %s"
msgstr "Virhe luotaessa istuntoa: %s"
-msgid "Error creating conference."
-msgstr "Virhe luotaessa konferenssia."
-
#, c-format
msgid "You are using %s, but this plugin requires %s."
msgstr "Käytät: %s, mutta tämä liitännäinen vaatii: %s."
@@ -3169,10 +3166,12 @@
msgid "Add to chat..."
msgstr "Lisää ryhmäkeskusteluun..."
+#. 0
#. Global
msgid "Available"
msgstr "Tavoitettavissa"
+#. 1
#. get_yahoo_status_from_purple_status() returns YAHOO_STATUS_CUSTOM for
#. * the generic away state (YAHOO_STATUS_TYPE_AWAY) with no message
#. Away stuff
@@ -3797,6 +3796,13 @@
msgstr ""
"Palvelin vaatii salaamattoman tunnistautumisen salaamattoman yhteyden yli"
+#. This should never happen!
+msgid "Invalid response from server"
+msgstr "Kelvoton vastaus palvelimelta"
+
+msgid "Server does not use any supported authentication method"
+msgstr "Palvelin ei käytä mitään tuetuista tunnistautumismenetelmistä"
+
#, c-format
msgid ""
"%s requires plaintext authentication over an unencrypted connection. Allow "
@@ -3808,25 +3814,38 @@
msgid "Plaintext Authentication"
msgstr "Tekstipohjainen tunnistus"
-msgid "SASL authentication failed"
-msgstr "SASL-todennus epäonnistui"
-
-msgid "Invalid response from server"
-msgstr "Kelvoton vastaus palvelimelta"
-
-msgid "Server does not use any supported authentication method"
-msgstr "Palvelin ei käytä mitään tuetuista tunnistautumismenetelmistä"
-
msgid "You require encryption, but it is not available on this server."
msgstr "Salausta vaadittu, mutta sitä ei tueta tällä palvelimella."
msgid "Invalid challenge from server"
msgstr "Virheellinen tunnistushaaste palvelimelta"
+msgid "Server thinks authentication is complete, but client does not"
+msgstr ""
+
+msgid "SASL authentication failed"
+msgstr "SASL-todennus epäonnistui"
+
#, c-format
msgid "SASL error: %s"
msgstr "SASL-virhe: %s"
+#, fuzzy
+msgid "Unable to canonicalize username"
+msgstr "Asetusten tekeminen ei onnistu"
+
+#, fuzzy
+msgid "Unable to canonicalize password"
+msgstr "Kuuntelevaa porttia ei voi avata."
+
+#, fuzzy
+msgid "Malicious challenge from server"
+msgstr "Virheellinen tunnistushaaste palvelimelta"
+
+#, fuzzy
+msgid "Unexpected response from server"
+msgstr "Odottamaton HTTP-vastaus palvelimelta"
+
msgid "The BOSH connection manager terminated your session."
msgstr "BOSH-yhteyshallinta lopetti istunnon."
@@ -3927,13 +3946,16 @@
msgid "Resource"
msgstr "Sijainti"
+msgid "Uptime"
+msgstr "Ylhäällä"
+
+msgid "Logged Off"
+msgstr "Kirjautunut ulos"
+
#, c-format
msgid "%s ago"
msgstr "%s sitten"
-msgid "Logged Off"
-msgstr "Kirjautunut ulos"
-
msgid "Middle Name"
msgstr "Muut etunimet"
@@ -3981,15 +4003,6 @@
msgid "Log Out"
msgstr "Kirjaudu ulos"
-msgid "Chatty"
-msgstr "Juttelutuulella"
-
-msgid "Extended Away"
-msgstr "Pidennetty poissaolo"
-
-msgid "Do Not Disturb"
-msgstr "Älä häiritse"
-
msgid "JID"
msgstr "JID"
@@ -4120,13 +4133,6 @@
msgid "Ping timed out"
msgstr "Pingin aikakatkaisu"
-msgid ""
-"Unable to find alternative XMPP connection methods after failing to connect "
-"directly."
-msgstr ""
-"Vaihtoehtoisia XMPP-yhteystapoja ei löytynyt suoran yhdistämisen "
-"epäonnistumisen jälkeen."
-
msgid "Invalid XMPP ID"
msgstr "Epäkelpo XMPP-ID"
@@ -4248,6 +4254,7 @@
msgid "None (To pending)"
msgstr "Ei mitään (odottaa lupaa)"
+#. 0
msgid "None"
msgstr "Ei mitään"
@@ -4261,6 +4268,14 @@
msgid "Allow Buzz"
msgstr "Salli äänimerkki"
+#. 2
+msgid "Chatty"
+msgstr "Juttelutuulella"
+
+#. 3
+msgid "Do Not Disturb"
+msgstr "Älä häiritse"
+
msgid "Tune Artist"
msgstr "Kappaleen esittäjä"
@@ -4506,10 +4521,6 @@
"Äänimerkkiä ei voi lähettää, koska käyttäjä %s ei tue sitä tai ei halua "
"vastaanottaa äänimerkkejä tällä hetkellä."
-#, c-format
-msgid "Buzzing %s..."
-msgstr "Töötätään tuttavalle %s..."
-
#. Yahoo only supports one attention command: the 'buzz'.
#. This is index number YAHOO_BUZZ.
msgid "Buzz"
@@ -4520,6 +4531,10 @@
msgstr "%s on töötännyt sinulle."
#, c-format
+msgid "Buzzing %s..."
+msgstr "Töötätään tuttavalle %s..."
+
+#, c-format
msgid "Unable to initiate media with %s: invalid JID"
msgstr "Mediaa ei voi alustaa käyttäjän %s kanssa: virheellinen JID."
@@ -4554,9 +4569,8 @@
msgid "configure: Configure a chat room."
msgstr "configure: Konfiguroi ryhmäkeskusteluhuone."
-#, fuzzy
msgid "part [message]: Leave the room."
-msgstr "part [huone]: Poistu huoneesta."
+msgstr "part [viesti]: Poistu huoneesta."
msgid "register: Register with a chat room."
msgstr "register: Rekisteröidy ryhmäkeskusteluhuoneeseen."
@@ -4675,6 +4689,10 @@
msgid "(Code %s)"
msgstr "(Koodi %s)"
+#, fuzzy
+msgid "A custom smiley in the message is too large to send."
+msgstr "Viestiä ei voi lähettää: viesti on liian suuri."
+
msgid "XML Parse error"
msgstr "Virhe XML-jäsennyksessä"
@@ -5086,6 +5104,10 @@
msgid "Your new MSN friendly name is too long."
msgstr "Uusi MSN-tuttavanimesi on liian pitkä."
+#, c-format
+msgid "Set friendly name for %s."
+msgstr "Aseta tuttavanimi tilille %s."
+
msgid "Set your friendly name."
msgstr "Aseta tuttavanimesi."
@@ -5428,10 +5450,6 @@
msgid "Windows Live ID authentication:Invalid response"
msgstr "Windows Live ID -tunnistautuminen:Virheellinen vastaus"
-#, c-format
-msgid "%s just sent you a Nudge!"
-msgstr "Käyttäjä %s lähetti sinulle juuri tönäisyn!"
-
msgid "The following users are missing from your addressbook"
msgstr "Seuraavat käyttäjät puuttuvat osoitekirjastasi"
@@ -5447,9 +5465,8 @@
msgid "Unknown error (%d)"
msgstr "Tuntematon virhe (%d)"
-#, fuzzy
msgid "Unable to remove user"
-msgstr "Käyttäjää ei voi lisätä"
+msgstr "Käyttäjää ei voi poistaa"
msgid "Mobile message was not sent because it was too long."
msgstr "Mobiiliviestiä ei lähetetty, koska se on liian pitkä."
@@ -5685,28 +5702,86 @@
msgid "%s has removed you from his or her buddy list."
msgstr "%s on poistanut sinut tuttavistaan."
+#. 1
+msgid "Angry"
+msgstr "Vihainen"
+
+#. 2
+msgid "Excited"
+msgstr "Innostunut"
+
+#. 3
+msgid "Grumpy"
+msgstr "Äreä"
+
+#. 4
+msgid "Happy"
+msgstr "Onnellinen"
+
+#. 5
+msgid "In Love"
+msgstr "Rakastunut"
+
+#. 6
+msgid "Invincible"
+msgstr "Haavoittumaton"
+
+#. 7
+msgid "Sad"
+msgstr "Surullinen"
+
+#. 8
+msgid "Hot"
+msgstr "Tulinen"
+
+#. 9
+msgid "Sick"
+msgstr "Kipeä"
+
+#. 10
+msgid "Sleepy"
+msgstr "Unelias"
+
#. show current mood
-#, fuzzy
msgid "Current Mood"
-msgstr "Tämänhetkinen mielialasi"
+msgstr "Tämänhetkinen mieliala"
#. add all moods to list
-#, fuzzy
msgid "New Mood"
-msgstr "Käyttäjän mieliala"
-
-#, fuzzy
+msgstr "Uusi mieliala"
+
msgid "Change your Mood"
-msgstr "Vaihda salasana"
-
-#, fuzzy
+msgstr "Vaihda mielialaa"
+
msgid "How do you feel right now?"
-msgstr "En ole täällä juuri nyt"
+msgstr "Kuinka voit nyt?"
+
+#, fuzzy
+msgid "The PIN you entered is invalid."
+msgstr "Syötetty SecurID-avain on virheellinen"
+
+#, fuzzy
+msgid "The PIN you entered has an invalid length [4-10]."
+msgstr "Syötetty SecurID-avain on virheellinen"
+
+msgid "The PIN is invalid. It should only consist of digits [0-9]."
+msgstr ""
+
+#, fuzzy
+msgid "The two PINs you entered do not match."
+msgstr "Uudet salasanat eivät täsmää."
+
+#, fuzzy
+msgid "The name you entered is invalid."
+msgstr "Syötetty SecurID-avain on virheellinen"
+
+msgid ""
+"The birthday you entered is invalid. The correct format is: 'YYYY-MM-DD'."
+msgstr ""
#. show error to user
-#, fuzzy
msgid "Profile Update Error"
-msgstr "Virhe kirjoituksessa"
+msgstr "Virhe päivitettäessä profiilia"
#. no profile information yet, so we cannot update
#. (reference: "libpurple/request.h")
@@ -5717,30 +5792,26 @@
msgstr ""
#. pin
-#, fuzzy
msgid "PIN"
-msgstr "UIN"
+msgstr "PIN"
msgid "Verify PIN"
-msgstr ""
+msgstr "Varmista PIN"
#. display name
-#, fuzzy
msgid "Display Name"
-msgstr "Näyttö"
+msgstr "Näyttönimi"
#. hidden
msgid "Hide my number"
-msgstr ""
+msgstr "Piilota numeroni"
#. mobile number
-#, fuzzy
msgid "Mobile Number"
msgstr "Matkapuhelinnumero"
-#, fuzzy
msgid "Update your Profile"
-msgstr "Käyttäjän profiili"
+msgstr "Päivitä profiilia"
msgid "Here you can update your MXit profile"
msgstr ""
@@ -5757,14 +5828,12 @@
msgstr "Omat tiedot"
#. display / change mood
-#, fuzzy
msgid "Change Mood..."
-msgstr "Vaihda salasana..."
+msgstr "Vaihda mielialaa..."
#. display / change profile
-#, fuzzy
msgid "Change Profile..."
-msgstr "Vaihda salasana..."
+msgstr "Vaihda profiilia..."
#. display splash-screen
#, fuzzy
@@ -5772,49 +5841,53 @@
msgstr "Näytä loki..."
#. display plugin version
-#, fuzzy
msgid "About..."
-msgstr "Omat tiedot"
+msgstr "Tietoja..."
#. the file is too big
#, fuzzy
msgid "The file you are trying to send is too large!"
msgstr "Viesti on liian suuri."
-msgid ""
-"Unable to connect to the mxit HTTP server. Please check your server server "
-"settings."
-msgstr ""
-
-#, fuzzy
-msgid "Logging In..."
-msgstr "Kirjaudutaan sisään"
-
-#, fuzzy
-msgid ""
-"Unable to connect to the mxit server. Please check your server server "
-"settings."
+#, fuzzy
+msgid ""
+"Unable to connect to the MXit HTTP server. Please check your server settings."
msgstr ""
"Palvelimeen ei voi yhdistää. Ole hyvä, syötä palvelimen osoite jolle haluat "
"yhdistää."
-#, fuzzy
+msgid "Logging In..."
+msgstr "Kirjaudutaan sisään..."
+
+#, fuzzy
+msgid ""
+"Unable to connect to the MXit server. Please check your server settings."
+msgstr ""
+"Palvelimeen ei voi yhdistää. Ole hyvä, syötä palvelimen osoite jolle haluat "
+"yhdistää."
+
msgid "Connecting..."
-msgstr "Yhdistetään"
+msgstr "Yhdistetään..."
+
+#, fuzzy
+msgid "The nick name you entered is invalid."
+msgstr "Syötetty SecurID-avain on virheellinen"
+
+#, fuzzy
+msgid "The PIN you entered has an invalid length [7-10]."
+msgstr "Syötetty SecurID-avain on virheellinen"
#. mxit login name
msgid "MXit Login Name"
msgstr ""
#. nick name
-#, fuzzy
msgid "Nick Name"
msgstr "Kutsumanimi"
#. show the form to the user to complete
-#, fuzzy
msgid "Register New MXit Account"
-msgstr "Rekisteröi uusi XMPP-tili"
+msgstr "Rekisteröi uusi MXit-tili"
#, fuzzy
msgid "Please fill in the following fields:"
@@ -5892,6 +5965,10 @@
msgstr "Palvelimen tiedot"
#, fuzzy
+msgid "Loading menu..."
+msgstr "Kirjaudutaan sisään"
+
+#, fuzzy
msgid "Status Message"
msgstr "Tilaviesti"
@@ -5937,6 +6014,11 @@
msgid "Successfully Logged In..."
msgstr "Liityttiin onnistuneesti Quniin"
+#, fuzzy, c-format
+msgid ""
+"%s sent you an encrypted message, but it is not supported on this client."
+msgstr "%s on lähettänyt puhekeskustelukutsun, mitä ei vielä tueta."
+
#, fuzzy
msgid "Message Error"
msgstr "XMPP-viestivirhe"
@@ -5945,6 +6027,18 @@
msgstr ""
#, fuzzy
+msgid "An internal MXit server error occurred."
+msgstr "Tuntematon varmennevirhe."
+
+#, fuzzy, c-format
+msgid "Login error: %s (%i)"
+msgstr "SASL-virhe: %s"
+
+#, fuzzy, c-format
+msgid "Logout error: %s (%i)"
+msgstr "SASL-virhe: %s"
+
+#, fuzzy
msgid "Contact Error"
msgstr "Yhteysvirhe"
@@ -6019,39 +6113,6 @@
msgid "A connection error occurred to MXit. (read stage 0x06)"
msgstr ""
-msgid "Angry"
-msgstr "Vihainen"
-
-msgid "Excited"
-msgstr "Innostunut"
-
-#, fuzzy
-msgid "Grumpy"
-msgstr "Ryhmä"
-
-msgid "Happy"
-msgstr "Onnellinen"
-
-msgid "In Love"
-msgstr "Rakastunut"
-
-msgid "Invincible"
-msgstr "Haavoittumaton"
-
-msgid "Sad"
-msgstr "Surullinen"
-
-#, fuzzy
-msgid "Hot"
-msgstr "P_alvelin:"
-
-#, fuzzy
-msgid "Sick"
-msgstr "Kutsumanimi"
-
-msgid "Sleepy"
-msgstr "Unelias"
-
#, fuzzy
msgid "Pending"
msgstr "Lähetetään"
@@ -6064,16 +6125,14 @@
msgid "Rejected"
msgstr "Kieltäydy"
-#, fuzzy
msgid "Deleted"
-msgstr "Poista"
+msgstr "Poistettu"
msgid "MXit Advertising"
-msgstr ""
-
-#, fuzzy
+msgstr "MXit-mainostus"
+
msgid "More Information"
-msgstr "Työtiedot"
+msgstr "Lisätiedot"
#, c-format
msgid "No such user: %s"
@@ -6680,7 +6739,10 @@
msgid "Server port"
msgstr "Palvelimen portti"
-#. Note to translators: %s in this string is a URL
+#, fuzzy, c-format
+msgid "Received unexpected response from %s: %s"
+msgstr "Odottamaton vastaus osoitteesta %s"
+
#, c-format
msgid "Received unexpected response from %s"
msgstr "Odottamaton vastaus osoitteesta %s"
@@ -6699,6 +6761,11 @@
msgid "Error requesting %s: %s"
msgstr "Virhe pyydettäessä %s: %s"
+msgid ""
+"Server requested that you fill out a CAPTCHA in order to sign in, but this "
+"client does not currently support CAPTCHAs."
+msgstr ""
+
msgid "AOL does not allow your screen name to authenticate here"
msgstr "AOL ei salli näyttönimen todentamista tätä kautta"
@@ -6853,9 +6920,8 @@
msgid "Cannot send SMS without accepting terms"
msgstr ""
-#, fuzzy
msgid "Cannot send SMS"
-msgstr "Tiedoston lähetys ei onnistu"
+msgstr "Tekstiviestin (SMS) lähetys ei onnistu"
#. SMS_WITHOUT_DISCLAIMER is weird
#, fuzzy
@@ -7216,21 +7282,21 @@
msgstr[0] "Et saanut %hu viestiä %s:lta tuntemattomasta syystä."
msgstr[1] "Et saanut %hu viestiä %s:lta tuntemattomasta syystä."
-#, fuzzy, c-format
+#, c-format
msgid "Unable to send message: %s (%s)"
-msgstr "Viestiä ei voi lähettää (%s)."
+msgstr "Viestiä ei voi lähettää: %s (%s)"
#, c-format
msgid "Unable to send message: %s"
msgstr "Viestiä ei voi lähettää: %s"
-#, fuzzy, c-format
+#, c-format
msgid "Unable to send message to %s: %s (%s)"
-msgstr "Viestiä ei voi lähettää käyttäjälle %s."
-
-#, fuzzy, c-format
+msgstr "Viestiä ei voi lähettää käyttäjälle %s: %s (%s)."
+
+#, c-format
msgid "Unable to send message to %s: %s"
-msgstr "Viestiä ei voi lähettää käyttäjälle %s."
+msgstr "Viestiä ei voi lähettää käyttäjälle %s: %s"
#, c-format
msgid "User information not available: %s"
@@ -7259,14 +7325,6 @@
"[Viestiä tältä käyttäjältä ei voi näyttää koska se sisälsi epäkelpoja "
"merkkejä.]"
-#, fuzzy
-msgid ""
-"The last action you attempted could not be performed because you are over "
-"the rate limit. Please wait 10 seconds and try again.\n"
-msgstr ""
-"Viimeistä viestiä ei lähetetty koska olet ylittänyt taajuusrajan. Odota 10 "
-"sekuntia ja yritä uudelleen."
-
#, c-format
msgid "You have been disconnected from chat room %s."
msgstr "Yhteytesi keskusteluhuoneeseen %s on katkennut."
@@ -11121,9 +11179,18 @@
msgid "/Help/Online _Help"
msgstr "/Ohje/O_hjeita verkossa"
+msgid "/Help/_Build Information"
+msgstr "/Ohje/Ohjelman _rakennustiedot"
+
msgid "/Help/_Debug Window"
msgstr "/Ohje/_Virheenjäljitysikkuna"
+msgid "/Help/De_veloper Information"
+msgstr "/Ohje/_Kehittäjätiedot"
+
+msgid "/Help/_Translator Information"
+msgstr "/Help/Kääntäjä_tiedot"
+
msgid "/Help/_About"
msgstr "/Ohje/Tietoj_a"
@@ -11400,12 +11467,6 @@
msgid "Save Conversation"
msgstr "Tallenna keskustelu"
-msgid "Find"
-msgstr "Etsi"
-
-msgid "_Search for:"
-msgstr "_Haettava termi:"
-
msgid "Un-Ignore"
msgstr "Huomioi"
@@ -11479,6 +11540,9 @@
msgid "/Conversation/Se_nd File..."
msgstr "/Keskustelu/_Lähetä tiedosto..."
+msgid "/Conversation/Get _Attention"
+msgstr "/Keskustelu/Hae huomiot_a"
+
msgid "/Conversation/Add Buddy _Pounce..."
msgstr "/Keskustelu/Lisää tuttava_ilmoitin..."
@@ -11560,6 +11624,9 @@
msgid "/Conversation/Send File..."
msgstr "/Keskustelu/Lähetä tiedosto..."
+msgid "/Conversation/Get Attention"
+msgstr "/Keskustelu/Hae huomiota"
+
msgid "/Conversation/Add Buddy Pounce..."
msgstr "/Keskustelu/Lisää tuttavailmoitin..."
@@ -11624,6 +11691,12 @@
msgid "0 people in room"
msgstr "0 ihmistä huoneessa"
+msgid "Close Find bar"
+msgstr "Sulje hakupalkki"
+
+msgid "Find:"
+msgstr "Etsi:"
+
#, c-format
msgid "%d person in room"
msgid_plural "%d people in room"
@@ -11685,6 +11758,12 @@
msgid "By account"
msgstr "Tilin mukaan"
+msgid "Find"
+msgstr "Etsi"
+
+msgid "_Search for:"
+msgstr "_Haettava termi:"
+
msgid "Save Debug Log"
msgstr "Tallenna virheenjäljitysloki"
@@ -11903,15 +11982,20 @@
msgid "Lao"
msgstr "lao"
-msgid "Lithuanian"
-msgstr "liettua"
-
msgid "Macedonian"
msgstr "makedonia"
msgid "Mongolian"
msgstr "mongolia"
+#, fuzzy
+msgid "Marathi"
+msgstr "gudžarati"
+
+#, fuzzy
+msgid "Malay"
+msgstr "Mies"
+
msgid "Bokmål Norwegian"
msgstr "kirjanorja"
@@ -11927,6 +12011,10 @@
msgid "Occitan"
msgstr "oksitaani"
+#, fuzzy
+msgid "Oriya"
+msgstr "Opera"
+
msgid "Punjabi"
msgstr "punjabi"
@@ -11981,6 +12069,10 @@
msgid "Turkish"
msgstr "turkki"
+#, fuzzy
+msgid "Ukranian"
+msgstr "ukraina"
+
msgid "Urdu"
msgstr "urdu"
@@ -12002,69 +12094,64 @@
msgid "Amharic"
msgstr "amhara"
+msgid "Lithuanian"
+msgstr "liettua"
+
+#, c-format
+msgid ""
+"%s is a messaging client based on libpurple which is capable of connecting "
+"to multiple messaging services at once. %s is written in C using GTK+. %s "
+"is released, and may be modified and redistributed, under the terms of the "
+"GPL version 2 (or later). A copy of the GPL is distributed with %s. %s is "
+"copyrighted by its contributors, a list of whom is also distributed with %"
+"s. There is no warranty for %s.
"
+msgstr ""
+"%s on graafinen libpurple-kirjastoon perustuva pikaviestinsovellus, joka "
+"kykenee samanaikaisesti yhdistämään useisiin eri viestinpalveluihin. %s on "
+"ohjelmoitu C-ohjelmointikielellä, käyttäen Gtk+-kirjastoa. Voit muokata ja "
+"jakaa %s-ohjelmistoa GPL-lisenssin (versio 2 tai myöhempi) ehdoilla. Kopio "
+"GPL:stä on sisällytetty %s-ohjelmistojakeluun. %sin tekijänoikeudet ovat sen "
+"tekemiseen osallistuneilla, joista täydellinen luettelo on niinikään "
+"sisällytetty %s-jakelupakettiin. %sille ei anneta minkäänlaista takuuta."
+"
"
+msgstr ""
+
+#, c-format
+msgid ""
+"Help from other Pidgin users is available by "
+"e-mailing support@pidgin.im This is a public mailing list! (archive) We can't help with third-party protocols or "
+"plugins! This list's primary language is English. You are "
+"welcome to post in another language, but the responses may be less helpful."
+" "
+msgstr ""
+"Apua muilta Pidgin-käyttäjiltä:support@pidgin.im Tämä on julkinen"
+"b> sähköpostilista! (arkisto) Emme voi auttaa kolmannen osapuolen yhteyskäytännöissä "
+"tai liitännäisissä. Tämän listan pääkieli on englanti. Voit "
+"käyttää myös muuta kieltä, mutta auttavan vastauksen saaminen voi tällöin "
+"olla hankalampaa. "
+
#, c-format
msgid "About %s"
msgstr "Tietoja %sistä"
-#, c-format
-msgid ""
-"%s is a graphical modular messaging client based on libpurple which is "
-"capable of connecting to AIM, MSN, Yahoo!, XMPP, ICQ, IRC, SILC, SIP/SIMPLE, "
-"Novell GroupWise, Lotus Sametime, Bonjour, Zephyr, MySpaceIM, Gadu-Gadu, and "
-"QQ all at once. It is written using GTK+.
You may modify and "
-"redistribute the program under the terms of the GPL (version 2 or later). A "
-"copy of the GPL is contained in the 'COPYING' file distributed with %s. %s "
-"is copyrighted by its contributors. See the 'COPYRIGHT' file for the "
-"complete list of contributors. We provide no warranty for this program."
-"
"
-msgstr ""
-"%s on graafinen ja modulaarinen libpurple-kirjastoon perustuva "
-"pikaviestinsovellus, joka kykenee käyttämään AIM-, MSN-, Yahoo!-, XMPP-, "
-"ICQ-, IRC-, SILC-, SIP/SIMPLE-, Novell GroupWise-, Lotus Sametime-, "
-"Bonjour-, Zephyr-, MySpaceIM-, Gadu-Gadu- ja QQ-yhteyskäytäntöjä "
-"samanaikaisesti. Se on ohjelmoitu käyttäen Gtk+-kirjastoa.
Voit "
-"muokata ja jakaa ohjelmaa GPL-lisenssin (versio 2 tai myöhempi) ehdoilla. "
-"Kopio GPL:stä on sisällytetty \"COPYING\"-tiedostoon, joka tulee %sin "
-"mukana. %sin tekijänoikeudet on sen tekemiseen osallistuneilla. Täydellinen "
-"luettelo osallistuneista löytyy \"COPYRIGHT\"-tiedostosta. Tekijät eivät "
-"anna ohjelmalle minkäänlaista takuuta.
"
-
-#, c-format
-msgid ""
-"Help from other Pidgin users: support@pidgin.im This is a public "
-"mailing list! (archive)"
-" We can't help with 3rd party protocols or plugins! This list's "
-"primary language is English. You are welcome to post in another "
-"language, but the responses may be less helpful.