Compare commits
	
		
			29 Commits
		
	
	
		
			3.24.4
			...
			gnome-3-18
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | b1b46f196c | ||
|   | 3082504d1b | ||
|   | 8a529123be | ||
|   | 54a680266c | ||
|   | e6d414edfc | ||
|   | 70f20c90bd | ||
|   | b5f7005b88 | ||
|   | f0e2e238f3 | ||
|   | 0c48a2633f | ||
|   | 26a18e8312 | ||
|   | 2ea121a186 | ||
|   | 958cdd5117 | ||
|   | 58d2bd0581 | ||
|   | e5067368f5 | ||
|   | c89918a339 | ||
|   | 15b5e6717f | ||
|   | 3b977f18b3 | ||
|   | 233c148c16 | ||
|   | 8c561a9075 | ||
|   | eb1df05570 | ||
|   | ffa8c0039d | ||
|   | 379044c069 | ||
|   | c5f40f7481 | ||
|   | c9b0d04503 | ||
|   | 0d41399fed | ||
|   | 5d695c674e | ||
|   | 7717725270 | ||
|   | 6542ef2970 | ||
|   | 83d19c8ae2 | 
							
								
								
									
										34
									
								
								NEWS
									
									
									
									
									
								
							
							
						
						
									
										34
									
								
								NEWS
									
									
									
									
									
								
							| @@ -1,3 +1,37 @@ | ||||
| 3.18.4 | ||||
| ====== | ||||
| * Fix mouse cursor disappearing in some multi-monitor setups [Rui; #763159] | ||||
| * Do not assert on non-fatal runtime errors [Florian; #765058] | ||||
|  | ||||
| Contributors: | ||||
|   Rui Matos, Florian Müllner | ||||
|  | ||||
| Translations: | ||||
|   Cédric Valmary [oc] | ||||
|  | ||||
| 3.18.3 | ||||
| ====== | ||||
| * Fix initialization of bypass compositor hint [Rui; #758544] | ||||
| * Fix crash when initial cursor position is not on a monitor [Marek; #756698] | ||||
| * Fix crash when more CRTs are enabled than outputs connected [Rui; #751638] | ||||
| * Fix crash during XWayland initialization [Marek; #751845] | ||||
| * Ensure to send a ConfigureNotify to just mapped windows [Rui; #759492] | ||||
|  | ||||
| Contributors: | ||||
|   Marek Chalupa, Rui Matos, Jasper St. Pierre | ||||
|  | ||||
| 3.18.2 | ||||
| ====== | ||||
| * Misc. crash fixes [Jonas, Rui; #756675, #756660, #757148, #756796] | ||||
| * Fix modifiers-only input source switching on Ubuntu [Alberts; #756543] | ||||
| * Exit cleanly on initialization errors [Owen; #757311] | ||||
|  | ||||
| Contributors: | ||||
|   Jonas Ådahl, Rui Matos, Alberts Muktupāvels, Florian Müllner, Owen W. Taylor | ||||
|  | ||||
| Translations: | ||||
|   Daniel Șerbănescu [ro] | ||||
|  | ||||
| 3.18.1 | ||||
| ====== | ||||
| * Misc. crash fixes [Jonas, Rui, Carlos, Owen, Florian; #755096, #754979, | ||||
|   | ||||
| @@ -2,7 +2,7 @@ AC_PREREQ(2.62) | ||||
|  | ||||
| m4_define([mutter_major_version], [3]) | ||||
| m4_define([mutter_minor_version], [18]) | ||||
| m4_define([mutter_micro_version], [1]) | ||||
| m4_define([mutter_micro_version], [4]) | ||||
|  | ||||
| m4_define([mutter_version], | ||||
|           [mutter_major_version.mutter_minor_version.mutter_micro_version]) | ||||
|   | ||||
							
								
								
									
										1155
									
								
								po/zh_CN.po
									
									
									
									
									
								
							
							
						
						
									
										1155
									
								
								po/zh_CN.po
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -24,6 +24,8 @@ | ||||
|  | ||||
| #include "config.h" | ||||
|  | ||||
| #include <stdlib.h> | ||||
|  | ||||
| #include <meta/meta-backend.h> | ||||
| #include "meta-backend-private.h" | ||||
| #include "meta-input-settings-private.h" | ||||
| @@ -626,7 +628,10 @@ meta_clutter_init (void) | ||||
|   meta_create_backend (); | ||||
|  | ||||
|   if (clutter_init (NULL, NULL) != CLUTTER_INIT_SUCCESS) | ||||
|     g_error ("Unable to initialize Clutter.\n"); | ||||
|     { | ||||
|       g_warning ("Unable to initialize Clutter.\n"); | ||||
|       exit (1); | ||||
|     } | ||||
|  | ||||
|   /* | ||||
|    * XXX: We cannot handle high dpi scaling yet, so fix the scale to 1 | ||||
|   | ||||
| @@ -198,6 +198,7 @@ ensure_xfixes_cursor (MetaCursorTracker *tracker) | ||||
|   guint8 *cursor_data; | ||||
|   gboolean free_cursor_data; | ||||
|   CoglContext *ctx; | ||||
|   CoglError *error = NULL; | ||||
|  | ||||
|   if (tracker->xfixes_cursor) | ||||
|     return; | ||||
| @@ -239,11 +240,17 @@ ensure_xfixes_cursor (MetaCursorTracker *tracker) | ||||
|                                           CLUTTER_CAIRO_FORMAT_ARGB32, | ||||
|                                           cursor_image->width * 4, /* stride */ | ||||
|                                           cursor_data, | ||||
|                                           NULL); | ||||
|                                           &error); | ||||
|  | ||||
|   if (free_cursor_data) | ||||
|     g_free (cursor_data); | ||||
|  | ||||
|   if (error != NULL) | ||||
|     { | ||||
|       meta_warning ("Failed to allocate cursor sprite texture: %s\n", error->message); | ||||
|       cogl_error_free (error); | ||||
|     } | ||||
|  | ||||
|   if (sprite != NULL) | ||||
|     { | ||||
|       MetaCursorSprite *cursor_sprite = meta_cursor_sprite_new (); | ||||
|   | ||||
| @@ -136,6 +136,7 @@ meta_cursor_sprite_load_from_xcursor_image (MetaCursorSprite *self, | ||||
|   ClutterBackend *clutter_backend; | ||||
|   CoglContext *cogl_context; | ||||
|   CoglTexture *texture; | ||||
|   CoglError *error = NULL; | ||||
|  | ||||
|   g_assert (self->texture == NULL); | ||||
|  | ||||
| @@ -156,10 +157,19 @@ meta_cursor_sprite_load_from_xcursor_image (MetaCursorSprite *self, | ||||
|                                            cogl_format, | ||||
|                                            rowstride, | ||||
|                                            (uint8_t *) xc_image->pixels, | ||||
|                                            NULL); | ||||
|                                            &error); | ||||
|  | ||||
|   if (error) | ||||
|     { | ||||
|       meta_warning ("Failed to allocate cursor texture: %s\n", error->message); | ||||
|       cogl_error_free (error); | ||||
|     } | ||||
|  | ||||
|   meta_cursor_sprite_set_texture (self, texture, | ||||
|                                   xc_image->xhot, xc_image->yhot); | ||||
|   cogl_object_unref (texture); | ||||
|  | ||||
|   if (texture) | ||||
|     cogl_object_unref (texture); | ||||
|  | ||||
|   meta_cursor_renderer_realize_cursor_from_xcursor (renderer, self, xc_image); | ||||
| } | ||||
|   | ||||
| @@ -414,6 +414,10 @@ gint               meta_monitor_manager_get_monitor_at_point (MetaMonitorManager | ||||
|                                                               gfloat              x, | ||||
|                                                               gfloat              y); | ||||
|  | ||||
| void meta_monitor_manager_clear_output (MetaOutput *output); | ||||
| void meta_monitor_manager_clear_mode (MetaMonitorMode *mode); | ||||
| void meta_monitor_manager_clear_crtc (MetaCRTC *crtc); | ||||
|  | ||||
| /* Returns true if transform causes width and height to be inverted | ||||
|    This is true for the odd transforms in the enum */ | ||||
| static inline gboolean | ||||
|   | ||||
| @@ -178,7 +178,7 @@ make_logical_config (MetaMonitorManager *manager) | ||||
|   unsigned int i, j; | ||||
|  | ||||
|   monitor_infos = g_array_sized_new (FALSE, TRUE, sizeof (MetaMonitorInfo), | ||||
|                                      manager->n_outputs); | ||||
|                                      manager->n_crtcs); | ||||
|  | ||||
|   /* Walk the list of MetaCRTCs, and build a MetaMonitorInfo | ||||
|      for each of them, unless they reference a rectangle that | ||||
| @@ -346,6 +346,23 @@ meta_monitor_manager_constructed (GObject *object) | ||||
|   manager->in_init = FALSE; | ||||
| } | ||||
|  | ||||
| void | ||||
| meta_monitor_manager_clear_output (MetaOutput *output) | ||||
| { | ||||
|   g_free (output->name); | ||||
|   g_free (output->vendor); | ||||
|   g_free (output->product); | ||||
|   g_free (output->serial); | ||||
|   g_free (output->modes); | ||||
|   g_free (output->possible_crtcs); | ||||
|   g_free (output->possible_clones); | ||||
|  | ||||
|   if (output->driver_notify) | ||||
|     output->driver_notify (output); | ||||
|  | ||||
|   memset (output, 0, sizeof (*output)); | ||||
| } | ||||
|  | ||||
| static void | ||||
| meta_monitor_manager_free_output_array (MetaOutput *old_outputs, | ||||
|                                         int         n_old_outputs) | ||||
| @@ -353,22 +370,22 @@ meta_monitor_manager_free_output_array (MetaOutput *old_outputs, | ||||
|   int i; | ||||
|  | ||||
|   for (i = 0; i < n_old_outputs; i++) | ||||
|     { | ||||
|       g_free (old_outputs[i].name); | ||||
|       g_free (old_outputs[i].vendor); | ||||
|       g_free (old_outputs[i].product); | ||||
|       g_free (old_outputs[i].serial); | ||||
|       g_free (old_outputs[i].modes); | ||||
|       g_free (old_outputs[i].possible_crtcs); | ||||
|       g_free (old_outputs[i].possible_clones); | ||||
|  | ||||
|       if (old_outputs[i].driver_notify) | ||||
|         old_outputs[i].driver_notify (&old_outputs[i]); | ||||
|     } | ||||
|     meta_monitor_manager_clear_output (&old_outputs[i]); | ||||
|  | ||||
|   g_free (old_outputs); | ||||
| } | ||||
|  | ||||
| void | ||||
| meta_monitor_manager_clear_mode (MetaMonitorMode *mode) | ||||
| { | ||||
|   g_free (mode->name); | ||||
|  | ||||
|   if (mode->driver_notify) | ||||
|     mode->driver_notify (mode); | ||||
|  | ||||
|   memset (mode, 0, sizeof (*mode)); | ||||
| } | ||||
|  | ||||
| static void | ||||
| meta_monitor_manager_free_mode_array (MetaMonitorMode *old_modes, | ||||
|                                       int              n_old_modes) | ||||
| @@ -376,16 +393,20 @@ meta_monitor_manager_free_mode_array (MetaMonitorMode *old_modes, | ||||
|   int i; | ||||
|  | ||||
|   for (i = 0; i < n_old_modes; i++) | ||||
|     { | ||||
|       g_free (old_modes[i].name); | ||||
|  | ||||
|       if (old_modes[i].driver_notify) | ||||
|         old_modes[i].driver_notify (&old_modes[i]); | ||||
|     } | ||||
|     meta_monitor_manager_clear_mode (&old_modes[i]); | ||||
|  | ||||
|   g_free (old_modes); | ||||
| } | ||||
|  | ||||
| void | ||||
| meta_monitor_manager_clear_crtc (MetaCRTC *crtc) | ||||
| { | ||||
|   if (crtc->driver_notify) | ||||
|     crtc->driver_notify (crtc); | ||||
|  | ||||
|   memset (crtc, 0, sizeof (*crtc)); | ||||
| } | ||||
|  | ||||
| static void | ||||
| meta_monitor_manager_free_crtc_array (MetaCRTC *old_crtcs, | ||||
|                                       int       n_old_crtcs) | ||||
| @@ -393,10 +414,7 @@ meta_monitor_manager_free_crtc_array (MetaCRTC *old_crtcs, | ||||
|   int i; | ||||
|  | ||||
|   for (i = 0; i < n_old_crtcs; i++) | ||||
|     { | ||||
|       if (old_crtcs[i].driver_notify) | ||||
|         old_crtcs[i].driver_notify (&old_crtcs[i]); | ||||
|     } | ||||
|     meta_monitor_manager_clear_crtc (&old_crtcs[i]); | ||||
|  | ||||
|   g_free (old_crtcs); | ||||
| } | ||||
|   | ||||
| @@ -37,6 +37,8 @@ | ||||
| #include "meta-cursor-renderer-native.h" | ||||
| #include "meta-launcher.h" | ||||
|  | ||||
| #include <stdlib.h> | ||||
|  | ||||
| struct _MetaBackendNativePrivate | ||||
| { | ||||
|   MetaLauncher *launcher; | ||||
| @@ -327,8 +329,15 @@ static void | ||||
| meta_backend_native_init (MetaBackendNative *native) | ||||
| { | ||||
|   MetaBackendNativePrivate *priv = meta_backend_native_get_instance_private (native); | ||||
|   GError *error = NULL; | ||||
|  | ||||
|   priv->launcher = meta_launcher_new (&error); | ||||
|   if (priv->launcher == NULL) | ||||
|     { | ||||
|       g_warning ("Can't initialize KMS backend: %s\n", error->message); | ||||
|       exit (1); | ||||
|     } | ||||
|  | ||||
|   priv->launcher = meta_launcher_new (); | ||||
|   priv->barrier_manager = meta_barrier_manager_native_new (); | ||||
|  | ||||
|   priv->up_client = up_client_new (); | ||||
|   | ||||
| @@ -54,30 +54,22 @@ struct _MetaLauncher | ||||
|   gboolean session_active; | ||||
| }; | ||||
|  | ||||
| static void | ||||
| report_error_and_die (const char *prefix, | ||||
|                       GError *error) | ||||
| { | ||||
|   /* if a function returns due to g_return_val_if_fail, | ||||
|    * then the error may not be set */ | ||||
|   if (error) | ||||
|     g_error ("%s: %s", prefix, error->message); | ||||
|   else | ||||
|     g_error ("%s", prefix); | ||||
|  | ||||
|   /* the error is not freed, but it is ok as g_error aborts the process */ | ||||
| } | ||||
|  | ||||
| static Login1Session * | ||||
| get_session_proxy (GCancellable *cancellable) | ||||
| get_session_proxy (GCancellable *cancellable, | ||||
|                    GError      **error) | ||||
| { | ||||
|   char *proxy_path; | ||||
|   char *session_id; | ||||
|   Login1Session *session_proxy; | ||||
|   GError *error = NULL; | ||||
|  | ||||
|   if (sd_pid_get_session (getpid (), &session_id) < 0) | ||||
|     return NULL; | ||||
|     { | ||||
|       g_set_error (error, | ||||
|                    G_IO_ERROR, | ||||
|                    G_IO_ERROR_NOT_FOUND, | ||||
|                    "Could not get session ID: %m"); | ||||
|       return NULL; | ||||
|     } | ||||
|  | ||||
|   proxy_path = get_escaped_dbus_path ("/org/freedesktop/login1/session", session_id); | ||||
|  | ||||
| @@ -85,9 +77,9 @@ get_session_proxy (GCancellable *cancellable) | ||||
|                                                          G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START, | ||||
|                                                          "org.freedesktop.login1", | ||||
|                                                          proxy_path, | ||||
|                                                          cancellable, &error); | ||||
|                                                          cancellable, error); | ||||
|   if (!session_proxy) | ||||
|     report_error_and_die ("Failed getting session proxy", error); | ||||
|     g_prefix_error(error, "Could not get session proxy: "); | ||||
|  | ||||
|   free (proxy_path); | ||||
|  | ||||
| @@ -95,16 +87,16 @@ get_session_proxy (GCancellable *cancellable) | ||||
| } | ||||
|  | ||||
| static Login1Seat * | ||||
| get_seat_proxy (GCancellable *cancellable) | ||||
| get_seat_proxy (GCancellable *cancellable, | ||||
|                 GError      **error) | ||||
| { | ||||
|   GError *error = NULL; | ||||
|   Login1Seat *seat = login1_seat_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM, | ||||
|                                                          G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START, | ||||
|                                                          "org.freedesktop.login1", | ||||
|                                                          "/org/freedesktop/login1/seat/self", | ||||
|                                                          cancellable, &error); | ||||
|                                                          cancellable, error); | ||||
|   if (!seat) | ||||
|     report_error_and_die ("Could not get seat proxy", error); | ||||
|     g_prefix_error(error, "Could not get seat proxy: "); | ||||
|  | ||||
|   return seat; | ||||
| } | ||||
| @@ -357,69 +349,114 @@ out: | ||||
|   return path; | ||||
| } | ||||
|  | ||||
| static void | ||||
| static gboolean | ||||
| get_kms_fd (Login1Session *session_proxy, | ||||
|             const gchar *seat_id, | ||||
|             int *fd_out) | ||||
|             const gchar   *seat_id, | ||||
|             int           *fd_out, | ||||
|             GError       **error) | ||||
| { | ||||
|   int major, minor; | ||||
|   int fd; | ||||
|   gchar *path; | ||||
|   GError *error = NULL; | ||||
|  | ||||
|   path = get_primary_gpu_path (seat_id); | ||||
|   g_autofree gchar *path = get_primary_gpu_path (seat_id); | ||||
|   if (!path) | ||||
|     g_error ("could not find drm kms device"); | ||||
|     { | ||||
|       g_set_error (error, | ||||
|                    G_IO_ERROR, | ||||
|                    G_IO_ERROR_NOT_FOUND, | ||||
|                    "could not find drm kms device"); | ||||
|       return FALSE; | ||||
|     } | ||||
|  | ||||
|   if (!get_device_info_from_path (path, &major, &minor)) | ||||
|     g_error ("Could not stat %s: %m", path); | ||||
|     { | ||||
|       g_set_error (error, | ||||
|                    G_IO_ERROR, | ||||
|                    G_IO_ERROR_NOT_FOUND, | ||||
|                    "Could not get device info for path %s: %m", path); | ||||
|       return FALSE; | ||||
|     } | ||||
|  | ||||
|   g_free (path); | ||||
|  | ||||
|   if (!take_device (session_proxy, major, minor, &fd, NULL, &error)) | ||||
|     report_error_and_die ("Could not open DRM device", error); | ||||
|   if (!take_device (session_proxy, major, minor, &fd, NULL, error)) | ||||
|     { | ||||
|       g_prefix_error (error, "Could not open DRM device: "); | ||||
|       return FALSE; | ||||
|     } | ||||
|  | ||||
|   *fd_out = fd; | ||||
|  | ||||
|   return TRUE; | ||||
| } | ||||
|  | ||||
| static gchar * | ||||
| get_seat_id (void) | ||||
| get_seat_id (GError **error) | ||||
| { | ||||
|   char *session_id, *seat_id = NULL; | ||||
|   char *session_id, *seat_id; | ||||
|   int r; | ||||
|  | ||||
|   if (sd_pid_get_session (0, &session_id) < 0) | ||||
|     return NULL; | ||||
|   r = sd_pid_get_session (0, &session_id); | ||||
|   if (r < 0) | ||||
|     { | ||||
|       g_set_error (error, | ||||
|                    G_IO_ERROR, | ||||
|                    G_IO_ERROR_NOT_FOUND, | ||||
|                    "Could not get session for PID: %s", g_strerror (-r)); | ||||
|       return NULL; | ||||
|     } | ||||
|  | ||||
|   /* on error the seat_id will remain NULL */ | ||||
|   sd_session_get_seat (session_id, &seat_id); | ||||
|   r = sd_session_get_seat (session_id, &seat_id); | ||||
|   free (session_id); | ||||
|  | ||||
|   if (r < 0) | ||||
|     { | ||||
|       g_set_error (error, | ||||
|                    G_IO_ERROR, | ||||
|                    G_IO_ERROR_NOT_FOUND, | ||||
|                    "Could not get seat for session: %s", g_strerror (-r)); | ||||
|       return NULL; | ||||
|     } | ||||
|  | ||||
|   return seat_id; | ||||
| } | ||||
|  | ||||
| MetaLauncher * | ||||
| meta_launcher_new (void) | ||||
| meta_launcher_new (GError **error) | ||||
| { | ||||
|   MetaLauncher *self = NULL; | ||||
|   Login1Session *session_proxy; | ||||
|   char *seat_id; | ||||
|   GError *error = NULL; | ||||
|   Login1Session *session_proxy = NULL; | ||||
|   Login1Seat *seat_proxy = NULL; | ||||
|   char *seat_id = NULL; | ||||
|   gboolean have_control = FALSE; | ||||
|   int kms_fd; | ||||
|  | ||||
|   session_proxy = get_session_proxy (NULL); | ||||
|   if (!login1_session_call_take_control_sync (session_proxy, FALSE, NULL, &error)) | ||||
|     report_error_and_die ("Could not take control", error); | ||||
|   session_proxy = get_session_proxy (NULL, error); | ||||
|   if (!session_proxy) | ||||
|     goto fail; | ||||
|  | ||||
|   seat_id = get_seat_id (); | ||||
|   if (!login1_session_call_take_control_sync (session_proxy, FALSE, NULL, error)) | ||||
|     { | ||||
|       g_prefix_error (error, "Could not take control: "); | ||||
|       goto fail; | ||||
|     } | ||||
|  | ||||
|   have_control = TRUE; | ||||
|  | ||||
|   seat_id = get_seat_id (error); | ||||
|   if (!seat_id) | ||||
|     g_error ("Failed getting seat id"); | ||||
|     goto fail; | ||||
|  | ||||
|   seat_proxy = get_seat_proxy (NULL, error); | ||||
|   if (!seat_proxy) | ||||
|     goto fail; | ||||
|  | ||||
|   if (!get_kms_fd (session_proxy, seat_id, &kms_fd, error)) | ||||
|     goto fail; | ||||
|  | ||||
|   get_kms_fd (session_proxy, seat_id, &kms_fd); | ||||
|   free (seat_id); | ||||
|  | ||||
|   self = g_slice_new0 (MetaLauncher); | ||||
|   self->session_proxy = session_proxy; | ||||
|   self->seat_proxy = get_seat_proxy (NULL); | ||||
|   self->seat_proxy = seat_proxy; | ||||
|  | ||||
|   self->session_active = TRUE; | ||||
|  | ||||
| @@ -429,8 +466,16 @@ meta_launcher_new (void) | ||||
|                                       self); | ||||
|  | ||||
|   g_signal_connect (self->session_proxy, "notify::active", G_CALLBACK (on_active_changed), self); | ||||
|  | ||||
|   return self; | ||||
|  | ||||
|  fail: | ||||
|   if (have_control) | ||||
|     login1_session_call_release_control_sync (session_proxy, NULL, NULL); | ||||
|   g_clear_object (&session_proxy); | ||||
|   g_clear_object (&seat_proxy); | ||||
|   free (seat_id); | ||||
|  | ||||
|   return NULL; | ||||
| } | ||||
|  | ||||
| void | ||||
|   | ||||
| @@ -24,7 +24,7 @@ | ||||
|  | ||||
| typedef struct _MetaLauncher MetaLauncher; | ||||
|  | ||||
| MetaLauncher     *meta_launcher_new                     (void); | ||||
| MetaLauncher     *meta_launcher_new                     (GError       **error); | ||||
| void              meta_launcher_free                    (MetaLauncher  *self); | ||||
|  | ||||
| gboolean          meta_launcher_activate_session        (MetaLauncher  *self, | ||||
|   | ||||
| @@ -82,6 +82,7 @@ struct _MetaBackendX11Private | ||||
|   gchar *keymap_layouts; | ||||
|   gchar *keymap_variants; | ||||
|   gchar *keymap_options; | ||||
|   int locked_group; | ||||
| }; | ||||
| typedef struct _MetaBackendX11Private MetaBackendX11Private; | ||||
|  | ||||
| @@ -297,15 +298,23 @@ handle_host_xevent (MetaBackend *backend, | ||||
|  | ||||
|   if (event->type == priv->xkb_event_base) | ||||
|     { | ||||
|       XkbAnyEvent *xkb_ev = (XkbAnyEvent *) event; | ||||
|       XkbEvent *xkb_ev = (XkbEvent *) event; | ||||
|  | ||||
|       if (xkb_ev->device == META_VIRTUAL_CORE_KEYBOARD_ID) | ||||
|       if (xkb_ev->any.device == META_VIRTUAL_CORE_KEYBOARD_ID) | ||||
|         { | ||||
|           switch (xkb_ev->xkb_type) | ||||
|           switch (xkb_ev->any.xkb_type) | ||||
|             { | ||||
|             case XkbNewKeyboardNotify: | ||||
|             case XkbMapNotify: | ||||
|               keymap_changed (backend); | ||||
|               break; | ||||
|             case XkbStateNotify: | ||||
|               if (xkb_ev->state.changed & XkbGroupLockMask) | ||||
|                 { | ||||
|                   if (priv->locked_group != xkb_ev->state.locked_group) | ||||
|                     XkbLockGroup (priv->xdisplay, XkbUseCoreKbd, priv->locked_group); | ||||
|                 } | ||||
|               break; | ||||
|             default: | ||||
|               break; | ||||
|             } | ||||
| @@ -776,6 +785,7 @@ meta_backend_x11_lock_layout_group (MetaBackend *backend, | ||||
|   MetaBackendX11 *x11 = META_BACKEND_X11 (backend); | ||||
|   MetaBackendX11Private *priv = meta_backend_x11_get_instance_private (x11); | ||||
|  | ||||
|   priv->locked_group = idx; | ||||
|   XkbLockGroup (priv->xdisplay, XkbUseCoreKbd, idx); | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -637,6 +637,70 @@ output_get_connector_type (MetaMonitorManagerXrandr *manager_xrandr, | ||||
|   return META_CONNECTOR_TYPE_Unknown; | ||||
| } | ||||
|  | ||||
| static void | ||||
| output_get_modes (MetaMonitorManager *manager, | ||||
|                   MetaOutput         *meta_output, | ||||
|                   XRROutputInfo      *output) | ||||
| { | ||||
|   guint j, k; | ||||
|   guint n_actual_modes; | ||||
|  | ||||
|   meta_output->modes = g_new0 (MetaMonitorMode *, output->nmode); | ||||
|  | ||||
|   n_actual_modes = 0; | ||||
|   for (j = 0; j < (guint)output->nmode; j++) | ||||
|     { | ||||
|       for (k = 0; k < manager->n_modes; k++) | ||||
|         { | ||||
|           if (output->modes[j] == (XID)manager->modes[k].mode_id) | ||||
|             { | ||||
|               meta_output->modes[n_actual_modes] = &manager->modes[k]; | ||||
|               n_actual_modes += 1; | ||||
|               break; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|   meta_output->n_modes = n_actual_modes; | ||||
|   if (n_actual_modes > 0) | ||||
|     meta_output->preferred_mode = meta_output->modes[0]; | ||||
| } | ||||
|  | ||||
| static void | ||||
| output_get_crtcs (MetaMonitorManager *manager, | ||||
|                   MetaOutput         *meta_output, | ||||
|                   XRROutputInfo      *output) | ||||
| { | ||||
|   guint j, k; | ||||
|   guint n_actual_crtcs; | ||||
|  | ||||
|   meta_output->possible_crtcs = g_new0 (MetaCRTC *, output->ncrtc); | ||||
|  | ||||
|   n_actual_crtcs = 0; | ||||
|   for (j = 0; j < (unsigned)output->ncrtc; j++) | ||||
|     { | ||||
|       for (k = 0; k < manager->n_crtcs; k++) | ||||
|         { | ||||
|           if ((XID)manager->crtcs[k].crtc_id == output->crtcs[j]) | ||||
|             { | ||||
|               meta_output->possible_crtcs[n_actual_crtcs] = &manager->crtcs[k]; | ||||
|               n_actual_crtcs += 1; | ||||
|               break; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|   meta_output->n_possible_crtcs = n_actual_crtcs; | ||||
|  | ||||
|   meta_output->crtc = NULL; | ||||
|   for (j = 0; j < manager->n_crtcs; j++) | ||||
|     { | ||||
|       if ((XID)manager->crtcs[j].crtc_id == output->crtc) | ||||
|         { | ||||
|           meta_output->crtc = &manager->crtcs[j]; | ||||
|           break; | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| static char * | ||||
| get_xmode_name (XRRModeInfo *xmode) | ||||
| { | ||||
| @@ -773,6 +837,8 @@ meta_monitor_manager_xrandr_read_current (MetaMonitorManager *manager) | ||||
|       MetaOutput *meta_output; | ||||
|  | ||||
|       output = XRRGetOutputInfo (manager_xrandr->xdisplay, resources, resources->outputs[i]); | ||||
|       if (!output) | ||||
|         continue; | ||||
|  | ||||
|       meta_output = &manager->outputs[n_actual_outputs]; | ||||
|  | ||||
| @@ -796,44 +862,8 @@ meta_monitor_manager_xrandr_read_current (MetaMonitorManager *manager) | ||||
|           meta_output->connector_type = output_get_connector_type (manager_xrandr, meta_output); | ||||
|  | ||||
| 	  output_get_tile_info (manager_xrandr, meta_output); | ||||
| 	  meta_output->n_modes = output->nmode; | ||||
| 	  meta_output->modes = g_new0 (MetaMonitorMode *, meta_output->n_modes); | ||||
| 	  for (j = 0; j < meta_output->n_modes; j++) | ||||
| 	    { | ||||
| 	      for (k = 0; k < manager->n_modes; k++) | ||||
| 		{ | ||||
| 		  if (output->modes[j] == (XID)manager->modes[k].mode_id) | ||||
| 		    { | ||||
| 		      meta_output->modes[j] = &manager->modes[k]; | ||||
| 		      break; | ||||
| 		    } | ||||
| 		} | ||||
| 	    } | ||||
| 	  meta_output->preferred_mode = meta_output->modes[0]; | ||||
|  | ||||
| 	  meta_output->n_possible_crtcs = output->ncrtc; | ||||
| 	  meta_output->possible_crtcs = g_new0 (MetaCRTC *, meta_output->n_possible_crtcs); | ||||
| 	  for (j = 0; j < (unsigned)output->ncrtc; j++) | ||||
| 	    { | ||||
| 	      for (k = 0; k < manager->n_crtcs; k++) | ||||
| 		{ | ||||
| 		  if ((XID)manager->crtcs[k].crtc_id == output->crtcs[j]) | ||||
| 		    { | ||||
| 		      meta_output->possible_crtcs[j] = &manager->crtcs[k]; | ||||
| 		      break; | ||||
| 		    } | ||||
| 		} | ||||
| 	    } | ||||
|  | ||||
| 	  meta_output->crtc = NULL; | ||||
| 	  for (j = 0; j < manager->n_crtcs; j++) | ||||
| 	    { | ||||
| 	      if ((XID)manager->crtcs[j].crtc_id == output->crtc) | ||||
| 		{ | ||||
| 		  meta_output->crtc = &manager->crtcs[j]; | ||||
| 		  break; | ||||
| 		} | ||||
| 	    } | ||||
| 	  output_get_modes (manager, meta_output, output); | ||||
|           output_get_crtcs (manager, meta_output, output); | ||||
|  | ||||
| 	  meta_output->n_possible_clones = output->nclone; | ||||
| 	  meta_output->possible_clones = g_new0 (MetaOutput *, meta_output->n_possible_clones); | ||||
| @@ -857,7 +887,10 @@ meta_monitor_manager_xrandr_read_current (MetaMonitorManager *manager) | ||||
| 	  else | ||||
| 	    meta_output->backlight = -1; | ||||
|  | ||||
| 	  n_actual_outputs++; | ||||
|           if (meta_output->n_modes == 0 || meta_output->n_possible_crtcs == 0) | ||||
|             meta_monitor_manager_clear_output (meta_output); | ||||
|           else | ||||
|             n_actual_outputs++; | ||||
| 	} | ||||
|  | ||||
|       XRRFreeOutputInfo (output); | ||||
|   | ||||
| @@ -152,6 +152,7 @@ file_loaded (GObject      *source_object, | ||||
| { | ||||
|   MetaBackgroundImage *image = META_BACKGROUND_IMAGE (source_object); | ||||
|   GError *error = NULL; | ||||
|   CoglError *catch_error = NULL; | ||||
|   GTask *task; | ||||
|   CoglTexture *texture; | ||||
|   GdkPixbuf *pixbuf; | ||||
| @@ -186,9 +187,10 @@ file_loaded (GObject      *source_object, | ||||
|                               has_alpha ? COGL_PIXEL_FORMAT_RGBA_8888 : COGL_PIXEL_FORMAT_RGB_888, | ||||
|                               row_stride, | ||||
|                               pixels, 0, | ||||
|                               NULL)) | ||||
|                               &catch_error)) | ||||
|     { | ||||
|       g_warning ("Failed to create texture for background"); | ||||
|       cogl_error_free (catch_error); | ||||
|       cogl_object_unref (texture); | ||||
|     } | ||||
|  | ||||
|   | ||||
| @@ -17,6 +17,7 @@ | ||||
|  * along with this program; if not, see <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| #include <meta/util.h> | ||||
| #include <meta/meta-background.h> | ||||
| #include <meta/meta-background-image.h> | ||||
| #include "meta-background-private.h" | ||||
| @@ -542,6 +543,7 @@ ensure_color_texture (MetaBackground *self) | ||||
|     { | ||||
|       ClutterBackend *backend = clutter_get_default_backend (); | ||||
|       CoglContext *ctx = clutter_backend_get_cogl_context (backend); | ||||
|       CoglError *error = NULL; | ||||
|       uint8_t pixels[6]; | ||||
|       int width, height; | ||||
|  | ||||
| @@ -582,7 +584,13 @@ ensure_color_texture (MetaBackground *self) | ||||
|                                                                          COGL_PIXEL_FORMAT_RGB_888, | ||||
|                                                                          width * 3, | ||||
|                                                                          pixels, | ||||
|                                                                          NULL)); | ||||
|                                                                          &error)); | ||||
|  | ||||
|       if (error != NULL) | ||||
|         { | ||||
|           meta_warning ("Failed to allocate color texture: %s\n", error->message); | ||||
|           cogl_error_free (error); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -27,6 +27,7 @@ | ||||
| #include <string.h> | ||||
|  | ||||
| #include <meta/meta-shadow-factory.h> | ||||
| #include <meta/util.h> | ||||
|  | ||||
| #include "cogl-utils.h" | ||||
| #include "region-utils.h" | ||||
| @@ -707,6 +708,7 @@ make_shadow (MetaShadow     *shadow, | ||||
| { | ||||
|   ClutterBackend *backend = clutter_get_default_backend (); | ||||
|   CoglContext *ctx = clutter_backend_get_cogl_context (backend); | ||||
|   CoglError *error = NULL; | ||||
|   int d = get_box_filter_size (shadow->key.radius); | ||||
|   int spread = get_shadow_spread (shadow->key.radius); | ||||
|   cairo_rectangle_int_t extents; | ||||
| @@ -804,7 +806,13 @@ make_shadow (MetaShadow     *shadow, | ||||
|                                                                  (buffer + | ||||
|                                                                   (y_offset - shadow->outer_border_top) * buffer_width + | ||||
|                                                                   (x_offset - shadow->outer_border_left)), | ||||
|                                                                  NULL)); | ||||
|                                                                  &error)); | ||||
|  | ||||
|   if (error) | ||||
|     { | ||||
|       meta_warning ("Failed to allocate shadow texture: %s\n", error->message); | ||||
|       cogl_error_free (error); | ||||
|     } | ||||
|  | ||||
|   cairo_region_destroy (row_convolve_region); | ||||
|   cairo_region_destroy (column_convolve_region); | ||||
|   | ||||
| @@ -102,8 +102,7 @@ detach_pixmap (MetaSurfaceActorX11 *self) | ||||
|   priv->pixmap = None; | ||||
|   meta_error_trap_pop (display); | ||||
|  | ||||
|   cogl_object_unref (priv->texture); | ||||
|   priv->texture = NULL; | ||||
|   g_clear_pointer (&priv->texture, cogl_object_unref); | ||||
| } | ||||
|  | ||||
| static void | ||||
| @@ -114,14 +113,20 @@ set_pixmap (MetaSurfaceActorX11 *self, | ||||
|  | ||||
|   CoglContext *ctx = clutter_backend_get_cogl_context (clutter_get_default_backend ()); | ||||
|   MetaShapedTexture *stex = meta_surface_actor_get_texture (META_SURFACE_ACTOR (self)); | ||||
|   CoglError *error = NULL; | ||||
|   CoglTexture *texture; | ||||
|  | ||||
|   g_assert (priv->pixmap == None); | ||||
|   priv->pixmap = pixmap; | ||||
|  | ||||
|   texture = COGL_TEXTURE (cogl_texture_pixmap_x11_new (ctx, priv->pixmap, FALSE, NULL)); | ||||
|   texture = COGL_TEXTURE (cogl_texture_pixmap_x11_new (ctx, priv->pixmap, FALSE, &error)); | ||||
|  | ||||
|   if (G_UNLIKELY (!cogl_texture_pixmap_x11_is_using_tfp_extension (COGL_TEXTURE_PIXMAP_X11 (texture)))) | ||||
|   if (error != NULL) | ||||
|     { | ||||
|       g_warning ("Failed to allocate stex texture: %s", error->message); | ||||
|       cogl_error_free (error); | ||||
|     } | ||||
|   else if (G_UNLIKELY (!cogl_texture_pixmap_x11_is_using_tfp_extension (COGL_TEXTURE_PIXMAP_X11 (texture)))) | ||||
|     g_warning ("NOTE: Not using GLX TFP!\n"); | ||||
|  | ||||
|   priv->texture = texture; | ||||
|   | ||||
| @@ -1752,9 +1752,17 @@ build_and_scan_frame_mask (MetaWindowActor       *self, | ||||
|     } | ||||
|   else | ||||
|     { | ||||
|       CoglError *error = NULL; | ||||
|  | ||||
|       mask_texture = COGL_TEXTURE (cogl_texture_2d_new_from_data (ctx, tex_width, tex_height, | ||||
|                                                                   COGL_PIXEL_FORMAT_A_8, | ||||
|                                                                   stride, mask_data, NULL)); | ||||
|                                                                   stride, mask_data, &error)); | ||||
|  | ||||
|       if (error) | ||||
|         { | ||||
|           g_warning ("Failed to allocate mask texture: %s", error->message); | ||||
|           cogl_error_free (error); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|   meta_shaped_texture_set_mask_texture (stex, mask_texture); | ||||
|   | ||||
| @@ -1267,7 +1267,8 @@ root_cursor_prepare_at (MetaCursorSprite *cursor_sprite, | ||||
|   monitor = meta_screen_get_monitor_for_point (screen, x, y); | ||||
|  | ||||
|   /* Reload the cursor texture if the scale has changed. */ | ||||
|   meta_cursor_sprite_set_theme_scale (cursor_sprite, monitor->scale); | ||||
|   if (monitor) | ||||
|     meta_cursor_sprite_set_theme_scale (cursor_sprite, monitor->scale); | ||||
| } | ||||
|  | ||||
| static void | ||||
|   | ||||
| @@ -3534,10 +3534,7 @@ meta_window_update_for_monitors_changed (MetaWindow *window) | ||||
| { | ||||
|   const MetaMonitorInfo *old, *new; | ||||
|  | ||||
|   if (window->type == META_WINDOW_DESKTOP) | ||||
|     return; | ||||
|  | ||||
|   if (window->override_redirect) | ||||
|   if (window->override_redirect || window->type == META_WINDOW_DESKTOP) | ||||
|     { | ||||
|       meta_window_update_monitor (window, FALSE); | ||||
|       return; | ||||
|   | ||||
| @@ -9,6 +9,8 @@ | ||||
|     <method name="TakeControl"> | ||||
|       <arg name="force" type="b"/> | ||||
|     </method> | ||||
|     <method name="ReleaseControl"> | ||||
|     </method> | ||||
|     <method name="TakeDevice"> | ||||
|       <annotation name="org.gtk.GDBus.C.UnixFD" value="true"/> | ||||
|       <arg name="major" type="u" direction="in"/> | ||||
|   | ||||
| @@ -138,12 +138,19 @@ meta_wayland_buffer_process_damage (MetaWaylandBuffer *buffer, | ||||
|  | ||||
|       for (i = 0; i < n_rectangles; i++) | ||||
|         { | ||||
|           CoglError *error = NULL; | ||||
|           cairo_rectangle_int_t rect; | ||||
|           cairo_region_get_rectangle (region, i, &rect); | ||||
|           cogl_wayland_texture_set_region_from_shm_buffer (buffer->texture, | ||||
|                                                            rect.x, rect.y, rect.width, rect.height, | ||||
|                                                            shm_buffer, | ||||
|                                                            rect.x, rect.y, 0, NULL); | ||||
|                                                            rect.x, rect.y, 0, &error); | ||||
|  | ||||
|           if (error) | ||||
|             { | ||||
|               meta_warning ("Failed to set texture region: %s\n", error->message); | ||||
|               cogl_error_free (error); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|       wl_shm_buffer_end_access (shm_buffer); | ||||
|   | ||||
| @@ -112,7 +112,7 @@ struct wl_array * | ||||
| meta_wayland_data_source_get_mime_types (const MetaWaylandDataSource *source) | ||||
| { | ||||
|   MetaWaylandDataSourcePrivate *priv = | ||||
|     meta_wayland_data_source_get_instance_private (source); | ||||
|     meta_wayland_data_source_get_instance_private ((MetaWaylandDataSource *)source); | ||||
|  | ||||
|   return &priv->mime_types; | ||||
| } | ||||
| @@ -966,7 +966,7 @@ meta_wayland_data_source_has_mime_type (const MetaWaylandDataSource *source, | ||||
|                                         const gchar                 *mime_type) | ||||
| { | ||||
|   MetaWaylandDataSourcePrivate *priv = | ||||
|     meta_wayland_data_source_get_instance_private (source); | ||||
|     meta_wayland_data_source_get_instance_private ((MetaWaylandDataSource *)source); | ||||
|   gchar **p; | ||||
|  | ||||
|   wl_array_for_each (p, &priv->mime_types) | ||||
|   | ||||
| @@ -823,8 +823,9 @@ cursor_sprite_prepare_at (MetaCursorSprite *cursor_sprite, | ||||
|   if (!meta_xwayland_is_xwayland_surface (surface)) | ||||
|     { | ||||
|       monitor = meta_screen_get_monitor_for_point (screen, x, y); | ||||
|       meta_cursor_sprite_set_texture_scale (cursor_sprite, | ||||
|                                             (float)monitor->scale / surface->scale); | ||||
|       if (monitor) | ||||
|         meta_cursor_sprite_set_texture_scale (cursor_sprite, | ||||
|                                               (float)monitor->scale / surface->scale); | ||||
|     } | ||||
|   meta_wayland_surface_update_outputs (surface); | ||||
| } | ||||
|   | ||||
| @@ -1515,15 +1515,15 @@ xdg_shell_get_xdg_popup (struct wl_client *client, | ||||
|                                   surface, | ||||
|                                   xdg_popup_destructor); | ||||
|  | ||||
|   surface->xdg_popup = popup_resource; | ||||
|   surface->xdg_shell_resource = resource; | ||||
|  | ||||
|   if (!meta_wayland_pointer_can_popup (&seat->pointer, serial)) | ||||
|     { | ||||
|       xdg_popup_send_popup_done (popup_resource); | ||||
|       return; | ||||
|     } | ||||
|  | ||||
|   surface->xdg_popup = popup_resource; | ||||
|   surface->xdg_shell_resource = resource; | ||||
|  | ||||
|   surface->popup.parent = parent_surf; | ||||
|   surface->popup.parent_destroy_listener.notify = handle_popup_parent_destroyed; | ||||
|   wl_resource_add_destroy_listener (parent_surf->resource, | ||||
|   | ||||
| @@ -337,13 +337,13 @@ meta_wayland_init (void) | ||||
|   meta_wayland_pointer_gestures_init (compositor); | ||||
|   meta_wayland_seat_init (compositor); | ||||
|  | ||||
|   if (!meta_xwayland_start (&compositor->xwayland_manager, compositor->wayland_display)) | ||||
|     g_error ("Failed to start X Wayland"); | ||||
|  | ||||
|   compositor->display_name = wl_display_add_socket_auto (compositor->wayland_display); | ||||
|   if (compositor->display_name == NULL) | ||||
|     g_error ("Failed to create socket"); | ||||
|  | ||||
|   if (!meta_xwayland_start (&compositor->xwayland_manager, compositor->wayland_display)) | ||||
|     g_error ("Failed to start X Wayland"); | ||||
|  | ||||
|   set_gnome_env ("DISPLAY", meta_wayland_get_xwayland_display_name (compositor)); | ||||
|   set_gnome_env ("WAYLAND_DISPLAY", meta_wayland_get_wayland_display_name (compositor)); | ||||
| } | ||||
|   | ||||
| @@ -182,6 +182,8 @@ argbdata_to_surface (gulong *argb_data, int w, int h) | ||||
|         } | ||||
|     } | ||||
|  | ||||
|   cairo_surface_mark_dirty (surface); | ||||
|  | ||||
|   return surface; | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -1843,7 +1843,7 @@ meta_display_init_window_prop_hooks (MetaDisplay *display) | ||||
|     { display->atom__NET_WM_WINDOW_TYPE, META_PROP_VALUE_ATOM_LIST, reload_net_wm_window_type, LOAD_INIT | INCLUDE_OR | FORCE_INIT }, | ||||
|     { display->atom__NET_WM_STRUT,         META_PROP_VALUE_INVALID, reload_struts, NONE }, | ||||
|     { display->atom__NET_WM_STRUT_PARTIAL, META_PROP_VALUE_INVALID, reload_struts, NONE }, | ||||
|     { display->atom__NET_WM_BYPASS_COMPOSITOR, META_PROP_VALUE_CARDINAL,  reload_bypass_compositor, NONE }, | ||||
|     { display->atom__NET_WM_BYPASS_COMPOSITOR, META_PROP_VALUE_CARDINAL,  reload_bypass_compositor, LOAD_INIT | INCLUDE_OR }, | ||||
|     { display->atom__NET_WM_WINDOW_OPACITY, META_PROP_VALUE_CARDINAL, reload_window_opacity, LOAD_INIT | INCLUDE_OR }, | ||||
|     { 0 }, | ||||
|   }; | ||||
|   | ||||
| @@ -542,13 +542,10 @@ meta_window_x11_manage (MetaWindow *window) | ||||
|    * For normal windows, do a full ConfigureRequest based on the | ||||
|    * window hints, as that's what the ICCCM says to do. | ||||
|    */ | ||||
|   priv->client_rect = window->rect; | ||||
|   window->buffer_rect = window->rect; | ||||
|  | ||||
|   if (window->override_redirect) | ||||
|     { | ||||
|       priv->client_rect = window->rect; | ||||
|       window->buffer_rect = window->rect; | ||||
|     } | ||||
|   else | ||||
|   if (!window->override_redirect) | ||||
|     { | ||||
|       MetaRectangle rect; | ||||
|       MetaMoveResizeFlags flags; | ||||
| @@ -1735,9 +1732,9 @@ meta_window_x11_update_input_region (MetaWindow *window) | ||||
|           region = cairo_region_create (); | ||||
|         } | ||||
|       else if (n_rects == 1 && | ||||
|                (rects[0].x == 0 || | ||||
|                 rects[0].y == 0 || | ||||
|                 rects[0].width == priv->client_rect.width || | ||||
|                (rects[0].x == 0 && | ||||
|                 rects[0].y == 0 && | ||||
|                 rects[0].width == priv->client_rect.width && | ||||
|                 rects[0].height == priv->client_rect.height)) | ||||
|         { | ||||
|           /* This is the bounding region case. Keep the | ||||
|   | ||||
		Reference in New Issue
	
	Block a user