@@ -1268,11 +1268,8 @@ apply_background_to_window (GSManager *manager,
12681268 GSWindow * window )
12691269{
12701270 cairo_surface_t * surface ;
1271- GdkDisplay * display ;
1272- GdkScreen * screen ;
12731271 int width ;
12741272 int height ;
1275- gint scale ;
12761273
12771274 mate_bg_load_from_preferences (manager -> priv -> bg );
12781275
@@ -1282,11 +1279,8 @@ apply_background_to_window (GSManager *manager,
12821279 gs_window_set_background_surface (window , NULL );
12831280 }
12841281
1285- display = gs_window_get_display (window );
1286- screen = gdk_display_get_default_screen (display );
1287- scale = gdk_window_get_scale_factor (gdk_screen_get_root_window (screen ));
1288- width = WidthOfScreen (gdk_x11_screen_get_xscreen (screen )) / scale ;
1289- height = HeightOfScreen (gdk_x11_screen_get_xscreen (screen )) / scale ;
1282+ gtk_widget_get_preferred_width (GTK_WIDGET (window ), & width , NULL );
1283+ gtk_widget_get_preferred_height (GTK_WIDGET (window ), & height , NULL );
12901284 gs_debug ("Creating background w:%d h:%d" , width , height );
12911285 surface = mate_bg_create_surface (manager -> priv -> bg ,
12921286 gs_window_get_gdk_window (window ),
@@ -1563,84 +1557,73 @@ gs_manager_create_window_for_monitor (GSManager *manager,
15631557}
15641558
15651559static void
1566- on_screen_monitors_changed (GdkScreen * screen ,
1567- GSManager * manager )
1560+ on_display_monitor_added (GdkDisplay * display ,
1561+ GdkMonitor * monitor ,
1562+ GSManager * manager )
15681563{
15691564 GSList * l ;
1570- GdkDisplay * display ;
15711565 int n_monitors ;
1572- int n_windows ;
1573- int i ;
15741566
1575- display = gdk_screen_get_display (screen );
15761567 n_monitors = gdk_display_get_n_monitors (display );
1577- n_windows = g_slist_length (manager -> priv -> windows );
15781568
1579- gs_debug ("Monitors changed for display %s: num=%d" ,
1580- gdk_display_get_name (display ),
1581- n_monitors );
1569+ gs_debug ("Monitor added on display %s, now there are %d" ,
1570+ gdk_display_get_name (display ), n_monitors );
15821571
1583- if (n_monitors > n_windows )
1572+ /* Tear down the unlock dialog in case we want to move it
1573+ * to the new monitor
1574+ */
1575+ l = manager -> priv -> windows ;
1576+ while (l != NULL )
15841577 {
1578+ gs_window_cancel_unlock_request (GS_WINDOW (l -> data ));
1579+ l = l -> next ;
1580+ }
15851581
1586- /* Tear down unlock dialog in case we want to move it
1587- * to a new monitor
1588- */
1589- l = manager -> priv -> windows ;
1590- while (l != NULL )
1591- {
1592- gs_window_cancel_unlock_request (GS_WINDOW (l -> data ));
1593- l = l -> next ;
1594- }
1582+ /* add a new window */
1583+ gs_manager_create_window_for_monitor (manager , monitor );
15951584
1596- /* add more windows */
1597- for (i = n_windows ; i < n_monitors ; i ++ )
1598- {
1599- GdkMonitor * mon = gdk_display_get_monitor (display , i );
1600- gs_manager_create_window_for_monitor (manager , mon );
1601- }
1585+ /* and put unlock dialog up whereever it's supposed to be */
1586+ gs_manager_request_unlock (manager );
1587+ }
16021588
1603- /* And put unlock dialog up where ever it's supposed to be
1604- */
1605- gs_manager_request_unlock (manager );
1606- }
1607- else
1608- {
1589+ static void
1590+ on_display_monitor_removed (GdkDisplay * display ,
1591+ GdkMonitor * monitor ,
1592+ GSManager * manager )
1593+ {
1594+ GSList * l ;
1595+ int n_monitors ;
16091596
1610- gdk_x11_grab_server ( );
1597+ n_monitors = gdk_display_get_n_monitors ( display );
16111598
1612- /* remove the extra windows */
1613- l = manager -> priv -> windows ;
1614- while (l != NULL )
1615- {
1616- GdkDisplay * this_display ;
1617- GdkMonitor * this_monitor ;
1618- GSList * next = l -> next ;
1619-
1620- this_display = gs_window_get_display (GS_WINDOW (l -> data ));
1621- this_monitor = gs_window_get_monitor (GS_WINDOW (l -> data ));
1622- if (this_display == display &&
1623- !GDK_IS_MONITOR (this_monitor ))
1624- {
1625- manager_maybe_stop_job_for_window (manager , GS_WINDOW (l -> data ));
1626- g_hash_table_remove (manager -> priv -> jobs , l -> data );
1627- gs_window_destroy (GS_WINDOW (l -> data ));
1628- manager -> priv -> windows = g_slist_delete_link (manager -> priv -> windows , l );
1629- }
1630- l = next ;
1631- }
1599+ gs_debug ("Monitor removed on display %s, now there are %d" ,
1600+ gdk_display_get_name (display ), n_monitors );
16321601
1633- /* make sure there is a lock dialog on a connected monitor,
1634- * and that the keyboard is still properly grabbed after all
1635- * the windows above got destroyed*/
1636- if (n_windows > n_monitors )
1602+ gdk_x11_grab_server ();
1603+
1604+ /* remove the now extra window */
1605+ l = manager -> priv -> windows ;
1606+ while (l != NULL )
1607+ {
1608+ GdkDisplay * this_display ;
1609+ GdkMonitor * this_monitor ;
1610+ GSList * next = l -> next ;
1611+
1612+ this_display = gs_window_get_display (GS_WINDOW (l -> data ));
1613+ this_monitor = gs_window_get_monitor (GS_WINDOW (l -> data ));
1614+ if (this_display == display && this_monitor == monitor )
16371615 {
1638- gs_manager_request_unlock (manager );
1616+ manager_maybe_stop_job_for_window (manager ,
1617+ GS_WINDOW (l -> data ));
1618+ g_hash_table_remove (manager -> priv -> jobs , l -> data );
1619+ gs_window_destroy (GS_WINDOW (l -> data ));
1620+ manager -> priv -> windows = g_slist_delete_link (manager -> priv -> windows , l );
16391621 }
1640-
1641- gdk_flush ();
1642- gdk_x11_ungrab_server ();
1622+ l = next ;
16431623 }
1624+
1625+ gdk_display_flush (display );
1626+ gdk_x11_ungrab_server ();
16441627}
16451628
16461629static void
@@ -1659,8 +1642,11 @@ gs_manager_destroy_windows (GSManager *manager)
16591642
16601643 display = gdk_display_get_default ();
16611644
1662- g_signal_handlers_disconnect_by_func (gdk_display_get_default_screen (display ),
1663- on_screen_monitors_changed ,
1645+ g_signal_handlers_disconnect_by_func (display ,
1646+ on_display_monitor_removed ,
1647+ manager );
1648+ g_signal_handlers_disconnect_by_func (display ,
1649+ on_display_monitor_added ,
16641650 manager );
16651651
16661652 for (l = manager -> priv -> windows ; l ; l = l -> next )
@@ -1753,9 +1739,11 @@ gs_manager_create_windows (GSManager *manager)
17531739 g_assert (manager -> priv -> windows == NULL );
17541740
17551741 display = gdk_display_get_default ();
1756- g_signal_connect (gdk_display_get_default_screen (display ),
1757- "monitors-changed" ,
1758- G_CALLBACK (on_screen_monitors_changed ),
1742+ g_signal_connect (display , "monitor-added" ,
1743+ G_CALLBACK (on_display_monitor_added ),
1744+ manager );
1745+ g_signal_connect (display , "monitor-removed" ,
1746+ G_CALLBACK (on_display_monitor_removed ),
17591747 manager );
17601748
17611749 gs_manager_create_windows_for_display (manager , display );
0 commit comments