Example #1
0
/**
 * Process an Introspect D-Bus request.
 */
static bool
cdbus_process_introspect(session_t *ps, DBusMessage *msg) {
  const static char *str_introspect =
    "<!DOCTYPE node PUBLIC \"-//freedesktop//DTD D-BUS Object Introspection 1.0//EN\"\n"
    " \"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd\">\n"
    "<node name='" CDBUS_OBJECT_NAME "'>\n"
    "  <interface name='org.freedesktop.DBus.Introspectable'>\n"
    "    <method name='Introspect'>\n"
    "      <arg name='data' direction='out' type='s' />\n"
    "    </method>\n"
    "  </interface>\n"
    "  <interface name='" CDBUS_INTERFACE_NAME "'>\n"
    "    <signal name='win_added'>\n"
    "      <arg name='wid' type='" CDBUS_TYPE_WINDOW_STR "'/>\n"
    "    </signal>\n"
    "    <signal name='win_destroyed'>\n"
    "      <arg name='wid' type='" CDBUS_TYPE_WINDOW_STR "'/>\n"
    "    </signal>\n"
    "    <signal name='win_mapped'>\n"
    "      <arg name='wid' type='" CDBUS_TYPE_WINDOW_STR "'/>\n"
    "    </signal>\n"
    "    <signal name='win_unmapped'>\n"
    "      <arg name='wid' type='" CDBUS_TYPE_WINDOW_STR "'/>\n"
    "    </signal>\n"
    "    <method name='reset' />\n"
    "  </interface>\n"
    "</node>\n";

  cdbus_reply_string(ps, msg, str_introspect);

  return true;
}
Example #2
0
/**
 * Process a opts_get D-Bus request.
 */
static bool
cdbus_process_opts_get(session_t *ps, DBusMessage *msg) {
  const char *target = NULL;

  if (!cdbus_msg_get_arg(msg, 0, DBUS_TYPE_STRING, &target))
    return false;

#define cdbus_m_opts_get_do(tgt, apdarg_func) \
  if (!strcmp(MSTR(tgt), target)) { \
    apdarg_func(ps, msg, ps->o.tgt); \
    return true; \
  }

  // display
  if (!strcmp("display", target)) {
    cdbus_reply_string(ps, msg, DisplayString(ps->dpy));
    return true;
  }

  cdbus_m_opts_get_do(config_file, cdbus_reply_string);
  cdbus_m_opts_get_do(mark_wmwin_focused, cdbus_reply_bool);
  cdbus_m_opts_get_do(mark_ovredir_focused, cdbus_reply_bool);
  cdbus_m_opts_get_do(fork_after_register, cdbus_reply_bool);
  cdbus_m_opts_get_do(detect_rounded_corners, cdbus_reply_bool);
  cdbus_m_opts_get_do(paint_on_overlay, cdbus_reply_bool);
  cdbus_m_opts_get_do(unredir_if_possible, cdbus_reply_bool);
  cdbus_m_opts_get_do(logpath, cdbus_reply_string);
  cdbus_m_opts_get_do(synchronize, cdbus_reply_bool);

  cdbus_m_opts_get_do(refresh_rate, cdbus_reply_int32);
  cdbus_m_opts_get_do(sw_opti, cdbus_reply_bool);
  if (!strcmp("vsync", target)) {
    assert(ps->o.vsync < sizeof(VSYNC_STRS) / sizeof(VSYNC_STRS[0]));
    cdbus_reply_string(ps, msg, VSYNC_STRS[ps->o.vsync]);
    return true;
  }
  if (!strcmp("backend", target)) {
    assert(ps->o.backend < sizeof(BACKEND_STRS) / sizeof(BACKEND_STRS[0]));
    cdbus_reply_string(ps, msg, BACKEND_STRS[ps->o.backend]);
    return true;
  }
  cdbus_m_opts_get_do(dbe, cdbus_reply_bool);
  cdbus_m_opts_get_do(vsync_aggressive, cdbus_reply_bool);

  cdbus_m_opts_get_do(blur_background, cdbus_reply_bool);
  cdbus_m_opts_get_do(blur_background_frame, cdbus_reply_bool);
  cdbus_m_opts_get_do(blur_background_fixed, cdbus_reply_bool);

  cdbus_m_opts_get_do(inactive_dim, cdbus_reply_double);
  cdbus_m_opts_get_do(inactive_dim_fixed, cdbus_reply_bool);

  cdbus_m_opts_get_do(use_ewmh_active_win, cdbus_reply_bool);
  cdbus_m_opts_get_do(detect_transient, cdbus_reply_bool);
  cdbus_m_opts_get_do(detect_client_leader, cdbus_reply_bool);

#ifdef CONFIG_VSYNC_OPENGL
  cdbus_m_opts_get_do(glx_no_stencil, cdbus_reply_bool);
  cdbus_m_opts_get_do(glx_copy_from_front, cdbus_reply_bool);
  cdbus_m_opts_get_do(glx_use_copysubbuffermesa, cdbus_reply_bool);
  cdbus_m_opts_get_do(glx_no_rebind_pixmap, cdbus_reply_bool);
  cdbus_m_opts_get_do(glx_swap_method, cdbus_reply_int32);
#endif

  cdbus_m_opts_get_do(track_focus, cdbus_reply_bool);
  cdbus_m_opts_get_do(track_wdata, cdbus_reply_bool);
  cdbus_m_opts_get_do(track_leader, cdbus_reply_bool);
#undef cdbus_m_opts_get_do

  printf_errf("(): " CDBUS_ERROR_BADTGT_S, target);
  cdbus_reply_err(ps, msg, CDBUS_ERROR_BADTGT, CDBUS_ERROR_BADTGT_S, target);

  return true;
}
Example #3
0
/**
 * Process a message from D-Bus.
 */
static void
cdbus_process(session_t *ps, DBusMessage *msg) {
  bool success = false;

#define cdbus_m_ismethod(method) \
  dbus_message_is_method_call(msg, CDBUS_INTERFACE_NAME, method)

  if (cdbus_m_ismethod("reset")) {
    ps->reset = true;
    if (!dbus_message_get_no_reply(msg))
      cdbus_reply_bool(ps, msg, true);
    success = true;
  }
  else if (cdbus_m_ismethod("repaint")) {
    force_repaint(ps);
    if (!dbus_message_get_no_reply(msg))
      cdbus_reply_bool(ps, msg, true);
    success = true;
  }
  else if (cdbus_m_ismethod("list_win")) {
    success = cdbus_process_list_win(ps, msg);
  }
  else if (cdbus_m_ismethod("win_get")) {
    success = cdbus_process_win_get(ps, msg);
  }
  else if (cdbus_m_ismethod("win_set")) {
    success = cdbus_process_win_set(ps, msg);
  }
  else if (cdbus_m_ismethod("find_win")) {
    success = cdbus_process_find_win(ps, msg);
  }
  else if (cdbus_m_ismethod("opts_get")) {
    success = cdbus_process_opts_get(ps, msg);
  }
  else if (cdbus_m_ismethod("opts_set")) {
    success = cdbus_process_opts_set(ps, msg);
  }
#undef cdbus_m_ismethod
  else if (dbus_message_is_method_call(msg,
        "org.freedesktop.DBus.Introspectable", "Introspect")) {
    success = cdbus_process_introspect(ps, msg);
  }
  else if (dbus_message_is_method_call(msg,
        "org.freedesktop.DBus.Peer", "Ping")) {
    cdbus_reply(ps, msg, NULL, NULL);
    success = true;
  }
  else if (dbus_message_is_method_call(msg,
        "org.freedesktop.DBus.Peer", "GetMachineId")) {
    char *uuid = dbus_get_local_machine_id();
    if (uuid) {
      cdbus_reply_string(ps, msg, uuid);
      dbus_free(uuid);
      success = true;
    }
  }
  else if (dbus_message_is_signal(msg, "org.freedesktop.DBus", "NameAcquired")
      || dbus_message_is_signal(msg, "org.freedesktop.DBus", "NameLost")) {
    success = true;
  }
  else {
    if (DBUS_MESSAGE_TYPE_ERROR == dbus_message_get_type(msg)) {
      printf_errf("(): Error message of path \"%s\" "
          "interface \"%s\", member \"%s\", error \"%s\"",
          dbus_message_get_path(msg), dbus_message_get_interface(msg),
          dbus_message_get_member(msg), dbus_message_get_error_name(msg));
    }
    else {
      printf_errf("(): Illegal message of type \"%s\", path \"%s\" "
          "interface \"%s\", member \"%s\"",
          cdbus_repr_msgtype(msg), dbus_message_get_path(msg),
          dbus_message_get_interface(msg), dbus_message_get_member(msg));
    }
    if (DBUS_MESSAGE_TYPE_METHOD_CALL == dbus_message_get_type(msg)
        && !dbus_message_get_no_reply(msg))
      cdbus_reply_err(ps, msg, CDBUS_ERROR_BADMSG, CDBUS_ERROR_BADMSG_S);
    success = true;
  }

  // If the message could not be processed, and an reply is expected, return
  // an empty reply.
  if (!success && DBUS_MESSAGE_TYPE_METHOD_CALL == dbus_message_get_type(msg)
      && !dbus_message_get_no_reply(msg))
    cdbus_reply_err(ps, msg, CDBUS_ERROR_UNKNOWN, CDBUS_ERROR_UNKNOWN_S);

  // Free the message
  dbus_message_unref(msg);
}
Example #4
0
/**
 * Process a opts_get D-Bus request.
 */
static bool
cdbus_process_opts_get(session_t *ps, DBusMessage *msg) {
  const char *target = NULL;

  if (!cdbus_msg_get_arg(msg, 0, DBUS_TYPE_STRING, &target))
    return false;

#define cdbus_m_opts_get_do(tgt, apdarg_func) \
  if (!strcmp(MSTR(tgt), target)) { \
    apdarg_func(ps, msg, ps->o.tgt); \
    return true; \
  }

  // display
  if (!strcmp("display", target)) {
    cdbus_reply_string(ps, msg, DisplayString(ps->dpy));
    return true;
  }

  cdbus_m_opts_get_do(config_file, cdbus_reply_string);
  cdbus_m_opts_get_do(mark_wmwin_focused, cdbus_reply_bool);
  cdbus_m_opts_get_do(mark_ovredir_focused, cdbus_reply_bool);
  cdbus_m_opts_get_do(fork_after_register, cdbus_reply_bool);
  cdbus_m_opts_get_do(detect_rounded_corners, cdbus_reply_bool);
  cdbus_m_opts_get_do(paint_on_overlay, cdbus_reply_bool);
  cdbus_m_opts_get_do(unredir_if_possible, cdbus_reply_bool);
  cdbus_m_opts_get_do(logpath, cdbus_reply_string);
  cdbus_m_opts_get_do(synchronize, cdbus_reply_bool);

  cdbus_m_opts_get_do(refresh_rate, cdbus_reply_int32);
  cdbus_m_opts_get_do(sw_opti, cdbus_reply_bool);
  if (!strcmp("vsync", target)) {
    assert(ps->o.vsync < sizeof(VSYNC_STRS) / sizeof(VSYNC_STRS[0]));
    cdbus_reply_string(ps, msg, VSYNC_STRS[ps->o.vsync]);
    return true;
  }
  cdbus_m_opts_get_do(dbe, cdbus_reply_bool);
  cdbus_m_opts_get_do(vsync_aggressive, cdbus_reply_bool);

  cdbus_m_opts_get_do(shadow_red, cdbus_reply_double);
  cdbus_m_opts_get_do(shadow_green, cdbus_reply_double);
  cdbus_m_opts_get_do(shadow_blue, cdbus_reply_double);
  cdbus_m_opts_get_do(shadow_radius, cdbus_reply_int32);
  cdbus_m_opts_get_do(shadow_offset_x, cdbus_reply_int32);
  cdbus_m_opts_get_do(shadow_offset_y, cdbus_reply_int32);
  cdbus_m_opts_get_do(shadow_opacity, cdbus_reply_double);
  cdbus_m_opts_get_do(clear_shadow, cdbus_reply_bool);

  cdbus_m_opts_get_do(blur_background, cdbus_reply_bool);
  cdbus_m_opts_get_do(blur_background_frame, cdbus_reply_bool);
  cdbus_m_opts_get_do(blur_background_fixed, cdbus_reply_bool);

  cdbus_m_opts_get_do(inactive_dim, cdbus_reply_double);
  cdbus_m_opts_get_do(inactive_dim_fixed, cdbus_reply_bool);

  cdbus_m_opts_get_do(use_ewmh_active_win, cdbus_reply_bool);
  cdbus_m_opts_get_do(detect_transient, cdbus_reply_bool);
  cdbus_m_opts_get_do(detect_client_leader, cdbus_reply_bool);

  cdbus_m_opts_get_do(track_focus, cdbus_reply_bool);
  cdbus_m_opts_get_do(track_wdata, cdbus_reply_bool);
  cdbus_m_opts_get_do(track_leader, cdbus_reply_bool);
#undef cdbus_m_opts_get_do

  printf_errf("(): " CDBUS_ERROR_BADTGT_S, target);
  cdbus_reply_err(ps, msg, CDBUS_ERROR_BADTGT, CDBUS_ERROR_BADTGT_S, target);

  return true;
}