Kickoff menu: Allow suspend features using native dbus library

pull/2/head
Francois Andriot 11 years ago committed by Slávek Banko
parent 229d1bcf9b
commit bbdb95ed64

@ -17,6 +17,7 @@ include_directories(
${CMAKE_SOURCE_DIR}/kicker/kicker/core ${CMAKE_SOURCE_DIR}/kicker/kicker/core
${CMAKE_SOURCE_DIR}/kicker/kicker/ui ${CMAKE_SOURCE_DIR}/kicker/kicker/ui
${CMAKE_SOURCE_DIR}/libkonq ${CMAKE_SOURCE_DIR}/libkonq
${DBUS_TQT_INCLUDE_DIRS}
${TDE_INCLUDE_DIR} ${TDE_INCLUDE_DIR}
${TQT_INCLUDE_DIRS} ${TQT_INCLUDE_DIRS}
) )

@ -17,6 +17,7 @@ include_directories(
${CMAKE_SOURCE_DIR}/kicker/libkicker ${CMAKE_SOURCE_DIR}/kicker/libkicker
${CMAKE_SOURCE_DIR}/kicker/kicker/ui ${CMAKE_SOURCE_DIR}/kicker/kicker/ui
${CMAKE_SOURCE_DIR}/kicker/kicker/buttons ${CMAKE_SOURCE_DIR}/kicker/kicker/buttons
${DBUS_TQT_INCLUDE_DIRS}
${TDE_INCLUDE_DIR} ${TDE_INCLUDE_DIR}
${TQT_INCLUDE_DIRS} ${TQT_INCLUDE_DIRS}
) )

@ -12,6 +12,7 @@
include_directories( include_directories(
${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_BINARY_DIR}
${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}
${CMAKE_BINARY_DIR}
${CMAKE_BINARY_DIR}/kicker/kicker/core ${CMAKE_BINARY_DIR}/kicker/kicker/core
${CMAKE_BINARY_DIR}/kicker/libkicker ${CMAKE_BINARY_DIR}/kicker/libkicker
${CMAKE_SOURCE_DIR}/kicker/libkicker ${CMAKE_SOURCE_DIR}/kicker/libkicker
@ -19,6 +20,7 @@ include_directories(
${CMAKE_SOURCE_DIR}/kicker/kicker/buttons ${CMAKE_SOURCE_DIR}/kicker/kicker/buttons
${CMAKE_SOURCE_DIR}/tdmlib ${CMAKE_SOURCE_DIR}/tdmlib
${CMAKE_SOURCE_DIR}/libkonq ${CMAKE_SOURCE_DIR}/libkonq
${DBUS_TQT_INCLUDE_DIRS}
${TDE_INCLUDE_DIR} ${TDE_INCLUDE_DIR}
${TQT_INCLUDE_DIRS} ${TQT_INCLUDE_DIRS}
) )
@ -54,5 +56,5 @@ set( ${target}_SRCS
tde_add_library( ${target} STATIC_PIC AUTOMOC tde_add_library( ${target} STATIC_PIC AUTOMOC
SOURCES ${${target}_SRCS} SOURCES ${${target}_SRCS}
DEPENDENCIES kicker_core-static kickermain-static DEPENDENCIES kicker_core-static kickermain-static
LINK dmctl-static kickoffsearch_interfaces-shared LINK dmctl-static kickoffsearch_interfaces-shared ${DBUS_TQT_LIBRARIES} ${HAL_LIBRARIES}
) )

@ -101,6 +101,18 @@
#include "k_new_mnu.moc" #include "k_new_mnu.moc"
#include "kickoff_bar.h" #include "kickoff_bar.h"
#include "config.h"
#ifndef NO_QT3_DBUS_SUPPORT
/* We acknowledge the the dbus API is unstable */
#define DBUS_API_SUBJECT_TO_CHANGE
#include <dbus/connection.h>
#endif // NO_QT3_DBUS_SUPPORT
#ifdef COMPILE_HALBACKEND
#include <hal/libhal.h>
#endif
#define WAIT_BEFORE_QUERYING 700 #define WAIT_BEFORE_QUERYING 700
#define IDS_PER_CATEGORY 20 #define IDS_PER_CATEGORY 20
@ -415,6 +427,38 @@ KMenu::KMenu()
search_tab_top_left.load( locate("data", "kicker/pics/search-tab-top-left.png" ) ); search_tab_top_left.load( locate("data", "kicker/pics/search-tab-top-left.png" ) );
search_tab_top_right.load( locate("data", "kicker/pics/search-tab-top-right.png" ) ); search_tab_top_right.load( locate("data", "kicker/pics/search-tab-top-right.png" ) );
search_tab_top_center.load( locate("data", "kicker/pics/search-tab-top-center.png" ) ); search_tab_top_center.load( locate("data", "kicker/pics/search-tab-top-center.png" ) );
#ifdef COMPILE_HALBACKEND
m_halCtx = NULL;
m_halCtx = libhal_ctx_new();
DBusError error;
dbus_error_init(&error);
m_dbusConn = dbus_connection_open_private(DBUS_SYSTEM_BUS, &error);
if (!m_dbusConn) {
dbus_error_free(&error);
libhal_ctx_free(m_halCtx);
m_halCtx = NULL;
} else {
dbus_bus_register(m_dbusConn, &error);
if (dbus_error_is_set(&error)) {
dbus_error_free(&error);
libhal_ctx_free(m_halCtx);
m_dbusConn = NULL;
m_halCtx = NULL;
} else {
libhal_ctx_set_dbus_connection(m_halCtx, m_dbusConn);
if (!libhal_ctx_init(m_halCtx, &error)) {
if (dbus_error_is_set(&error)) {
dbus_error_free(&error);
}
libhal_ctx_free(m_halCtx);
m_dbusConn = NULL;
m_halCtx = NULL;
}
}
}
#endif
} }
void KMenu::setupUi() void KMenu::setupUi()
@ -437,6 +481,15 @@ KMenu::~KMenu()
clearSubmenus(); clearSubmenus();
delete m_filterData; delete m_filterData;
#ifdef COMPILE_HALBACKEND
if (m_halCtx) {
DBusError error;
dbus_error_init(&error);
libhal_ctx_shutdown(m_halCtx, &error);
libhal_ctx_free(m_halCtx);
}
#endif
} }
bool KMenu::eventFilter ( TQObject * receiver, TQEvent* e) bool KMenu::eventFilter ( TQObject * receiver, TQEvent* e)
@ -2620,7 +2673,7 @@ void KMenu::slotStartURL(const TQString& u)
kapp->dcopClient()->send("ksmserver", "default", "logoutTimed(int,int,TQString)", params); kapp->dcopClient()->send("ksmserver", "default", "logoutTimed(int,int,TQString)", params);
} }
#ifdef KDELIBS_SUSE #ifdef COMPILE_HALBACKEND
else if ( u == "kicker:/suspend_disk" ) { else if ( u == "kicker:/suspend_disk" ) {
slotSuspend( 1 ); slotSuspend( 1 );
} }
@ -3688,96 +3741,91 @@ int KMenu::max_items(int category) const
return 5; return 5;
} }
#define DBUS_HAL_INTERFACE "org.freedesktop.Hal"
#define DBUS_HAL_SYSTEM_POWER_INTERFACE "org.freedesktop.Hal.Device.SystemPowerManagement"
#define HAL_UDI_COMPUTER "/org/freedesktop/Hal/devices/computer"
#ifdef KDELIBS_SUSE
#include <liblazy.h>
#endif
void KMenu::insertSuspendOption( int &nId, int &index ) void KMenu::insertSuspendOption( int &nId, int &index )
{ {
#ifdef KDELIBS_SUSE bool suspend_ram = false;
int supported = -1; bool standby = false;
bool suspend_ram, suspend_disk, standby; bool suspend_disk = false;
#ifdef COMPILE_HALBACKEND
liblazy_hal_get_property_bool(HAL_UDI_COMPUTER, "power_management.can_suspend", &supported); suspend_ram = libhal_device_get_property_bool(m_halCtx,
if (supported == 1) "/org/freedesktop/Hal/devices/computer",
suspend_ram = true; "power_management.can_suspend",
else NULL);
suspend_ram = false;
liblazy_hal_get_property_bool(HAL_UDI_COMPUTER, "power_management.can_standby", &supported); standby = libhal_device_get_property_bool(m_halCtx,
if (supported == 1) "/org/freedesktop/Hal/devices/computer",
standby = true; "power_management.can_standby",
else NULL);
standby = false;
liblazy_hal_get_property_bool(HAL_UDI_COMPUTER, "power_management.can_hibernate", &supported); suspend_disk = libhal_device_get_property_bool(m_halCtx,
if (supported == 1) "/org/freedesktop/Hal/devices/computer",
suspend_disk = true; "power_management.can_hibernate",
else NULL);
suspend_disk = false; #endif
if (liblazy_hal_is_caller_privileged("org.freedesktop.hal.power-management.hibernate") != 1)
suspend_disk = false;
if (liblazy_hal_is_caller_privileged("org.freedesktop.hal.power-management.suspend") != 1)
suspend_ram = false;
if (liblazy_hal_is_caller_privileged("org.freedesktop.hal.power-management.standby") != 1)
standby = false;
if ( ! ( standby + suspend_ram + suspend_disk ) )
return;
i18n("Suspend Computer");
if ( suspend_disk )
m_exitView->leftView()->insertItem( "suspend2disk", i18n( "Suspend to Disk" ),
i18n( "Pause without logging out" ), "kicker:/suspend_disk", nId++, index++ );
if ( suspend_ram ) if ( suspend_disk ) {
m_exitView->leftView()->insertItem( "suspend2ram", i18n( "Suspend to RAM" ), m_exitView->leftView()->insertItem(
i18n( "Pause without logging out" ), "kicker:/suspend_ram", nId++, index++ ); "suspend2disk",
i18n( "Suspend to Disk" ),
i18n( "Pause without logging out" ),
"kicker:/suspend_disk", nId++, index++ );
}
if ( suspend_ram ) {
m_exitView->leftView()->insertItem(
"suspend2ram",
i18n( "Suspend to RAM" ),
i18n( "Pause without logging out" ),
"kicker:/suspend_ram", nId++, index++ );
}
if ( standby ) if ( standby ) {
m_exitView->leftView()->insertItem( "player_pause", i18n( "Standby" ), m_exitView->leftView()->insertItem(
i18n( "Pause without logging out" ), "kicker:/standby", nId++, index++ ); "player_pause",
#endif i18n( "Standby" ),
i18n( "Pause without logging out" ),
"kicker:/standby", nId++, index++ );
}
} }
void KMenu::slotSuspend(int id) void KMenu::slotSuspend(int id)
{ {
#ifdef KDELIBS_SUSE bool error = true;
int error = 0; #ifdef COMPILE_HALBACKEND
int wake = 0; DBusMessage* msg = NULL;
DBusMessage *reply = 0;
if (m_dbusConn) {
if (id == 1) { if (id == 1) {
error = liblazy_dbus_system_send_method_call(DBUS_HAL_INTERFACE, msg = dbus_message_new_method_call(
HAL_UDI_COMPUTER, "org.freedesktop.Hal",
DBUS_HAL_SYSTEM_POWER_INTERFACE, "/org/freedesktop/Hal/devices/computer",
"Hibernate", "org.freedesktop.Hal.Device.SystemPowerManagement",
&reply, "Hibernate");
DBUS_TYPE_INVALID); } else if (id == 2) {
} else if (id == 2) msg = dbus_message_new_method_call(
error = liblazy_dbus_system_send_method_call(DBUS_HAL_INTERFACE, "org.freedesktop.Hal",
HAL_UDI_COMPUTER, "/org/freedesktop/Hal/devices/computer",
DBUS_HAL_SYSTEM_POWER_INTERFACE, "org.freedesktop.Hal.Device.SystemPowerManagement",
"Suspend", "Suspend");
&reply, int wakeup=0;
DBUS_TYPE_INT32, dbus_message_append_args(msg, DBUS_TYPE_INT32, &wakeup, DBUS_TYPE_INVALID);
&wake, } else if (id == 3) {
DBUS_TYPE_INVALID); msg = dbus_message_new_method_call(
else if (id == 3) "org.freedesktop.Hal",
error = liblazy_dbus_system_send_method_call(DBUS_HAL_INTERFACE, "/org/freedesktop/Hal/devices/computer",
HAL_UDI_COMPUTER, "org.freedesktop.Hal.Device.SystemPowerManagement",
DBUS_HAL_SYSTEM_POWER_INTERFACE, "Standby");
"Standby", } else {
&reply, return;
DBUS_TYPE_INVALID); }
else
return; if(dbus_connection_send(m_dbusConn, msg, NULL)) {
if (error) error = false;
}
dbus_message_unref(msg);
}
#endif #endif
if (error)
KMessageBox::error(this, i18n("Suspend failed")); KMessageBox::error(this, i18n("Suspend failed"));
} }

@ -43,6 +43,18 @@
#include "service_mnu.h" #include "service_mnu.h"
#include "query.h" #include "query.h"
#include <config.h>
#ifndef NO_QT3_DBUS_SUPPORT
/* We acknowledge the the dbus API is unstable */
#define DBUS_API_SUBJECT_TO_CHANGE
#include <dbus/connection.h>
#endif // NO_QT3_DBUS_SUPPORT
#ifdef COMPILE_HALBACKEND
#include <hal/libhal.h>
#endif
class KickerClientMenu; class KickerClientMenu;
class KickoffTabBar; class KickoffTabBar;
class KBookmarkMenu; class KBookmarkMenu;
@ -339,6 +351,11 @@ private:
void fillOverflowCategory(); void fillOverflowCategory();
TQString insertBreaks(const TQString& text, TQFontMetrics fm, int width, TQString leadInsert = TQString::null); TQString insertBreaks(const TQString& text, TQFontMetrics fm, int width, TQString leadInsert = TQString::null);
#ifdef COMPILE_HALBACKEND
LibHalContext* m_halCtx;
DBusConnection *m_dbusConn;
#endif
}; };
#endif #endif

Loading…
Cancel
Save