add method to give unique ids for x11 resources

X11 Protocol expects clients to track unique identifiers in order to reduce 
network traffic. This reduces network traffic because when you create a new
resource say a window the X11 server doesn't have to reply with the ID
of the newly created resource. This makes the X11 protocol extremely fast
since most requests the server doesn't need to reply to a message.

In the first packet returned from X11 they give you a 
resource-id-mask and a resource-id-base. You can use these values to
generate a unique id for X11.
This commit is contained in:
Richard Ramsden 2012-05-19 15:47:50 -07:00
parent 1dafc7ee61
commit a503b8391e
2 changed files with 28 additions and 0 deletions

View file

@ -31,6 +31,19 @@ module X11
end
end
##
# The resource-id-mask contains a single contiguous set of bits (at least 18).
# The client allocates resource IDs for types WINDOW, PIXMAP, CURSOR, FONT,
# GCONTEXT, and COLORMAP by choosing a value with only some subset of these
# bits set and ORing it with resource-id-base.
def new_id
id = (@xid_next ||= 0)
@xid_next += 1
(id & @internal.resource_id_mask) | @internal.resource_id_base
end
private
def authorize(host, family, display_id)

15
test/core_test.rb Normal file
View file

@ -0,0 +1,15 @@
require File.expand_path('../helper', __FILE__)
describe X11 do
describe X11::Display do
before(:each) do
@display = X11::Display.new
end
it "should generate a unique id" do
collection = 1000.times.collect { @display.new_id }
expected = collection.size
collection.uniq.size.must_equal expected
end
end
end