yifa101/Get Christian Louboutin Heels - More Charm ( AutoIt)
christian louboutin shoes, should really you be hoping to obtain Christian louboutin shoess, the internet is most almost certainly the place to seem. You won't quickly consist of several of substitute suggestions. You'll incorporate the vitality to recognize cost-effective genuine christian louboutin online. The wish with owning a tiny with only 1 really handful of Christian louboutin trainers will unquestionably arise the undeniable actuality as well as internet web pages providing additionally one of the most cost-effective worth. For example, for people who technique for bundled with these sorts of to do, could you precisely like only 1 one spot as well as additionally enormous sends as well as very exceptional gradations. Even so, if they're about components as well as particular circumstances, subsequent metal and too shimmering types as well as enormous sends are ordinarily cautioned. In addition, it actually is most efficient to become in a location to completely within practically any respect conditions evaluate beneath account the apparel if deciding on which could enormous sends to apply. For example, o2 highest 90 times and nights christian louboutin profit design amazing as well as denims however it certainly will unquestionably feasible turn out to become shockingly unpleasant for people who gambling these sorts of owning a speedy major and too very simple thigh and also legs. That will commence the market place marketplace most recent just one shop inmost banc pencils for the within positive aspects toward assortment without having doubt in which consists of these sorts of provide you make use on the fantastic assortment generating in which high-class vendor presents youngster ought to be consist of the unique Mont banc pencils. It isn't that way ordinarily all of the same. Squared trainers, christian louboutin sale lower price shoes, without having all of them extra maker as well as discover, technique the particular cost-effective Jordan's sneaker and visual aspect throughout particularly about identical most people today just about every single just one just about every single personal as well as females forward favor to arrive to obtain the particular cost-effective Jordan's critical within most style and design and too design. Most of those spot not almost certainly earlier uncertainty turn out to become youngster ought to be proceed forward spot as quickly as again, as well as prolonged pond about angel is heading to become heading looking for much a great deal more when in comparison with trouble-free actuality precisely how the heartbeat reaches evaluation as well as most people christian louboutin outlet today just about every single just one just about every single some other. http://dirthaiweio.blogspot.com/2011/05/more-charm-christian-louboutin-heels.html
serialk89/Request data from URL iframe Facebook app ( PHP)
<?php // THE MAGIC SAUCE $signed_request = $facebook->getSignedRequest(); $page_id = $signed_request["page"]["id"]; $like_status = $signed_request["page"]["liked"]; // HERE IS A STRING OF YOUR APP DATA. $app_data = $signed_request["app_data"]; echo '$app_data = '.$app_data; ?>
Rescato variables desde un iframe con $signed_request
bonalepo/Facebook tab application: expand iframe to max ( JavaScript)
<!-- FACEBOOK REMOVE SCROLL ========================================= -->
<script type="text/javascript" src="https://connect.facebook.net/en_US/all.js#xfbml=1"></script>
<script type="text/javascript">
window.fbAsyncInit = function() {
FB.init({
appId: 'APP-ID',
});
FB.Canvas.setAutoGrow();
}
</script>
<style>
body{overflow:hidden;}
</style>
removes scrollbars and expand to content height.
ihatetomatoes/WP - Add Twitter and Facebook Buttons to Your Posts ( PHP)
<?php
function share_this($content){
if(!is_feed() && !is_home()) {
$content .= '<div class="share-this">
<a href="http://twitter.com/share"
class="twitter-share-button"
data-count="horizontal">Tweet</a>
<script type="text/javascript"
src="http://platform.twitter.com/widgets.js"></script>
<div class="facebook-share-button">
<iframe
src="http://www.facebook.com/plugins/like.php?href='.
urlencode(get_permalink($post->ID))
.'&amp;layout=button_count&amp;show_faces=false&amp;width=200&amp;action=like&amp;colorscheme=light&amp;height=21"
scrolling="no" frameborder="0" style="border:none;
overflow:hidden; width:200px; height:21px;"
allowTransparency="true"></iframe>
</div>
</div>';
}
return $content;
}
add_action('the_content', 'share_this');
?>
chopbust/Get Next Auto-increment number in the table ( PHP)
$r = mysql_query("SHOW TABLE STATUS LIKE 'table_name' ");
$row = mysql_fetch_array($r);
$Auto_increment = $row['Auto_increment'];
BlueIceStudios/Nivo Slider Auto Thumbs with TimThumb ( HTML)
Get yourself the TimThumb source and put it in the root of your site.
Create a folder in the root of your site named cache and set the permissions to 777.
Now open your nivo slider js file. Im using jquery.nivo.slider.pack.js, search for the first nivo-control.
<a rel="'+k+'"><img src="'+f.attr("rel")+'" alt="" /></a>
Now replace that with
<a rel="'+k+'"><img src="timthumb.php?src='+f.attr("src")+'&h=19&w=35" alt="" /></a>
The changes made are the timthumb.php addition to the image src and the attr change to src.
timthumb.php?src='+f.attr("src")+'&h=19&w=35
adjust the h= and w= to your liking.
Save the file and your good to go, no need to make thumbnails or anything else to the img tag in your nivo slider.
If you would like installation help just contact me via skype: blueicestudios
Just a quick and painless way to add thumbnail support to the Nivo Slider with TimThumb.
tanerliq/Auto completar un textbox desde una BD ( Visual Basic)
Public KeyRetroceso As Boolean
Private Sub TDESCRIPCION_BREVE_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
If KeyCode = vbKeyBack Or KeyCode = vbKeyDelete Then
' ..si hay texto en el Textbox
If Len(TDESCRIPCION_BREVE.Text) <> 0 Then
KeyRetroceso = True
End If
End If
End Sub
Function Autocompletar_FlexGrid(TBox As Object, texto As String)
'buscar las coincidencias de las descripcion breves ya ingresadas al sistema _
si las carga en el textbox de pantalla
Dim i As Integer
Dim pos_SelStart As Integer
Dim rst As ADODB.Recordset
Set rst = New ADODB.Recordset
rst.Open "select descripcion_breve from ot where descripcion_breve like '" & texto & "%'", cnt, adOpenStatic
If rst.EOF <> True Then
If (KeyRetroceso Or Len(TBox.Text) = 0) Then
KeyRetroceso = False
Exit Function
End If
pos_SelStart = TBox.SelStart
TBox.Text = rst!DESCRIPCION_BREVE
TBox.SelStart = pos_SelStart
TBox.SelLength = Len(rst!DESCRIPCION_BREVE) - pos_SelStart
End If
rst.Close
End Function
Luke Dickens/Auto-Initialisation with default attribute values ( python)
### The suggested superclass ###
class AutoInit (object) :
"""
Each class that inherits from AutoInit (directly or indirectly) can
specify all standard attributes and their initials in dictionary called
classinitials.
Important: if used, it is recommended to specify an attribute with default value None (for copy constructor)
"""
def get_initials(self):
# list of classes in inheritance list (superclasses first)
# care should be taken with multiple inheritance,
# if unsure of class heirachy then overide all initials in originating class.
clss = list(self.__class__.__mro__)
clss.reverse()
initials = {}
for cls in clss:
if hasattr(cls,'classinitials'):
initials.update(getattr(cls,'classinitials'))
return initials
initials = property( get_initials )
def __init__(self, *args, **kwargs) :
# check that the class-attribute 'classinitials' exists
if not hasattr(self, 'initials') : return
# if arg is same type as this then copy construct
if len(args) > 0 and self.__class__ == args[0].__class__ :
arg = args[0] # first element in args is now object to copy
# for each attribute in classinitials copy from arg.attribute to this.attribute
for attribute in self.initials :
setattr(self, attribute, getattr(arg, attribute))
# where args is empty or first arg is not of same class then ignore.
# insted copy all present managed attributes from kwargs dictionary
# where not present get default from initials dictionary.
else :
for attribute in self.initials :
if attribute in kwargs :
setattr(self, attribute, kwargs[attribute])
else :
setattr(self, attribute, self.initials[attribute])
def get_managed_dict(self):
"""
Returns a dictionary of objects attributes, where attribute names are given in self.initials
"""
return dict([ (k,getattr(self,k)) for k in self.initials ])
def __str__(self):
return str(self.get_managed_dict())
### example subclasses ###
class A(AutoInit):
classinitials = { 'attr1' : 'set from A' }
def __init__(self,*args,**kwargs):
AutoInit.__init__(self,*args,**kwargs)
class B(A):
classinitials = { 'attr2' : 'set from B' }
def __init__(self,*args,**kwargs):
A.__init__(self,*args,**kwargs)
class C(B):
classinitials = { 'attr1' : 'set from C',
'attr3' : 'set from C' }
def __init__(self,*args,**kwargs):
B.__init__(self,*args,**kwargs)
### example usage ###
def test():
a = A()
b = B()
c1 = C()
c2 = C(attr1='set by constructor argument to c2')
c3 = C(c2)
print "Initialised objects:"
print "a:",a
print "b:",b
print "c1:",c1
print "c2:",c2
print "c3:",c3
print
## objects can then be used normally ##
c1.attr1 = 'set externally'
print "After manual set operation:"
print "c1:",c1
### run from command line if you like ###
if __name__ == '__main__':
test()
This is a class adapted from one that performs a similar task in the PyML libraries by Asa Ben-Hur et al (see: http://pyml.sourceforge.net/).
The intention is to speed up development time, by allowing managed attribute names (and their default values) to be specified in a dictionary belonging to each class (here called classinitials). This avoids rewriting the standard initialisation procedure many times over.
Subclasses inherit all superclasses' managed attributes, including the defaults unless overridden. This is found in the property initials. The copy constructor copies all managed attributes.
Finally, any named argument to the __init__ function, whose name appears in the managed attributes dictionary, overrides the class default.
I welcome any comments, criticism or suggested improvements.
andrewkolesnikov/LiveJournal auto post comments ( Python)
#!/usr/bin/python
# -*- coding: utf-8 -*-
# code by andrewkolesnikov.com
import re
import sys
import time
import random
import feedparser
import logging
from datetime import datetime
from mechanize import Browser
class LJAutoComment:
def __init__(self, url = 'http://tema.livejournal.com/data/rss', username = '', password = '', comments = [], age_threshold = 0.5, interval= 5, logLevel = logging.DEBUG):
self.__dry = False
self.__url = url
self.__comments = comments
self.__username = username
self.__password = password
self.__age_threshold = age_threshold
self.__log_filename = '/tmp/posts_' + self.__slugify(url)
self.__interval = interval
logging.basicConfig(level=logLevel)
def generate_comment(self, entry):
comment = random.choice(self.__comments);
theID = re.match(r"\D*(\d*).*", entry.link).group(1);
return comment + (' <img src="http://andrewkolesnikov.com/img/%s.jpg" >' % int(theID))
def __call__(self, dry = False):
self.__dry = dry
if self.__dry:
logging.info('Dry-run. Comments will not be posted.')
logging.info('Fetching RSS feed: ' + self.__url);
while True:
self.__feed = feedparser.parse(self.__url)
entry = self.__feed.entries[0]
if not entry:
logging.error('Couldn\'t fetch the RSS feed from %s', self.__url)
logging.info('Latest entry is: ' + entry['title']);
if self.is_commentable(entry):
logging.info('Entry is commentable.');
self.post_comment(entry, self.generate_comment(entry))
self.log_write(entry.link)
else:
logging.info('Entry isn\'t commentable. Skipping..');
logging.info('Sleeping for %d seconds.', self.__interval);
time.sleep(self.__interval)
logging.info('Done.');
def is_commentable(self, entry):
postedHoursAgo = (time.mktime(time.gmtime()) - time.mktime(entry.updated_parsed)) / 3600
logging.info('Entry posted %f hours ago, threshold is %1.2f hours', postedHoursAgo, self.__age_threshold);
alreadyCommented = self.log_check(entry.link);
if alreadyCommented:
logging.info('Already commented on this entry.');
if (postedHoursAgo < self.__age_threshold) and not alreadyCommented:
return True
return False
def post_comment(self, entry, comment):
br = Browser()
br.open(entry.link + '?mode=reply')
br.select_form(nr=0)
br['usertype'] = ['user']
br['userpost'] = self.__username
br['password'] = self.__password
br['body'] = comment.encode('utf8');
if not self.__dry:
logging.info('Posting the comment..')
br.submit()
print br.response()
else:
logging.info('Pretending to be posting the comment.. (dry run)')
def log_check(self, link):
"""docstring for log_check"""
try:
log = open(self.__log_filename, 'r+')
line = 1
while line:
line = log.readline()
logging.debug('Checking link: %s against %s', link, line);
if line.find(link) >= 0:
log.close()
return True;
log.close()
except Exception, e:
pass
return False
def log_write(self, link):
"""docstring for log_write"""
logging.debug('Writing link: %s to %s', link, self.__log_filename);
log = open(self.__log_filename, 'w+')
log.write(link + "
")
log.close()
def __slugify(self, inStr):
removelist = ["a", "an", "as", "at", "before", "but", "by", "for","from","is", "in", "into", "like", "of", "off", "on", "onto","per","since", "than", "the", "this", "that", "to", "up", "via","with"];
for a in removelist:
aslug = re.sub(r'\b'+a+r'\b','',inStr)
aslug = re.sub('[^\w\s-]', '', aslug).strip().lower()
aslug = re.sub('\s+', '-', aslug)
return aslug
if __name__ == '__main__':
comments = [u'я подумал тебе стоит начать выкладывать видеопосты. Я уже заебался читать. Второуровневики сосут хуй.',
u'послушай сюда. Я отсюда из Бостона вижу недоебит в твоих глазах. Второуровневики сосут хуй.',
u'тут недавно у кого-то в статусе увидел: Чупа-чупс со вкусом лука, соси и плачь тупая сука) ',
u'Мне в команду в Бостонский офис нужен iPhone-разработчик. Подскажешь кого-нибудь? Второуровневики сосут хуй.',
u'Всегда интересно было спросить Второуровневики сосут хуй.',
u'Я хотел сказать, приду к тебе в ресторан, проебу $100. Просто потому что могу блять. Второуровневики сосут хуй.',
u'Вот да, как всегда хуйня какая-то. Я бы уже стал выкладывать видеопосты и не ебать читателям мозги. Второуровневики сосут хуй.',
u'что ты думаешь про грядущую смерть Флеша? Почему начал диверсификацию, доходы упали? Приедешь в Бостон пивом угощу. Второуровневики сосут хуй.']
engine = LJAutoComment('http://target-blog-name.livejournal.com/data/rss', 'myusername', 'mypassword', comments, 5)
engine()
This code allows automatically posting comments to LiveJournal to be the first commenter.
Usage: $ python auto-post-comment.py
karlhorky/AutoHotkey: NiftyWindows Mod ( Other)
/*
* Copyright (c) 2004-2005 by Enovatic-Solutions. All rights reserved.
*
* 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
* ----------------------------------------------------------------------
* If you have any suggestions of new features or further questions
* feel free to contact the author.
*
* Company: Enovatic-Solutions (IT Service Provider)
* Author: Oliver Pfeiffer, Bremen (GERMANY)
* Homepage: http://www.enovatic.org/
* Email: contact@enovatic.org
*/
; NiftyWindows Version 0.9.3.1
; http://www.enovatic.org/products/niftywindows/
; AutoHotkey Version 1.0.36.01
; http://www.autohotkey.com/
#SingleInstance force
#HotkeyInterval 1000
#MaxHotkeysPerInterval 100
#NoTrayIcon
; [SYS] autostart section
SplitPath, A_ScriptFullPath, SYS_ScriptNameExt, SYS_ScriptDir, SYS_ScriptExt, SYS_ScriptNameNoExt, SYS_ScriptDrive
SYS_ScriptVersion = 0.9.3.1
SYS_ScriptBuild = 20050702195845
SYS_ScriptInfo = %SYS_ScriptNameNoExt% %SYS_ScriptVersion%
Process, Priority, , HIGH
SetBatchLines, -1
; TODO : a nulled key delay may produce problems for WinAmp control
SetKeyDelay, 0, 0
SetMouseDelay, 0
SetDefaultMouseSpeed, 0
SetWinDelay, 0
SetControlDelay, 0
Gosub, SYS_ParseCommandLine
Gosub, CFG_LoadSettings
Gosub, CFG_ApplySettings
MIR_MirandaFullPath = %ProgramFiles%\Miranda\Miranda32.exe
SplitPath, MIR_MirandaFullPath, , MIR_MirandaDir
if ( !A_IsCompiled )
SetTimer, REL_ScriptReload, 1000
OnExit, SYS_ExitHandler
Gosub, TRY_TrayInit
Gosub, SYS_ContextCheck
Gosub, UPD_AutoCheckForUpdate
Return
; [SYS] parses command line parameters
SYS_ParseCommandLine:
Loop %0%
If ( (%A_Index% = "/x") or (%A_Index% = "/exit") )
ExitApp
Return
; [SYS] exit handler
SYS_ExitHandler:
Gosub, AOT_ExitHandler
Gosub, ROL_ExitHandler
Gosub, TRA_ExitHandler
Gosub, CFG_SaveSettings
ExitApp
; [SYS] context check
SYS_ContextCheck:
Gosub, SYS_TrayTipBalloonCheck
If ( !SYS_TrayTipBalloon )
{
Gosub, SUS_SuspendSaveState
Suspend, On
MsgBox, 4148, Balloon Handler - %SYS_ScriptInfo%, The balloon messages are disabled on your system. These visual messages`nabove the system tray are often used by tools as additional information four`nyour interest.`n`nNiftyWindows uses balloon messages to show you some important operating`ndetails. If you leave the messages disabled NiftyWindows will show some plain`nmessages as tooltips instead (in front of the system tray).`n`nDo you want to enable balloon messages now (highly recommended)?
Gosub, SUS_SuspendRestoreState
IfMsgBox, Yes
{
SYS_TrayTipBalloon = 1
RegWrite, REG_DWORD, HKEY_CURRENT_USER, Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced, EnableBalloonTips, %SYS_TrayTipBalloon%
RegWrite, REG_DWORD, HKEY_LOCAL_MACHINE, Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced, EnableBalloonTips, %SYS_TrayTipBalloon%
SendMessage, 0x001A, , , , ahk_id 0xFFFF ; 0x001A is WM_SETTINGCHANGE ; 0xFFFF is HWND_BROADCAST
Sleep, 500 ; lets the other windows relax
}
}
IfNotExist, %A_ScriptDir%\readme.txt
{
TRY_TrayEvent := "Help"
Gosub, TRY_TrayEvent
Suspend, On
Sleep, 10000
ExitApp, 1
}
IfNotExist, %A_ScriptDir%\license.txt
{
TRY_TrayEvent := "View License"
Gosub, TRY_TrayEvent
Suspend, On
Sleep, 10000
ExitApp, 1
}
TRY_TrayEvent := "About"
Gosub, TRY_TrayEvent
Return
; [SYS] handles tooltips
SYS_ToolTipShow:
If ( SYS_ToolTipText )
{
If ( !SYS_ToolTipSeconds )
SYS_ToolTipSeconds = 2
SYS_ToolTipMillis := SYS_ToolTipSeconds * 1000
CoordMode, Mouse, Screen
CoordMode, ToolTip, Screen
If ( !SYS_ToolTipX or !SYS_ToolTipY )
{
MouseGetPos, SYS_ToolTipX, SYS_ToolTipY
SYS_ToolTipX += 16
SYS_ToolTipY += 24
}
ToolTip, %SYS_ToolTipText%, %SYS_ToolTipX%, %SYS_ToolTipY%
SetTimer, SYS_ToolTipHandler, %SYS_ToolTipMillis%
}
SYS_ToolTipText =
SYS_ToolTipSeconds =
SYS_ToolTipX =
SYS_ToolTipY =
Return
SYS_ToolTipFeedbackShow:
If ( SYS_ToolTipFeedback )
Gosub, SYS_ToolTipShow
SYS_ToolTipText =
SYS_ToolTipSeconds =
SYS_ToolTipX =
SYS_ToolTipY =
Return
SYS_ToolTipHandler:
SetTimer, SYS_ToolTipHandler, Off
ToolTip
Return
; [SYS] handles balloon messages
SYS_TrayTipShow:
If ( SYS_TrayTipText )
{
If ( !SYS_TrayTipTitle )
SYS_TrayTipTitle = %SYS_ScriptInfo%
If ( !SYS_TrayTipSeconds )
SYS_TrayTipSeconds = 10
If ( !SYS_TrayTipOptions )
SYS_TrayTipOptions = 17
SYS_TrayTipMillis := SYS_TrayTipSeconds * 1000
Gosub, SYS_TrayTipBalloonCheck
If ( SYS_TrayTipBalloon and !A_IconHidden )
{
TrayTip, %SYS_TrayTipTitle%, %SYS_TrayTipText%, %SYS_TrayTipSeconds%, %SYS_TrayTipOptions%
SetTimer, SYS_TrayTipHandler, %SYS_TrayTipMillis%
}
Else
{
TrayTip
SYS_ToolTipText = %SYS_TrayTipTitle%:`n`n%SYS_TrayTipText%
SYS_ToolTipSeconds = %SYS_TrayTipSeconds%
SysGet, SYS_TrayTipDisplay, Monitor
SYS_ToolTipX = %SYS_TrayTipDisplayRight%
SYS_ToolTipY = %SYS_TrayTipDisplayBottom%
Gosub, SYS_ToolTipShow
}
}
SYS_TrayTipTitle =
SYS_TrayTipText =
SYS_TrayTipSeconds =
SYS_TrayTipOptions =
Return
SYS_TrayTipHandler:
SetTimer, SYS_TrayTipHandler, Off
TrayTip
Return
SYS_TrayTipBalloonCheck:
RegRead, SYS_TrayTipBalloonCU, HKEY_CURRENT_USER, Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced, EnableBalloonTips
SYS_TrayTipBalloonCU := ErrorLevel or SYS_TrayTipBalloonCU
RegRead, SYS_TrayTipBalloonLM, HKEY_LOCAL_MACHINE, Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced, EnableBalloonTips
SYS_TrayTipBalloonLM := ErrorLevel or SYS_TrayTipBalloonLM
SYS_TrayTipBalloon := SYS_TrayTipBalloonCU and SYS_TrayTipBalloonLM
Return
; [SUS] provides suspend services
#Esc::
SUS_SuspendToggle:
Suspend, Permit
If ( !A_IsSuspended )
{
Suspend, On
SYS_TrayTipText = NiftyWindows is suspended now.`nPress WIN+ESC to resume it again.
SYS_TrayTipOptions = 2
}
Else
{
Suspend, Off
SYS_TrayTipText = NiftyWindows is resumed now.`nPress WIN+ESC to suspend it again.
}
Gosub, SYS_TrayTipShow
Gosub, TRY_TrayUpdate
Return
SUS_SuspendSaveState:
SUS_Suspended := A_IsSuspended
Return
SUS_SuspendRestoreState:
If ( SUS_Suspended )
Suspend, On
Else
Suspend, Off
Return
SUS_SuspendHandler:
IfWinActive, A
{
WinGet, SUS_WinID, ID
If ( !SUS_WinID )
Return
WinGet, SUS_WinMinMax, MinMax, ahk_id %SUS_WinID%
WinGetPos, SUS_WinX, SUS_WinY, SUS_WinW, SUS_WinH, ahk_id %SUS_WinID%
If ( (SUS_WinMinMax = 0) and (SUS_WinX = 0) and (SUS_WinY = 0) and (SUS_WinW = A_ScreenWidth) and (SUS_WinH = A_ScreenHeight) )
{
WinGetClass, SUS_WinClass, ahk_id %SUS_WinID%
WinGet, SUS_ProcessName, ProcessName, ahk_id %SUS_WinID%
SplitPath, SUS_ProcessName, , , SUS_ProcessExt
If ( (SUS_WinClass != "Progman") and (SUS_ProcessExt != "scr") and !SUS_FullScreenSuspend )
{
SUS_FullScreenSuspend = 1
SUS_FullScreenSuspendState := A_IsSuspended
If ( !A_IsSuspended )
{
Suspend, On
SYS_TrayTipText = A full screen window was activated.`nNiftyWindows is suspended now.`nPress WIN+ESC to resume it again.
SYS_TrayTipOptions = 2
Gosub, SYS_TrayTipShow
Gosub, TRY_TrayUpdate
}
}
}
Else
{
If ( SUS_FullScreenSuspend )
{
SUS_FullScreenSuspend = 0
If ( A_IsSuspended and !SUS_FullScreenSuspendState )
{
Suspend, Off
SYS_TrayTipText = A full screen window was deactivated.`nNiftyWindows is resumed now.`nPress WIN+ESC to suspend it again.
Gosub, SYS_TrayTipShow
Gosub, TRY_TrayUpdate
}
}
}
}
Return
; [SYS] provides reversion of all visual effects
/**
* This powerful hotkey removes all visual effects (like on exit) that have
* been made before by NiftyWindows. You can use this action as a fall-back
* solution to quickly revert any always-on-top, rolled windows and
* transparency features you've set before.
*/
^#BS::
^!BS::
SYS_RevertVisualEffects:
Gosub, AOT_SetAllOff
Gosub, ROL_RollDownAll
Gosub, TRA_TransparencyAllOff
SYS_TrayTipText = All visual effects (AOT, Roll, Transparency) were reverted.
Gosub, SYS_TrayTipShow
Return
; [NWD] nifty window dragging
/**
* This is the most powerful feature of NiftyWindows. The area of every window
* is tiled in a virtual 9-cell grid with three columns and rows. The center
* cell is the largest one and you can grab and move a window around by clicking
* and holding it with the right mouse button. The other eight corner cells are
* used to resize a resizable window in the same manner.
*/
$RButton::
$+RButton::
$+!RButton::
$+^RButton::
$+#RButton::
$+!^RButton::
$+!#RButton::
$+^#RButton::
$+!^#RButton::
$!RButton::
$!^RButton::
$!#RButton::
$!^#RButton::
$^RButton::
$^#RButton::
$#RButton::
NWD_ResizeGrids = 5
CoordMode, Mouse, Screen
MouseGetPos, NWD_MouseStartX, NWD_MouseStartY, NWD_WinID
If ( !NWD_WinID )
Return
WinGetPos, NWD_WinStartX, NWD_WinStartY, NWD_WinStartW, NWD_WinStartH, ahk_id %NWD_WinID%
WinGet, NWD_WinMinMax, MinMax, ahk_id %NWD_WinID%
WinGet, NWD_WinStyle, Style, ahk_id %NWD_WinID%
WinGetClass, NWD_WinClass, ahk_id %NWD_WinID%
GetKeyState, NWD_CtrlState, Ctrl, P
; the and'ed condition checks for popup window:
; (WS_POPUP) and !(WS_DLGFRAME | WS_SYSMENU | WS_THICKFRAME)
If ( (NWD_WinClass = "Progman") or ((NWD_CtrlState = "U") and (((NWD_WinStyle & 0x80000000) and !(NWD_WinStyle & 0x4C0000)) or (NWD_WinClass = "ExploreWClass") or (NWD_WinClass = "CabinetWClass") or (NWD_WinClass = "IEFrame") or (NWD_WinClass = "MozillaWindowClass") or (NWD_WinClass = "OpWindow") or (NWD_WinClass = "ATL:ExplorerFrame") or (NWD_WinClass = "ATL:ScrapFrame"))) )
{
NWD_ImmediateDownRequest = 1
NWD_ImmediateDown = 0
NWD_PermitClick = 1
}
Else
{
NWD_ImmediateDownRequest = 0
NWD_ImmediateDown = 0
NWD_PermitClick = 1
}
NWD_Dragging := (NWD_WinClass != "Progman") and ((NWD_CtrlState = "D") or ((NWD_WinMinMax != 1) and !NWD_ImmediateDownRequest))
; checks wheter the window has a sizing border (WS_THICKFRAME)
If ( (NWD_CtrlState = "D") or (NWD_WinStyle & 0x40000) )
{
If ( (NWD_MouseStartX >= NWD_WinStartX + NWD_WinStartW / NWD_ResizeGrids) and (NWD_MouseStartX <= NWD_WinStartX + (NWD_ResizeGrids - 1) * NWD_WinStartW / NWD_ResizeGrids) )
NWD_ResizeX = 0
Else
If ( NWD_MouseStartX > NWD_WinStartX + NWD_WinStartW / 2 )
NWD_ResizeX := 1
Else
NWD_ResizeX := -1
If ( (NWD_MouseStartY >= NWD_WinStartY + NWD_WinStartH / NWD_ResizeGrids) and (NWD_MouseStartY <= NWD_WinStartY + (NWD_ResizeGrids - 1) * NWD_WinStartH / NWD_ResizeGrids) )
NWD_ResizeY = 0
Else
If ( NWD_MouseStartY > NWD_WinStartY + NWD_WinStartH / 2 )
NWD_ResizeY := 1
Else
NWD_ResizeY := -1
}
Else
{
NWD_ResizeX = 0
NWD_ResizeY = 0
}
If ( NWD_WinStartW and NWD_WinStartH )
NWD_WinStartAR := NWD_WinStartW / NWD_WinStartH
Else
NWD_WinStartAR = 0
; TODO : this is a workaround (checks for popup window) for the activation
; bug of AutoHotkey -> can be removed as soon as the known bug is fixed
If ( !((NWD_WinStyle & 0x80000000) and !(NWD_WinStyle & 0x4C0000)) )
IfWinNotActive, ahk_id %NWD_WinID%
WinActivate, ahk_id %NWD_WinID%
; TODO : the hotkeys must be enabled in the 2nd block because the 1st block
; activates them only for the first call (historical problem of AutoHotkey)
Hotkey, Shift, NWD_IgnoreKeyHandler
Hotkey, Ctrl, NWD_IgnoreKeyHandler
Hotkey, Alt, NWD_IgnoreKeyHandler
Hotkey, LWin, NWD_IgnoreKeyHandler
Hotkey, RWin, NWD_IgnoreKeyHandler
Hotkey, Shift, On
Hotkey, Ctrl, On
Hotkey, Alt, On
Hotkey, LWin, On
Hotkey, RWin, On
SetTimer, NWD_IgnoreKeyHandler, 100
SetTimer, NWD_WindowHandler, 10
Return
NWD_SetDraggingOff:
NWD_Dragging = 0
Return
NWD_SetClickOff:
NWD_PermitClick = 0
NWD_ImmediateDownRequest = 0
Return
NWD_SetAllOff:
Gosub, NWD_SetDraggingOff
Gosub, NWD_SetClickOff
Return
NWD_IgnoreKeyHandler:
GetKeyState, NWD_RButtonState, RButton, P
GetKeyState, NWD_ShiftState, Shift, P
GetKeyState, NWD_CtrlState, Ctrl, P
GetKeyState, NWD_AltState, Alt, P
; TODO : unlike the other modifiers, Win does not exist
; as a virtual key (but Ctrl, Alt and Shift do)
GetKeyState, NWD_LWinState, LWin, P
GetKeyState, NWD_RWinState, RWin, P
If ( (NWD_LWinState = "D") or (NWD_RWinState = "D") )
NWD_WinState = D
Else
NWD_WinState = U
If ( (NWD_RButtonState = "U") and (NWD_ShiftState = "U") and (NWD_CtrlState = "U") and (NWD_AltState = "U") and (NWD_WinState = "U") )
{
SetTimer, NWD_IgnoreKeyHandler, Off
Hotkey, Shift, Off
Hotkey, Ctrl, Off
Hotkey, Alt, Off
Hotkey, LWin, Off
Hotkey, RWin, Off
}
Return
NWD_WindowHandler:
SetWinDelay, -1
CoordMode, Mouse, Screen
MouseGetPos, NWD_MouseX, NWD_MouseY
WinGetPos, NWD_WinX, NWD_WinY, NWD_WinW, NWD_WinH, ahk_id %NWD_WinID%
GetKeyState, NWD_RButtonState, RButton, P
GetKeyState, NWD_ShiftState, Shift, P
GetKeyState, NWD_AltState, Alt, P
; TODO : unlike the other modifiers, Win does not exist
; as a virtual key (but Ctrl, Alt and Shift do)
GetKeyState, NWD_LWinState, LWin, P
GetKeyState, NWD_RWinState, RWin, P
If ( (NWD_LWinState = "D") or (NWD_RWinState = "D") )
NWD_WinState = D
Else
NWD_WinState = U
If ( NWD_RButtonState = "U" )
{
SetTimer, NWD_WindowHandler, Off
If ( NWD_ImmediateDown )
MouseClick, RIGHT, %NWD_MouseX%, %NWD_MouseY%, , , U
Else
If ( NWD_PermitClick and (!NWD_Dragging or ((NWD_MouseStartX = NWD_MouseX) and (NWD_MouseStartY = NWD_MouseY))) )
{
MouseClick, RIGHT, %NWD_MouseStartX%, %NWD_MouseStartY%, , , D
MouseClick, RIGHT, %NWD_MouseX%, %NWD_MouseY%, , , U
}
Gosub, NWD_SetAllOff
NWD_ImmediateDown = 0
}
Else
{
NWD_MouseDeltaX := NWD_MouseX - NWD_MouseStartX
NWD_MouseDeltaY := NWD_MouseY - NWD_MouseStartY
If ( NWD_MouseDeltaX or NWD_MouseDeltaY )
{
If ( NWD_ImmediateDownRequest and !NWD_ImmediateDown )
{
MouseClick, RIGHT, %NWD_MouseStartX%, %NWD_MouseStartY%, , , D
MouseMove, %NWD_MouseX%, %NWD_MouseY%
NWD_ImmediateDown = 1
NWD_PermitClick = 0
}
If ( NWD_Dragging )
{
If ( !NWD_ResizeX and !NWD_ResizeY )
{
NWD_WinNewX := NWD_WinStartX + NWD_MouseDeltaX
NWD_WinNewY := NWD_WinStartY + NWD_MouseDeltaY
NWD_WinNewW := NWD_WinStartW
NWD_WinNewH := NWD_WinStartH
}
Else
{
NWD_WinDeltaW = 0
NWD_WinDeltaH = 0
If ( NWD_ResizeX )
NWD_WinDeltaW := NWD_ResizeX * NWD_MouseDeltaX
If ( NWD_ResizeY )
NWD_WinDeltaH := NWD_ResizeY * NWD_MouseDeltaY
If ( NWD_WinState = "D" )
{
If ( NWD_ResizeX )
NWD_WinDeltaW *= 2
If ( NWD_ResizeY )
NWD_WinDeltaH *= 2
}
NWD_WinNewW := NWD_WinStartW + NWD_WinDeltaW
NWD_WinNewH := NWD_WinStartH + NWD_WinDeltaH
If ( NWD_WinNewW < 0 )
If ( NWD_WinState = "D" )
NWD_WinNewW *= -1
Else
NWD_WinNewW := 0
If ( NWD_WinNewH < 0 )
If ( NWD_WinState = "D" )
NWD_WinNewH *= -1
Else
NWD_WinNewH := 0
If ( (NWD_AltState = "D") and NWD_WinStartAR )
{
NWD_WinNewARW := NWD_WinNewH * NWD_WinStartAR
NWD_WinNewARH := NWD_WinNewW / NWD_WinStartAR
If ( NWD_WinNewW < NWD_WinNewARW )
NWD_WinNewW := NWD_WinNewARW
If ( NWD_WinNewH < NWD_WinNewARH )
NWD_WinNewH := NWD_WinNewARH
}
NWD_WinDeltaX = 0
NWD_WinDeltaY = 0
If ( NWD_WinState = "D" )
{
NWD_WinDeltaX := NWD_WinStartW / 2 - NWD_WinNewW / 2
NWD_WinDeltaY := NWD_WinStartH / 2 - NWD_WinNewH / 2
}
Else
{
If ( NWD_ResizeX = -1 )
NWD_WinDeltaX := NWD_WinStartW - NWD_WinNewW
If ( NWD_ResizeY = -1 )
NWD_WinDeltaY := NWD_WinStartH - NWD_WinNewH
}
NWD_WinNewX := NWD_WinStartX + NWD_WinDeltaX
NWD_WinNewY := NWD_WinStartY + NWD_WinDeltaY
}
If ( NWD_ShiftState = "D" )
NWD_WinNewRound = -1
Else
NWD_WinNewRound = 0
Transform, NWD_WinNewX, Round, %NWD_WinNewX%, %NWD_WinNewRound%
Transform, NWD_WinNewY, Round, %NWD_WinNewY%, %NWD_WinNewRound%
Transform, NWD_WinNewW, Round, %NWD_WinNewW%, %NWD_WinNewRound%
Transform, NWD_WinNewH, Round, %NWD_WinNewH%, %NWD_WinNewRound%
If ( (NWD_WinNewX != NWD_WinX) or (NWD_WinNewY != NWD_WinY) or (NWD_WinNewW != NWD_WinW) or (NWD_WinNewH != NWD_WinH) )
{
WinMove, ahk_id %NWD_WinID%, , %NWD_WinNewX%, %NWD_WinNewY%, %NWD_WinNewW%, %NWD_WinNewH%
If ( SYS_ToolTipFeedback )
{
WinGetPos, NWD_ToolTipWinX, NWD_ToolTipWinY, NWD_ToolTipWinW, NWD_ToolTipWinH, ahk_id %NWD_WinID%
SYS_ToolTipText = Window Drag: (X:%NWD_ToolTipWinX%, Y:%NWD_ToolTipWinY%, W:%NWD_ToolTipWinW%, H:%NWD_ToolTipWinH%)
Gosub, SYS_ToolTipFeedbackShow
}
}
}
}
}
Return
; [MIW {NWD}] minimize/roll on right + left mouse button
/**
* Minimizes the selected window (if minimizable) to the task bar. If you press
* the left button over the titlebar the selected window will be rolled up
* instead of being minimized. You have to apply this action again to roll the
* window back down.
*/
$LButton::
$^LButton::
GetKeyState, MIW_RButtonState, RButton, P
If ( (MIW_RButtonState = "D") and (!NWD_ImmediateDown) and (NWD_WinClass != "Progman") )
{
GetKeyState, MIW_CtrlState, Ctrl, P
WinGet, MIW_WinStyle, Style, ahk_id %NWD_WinID%
SysGet, MIW_CaptionHeight, 4 ; SM_CYCAPTION
SysGet, MIW_BorderHeight, 7 ; SM_CXDLGFRAME
MouseGetPos, , MIW_MouseY
If ( MIW_MouseY <= MIW_CaptionHeight + MIW_BorderHeight )
{
; checks wheter the window has a sizing border (WS_THICKFRAME)
If ( (MIW_CtrlState = "D") or (MIW_WinStyle & 0x40000) )
{
Gosub, NWD_SetAllOff
ROL_WinID = %NWD_WinID%
Gosub, ROL_RollToggle
}
}
Else
{
; the second condition checks for minimizable window:
; (WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX)
If ( (MIW_CtrlState = "D") or (MIW_WinStyle & 0xCA0000 = 0xCA0000) )
{
Gosub, NWD_SetAllOff
WinMinimize, ahk_id %NWD_WinID%
SYS_ToolTipText = Window Minimize
Gosub, SYS_ToolTipFeedbackShow
}
}
}
Else
{
; this feature should be implemented by using a timer because
; AutoHotkeys threading blocks the first thread if another
; one is started (until the 2nd is stopped)
Thread, priority, 1
MouseClick, LEFT, , , , , D
KeyWait, LButton
MouseClick, LEFT, , , , , U
}
Return
; [CLW {NWD}] close/send bottom on right + middle mouse button || double click on middle mouse button
/**
* Closes the selected window (if closeable) as if you click the close button
* in the titlebar. If you press the middle button over the titlebar the
* selected window will be sent to the bottom of the window stack instead of
* being closed.
*
* Edited Aug 6, 2010 by Karl Horky to add clickthrough if not over title bar area or right mouse button held
*/
$MButton::
$^MButton::
SetBatchLines, -1
CoordMode, Mouse, Screen
SetMouseDelay, -1 ; no pause after mouse clicks
SetKeyDelay, -1 ; no pause after keys sent
MouseGetPos, ClickX, ClickY, WindowUnderMouseID
WinActivate, ahk_id %WindowUnderMouseID%
; WM_NCHITTEST
SendMessage, 0x84,, ( ClickY << 16 )|ClickX,, ahk_id %WindowUnderMouseID%
WM_NCHITTEST_Result =%ErrorLevel%
/*
#define HTERROR (-2)
#define HTTRANSPARENT (-1)
#define HTNOWHERE 0
#define HTCLIENT 1
#define HTCAPTION 2
#define HTSYSMENU 3
#define HTGROWBOX 4
#define HTSIZE HTGROWBOX
#define HTMENU 5
#define HTHSCROLL 6
#define HTVSCROLL 7
#define HTMINBUTTON 8
#define HTMAXBUTTON 9
#define HTLEFT 10
#define HTRIGHT 11
#define HTTOP 12
#define HTTOPLEFT 13
#define HTTOPRIGHT 14
#define HTBOTTOM 15
#define HTBOTTOMLEFT 16
#define HTBOTTOMRIGHT 17
#define HTBORDER 18
#define HTREDUCE HTMINBUTTON
#define HTZOOM HTMAXBUTTON
#define HTSIZEFIRST HTLEFT
#define HTSIZELAST HTBOTTOMRIGHT
#if(WINVER >= 0x0400)
#define HTOBJECT 19
#define HTCLOSE 20
#define HTHELP 21
*/
GetKeyState, CLW_RButtonState, RButton, P
If ( (CLW_RButtonState = "D") and (!NWD_ImmediateDown) and (NWD_WinClass != "Progman") )
{
GetKeyState, CLW_CtrlState, Ctrl, P
WinGet, CLW_WinStyle, Style, ahk_id %NWD_WinID%
SysGet, CLW_CaptionHeight, 4 ; SM_CYCAPTION
SysGet, CLW_BorderHeight, 7 ; SM_CXDLGFRAME
MouseGetPos, , CLW_MouseY
If ( CLW_MouseY <= CLW_CaptionHeight + CLW_BorderHeight )
{
Gosub, NWD_SetAllOff
Send, !{Esc}
SYS_ToolTipText = Window Bottom
Gosub, SYS_ToolTipFeedbackShow
}
Else
{
; the second condition checks for closeable window:
; (WS_CAPTION | WS_SYSMENU)
If ( (CLW_CtrlState = "D") or (CLW_WinStyle & 0xC80000 = 0xC80000) )
{
Gosub, NWD_SetAllOff
WinClose, ahk_id %NWD_WinID%
SYS_ToolTipText = Window Close
Gosub, SYS_ToolTipFeedbackShow
}
}
}
; Close window with titlebar click
Else If WM_NCHITTEST_Result in 2,3,8,9,20,21 ; in titlebar enclosed area - top of window
{
IfWinNotActive, ahk_class Shell_TrayWnd
{
PostMessage, 0x112, 0xF060,,, ahk_id %WindowUnderMouseID% ; 0x112 = WM_SYSCOMMAND, 0xF060 = SC_CLOSE
}
Else
{
Thread, Priority, 1
MouseClick, MIDDLE, , , , , D
KeyWait, MButton
MouseClick, MIDDLE, , , , , U
}
}
Else
{
; TODO : workaround for "MouseClick, LEFT, , , 2" due to inactive titlebar problem
Thread, Priority, 1
MouseClick, MIDDLE, , , , , D
KeyWait, MButton
MouseClick, MIDDLE, , , , , U
}
Return
; [TSM {NWD}] toggles windows start menu || moves window to previous display || maximize to multiple windows on the left
/**
* This additional button is used to toggle the windows start menu.
*/
$XButton1::
$^XButton1::
If ( NWD_ImmediateDown )
Return
GetKeyState, TSM_RButtonState, RButton, P
If ( TSM_RButtonState = "U" )
{
Send, {LWin}
}
Else
IfWinActive, A
{
WinGet, TSM_WinID, ID
If ( !TSM_WinID )
Return
WinGetClass, TSM_WinClass, ahk_id %TSM_WinID%
If ( TSM_WinClass != "Progman" )
{
Gosub, NWD_SetAllOff
GetKeyState, TSM_CtrlState, Ctrl, P
If ( TSM_CtrlState = "U" )
{
Send, ^<
SYS_ToolTipText = Window Move: LEFT
Gosub, SYS_ToolTipFeedbackShow
}
; Else
; TODO : maximize to multiple displays on the left (planned feature)
}
}
Return
; [MAW {NWD}] toggles window maximizing || moves window to next display || maximize to multiple windows on the right
/**
* This additional button is used to toggle the maximize state of the active
* window (if maximizable).
*/
$XButton2::
$^XButton2::
If ( NWD_ImmediateDown )
Return
IfWinActive, A
{
WinGet, MAW_WinID, ID
If ( !MAW_WinID )
Return
WinGetClass, MAW_WinClass, ahk_id %MAW_WinID%
If ( MAW_WinClass = "Progman" )
Return
GetKeyState, MAW_RButtonState, RButton, P
If ( MAW_RButtonState = "U" )
{
GetKeyState, MAW_CtrlState, Ctrl, P
WinGet, MAW_WinStyle, Style
; the second condition checks for maximizable window:
; (WS_CAPTION | WS_SYSMENU | WS_MAXIMIZEBOX)
If ( (MAW_CtrlState = "D") or (MAW_WinStyle & 0xC90000 = 0xC90000) )
{
WinGet, MAW_MinMax, MinMax
If ( MAW_MinMax = 0 )
{
WinMaximize
SYS_ToolTipText = Window Maximize
Gosub, SYS_ToolTipFeedbackShow
}
Else
If ( MAW_MinMax = 1 )
{
WinRestore
SYS_ToolTipText = Window Restore
Gosub, SYS_ToolTipFeedbackShow
}
}
}
Else
{
Gosub, NWD_SetAllOff
GetKeyState, MAW_CtrlState, Ctrl, P
If ( MAW_CtrlState = "U" )
{
Send, ^>
SYS_ToolTipText = Window Move: RIGHT
Gosub, SYS_ToolTipFeedbackShow
}
; Else
; TODO : maximize to multiple displays on the right (planned feature)
}
}
Return
; [TSW {NWD}] provides alt-tab-menu to the right mouse button + mouse wheel
/**
* Provides a quick task switcher (alt-tab-menu) controlled by the mouse wheel.
*/
WheelDown::
GetKeyState, TSW_RButtonState, RButton, P
If ( (TSW_RButtonState = "D") and (!NWD_ImmediateDown) )
{
; TODO : this is a workaround because the original tabmenu
; code of AutoHotkey is buggy on some systems
GetKeyState, TSW_LAltState, LAlt
If ( TSW_LAltState = "U" )
{
Gosub, NWD_SetAllOff
Send, {LAlt down}{Tab}
SetTimer, TSW_WheelHandler, 1
}
Else
Send, {Tab}
}
Else
Send, {WheelDown}
Return
WheelUp::
GetKeyState, TSW_RButtonState, RButton, P
If ( (TSW_RButtonState = "D") and (!NWD_ImmediateDown) )
{
; TODO : this is a workaround because the original tabmenu
; code of AutoHotkey is buggy on some systems
GetKeyState, TSW_LAltState, LAlt
If ( TSW_LAltState = "U" )
{
Gosub, NWD_SetAllOff
Send, {LAlt down}+{Tab}
SetTimer, TSW_WheelHandler, 1
}
Else
Send, +{Tab}
}
Else
Send, {WheelUp}
Return
TSW_WheelHandler:
GetKeyState, TSW_RButtonState, RButton, P
If ( TSW_RButtonState = "U" )
{
SetTimer, TSW_WheelHandler, Off
GetKeyState, TSW_LAltState, LAlt
If ( TSW_LAltState = "D" )
Send, {LAlt up}
}
Return
; [AOT] toggles always on top
/**
* Toggles the always-on-top attribute of the selected/active window.
*/
#SC029::
#LButton::
AOT_SetToggle:
Gosub, AOT_CheckWinIDs
SetWinDelay, -1
IfInString, A_ThisHotkey, LButton
{
MouseGetPos, , , AOT_WinID
If ( !AOT_WinID )
Return
IfWinNotActive, ahk_id %AOT_WinID%
WinActivate, ahk_id %AOT_WinID%
}
IfWinActive, A
{
WinGet, AOT_WinID, ID
If ( !AOT_WinID )
Return
WinGetClass, AOT_WinClass, ahk_id %AOT_WinID%
If ( AOT_WinClass = "Progman" )
Return
WinGet, AOT_ExStyle, ExStyle, ahk_id %AOT_WinID%
If ( AOT_ExStyle & 0x8 ) ; 0x8 is WS_EX_TOPMOST
{
SYS_ToolTipText = Always on Top: OFF
Gosub, AOT_SetOff
}
Else
{
SYS_ToolTipText = Always on Top: ON
Gosub, AOT_SetOn
}
Gosub, SYS_ToolTipFeedbackShow
}
Return
AOT_SetOn:
Gosub, AOT_CheckWinIDs
SetWinDelay, -1
IfWinNotExist, ahk_id %AOT_WinID%
Return
IfNotInString, AOT_WinIDs, |%AOT_WinID%
AOT_WinIDs = %AOT_WinIDs%|%AOT_WinID%
WinSet, AlwaysOnTop, On, ahk_id %AOT_WinID%
Return
AOT_SetOff:
Gosub, AOT_CheckWinIDs
SetWinDelay, -1
IfWinNotExist, ahk_id %AOT_WinID%
Return
StringReplace, AOT_WinIDs, AOT_WinIDs, |%A_LoopField%, , All
WinSet, AlwaysOnTop, Off, ahk_id %AOT_WinID%
Return
AOT_SetAllOff:
Gosub, AOT_CheckWinIDs
Loop, Parse, AOT_WinIDs, |
If ( A_LoopField )
{
AOT_WinID = %A_LoopField%
Gosub, AOT_SetOff
}
Return
#^SC029::
Gosub, AOT_SetAllOff
SYS_ToolTipText = Always on Top: ALL OFF
Gosub, SYS_ToolTipFeedbackShow
Return
AOT_CheckWinIDs:
DetectHiddenWindows, On
Loop, Parse, AOT_WinIDs, |
If ( A_LoopField )
IfWinNotExist, ahk_id %A_LoopField%
StringReplace, AOT_WinIDs, AOT_WinIDs, |%A_LoopField%, , All
Return
AOT_ExitHandler:
Gosub, AOT_SetAllOff
Return
; [ROL] rolls up/down a window to/from its title bar
ROL_RollToggle:
Gosub, ROL_CheckWinIDs
SetWinDelay, -1
IfWinNotExist, ahk_id %ROL_WinID%
Return
WinGetClass, ROL_WinClass, ahk_id %ROL_WinID%
If ( ROL_WinClass = "Progman" )
Return
IfNotInString, ROL_WinIDs, |%ROL_WinID%
{
SYS_ToolTipText = Window Roll: UP
Gosub, ROL_RollUp
}
Else
{
WinGetPos, , , , ROL_WinHeight, ahk_id %ROL_WinID%
If ( ROL_WinHeight = ROL_WinRolledHeight%ROL_WinID% )
{
SYS_ToolTipText = Window Roll: DOWN
Gosub, ROL_RollDown
}
Else
{
SYS_ToolTipText = Window Roll: UP
Gosub, ROL_RollUp
}
}
Gosub, SYS_ToolTipFeedbackShow
Return
ROL_RollUp:
Gosub, ROL_CheckWinIDs
SetWinDelay, -1
IfWinNotExist, ahk_id %ROL_WinID%
Return
WinGetClass, ROL_WinClass, ahk_id %ROL_WinID%
If ( ROL_WinClass = "Progman" )
Return
WinGetPos, , , , ROL_WinHeight, ahk_id %ROL_WinID%
IfInString, ROL_WinIDs, |%ROL_WinID%
If ( ROL_WinHeight = ROL_WinRolledHeight%ROL_WinID% )
Return
SysGet, ROL_CaptionHeight, 4 ; SM_CYCAPTION
SysGet, ROL_BorderHeight, 7 ; SM_CXDLGFRAME
If ( ROL_WinHeight > (ROL_CaptionHeight + ROL_BorderHeight) )
{
IfNotInString, ROL_WinIDs, |%ROL_WinID%
ROL_WinIDs = %ROL_WinIDs%|%ROL_WinID%
ROL_WinOriginalHeight%ROL_WinID% := ROL_WinHeight
WinMove, ahk_id %ROL_WinID%, , , , , (ROL_CaptionHeight + ROL_BorderHeight)
WinGetPos, , , , ROL_WinRolledHeight%ROL_WinID%, ahk_id %ROL_WinID%
}
Return
ROL_RollDown:
Gosub, ROL_CheckWinIDs
SetWinDelay, -1
If ( !ROL_WinID )
Return
IfNotInString, ROL_WinIDs, |%ROL_WinID%
Return
WinGetPos, , , , ROL_WinHeight, ahk_id %ROL_WinID%
If( ROL_WinHeight = ROL_WinRolledHeight%ROL_WinID% )
WinMove, ahk_id %ROL_WinID%, , , , , ROL_WinOriginalHeight%ROL_WinID%
StringReplace, ROL_WinIDs, ROL_WinIDs, |%ROL_WinID%, , All
ROL_WinOriginalHeight%ROL_WinID% =
ROL_WinRolledHeight%ROL_WinID% =
Return
ROL_RollDownAll:
Gosub, ROL_CheckWinIDs
Loop, Parse, ROL_WinIDs, |
If ( A_LoopField )
{
ROL_WinID = %A_LoopField%
Gosub, ROL_RollDown
}
Return
#^r::
Gosub, ROL_RollDownAll
SYS_ToolTipText = Window Roll: ALL DOWN
Gosub, SYS_ToolTipFeedbackShow
Return
ROL_CheckWinIDs:
DetectHiddenWindows, On
Loop, Parse, ROL_WinIDs, |
If ( A_LoopField )
IfWinNotExist, ahk_id %A_LoopField%
{
StringReplace, ROL_WinIDs, ROL_WinIDs, |%A_LoopField%, , All
ROL_WinOriginalHeight%A_LoopField% =
ROL_WinRolledHeight%A_LoopField% =
}
Return
ROL_ExitHandler:
Gosub, ROL_RollDownAll
Return
; [TRA] provides window transparency
/**
* Adjusts the transparency of the active window in ten percent steps
* (opaque = 100%) which allows the contents of the windows behind it to shine
* through. If the window is completely transparent (0%) the window is still
* there and clickable. If you loose a transparent window it will be extremly
* complicated to find it again because it's invisible (see the first hotkey
* in this list for emergency help in such situations).
*/
#WheelUp::
#+WheelUp::
#WheelDown::
#+WheelDown::
Gosub, TRA_CheckWinIDs
SetWinDelay, -1
IfWinActive, A
{
WinGet, TRA_WinID, ID
If ( !TRA_WinID )
Return
WinGetClass, TRA_WinClass, ahk_id %TRA_WinID%
If ( TRA_WinClass = "Progman" )
Return
IfNotInString, TRA_WinIDs, |%TRA_WinID%
TRA_WinIDs = %TRA_WinIDs%|%TRA_WinID%
TRA_WinAlpha := TRA_WinAlpha%TRA_WinID%
TRA_PixelColor := TRA_PixelColor%TRA_WinID%
IfInString, A_ThisHotkey, +
TRA_WinAlphaStep := 255 * 0.01 ; 1 percent steps
Else
TRA_WinAlphaStep := 255 * 0.1 ; 10 percent steps
If ( TRA_WinAlpha = "" )
TRA_WinAlpha = 255
IfInString, A_ThisHotkey, WheelDown
TRA_WinAlpha -= TRA_WinAlphaStep
Else
TRA_WinAlpha += TRA_WinAlphaStep
If ( TRA_WinAlpha > 255 )
TRA_WinAlpha = 255
Else
If ( TRA_WinAlpha < 0 )
TRA_WinAlpha = 0
If ( !TRA_PixelColor and (TRA_WinAlpha = 255) )
{
Gosub, TRA_TransparencyOff
SYS_ToolTipText = Transparency: OFF
}
Else
{
TRA_WinAlpha%TRA_WinID% = %TRA_WinAlpha%
If ( TRA_PixelColor )
WinSet, TransColor, %TRA_PixelColor% %TRA_WinAlpha%, ahk_id %TRA_WinID%
Else
WinSet, Transparent, %TRA_WinAlpha%, ahk_id %TRA_WinID%
TRA_ToolTipAlpha := TRA_WinAlpha * 100 / 255
Transform, TRA_ToolTipAlpha, Round, %TRA_ToolTipAlpha%
SYS_ToolTipText = Transparency: %TRA_ToolTipAlpha% `%
}
Gosub, SYS_ToolTipFeedbackShow
}
Return
#^LButton::
#^MButton::
Gosub, TRA_CheckWinIDs
SetWinDelay, -1
CoordMode, Mouse, Screen
CoordMode, Pixel, Screen
MouseGetPos, TRA_MouseX, TRA_MouseY, TRA_WinID
If ( !TRA_WinID )
Return
WinGetClass, TRA_WinClass, ahk_id %TRA_WinID%
If ( TRA_WinClass = "Progman" )
Return
IfWinNotActive, ahk_id %TRA_WinID%
WinActivate, ahk_id %TRA_WinID%
IfNotInString, TRA_WinIDs, |%TRA_WinID%
TRA_WinIDs = %TRA_WinIDs%|%TRA_WinID%
IfInString, A_ThisHotkey, MButton
{
AOT_WinID = %TRA_WinID%
Gosub, AOT_SetOn
TRA_WinAlpha%TRA_WinID% := 25 * 255 / 100
}
TRA_WinAlpha := TRA_WinAlpha%TRA_WinID%
; TODO : the transparency must be set off first,
; this may be a bug of AutoHotkey
WinSet, TransColor, OFF, ahk_id %TRA_WinID%
PixelGetColor, TRA_PixelColor, %TRA_MouseX%, %TRA_MouseY%, RGB
WinSet, TransColor, %TRA_PixelColor% %TRA_WinAlpha%, ahk_id %TRA_WinID%
TRA_PixelColor%TRA_WinID% := TRA_PixelColor
IfInString, A_ThisHotkey, MButton
SYS_ToolTipText = Transparency: 25 `% + %TRA_PixelColor% color (RGB) + Always on Top
Else
SYS_ToolTipText = Transparency: %TRA_PixelColor% color (RGB)
Gosub, SYS_ToolTipFeedbackShow
Return
#MButton::
Gosub, TRA_CheckWinIDs
SetWinDelay, -1
MouseGetPos, , , TRA_WinID
If ( !TRA_WinID )
Return
IfWinNotActive, ahk_id %TRA_WinID%
WinActivate, ahk_id %TRA_WinID%
IfNotInString, TRA_WinIDs, |%TRA_WinID%
Return
Gosub, TRA_TransparencyOff
SYS_ToolTipText = Transparency: OFF
Gosub, SYS_ToolTipFeedbackShow
Return
TRA_TransparencyOff:
Gosub, TRA_CheckWinIDs
SetWinDelay, -1
If ( !TRA_WinID )
Return
IfNotInString, TRA_WinIDs, |%TRA_WinID%
Return
StringReplace, TRA_WinIDs, TRA_WinIDs, |%TRA_WinID%, , All
TRA_WinAlpha%TRA_WinID% =
TRA_PixelColor%TRA_WinID% =
; TODO : must be set to 255 first to avoid the black-colored-window problem
WinSet, Transparent, 255, ahk_id %TRA_WinID%
WinSet, TransColor, OFF, ahk_id %TRA_WinID%
WinSet, Transparent, OFF, ahk_id %TRA_WinID%
WinSet, Redraw, , ahk_id %TRA_WinID%
Return
TRA_TransparencyAllOff:
Gosub, TRA_CheckWinIDs
Loop, Parse, TRA_WinIDs, |
If ( A_LoopField )
{
TRA_WinID = %A_LoopField%
Gosub, TRA_TransparencyOff
}
Return
#^t::
Gosub, TRA_TransparencyAllOff
SYS_ToolTipText = Transparency: ALL OFF
Gosub, SYS_ToolTipFeedbackShow
Return
TRA_CheckWinIDs:
DetectHiddenWindows, On
Loop, Parse, TRA_WinIDs, |
If ( A_LoopField )
IfWinNotExist, ahk_id %A_LoopField%
{
StringReplace, TRA_WinIDs, TRA_WinIDs, |%A_LoopField%, , All
TRA_WinAlpha%A_LoopField% =
TRA_PixelColor%A_LoopField% =
}
Return
TRA_ExitHandler:
Gosub, TRA_TransparencyAllOff
Return
; [EJC] opens/closes a drive
/**
* Opens or closes an installed CD/DVD-ROM reader/writer drive tray. The drives
* are assigned to their hotkeys by the certain drive number in your system. The
* hotkeys are used in the sequence of the key placement on your physical
* keyboard from left to right (1 refers to the first and 0 to the tenth drive).
* So you are limited to a total number of 10 drives controlled by NiftyWindows.
*/
#MaxThreadsBuffer On
$#0::
$#1::
$#2::
$#3::
$#4::
$#5::
$#6::
$#7::
$#8::
$#9::
DriveGet, EJC_DriveList, List, CDROM
StringLen, EJC_DriveListLength, EJC_DriveList
StringRight, EJC_PressedDrive, A_ThisHotkey, 1
If ( !EJC_PressedDrive )
EJC_PressedDrive := 10
If ( EJC_PressedDrive <= EJC_DriveListLength )
{
StringMid, EJC_DriveLabel, EJC_DriveList, EJC_PressedDrive, 1
SYS_ToolTipText = Drive Eject: %EJC_DriveLabel%
Gosub, SYS_ToolTipFeedbackShow
Gosub, SUS_SuspendSaveState
Suspend, On
Drive, Eject, %EJC_DriveLabel%:
If ( A_TimeSinceThisHotkey < 250 )
Drive, Eject, %EJC_DriveLabel%:, 1
Gosub, SUS_SuspendRestoreState
}
Else
{
Transform, EJC_PressedDrive, Mod, %EJC_PressedDrive%, 10
Send, #%EJC_PressedDrive%
}
Return
#MaxThreadsBuffer Off
; [MUT] toggles the audio mute
/**
* Toggles the muteness of an installed audio card.
*/
Pause::
SoundSet, +1, , Mute
SoundGet, MUT_MuteState, , MUTE
SYS_ToolTipText = Audio Mute: %MUT_MuteState%
Gosub, SYS_ToolTipFeedbackShow
Return
; [SCR] starts the user defined screensaver
/**
* Starts the user defined screensaver (password protection aware).
*/
#s up::
^#s up::
RegRead, SCR_Saver, HKEY_CURRENT_USER, Control Panel\Desktop, SCRNSAVE.EXE
If ( !ErrorLevel and SCR_Saver )
{
SendMessage, 0x112, 0xF140, 0, , Program Manager ; 0x112 is WM_SYSCOMMAND ; 0xF140 is SC_SCREENSAVE
If ( A_ThisHotkey != "^#s up" )
Return
SplitPath, SCR_Saver, SCR_SaverFileName
Process, Wait, %SCR_SaverFileName%, 5
If ( ErrorLevel )
{
Gosub, SUS_SuspendSaveState
Suspend, On
Sleep, 5000
Gosub, SUS_SuspendRestoreState
Process, Exist, %SCR_SaverFileName%
If ( ErrorLevel )
SendMessage, 0x112, 0xF170, 2, , Program Manager ; 0x112 is WM_SYSCOMMAND ; 0xF170 is SC_MONITORPOWER ; (2 = off, 1 = standby, -1 = on)
}
}
Else
{
SYS_TrayTipText = No screensaver specified in display settings (control panel).
SYS_TrayTipOptions = 2
Gosub, SYS_TrayTipShow
}
Return
; [SIZ {NWD}] provides several size adjustments to windows
/**
* Adjusts the transparency of the active window in ten percent steps
* (opaque = 100%) which allows the contents of the windows behind it to shine
* through. If the window is completely transparent (0%) the window is still
* there and clickable. If you loose a transparent window it will be extremly
* complicated to find it again because it's invisible (see the first hotkey in
* this list for emergency help in such situations).
*/
!WheelUp::
!+WheelUp::
!^WheelUp::
!#WheelUp::
!+^WheelUp::
!+#WheelUp::
!^#WheelUp::
!+^#WheelUp::
!WheelDown::
!+WheelDown::
!^WheelDown::
!#WheelDown::
!+^WheelDown::
!+#WheelDown::
!^#WheelDown::
!+^#WheelDown::
; TODO : the following code block is a workaround to handle
; virtual ALT calls in WheelDown/Up functions
GetKeyState, SIZ_AltState, Alt, P
If ( SIZ_AltState = "U" )
{
IfInString, A_ThisHotkey, WheelDown
Gosub, WheelDown
Else
Gosub, WheelUp
Return
}
If ( NWD_Dragging or NWD_ImmediateDown )
Return
SetWinDelay, -1
CoordMode, Mouse, Screen
IfWinActive, A
{
WinGet, SIZ_WinID, ID
If ( !SIZ_WinID )
Return
WinGetClass, SIZ_WinClass, ahk_id %SIZ_WinID%
If ( SIZ_WinClass = "Progman" )
Return
GetKeyState, SIZ_CtrlState, Ctrl, P
WinGet, SIZ_WinMinMax, MinMax, ahk_id %SIZ_WinID%
WinGet, SIZ_WinStyle, Style, ahk_id %SIZ_WinID%
; checks wheter the window isn't maximized and has a sizing border (WS_THICKFRAME)
If ( (SIZ_CtrlState = "D") or ((SIZ_WinMinMax != 1) and (SIZ_WinStyle & 0x40000)) )
{
WinGetPos, SIZ_WinX, SIZ_WinY, SIZ_WinW, SIZ_WinH, ahk_id %SIZ_WinID%
If ( SIZ_WinW and SIZ_WinH )
{
SIZ_AspectRatio := SIZ_WinW / SIZ_WinH
IfInString, A_ThisHotkey, WheelDown
SIZ_Direction = 1
Else
SIZ_Direction = -1
IfInString, A_ThisHotkey, +
SIZ_Factor = 0.01
Else
SIZ_Factor = 0.1
SIZ_WinNewW := SIZ_WinW + SIZ_Direction * SIZ_WinW * SIZ_Factor
SIZ_WinNewH := SIZ_WinH + SIZ_Direction * SIZ_WinH * SIZ_Factor
IfInString, A_ThisHotkey, #
{
SIZ_WinNewX := SIZ_WinX + (SIZ_WinW - SIZ_WinNewW) / 2
SIZ_WinNewY := SIZ_WinY + (SIZ_WinH - SIZ_WinNewH) / 2
}
Else
{
SIZ_WinNewX := SIZ_WinX
SIZ_WinNewY := SIZ_WinY
}
If ( SIZ_WinNewW > A_ScreenWidth )
{
SIZ_WinNewW := A_ScreenWidth
SIZ_WinNewH := SIZ_WinNewW / SIZ_AspectRatio
}
If ( SIZ_WinNewH > A_ScreenHeight )
{
SIZ_WinNewH := A_ScreenHeight
SIZ_WinNewW := SIZ_WinNewH * SIZ_AspectRatio
}
Transform, SIZ_WinNewX, Round, %SIZ_WinNewX%
Transform, SIZ_WinNewY, Round, %SIZ_WinNewY%
Transform, SIZ_WinNewW, Round, %SIZ_WinNewW%
Transform, SIZ_WinNewH, Round, %SIZ_WinNewH%
WinMove, ahk_id %SIZ_WinID%, , SIZ_WinNewX, SIZ_WinNewY, SIZ_WinNewW, SIZ_WinNewH
If ( SYS_ToolTipFeedback )
{
WinGetPos, SIZ_ToolTipWinX, SIZ_ToolTipWinY, SIZ_ToolTipWinW, SIZ_ToolTipWinH, ahk_id %SIZ_WinID%
SYS_ToolTipText = Window Size: (X:%SIZ_ToolTipWinX%, Y:%SIZ_ToolTipWinY%, W:%SIZ_ToolTipWinW%, H:%SIZ_ToolTipWinH%)
Gosub, SYS_ToolTipFeedbackShow
}
}
}
}
Return
!NumpadAdd::
!^NumpadAdd::
!#NumpadAdd::
!^#NumpadAdd::
!NumpadSub::
!^NumpadSub::
!#NumpadSub::
!^#NumpadSub::
If ( NWD_Dragging or NWD_ImmediateDown )
Return
SetWinDelay, -1
CoordMode, Mouse, Screen
IfWinActive, A
{
WinGet, SIZ_WinID, ID
If ( !SIZ_WinID )
Return
WinGetClass, SIZ_WinClass, ahk_id %SIZ_WinID%
If ( SIZ_WinClass = "Progman" )
Return
GetKeyState, SIZ_CtrlState, Ctrl, P
WinGet, SIZ_WinMinMax, MinMax, ahk_id %SIZ_WinID%
WinGet, SIZ_WinStyle, Style, ahk_id %SIZ_WinID%
; checks wheter the window isn't maximized and has a sizing border (WS_THICKFRAME)
If ( (SIZ_CtrlState = "D") or ((SIZ_WinMinMax != 1) and (SIZ_WinStyle & 0x40000)) )
{
WinGetPos, SIZ_WinX, SIZ_WinY, SIZ_WinW, SIZ_WinH, ahk_id %SIZ_WinID%
IfInString, A_ThisHotkey, NumpadAdd
If ( SIZ_WinW < 160 )
SIZ_WinNewW = 160
Else
If ( SIZ_WinW < 320 )
SIZ_WinNewW = 320
Else
If ( SIZ_WinW < 640 )
SIZ_WinNewW = 640
Else
If ( SIZ_WinW < 800 )
SIZ_WinNewW = 800
Else
If ( SIZ_WinW < 1024 )
SIZ_WinNewW = 1024
Else
If ( SIZ_WinW < 1152 )
SIZ_WinNewW = 1152
Else
If ( SIZ_WinW < 1280 )
SIZ_WinNewW = 1280
Else
If ( SIZ_WinW < 1400 )
SIZ_WinNewW = 1400
Else
If ( SIZ_WinW < 1600 )
SIZ_WinNewW = 1600
Else
SIZ_WinNewW = 1920
Else
If ( SIZ_WinW <= 320 )
SIZ_WinNewW = 160
Else
If ( SIZ_WinW <= 640 )
SIZ_WinNewW = 320
Else
If ( SIZ_WinW <= 800 )
SIZ_WinNewW = 640
Else
If ( SIZ_WinW <= 1024 )
SIZ_WinNewW = 800
Else
If ( SIZ_WinW <= 1152 )
SIZ_WinNewW = 1024
Else
If ( SIZ_WinW <= 1280 )
SIZ_WinNewW = 1152
Else
If ( SIZ_WinW <= 1400 )
SIZ_WinNewW = 1280
Else
If ( SIZ_WinW <= 1600 )
SIZ_WinNewW = 1400
Else
If ( SIZ_WinW <= 1920 )
SIZ_WinNewW = 1600
Else
SIZ_WinNewW = 1920
If ( SIZ_WinNewW > A_ScreenWidth )
SIZ_WinNewW := A_ScreenWidth
SIZ_WinNewH := 3 * SIZ_WinNewW / 4
If ( SIZ_WinNewW = 1280 )
SIZ_WinNewH := 1024
IfInString, A_ThisHotkey, #
{
SIZ_WinNewX := SIZ_WinX + (SIZ_WinW - SIZ_WinNewW) / 2
SIZ_WinNewY := SIZ_WinY + (SIZ_WinH - SIZ_WinNewH) / 2
}
Else
{
SIZ_WinNewX := SIZ_WinX
SIZ_WinNewY := SIZ_WinY
}
Transform, SIZ_WinNewX, Round, %SIZ_WinNewX%
Transform, SIZ_WinNewY, Round, %SIZ_WinNewY%
Transform, SIZ_WinNewW, Round, %SIZ_WinNewW%
Transform, SIZ_WinNewH, Round, %SIZ_WinNewH%
WinMove, ahk_id %SIZ_WinID%, , SIZ_WinNewX, SIZ_WinNewY, SIZ_WinNewW, SIZ_WinNewH
If ( SYS_ToolTipFeedback )
{
WinGetPos, SIZ_ToolTipWinX, SIZ_ToolTipWinY, SIZ_ToolTipWinW, SIZ_ToolTipWinH, ahk_id %SIZ_WinID%
SYS_ToolTipText = Window Size: (X:%SIZ_ToolTipWinX%, Y:%SIZ_ToolTipWinY%, W:%SIZ_ToolTipWinW%, H:%SIZ_ToolTipWinH%)
Gosub, SYS_ToolTipFeedbackShow
}
}
}
Return
; [XWN] provides X Window like focus switching (focus follows mouse)
/**
* Provided a 'X Window' like focus switching by mouse cursor movement. After
* activation of this feature (by using the responsible entry in the tray icon
* menu) the focus will follow the mouse cursor with a delayed focus change
* (after movement end) of 500 milliseconds (half a second). This feature is
* disabled per default to avoid any confusion due to the new user-interface-flow.
*/
XWN_FocusHandler:
CoordMode, Mouse, Screen
MouseGetPos, XWN_MouseX, XWN_MouseY, XWN_WinID
If ( !XWN_WinID )
Return
If ( (XWN_MouseX != XWN_MouseOldX) or (XWN_MouseY != XWN_MouseOldY) )
{
IfWinNotActive, ahk_id %XWN_WinID%
XWN_FocusRequest = 1
Else
XWN_FocusRequest = 0
XWN_MouseOldX := XWN_MouseX
XWN_MouseOldY := XWN_MouseY
XWN_MouseMovedTickCount := A_TickCount
}
Else
If ( XWN_FocusRequest and (A_TickCount - XWN_MouseMovedTickCount > 500) )
{
WinGetClass, XWN_WinClass, ahk_id %XWN_WinID%
If ( XWN_WinClass = "Progman" )
Return
; checks wheter the selected window is a popup menu
; (WS_POPUP) and !(WS_DLGFRAME | WS_SYSMENU | WS_THICKFRAME)
WinGet, XWN_WinStyle, Style, ahk_id %XWN_WinID%
If ( (XWN_WinStyle & 0x80000000) and !(XWN_WinStyle & 0x4C0000) )
Return
IfWinNotActive, ahk_id %XWN_WinID%
WinActivate, ahk_id %XWN_WinID%
XWN_FocusRequest = 0
}
Return
; [GRP] groups windows for quick task switching
/**
* Activates the next window in a process window group that was defined
* gradually before with the given CTRL modifier. This feature causes the first
* window of the responsible group to be activated. Using it a second time will
* activate the next window in the series and so on. By using process window
* groups you can organize and access your process windows in semantic groups
* quickly.
*/
^#F1::
^#F2::
^#F3::
^#F4::
^#F5::
^#F6::
^#F7::
^#F8::
^#F9::
^#F10::
^#F11::
^#F12::
^#F13::
^#F14::
^#F15::
^#F16::
^#F17::
^#F18::
^#F19::
^#F20::
^#F21::
^#F22::
^#F23::
^#F24::
IfWinActive, A
{
WinGet, GRP_WinID, ID
If ( !GRP_WinID )
Return
WinGetClass, GRP_WinClass, ahk_id %GRP_WinID%
If ( GRP_WinClass = "Progman" )
Return
WinGet, GRP_WinPID, PID
If ( !GRP_WinPID )
Return
StringMid, GRP_GroupNumber, A_ThisHotkey, 3, 3
GroupAdd, Group%GRP_GroupNumber%, ahk_PID %GRP_WinPID%
SYS_ToolTipText = Active window was added to group %GRP_GroupNumber%.
Gosub, SYS_ToolTipFeedbackShow
}
Return
#F1::
#F2::
#F3::
#F4::
#F5::
#F6::
#F7::
#F8::
#F9::
#F10::
#F11::
#F12::
#F13::
#F14::
#F15::
#F16::
#F17::
#F18::
#F19::
#F20::
#F21::
#F22::
#F23::
#F24::
StringMid, GRP_GroupNumber, A_ThisHotkey, 2, 3
GroupActivate, Group%GRP_GroupNumber%
SYS_ToolTipText = Activated next window in group %GRP_GroupNumber%.
Gosub, SYS_ToolTipFeedbackShow
Return
!#F1::
!#F2::
!#F3::
!#F4::
!#F5::
!#F6::
!#F7::
!#F8::
!#F9::
!#F10::
!#F11::
!#F12::
!#F13::
!#F14::
!#F15::
!#F16::
!#F17::
!#F18::
!#F19::
!#F20::
!#F21::
!#F22::
!#F23::
!#F24::
StringMid, GRP_GroupNumber, A_ThisHotkey, 3, 3
GroupClose, Group%GRP_GroupNumber%, A
SYS_ToolTipText = Closed all windows in group %GRP_GroupNumber%.
Gosub, SYS_ToolTipFeedbackShow
Return
; [MIR] toggles the visibility of miranda buddy list
/**
* Toggles the visibility of the Miranda buddy list (if installed). Currently
* Miranda does not provide a hotkey to activate the buddy list if the window
* is still visible. Instead the opened (but not activated) buddy list will be
* minimized. This is not expected so this NiftyWindows feature provides the
* needed service asked by so many people.
*/
^+b::
IfExist, %MIR_MirandaFullPath%
{
SetTitleMatchMode, 3
DetectHiddenWindows, On
MIR_MirandaStart = 0
IfWinNotExist, Miranda IM
{
Run, %MIR_MirandaFullPath%, %MIR_MirandaDir%
WinWait, Miranda IM
MIR_MirandaStart=1
Sleep, 500
}
DetectHiddenWindows, Off
IfWinActive, Miranda IM
{
If ( !MIR_MirandaStart )
WinHide
}
Else
IfWinExist, Miranda IM
WinActivate
Else
{
DetectHiddenWindows, On
IfWinExist, Miranda IM
{
WinShow
WinActivate
}
}
}
Else
Send, ^+b
Return
; [MIR] toggles the visibility of last used miranda message container
/**
* Toggles the visibility of the last used Miranda message container
* (if installed). Currently Miranda does not provide a hotkey to activate the
* last used message container if there is no unread message waiting for your
* attention. So this hotkey will make a container visible (if it is minimized)
* and activate it. If there is no existing message container, this hotkey will
* do nothing.
*/
~^+u::
IfExist, %MIR_MirandaFullPath%
{
Sleep, 500
SetTitleMatchMode, 3
IfWinExist, ahk_class #32770
{
WinGetTitle, MIR_Title
IfNotInString MIR_Title, Mail
IfWinNotActive
WinActivate
}
}
Else
Send, ^+u
Return
; [TRY] handles the tray icon/menu
TRY_TrayInit:
Menu, TRAY, NoStandard
Menu, TRAY, Tip, %SYS_ScriptInfo%
If ( !A_IsCompiled )
{
Menu, AutoHotkey, Standard
Menu, TRAY, Add, AutoHotkey, :AutoHotkey
Menu, TRAY, Add
}
Menu, TRAY, Add, Help, TRY_TrayEvent
Menu, TRAY, Default, Help
Menu, TRAY, Add
Menu, TRAY, Add, About, TRY_TrayEvent
Menu, TRAY, Add
Menu, TRAY, Add, Mail Author, TRY_TrayEvent
Menu, TRAY, Add, View License, TRY_TrayEvent
Menu, TRAY, Add, Visit Website, TRY_TrayEvent
Menu, TRAY, Add, Check For Update, TRY_TrayEvent
Menu, TRAY, Add
Menu, MouseHooks, Add, Left Mouse Button, TRY_TrayEvent
Menu, MouseHooks, Add, Middle Mouse Button, TRY_TrayEvent
Menu, MouseHooks, Add, Right Mouse Button, TRY_TrayEvent
Menu, MouseHooks, Add, Fourth Mouse Button, TRY_TrayEvent
Menu, MouseHooks, Add, Fifth Mouse Button, TRY_TrayEvent
Menu, TRAY, Add, Mouse Hooks, :MouseHooks
Menu, TRAY, Add, ToolTip Feedback, TRY_TrayEvent
Menu, TRAY, Add, Auto Suspend, TRY_TrayEvent
Menu, TRAY, Add, Focus Follows Mouse, TRY_TrayEvent
Menu, TRAY, Add, Suspend All Hooks, TRY_TrayEvent
Menu, TRAY, Add, Revert Visual Effects, TRY_TrayEvent
Menu, TRAY, Add, Hide Tray Icon, TRY_TrayEvent
Menu, TRAY, Add
Menu, TRAY, Add, Exit, TRY_TrayEvent
Gosub, TRY_TrayUpdate
If ( A_IconHidden )
Menu, TRAY, Icon
Return
TRY_TrayUpdate:
If ( CFG_LeftMouseButtonHook )
Menu, MouseHooks, Check, Left Mouse Button
Else
Menu, MouseHooks, UnCheck, Left Mouse Button
If ( CFG_MiddleMouseButtonHook )
Menu, MouseHooks, Check, Middle Mouse Button
Else
Menu, MouseHooks, UnCheck, Middle Mouse Button
If ( CFG_RightMouseButtonHook )
Menu, MouseHooks, Check, Right Mouse Button
Else
Menu, MouseHooks, UnCheck, Right Mouse Button
If ( CFG_FourthMouseButtonHook )
Menu, MouseHooks, Check, Fourth Mouse Button
Else
Menu, MouseHooks, UnCheck, Fourth Mouse Button
If ( CFG_FifthMouseButtonHook )
Menu, MouseHooks, Check, Fifth Mouse Button
Else
Menu, MouseHooks, UnCheck, Fifth Mouse Button
If ( SYS_ToolTipFeedback )
Menu, TRAY, Check, ToolTip Feedback
Else
Menu, TRAY, UnCheck, ToolTip Feedback
If ( SUS_AutoSuspend )
Menu, TRAY, Check, Auto Suspend
Else
Menu, TRAY, UnCheck, Auto Suspend
If ( XWN_FocusFollowsMouse )
Menu, TRAY, Check, Focus Follows Mouse
Else
Menu, TRAY, UnCheck, Focus Follows Mouse
If ( A_IsSuspended )
Menu, TRAY, Check, Suspend All Hooks
Else
Menu, TRAY, UnCheck, Suspend All Hooks
Return
TRY_TrayEvent:
If ( !TRY_TrayEvent )
TRY_TrayEvent = %A_ThisMenuItem%
If ( TRY_TrayEvent = "Help" )
IfExist, %A_ScriptDir%\readme.txt
Run, "%A_ScriptDir%\readme.txt"
Else
{
SYS_TrayTipText = File couldn't be accessed:`n%A_ScriptDir%\readme.txt
SYS_TrayTipOptions = 3
Gosub, SYS_TrayTipShow
}
If ( TRY_TrayEvent = "About" )
{
SYS_TrayTipText = Copyright (c) 2004-2005 by Enovatic-Solutions.`nAll rights reserved. Use is subject to license terms.`n`nCompany:`tEnovatic-Solutions (IT Service Provider)`nAuthor:`t`tOliver Pfeiffer`, Bremen (GERMANY)`nEmail:`t`tniftywindows@enovatic.org
Gosub, SYS_TrayTipShow
}
If ( TRY_TrayEvent = "Mail Author" )
Run, mailto:niftywindows@enovatic.org?subject=%SYS_ScriptInfo% (build %SYS_ScriptBuild%)
If ( TRY_TrayEvent = "View License" )
IfExist, %A_ScriptDir%\license.txt
Run, "%A_ScriptDir%\license.txt"
Else
{
SYS_TrayTipText = File couldn't be accessed:`n%A_ScriptDir%\license.txt
SYS_TrayTipOptions = 3
Gosub, SYS_TrayTipShow
}
If ( TRY_TrayEvent = "Visit Website" )
Run, http://www.enovatic.org/products/niftywindows/
If ( TRY_TrayEvent = "Check For Update" )
Gosub, UPD_CheckForUpdate
If ( TRY_TrayEvent = "ToolTip Feedback" )
SYS_ToolTipFeedback := !SYS_ToolTipFeedback
If ( TRY_TrayEvent = "Auto Suspend" )
{
SUS_AutoSuspend := !SUS_AutoSuspend
Gosub, CFG_ApplySettings
}
If ( TRY_TrayEvent = "Focus Follows Mouse" )
{
XWN_FocusFollowsMouse := !XWN_FocusFollowsMouse
Gosub, CFG_ApplySettings
}
If ( TRY_TrayEvent = "Suspend All Hooks" )
Gosub, SUS_SuspendToggle
If ( TRY_TrayEvent = "Revert Visual Effects" )
Gosub, SYS_RevertVisualEffects
If ( TRY_TrayEvent = "Hide Tray Icon" )
{
SYS_TrayTipText = Tray icon will be hidden now.`nPress WIN+X to show it again.
SYS_TrayTipOptions = 2
SYS_TrayTipSeconds = 5
Gosub, SYS_TrayTipShow
SetTimer, TRY_TrayHide, 5000
}
If ( TRY_TrayEvent = "Exit" )
ExitApp
If ( TRY_TrayEvent = "Left Mouse Button" )
{
CFG_LeftMouseButtonHook := !CFG_LeftMouseButtonHook
Gosub, CFG_ApplySettings
}
If ( TRY_TrayEvent = "Middle Mouse Button" )
{
CFG_MiddleMouseButtonHook := !CFG_MiddleMouseButtonHook
Gosub, CFG_ApplySettings
}
If ( TRY_TrayEvent = "Right Mouse Button" )
{
CFG_RightMouseButtonHook := !CFG_RightMouseButtonHook
Gosub, CFG_ApplySettings
}
If ( TRY_TrayEvent = "Fourth Mouse Button" )
{
CFG_FourthMouseButtonHook := !CFG_FourthMouseButtonHook
Gosub, CFG_ApplySettings
}
If ( TRY_TrayEvent = "Fifth Mouse Button" )
{
CFG_FifthMouseButtonHook := !CFG_FifthMouseButtonHook
Gosub, CFG_ApplySettings
}
Gosub, TRY_TrayUpdate
TRY_TrayEvent =
Return
TRY_TrayHide:
SetTimer, TRY_TrayHide, Off
Menu, TRAY, NoIcon
Return
; [EDT] edits this script in notepad
^#!F9::
If ( A_IsCompiled )
Return
Gosub, SUS_SuspendSaveState
Suspend, On
MsgBox, 4129, Edit Handler - %SYS_ScriptInfo%, You pressed the hotkey for editing this script:`n`n%A_ScriptFullPath%`n`nDo you really want to edit?
Gosub, SUS_SuspendRestoreState
IfMsgBox, OK
Run, notepad.exe %A_ScriptFullPath%
Return
; [REL] reloads this script on change
REL_ScriptReload:
If ( A_IsCompiled )
Return
FileGetAttrib, REL_Attribs, %A_ScriptFullPath%
IfInString, REL_Attribs, A
{
FileSetAttrib, -A, %A_ScriptFullPath%
If ( REL_InitDone )
{
Gosub, SUS_SuspendSaveState
Suspend, On
MsgBox, 4145, Update Handler - %SYS_ScriptInfo%, The following script has changed:`n`n%A_ScriptFullPath%`n`nReload and activate this script?
Gosub, SUS_SuspendRestoreState
IfMsgBox, OK
Reload
}
}
REL_InitDone = 1
Return
; [EXT] exits this script
#x::
If ( A_IconHidden )
{
Menu, TRAY, Icon
SYS_TrayTipText = Tray icon is shown now.`nPress WIN+X again to exit NiftyWindows.
SYS_TrayTipSeconds = 5
Gosub, SYS_TrayTipShow
Return
}
If ( A_IsCompiled )
{
SYS_TrayTipText = NiftyWindows will exit now.`nYou can find it here (to start it again):`n%A_ScriptFullPath%
SYS_TrayTipOptions = 2
SYS_TrayTipSeconds = 5
Gosub, SYS_TrayTipShow
Suspend, On
Sleep, 5000
ExitApp
}
Gosub, SUS_SuspendSaveState
Suspend, On
MsgBox, 4145, Exit Handler - %SYS_ScriptInfo%, You pressed the hotkey for exiting this script:`n`n%A_ScriptFullPath%`n`nDo you really want to exit?
Gosub, SUS_SuspendRestoreState
IfMsgBox, OK
ExitApp
Return
; [CFG] handles the persistent configuration
CFG_LoadSettings:
CFG_IniFile = %A_ScriptDir%\%SYS_ScriptNameNoExt%.ini
IniRead, SUS_AutoSuspend, %CFG_IniFile%, Main, AutoSuspend, 1
IniRead, XWN_FocusFollowsMouse, %CFG_IniFile%, WindowHandling, FocusFollowsMouse, 0
IniRead, SYS_ToolTipFeedback, %CFG_IniFile%, Visual, ToolTipFeedback, 1
IniRead, UPD_LastUpdateCheck, %CFG_IniFile%, UpdateCheck, LastUpdateCheck, %A_MM%
IniRead, CFG_LeftMouseButtonHook, %CFG_IniFile%, MouseHooks, LeftMouseButton, 1
IniRead, CFG_MiddleMouseButtonHook, %CFG_IniFile%, MouseHooks, MiddleMouseButton, 1
IniRead, CFG_RightMouseButtonHook, %CFG_IniFile%, MouseHooks, RightMouseButton, 1
IniRead, CFG_FourthMouseButtonHook, %CFG_IniFile%, MouseHooks, FourthMouseButton, 1
IniRead, CFG_FifthMouseButtonHook, %CFG_IniFile%, MouseHooks, FifthMouseButton, 1
Return
CFG_SaveSettings:
CFG_IniFile = %A_ScriptDir%\%SYS_ScriptNameNoExt%.ini
IniWrite, %SUS_AutoSuspend%, %CFG_IniFile%, Main, AutoSuspend
IniWrite, %XWN_FocusFollowsMouse%, %CFG_IniFile%, WindowHandling, FocusFollowsMouse
IniWrite, %SYS_ToolTipFeedback%, %CFG_IniFile%, Visual, ToolTipFeedback
IniWrite, %UPD_LastUpdateCheck%, %CFG_IniFile%, UpdateCheck, LastUpdateCheck
IniWrite, %CFG_LeftMouseButtonHook%, %CFG_IniFile%, MouseHooks, LeftMouseButton
IniWrite, %CFG_MiddleMouseButtonHook%, %CFG_IniFile%, MouseHooks, MiddleMouseButton
IniWrite, %CFG_RightMouseButtonHook%, %CFG_IniFile%, MouseHooks, RightMouseButton
IniWrite, %CFG_FourthMouseButtonHook%, %CFG_IniFile%, MouseHooks, FourthMouseButton
IniWrite, %CFG_FifthMouseButtonHook%, %CFG_IniFile%, MouseHooks, FifthMouseButton
Return
CFG_ApplySettings:
If ( SUS_AutoSuspend )
SetTimer, SUS_SuspendHandler, 1000
Else
SetTimer, SUS_SuspendHandler, Off
If ( XWN_FocusFollowsMouse )
SetTimer, XWN_FocusHandler, 100
Else
SetTimer, XWN_FocusHandler, Off
If ( CFG_LeftMouseButtonHook )
CFG_LeftMouseButtonHookStr = On
Else
CFG_LeftMouseButtonHookStr = Off
If ( CFG_MiddleMouseButtonHook )
CFG_MiddleMouseButtonHookStr = On
Else
CFG_MiddleMouseButtonHookStr = Off
If ( CFG_RightMouseButtonHook )
CFG_RightMouseButtonHookStr = On
Else
CFG_RightMouseButtonHookStr = Off
If ( CFG_FourthMouseButtonHook )
CFG_FourthMouseButtonHookStr = On
Else
CFG_FourthMouseButtonHookStr = Off
If ( CFG_FifthMouseButtonHook )
CFG_FifthMouseButtonHookStr = On
Else
CFG_FifthMouseButtonHookStr = Off
Hotkey, $LButton, %CFG_LeftMouseButtonHookStr%
Hotkey, $^LButton, %CFG_LeftMouseButtonHookStr%
Hotkey, #LButton, %CFG_LeftMouseButtonHookStr%
Hotkey, #^LButton, %CFG_LeftMouseButtonHookStr%
Hotkey, #MButton, %CFG_MiddleMouseButtonHookStr%
Hotkey, #^MButton, %CFG_MiddleMouseButtonHookStr%
Hotkey, $MButton, %CFG_MiddleMouseButtonHookStr%
Hotkey, $^MButton, %CFG_MiddleMouseButtonHookStr%
Hotkey, $RButton, %CFG_RightMouseButtonHookStr%
Hotkey, $+RButton, %CFG_RightMouseButtonHookStr%
Hotkey, $+!RButton, %CFG_RightMouseButtonHookStr%
Hotkey, $+^RButton, %CFG_RightMouseButtonHookStr%
Hotkey, $+#RButton, %CFG_RightMouseButtonHookStr%
Hotkey, $+!^RButton, %CFG_RightMouseButtonHookStr%
Hotkey, $+!#RButton, %CFG_RightMouseButtonHookStr%
Hotkey, $+^#RButton, %CFG_RightMouseButtonHookStr%
Hotkey, $+!^#RButton, %CFG_RightMouseButtonHookStr%
Hotkey, $!RButton, %CFG_RightMouseButtonHookStr%
Hotkey, $!^RButton, %CFG_RightMouseButtonHookStr%
Hotkey, $!#RButton, %CFG_RightMouseButtonHookStr%
Hotkey, $!^#RButton, %CFG_RightMouseButtonHookStr%
Hotkey, $^RButton, %CFG_RightMouseButtonHookStr%
Hotkey, $^#RButton, %CFG_RightMouseButtonHookStr%
Hotkey, $#RButton, %CFG_RightMouseButtonHookStr%
Hotkey, $XButton1, %CFG_FourthMouseButtonHookStr%
Hotkey, $^XButton1, %CFG_FourthMouseButtonHookStr%
Hotkey, $XButton2, %CFG_FifthMouseButtonHookStr%
Hotkey, $^XButton2, %CFG_FifthMouseButtonHookStr%
Return
; [UPD] checks for a new build
UPD_CheckForUpdate:
UPD_CheckSuccess =
Random, UPD_Random
If ( TEMP )
UPD_BuildFile = %TEMP%\%SYS_ScriptNameNoExt%.%UPD_Random%.tmp
Else
UPD_BuildFile = %SYS_ScriptDir%\%SYS_ScriptNameNoExt%.%UPD_Random%.tmp
Gosub, SUS_SuspendSaveState
Suspend, On
URLDownloadToFile, http://www.enovatic.org/products/niftywindows/files/build.txt?random=%UPD_Random%, %UPD_BuildFile%
Gosub, SUS_SuspendRestoreState
If ( !ErrorLevel )
{
FileReadLine, UPD_Build, %UPD_BuildFile%, 1
If ( !ErrorLevel )
If UPD_Build is digit
{
UPD_CheckSuccess = 1
UPD_LastUpdateCheck = %A_MM%
If ( UPD_Build > SYS_ScriptBuild )
{
SYS_TrayTipText = There is a new version available. Please check website.
SYS_TrayTipOptions = 1
Run, http://www.enovatic.org/products/niftywindows/
}
Else
SYS_TrayTipText = There is no new version available.
}
Else
SYS_TrayTipText = wrong build pattern in downloaded build file
Else
SYS_TrayTipText = downloaded build file couldn't be read
}
Else
SYS_TrayTipText = build file couldn't be downloaded
FileDelete, %UPD_BuildFile%
If ( !UPD_CheckSuccess )
{
SYS_TrayTipText = Check for update failed:`n%SYS_TrayTipText%
SYS_TrayTipOptions = 3
}
Gosub, SYS_TrayTipShow
Return
UPD_AutoCheckForUpdate:
If ( UPD_LastUpdateCheck != A_MM )
{
Gosub, SUS_SuspendSaveState
Suspend, On
MsgBox, 4132, Update Handler - %SYS_ScriptInfo%, You haven't checked for updates for a long period of time (at least one month).`n`nDo you want NiftyWindows to check for a new version now (highly recommended)?
Gosub, SUS_SuspendRestoreState
IfMsgBox, Yes
Gosub, UPD_CheckForUpdate
Else
UPD_LastUpdateCheck = %A_MM%
}
Return
^#!b::
If ( !A_IsCompiled )
{
UPD_VersionFile = %SYS_ScriptDir%\version.txt
IfExist, %UPD_VersionFile%
{
FileDelete, %UPD_VersionFile%
If ( ErrorLevel )
Return
}
FileAppend, %SYS_ScriptVersion%, %UPD_VersionFile%
If ( ErrorLevel )
Return
UPD_BuildFile = %SYS_ScriptDir%\build.txt
IfExist, %UPD_BuildFile%
{
FileDelete, %UPD_BuildFile%
If ( ErrorLevel )
Return
}
FileAppend, %A_NowUTC%, %UPD_BuildFile%
If ( ErrorLevel )
Return
SYS_TrayTipText = Version and build files were written successfully:`n%UPD_VersionFile%`n%UPD_BuildFile%
SYS_TrayTipOptions = 2
SYS_TrayTipSeconds = 5
Gosub, SYS_TrayTipShow
}
Return
A modification of the NiftyWindows AutoHotkey script, this snippet attempts to solve the following issues that I have been experiencing with the original script: * Middle click sends double click. This causes an issue for me as I use middle clicks to close: * Tabs * Applications using the title bar (this snippet adds this functionality) * Applications using the task bar (this snippet allows middle clicks through to non-title bar areas if right button is not also pressed)
paulhagstrom/Auto-tag, auto-file script for Mail.app, Address Book, MailTags ( AppleScript)
(*
SmartTagMail script
Paul Hagstrom, January 2008
Usage:
Set autoTagTrigger and autoBoxTrigger to something, e.g., "autotag:" and "autobox:"
Requires (of course): MailTags.
In the notes of an address book entry, you can follow the trigger with a word.
When this rule is invoked on a message, it will look in associated address book records,
and, where it finds the trigger in the notes, it will tag/move the message accordingly.
A tag will be added for each person with a trigger associated with the message.
If one or more of the people is a member of a group whose name contains the
autotag trigger, that tag will be added as well. (e.g. "UIS autotag:uis")
Where there are multiple autobox triggers encountered, the first one found
will be acted on UNLESS a later one starts with "!", in which case it will
be then considered to be the first one found. This, the message is moved to
the first box found, or, if there are any forced boxes, then the last forced
box found.
autotag takes a tag name, autobox takes a mailbox name.
Mailbox names need to reflect the hierarchy, e.g. Lists/scriptlists
It will look in the note field from trigger: until the end of its line
I envision using this myself as a script manually called using Mail Act-On,
but if you really come to trust it, I suppose you could automatically apply it
to all incoming mail.
autoproject is not implemented yet, but should be easy.
A note about case. Email addresses in the address book need to be all
lowercase to be found. You have control over the Address Book. Fix broken ones.
You don't have control over incoming email, so those are lowercased for you.
It's a flaw in Address Book that there's no way to search for email addresses
case insensitively.
If this is called from a rule with "sender only" in the name, then only
the sender, and not the recipients, will be scanned. (Intended use is
for mail sent to big lists from a known correspondent.) In case it is useful, it
will also look for "recipients only" in the name, which will likewise
trigger scanning of the recipients and not the sender. And, finally, it will
look for "addressees only" in the name, which will scan the to:
recipients, but not the cc: recipients. The priority is sender, recipients, addressees.
If a rule name contains more than one of these keywords, only the first priority one takes effect.
*)
property autoTagTrigger : "autotag:" --text for tag trigger in notes and group names
property autoBoxTrigger : "autobox:" --text for box trigger in notes and group names
property autoProjTrigger : "autoproject:" --text for project trigger in notes and group names
property debugLevel : 2 --set from 0 to 3 depending on how detailed you want console output to be
property dryRun : false --set to false to actually move and tag, true to just pretend
property triggerNames : {"tag", "box"} --used in logging for findTrigger at debugLevel 3
(* Send debugging information to the console *)
on Logger(level, str)
if debugLevel > level then
do shell script "logger " & quoted form of ("SmartTagMail - " & str)
end if
end Logger
(* Collect emails from the current message and return them in a list *)
(* the parameters govern whether the sender's email is collected,
whether all recipients' emails are collected, and whether just the to: recipients are collected.
Note that if scanRecipients is false, the value of scanTo is irrelevant. *)
on collectEmails(msg, scanSender, scanRecipients, scanTo)
my Logger(2, "Collecting emails.")
using terms from application "Mail"
set theEmails to {}
--first check the sender, if we are supposed to
if scanSender then
set theSender to sender of msg
set theEmail to extract address from theSender
set theEmails to {theEmail}
my Logger(1, "Collect emails: Sender: " & theEmail)
end if
--now go through the recipients, if we are supposed to
if scanRecipients then
if scanTo then
set theRecipients to every to recipient of msg
else
set theRecipients to every recipient of msg
end if
repeat with theRecipient in theRecipients
set theEmail to address of theRecipient
set theEmails to theEmails & {theEmail}
my Logger(1, "Collect emails: Recipient: " & theEmail)
end repeat
end if
end using terms from
return theEmails
end collectEmails
(* Scan the note for triggers passed in as the second parameter. Multiple hits are possible, but each trigger takes the rest of its line. That is, you can have autotag:X and autotag:Y on two different lines and add both tags X and Y. The way it parses it that it cuts out everything up to the trigger and the processes the rest again. What this means is that you'll get funny results if your trigger is "autotag:" and you try to use it to tag a message with the tag "autotag:" Don't do that. *)
on findTriggers(theNote, theTriggers)
my Logger(2, "Scanning for triggers.")
set foundTriggers to {}
repeat with i from 1 to length of theTriggers
set theTrigger to item i of theTriggers
set theTail to theNote
set theResults to {}
repeat
set theOffset to offset of theTrigger in theTail
if theOffset > 0 then
set theOffset to theOffset + (length of theTrigger)
set theTail to (text theOffset thru (length of theTail) of theTail) as text
set theValue to paragraph 1 of theTail
set theResults to theResults & theValue
my Logger(2, "Trigger for " & (item i of triggerNames) & ": " & theValue)
else
exit repeat
end if
end repeat
set foundTriggers to foundTriggers & {theResults}
end repeat
return foundTriggers
end findTriggers
on processPerson(theEmail, triggerList)
tell application "Address Book"
--look for a person who has this email address (see note at top about case)
try
set foundPerson to (first person where value of every email of it contains (lowercase (theEmail)))
on error
my Logger(1, "Scan Address Book: No entry for " & theEmail)
return {}
end try
try
--scan the person's note for triggers
set theNote to (get note of foundPerson)
set theName to (get name of foundPerson)
my Logger(1, "Scan Address Book: Processing " & theName & " - " & theEmail)
set foundTriggers to (my findTriggers(theNote, triggerList))
--Look for groups that might contain additional triggers
set theGroups to every group of foundPerson
repeat with theGroup in theGroups
set statusString to ""
set theGroupName to name of theGroup
my Logger(2, "Scan Address Book: Processing group " & theGroupName)
set groupTriggers to (my findTriggers(theGroupName, triggerList))
repeat with i from 1 to length of groupTriggers
set foundItems to (a reference to item i of foundTriggers)
set contents of foundItems to contents of foundItems & item i of groupTriggers
end repeat
end repeat
return foundTriggers
on error errMsg number errNumber
my Logger(1, "Scan Address Book: Error for: " & theEmail & ": " & errMsg)
return {}
end try
end tell
end processPerson
using terms from application "Mail"
on perform mail action with messages theMessages for rule theRule
--here is where the mapping from triggers to tag/box/project happens. Most of the rest of the code is pretty general.
set triggerList to {autoTagTrigger, autoBoxTrigger}
--set triggerList to {autoTagTrigger, autoBoxTrigger, autoProjTrigger}
set tagItem to 1
set boxItem to 2
--set projectItem to 3
Logger(0, "***Starting: triggers " & triggerList)
Logger(2, "***Starting: theRule name is " & name of theRule)
set scanSender to true
set scanRecipients to true
set scanTo to false
if name of theRule contains "sender only" then
set scanRecipients to false
Logger(1, "***Scanning only sender (rule name contains sender)")
else
if name of theRule contains "recipients only" then
Logger(1, "***Scanning only recipients")
set scanSender to false
else
if name of theRule contains "addressees only" then
Logger(1, "***Scanning only to: recipients")
set scanTo to true
else
Logger(1, "***Scanning sender and all recipients")
end if
end if
end if
if dryRun then
Logger(0, "***DRY RUN")
end if
Logger(2, "***DEBUG LEVEL: " & debugLevel)
Logger(2, "Messages selected: " & (length of theMessages))
repeat with msg in theMessages
Logger(2, "Beginning message processing.")
set theEmails to my collectEmails(msg, scanSender, scanRecipients, scanTo)
set combinedTriggers to {}
repeat with theEmail in theEmails
set foundTriggers to processPerson(theEmail, triggerList)
if length of foundTriggers > 0 then --if it isn't then the person wasn't in the address book, ignore
if length of combinedTriggers is 0 then --this is the first substantive time through the loop
set combinedTriggers to foundTriggers
else
repeat with i from 1 to length of foundTriggers
set combinedItems to (a reference to item i of combinedTriggers)
set contents of combinedItems to contents of combinedItems & item i of foundTriggers
end repeat
end if
end if
end repeat
(* Having found all of the available triggers, we now deal with them. Tags first. *)
Logger(2, "Consolidating tags.")
using terms from application "MailTagsScriptingSupport"
set newTags to keywords of msg
Logger(2, "Existing tags: " & (newTags as text))
set tagsDirty to false
repeat with theTag in item tagItem of combinedTriggers
if length of theTag > 0 then
if newTags does not contain theTag then
set newTags to newTags & theTag
set tagsDirty to true
end if
end if
end repeat
end using terms from
(* Now, deal with the boxes. *)
Logger(2, "Consolidating boxes.")
set moveBox to ""
repeat with theBox in item boxItem of combinedTriggers
if character 1 of theBox is "!" then
set testBox to (text 2 thru (length of theBox) of theBox) as text
set force to true
else
set testBox to theBox
set force to false
end if
if exists mailbox testBox then
if force then
Logger(2, "Mailbox forced to: " & testBox)
set moveBox to testBox
else
if length of moveBox is 0 then
Logger(2, "Mailbox set to: " & testBox)
set moveBox to testBox
else
Logger(2, "Mailbox ignored: " & testBox)
end if
end if
else
--if the mailbox doesn't exist, ignore it
Logger(2, "Mailbox does not exist: " & testBox)
set testBox to ""
end if
end repeat
(* Later I will add project handling here too. It will work just like Boxes, there's only one. *)
(* Now, process the message. Because doing multiple things to a message can cause it to get lost, I will use the workaround proposed by ahmontgo on the indev.ca forum, and move the message first, then find it again, and perform the other operations *)
set msgID to the message id of msg
--Move if needed
if length of moveBox > 0 then
if mailbox of msg is mailbox moveBox then
Logger(0, "Already in target box: " & moveBox)
else
Logger(0, "Moving to box: " & moveBox)
if not dryRun then
set mailbox of msg to mailbox moveBox
--if we need to do more, then find the message again post-move
if tagsDirty then
set targetMessages to (messages of mailbox moveBox whose message id is msgID)
set msg to the first item of targetMessages
end if
end if
end if
end if
--Tag if needed
using terms from application "MailTagsScriptingSupport"
if tagsDirty then
Logger(0, "Setting keywords to: " & (newTags as text))
if not dryRun then
set keywords of msg to newTags
end if
end if
end using terms from
end repeat
end perform mail action with messages
end using terms from
A few weeks ago, I created an Applescript to simplify my use of Mail Act-On using MailTags. I've been using it since then and it seems to be working pretty reliably (but see note below), so I thought I'd share it in its current state.
What it does is leverages information from Address Book to determine where a message should be filed, so that it is not necessary to create an individual Mail rule for each one. The main reason I did this is that I did not want to keep each sender's list of alternative email addresses both in Address Book and in a Mail rule, since any changes would then need to be made in both places.
What it does is scan through the senders and recipients and looks in Address Book to see if it can find a match. If it does, it checks the Notes field for that person to see if it finds the text "autobox:" or "autotag:", and if it does, it will move the message (autobox), or tag the message (autotag), or both. I also had it check groups that found records are in, so that you can create groups of people that will be autofiled or autotagged. Since groups don't have "notes" fields, the trigger needs to be in the group name. The comments to the script elaborate the usage in more detail. I have not added automatic assignment of projects, but it is an easy extension, which when I have a chance I might add myself. It can be run in several modes, based on the name of the rule that calls it. I have set up four rules, all of them calling the script, but when the rule has "sender only" in its name, the script will check only the sender, and when the rule has "recipients only" in its name, the script will check only the recipients, etc. (see the code comments). I assigned a different MAO key to each of these rules (1, 2, 3, and 4, in fact), and use the one most appropriate to the email I'm trying to autotag and autofile.
The note I wanted to add about the reliability of this is this: It generally seems to work, I haven't had any problems that I can certainly pin on this script. However, I have a couple of times had Mail flip out on me just after running this script, putting up a dialog saying that it has to quit now, and re-import the messages upon restart (that is, the envelope index got corrupted somehow). This is a pain, I have 180k messages in my local files, and reimporting (which means just rebuilding the envelope index file) takes a long time.
I am kind of a novice at Applescript, so there may be various ways in which this script could be improved -- and I'd be happy to hear about them. Any speculation about what might have the consequence of corrupting the envelope index would also be very welcome. As I say, it may have nothing to do with this script, but it just happened to occur both times I've seen it recently after running the script (on a message that was already where it was supposed to be -- that is, running this a second time on the same message).
sveggiani/Avoid Cakephp auto adding ID parameter in some finds ( PHP)
function index( $year = null ){
// ultimo newsletter activo
$last_newsletter = $this->Newsletter->find( 'first', array('conditions' => array('Newsletter.id IS NOT NULL') ) );
$this->set('last_newsletter', $last_newsletter);
}
When you have a URL like this http://mysite/newsletters/index/2007
The find('first') method adds the 2007 value as ID parameter
WTF!?
dunforget/facebook FBML show different content for fans and non-fans ( HTML)
<link ref="stylesheet" type="text/css" href="LINK_TO_CSS" />
<div id="wrapper">
<fb:visible-to-connection>
CONTENT VISIBLE FOR FANS ONLY
<fb:else>
<div id="non-fans">
CONTENT VISIBLE FOR NON FANS
</div>
</fb:else>
</fb:visible-to-connection>
</div>
css:
#wrapper {
width:520px;
margin:0 auto; border:0; padding:0;
position:relative;
}
#non-fans {
width:520px;
position:absolute; top:0; left:0;
}
burnandbass/AS3 memory util, grawl-like notification ( ActionScript 3)
package {
import flash.display.Sprite;
import flash.display.Stage;
import flash.text.TextField;
import flash.text.TextFormat;
import flash.text.TextFieldAutoSize;
import flash.text.TextFormatAlign;
import flash.text.AntiAliasType;
import flash.geom.Rectangle;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.system.System;
import flash.utils.getTimer;
import com.greensock.TweenLite;
/*
Debug Util - simple memory managment, grawl-like flash notifications, easy button setup
Author: Chrysto Panayotov ( burnandbass[at]gmail.com )
Dependencies: TweenLite ( http://tweenlite.com/ )
Usage: Debug.create(this.stage);
this creates stats winndow on the stage, when you click it outputs more information
public static functions:
Debug.log( message:String ) --> Outputs the message
Debug.error( message:String ) --> Outputs the message (in red)
Debug.addButton(name:String, funk:Function);
the this will add new button to the manager and execute the function when the button is clicked
example: Debug.addButton("Simple Button", function():void{ trace("Hello from Debug"); });
Debug.destroy() --> removes the manager and clears all EventListeners
Default: When you click on the manager it will grawl information : current memory, the maximum memory flash player reached
and the free memory, also the stageWidth and stageHeight
*/
public class Debug extends Sprite{
private static var _stage:Stage;
private static var _debug:Sprite;
private static var _debugText:TextField;
private static var _time:Number;
private static var _maxMemory:Number = 0;
private static var _grawlHeight:Number = 0;
private static var _created:Boolean = false;
private static var _grawlOptions:Object = {
grawlTextWidth: 350, //width of the text field
padding: 10, // padding - from bottom, right and between notifications
openTime: 0.7, // open time
closeTime: 0.5, // close time
stayTime: 4 // time in seconds that the notification stays
}
public function Debug() {
throw new Error("Use Debug.create(this.stage) to make instance of debug panel");
}
/*
This is how you initialize the manager, just use Debug.create(this.stage) in the main class
*/
public static function create(stage:Stage):void{
if(!_created){
_created = true;
_stage = stage;
_time = getTimer();
createDebug();
_stage.addChild(_debug);
_debug.x = _debug.y = 5;
_stage.addEventListener(Event.ADDED, popDebug, false, 0, true);
_stage.addEventListener(Event.ENTER_FRAME, update);
} else {
Debug.error("DebugPanel is already created!");
}
}
/*
Outputs message on the screen
*/
public static function log(message:String):void{
grawl("log", message);
}
/*
Outputs error on the screen
*/
public static function error(message:String):void{
grawl("error", message);
}
public static function addButton(name:String, onClick:Function):void{
var btn:Sprite = new Sprite();
var format:TextFormat = new TextFormat();
format.align = TextFormatAlign.LEFT;
format.color = 0xFFFFFF;
format.font = "Helvetica";
format.size = 12;
var label:TextField = new TextField();
label.autoSize = TextFieldAutoSize.LEFT;
label.embedFonts = false;
label.selectable = false;
label.defaultTextFormat = format;
label.x = _debugText.y = 3;
label.text = name;
btn.graphics.beginFill(0x000000, 1);
btn.graphics.drawRoundRect(0,0,label.textWidth + 12,20,10,10);
btn.graphics.endFill();
btn.buttonMode = true;
btn.mouseChildren = false;
btn.addChild(label);
label.x = label.y = 3;
btn.addEventListener(MouseEvent.CLICK, onClick);
_debug.addChild(btn);
btn.x = _debug.width + 2;
}
/*
Internal function, creates the panel and the textfield
*/
private static function createDebug():void{
_debug = new Sprite();
_debug.graphics.beginFill(0x000000, 1);
_debug.graphics.drawRoundRect(0,0,110,20,10,10);
_debug.graphics.endFill();
_debug.mouseChildren = true;
var format:TextFormat = new TextFormat();
format.align = TextFormatAlign.LEFT;
format.color = 0xFFFFFF;
format.font = "Helvetica";
format.size = 12;
_debugText = new TextField();
_debugText.autoSize = TextFieldAutoSize.LEFT;
_debugText.embedFonts = false;
_debugText.selectable = false;
_debugText.defaultTextFormat = format;
_debug.addChild(_debugText);
_debugText.x = _debugText.y = 3;
_debugText.text = "";
_debug.addEventListener(MouseEvent.ROLL_OVER, onDebugOver, false, 0, true);
_debug.addEventListener(MouseEvent.ROLL_OUT, onDebugOut, false, 0, true);
_debugText.addEventListener(MouseEvent.CLICK, onDebugClick, false, 0, true);
}
/*
internal function called on every "enterFrame" event, calculates the memory and fps
*/
private static function update(event:Event):void{
var memory:Number = Number((System.totalMemory / 1024 / 1024).toFixed(2));
if(memory > _maxMemory){
_maxMemory = memory;
}
var fps:Number = Number (1000 / (getTimer() - _time));
_debugText.text = memory + " mb / " + Math.ceil(fps) + " fps";
_time = getTimer();
}
/*
Internal function that actually creates the grawl
*/
private static function grawl(type:String, text:String):void{
var padding:Number = 10;
var format:TextFormat = new TextFormat();
format.align = TextFormatAlign.LEFT;
format.color = type == "log" ? 0xFFFFFF : 0x000000;
format.font = "Helvetica";
format.size = 14;
var grawlText:TextField = new TextField();
grawlText.width = _grawlOptions.grawlTextWidth;
grawlText.multiline = true;
grawlText.wordWrap = true;
grawlText.autoSize = TextFieldAutoSize.LEFT;
grawlText.embedFonts = false;
grawlText.selectable = true;
grawlText.defaultTextFormat = format;
grawlText.text = text;
var bg:Sprite = new Sprite();
var bgColor:uint = type == "log" ? 0x000000 : 0xFF0000;
bg.graphics.beginFill(bgColor, 1);
bg.graphics.drawRoundRect(0,0, grawlText.width + padding*2, grawlText.height + padding*2, 10,10);
bg.graphics.endFill();
bg.addChild(grawlText);
grawlText.x = padding;
grawlText.y = padding;
_stage.addChild(bg);
bg.alpha = 0;
bg.x = _stage.stageWidth - bg.width - _grawlOptions.padding;
bg.y = _stage.stageHeight - bg.height - _grawlOptions.padding - _grawlHeight;
_grawlHeight += bg.height + _grawlOptions.padding;
TweenLite.to(bg, _grawlOptions.openTime, {alpha: 0.9});
TweenLite.delayedCall(_grawlOptions.stayTime, function():void{
TweenLite.to(bg, _grawlOptions.closeTime, {alpha:0, onComplete:function():void{
_stage.removeChild(bg);
_grawlHeight -= bg.height + _grawlOptions.padding;
}})
});
}
/*
Tween when you roll over the panel
*/
private static function onDebugOver(event:MouseEvent):void{
TweenLite.to(_debug, 0.5, {alpha: 1});
}
/*
Tween when you roll out the panel
*/
private static function onDebugOut(event:MouseEvent):void{
TweenLite.to(_debug, 0.5, {alpha: 0.5});
}
/*
Shows the current memory, maximum memory and fps
*/
private static function onDebugClick(event:MouseEvent):void{
log("[Memory] : " + Number((System.totalMemory / 1024 / 1024).toFixed(2)) + " max: " + _maxMemory + " free: " + Number((System.freeMemory / 1024 / 1024).toFixed(2))
+ "\n"
+ "[Stage ] : width: " + _stage.stageWidth + " height: " + _stage.stageHeight)
// you can extend this with custom vars, you wanna output
}
/*
internal function , sets the panel on the top of stages display list
*/
private static function popDebug(event:Event):void{
_stage.setChildIndex(_debug, _stage.numChildren-1);
}
//////////////////////////// DESTROY //////////////////////////////////////////////
/*
Destroys the manager
*/
public static function destroy():void{
_stage.removeEventListener(Event.ADDED, popDebug);
_stage.removeEventListener(Event.ENTER_FRAME, update)
_debug.removeEventListener(MouseEvent.ROLL_OVER, onDebugOver);
_debug.removeEventListener(MouseEvent.ROLL_OUT, onDebugOut);
_debugText.removeEventListener(MouseEvent.CLICK, onDebugClick);
_stage.removeChild(_debug);
System.gc();
}
}//end
}
localhorst/Create short IDs with PHP - Like Youtube or TinyURL ( PHP)
<?php
/**
* Translates a number to a short alhanumeric version
*
* Translated any number up to 9007199254740992
* to a shorter version in letters e.g.:
* 9007199254740989 --> PpQXn7COf
*
* specifiying the second argument true, it will
* translate back e.g.:
* PpQXn7COf --> 9007199254740989
*
* this function is based on any2dec && dec2any by
* fragmer[at]mail[dot]ru
* see: http://nl3.php.net/manual/en/function.base-convert.php#52450
*
* If you want the alphaID to be at least 3 letter long, use the
* $pad_up = 3 argument
*
* In most cases this is better than totally random ID generators
* because this can easily avoid duplicate ID's.
* For example if you correlate the alpha ID to an auto incrementing ID
* in your database, you're done.
*
* The reverse is done because it makes it slightly more cryptic,
* but it also makes it easier to spread lots of IDs in different
* directories on your filesystem. Example:
* $part1 = substr($alpha_id,0,1);
* $part2 = substr($alpha_id,1,1);
* $part3 = substr($alpha_id,2,strlen($alpha_id));
* $destindir = "/".$part1."/".$part2."/".$part3;
* // by reversing, directories are more evenly spread out. The
* // first 26 directories already occupy 26 main levels
*
* more info on limitation:
* - http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/165372
*
* if you really need this for bigger numbers you probably have to look
* at things like: http://theserverpages.com/php/manual/en/ref.bc.php
* or: http://theserverpages.com/php/manual/en/ref.gmp.php
* but I haven't really dugg into this. If you have more info on those
* matters feel free to leave a comment.
*
* @author Kevin van Zonneveld <kevin@vanzonneveld.net>
* @copyright 2008 Kevin van Zonneveld (http://kevin.vanzonneveld.net)
* @license http://www.opensource.org/licenses/bsd-license.php New BSD Licence
* @version SVN: Release: $Id: alphaID.inc.php 344 2009-06-10 17:43:59Z kevin $
* @link http://kevin.vanzonneveld.net/
*
* @param mixed $in String or long input to translate
* @param boolean $to_num Reverses translation when true
* @param mixed $pad_up Number or boolean padds the result up to a specified length
*
* @return mixed string or long
*/
function alphaID($in, $to_num = false, $pad_up = false)
{
$index = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
$base = strlen($index);
if ($to_num) {
// Digital number <<-- alphabet letter code
$in = strrev($in);
$out = 0;
$len = strlen($in) - 1;
for ($t = 0; $t <= $len; $t++) {
$bcpow = bcpow($base, $len - $t);
$out = $out + strpos($index, substr($in, $t, 1)) * $bcpow;
}
if (is_numeric($pad_up)) {
$pad_up--;
if ($pad_up > 0) {
$out -= pow($base, $pad_up);
}
}
} else {
// Digital number -->> alphabet letter code
if (is_numeric($pad_up)) {
$pad_up--;
if ($pad_up > 0) {
$in += pow($base, $pad_up);
}
}
$out = "";
for ($t = floor(log10($in) / log10($base)); $t >= 0; $t--) {
$a = floor($in / bcpow($base, $t));
$out = $out . substr($index, $a, 1);
$in = $in - ($a * bcpow($base, $t));
}
$out = strrev($out); // reverse
}
return $out;
}
?>
Example
Running:
alphaID(9007199254740989);
will return 'PpQXn7COf' and:
alphaID('PpQXn7COf', true);
will return '9007199254740989'
Easy right?