void 
hildon_desktop_ms_is_at_visible_extreme (HildonDesktopMultiscreen *dms,
                                         GdkScreen *screen,
                                         gint monitor,
                                         gboolean *leftmost,
                                         gboolean *rightmost,
                                         gboolean *topmost,
                                         gboolean *bottommost)
{
  g_return_if_fail (dms && HILDON_DESKTOP_IS_MULTISCREEN  (dms));

  MonitorBounds monitorb;
  gint n_screen, i;

  n_screen = gdk_screen_get_number (screen);

  *leftmost = *rightmost  = *topmost = *bottommost = TRUE;

  g_return_if_fail (n_screen >= 0 && n_screen < dms->screens);
  g_return_if_fail (monitor >= 0 || monitor < dms->monitors[n_screen]);

  get_monitor_bounds (dms, n_screen, monitor, &monitorb);
	
 /* go through each monitor and try to find one either right,
  * below, above, or left of the specified monitor
  */

  for (i = 0; i < dms->monitors[n_screen]; i++)
  {
    MonitorBounds iter;

    if (i == monitor) continue;

    get_monitor_bounds (dms, n_screen, i, &iter);

    if ((iter.y0 >= monitorb.y0 && iter.y0 <  monitorb.y1) ||
	(iter.y1 >  monitorb.y0 && iter.y1 <= monitorb.y1))
    {
      if (iter.x0 < monitorb.x0)
	*leftmost = FALSE;

      if (iter.x1 > monitorb.x1)
  	*rightmost = FALSE;
    }

    if ((iter.x0 >= monitorb.x0 && iter.x0 <  monitorb.x1) ||
	(iter.x1 >  monitorb.x0 && iter.x1 <= monitorb.x1))
    {
      if (iter.y0 < monitorb.y0)
	*topmost = FALSE;
      if (iter.y1 > monitorb.y1)
	*bottommost = FALSE;
    }
  }
}
Ejemplo n.º 2
0
/* determines whether a given monitor is along the visible
 * edge of the logical screen.
 */
void
panel_multiscreen_is_at_visible_extreme (GdkScreen *screen,
					 int        n_monitor,
					 gboolean  *leftmost,
					 gboolean  *rightmost,
					 gboolean  *topmost,
					 gboolean  *bottommost)
{
	MonitorBounds monitor;
	int           n_screen, i;

	n_screen = gdk_screen_get_number (screen);

	*leftmost   = TRUE;
	*rightmost  = TRUE;
	*topmost    = TRUE;
	*bottommost = TRUE;

	g_return_if_fail (n_screen >= 0 && n_screen < screens);
	g_return_if_fail (n_monitor >= 0 && n_monitor < monitors [n_screen]);

	get_monitor_bounds (n_screen, n_monitor, &monitor);

	/* go through each monitor and try to find one either right,
	 * below, above, or left of the specified monitor
	 */

	for (i = 0; i < monitors [n_screen]; i++) {
		MonitorBounds iter;

		if (i == n_monitor) continue;

		get_monitor_bounds (n_screen, i, &iter);

		if ((iter.y0 >= monitor.y0 && iter.y0 <  monitor.y1) ||
		    (iter.y1 >  monitor.y0 && iter.y1 <= monitor.y1)) {
			if (iter.x0 < monitor.x0)
				*leftmost = FALSE;
			if (iter.x1 > monitor.x1)
				*rightmost = FALSE;
		}

		if ((iter.x0 >= monitor.x0 && iter.x0 <  monitor.x1) ||
		    (iter.x1 >  monitor.x0 && iter.x1 <= monitor.x1)) {
			if (iter.y0 < monitor.y0)
				*topmost = FALSE;
			if (iter.y1 > monitor.y1)
				*bottommost = FALSE;
		}
	}
}