void
mb_wm_decor_button_move_to (MBWMDecorButton *button, int x, int y)
{
  /* FIXME: set a sync flag so it know X movewindow is needed */
  button->geom.x = x;
  button->geom.y = y;

  MBWM_DBG ("#######  moving to %i, %i\n", button->geom.x, button->geom.y);
}
static void
mb_wm_decor_calc_geometry (MBWMDecor *decor)
{
  MBWindowManager       *wm;
  MBWindowManagerClient *client;
  int n, s, w, e;

  if (decor->parent_client == NULL)
    return;

  client = decor->parent_client;
  wm = client->wmref;

  mb_wm_theme_get_decor_dimensions (wm->theme, client,
				    &n, &s, &w, &e);

  switch (decor->type)
    {
    case MBWMDecorTypeNorth:
      decor->geom.x      = 0;
      decor->geom.y      = 0;
      decor->geom.height = n;
      decor->geom.width  = client->frame_geometry.width;
      break;
    case MBWMDecorTypeSouth:
      decor->geom.x      = 0;
      decor->geom.y      = client->window->geometry.height + n;
      decor->geom.height = s;
      decor->geom.width  = client->frame_geometry.width;
      break;
    case MBWMDecorTypeWest:
      decor->geom.x      = 0;
      decor->geom.y      = n;
      decor->geom.height = client->window->geometry.height;
      decor->geom.width  = w;
      break;
    case MBWMDecorTypeEast:
      decor->geom.x      = client->window->geometry.width + w;
      decor->geom.y      = n;
      decor->geom.height = client->window->geometry.height;
      decor->geom.width  = e;
      break;
    default:
      /* FIXME: some kind of callback for custom types here ? */
      break;
    }

  MBWM_DBG("geom is +%i+%i %ix%i, Type %i",
	   decor->geom.x,
	   decor->geom.y,
	   decor->geom.width,
	   decor->geom.height,
	   decor->type);

  return;
}
Beispiel #3
0
static void
mb_wm_client_app_class_init (MBWMObjectClass *klass)
{
  MBWindowManagerClientClass *client;
  MBWMClientAppClass * client_app;

  MBWM_MARK();

  client     = (MBWindowManagerClientClass *)klass;
  client_app = (MBWMClientAppClass *)klass;

  MBWM_DBG("client->stack is %p", client->stack);

  client->client_type = MBWMClientTypeApp;
  client->geometry = mb_wm_client_app_request_geometry;
  client->theme_change = mb_wm_client_app_theme_change;
  client->stacking_layer = mb_wm_client_app_stacking_layer;

#if MBWM_WANT_DEBUG
  klass->klass_name = "MBWMClientApp";
#endif
}
static Bool
mb_wm_decor_sync_window (MBWMDecor *decor)
{
  MBWindowManager     *wm;
  XSetWindowAttributes attr;

  if (decor->parent_client == NULL)
    return False;

  wm = decor->parent_client->wmref;


  if (decor->xwin == None)
    {
      if (!decor->geom.width || !decor->geom.height)
        /* Don't bother creating 1-dimension windows, X would reject it
         * anyway, but we wouldn't notice the error. */
        return False;

      attr.override_redirect = True;
      /*attr.background_pixel  = WhitePixel(wm->xdpy, wm->xscreen);*/
      attr.background_pixmap = None;
      attr.event_mask = ButtonPressMask|ButtonReleaseMask|ButtonMotionMask;

      XSync(wm->xdpy, False);
      mb_wm_util_trap_x_errors();

      decor->xwin
	= XCreateWindow(wm->xdpy,
			wm->root_win->xwindow,
			decor->geom.x,
			decor->geom.y,
			decor->geom.width,
			decor->geom.height,
			0,
			CopyFromParent,
			CopyFromParent,
			CopyFromParent,
			CWOverrideRedirect/*|CWBackPixel*/|CWEventMask,
			&attr);
      mb_wm_rename_window (wm, decor->xwin, "decor");

      MBWM_DBG("g is +%i+%i %ix%i",
	       decor->geom.x,
	       decor->geom.y,
	       decor->geom.width,
	       decor->geom.height);

      if (mb_wm_util_untrap_x_errors())
	return False;

      mb_wm_decor_resize(decor);

      mb_wm_util_list_foreach(decor->buttons,
		            (MBWMListForEachCB)mb_wm_decor_button_sync_window,
			    NULL);

      /*
       * If this is a decor with buttons, then we install button press handler
       * so we can drag the window, if it is movable.
       */
      if (decor->type == MBWMDecorTypeNorth &&
	  decor->parent_client->layout_hints & LayoutPrefMovable)
	{
                /*
          g_debug ("%s: add ButtonPress handler for %lx", __FUNCTION__,
                   decor->xwin);
                   */
	  decor->press_cb_id =
	    mb_wm_main_context_x_event_handler_add (wm->main_ctx,
			        decor->xwin,
			        ButtonPress,
			        (MBWMXEventFunc)mb_wm_decor_press_handler,
			        decor);
	}

      return mb_wm_decor_reparent (decor);
    }
  else
    {
      /* Resize */
      mb_wm_util_async_trap_x_errors_warn(wm->xdpy, "XMoveResizeWindow");

      XMoveResizeWindow(wm->xdpy,
			decor->xwin,
			decor->geom.x,
			decor->geom.y,
			decor->geom.width,
			decor->geom.height);

      mb_wm_util_async_untrap_x_errors();

      /* Next up sort buttons */
      mb_wm_util_list_foreach(decor->buttons,
			      (MBWMListForEachCB)mb_wm_decor_button_sync_window,
			      NULL);
    }

  return True;
}