LINUX.ORG.RU

Сообщения signijalv52

 

dbus cессионная шина другого пользователя

Как послать сообщение на чужую (активную) cессионную шину dbus? В моём случае приложение от суперпользователя желает послать сообщение обычному пользователю.

слушаю шину:dbus-monitor --session type='signal',interface='andromeda.listener'
посылка:dbus-send --session --type=signal / andromeda.listener.test

sudo -u user <посылка> не помогает
замена --session на --address=<значение переменной из /home/user/.dbus/session-bus/*-0> результатов тоже не даёт

Как временное решение, использую ssh user@localhost <посылка>

 

signijalv52
()

gtk_label_select_region

Как правильно использовать функцию gtk_label_select_region? Нужно выделить насколько символов (ну или снять выделение) в «выделяемой» GtkLabel. В моём случае при любых параметрах всегда выделяется весь текст. Пример кода:

//gcc -Wall -o gtk.run gtk.c `pkg-config --cflags --libs gtk+-3.0`

#include <gtk/gtk.h>

static void activate (GtkApplication *app, gpointer user_data)
{
  GtkWidget *window;
  GtkWidget *label;


  window = gtk_application_window_new (app);
  label = gtk_label_new("012345678901234567890123456789");
  gtk_label_set_selectable(GTK_LABEL(label), TRUE);
  gtk_container_add (GTK_CONTAINER (window), label);

  gtk_label_select_region(GTK_LABEL(label), 2, 4);

  gtk_widget_show_all (window);
}



int main (int argc, char **argv)
{
  GtkApplication *app;
  int status;

  app = gtk_application_new ("org.gtk.example", G_APPLICATION_FLAGS_NONE);
  g_signal_connect (app, "activate", G_CALLBACK (activate), NULL);
  status = g_application_run (G_APPLICATION (app), argc, argv);
  g_object_unref (app);

  return status;
}

 ,

signijalv52
()

dbus_bus_add_match на сервере

Пишу сервер, который работает с dbus. У меня задача принять запрос на выполнение определённого метода из dbus. С обработкой и ответом проблем не возникает. Проблема с приёмом. Урезанный код сервера:

//gcc -Wall -o server.run server-lor.c `pkg-config --cflags --libs dbus-1`

#include <dbus/dbus.h>
#include <unistd.h>
#include <stdio.h>


int main()
{
  DBusMessage* msg;
  DBusConnection* conn;
  DBusError err;

  dbus_error_init(&err);
  conn = dbus_bus_get(DBUS_BUS_SESSION, &err);
  dbus_bus_request_name(conn, "andromeda.server", DBUS_NAME_FLAG_REPLACE_EXISTING , &err);
  dbus_bus_add_match(conn, "type='method_call',interface='andromeda.listener',member='method',path='/andromeda/methods',destination='andromeda.server'", NULL);
  dbus_connection_flush(conn);

  while (dbus_connection_read_write(conn, 0))
  {
    msg = dbus_connection_pop_message(conn);
    if (NULL == msg)
    {
      sleep(1);
      continue;
    }
    printf("got message\n");
    dbus_message_unref(msg);
    //break;
  }
  dbus_connection_unref(conn);
  return 0;
}
в качестве клиента использую:
dbus-send --session --type=method_call --dest=andromeda.server /andromeda/methods andromeda.listener.method
Проблема в том, что сервер принимает любые значения OBJECT_PATH и INTERFACE.MEMBER Видимо, проблема в использовании dbus_bus_add_match

 ,

signijalv52
()

RSS подписка на новые темы