![]() |
2010-11-25
, 10:07
|
Posts: 2,006 |
Thanked: 3,351 times |
Joined on Jun 2010
@ N900: Battery low. N950: torx 4 re-used once and fine; SIM port torn apart
|
#11
|
![]() |
2010-11-25
, 10:55
|
Posts: 256 |
Thanked: 92 times |
Joined on Oct 2010
|
#12
|
I don't want to replicate the behaviour, but it would indeed be nice to know how the personalisation_app is doing the things.
I already tried scanning the DBus and there's no (extra) activity there.
The Following User Says Thank You to lunat For This Useful Post: | ||
![]() |
2010-11-25
, 13:16
|
|
Posts: 2,154 |
Thanked: 2,186 times |
Joined on Dec 2009
@ Hellsinki, Finland
|
#13
|
What does the hildon-desktop theme option do?
hildon-desktop -theme theme : Load the specified theme
![]() |
2010-11-25
, 13:31
|
|
Posts: 1,637 |
Thanked: 4,424 times |
Joined on Apr 2009
@ Germany
|
#14
|
At least for me the following behaviour is reproducable:
- open some Qt application which has at least one QComboBox or some menus on top bar to tap to
-run "killall hildon-desktop" or "dsmetool -k /usr/bin/hildon-desktop; dsmetool -t -U user /usr/bin/hildon-desktop"
- change theme with hildon buildin theme chooser
![]() |
2010-11-25
, 16:24
|
|
Posts: 2,154 |
Thanked: 2,186 times |
Joined on Dec 2009
@ Hellsinki, Finland
|
#15
|
Hi D-Iivil,
why do you think the personalisation_app can do something that
your app cannot?
I mean, if you do
is the behavior differently?
Nicolai
The Following User Says Thank You to d-iivil For This Useful Post: | ||
![]() |
2010-11-26
, 11:05
|
Posts: 235 |
Thanked: 339 times |
Joined on Nov 2010
|
#16
|
The Following User Says Thank You to jstokes For This Useful Post: | ||
![]() |
2010-11-27
, 18:48
|
|
Posts: 2,154 |
Thanked: 2,186 times |
Joined on Dec 2009
@ Hellsinki, Finland
|
#17
|
Why not just reapply the theme? personalisation_app also comes with a command line counterpart. Otherwise, just read the source of any GTK+ theme switching app: Considering you're dealing with windows, it's unlikely D-Bus will play a part, look at X's Atoms, Properties and stuff. Perhaps http://code.google.com/p/gtk-theme-s...rc/utils.c#160 may be enough
![]() |
2011-03-16
, 15:40
|
|
Posts: 1,637 |
Thanked: 4,424 times |
Joined on Apr 2009
@ Germany
|
#18
|
I'd be very very intrested in those personalisation_app's command line options. Do you have more info about those? I've tried to offer it many kinds of switches with no response at all (well, best I've got is segfault :P).
Edit: forgot to mention that I've already tried to compile some standard gtk-theme-switchers with success, but unfortunately none of those will actually change anything. I guess it needs some hildon specific stuff which I don't have a glue
The Following User Says Thank You to nicolai For This Useful Post: | ||
![]() |
2011-03-16
, 15:48
|
Posts: 1,397 |
Thanked: 2,126 times |
Joined on Nov 2009
@ Dublin, Ireland
|
#19
|
![]() |
2011-04-18
, 18:23
|
Posts: 235 |
Thanked: 339 times |
Joined on Nov 2010
|
#20
|
#include <stdlib.h>
#include <string.h>
#include <libgen.h>
#include <X11/Xatom.h>
#include <gdk/gdkx.h>
#include <gtk/gtk.h>
struct _theme_info
{
gchar *base_path;
gchar *theme_name;
};
static gboolean current_theme_info (struct _theme_info *theme_info)
{
#define THEME_DIR "/etc/hildon/theme"
#define INDEX_THEME_FILE G_DIR_SEPARATOR_S "index.theme"
#define STD_INDEX_LOC THEME_DIR INDEX_THEME_FILE
gboolean retval = FALSE;
gchar *linkdest1 = NULL, *linkdest2 = NULL;
GKeyFile *theme_key = g_key_file_new();
if ((!g_file_test (STD_INDEX_LOC, G_FILE_TEST_EXISTS)) || (!g_key_file_load_from_file (theme_key, STD_INDEX_LOC, G_KEY_FILE_NONE, NULL)) || !(theme_info->theme_name = g_key_file_get_string (theme_key, "Desktop Entry", "Name", NULL)))
goto getout;
linkdest1 = g_file_read_link (THEME_DIR, NULL);
if (!linkdest1) goto getout;
linkdest2 = g_file_read_link (linkdest1, NULL); /* Is it a folder that's symlinked to another, like: default->alpha? */
theme_info->base_path = g_path_get_basename (linkdest2 ? linkdest2 : linkdest1);
retval = theme_info->base_path != NULL;
getout:
g_free (linkdest2);
g_free (linkdest1);
g_key_file_free (theme_key);
return retval;
#undef STD_INDEX_LOC
#undef INDEX_THEME_FILE
#undef THEME_DIR
}
static gboolean update_symbolic_link (const gchar *newtheme)
{
gboolean retval = FALSE;
if (newtheme)
{
gint exit_status;
gchar *cmdline;
cmdline = g_strdup_printf ("%s %s/%s", "/usr/bin/personalisation", "/usr/share/themes", newtheme);
retval = g_spawn_command_line_sync (cmdline, NULL, NULL, &exit_status, NULL) || exit_status != 0;
g_free (cmdline);
}
return retval;
}
static void send_refresh_signal (void)
{
GdkEventClient event;
event.type = GDK_CLIENT_EVENT;
event.send_event = TRUE;
event.window = NULL;
event.message_type = gdk_atom_intern ("_GTK_READ_RCFILES", FALSE);
event.data_format = 8;
gdk_event_send_clientmessage_toall ((GdkEvent *) &event);
}
static void refresh_matchbox (const gchar *base_path)
{
Display *disp = XOpenDisplay (getenv ("DISPLAY"));
Atom _MB_THEME = XInternAtom (disp, "_MB_THEME", False);
if (_MB_THEME != None)
{
Window root = DefaultRootWindow(disp);
XChangeProperty (disp, root, _MB_THEME, XA_STRING, 8, PropModeReplace, (unsigned char*) base_path, strlen (base_path));
Atom _MB_COMMAND = XInternAtom (disp, "_MB_COMMAND", False);
if (_MB_COMMAND != None)
{
XEvent ev = { '\0', };
ev.xclient.type = ClientMessage;
ev.xclient.window = root;
ev.xclient.message_type = _MB_COMMAND;
ev.xclient.format = 8;
ev.xclient.data.l[0] = 1;
XSendEvent(disp, root, False, SubstructureRedirectMask|SubstructureNotifyMask, &ev);
}
XSync (disp, True);
}
XCloseDisplay (disp);
}
int main (int argc, char *argv[])
{
struct _theme_info theme_info;
gtk_init (&argc, &argv);
g_assert (current_theme_info(&theme_info));
if (!update_symbolic_link (theme_info.base_path))
return 1; /* Fails in my SB - "invalid cross-device link */
GtkSettings *settings = gtk_settings_get_default();
gtk_settings_set_string_property (settings, "gtk-theme-name", theme_info.theme_name, basename(argv[0]));
//g_object_notify (G_OBJECT (settings), "gtk-theme-name");
gtk_rc_reset_styles (settings);
send_refresh_signal();
gchar *maemo_launcher_pid_s;
if (g_file_get_contents ("/tmp/maemo-launcher.pid", &maemo_launcher_pid_s, NULL, NULL))
{
pid_t maemo_launcher_pid = (pid_t) atoi (maemo_launcher_pid_s);
if (maemo_launcher_pid > 0) kill (maemo_launcher_pid, SIGHUP);
g_free (maemo_launcher_pid_s);
}
refresh_matchbox (theme_info.base_path);
g_free (theme_info.base_path);
g_free (theme_info.theme_name);
return 0;
}
The Following 2 Users Say Thank You to jstokes For This Useful Post: | ||