Unity: Integration in den Launcher

Antworten
meister0815
Beiträge: 43
Registriert: Sa 26. Jun 2010, 17:10

Unity: Integration in den Launcher

Beitrag von meister0815 »

Hallo zusammen,

weiß schon jemand, wie man die Integration in das Launcher-Dock programmiert? Mich interessieren besonders:

  • Wie kann ich die "Zahlen-Blasen" zeichnen? (Wie Liferea oder Evolution zur Angabe der ungelesenen Elemente haben)
  • Wie kann ich Einträge ins Rechts-Klick-Menü erstellen?
  • Wie löse ich einen "Urgent"-Event aus, damit das Icon wackelt?
Bin für jeden Hinweis dankbar. Dankeschön!

Viele Grüße, Meister0815

PS: Habe gerade noch ein C-Programm gefunden, dass die Zahlen-Blasen zeichnen kann. Leider kann ich kein C und es deshalb nicht für Lazarus verwenden. Vielleicht kann mir jemand helfen? Das Programm geht so:

Code: Alles auswählen

/*
    Copyright (C) 2011 jeanfi@gmail.com
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301 USA
*/

 
#include "config.h"
 
#include <getopt.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
 
#include <locale.h>
#include <glib/gi18n.h>
 
#include <unity.h>
#include <gtk/gtk.h>
#include <dbus/dbus-glib.h>
 
#define LIFEREA_BUS  "org.gnome.feed.Reader"
#define READER_PATH  "/org/gnome/feed/Reader"
#define READER_IFACE  "org.gnome.feed.Reader"
 
static const char *program_name;
static UnityLauncherEntry *entry;
 
void print_version()
{
   printf("liferea-unity-count %s\n", VERSION);
   printf(_("Copyright (C) %s jeanfi@gmail.com\n\
License GPLv2: GNU GPL version 2 or later \
<http://www.gnu.org/licenses/old-licenses/gpl-2.0.html>\n\
This is free software: you are free to change and redistribute it.\n\
There is NO WARRANTY, to the extent permitted by law.\n"
),
          "2010-2011");
}
 
void print_help()
{
   printf(_("Usage: %s [OPTION]...\n"), program_name);
 
   puts(_("liferea-unity-count is a daemon which displays the number "
          "of unread items of Liferea in its Unity Launcher entry."));
 
   puts("");
   puts("Options:");
   puts(_("\
  -h, --help          display this help and exit\n\
  -v, --version       display version information and exit"
));
 
   puts("");
 
   printf(_("Report bugs to: %s\n"), PACKAGE_BUGREPORT);
   puts("");
   printf(_("%s home page: <%s>\n"), PACKAGE_NAME, PACKAGE_URL);
}
 
 
void update_launcher_entry(int count)
{
   if (!entry) {
      entry = unity_launcher_entry_get_for_desktop_file
         ("liferea.desktop");
 
      if (!entry)
         return ;
 
      unity_launcher_entry_set_count_visible(entry, TRUE);
   }
 
   unity_launcher_entry_set_count(entry, count);
 
   g_main_context_iteration(NULL, FALSE);
}
 
int
get_unread_items_count(DBusGProxy *proxy, int *count)
{
   GError *error = NULL;
 
   if (!dbus_g_proxy_call(proxy, "GetUnreadItems", &error,
                G_TYPE_INVALID,
                G_TYPE_INT, count,
                G_TYPE_INVALID)) {
      if (error->domain == DBUS_GERROR &&
          error->code == DBUS_GERROR_REMOTE_EXCEPTION) {
 
         g_printerr(_("Caught remote method exception %s: %s"),
               dbus_g_error_get_name(error),
               error->message);
      } else {
         g_printerr(_("Error: %s\n"), error->message);
      }
 
      g_error_free(error);
 
      return 0;
   }
 
   return 1;
}
 
static struct option long_options[] = {
   {"version", no_argument, 0, 'v'},
   {"help", no_argument, 0, 'h'},
   {0, 0, 0, 0}
};
 
int
main(int argc, char **argv)
{
   DBusGConnection *connection;
   DBusGProxy *proxy;
   GError *error;
   int count;
   int optc, cmdok;
 
   program_name = argv[0];
 
   setlocale(LC_ALL, "");
 
#if ENABLE_NLS
   bindtextdomain(PACKAGE, LOCALEDIR);
   textdomain(PACKAGE);
#endif
 
   cmdok = 1;
   while ((optc = getopt_long(argc, argv, "vh", long_options,
               NULL)) != -1) {
      switch (optc) {
      case 'h':
         print_help();
         exit(EXIT_SUCCESS);
      case 'v':
         print_version();
         exit(EXIT_SUCCESS);
      default:
         cmdok = 0;
         break;
      }
   }
 
   if (!cmdok || optind != argc) {
      fprintf(stderr, _("Try `%s --help' for more information.\n"),
         program_name);
      exit(EXIT_FAILURE);
   }
 
   g_type_init();
 
   error = NULL;
   connection = dbus_g_bus_get(DBUS_BUS_SESSION,
                &error);
   if (!connection) {
      g_printerr(_("Failed to open connection to bus: %s\n"),
            error->message);
      g_error_free(error);
      exit(EXIT_FAILURE);
   }
 
   proxy = dbus_g_proxy_new_for_name(connection,
                 LIFEREA_BUS,
                 READER_PATH,
                 READER_IFACE);
 
 
   while (1) {
 
      if (get_unread_items_count(proxy, &count))
         update_launcher_entry(count);
 
      sleep(10);
   }
   g_object_unref(proxy);
}

von: https://launchpad.net/~jfi/+archive/liferea-unity-count

Targion
Beiträge: 688
Registriert: Mi 3. Okt 2007, 21:00
OS, Lazarus, FPC: Linux (L 0.9.29 FPC 2.4.2)
CPU-Target: x86_64

Re: Unity: Integration in den Launcher

Beitrag von Targion »

Warte mal ein wenig ^^ Das Beispiel benutzt GDBus, für welches es leider keine Bindings für Pascal gibt (du könntest theoretisch aber meine SimDBus unit verwenden...) Aus sicherer Quelle weiß ich aber, das grade jemand an DBus für Pascal arbeitet. Wenn diese Arbeit fertig ist, bekommst du über die Interfaces aus dem C-Quelltext die Benachrichtigungen relativ einfach.
Wenn GIR für Pascal noch was wird, wir die Situation für Pascal-Programmierer sowieso sofort traumhaft - damit bekommen wir Sprachbindungen für Pascal für fast jede Bibliothek, welche GObject verwendet. (Und das ist fast der gesamte non-GUI Kram und alles GNOME-Bezogene unter Linux)

carli
Beiträge: 657
Registriert: Sa 9. Jan 2010, 17:32
OS, Lazarus, FPC: Linux 2.6.x, SVN-Lazarus, FPC 2.4.0-2
CPU-Target: 64Bit

Re: Unity: Integration in den Launcher

Beitrag von carli »

Targion hat geschrieben:damit bekommen wir Sprachbindungen für Pascal für fast jede Bibliothek, welche GObject verwendet. (Und das ist fast der gesamte non-GUI Kram und alles GNOME-Bezogene unter Linux)


*träum*

meister0815
Beiträge: 43
Registriert: Sa 26. Jun 2010, 17:10

Re: Unity: Integration in den Launcher

Beitrag von meister0815 »

Targion hat geschrieben:[...] Wenn diese Arbeit fertig ist, bekommst du über die Interfaces aus dem C-Quelltext die Benachrichtigungen relativ einfach.
Wenn GIR für Pascal noch was wird, wir die Situation für Pascal-Programmierer sowieso sofort traumhaft [...]


Danke für die Erklärungen!! Hast Du vielleicht auch Links, wo ich die Entwicklung über DBUS und GIR für Pascal verfolgen kann? Möchte ja nicht verpassen, wenn etwas dementsprechendes rauskommt.... :)

PS: Wo finde ich denn deine SimDBUS?

Targion
Beiträge: 688
Registriert: Mi 3. Okt 2007, 21:00
OS, Lazarus, FPC: Linux (L 0.9.29 FPC 2.4.2)
CPU-Target: x86_64

Re: Unity: Integration in den Launcher

Beitrag von Targion »

Eine feste Roadmap für DBus und Pascal gibt es nicht, das Ganze war Thema auf der FPC-Mailingliste, daher weiß ich auch, dass aktiv daran gearbeitet wird. - Einfach mal das FPC-Repo im Blick behalten. And GI arbeitet meines Wissens grade keiner, es gab aber mal versuche von früherer Zeit. Ich bin mir aber sicher, dass das FPC-Team bald GI anstatt der manuellen Erstellung von GTK3/GLib-Bindings einsetzen wird, alles andere würde wenig Sinn ergeben.
Meine SimDBus benutzt das API der libdbus direkt und macht nur den Zugriff ein ganz klein wenig leichter. Die Unit wurde damals für das Listaller Projekt geschrieben, welches inzwischen aber Vala anstatt Pascal verwendet. Die SimDBus Unit kann man aber noch aus dem VCS holen: http://gitorious.org/listaller/listalle ... imdbus.pas

meister0815
Beiträge: 43
Registriert: Sa 26. Jun 2010, 17:10

Re: Unity: Integration in den Launcher

Beitrag von meister0815 »

Mh, ich hab mir die Unit mal angeschaut, aber es klingt für mich sehr kompliziert.

Wäre es nicht möglich, einfach über das Linux-Tool "dbus-send" einen entsprechenden Befehl weiterzugeben? Ich brauche es ja nur in die eine Richtung...

Edit:
Hier hab ich die DBUS Unity-Launcher-API gefunden: https://wiki.edubuntu.org/Unity/Launche ... ncherEntry

Leider weiß ich nicht, wie ich daraus einen dbus-send Befehl aufbauen kann. :(

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Re: Unity: Integration in den Launcher

Beitrag von Christian »

hat das jemand hinbekommen?
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

Soner
Beiträge: 623
Registriert: Do 27. Sep 2012, 00:07
OS, Lazarus, FPC: Win10Pro-64Bit, Immer letzte Lazarus Release mit SVN-Fixes
CPU-Target: x86_64-win64
Wohnort: Hamburg

Re: Unity: Integration in den Launcher

Beitrag von Soner »

Um obere Bespiel zu benutzen muß man nicht ganze dbus usw. Header zu Pascal übersetzen. Es reicht nur die Funktionen die benötigt werden zu übersetzen. So mache ich es auch immer.

Und zum GIR und GTK3. Es gibt schon gtk3-Units die mit gir2pascal übersetzt worden sind. Ich habe einige Beispiele für gtk3 sowohl mit Xubuntu 12.04 als auch mit 12.10 erfolgreich kompiliert.
HIer ist GKT3 Pascal units: http://wiki.freepascal.org/Gtk%2B3
Hier ist gir2pascal: http://wiki.freepascal.org/gir2pascal

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Unity: Integration in den Launcher

Beitrag von mschnell »

Targion hat geschrieben:Wenn GIR für Pascal noch was wird, ...


Was ist "GIR" (im Vergleich zu "Custom Drawn", an dem momentan ja gearbeitet wird) ?

-Michael

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Re: Unity: Integration in den Launcher

Beitrag von Christian »

Das example verwendet ja die unity header, gibts dafür denn son gir file ?
wo findet man diese files generell?
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Re: Unity: Integration in den Launcher

Beitrag von Christian »

Ok, es gibt tatsächlich ein Package libunity9 das die /usr/share/gir-1.0/Unity-5.0.gir enthält.
Nun finde ich aber kein paket das Gio-2.0.gir enthält, die als Abhängigkeit verlangt wird.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

Antworten