system/internal/xcb: refactor and clean up
	
		
			
	
		
	
	
		
	
		
			All checks were successful
		
		
	
	
		
			
				
	
				Test / Create distribution (push) Successful in 35s
				
			
		
			
				
	
				Test / Sandbox (push) Successful in 1m52s
				
			
		
			
				
	
				Test / Hakurei (push) Successful in 3m16s
				
			
		
			
				
	
				Test / Hpkg (push) Successful in 3m39s
				
			
		
			
				
	
				Test / Sandbox (race detector) (push) Successful in 4m17s
				
			
		
			
				
	
				Test / Hakurei (race detector) (push) Successful in 5m22s
				
			
		
			
				
	
				Test / Flake checks (push) Successful in 1m36s
				
			
		
		
	
	
				
					
				
			
		
			All checks were successful
		
		
	
	Test / Create distribution (push) Successful in 35s
				
			Test / Sandbox (push) Successful in 1m52s
				
			Test / Hakurei (push) Successful in 3m16s
				
			Test / Hpkg (push) Successful in 3m39s
				
			Test / Sandbox (race detector) (push) Successful in 4m17s
				
			Test / Hakurei (race detector) (push) Successful in 5m22s
				
			Test / Flake checks (push) Successful in 1m36s
				
			This package still does not deserve to be out of internal, but at least it is less haunting now. I am still not handling the xcb error though, the struct is almost entirely undocumented and the implementation is unreadable. Not even going to try. Signed-off-by: Ophestra <cat@gensokyo.uk>
This commit is contained in:
		
							parent
							
								
									b12c290f12
								
							
						
					
					
						commit
						ddb003e39b
					
				| @ -1,21 +1,16 @@ | |||||||
| // Package xcb implements X11 ChangeHosts via libxcb. |  | ||||||
| package xcb | package xcb | ||||||
| 
 | 
 | ||||||
| import ( | import "errors" | ||||||
| 	"errors" |  | ||||||
| ) |  | ||||||
| 
 | 
 | ||||||
| var ErrChangeHosts = errors.New("xcb_change_hosts() failed") | var ErrChangeHosts = errors.New("xcb_change_hosts() failed") | ||||||
| 
 | 
 | ||||||
| func ChangeHosts(mode HostMode, family Family, address string) error { | func ChangeHosts(mode HostMode, family Family, address string) error { | ||||||
| 	var conn *connection | 	conn := new(connection) | ||||||
| 
 | 	if err := conn.connect(); err != nil { | ||||||
| 	if c, err := connect(); err != nil { | 		conn.disconnect() | ||||||
| 		c.disconnect() |  | ||||||
| 		return err | 		return err | ||||||
| 	} else { | 	} else { | ||||||
| 		defer c.disconnect() | 		defer conn.disconnect() | ||||||
| 		conn = c |  | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	return conn.changeHostsChecked(mode, family, address) | 	return conn.changeHostsChecked(mode, family, address) | ||||||
| @ -1,3 +1,4 @@ | |||||||
|  | // Package xcb implements X11 ChangeHosts via libxcb. | ||||||
| package xcb | package xcb | ||||||
| 
 | 
 | ||||||
| import ( | import ( | ||||||
| @ -11,22 +12,28 @@ import ( | |||||||
| #include <stdlib.h> | #include <stdlib.h> | ||||||
| #include <xcb/xcb.h> | #include <xcb/xcb.h> | ||||||
| 
 | 
 | ||||||
| static int _go_xcb_change_hosts_checked(xcb_connection_t *c, uint8_t mode, uint8_t family, uint16_t address_len, const uint8_t *address) { | static int hakurei_xcb_change_hosts_checked(xcb_connection_t *c, | ||||||
| 	xcb_void_cookie_t cookie = xcb_change_hosts_checked(c, mode, family, address_len, address); |                                             uint8_t mode, uint8_t family, | ||||||
| 	free((void *)address); |                                             uint16_t address_len, const uint8_t *address) { | ||||||
|  |   int ret; | ||||||
|  |   xcb_generic_error_t *e; | ||||||
|  |   xcb_void_cookie_t cookie; | ||||||
| 
 | 
 | ||||||
| 	int errno = xcb_connection_has_error(c); |   cookie = xcb_change_hosts_checked(c, mode, family, address_len, address); | ||||||
| 	if (errno != 0) |   free((void *)address); | ||||||
| 		return errno; |  | ||||||
| 
 | 
 | ||||||
| 	xcb_generic_error_t *e = xcb_request_check(c, cookie); |   ret = xcb_connection_has_error(c); | ||||||
| 	if (e != NULL) { |   if (ret != 0) | ||||||
| 		// don't want to deal with xcb errors |     return ret; | ||||||
| 		free((void *)e); |  | ||||||
| 		return -1; |  | ||||||
| 	} |  | ||||||
| 
 | 
 | ||||||
| 	return 0; |   e = xcb_request_check(c, cookie); | ||||||
|  |   if (e != NULL) { | ||||||
|  |     // don't want to deal with xcb errors | ||||||
|  |     free((void *)e); | ||||||
|  |     ret = -1; | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   return ret; | ||||||
| } | } | ||||||
| */ | */ | ||||||
| import "C" | import "C" | ||||||
| @ -48,49 +55,60 @@ type ( | |||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| func (conn *connection) changeHostsChecked(mode HostMode, family Family, address string) error { | func (conn *connection) changeHostsChecked(mode HostMode, family Family, address string) error { | ||||||
| 	errno := C._go_xcb_change_hosts_checked( | 	ret := C.hakurei_xcb_change_hosts_checked( | ||||||
| 		conn.c, | 		conn.c, | ||||||
| 		C.uint8_t(mode), | 		C.uint8_t(mode), | ||||||
| 		C.uint8_t(family), | 		C.uint8_t(family), | ||||||
| 		C.uint16_t(len(address)), | 		C.uint16_t(len(address)), | ||||||
| 		(*C.uint8_t)(unsafe.Pointer(C.CString(address))), | 		(*C.uint8_t)(unsafe.Pointer(C.CString(address))), | ||||||
| 	) | 	) | ||||||
| 	switch errno { | 	switch ret { | ||||||
| 	case 0: | 	case 0: | ||||||
| 		return nil | 		return nil | ||||||
| 	case -1: | 	case -1: | ||||||
| 		return ErrChangeHosts | 		return ErrChangeHosts | ||||||
| 	default: | 	default: | ||||||
| 		return &ConnectionError{errno} | 		return ConnectionError(ret) | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| type connection struct{ c *C.xcb_connection_t } | type connection struct{ c *C.xcb_connection_t } | ||||||
| 
 | 
 | ||||||
| func connect() (*connection, error) { | func (conn *connection) connect() error { | ||||||
| 	conn := newConnection(C.xcb_connect(nil, nil)) | 	conn.c = C.xcb_connect(nil, nil) | ||||||
| 	return conn, conn.hasError() | 	runtime.SetFinalizer(conn, (*connection).disconnect) | ||||||
|  | 	return conn.hasError() | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func newConnection(c *C.xcb_connection_t) *connection { | func (conn *connection) hasError() error { | ||||||
| 	conn := &connection{c} | 	ret := C.xcb_connection_has_error(conn.c) | ||||||
| 	runtime.SetFinalizer(conn, (*connection).disconnect) | 	if ret == 0 { | ||||||
| 	return conn | 		return nil | ||||||
|  | 	} | ||||||
|  | 	return ConnectionError(ret) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (conn *connection) disconnect() { | ||||||
|  | 	C.xcb_disconnect(conn.c) | ||||||
|  | 
 | ||||||
|  | 	// no need for a finalizer anymore | ||||||
|  | 	runtime.SetFinalizer(conn, nil) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| const ( | const ( | ||||||
| 	ConnError                 = C.XCB_CONN_ERROR | 	ConnError                 ConnectionError = C.XCB_CONN_ERROR | ||||||
| 	ConnClosedExtNotSupported = C.XCB_CONN_CLOSED_EXT_NOTSUPPORTED | 	ConnClosedExtNotSupported ConnectionError = C.XCB_CONN_CLOSED_EXT_NOTSUPPORTED | ||||||
| 	ConnClosedMemInsufficient = C.XCB_CONN_CLOSED_MEM_INSUFFICIENT | 	ConnClosedMemInsufficient ConnectionError = C.XCB_CONN_CLOSED_MEM_INSUFFICIENT | ||||||
| 	ConnClosedReqLenExceed    = C.XCB_CONN_CLOSED_REQ_LEN_EXCEED | 	ConnClosedReqLenExceed    ConnectionError = C.XCB_CONN_CLOSED_REQ_LEN_EXCEED | ||||||
| 	ConnClosedParseErr        = C.XCB_CONN_CLOSED_PARSE_ERR | 	ConnClosedParseErr        ConnectionError = C.XCB_CONN_CLOSED_PARSE_ERR | ||||||
| 	ConnClosedInvalidScreen   = C.XCB_CONN_CLOSED_INVALID_SCREEN | 	ConnClosedInvalidScreen   ConnectionError = C.XCB_CONN_CLOSED_INVALID_SCREEN | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| type ConnectionError struct{ errno C.int } | // ConnectionError represents an error returned by xcb_connection_has_error. | ||||||
|  | type ConnectionError int | ||||||
| 
 | 
 | ||||||
| func (ce *ConnectionError) Error() string { | func (ce ConnectionError) Error() string { | ||||||
| 	switch ce.errno { | 	switch ce { | ||||||
| 	case ConnError: | 	case ConnError: | ||||||
| 		return "connection error" | 		return "connection error" | ||||||
| 	case ConnClosedExtNotSupported: | 	case ConnClosedExtNotSupported: | ||||||
| @ -107,18 +125,3 @@ func (ce *ConnectionError) Error() string { | |||||||
| 		return "generic X11 failure" | 		return "generic X11 failure" | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 |  | ||||||
| func (conn *connection) hasError() error { |  | ||||||
| 	errno := C.xcb_connection_has_error(conn.c) |  | ||||||
| 	if errno == 0 { |  | ||||||
| 		return nil |  | ||||||
| 	} |  | ||||||
| 	return &ConnectionError{errno} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func (conn *connection) disconnect() { |  | ||||||
| 	C.xcb_disconnect(conn.c) |  | ||||||
| 
 |  | ||||||
| 	// no need for a finalizer anymore |  | ||||||
| 	runtime.SetFinalizer(conn, nil) |  | ||||||
| } |  | ||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user