Beginning of integration with Ubuntu Messaging Menu
This commit is contained in:
parent
0d81e01157
commit
24094949cf
2
debian/control
vendored
2
debian/control
vendored
|
@ -10,7 +10,7 @@ Vcs-Git: https://github.com/Bitmessage/PyBitmessage.git
|
||||||
|
|
||||||
Package: pybitmessage
|
Package: pybitmessage
|
||||||
Architecture: all
|
Architecture: all
|
||||||
Depends: ${misc:Depends}, python (>= 2.7.0), openssl, python-qt4, libqt4-dev (>= 4.8.0), python-qt4-dev, sqlite3, libsqlite3-dev
|
Depends: ${misc:Depends}, python (>= 2.7.0), openssl, python-qt4, libqt4-dev (>= 4.8.0), python-qt4-dev, sqlite3, libsqlite3-dev, libmessaging-menu-dev
|
||||||
Description: Send encrypted messages to another person or to many subscribers
|
Description: Send encrypted messages to another person or to many subscribers
|
||||||
Bitmessage is a P2P communications protocol used to send encrypted messages
|
Bitmessage is a P2P communications protocol used to send encrypted messages
|
||||||
to another person or to many subscribers. It is decentralized and trustless,
|
to another person or to many subscribers. It is decentralized and trustless,
|
||||||
|
|
1
debian/rules
vendored
1
debian/rules
vendored
|
@ -20,6 +20,7 @@ install: build clean
|
||||||
dh_testroot
|
dh_testroot
|
||||||
dh_prep
|
dh_prep
|
||||||
dh_installdirs
|
dh_installdirs
|
||||||
|
|
||||||
mkdir -m 755 -p $(CURDIR)/debian/$(APP)/usr
|
mkdir -m 755 -p $(CURDIR)/debian/$(APP)/usr
|
||||||
mkdir -m 755 -p $(CURDIR)/debian/$(APP)/usr/bin
|
mkdir -m 755 -p $(CURDIR)/debian/$(APP)/usr/bin
|
||||||
mkdir -m 755 -p $(DEST_APP)
|
mkdir -m 755 -p $(DEST_APP)
|
||||||
|
|
|
@ -2,8 +2,12 @@
|
||||||
Type=Application
|
Type=Application
|
||||||
Name=PyBitmessage
|
Name=PyBitmessage
|
||||||
GenericName=PyBitmessage
|
GenericName=PyBitmessage
|
||||||
|
X-GNOME-FullName=PyBitmessage Secure Messaging
|
||||||
Comment=Send encrypted messages to another person or to many subscribers
|
Comment=Send encrypted messages to another person or to many subscribers
|
||||||
Exec=pybitmessage %U
|
Exec=pybitmessage
|
||||||
Icon=pybitmessage
|
Icon=pybitmessage
|
||||||
Terminal=false
|
Terminal=false
|
||||||
Categories=Network
|
Categories=Network;Email;Application
|
||||||
|
Keywords=Email;E-mail;Newsgroup;Messaging
|
||||||
|
X-MessagingMenu-UsesChatSection=true
|
||||||
|
X-Ubuntu-Gettext-Domain=pybitmessage
|
||||||
|
|
|
@ -48,7 +48,6 @@ from SimpleXMLRPCServer import *
|
||||||
import json
|
import json
|
||||||
from subprocess import call #used when the API must execute an outside program
|
from subprocess import call #used when the API must execute an outside program
|
||||||
|
|
||||||
|
|
||||||
#For each stream to which we connect, several outgoingSynSender threads will exist and will collectively create 8 connections with peers.
|
#For each stream to which we connect, several outgoingSynSender threads will exist and will collectively create 8 connections with peers.
|
||||||
class outgoingSynSender(threading.Thread):
|
class outgoingSynSender(threading.Thread):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
|
|
|
@ -5,6 +5,15 @@ except Exception, err:
|
||||||
print 'PyBitmessage requires PyQt. You can download it from http://www.riverbankcomputing.com/software/pyqt/download or by searching Google for \'PyQt Download\' (without quotes).'
|
print 'PyBitmessage requires PyQt. You can download it from http://www.riverbankcomputing.com/software/pyqt/download or by searching Google for \'PyQt Download\' (without quotes).'
|
||||||
print 'Error message:', err
|
print 'Error message:', err
|
||||||
sys.exit()
|
sys.exit()
|
||||||
|
|
||||||
|
try:
|
||||||
|
from gi.repository import MessagingMenu
|
||||||
|
except ImportError:
|
||||||
|
MessagingMenu = None
|
||||||
|
with_messagingmenu = False
|
||||||
|
else:
|
||||||
|
with_messagingmenu = True
|
||||||
|
|
||||||
from addresses import *
|
from addresses import *
|
||||||
import shared
|
import shared
|
||||||
from bitmessageui import *
|
from bitmessageui import *
|
||||||
|
@ -24,6 +33,7 @@ from pyelliptic.openssl import OpenSSL
|
||||||
import pickle
|
import pickle
|
||||||
|
|
||||||
class MyForm(QtGui.QMainWindow):
|
class MyForm(QtGui.QMainWindow):
|
||||||
|
|
||||||
def __init__(self, parent=None):
|
def __init__(self, parent=None):
|
||||||
QtGui.QWidget.__init__(self, parent)
|
QtGui.QWidget.__init__(self, parent)
|
||||||
self.ui = Ui_MainWindow()
|
self.ui = Ui_MainWindow()
|
||||||
|
@ -228,12 +238,13 @@ class MyForm(QtGui.QMainWindow):
|
||||||
shared.sqlSubmitQueue.put('')
|
shared.sqlSubmitQueue.put('')
|
||||||
queryreturn = shared.sqlReturnQueue.get()
|
queryreturn = shared.sqlReturnQueue.get()
|
||||||
shared.sqlLock.release()
|
shared.sqlLock.release()
|
||||||
|
str_broadcast_subscribers = '[Broadcast subscribers]'
|
||||||
for row in queryreturn:
|
for row in queryreturn:
|
||||||
msgid, toAddress, fromAddress, subject, received, message, read = row
|
msgid, toAddress, fromAddress, subject, received, message, read = row
|
||||||
|
|
||||||
try:
|
try:
|
||||||
if toAddress == '[Broadcast subscribers]':
|
if toAddress == str_broadcast_subscribers:
|
||||||
toLabel = '[Broadcast subscribers]'
|
toLabel = str_broadcast_subscribers
|
||||||
else:
|
else:
|
||||||
toLabel = shared.config.get(toAddress, 'label')
|
toLabel = shared.config.get(toAddress, 'label')
|
||||||
except:
|
except:
|
||||||
|
@ -488,6 +499,11 @@ class MyForm(QtGui.QMainWindow):
|
||||||
self.show()
|
self.show()
|
||||||
self.setWindowState(self.windowState() & QtCore.Qt.WindowMaximized)
|
self.setWindowState(self.windowState() & QtCore.Qt.WindowMaximized)
|
||||||
|
|
||||||
|
# Show the program window and select inbox tab
|
||||||
|
def appIndicatorInbox(self):
|
||||||
|
self.appIndicatorShow()
|
||||||
|
self.ui.tabWidget.setCurrentIndex(0)
|
||||||
|
|
||||||
# Show the program window and select send tab
|
# Show the program window and select send tab
|
||||||
def appIndicatorSend(self):
|
def appIndicatorSend(self):
|
||||||
self.appIndicatorShow()
|
self.appIndicatorShow()
|
||||||
|
@ -548,6 +564,104 @@ class MyForm(QtGui.QMainWindow):
|
||||||
self.app.tray.setContextMenu(m)
|
self.app.tray.setContextMenu(m)
|
||||||
self.app.tray.show()
|
self.app.tray.show()
|
||||||
|
|
||||||
|
# Ubuntu Messaging menu object
|
||||||
|
mmapp = None
|
||||||
|
|
||||||
|
# is the operating system Ubuntu?
|
||||||
|
def isUbuntu(self):
|
||||||
|
if "Ubuntu" in str(os.uname()):
|
||||||
|
return True
|
||||||
|
return False
|
||||||
|
|
||||||
|
# returns the number of unread messages and subscriptions
|
||||||
|
def getUnread(self):
|
||||||
|
str_broadcast_subscribers = '[Broadcast subscribers]'
|
||||||
|
|
||||||
|
unreadMessages = 0
|
||||||
|
unreadSubscriptions = 0
|
||||||
|
|
||||||
|
shared.sqlLock.acquire()
|
||||||
|
shared.sqlSubmitQueue.put('''SELECT msgid, toaddress, read FROM inbox where folder='inbox' ''')
|
||||||
|
shared.sqlSubmitQueue.put('')
|
||||||
|
queryreturn = shared.sqlReturnQueue.get()
|
||||||
|
shared.sqlLock.release()
|
||||||
|
for row in queryreturn:
|
||||||
|
msgid, toAddress, read = row
|
||||||
|
|
||||||
|
try:
|
||||||
|
if toAddress == str_broadcast_subscribers:
|
||||||
|
toLabel = str_broadcast_subscribers
|
||||||
|
else:
|
||||||
|
toLabel = shared.config.get(toAddress, 'label')
|
||||||
|
except:
|
||||||
|
toLabel = ''
|
||||||
|
if toLabel == '':
|
||||||
|
toLabel = toAddress
|
||||||
|
|
||||||
|
if not read:
|
||||||
|
if toLabel == str_broadcast_subscribers:
|
||||||
|
# increment the unread subscriptions
|
||||||
|
unreadSubscriptions = unreadSubscriptions + 1
|
||||||
|
else:
|
||||||
|
# increment the unread messages
|
||||||
|
unreadMessages = unreadMessages + 1
|
||||||
|
return unreadMessages, unreadSubscriptions
|
||||||
|
|
||||||
|
# show the number of unread messages and subscriptions on the messaging menu
|
||||||
|
def ubuntuMessagingMenuUnread(self, drawAttention):
|
||||||
|
unreadMessages, unreadSubscriptions = self.getUnread()
|
||||||
|
# unread messages
|
||||||
|
if unreadMessages > 0:
|
||||||
|
self.mmapp.append_source("Messages", None, "Messages (" + str(unreadMessages) + ")")
|
||||||
|
if drawAttention:
|
||||||
|
self.mmapp.draw_attention("Messages")
|
||||||
|
|
||||||
|
# unread subscriptions
|
||||||
|
if unreadSubscriptions > 0:
|
||||||
|
self.mmapp.append_source("Subscriptions", None, "Subscriptions (" + str(unreadSubscriptions) + ")")
|
||||||
|
if drawAttention:
|
||||||
|
self.mmapp.draw_attention("Subscriptions")
|
||||||
|
|
||||||
|
# initialise the Ubuntu messaging menu
|
||||||
|
def ubuntuMessagingMenuInit(self):
|
||||||
|
# if this isn't ubuntu then don't do anything
|
||||||
|
if not self.isUbuntu():
|
||||||
|
return
|
||||||
|
|
||||||
|
# has messageing menu been installed
|
||||||
|
if not with_messagingmenu:
|
||||||
|
print 'WARNING: libmessaging-menu-dev not installed'
|
||||||
|
return
|
||||||
|
|
||||||
|
# create the menu server
|
||||||
|
if with_messagingmenu:
|
||||||
|
self.mmapp = MessagingMenu.App(desktop_id='pybitmessage.desktop')
|
||||||
|
self.mmapp.register()
|
||||||
|
self.mmapp.connect('activate-source', self.appIndicatorInbox)
|
||||||
|
self.ubuntuMessagingMenuUnread(True)
|
||||||
|
|
||||||
|
# update the Ubuntu messaging menu
|
||||||
|
def ubuntuMessagingMenuUpdate(self, drawAttention):
|
||||||
|
# if this isn't ubuntu then don't do anything
|
||||||
|
if not self.isUbuntu():
|
||||||
|
return
|
||||||
|
|
||||||
|
# has messageing menu been installed
|
||||||
|
if not with_messagingmenu:
|
||||||
|
print 'WARNING: libmessaging-menu-dev not installed'
|
||||||
|
return
|
||||||
|
|
||||||
|
# Remove previous messages and subscriptions entries, then recreate them
|
||||||
|
# There might be a better way to do it than this
|
||||||
|
if self.mmapp.has_source("Messages"):
|
||||||
|
self.mmapp.remove_source("Messages")
|
||||||
|
|
||||||
|
if self.mmapp.has_source("Subscriptions"):
|
||||||
|
self.mmapp.remove_source("Subscriptions")
|
||||||
|
|
||||||
|
# update the menu entries
|
||||||
|
self.ubuntuMessagingMenuUnread(drawAttention)
|
||||||
|
|
||||||
def tableWidgetInboxKeyPressEvent(self,event):
|
def tableWidgetInboxKeyPressEvent(self,event):
|
||||||
if event.key() == QtCore.Qt.Key_Delete:
|
if event.key() == QtCore.Qt.Key_Delete:
|
||||||
self.on_action_InboxTrash()
|
self.on_action_InboxTrash()
|
||||||
|
@ -1096,6 +1210,7 @@ class MyForm(QtGui.QMainWindow):
|
||||||
else:
|
else:
|
||||||
self.ui.textEditInboxMessage.setPlainText(self.ui.tableWidgetInbox.item(0,2).data(Qt.UserRole).toPyObject())"""
|
self.ui.textEditInboxMessage.setPlainText(self.ui.tableWidgetInbox.item(0,2).data(Qt.UserRole).toPyObject())"""
|
||||||
self.ui.tableWidgetInbox.setSortingEnabled(True)
|
self.ui.tableWidgetInbox.setSortingEnabled(True)
|
||||||
|
self.ubuntuMessagingMenuUpdate(True)
|
||||||
|
|
||||||
def click_pushButtonAddAddressBook(self):
|
def click_pushButtonAddAddressBook(self):
|
||||||
self.NewSubscriptionDialogInstance = NewSubscriptionDialog(self)
|
self.NewSubscriptionDialogInstance = NewSubscriptionDialog(self)
|
||||||
|
@ -1503,6 +1618,7 @@ class MyForm(QtGui.QMainWindow):
|
||||||
self.ui.tableWidgetInbox.selectRow(currentRow)
|
self.ui.tableWidgetInbox.selectRow(currentRow)
|
||||||
else:
|
else:
|
||||||
self.ui.tableWidgetInbox.selectRow(currentRow-1)
|
self.ui.tableWidgetInbox.selectRow(currentRow-1)
|
||||||
|
self.ubuntuMessagingMenuUpdate(False)
|
||||||
|
|
||||||
#Send item on the Sent tab to trash
|
#Send item on the Sent tab to trash
|
||||||
def on_action_SentTrash(self):
|
def on_action_SentTrash(self):
|
||||||
|
@ -1766,6 +1882,7 @@ class MyForm(QtGui.QMainWindow):
|
||||||
shared.sqlReturnQueue.get()
|
shared.sqlReturnQueue.get()
|
||||||
shared.sqlSubmitQueue.put('commit')
|
shared.sqlSubmitQueue.put('commit')
|
||||||
shared.sqlLock.release()
|
shared.sqlLock.release()
|
||||||
|
self.ubuntuMessagingMenuUpdate(False)
|
||||||
|
|
||||||
def tableWidgetSentItemClicked(self):
|
def tableWidgetSentItemClicked(self):
|
||||||
currentRow = self.ui.tableWidgetSent.currentRow()
|
currentRow = self.ui.tableWidgetSent.currentRow()
|
||||||
|
@ -2042,8 +2159,6 @@ class UISignaler(QThread):
|
||||||
else:
|
else:
|
||||||
sys.stderr.write('Command sent to UISignaler not recognized: %s\n' % command)
|
sys.stderr.write('Command sent to UISignaler not recognized: %s\n' % command)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def run():
|
def run():
|
||||||
app = QtGui.QApplication(sys.argv)
|
app = QtGui.QApplication(sys.argv)
|
||||||
app.setStyleSheet("QStatusBar::item { border: 0px solid black }")
|
app.setStyleSheet("QStatusBar::item { border: 0px solid black }")
|
||||||
|
@ -2058,5 +2173,6 @@ def run():
|
||||||
if 'win32' in sys.platform or 'win64' in sys.platform:
|
if 'win32' in sys.platform or 'win64' in sys.platform:
|
||||||
myapp.setWindowFlags(Qt.ToolTip)
|
myapp.setWindowFlags(Qt.ToolTip)
|
||||||
myapp.createAppIndicator(app)
|
myapp.createAppIndicator(app)
|
||||||
|
myapp.ubuntuMessagingMenuInit()
|
||||||
|
|
||||||
sys.exit(app.exec_())
|
sys.exit(app.exec_())
|
||||||
|
|
Reference in New Issue
Block a user