diff --git a/src/gtkgui_helpers.py b/src/gtkgui_helpers.py
index 1f2973b2a113598fd219b330789be7c0c893da88..98df9c5897af1544613a0dafada1391a20aadfdb 100644
--- a/src/gtkgui_helpers.py
+++ b/src/gtkgui_helpers.py
@@ -314,3 +314,26 @@ def get_current_desktop(window):
 		# f.e. prop is ('CARDINAL', 32, [0]) we want 0 or 1.. from [0]
 		current_virtual_desktop_no = prop[2][0]
 		return current_virtual_desktop_no
+
+def possibly_move_window_in_current_desktop(window):
+	'''moves GTK window to current virtual desktop if it is not in the
+	current virtual desktop
+	window is GTK window'''
+	if os.name == 'nt':
+		return
+
+	root_window = gtk.gdk.screen_get_default().get_root_window()
+	# current user's vd
+	current_virtual_desktop_no = get_current_desktop(root_window)
+	
+	# vd roster window is in
+	window_virtual_desktop = get_current_desktop(window.window)
+
+	# if one of those is None, something went wrong and we cannot know
+	# VD info, just hide it (default action) and not show it afterwards
+	if None not in (window_virtual_desktop, current_virtual_desktop_no):
+		if current_virtual_desktop_no != window_virtual_desktop:
+			# we are in another VD that the window was
+			# so show it in current VD
+			window.show()
+	
diff --git a/src/systray.py b/src/systray.py
index 616313fb7c11d5163211a36c51a6e06f185c41ea..d2b799b3088f9373267df297d571a44030cf982b 100644
--- a/src/systray.py
+++ b/src/systray.py
@@ -265,27 +265,10 @@ class Systray:
 			# no pending events, so toggle visible/hidden for roster window
 			if win.get_property('visible'): # visible in ANY virtual desktop?
 				win.hide() # we hide it from VD that was visible in
+				
 				# but we could be in another VD right now. eg vd2
 				# and we want not only to hide it in vd1 but also show it in vd2
-
-				if os.name != 'nt':
-					root_window = gtk.gdk.screen_get_default().get_root_window()
-					# current user's vd
-					current_virtual_desktop_no = gtkgui_helpers.get_current_desktop(
-						root_window)
-				
-					# vd roster window is in
-					window_virtual_desktop = gtkgui_helpers.get_current_desktop(
-						win.window)
-				
-				# if one of those is None, something went wrong and we cannot know
-				# VD info, just hide it (default action) and not show it afterwards
-				if None not in (window_virtual_desktop, current_virtual_desktop_no):
-					if current_virtual_desktop_no != window_virtual_desktop:
-						# we are in another VD that the window was
-						# so show it in current VD
-						win.show()
-						
+				gtkgui_helpers.possibly_move_window_in_current_desktop(win)
 			else:
 				win.present()
 		else:
@@ -333,8 +316,10 @@ class Systray:
 			tv.scroll_to_end()
 
 	def on_middle_click(self):
+		'''middle click raises window to have complete focus (fe. get kbd events)
+		but if already raised, it hides it'''
 		win = gajim.interface.roster.window
-		if win.is_active():
+		if win.is_active(): # is it fully raised? (eg does it receive kbd events?)
 			win.hide()
 		else:
 			win.present()