mirror of
				https://gitlab.freedesktop.org/wlroots/wlroots.git
				synced 2025-11-03 09:01:40 -05:00 
			
		
		
		
	backend/drm: add support for panel orientation
Expose the panel orientation with wlr_drm_connector_get_panel_orientation. Leave it to the compositor to consume this information and configure the output accordingly. Closes: https://github.com/swaywm/wlroots/issues/1581
This commit is contained in:
		
							parent
							
								
									0c5ff5efab
								
							
						
					
					
						commit
						2e12de96ca
					
				
					 4 changed files with 44 additions and 0 deletions
				
			
		| 
						 | 
					@ -977,6 +977,37 @@ uint32_t wlr_drm_connector_get_id(struct wlr_output *output) {
 | 
				
			||||||
	return conn->id;
 | 
						return conn->id;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum wl_output_transform wlr_drm_connector_get_panel_orientation(
 | 
				
			||||||
 | 
							struct wlr_output *output) {
 | 
				
			||||||
 | 
						struct wlr_drm_connector *conn = get_drm_connector_from_output(output);
 | 
				
			||||||
 | 
						if (conn->props.panel_orientation) {
 | 
				
			||||||
 | 
							return WL_OUTPUT_TRANSFORM_NORMAL;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						char *orientation = get_drm_prop_enum(conn->backend->fd, conn->id,
 | 
				
			||||||
 | 
							conn->props.panel_orientation);
 | 
				
			||||||
 | 
						if (orientation == NULL) {
 | 
				
			||||||
 | 
							return WL_OUTPUT_TRANSFORM_NORMAL;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						enum wl_output_transform tr;
 | 
				
			||||||
 | 
						if (strcmp(orientation, "Normal") == 0) {
 | 
				
			||||||
 | 
							tr = WL_OUTPUT_TRANSFORM_NORMAL;
 | 
				
			||||||
 | 
						} else if (strcmp(orientation, "Left Side Up") == 0) {
 | 
				
			||||||
 | 
							tr = WL_OUTPUT_TRANSFORM_90;
 | 
				
			||||||
 | 
						} else if (strcmp(orientation, "Upside Down") == 0) {
 | 
				
			||||||
 | 
							tr = WL_OUTPUT_TRANSFORM_180;
 | 
				
			||||||
 | 
						} else if (strcmp(orientation, "Right Side Up") == 0) {
 | 
				
			||||||
 | 
							tr = WL_OUTPUT_TRANSFORM_270;
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							wlr_drm_conn_log(conn, WLR_ERROR, "Unknown panel orientation: %s", orientation);
 | 
				
			||||||
 | 
							tr = WL_OUTPUT_TRANSFORM_NORMAL;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						free(orientation);
 | 
				
			||||||
 | 
						return tr;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static const int32_t subpixel_map[] = {
 | 
					static const int32_t subpixel_map[] = {
 | 
				
			||||||
	[DRM_MODE_SUBPIXEL_UNKNOWN] = WL_OUTPUT_SUBPIXEL_UNKNOWN,
 | 
						[DRM_MODE_SUBPIXEL_UNKNOWN] = WL_OUTPUT_SUBPIXEL_UNKNOWN,
 | 
				
			||||||
	[DRM_MODE_SUBPIXEL_HORIZONTAL_RGB] = WL_OUTPUT_SUBPIXEL_HORIZONTAL_RGB,
 | 
						[DRM_MODE_SUBPIXEL_HORIZONTAL_RGB] = WL_OUTPUT_SUBPIXEL_HORIZONTAL_RGB,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -26,6 +26,7 @@ static const struct prop_info connector_info[] = {
 | 
				
			||||||
	{ "PATH", INDEX(path) },
 | 
						{ "PATH", INDEX(path) },
 | 
				
			||||||
	{ "link-status", INDEX(link_status) },
 | 
						{ "link-status", INDEX(link_status) },
 | 
				
			||||||
	{ "non-desktop", INDEX(non_desktop) },
 | 
						{ "non-desktop", INDEX(non_desktop) },
 | 
				
			||||||
 | 
						{ "panel orientation", INDEX(panel_orientation) },
 | 
				
			||||||
	{ "subconnector", INDEX(subconnector) },
 | 
						{ "subconnector", INDEX(subconnector) },
 | 
				
			||||||
	{ "vrr_capable", INDEX(vrr_capable) },
 | 
						{ "vrr_capable", INDEX(vrr_capable) },
 | 
				
			||||||
#undef INDEX
 | 
					#undef INDEX
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -19,6 +19,7 @@ union wlr_drm_connector_props {
 | 
				
			||||||
		uint32_t vrr_capable; // not guaranteed to exist
 | 
							uint32_t vrr_capable; // not guaranteed to exist
 | 
				
			||||||
		uint32_t subconnector; // not guaranteed to exist
 | 
							uint32_t subconnector; // not guaranteed to exist
 | 
				
			||||||
		uint32_t non_desktop;
 | 
							uint32_t non_desktop;
 | 
				
			||||||
 | 
							uint32_t panel_orientation; // not guaranteed to exist
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// atomic-modesetting only
 | 
							// atomic-modesetting only
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -61,4 +61,15 @@ typedef struct _drmModeModeInfo drmModeModeInfo;
 | 
				
			||||||
struct wlr_output_mode *wlr_drm_connector_add_mode(struct wlr_output *output,
 | 
					struct wlr_output_mode *wlr_drm_connector_add_mode(struct wlr_output *output,
 | 
				
			||||||
	const drmModeModeInfo *mode);
 | 
						const drmModeModeInfo *mode);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Get the connector's panel orientation.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * On some devices the panel is mounted in the casing in such a way that the
 | 
				
			||||||
 | 
					 * top side of the panel does not match with the top side of the device. This
 | 
				
			||||||
 | 
					 * function returns the output transform which needs to be applied to compensate
 | 
				
			||||||
 | 
					 * for this.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					enum wl_output_transform wlr_drm_connector_get_panel_orientation(
 | 
				
			||||||
 | 
						struct wlr_output *output);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue