A task bar client typically uses the _NET_WM_STRUT property to tell an EWMH compliant window manager that it wants some screen real state exclusively to itself.
_NET_WM_STRUT, left, right, top, bottom, CARDINAL[4]/32
This property is equivalent to a _NET_WM_STRUT_PARTIAL property where all start values are 0 and all end values are the height or width of the logical screen.
_NET_WM_STRUT_PARTIAL, left, right, top, bottom, left_start_y, left_end_y, right_start_y, right_end_y, top_start_x, top_end_x, bottom_start_x, bottom_end_x, CARDINAL[12]/32
The property contains 4 cardinals specifying the width of the reserved area at each border of the screen, and an additional 8 cardinals specifying the beginning and end corresponding to each of the four struts.
Then, to reserve the 300 pixels of width for a given window (henceforth the dock), run
xprop -f _NET_WM_STRUT 32c -set _NET_WM_STRUT '300, 0, 0, 0'
and click the said window; now ordinary windows should be constrained to the remaining space, even if maximized.
That does not automatically position the docked window to its reserved space. You can automate the process with Xdotool, though:
xlogo #Dock window example
xprop -id "$(xdotool search xlogo)" -f _NET_WM_STRUT 32c -set _NET_WM_STRUT '300, 0, 0, 0'
xdotool search xlogo windowmove 0 0 windowsize 300 100%
A window manager that neatly abstracts this task is Icewm; see man icewm-winoptions. All you need is
==> ~/.icewm/winoptions <==
xlogo.layer: Dock
xlogo.geometry: 300x700+0+0
So that every new Xlogo window would become a dock and correctly positioned when spawned.