diff -ur orig/hildon-desktop-2.2.120/src/home/hd-home.c hildon-desktop-2.2.120/src/home/hd-home.c --- orig/hildon-desktop-2.2.120/src/home/hd-home.c 2009-12-01 12:43:45.000000000 +0200 +++ hildon-desktop-2.2.120/src/home/hd-home.c 2010-01-14 16:22:59.000000000 +0200 @@ -38,6 +38,8 @@ #include "hd-render-manager.h" #include "hd-clutter-cache.h" #include "hd-theme.h" +#include "hd-dbus.h" +#include "hd-title-bar.h" #include "hd-launcher-app.h" @@ -166,7 +168,7 @@ FN_STATE_NONE, // interpret the KeyPress as it is FN_STATE_NEXT, // the next key is Fn-modified FN_STATE_LOCKED, // until turned off all key press are Fn-modified - } fn_state; + } fn_state, shift_state; enum { @@ -179,6 +181,7 @@ /* For hd_home_desktop_key_release(): * Don't change @fn_state if it was wasn't pressed alone. */ gboolean ignore_next_fn_release; + gboolean ignore_next_shift_release; /* These are all reset when the HDRM state is changed. */ }; @@ -206,6 +209,8 @@ static void hd_home_show_edit_button (HdHome *home); +static void hd_home_reset_fn_state (HdHome *home); + static void do_applet_release (HdHome *home, ClutterActor *applet, ClutterButtonEvent *event); @@ -561,6 +566,108 @@ /* g_debug ("%s, display: %p, keymap: %p", __FUNCTION__, display, keymap); */ + if (hd_render_manager_get_state()==HDRM_STATE_LAUNCHER) { + int d; + d=0; + switch(xev->keycode) { + case 24: + case 25: + case 26: + case 27: + case 28: + d=24; + break; + case 38: + case 39: + case 40: + case 41: + case 42: + d=33; + break; + case 52: + case 53: + case 54: + case 55: + case 56: + d=42; + break; + case 22: /* Backspace sends -1, which means up one level */ + d=23; + break; + } + if (d && conf_enable_launcher_navigator_accel) { + hd_launcher_activate(xev->keycode-d); + } else if(conf_enable_dbus_launcher_navigator) { + char s[16]; + gdk_keymap_translate_keyboard_state (keymap, + xev->keycode, + xev->state, + 0, + &keyval, + NULL, NULL, NULL); + sprintf(s, "%i", keyval+1024); + hd_dbus_send_event(s); + } + } + if (hd_render_manager_get_state()==HDRM_STATE_TASK_NAV) { + int d,y; + d=0; + switch(xev->keycode) { + case 24: + case 25: + case 26: + case 27: + case 28: + d=24; + y=0; + break; + case 38: + case 39: + case 40: + case 41: + case 42: + d=38; + y=1; + break; + case 52: + case 53: + case 54: + case 55: + case 56: + d=52; + y=2; + break; + } + if (d && conf_enable_launcher_navigator_accel) { + if ((xev->state & (FN_MODIFIER|ShiftMask))||priv->fn_state||priv->shift_state) { + hd_task_navigator_activate(xev->keycode-d,y,1); + hd_home_reset_fn_state(home); + } else hd_task_navigator_activate(xev->keycode-d,y,0); + } else if(conf_enable_dbus_launcher_navigator) { + char s[16]; + gdk_keymap_translate_keyboard_state (keymap, + xev->keycode, + xev->state, + 0, + &keyval, + NULL, NULL, NULL); + sprintf(s, "%i", keyval+2048); + hd_dbus_send_event(s); + } + } + if (hd_render_manager_get_state()==HDRM_STATE_HOME) { + if (xev->keycode==113) { + hd_home_view_container_scroll_to_previous (HD_HOME_VIEW_CONTAINER (priv->view_container), 20000); + return ; + } + if (xev->keycode==114) { + hd_home_view_container_scroll_to_next (HD_HOME_VIEW_CONTAINER (priv->view_container), -20000); + return ; + } + } + + if(conf_enable_home_contacts_phone) { + /* First check how long has it been since last key press. If more than n sec, * reset. */ @@ -575,7 +682,7 @@ * already sent some to Contacts or CallUI. */ if (!STATE_ALLOW_CALL_FROM_HOME (hd_render_manager_get_state ()) && (priv->key_sent == KEY_SENT_NONE)) - return; + goto handle_fn_shift; if (priv->key_sent == KEY_SENT_CALLUI) { @@ -638,7 +745,19 @@ G_TYPE_STRING, buffer, G_TYPE_INVALID); } } + } else if(conf_enable_dbus_launcher_navigator) { + char s[16]; + gdk_keymap_translate_keyboard_state (keymap, + xev->keycode, + xev->state, + 0, + &keyval, + NULL, NULL, NULL); + sprintf(s, "%i", keyval+4096); + hd_dbus_send_event(s); + } +handle_fn_shift: if (xev->state & FN_MODIFIER) { priv->fn_state = FN_STATE_NONE; @@ -649,6 +768,16 @@ priv->fn_state = FN_STATE_NONE; g_debug ("%s, FN state: %d", __FUNCTION__, priv->fn_state); } + if (xev->state & ShiftMask) + { + priv->shift_state = FN_STATE_NONE; + priv->ignore_next_shift_release = TRUE; + } + else if (priv->shift_state == FN_STATE_NEXT) + { + priv->shift_state = FN_STATE_NONE; + g_debug ("%s, SHIFT state: %d", __FUNCTION__, priv->shift_state); + } } static void @@ -657,26 +786,40 @@ HdHome *home = userdata; HdHomePrivate *priv = home->priv; - /* Ignore keys if they are not Fn. */ - if (xev->state & ControlMask - || XkbKeycodeToKeysym(clutter_x11_get_default_display(), - xev->keycode, 0, 0) != FN_KEY) - return; /* Ignore keys if not at home or launching an app that wants them. */ if (!STATE_ALLOW_CALL_FROM_HOME (hd_render_manager_get_state ()) && - (priv->key_sent == KEY_SENT_NONE)) + (priv->key_sent == KEY_SENT_NONE) && (hd_render_manager_get_state()!=HDRM_STATE_TASK_NAV)) return; - if (priv->ignore_next_fn_release) - priv->ignore_next_fn_release = FALSE; - else if (priv->fn_state == FN_STATE_NONE) - priv->fn_state = FN_STATE_NEXT; - else if (priv->fn_state == FN_STATE_NEXT) - priv->fn_state = FN_STATE_LOCKED; - else - priv->fn_state = FN_STATE_NONE; - g_debug ("%s. FN state: %d", __FUNCTION__, priv->fn_state); + if(XkbKeycodeToKeysym(clutter_x11_get_default_display(), xev->keycode, 0, 0) == FN_KEY) { + if (priv->ignore_next_fn_release) + priv->ignore_next_fn_release = FALSE; + else if (priv->fn_state == FN_STATE_NONE) + priv->fn_state = FN_STATE_NEXT; + else if (priv->fn_state == FN_STATE_NEXT) + priv->fn_state = FN_STATE_LOCKED; + else + priv->fn_state = FN_STATE_NONE; + if(priv->fn_state && (hd_render_manager_get_state()==HDRM_STATE_TASK_NAV)) { + hd_home_show_edit_button(home); + } +// g_warning ("%s. FN state: %d", __FUNCTION__, priv->fn_state); + } + if(XkbKeycodeToKeysym(clutter_x11_get_default_display(), xev->keycode, 0, 0) == GDK_Shift_L) { + if (priv->ignore_next_shift_release) + priv->ignore_next_shift_release = FALSE; + else if (priv->shift_state == FN_STATE_NONE) + priv->shift_state = FN_STATE_NEXT; + else if (priv->shift_state == FN_STATE_NEXT) + priv->shift_state = FN_STATE_LOCKED; + else + priv->shift_state = FN_STATE_NONE; + if(priv->shift_state && (hd_render_manager_get_state()==HDRM_STATE_TASK_NAV)) { + hd_home_show_edit_button(home); + } +// g_warning ("%s. SHIFT state: %d", __FUNCTION__, priv->shift_state); + } } static void @@ -684,6 +827,8 @@ { home->priv->fn_state = FN_STATE_NONE; home->priv->ignore_next_fn_release = FALSE; + home->priv->shift_state = FN_STATE_NONE; + home->priv->ignore_next_shift_release = FALSE; } /* Called when a client message is sent to the root window. */ @@ -1827,6 +1972,8 @@ hd_home_hide_edit_button (home); + hd_home_reset_fn_state(home); + return FALSE; } diff -ur orig/hildon-desktop-2.2.120/src/home/hd-task-navigator.c hildon-desktop-2.2.120/src/home/hd-task-navigator.c --- orig/hildon-desktop-2.2.120/src/home/hd-task-navigator.c 2009-12-01 12:43:45.000000000 +0200 +++ hildon-desktop-2.2.120/src/home/hd-task-navigator.c 2010-01-14 12:23:19.000000000 +0200 @@ -443,6 +443,7 @@ * or in the application's they belong to. */ TNote *tnote; + time_t last_activated; } Thumbnail; /* }}} */ /* Thumbnail data structures }}} */ @@ -2791,7 +2792,7 @@ /* Called when a %Thumbnail.thwin is clicked. */ static gboolean -appthumb_clicked (const Thumbnail * apthumb) +appthumb_clicked (Thumbnail * apthumb) { if (hd_render_manager_get_state () != HDRM_STATE_TASK_NAV) /* Bloke clicked a home applet while exiting the switcher, @@ -2812,6 +2813,7 @@ else g_signal_emit_by_name (Navigator, "thumbnail-clicked", apthumb->apwin); + apthumb->last_activated = time(NULL); return TRUE; } @@ -2902,6 +2904,7 @@ apthumb = g_new0 (Thumbnail, 1); apthumb->type = APPLICATION; + apthumb->last_activated = time(NULL); /* We're just in a MapNotify, it shouldn't happen. * mb_wm_object_signal_connect() will take reference * of apthumb->win. */ @@ -4131,5 +4134,44 @@ } /* %HdTaskNavigator }}} */ +static int hd_thumb_compare (gconstpointer a, gconstpointer b) +{ + return ((Thumbnail *)a)->last_activated - ((Thumbnail *)b)->last_activated; +} + +void hd_task_navigator_activate(int x, int y, int close) { + Layout lout; + int n; + GList *t; + if (y==-2) { + GList *s; + if(x<0)x+=NThumbnails; + s=g_list_sort(g_list_copy(Thumbnails), hd_thumb_compare); + t=g_list_nth(s,x); + if(t) { + if(close) appthumb_close_clicked((Thumbnail *)t->data); else + appthumb_clicked((Thumbnail *)t->data); + } + g_list_free(t); + return ; + } else + if (y==-1) { + n=x; + } else { + calc_layout(&lout); + if(lout.cells_per_row<=x) return ; + n=y*lout.cells_per_row+x; + } + if(n>=NThumbnails) return ; + t=Thumbnails; + while((n>0) && t) { + t=t->next; + n--; + } + if(t && !n ) { + if(close) appthumb_close_clicked((Thumbnail *)t->data); else + appthumb_clicked((Thumbnail *)t->data); + } +} /* vim: set foldmethod=marker: */ /* End of hd-task-navigator.c */ diff -ur orig/hildon-desktop-2.2.120/src/home/hd-task-navigator.h hildon-desktop-2.2.120/src/home/hd-task-navigator.h --- orig/hildon-desktop-2.2.120/src/home/hd-task-navigator.h 2009-12-01 12:43:44.000000000 +0200 +++ hildon-desktop-2.2.120/src/home/hd-task-navigator.h 2010-01-14 12:23:19.000000000 +0200 @@ -74,5 +74,6 @@ HdNote *hdnote); void hd_task_navigator_remove_notification (HdTaskNavigator *self, HdNote *hdnote); +void hd_task_navigator_activate(int x, int y, int close); #endif /* ! __HD_TASK_NAVIGATOR_H__ */ diff -ur orig/hildon-desktop-2.2.120/src/launcher/hd-app-mgr.c hildon-desktop-2.2.120/src/launcher/hd-app-mgr.c --- orig/hildon-desktop-2.2.120/src/launcher/hd-app-mgr.c 2009-12-01 12:43:45.000000000 +0200 +++ hildon-desktop-2.2.120/src/launcher/hd-app-mgr.c 2010-01-14 12:23:19.000000000 +0200 @@ -205,6 +205,15 @@ #define GCONF_SLIDE_OPEN_KEY "/system/osso/af/slide-open" #define GCONF_DISABLE_CALLUI_DIR "/apps/osso/hildon-desktop" #define GCONF_DISABLE_CALLUI_KEY "/apps/osso/hildon-desktop/disable_phone_gesture" +#define GCONF_KEY_ACTIONS_DIR "/apps/osso/hildon-desktop/key-actions" + +gboolean conf_enable_ctrl_backspace; +gboolean conf_enable_preset_shift_ctrl; +gboolean conf_enable_dbus_shift_ctrl; +gboolean conf_enable_home_contacts_phone; +gboolean conf_enable_launcher_navigator_accel; +gboolean conf_enable_dbus_launcher_navigator; +gboolean conf_default_launcher_positions; /* Forward declarations */ static void hd_app_mgr_dispose (GObject *gobject); @@ -403,6 +412,13 @@ self); hd_launcher_tree_populate (priv->tree); + conf_enable_ctrl_backspace=TRUE; + conf_enable_preset_shift_ctrl=TRUE; + conf_enable_dbus_shift_ctrl=TRUE; + conf_enable_home_contacts_phone=TRUE; + conf_enable_launcher_navigator_accel=TRUE; + conf_enable_dbus_launcher_navigator=TRUE; + conf_default_launcher_positions=FALSE; /* NOTE: Can we assume this when we start up? */ priv->unlocked = TRUE; priv->display_on = TRUE; @@ -430,6 +446,22 @@ hd_app_mgr_gconf_value_changed, (gpointer) self, NULL, NULL); + if(gconf_client_dir_exists(priv->gconf_client, GCONF_KEY_ACTIONS_DIR, NULL)) { + conf_enable_ctrl_backspace = gconf_client_get_bool(priv->gconf_client, + GCONF_KEY_ACTIONS_DIR "/ctrl_backspace", NULL); + conf_enable_preset_shift_ctrl = gconf_client_get_bool(priv->gconf_client, + GCONF_KEY_ACTIONS_DIR "/preset_shift_ctrl", NULL); + conf_enable_dbus_shift_ctrl = gconf_client_get_bool(priv->gconf_client, + GCONF_KEY_ACTIONS_DIR "/dbus_shift_ctrl", NULL); + conf_enable_home_contacts_phone = gconf_client_get_bool(priv->gconf_client, + GCONF_KEY_ACTIONS_DIR "/home_contacts_phone", NULL); + conf_enable_launcher_navigator_accel = gconf_client_get_bool(priv->gconf_client, + GCONF_KEY_ACTIONS_DIR "/launcher_navigator_accel", NULL); + conf_enable_dbus_launcher_navigator = gconf_client_get_bool(priv->gconf_client, + GCONF_KEY_ACTIONS_DIR "/dbus_launcher_navigator", NULL); + conf_default_launcher_positions = gconf_client_get_bool(priv->gconf_client, + GCONF_KEY_ACTIONS_DIR "/default_launcher_positions", NULL); + } } /* Start memory limits. */ diff -ur orig/hildon-desktop-2.2.120/src/launcher/hd-app-mgr.h hildon-desktop-2.2.120/src/launcher/hd-app-mgr.h --- orig/hildon-desktop-2.2.120/src/launcher/hd-app-mgr.h 2009-12-01 12:43:45.000000000 +0200 +++ hildon-desktop-2.2.120/src/launcher/hd-app-mgr.h 2010-01-14 12:23:19.000000000 +0200 @@ -99,6 +99,14 @@ void hd_app_mgr_set_render_manager (GObject *rendermgr); +extern gboolean conf_enable_ctrl_backspace; +extern gboolean conf_enable_preset_shift_ctrl; +extern gboolean conf_enable_dbus_shift_ctrl; +extern gboolean conf_enable_home_contacts_phone; +extern gboolean conf_enable_launcher_navigator_accel; +extern gboolean conf_enable_dbus_launcher_navigator; +extern gboolean conf_default_launcher_positions; + G_END_DECLS #endif /* __HD_APP_MGR_H__ */ diff -ur orig/hildon-desktop-2.2.120/src/launcher/hd-launcher.c hildon-desktop-2.2.120/src/launcher/hd-launcher.c --- orig/hildon-desktop-2.2.120/src/launcher/hd-launcher.c 2009-12-01 12:43:44.000000000 +0200 +++ hildon-desktop-2.2.120/src/launcher/hd-launcher.c 2010-01-14 12:23:19.000000000 +0200 @@ -110,6 +110,9 @@ static gboolean hd_launcher_background_clicked (HdLauncher *self, ClutterButtonEvent *event, gpointer *data); +static gboolean hd_launcher_key_pressed (HdLauncher *self, + ClutterButtonEvent *event, + gpointer *data); static void hd_launcher_populate_tree_starting (HdLauncherTree *tree, gpointer data); static void hd_launcher_populate_tree_finished (HdLauncherTree *tree, @@ -213,6 +216,8 @@ G_CALLBACK(hd_launcher_captured_event_cb), 0); g_signal_connect (self, "button-release-event", G_CALLBACK(hd_launcher_background_clicked), 0); + g_signal_connect (self, "key-pressed-event", + G_CALLBACK(hd_launcher_key_pressed), 0); /* App launch transition */ priv->launch_image = 0; @@ -890,3 +895,26 @@ return TRUE; } + +static gboolean +hd_launcher_key_pressed (HdLauncher *self, + ClutterButtonEvent *event, + gpointer *data) +{ +// HdLauncherPrivate *priv = HD_LAUNCHER_GET_PRIVATE (hd_launcher_get ()); + + hd_launcher_back_button_clicked(0, 0, 0); + + return TRUE; +} + +void +hd_launcher_activate(int p) { + HdLauncherPrivate *priv = HD_LAUNCHER_GET_PRIVATE (hd_launcher_get ()); + if(p==-1) { + hd_launcher_back_button_clicked(0, 0, 0); + return; + } + hd_launcher_page_activate(priv->active_page, p); +} + diff -ur orig/hildon-desktop-2.2.120/src/launcher/hd-launcher-grid.c hildon-desktop-2.2.120/src/launcher/hd-launcher-grid.c --- orig/hildon-desktop-2.2.120/src/launcher/hd-launcher-grid.c 2009-12-01 12:43:44.000000000 +0200 +++ hildon-desktop-2.2.120/src/launcher/hd-launcher-grid.c 2010-01-14 12:23:19.000000000 +0200 @@ -870,3 +870,15 @@ { return TRUE; } + +void hd_launcher_grid_activate(ClutterActor *actor, int p) +{ + HdLauncherGridPrivate *priv = HD_LAUNCHER_GRID_GET_PRIVATE (actor); + GList *l; + l=priv->tiles; + while((p>0) && l) { + l=l->next; + p--; + } + if(l && !p) hd_launcher_tile_activate(l->data); +} diff -ur orig/hildon-desktop-2.2.120/src/launcher/hd-launcher-grid.h hildon-desktop-2.2.120/src/launcher/hd-launcher-grid.h --- orig/hildon-desktop-2.2.120/src/launcher/hd-launcher-grid.h 2009-12-01 12:43:44.000000000 +0200 +++ hildon-desktop-2.2.120/src/launcher/hd-launcher-grid.h 2010-01-14 12:23:19.000000000 +0200 @@ -77,6 +77,8 @@ void hd_launcher_grid_reset(HdLauncherGrid *grid); void hd_launcher_grid_layout(HdLauncherGrid *grid); +void hd_launcher_grid_activate(ClutterActor *actor, int p); + /* Fixed sizes */ #define HD_LAUNCHER_GRID_MIN_HEIGHT \ (HD_LAUNCHER_PAGE_HEIGHT - HD_LAUNCHER_PAGE_YMARGIN) diff -ur orig/hildon-desktop-2.2.120/src/launcher/hd-launcher.h hildon-desktop-2.2.120/src/launcher/hd-launcher.h --- orig/hildon-desktop-2.2.120/src/launcher/hd-launcher.h 2009-12-01 12:43:44.000000000 +0200 +++ hildon-desktop-2.2.120/src/launcher/hd-launcher.h 2010-01-14 12:23:19.000000000 +0200 @@ -94,6 +94,8 @@ void hd_launcher_stop_loading_transition (void); +void hd_launcher_activate(int p); + /* left/right/top/bottom margin that is clicked on to go back */ #define HD_LAUNCHER_LEFT_MARGIN (68) /* layout guide F */ #define HD_LAUNCHER_RIGHT_MARGIN (68) /* layout guide F */ diff -ur orig/hildon-desktop-2.2.120/src/launcher/hd-launcher-page.c hildon-desktop-2.2.120/src/launcher/hd-launcher-page.c --- orig/hildon-desktop-2.2.120/src/launcher/hd-launcher-page.c 2009-12-01 12:43:44.000000000 +0200 +++ hildon-desktop-2.2.120/src/launcher/hd-launcher-page.c 2010-01-14 12:23:19.000000000 +0200 @@ -538,3 +538,9 @@ priv = HD_LAUNCHER_PAGE_GET_PRIVATE (page); return priv->drag_distance; } + +void +hd_launcher_page_activate(ClutterActor *actor, int p) { + HdLauncherPagePrivate *priv = HD_LAUNCHER_PAGE_GET_PRIVATE (actor); + hd_launcher_grid_activate(priv->grid, p); +} diff -ur orig/hildon-desktop-2.2.120/src/launcher/hd-launcher-page.h hildon-desktop-2.2.120/src/launcher/hd-launcher-page.h --- orig/hildon-desktop-2.2.120/src/launcher/hd-launcher-page.h 2009-12-01 12:43:44.000000000 +0200 +++ hildon-desktop-2.2.120/src/launcher/hd-launcher-page.h 2010-01-14 12:23:19.000000000 +0200 @@ -83,6 +83,8 @@ const char *hd_launcher_page_get_transition_string( HdLauncherPageTransition trans_type); +void hd_launcher_page_activate(ClutterActor *actor, int p); + /* Fixed sizes. * FIXME: These should come from getting the screen size */ diff -ur orig/hildon-desktop-2.2.120/src/launcher/hd-launcher-tile.c hildon-desktop-2.2.120/src/launcher/hd-launcher-tile.c --- orig/hildon-desktop-2.2.120/src/launcher/hd-launcher-tile.c 2009-12-01 12:43:44.000000000 +0200 +++ hildon-desktop-2.2.120/src/launcher/hd-launcher-tile.c 2010-01-14 12:23:19.000000000 +0200 @@ -636,3 +636,9 @@ hd_launcher_tile_set_glow(tile, FALSE); priv->is_pressed = FALSE; } + +void hd_launcher_tile_activate(ClutterActor *actor) +{ + hd_launcher_tile_button_press(actor); + hd_launcher_tile_button_release(actor); +} diff -ur orig/hildon-desktop-2.2.120/src/launcher/hd-launcher-tile.h hildon-desktop-2.2.120/src/launcher/hd-launcher-tile.h --- orig/hildon-desktop-2.2.120/src/launcher/hd-launcher-tile.h 2009-12-01 12:43:44.000000000 +0200 +++ hildon-desktop-2.2.120/src/launcher/hd-launcher-tile.h 2010-01-14 12:23:19.000000000 +0200 @@ -76,6 +76,8 @@ void hd_launcher_tile_reset(HdLauncherTile *tile); +void hd_launcher_tile_activate(ClutterActor *actor); + /* Fixed size */ #define HD_LAUNCHER_TILE_HEIGHT (100) #define HD_LAUNCHER_TILE_WIDTH (142) diff -ur orig/hildon-desktop-2.2.120/src/main.c hildon-desktop-2.2.120/src/main.c --- orig/hildon-desktop-2.2.120/src/main.c 2009-12-01 12:43:45.000000000 +0200 +++ hildon-desktop-2.2.120/src/main.c 2010-01-14 12:23:19.000000000 +0200 @@ -48,6 +48,7 @@ #include "hd-wm.h" #include "hd-theme.h" #include "hd-util.h" +#include "hd-dbus.h" #include "hd-volume-profile.h" #include "launcher/hd-app-mgr.h" #include "home/hd-render-manager.h" @@ -61,6 +62,8 @@ KEY_ACTION_TOGGLE_NON_COMP_MODE, KEY_ACTION_TAKE_SCREENSHOT, KEY_ACTION_XTERMINAL, + KEY_ACTION_SEND_DBUS, + KEY_ACTION_HOME, }; #ifdef MBWM_DEB_VERSION @@ -216,6 +219,10 @@ /* printf(" ### KEY_ACTION_TOGGLE_SWITCHER ###\n"); */ hd_render_manager_set_state (HDRM_STATE_TASK_NAV); break; + case KEY_ACTION_HOME: + /* printf(" ### KEY_ACTION_HOMRE ###\n"); */ + hd_render_manager_set_state (HDRM_STATE_HOME); + break; case KEY_ACTION_TOGGLE_NON_COMP_MODE: /* printf(" ### KEY_ACTION_TOGGLE_NON_COMP_MODE ###\n"); */ if (hd_render_manager_get_state () == HDRM_STATE_NON_COMPOSITED) @@ -240,6 +247,19 @@ break; } } +static void +key_binding_func_key (MBWindowManager *wm, + MBWMKeyBinding *binding, + void *userdata) +{ + int action; + char s[32]; + + action = (int)(userdata); + sprintf(s,"%i",action); + + hd_dbus_send_event (s); +} static ClutterX11FilterReturn clutter_x11_event_filter (XEvent *xev, ClutterEvent *cev, gpointer data) @@ -484,6 +504,7 @@ Display * dpy = NULL; MBWindowManager *wm; HdAppMgr *app_mgr; + char keys1[32], keys2[32], c; signal (SIGUSR1, dump_debug_info_sighand); signal (SIGHUP, relaunch); @@ -564,11 +585,34 @@ mb_wm_init (wm); g_assert (mb_wm_comp_mgr_enabled (wm->comp_mgr)); + if(conf_enable_ctrl_backspace) { + mb_wm_keys_binding_add_with_spec (wm, + "BackSpace", + key_binding_func, + NULL, + (void*)KEY_ACTION_TOGGLE_SWITCHER); mb_wm_keys_binding_add_with_spec (wm, "BackSpace", key_binding_func, NULL, (void*)KEY_ACTION_TOGGLE_SWITCHER); + } + if(conf_enable_preset_shift_ctrl) { + mb_wm_keys_binding_add_with_spec (wm, + "h", + key_binding_func, + NULL, + (void*)KEY_ACTION_HOME); + mb_wm_keys_binding_add_with_spec (wm, + "h", + key_binding_func, + NULL, + (void*)KEY_ACTION_HOME); + mb_wm_keys_binding_add_with_spec (wm, + "x", + key_binding_func, + NULL, + (void*)KEY_ACTION_XTERMINAL); mb_wm_keys_binding_add_with_spec (wm, "x", key_binding_func, @@ -584,7 +628,68 @@ key_binding_func, NULL, (void*)KEY_ACTION_TAKE_SCREENSHOT); + } + if(conf_enable_dbus_shift_ctrl) { + mb_wm_keys_binding_add_with_spec (wm, + "F7", + key_binding_func_key, + NULL, + (void*)247); + mb_wm_keys_binding_add_with_spec (wm, + "F8", + key_binding_func_key, + NULL, + (void*)248); + mb_wm_keys_binding_add_with_spec (wm, + "Space", + key_binding_func_key, + NULL, + (void*)(192+32)); + mb_wm_keys_binding_add_with_spec (wm, + "comma", + key_binding_func_key, + NULL, + (void*)(192+33)); + mb_wm_keys_binding_add_with_spec (wm, + "period", + key_binding_func_key, + NULL, + (void*)(192+34)); + mb_wm_keys_binding_add_with_spec (wm, + "Space", + key_binding_func_key, + NULL, + (void*)(192+36)); + mb_wm_keys_binding_add_with_spec (wm, + "comma", + key_binding_func_key, + NULL, + (void*)(192+37)); + mb_wm_keys_binding_add_with_spec (wm, + "period", + key_binding_func_key, + NULL, + (void*)(192+38)); + + strcpy(keys1,"a"); + strcpy(keys2,"a"); + for(c='a';c<='z';c++) if(!conf_enable_preset_shift_ctrl || ((c!='n') && (c!='p') && (c!='x') && (c!='h'))){ + keys1[strlen(keys1)-1]=c; + keys2[strlen(keys2)-1]=c; + mb_wm_keys_binding_add_with_spec (wm, + keys1, + key_binding_func_key, + NULL, + (void*)(192+c-'a'+1)); + mb_wm_keys_binding_add_with_spec (wm, + keys2, + key_binding_func_key, + NULL, + (void*)(192+c-'a'+1)); + } + } + clutter_x11_add_filter (clutter_x11_event_filter, wm); app_mgr = hd_app_mgr_get (); diff -ur orig/hildon-desktop-2.2.120/src/util/hd-dbus.c hildon-desktop-2.2.120/src/util/hd-dbus.c --- orig/hildon-desktop-2.2.120/src/util/hd-dbus.c 2009-12-01 12:43:45.000000000 +0200 +++ hildon-desktop-2.2.120/src/util/hd-dbus.c 2010-01-14 12:23:19.000000000 +0200 @@ -4,6 +4,7 @@ #include "hd-switcher.h" #include "hd-render-manager.h" #include "hd-volume-profile.h" +#include "hd-task-navigator.h" #include #include @@ -49,6 +50,90 @@ hd_render_manager_set_state (HDRM_STATE_TASK_NAV); return DBUS_HANDLER_RESULT_HANDLED; } + else if (dbus_message_is_signal(msg, + TASKNAV_SIGNAL_INTERFACE, + "set_state")) + { + DBusMessageIter args; + int sigvalue; + + if ((dbus_message_iter_init(msg, &args)) && + (DBUS_TYPE_INT32 == dbus_message_iter_get_arg_type(&args))) { + dbus_message_iter_get_basic(&args, &sigvalue); + switch(sigvalue) { + case HDRM_STATE_HOME : + case HDRM_STATE_HOME_PORTRAIT: + case HDRM_STATE_APP: + case HDRM_STATE_APP_PORTRAIT: + case HDRM_STATE_TASK_NAV: + case HDRM_STATE_LAUNCHER: + case HDRM_STATE_NON_COMPOSITED: + case HDRM_STATE_NON_COMP_PORT: + hd_render_manager_set_state (sigvalue); + break; + } + return DBUS_HANDLER_RESULT_HANDLED; + } + } + else if (dbus_message_is_signal(msg, + TASKNAV_SIGNAL_INTERFACE, + "activate_window")) + { + DBusMessageIter args; + int sigvalue; + + if ((dbus_message_iter_init(msg, &args)) && + (DBUS_TYPE_INT32 == dbus_message_iter_get_arg_type(&args))) { + dbus_message_iter_get_basic(&args, &sigvalue); + hd_task_navigator_activate(sigvalue, -1, 0); + return DBUS_HANDLER_RESULT_HANDLED; + } + } + else if (dbus_message_is_signal(msg, + TASKNAV_SIGNAL_INTERFACE, + "close_window")) + { + DBusMessageIter args; + int sigvalue; + + if ((dbus_message_iter_init(msg, &args)) && + (DBUS_TYPE_INT32 == dbus_message_iter_get_arg_type(&args))) { + dbus_message_iter_get_basic(&args, &sigvalue); + hd_task_navigator_activate(sigvalue, -1, 1); + return DBUS_HANDLER_RESULT_HANDLED; + } + } + else if (dbus_message_is_signal(msg, + TASKNAV_SIGNAL_INTERFACE, + "activate_window_time")) + { + DBusMessageIter args; + int sigvalue; + + if ((dbus_message_iter_init(msg, &args)) && + (DBUS_TYPE_INT32 == dbus_message_iter_get_arg_type(&args))) { + dbus_message_iter_get_basic(&args, &sigvalue); + hd_task_navigator_activate(sigvalue, -2, 0); + return DBUS_HANDLER_RESULT_HANDLED; + } + } + else if (dbus_message_is_signal(msg, + TASKNAV_SIGNAL_INTERFACE, + "close_window_time")) + { + DBusMessageIter args; + int sigvalue; + + if ((dbus_message_iter_init(msg, &args)) && + (DBUS_TYPE_INT32 == dbus_message_iter_get_arg_type(&args))) { + dbus_message_iter_get_basic(&args, &sigvalue); + hd_task_navigator_activate(sigvalue, -2, 1); + return DBUS_HANDLER_RESULT_HANDLED; + } + } + + + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; } @@ -206,6 +291,37 @@ } } +void hd_dbus_send_event (char *value) +{ + DBusMessage *msg; + dbus_bool_t b; + DBusMessageIter args; + + if (sysbus_conn == NULL) { + g_warning ("%s: no D-Bus system bus connection", __func__); + return; + } + msg = dbus_message_new_signal("/com/nokia/hildon_desktop", "com.nokia.hildon_desktop", "KeyEvent"); + if (msg == NULL) { + g_warning ("%s: could not create message", __func__); + return; + } + + dbus_message_iter_init_append(msg, &args); + if (!dbus_message_iter_append_basic(&args, DBUS_TYPE_STRING, &value)) { + g_warning("Out Of Memory!"); + return; + } + + b = dbus_connection_send(sysbus_conn, msg, NULL); + if (!b) { + g_warning ("%s: dbus_connection_send() failed", __func__); + } else { + dbus_connection_flush(sysbus_conn); + } + dbus_message_unref(msg); +} + DBusConnection * hd_dbus_init (HdCompMgr * hmgr) { diff -ur orig/hildon-desktop-2.2.120/src/util/hd-dbus.h hildon-desktop-2.2.120/src/util/hd-dbus.h --- orig/hildon-desktop-2.2.120/src/util/hd-dbus.h 2009-12-01 12:43:45.000000000 +0200 +++ hildon-desktop-2.2.120/src/util/hd-dbus.h 2010-01-14 12:23:19.000000000 +0200 @@ -16,5 +16,5 @@ const gchar *interface, const gchar *method, const gchar *launch_param); - +void hd_dbus_send_event (char *value); #endif