Skip to content

Instantly share code, notes, and snippets.

@thefloweringash
Created August 22, 2013 02:37
Show Gist options
  • Save thefloweringash/6302597 to your computer and use it in GitHub Desktop.
Save thefloweringash/6302597 to your computer and use it in GitHub Desktop.
Xpra on FreeBSD
#!/bin/sh
if [ ! -d 'xpra' ]; then
echo "Could not find xpra source dir"
exit 1
fi
XPRA_GTK_MAIN_FILES=`
grep -r . -El -e '^[[:space:]]*gtk\.main\(\)[[:space:]]*$'`
mkdir -p /tmp/xpra-a /tmp/xpra-b
tar -cf- $XPRA_GTK_MAIN_FILES | tar -xf- -C /tmp/xpra-a
tar -cf- $XPRA_GTK_MAIN_FILES | tar -xf- -C /tmp/xpra-b
cd /tmp/xpra-b
perl -i'' -ne \
'if (/^(\s*)gtk\.main\(\)\s*$/) {
print $1."gtk.gdk.threads_enter()\n";
print $_;
print $1."gtk.gdk.threads_leave()\n";
} else {
print $_;
}' $XPRA_GTK_MAIN_FILES
cd /tmp
diff -ur xpra-a xpra-b | sed -e 's|xpra-a/||' -e 's|xpra-b/||'
diff -ur parti/parti_main.py parti/parti_main.py
--- parti/parti_main.py 2013-02-12 22:35:37.000000000 +1300
+++ parti/parti_main.py 2013-08-18 18:51:45.000000000 +1200
@@ -58,7 +58,9 @@
self._dbus = PartiDBusService(self)
def main(self):
+ gtk.gdk.threads_enter()
gtk.main()
+ gtk.gdk.threads_leave()
def _wm_quit(self, *args):
gtk_main_quit_really()
diff -ur parti/test_bus.py parti/test_bus.py
--- parti/test_bus.py 2013-02-12 22:35:37.000000000 +1300
+++ parti/test_bus.py 2013-08-18 18:51:45.000000000 +1200
@@ -31,7 +31,9 @@
proxy.SpawnReplWindow(reply_handler=replied,
error_handler=errored)
assert not wm.called
+ gtk.gdk.threads_enter()
gtk.main()
+ gtk.gdk.threads_leave()
print("mainloop exited")
assert not self.error
assert wm.called
diff -ur tests/wimpiggy/test_lowlevel.py tests/wimpiggy/test_lowlevel.py
--- tests/wimpiggy/test_lowlevel.py 2013-02-12 22:35:38.000000000 +1300
+++ tests/wimpiggy/test_lowlevel.py 2013-08-18 18:51:45.000000000 +1200
@@ -239,7 +239,9 @@
w2.set_events(gtk.gdk.STRUCTURE_MASK)
w2.show()
while len(results) != 4:
+ gtk.gdk.threads_enter()
gtk.main()
+ gtk.gdk.threads_leave()
w2.hide()
assert results == set([("child-map", 1), ("child-map", 2),
("map", 3), ("map", 4)])
@@ -248,7 +250,9 @@
results.clear()
w2.show()
while len(results) != 2:
+ gtk.gdk.threads_enter()
gtk.main()
+ gtk.gdk.threads_leave()
assert results == set([("child-map", 1), ("map", 3)])
class TestUnmapWithSerial(TestLowlevel, MockEventReceiver):
@@ -267,7 +271,9 @@
l.add_event_receiver(w, self)
serial = l.unmap_with_serial(w)
print(serial)
+ gtk.gdk.threads_enter()
gtk.main()
+ gtk.gdk.threads_leave()
assert self._event is not None
assert self._event.serial == serial
@@ -304,7 +310,9 @@
gtk.gdk.flush()
l.XSetInputFocus(self.w1)
gtk.gdk.flush()
+ gtk.gdk.threads_enter()
gtk.main()
+ gtk.gdk.threads_leave()
assert self.w1_got is not None
assert self.w1_got.window is self.w1
assert self.w1_got.mode == l.const["NotifyNormal"]
@@ -316,8 +324,12 @@
l.XSetInputFocus(self.w2)
gtk.gdk.flush()
+ gtk.gdk.threads_enter()
gtk.main()
+ gtk.gdk.threads_leave()
+ gtk.gdk.threads_enter()
gtk.main()
+ gtk.gdk.threads_leave()
assert self.w1_got is None
assert self.w2_got is not None
assert self.w2_got.window is self.w2
@@ -333,7 +345,9 @@
l.XSetInputFocus(self.root())
gtk.gdk.flush()
+ gtk.gdk.threads_enter()
gtk.main()
+ gtk.gdk.threads_leave()
assert self.w1_got is None
assert self.w2_got is None
assert self.w1_lost is None
@@ -360,7 +374,9 @@
data = (0x01020304, 0x05060708, 0x090a0b0c, 0x0d0e0f10, 0x11121314)
l.sendClientMessage(self.root(), False, 0, "NOMASK", *data)
l.sendClientMessage(self.w, False, 0, "NOMASK", *data)
+ gtk.gdk.threads_enter()
gtk.main()
+ gtk.gdk.threads_leave()
# Should have gotten message to w, not to root
assert len(self.evs) == 1
ev = self.evs[0]
@@ -375,7 +391,9 @@
l.addXSelectInput(self.root(), l.const["Button1MotionMask"])
l.sendClientMessage(self.root(), False, l.const["Button1MotionMask"],
"GOOD", *data)
+ gtk.gdk.threads_enter()
gtk.main()
+ gtk.gdk.threads_leave()
assert len(self.evs) == 1
ev = self.evs[0]
assert ev.window is self.root()
@@ -390,7 +408,9 @@
gtk.gdk.flush()
send_wm.send_wm_take_focus(win, 1234)
+ gtk.gdk.threads_enter()
gtk.main()
+ gtk.gdk.threads_leave()
assert len(self.evs) == 1
event = self.evs[0]
assert event is not None
@@ -406,7 +426,9 @@
gtk.gdk.flush()
send_wm.send_wm_take_focus(win, 0xff000000)
+ gtk.gdk.threads_enter()
gtk.main()
+ gtk.gdk.threads_leave()
assert len(self.evs) == 1
event = self.evs[0]
assert event is not None
@@ -439,7 +461,9 @@
w1.show()
gtk.gdk.flush()
l.sendConfigureNotify(w1)
+ gtk.gdk.threads_enter()
gtk.main()
+ gtk.gdk.threads_leave()
assert self.ev is not None
assert self.ev.type == gtk.gdk.CONFIGURE
@@ -466,12 +490,16 @@
# To double-check that it's still a TOPLEVEL:
print(w1.get_window_type())
w1.resize(15, 16)
+ gtk.gdk.threads_enter()
gtk.main()
+ gtk.gdk.threads_leave()
# w1 in root coordinates is now at (24, 26)
self.ev = None
l.sendConfigureNotify(w1)
+ gtk.gdk.threads_enter()
gtk.main()
+ gtk.gdk.threads_leave()
assert self.ev is not None
assert self.ev.type == gtk.gdk.CONFIGURE
@@ -512,7 +540,9 @@
# Can't just call gtk.main() twice, the two events may be delivered
# together and processed in a single mainloop iteration.
while None in (self.map_ev, self.conf_ev):
+ gtk.gdk.threads_enter()
gtk.main()
+ gtk.gdk.threads_leave()
assert self.map_ev.delivered_to is root
assert self.map_ev.window is w1
@@ -527,7 +557,9 @@
self.conf_ev = None
w2.move_resize(1, 2, 3, 4)
+ gtk.gdk.threads_enter()
gtk.main()
+ gtk.gdk.threads_leave()
assert self.map_ev is None
assert self.conf_ev is not None
assert self.conf_ev.delivered_to is root
@@ -544,7 +576,9 @@
self.map_ev = None
self.conf_ev = None
w2.move(5, 6)
+ gtk.gdk.threads_enter()
gtk.main()
+ gtk.gdk.threads_leave()
assert self.map_ev is None
assert self.conf_ev.x == 5
assert self.conf_ev.y == 6
@@ -553,7 +587,9 @@
self.map_ev = None
self.conf_ev = None
w2.raise_()
+ gtk.gdk.threads_enter()
gtk.main()
+ gtk.gdk.threads_leave()
assert self.map_ev is None
assert self.conf_ev.detail == l.const["Above"]
assert self.conf_ev.value_mask == l.const["CWStackMode"]
@@ -570,7 +606,9 @@
w1_wm = l.get_pywindow(self.display, l.get_xwindow(w1_client))
l.configureAndNotify(w1_client, 11, 12, 13, 14)
+ gtk.gdk.threads_enter()
gtk.main()
+ gtk.gdk.threads_leave()
assert self.conf_ev is not None
assert self.conf_ev.delivered_to is self.root()
@@ -588,7 +626,9 @@
partial_mask = l.const["CWWidth"] | l.const["CWStackMode"]
l.configureAndNotify(w1_client, 11, 12, 13, 14, partial_mask)
+ gtk.gdk.threads_enter()
gtk.main()
+ gtk.gdk.threads_leave()
assert self.conf_ev is not None
assert self.conf_ev.delivered_to is self.root()
diff -ur tests/wimpiggy/test_selection.py tests/wimpiggy/test_selection.py
--- tests/wimpiggy/test_selection.py 2013-02-12 22:35:38.000000000 +1300
+++ tests/wimpiggy/test_selection.py 2013-08-18 18:51:45.000000000 +1200
@@ -53,7 +53,9 @@
assert not m.owned()
assert self.event is None
m.acquire(m.IF_UNOWNED)
+ gtk.gdk.threads_enter()
gtk.main()
+ gtk.gdk.threads_leave()
assert self.event is not None
assert self.event.window is root2
assert self.event.message_type == "MANAGER"
diff -ur tests/wimpiggy/test_util.py tests/wimpiggy/test_util.py
--- tests/wimpiggy/test_util.py 2013-02-12 22:35:38.000000000 +1300
+++ tests/wimpiggy/test_util.py 2013-08-18 18:51:45.000000000 +1200
@@ -99,7 +99,9 @@
gobject.timeout_add(0, self._run_gtk_main)
else:
gobject.timeout_add(0, wimpiggy.util.gtk_main_quit_really)
+ gtk.gdk.threads_enter()
gtk.main()
+ gtk.gdk.threads_leave()
return False
def _count_iters(self):
@@ -112,14 +114,18 @@
def test(self):
gobject.timeout_add(0, self._run_gtk_main)
+ gtk.gdk.threads_enter()
gtk.main()
+ gtk.gdk.threads_leave()
# If we get here, then gtk_main_quit_really managed to extricate us
# from multiple recursive main loops. Next question: did it clean up
# after itself? (I.e., can we enter a new main loop without it being
# immediately exited?)
self._iters = 0
gobject.timeout_add(0, self._count_iters)
+ gtk.gdk.threads_enter()
gtk.main()
+ gtk.gdk.threads_leave()
# If we get here, then the second main loop exited -- but did it do so
# immediately, or did it run for a while?
assert self._iters > 5
diff -ur tests/xpra/gl/gl_backing_test.py tests/xpra/gl/gl_backing_test.py
--- tests/xpra/gl/gl_backing_test.py 2013-02-12 22:35:38.000000000 +1300
+++ tests/xpra/gl/gl_backing_test.py 2013-08-18 18:51:45.000000000 +1200
@@ -46,7 +46,9 @@
from xpra.gl.gl_client_window import GLClientWindow
gl_backing_test(gl_client_window_class=GLClientWindow)
+ gtk.gdk.threads_enter()
gtk.main()
+ gtk.gdk.threads_leave()
if __name__ == '__main__':
diff -ur tests/xpra/gl/gl_simple_backing_test.py tests/xpra/gl/gl_simple_backing_test.py
--- tests/xpra/gl/gl_simple_backing_test.py 2013-02-12 22:35:38.000000000 +1300
+++ tests/xpra/gl/gl_simple_backing_test.py 2013-08-18 18:51:45.000000000 +1200
@@ -24,7 +24,9 @@
logging.root.setLevel(logging.DEBUG)
gl_backing_test(gl_client_window_class=GLSimpleClientWindow, w=640, h=480)
+ gtk.gdk.threads_enter()
gtk.main()
+ gtk.gdk.threads_leave()
if __name__ == '__main__':
diff -ur tests/xpra/gl/gl_texture_bind_test.py tests/xpra/gl/gl_texture_bind_test.py
--- tests/xpra/gl/gl_texture_bind_test.py 2013-02-12 22:35:38.000000000 +1300
+++ tests/xpra/gl/gl_texture_bind_test.py 2013-08-18 18:51:45.000000000 +1200
@@ -311,4 +311,6 @@
if __name__ == '__main__':
print "screen is %sx%s" % (gtk.gdk.screen_width(), gtk.gdk.screen_height())
app = App()
+ gtk.gdk.threads_enter()
gtk.main()
+ gtk.gdk.threads_leave()
diff -ur tests/xpra/test_keymap_changes.py tests/xpra/test_keymap_changes.py
--- tests/xpra/test_keymap_changes.py 2013-02-12 22:35:38.000000000 +1300
+++ tests/xpra/test_keymap_changes.py 2013-08-18 18:51:45.000000000 +1200
@@ -28,7 +28,9 @@
print("keymap=%s" % keymap)
keymap.connect("keys-changed", keys_changed)
+ gtk.gdk.threads_enter()
gtk.main()
+ gtk.gdk.threads_leave()
if __name__ == "__main__":
diff -ur tests/xpra/test_window_move.py tests/xpra/test_window_move.py
--- tests/xpra/test_window_move.py 2013-02-12 22:35:37.000000000 +1300
+++ tests/xpra/test_window_move.py 2013-08-18 18:51:45.000000000 +1200
@@ -27,7 +27,9 @@
btn.connect('clicked', move)
window.add(vbox)
window.show_all()
+ gtk.gdk.threads_enter()
gtk.main()
+ gtk.gdk.threads_leave()
return 0
diff -ur tests/xpra/test_window_resize.py tests/xpra/test_window_resize.py
--- tests/xpra/test_window_resize.py 2013-02-12 22:35:38.000000000 +1300
+++ tests/xpra/test_window_resize.py 2013-08-18 18:51:45.000000000 +1200
@@ -22,7 +22,9 @@
btn.connect('clicked', resize)
window.add(btn)
window.show_all()
+ gtk.gdk.threads_enter()
gtk.main()
+ gtk.gdk.threads_leave()
return 0
diff -ur tests/xpra/test_window_title.py tests/xpra/test_window_title.py
--- tests/xpra/test_window_title.py 2013-02-12 22:35:37.000000000 +1300
+++ tests/xpra/test_window_title.py 2013-08-18 18:51:45.000000000 +1200
@@ -17,7 +17,9 @@
entry.show()
window.add(entry)
window.show_all()
+ gtk.gdk.threads_enter()
gtk.main()
+ gtk.gdk.threads_leave()
return 0
if __name__ == "__main__":
diff -ur wimpiggy/selection.py wimpiggy/selection.py
--- wimpiggy/selection.py 2013-02-12 22:35:37.000000000 +1300
+++ wimpiggy/selection.py 2013-08-18 18:51:45.000000000 +1200
@@ -111,7 +111,9 @@
else:
log("Waiting for previous owner to exit...")
add_event_receiver(window, self)
+ gtk.gdk.threads_enter()
gtk.main()
+ gtk.gdk.threads_leave()
log("...they did.")
window = get_pywindow(self.clipboard, self._xwindow)
window.set_title("Xpra-ManagerSelection")
diff -ur wimpiggy.README wimpiggy.README
--- wimpiggy.README 2013-02-12 22:35:37.000000000 +1300
+++ wimpiggy.README 2013-08-18 18:51:45.000000000 +1200
@@ -80,4 +80,6 @@
help="Replace already running WM")
(options, args) = parser.parse_args()
wm = DemoWm(options.replace)
+ gtk.gdk.threads_enter()
gtk.main()
+ gtk.gdk.threads_leave()
diff -ur xpra/client.py xpra/client.py
--- xpra/client.py 2013-02-26 23:44:58.000000000 +1300
+++ xpra/client.py 2013-08-18 18:51:45.000000000 +1200
@@ -338,7 +338,9 @@
def run(self):
gtk_main_quit_on_fatal_exceptions_enable()
+ gtk.gdk.threads_enter()
gtk.main()
+ gtk.gdk.threads_leave()
return self.exit_code
def quit(self, exit_code=0):
diff -ur xpra/dbus_notifications_forwarder.py xpra/dbus_notifications_forwarder.py
--- xpra/dbus_notifications_forwarder.py 2013-02-12 22:35:39.000000000 +1300
+++ xpra/dbus_notifications_forwarder.py 2013-08-18 18:51:45.000000000 +1200
@@ -85,7 +85,9 @@
def main():
register()
+ gtk.gdk.threads_enter()
gtk.main()
+ gtk.gdk.threads_leave()
if __name__ == "__main__":
main()
diff -ur xpra/gtk_view_keyboard.py xpra/gtk_view_keyboard.py
--- xpra/gtk_view_keyboard.py 2013-02-12 22:35:39.000000000 +1300
+++ xpra/gtk_view_keyboard.py 2013-08-18 18:51:45.000000000 +1200
@@ -108,7 +108,9 @@
def main():
KeyboardStateInfoWindow()
+ gtk.gdk.threads_enter()
gtk.main()
+ gtk.gdk.threads_leave()
if __name__ == "__main__":
main()
diff -ur xpra/nested_main.py xpra/nested_main.py
--- xpra/nested_main.py 2013-02-12 22:35:38.000000000 +1300
+++ xpra/nested_main.py 2013-08-18 18:51:45.000000000 +1200
@@ -141,7 +141,9 @@
log("Entering nested loop %s (level %s)",
hex(id(self)), gtk.main_level())
try:
+ gtk.gdk.threads_enter()
gtk.main()
+ gtk.gdk.threads_leave()
finally:
assert self._stack.pop() is self
gobject.source_remove(soft)
diff -ur xpra/platform/graph.py xpra/platform/graph.py
--- xpra/platform/graph.py 2013-02-12 22:35:38.000000000 +1300
+++ xpra/platform/graph.py 2013-08-18 18:51:45.000000000 +1200
@@ -201,7 +201,9 @@
window.connect("destroy", gtk.main_quit)
window.show_all()
+ gtk.gdk.threads_enter()
gtk.main()
+ gtk.gdk.threads_leave()
if __name__ == "__main__":
diff -ur xpra/scripts/client_launcher.py xpra/scripts/client_launcher.py
--- xpra/scripts/client_launcher.py 2013-02-26 19:29:29.000000000 +1300
+++ xpra/scripts/client_launcher.py 2013-08-18 18:51:45.000000000 +1200
@@ -504,7 +504,9 @@
self.encoding_changed()
def run(self):
+ gtk.gdk.threads_enter()
gtk.main()
+ gtk.gdk.threads_leave()
def mode_changed(self, *args):
ssh = self.mode_combo.get_active_text()=="SSH"
diff -ur xpra/server_base.py xpra/server_base.py
--- xpra/server_base.py 2013-02-26 23:44:57.000000000 +1300
+++ xpra/server_base.py 2013-08-18 18:51:45.000000000 +1200
@@ -298,7 +298,9 @@
log.info("xpra is ready.")
sys.stdout.flush()
gobject.idle_add(print_ready)
+ gtk.gdk.threads_enter()
gtk.main()
+ gtk.gdk.threads_leave()
log.info("xpra end of gtk.main().")
return self._upgrading
diff -ur xpra/sound/sink.py xpra/sound/sink.py
--- xpra/sound/sink.py 2013-02-12 22:35:38.000000000 +1300
+++ xpra/sound/sink.py 2013-08-18 18:51:45.000000000 +1200
@@ -191,7 +191,9 @@
gobject.timeout_add(1000, check_for_end)
import gtk
+ gtk.gdk.threads_enter()
gtk.main()
+ gtk.gdk.threads_leave()
if __name__ == "__main__":
diff -ur xpra/sound/src.py xpra/sound/src.py
--- xpra/sound/src.py 2013-03-07 06:36:17.000000000 +1300
+++ xpra/sound/src.py 2013-08-18 18:51:45.000000000 +1200
@@ -150,7 +150,9 @@
signal.signal(signal.SIGTERM, deadly_signal)
import gtk
+ gtk.gdk.threads_enter()
gtk.main()
+ gtk.gdk.threads_leave()
f.flush()
log.info("wrote %s bytes to %s", f.tell(), filename)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment