From f95a59efdd993fdb832397fba9af61d49dea4ff7 Mon Sep 17 00:00:00 2001 From: MrTyton Date: Thu, 8 Sep 2016 06:09:42 -0400 Subject: [PATCH] Wrapper script for notifications --- balloonNotify.py | 85 ++++++++++++++++++++++++++++++++++++++++++++ config_template.ini | 5 +++ ff.png | Bin 0 -> 14699 bytes giNotify.py | 21 +++++++++++ runner_notify.py | 85 ++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 196 insertions(+) create mode 100755 balloonNotify.py create mode 100644 ff.png create mode 100644 giNotify.py create mode 100644 runner_notify.py diff --git a/balloonNotify.py b/balloonNotify.py new file mode 100755 index 0000000..a857d61 --- /dev/null +++ b/balloonNotify.py @@ -0,0 +1,85 @@ +# -- coding: utf-8 -- + +from win32api import * +from win32gui import * +import win32con +import sys, os +import struct +import time +import threading +import cmd +from os.path import join, dirname, abspath + +# Class +class WindowsBalloonTip: + def __init__(self, title, msg): + message_map = { win32con.WM_DESTROY: self.OnDestroy,} + + # Register the window class. + wc = WNDCLASS() + hinst = wc.hInstance = GetModuleHandle(None) + wc.lpszClassName = 'PythonTaskbar' + wc.lpfnWndProc = message_map # could also specify a wndproc. + while True: + try: + classAtom = RegisterClass(wc) + break + except: + continue + # Create the window. + style = win32con.WS_OVERLAPPED | win32con.WS_SYSMENU + self.hwnd = CreateWindow(classAtom, "Taskbar", style, 0, 0, win32con.CW_USEDEFAULT, win32con.CW_USEDEFAULT, 0, 0, hinst, None) + UpdateWindow(self.hwnd) + + # Icons managment + iconPathName = join(dirname(abspath(__file__)), 'ff.png') + #print iconPathName + icon_flags = win32con.LR_LOADFROMFILE | win32con.LR_DEFAULTSIZE + try: + hicon = LoadImage(hinst, iconPathName, win32con.IMAGE_ICON, 0, 0, icon_flags) + except: + hicon = LoadIcon(0, win32con.IDI_APPLICATION) + flags = NIF_ICON | NIF_MESSAGE | NIF_TIP + nid = (self.hwnd, 0, flags, win32con.WM_USER+20, hicon, 'Tooltip') + + # Notify + Shell_NotifyIcon(NIM_ADD, nid) + Shell_NotifyIcon(NIM_MODIFY, (self.hwnd, 0, NIF_INFO, win32con.WM_USER+20, hicon, 'Balloon Tooltip', msg, 200, title)) + + # self.show_balloon(title, msg) + time.sleep(5) + + # Destroy + DestroyWindow(self.hwnd) + classAtom = UnregisterClass(classAtom, hinst) + def OnDestroy(self, hwnd, msg, wparam, lparam): + nid = (self.hwnd, 0) + Shell_NotifyIcon(NIM_DELETE, nid) + #PostQuitMessage(0) # Terminate the app. + +# Function + +class myThread(threading.Thread): + def __init__(self, title, msg): + + threading.Thread.__init__(self) + self.title = title + self.msg = msg + def run(self): + w = WindowsBalloonTip(self.title, self.msg) + + +def balloon_tip(title, msg): + + thread1 = myThread(title, msg) + thread1.start() + return + #w=WindowsBalloonTip(title, msg) + +class Notification(): + def __init__(self): + pass + + def send_notification(self, title, text): + balloon_tip(title, msg) + diff --git a/config_template.ini b/config_template.ini index 60180d1..69fa1d6 100644 --- a/config_template.ini +++ b/config_template.ini @@ -7,3 +7,8 @@ mailbox= [locations] library= input= + +[runner] +notification= +pushbullet= +pbdevice= diff --git a/ff.png b/ff.png new file mode 100644 index 0000000000000000000000000000000000000000..413cb46b6c6409ec7efe05c3fbd706e8e71698b1 GIT binary patch literal 14699 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