static int dccrecv_cb (char *word[], void *userdata) { int result; struct stat64 buffer; /* buffer for storing file info */ char sum[65]; /* buffer for checksum */ result = stat64 (word[2], &buffer); if (result == 0) /* stat returns 0 on success */ { if (buffer.st_size <= (unsigned long long) get_limit () * 1048576) { sha256_file (word[2], sum); /* word[2] is the full filename */ /* try to print the checksum in the privmsg tab of the sender */ xchat_set_context (ph, xchat_find_context (ph, NULL, word[3])); xchat_printf (ph, "SHA-256 checksum for %s (local): %s\n", word[1], sum); } else { xchat_set_context (ph, xchat_find_context (ph, NULL, word[3])); xchat_printf (ph, "SHA-256 checksum for %s (local): (size limit reached, no checksum calculated, you can increase it with /CHECKSUM INC)\n", word[1]); } } else { xchat_printf (ph, "File access error!\n"); } return XCHAT_EAT_NONE; }
static int connected_cb (char *word[], gpointer data) { GList *chans, *chan; const char *server; xchat_context *context; if (channels == NULL) return XCHAT_EAT_NONE; server = xchat_get_info (ph, "server"); context = g_hash_table_lookup (networks, server); if (context) { xchat_set_context (ph, context); chans = g_hash_table_lookup (channels, server); for (chan = chans; chan; chan = g_list_next (chan)) { xchat_commandf (ph, "JOIN %s", chan->data); } g_list_foreach (chans, (GFunc) g_free, NULL); g_list_free (chans); /* Now that we've connected and re-joined, we can remove this server * from the list */ g_hash_table_remove (networks, server); g_hash_table_remove (channels, server); } return XCHAT_EAT_NONE; }
static int dccoffer_cb (char *word[], void *userdata) { int result; struct stat64 buffer; /* buffer for storing file info */ char sum[65]; /* buffer for checksum */ result = stat64 (word[3], &buffer); if (result == 0) /* stat returns 0 on success */ { if (buffer.st_size <= (unsigned long long) get_limit () * 1048576) { sha256_file (word[3], sum); /* word[3] is the full filename */ xchat_commandf (ph, "quote PRIVMSG %s :SHA-256 checksum for %s (remote): %s", word[2], word[1], sum); } else { xchat_set_context (ph, xchat_find_context (ph, NULL, word[3])); xchat_printf (ph, "quote PRIVMSG %s :SHA-256 checksum for %s (remote): (size limit reached, no checksum calculated)", word[2], word[1]); } } else { xchat_printf (ph, "File access error!\n"); } return XCHAT_EAT_NONE; }
/* * lua: xchat.set_context(ctx) * desc: Changes your current context to the one given. * ret: true or false * args: * * ctx (number): the context (e.g. from xchat.get_context()) */ static int lxc_set_context(lua_State *L) { double ctx = luaL_checknumber(L, 1); #ifdef DEBUG fprintf(stderr, "set_context(): %#lx\n", (long)ctx); #endif xchat_context *xc = (void *)(long)ctx; lua_pushboolean(L, xchat_set_context(ph, xc)); return 1; }
static int timer_cb (void *userdata) { HookData *data = (HookData *) userdata; int retVal = 0; int count = 0; dSP; ENTER; SAVETMPS; PUSHMARK (SP); XPUSHs (data->userdata); PUTBACK; if (data->ctx) { xchat_set_context (ph, data->ctx); } set_current_package (data->package); count = call_sv (data->callback, G_EVAL); set_current_package (&PL_sv_undef); SPAGAIN; if (SvTRUE (ERRSV)) { xchat_printf (ph, "Error in timer callback %s", SvPV_nolen (ERRSV)); if (!SvOK (POPs)) {} /* remove undef from the top of the stack */ retVal = XCHAT_EAT_ALL; } else { if (count != 1) { xchat_print (ph, "Timer handler should only return 1 value."); retVal = XCHAT_EAT_NONE; } else { retVal = POPi; if (retVal == 0) { /* if 0 is return the timer is going to get unhooked */ PUSHMARK (SP); XPUSHs (sv_2mortal (newSViv (PTR2IV (data->hook)))); XPUSHs (sv_mortalcopy (data->package)); PUTBACK; call_pv ("Xchat::unhook", G_EVAL); SPAGAIN; } } } PUTBACK; FREETMPS; LEAVE; return retVal; }
static XS (XS_Xchat_set_context) { xchat_context *ctx; dXSARGS; if (items != 1) { xchat_print (ph, "Usage: Xchat::set_context(ctx)"); } else { ctx = INT2PTR (xchat_context *, SvUV (ST (0))); XSRETURN_IV ((IV) xchat_set_context (ph, ctx)); } }
static void tray_menu_cb (GtkWidget *widget, guint button, guint time, gpointer userdata) { GtkWidget *menu; GtkWidget *submenu; GtkWidget *item; int away_status; /* ph may have an invalid context now */ xchat_set_context (ph, xchat_find_context (ph, NULL, NULL)); menu = gtk_menu_new (); /*gtk_menu_set_screen (GTK_MENU (menu), gtk_widget_get_screen (widget));*/ if (tray_get_window_status () == WS_HIDDEN) tray_make_item (menu, _("_Restore Window"), tray_menu_restore_cb, NULL); else tray_make_item (menu, _("_Hide Window"), tray_menu_restore_cb, NULL); tray_make_item (menu, NULL, tray_menu_quit_cb, NULL); #ifndef WIN32 /* somehow this is broken on win32 */ submenu = mg_submenu (menu, _("_Blink on")); blink_item (&prefs.input_tray_chans, submenu, _("Channel Message")); blink_item (&prefs.input_tray_priv, submenu, _("Private Message")); blink_item (&prefs.input_tray_hilight, submenu, _("Highlighted Message")); /*blink_item (BIT_FILEOFFER, submenu, _("File Offer"));*/ submenu = mg_submenu (menu, _("_Change status")); away_status = tray_find_away_status (); item = tray_make_item (submenu, _("_Away"), tray_foreach_server, "away"); if (away_status == 1) gtk_widget_set_sensitive (item, FALSE); item = tray_make_item (submenu, _("_Back"), tray_foreach_server, "back"); if (away_status == 2) gtk_widget_set_sensitive (item, FALSE); tray_make_item (menu, NULL, tray_menu_quit_cb, NULL); #endif mg_create_icon_item (_("_Quit"), GTK_STOCK_QUIT, menu, tray_menu_quit_cb, NULL); menu_add_plugin_items (menu, "\x5$TRAY", NULL); g_object_ref (menu); g_object_ref_sink (menu); g_object_unref (menu); g_signal_connect (G_OBJECT (menu), "selection-done", G_CALLBACK (tray_menu_destroy), NULL); gtk_menu_popup (GTK_MENU (menu), NULL, NULL, gtk_status_icon_position_menu, userdata, button, time); }
static VALUE static_ruby_xchat_set_context( VALUE klass, VALUE ctx ) { xchat_context *context; int rc; Data_Get_Struct( ctx, xchat_context, context ); rc = xchat_set_context( static_plugin_handle, context ); return INT2FIX( rc ); }
static int timeout_cb(timer *tim) { if (xchat_set_context(ph, tim->context)) { xchat_command(ph, tim->command); if (tim->forever) return 1; tim->repeat--; if (tim->repeat > 0) return 1; } timer_del(tim); return 0; }
gboolean tray_toggle_visibility (gboolean force_hide) { static int x, y; static GdkScreen *screen; GtkWindow *win; if (!sticon) return FALSE; /* ph may have an invalid context now */ xchat_set_context (ph, xchat_find_context (ph, NULL, NULL)); win = (GtkWindow *)xchat_get_info (ph, "win_ptr"); tray_stop_flash (); tray_reset_counts (); if (!win) return FALSE; #if GTK_CHECK_VERSION(2,20,0) if (force_hide || gtk_widget_get_visible (win)) #else if (force_hide || GTK_WIDGET_VISIBLE (win)) #endif { gtk_window_get_position (win, &x, &y); screen = gtk_window_get_screen (win); gtk_widget_hide (GTK_WIDGET (win)); } else { gtk_window_set_screen (win, screen); gtk_window_move (win, x, y); gtk_widget_show (GTK_WIDGET (win)); gtk_window_present (win); } return TRUE; }
static void disconnect_from_network (gchar *key, xchat_context *context, gpointer data) { xchat_set_context (ph, context); xchat_command (ph, "DISCON"); }
static void connect_to_network (gchar *key, xchat_context *context, gpointer data) { xchat_set_context (ph, context); xchat_commandf (ph, "SERVER %s", key); }